diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java
index 64d6ad5c7..1973d4dd0 100644
--- a/app/src/main/java/org/fdroid/fdroid/Preferences.java
+++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java
@@ -45,7 +45,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
public static final String PREF_UPD_INTERVAL = "updateInterval";
public static final String PREF_UPD_WIFI_ONLY = "updateOnWifiOnly";
- public static final String PREF_UPD_AUTO_DOWNLOAD = "updateAutoDownload";
+ public static final String PREF_AUTO_DOWNLOAD_INSTALL_UPDATES = "updateAutoDownload";
public static final String PREF_UPD_NOTIFY = "updateNotify";
public static final String PREF_UPD_HISTORY = "updateHistoryDays";
public static final String PREF_ROOTED = "rooted";
@@ -222,7 +222,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
}
public boolean isAutoDownloadEnabled() {
- return preferences.getBoolean(PREF_UPD_AUTO_DOWNLOAD, false);
+ return preferences.getBoolean(PREF_AUTO_DOWNLOAD_INSTALL_UPDATES, false);
}
public boolean isUpdateOnlyOnWifi() {
diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
index d8a5d8bc0..320789a5f 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
@@ -16,7 +16,6 @@ import android.support.v4.app.TaskStackBuilder;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
-import org.acra.ACRA;
import org.fdroid.fdroid.AppDetails;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.Utils;
@@ -249,22 +248,12 @@ public class InstallManagerService extends Service {
// show notification if app details is not visible
if (!TextUtils.isEmpty(errorMessage)) {
- try {
- // temp setup to debug https://gitlab.com/fdroid/fdroidclient/issues/698
- App app = getAppFromActive(downloadUrl);
-
- // show notification if app details is not visible
- if (AppDetails.isAppVisible(app.packageName)) {
- cancelNotification(downloadUrl);
- } else {
- String title = String.format(
- getString(R.string.install_error_notify_title),
- app.name);
- notifyError(downloadUrl, title, errorMessage);
- }
- } catch (NullPointerException e) { //NOPMD
- ACRA.getErrorReporter().handleException(
- new IllegalStateException(errorMessage, e));
+ App app = getAppFromActive(downloadUrl);
+ // show notification if app details is not visible
+ if (app != null && AppDetails.isAppVisible(app.packageName)) {
+ cancelNotification(downloadUrl);
+ } else {
+ notifyError(downloadUrl, app, errorMessage);
}
}
removeFromActive(downloadUrl);
@@ -342,7 +331,12 @@ public class InstallManagerService extends Service {
title = String.format(getString(R.string.tap_to_update_format),
pm.getApplicationLabel(pm.getApplicationInfo(apk.packageName, 0)));
} catch (PackageManager.NameNotFoundException e) {
- title = String.format(getString(R.string.tap_to_install_format), getAppName(apk));
+ // TODO use packageName to fetch App instance from database if not cached
+ String name = getAppName(apk);
+ if (TextUtils.isEmpty(name) || name.equals(new App().name)) {
+ return; // do not have a name to display, so leave notification as is
+ }
+ title = String.format(getString(R.string.tap_to_install_format), name);
}
int downloadUrlId = urlString.hashCode();
@@ -358,9 +352,19 @@ public class InstallManagerService extends Service {
notificationManager.notify(downloadUrlId, notification);
}
- private void notifyError(String urlString, String title, String text) {
+ private void notifyError(String urlString, App app, String text) {
int downloadUrlId = urlString.hashCode();
+ String name;
+ if (app == null) {
+ // if we have nothing else, show the APK filename
+ String path = Uri.parse(urlString).getPath();
+ name = path.substring(path.lastIndexOf('/'), path.length());
+ } else {
+ name = app.name;
+ }
+ String title = String.format(getString(R.string.install_error_notify_title), name);
+
Intent errorDialogIntent = new Intent(this, ErrorDialogActivity.class);
errorDialogIntent.putExtra(
ErrorDialogActivity.EXTRA_TITLE, title);
@@ -397,8 +401,16 @@ public class InstallManagerService extends Service {
ACTIVE_APPS.put(app.packageName, app);
}
+ /**
+ * Always returns an {@link Apk} instance to avoid annoying null guards.
+ */
private static Apk getApkFromActive(String urlString) {
- return ACTIVE_APKS.get(urlString);
+ Apk apk = ACTIVE_APKS.get(urlString);
+ if (apk == null) {
+ return new Apk();
+ } else {
+ return apk;
+ }
}
/**
diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java
index c2ff1f8a8..3c19ae42c 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java
@@ -21,7 +21,6 @@ package org.fdroid.fdroid.installer;
import android.content.Context;
-import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Apk;
@@ -46,9 +45,7 @@ public class InstallerFactory {
&& apk.packageName.equals(PrivilegedInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME)) {
// special case for "F-Droid Privileged Extension"
installer = new ExtensionInstaller(context);
- } else if (isPrivilegedInstallerEnabled()
- && PrivilegedInstaller.isExtensionInstalledCorrectly(context)
- == PrivilegedInstaller.IS_EXTENSION_INSTALLED_YES) {
+ } else if (PrivilegedInstaller.isDefault(context)) {
Utils.debugLog(TAG, "privileged extension correctly installed -> PrivilegedInstaller");
installer = new PrivilegedInstaller(context);
} else {
@@ -57,12 +54,4 @@ public class InstallerFactory {
return installer;
}
-
- /**
- * Extension has privileged permissions and preference is enabled?
- */
- private static boolean isPrivilegedInstallerEnabled() {
- return Preferences.get().isPrivilegedInstallerEnabled();
- }
-
}
diff --git a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java
index f964bed03..8649f729b 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java
@@ -30,6 +30,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
+import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.Apk;
import org.fdroid.fdroid.privileged.IPrivilegedCallback;
@@ -296,6 +297,14 @@ public class PrivilegedInstaller extends Installer {
return IS_EXTENSION_INSTALLED_YES;
}
+ /**
+ * Extension has privileged permissions and preference is enabled?
+ */
+ public static boolean isDefault(Context context) {
+ return Preferences.get().isPrivilegedInstallerEnabled()
+ && isExtensionInstalledCorrectly(context) == IS_EXTENSION_INSTALLED_YES;
+ }
+
@Override
protected void installPackageInternal(final Uri localApkUri, final Uri downloadUri, Apk apk) {
sendBroadcastInstall(downloadUri, Installer.ACTION_INSTALL_STARTED);
diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java
index e61f4a9a8..4304b87c6 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java
@@ -50,6 +50,7 @@ public class PreferencesFragment extends PreferenceFragment
private static final int REQUEST_INSTALL_ORBOT = 0x1234;
private CheckBoxPreference enableProxyCheckPref;
private CheckBoxPreference useTorCheckPref;
+ private Preference updateAutoDownloadPref;
private Preference updatePrivilegedExtensionPref;
private long currentKeepCacheTime;
@@ -59,6 +60,7 @@ public class PreferencesFragment extends PreferenceFragment
addPreferencesFromResource(R.xml.preferences);
useTorCheckPref = (CheckBoxPreference) findPreference(Preferences.PREF_USE_TOR);
enableProxyCheckPref = (CheckBoxPreference) findPreference(Preferences.PREF_ENABLE_PROXY);
+ updateAutoDownloadPref = findPreference(Preferences.PREF_AUTO_DOWNLOAD_INSTALL_UPDATES);
updatePrivilegedExtensionPref = findPreference(Preferences.PREF_UNINSTALL_PRIVILEGED_APP);
}
@@ -282,6 +284,11 @@ public class PreferencesFragment extends PreferenceFragment
return true;
}
});
+
+ if (PrivilegedInstaller.isDefault(getContext())) {
+ updateAutoDownloadPref.setTitle(R.string.update_auto_install);
+ updateAutoDownloadPref.setSummary(R.string.update_auto_install_summary);
+ }
}
@Override
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bb03f4fbc..a3a30b88f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -22,6 +22,8 @@
Update app lists automatically only on Wi-Fi
Automatically download updates
Download the update files in the background
+ Automatically install updates
+ Download and install update apps in the background
Update notifications
Show a notification when updates are available
Update history