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
This commit is contained in:
Hans-Christoph Steiner 2016-08-22 22:06:30 +02:00
parent 91cac9fed4
commit ea0700d406
4 changed files with 23 additions and 69 deletions

View File

@ -38,8 +38,8 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
preferences.registerOnSharedPreferenceChangeListener(this); preferences.registerOnSharedPreferenceChangeListener(this);
if (preferences.getString(PREF_LOCAL_REPO_NAME, null) == null) { if (preferences.getString(PREF_LOCAL_REPO_NAME, null) == null) {
preferences.edit() preferences.edit()
.putString(PREF_LOCAL_REPO_NAME, getDefaultLocalRepoName()) .putString(PREF_LOCAL_REPO_NAME, getDefaultLocalRepoName())
.apply(); .apply();
} }
} }
@ -69,7 +69,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
private static final boolean DEFAULT_ROOTED = true; private static final boolean DEFAULT_ROOTED = true;
private static final int DEFAULT_UPD_HISTORY = 14; 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 boolean DEFAULT_LOCAL_REPO_BONJOUR = true;
private static final long DEFAULT_KEEP_CACHE_TIME = TimeUnit.DAYS.toMillis(1); private static final long DEFAULT_KEEP_CACHE_TIME = TimeUnit.DAYS.toMillis(1);
private static final boolean DEFAULT_UNSTABLE_UPDATES = false; private static final boolean DEFAULT_UNSTABLE_UPDATES = false;
@ -113,14 +113,18 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh
initialized.put(key, false); 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() { public boolean isPrivilegedInstallerEnabled() {
return preferences.getBoolean(PREF_PRIVILEGED_INSTALLER, DEFAULT_PRIVILEGED_INSTALLER); 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() { public boolean isPostPrivilegedInstall() {
return preferences.getBoolean(PREF_POST_PRIVILEGED_INSTALL, DEFAULT_POST_PRIVILEGED_INSTALL); return preferences.getBoolean(PREF_POST_PRIVILEGED_INSTALL, DEFAULT_POST_PRIVILEGED_INSTALL);
} }

View File

@ -34,7 +34,6 @@ import android.view.ContextThemeWrapper;
import org.fdroid.fdroid.FDroid; import org.fdroid.fdroid.FDroid;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.installer.PrivilegedInstaller; import org.fdroid.fdroid.installer.PrivilegedInstaller;
@ -233,9 +232,6 @@ public class InstallExtensionDialogActivity extends FragmentActivity {
title = getString(R.string.system_install_post_success); title = getString(R.string.system_install_post_success);
message = getString(R.string.system_install_post_success_message); message = getString(R.string.system_install_post_success_message);
result = Activity.RESULT_OK; result = Activity.RESULT_OK;
// enable system installer on installation success
Preferences.get().setPrivilegedInstallerEnabled(true);
break; break;
case PrivilegedInstaller.IS_EXTENSION_INSTALLED_NO: case PrivilegedInstaller.IS_EXTENSION_INSTALLED_NO:
title = getString(R.string.system_install_post_fail); title = getString(R.string.system_install_post_fail);

View File

@ -1,7 +1,6 @@
package org.fdroid.fdroid.views.fragments; package org.fdroid.fdroid.views.fragments;
import android.app.Activity; import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Build; import android.os.Build;
@ -12,8 +11,6 @@ import android.preference.ListPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceCategory; import android.preference.PreferenceCategory;
import android.support.v4.preference.PreferenceFragment; import android.support.v4.preference.PreferenceFragment;
import android.support.v7.app.AlertDialog;
import android.text.Html;
import android.text.TextUtils; import android.text.TextUtils;
import org.fdroid.fdroid.AppDetails; 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 * Initializes SystemInstaller preference, which can only be enabled when F-Droid is installed as a system-app
*/ */
private void initPrivilegedInstallerPreference() { private void initPrivilegedInstallerPreference() {
CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_PRIVILEGED_INSTALLER); final CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_PRIVILEGED_INSTALLER);
Preferences p = Preferences.get();
// we are handling persistence ourself! boolean enabled = p.isPrivilegedInstallerEnabled();
pref.setPersistent(false); 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() { pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
final CheckBoxPreference pref = (CheckBoxPreference) preference; SharedPreferences.Editor editor = pref.getSharedPreferences().edit();
if (pref.isChecked()) { if (pref.isChecked()) {
int isInstalledCorrectly = editor.remove(Preferences.PREF_PRIVILEGED_INSTALLER);
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) +
"<br/><br/>" + 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();
}
} else { } else {
SharedPreferences.Editor editor = pref.getSharedPreferences().edit();
editor.putBoolean(Preferences.PREF_PRIVILEGED_INSTALLER, false); editor.putBoolean(Preferences.PREF_PRIVILEGED_INSTALLER, false);
editor.apply();
pref.setChecked(false);
} }
editor.apply();
return true; return true;
} }
}); });

View File

@ -91,6 +91,7 @@
<CheckBoxPreference android:title="@string/system_installer" <CheckBoxPreference android:title="@string/system_installer"
android:defaultValue="false" android:defaultValue="false"
android:key="privilegedInstaller" android:key="privilegedInstaller"
android:persistent="false"
android:dependency="expert" /> android:dependency="expert" />
<Preference android:title="@string/uninstall_system" <Preference android:title="@string/uninstall_system"
android:summary="@string/uninstall_system_summary" android:summary="@string/uninstall_system_summary"