From ea0700d406101b7ed6907b1dbd2918dbc214f435 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Aug 2016 22:06:30 +0200 Subject: [PATCH] use Privileged Extension by default when it is installed This totally changed the logic of the "Use Privileged Extension" preference making it based on whether the Privileged Extension is installed and usable rather than storing the user's selection. This code now only stores when the user manually disables using the Privileged Extension even when it is installed. closes #729 --- .../java/org/fdroid/fdroid/Preferences.java | 18 +++-- .../InstallExtensionDialogActivity.java | 4 -- .../views/fragments/PreferencesFragment.java | 69 +++---------------- app/src/main/res/xml/preferences.xml | 1 + 4 files changed, 23 insertions(+), 69 deletions(-) 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 @@