diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java
index 626b44182..a85b4a552 100644
--- a/app/src/main/java/org/fdroid/fdroid/Preferences.java
+++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java
@@ -38,8 +38,8 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
preferences.registerOnSharedPreferenceChangeListener(this);
if (preferences.getString(PREF_LOCAL_REPO_NAME, null) == null) {
preferences.edit()
- .putString(PREF_LOCAL_REPO_NAME, getDefaultLocalRepoName())
- .apply();
+ .putString(PREF_LOCAL_REPO_NAME, getDefaultLocalRepoName())
+ .apply();
}
}
@@ -69,7 +69,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
private static final boolean DEFAULT_ROOTED = true;
private static final int DEFAULT_UPD_HISTORY = 14;
- private static final boolean DEFAULT_PRIVILEGED_INSTALLER = false;
+ private static final boolean DEFAULT_PRIVILEGED_INSTALLER = true;
//private static final boolean DEFAULT_LOCAL_REPO_BONJOUR = true;
private static final long DEFAULT_KEEP_CACHE_TIME = TimeUnit.DAYS.toMillis(1);
private static final boolean DEFAULT_UNSTABLE_UPDATES = false;
@@ -113,14 +113,18 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
initialized.put(key, false);
}
+ /**
+ * Whether to use the Privileged Installer, based on if it is installed. Only the disabled
+ * state is stored as a preference since the enabled state is based entirely on the presence
+ * of the Privileged Extension. The preference provides a way to disable using the
+ * Privileged Extension even though its installed.
+ *
+ * @see org.fdroid.fdroid.views.fragments.PreferencesFragment#initPrivilegedInstallerPreference()
+ */
public boolean isPrivilegedInstallerEnabled() {
return preferences.getBoolean(PREF_PRIVILEGED_INSTALLER, DEFAULT_PRIVILEGED_INSTALLER);
}
- public void setPrivilegedInstallerEnabled(boolean enable) {
- preferences.edit().putBoolean(PREF_PRIVILEGED_INSTALLER, enable).apply();
- }
-
public boolean isPostPrivilegedInstall() {
return preferences.getBoolean(PREF_POST_PRIVILEGED_INSTALL, DEFAULT_POST_PRIVILEGED_INSTALL);
}
diff --git a/app/src/main/java/org/fdroid/fdroid/privileged/install/InstallExtensionDialogActivity.java b/app/src/main/java/org/fdroid/fdroid/privileged/install/InstallExtensionDialogActivity.java
index 7260a4d55..1354a789c 100644
--- a/app/src/main/java/org/fdroid/fdroid/privileged/install/InstallExtensionDialogActivity.java
+++ b/app/src/main/java/org/fdroid/fdroid/privileged/install/InstallExtensionDialogActivity.java
@@ -34,7 +34,6 @@ import android.view.ContextThemeWrapper;
import org.fdroid.fdroid.FDroid;
import org.fdroid.fdroid.FDroidApp;
-import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.installer.PrivilegedInstaller;
@@ -233,9 +232,6 @@ public class InstallExtensionDialogActivity extends FragmentActivity {
title = getString(R.string.system_install_post_success);
message = getString(R.string.system_install_post_success_message);
result = Activity.RESULT_OK;
-
- // enable system installer on installation success
- Preferences.get().setPrivilegedInstallerEnabled(true);
break;
case PrivilegedInstaller.IS_EXTENSION_INSTALLED_NO:
title = getString(R.string.system_install_post_fail);
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 e5fe86a05..02c9c86c6 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
@@ -1,7 +1,6 @@
package org.fdroid.fdroid.views.fragments;
import android.app.Activity;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
@@ -12,8 +11,6 @@ import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.support.v4.preference.PreferenceFragment;
-import android.support.v7.app.AlertDialog;
-import android.text.Html;
import android.text.TextUtils;
import org.fdroid.fdroid.AppDetails;
@@ -196,69 +193,25 @@ public class PreferencesFragment extends PreferenceFragment
* Initializes SystemInstaller preference, which can only be enabled when F-Droid is installed as a system-app
*/
private void initPrivilegedInstallerPreference() {
- CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_PRIVILEGED_INSTALLER);
-
- // we are handling persistence ourself!
- pref.setPersistent(false);
+ final CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_PRIVILEGED_INSTALLER);
+ Preferences p = Preferences.get();
+ boolean enabled = p.isPrivilegedInstallerEnabled();
+ boolean installed = PrivilegedInstaller.isExtensionInstalledCorrectly(getActivity())
+ == PrivilegedInstaller.IS_EXTENSION_INSTALLED_YES;
+ pref.setEnabled(installed);
+ pref.setDefaultValue(installed);
+ pref.setChecked(enabled && installed);
pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-
@Override
public boolean onPreferenceClick(Preference preference) {
- final CheckBoxPreference pref = (CheckBoxPreference) preference;
-
+ SharedPreferences.Editor editor = pref.getSharedPreferences().edit();
if (pref.isChecked()) {
- int isInstalledCorrectly =
- PrivilegedInstaller.isExtensionInstalledCorrectly(getActivity());
- if (isInstalledCorrectly == PrivilegedInstaller.IS_EXTENSION_INSTALLED_YES) {
- // privileged permission are granted, i.e. the extension is installed correctly
- SharedPreferences.Editor editor = pref.getSharedPreferences().edit();
- editor.putBoolean(Preferences.PREF_PRIVILEGED_INSTALLER, true);
- editor.apply();
- pref.setChecked(true);
- } else {
- // privileged permission not available
- SharedPreferences.Editor editor = pref.getSharedPreferences().edit();
- editor.putBoolean(Preferences.PREF_PRIVILEGED_INSTALLER, false);
- editor.apply();
- pref.setChecked(false);
-
- AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity());
- alertBuilder.setTitle(R.string.system_install_denied_title);
-
- String message;
- switch (isInstalledCorrectly) {
- case PrivilegedInstaller.IS_EXTENSION_INSTALLED_NO:
- message = getActivity().getString(R.string.system_install_denied_body) +
- "
" + getActivity().getString(R.string.system_install_question);
- break;
- case PrivilegedInstaller.IS_EXTENSION_INSTALLED_SIGNATURE_PROBLEM:
- message = getActivity().getString(R.string.system_install_denied_signature);
- break;
- default:
- throw new RuntimeException("unhandled return");
- }
- alertBuilder.setMessage(Html.fromHtml(message));
- alertBuilder.setPositiveButton(R.string.system_install_button_open, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- // Open details of F-Droid Privileged
- Intent intent = new Intent(getActivity(), AppDetails.class);
- intent.putExtra(AppDetails.EXTRA_APPID,
- PrivilegedInstaller.PRIVILEGED_EXTENSION_PACKAGE_NAME);
- startActivity(intent);
- }
- });
- alertBuilder.setNegativeButton(R.string.cancel, null);
- alertBuilder.create().show();
- }
+ editor.remove(Preferences.PREF_PRIVILEGED_INSTALLER);
} else {
- SharedPreferences.Editor editor = pref.getSharedPreferences().edit();
editor.putBoolean(Preferences.PREF_PRIVILEGED_INSTALLER, false);
- editor.apply();
- pref.setChecked(false);
}
-
+ editor.apply();
return true;
}
});
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 15812238f..2cccd9eb3 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -91,6 +91,7 @@