diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 359f17111..0bae0da65 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -72,7 +72,6 @@ connected24: - rm -f $GRADLE_USER_HOME/caches/modules-2/modules-2.lock - rm -fr $GRADLE_USER_HOME/caches/*/plugin-resolution/ - exit $EXITVALUE - allow_failure: true # remove once install it runs reliably pmd: script: diff --git a/CHANGELOG.md b/CHANGELOG.md index 34f4f66ed..01e5c93ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ * Support for Android 2.2 is dropped, 2.3.3 or later is now required +* Fixed APK Cache bugs, requiring the cache time be reset to 1 day + +* Uses Privileged Extension by default, when its installed + ### 0.100.1 (2016-06-21) * Fix background crash after installing or updating apps diff --git a/app/src/main/java/org/fdroid/fdroid/CleanCacheService.java b/app/src/main/java/org/fdroid/fdroid/CleanCacheService.java index a1befc144..c61785248 100644 --- a/app/src/main/java/org/fdroid/fdroid/CleanCacheService.java +++ b/app/src/main/java/org/fdroid/fdroid/CleanCacheService.java @@ -167,7 +167,7 @@ public class CleanCacheService extends IntentService { f.delete(); } } else { - CleanCacheService21.deleteIfOld(f, millisAgo); + CleanCacheService21.deleteIfOld(f, olderThan); } } } \ No newline at end of file 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 4660ec344..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,17 +1,16 @@ 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; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; 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; @@ -50,6 +49,7 @@ public class PreferencesFragment extends PreferenceFragment private static final int REQUEST_INSTALL_ORBOT = 0x1234; private CheckBoxPreference enableProxyCheckPref; private CheckBoxPreference useTorCheckPref; + private Preference updatePrivilegedExtensionPref; private long currentKeepCacheTime; @Override @@ -58,6 +58,7 @@ public class PreferencesFragment extends PreferenceFragment addPreferencesFromResource(R.xml.preferences); useTorCheckPref = (CheckBoxPreference) findPreference(Preferences.PREF_USE_TOR); enableProxyCheckPref = (CheckBoxPreference) findPreference(Preferences.PREF_ENABLE_PROXY); + updatePrivilegedExtensionPref = findPreference(Preferences.PREF_UNINSTALL_PRIVILEGED_APP); } private void checkSummary(String key, int resId) { @@ -192,79 +193,39 @@ 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; } }); } - private void initManagePrivilegedAppPreference() { - Preference pref = findPreference(Preferences.PREF_UNINSTALL_PRIVILEGED_APP); - pref.setPersistent(false); - - pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + private void initUpdatePrivilegedExtensionPreference() { + if (Build.VERSION.SDK_INT > 19) { + // this will never work on newer Android versions, so hide it + PreferenceCategory other = (PreferenceCategory) findPreference("pref_category_other"); + other.removePreference(updatePrivilegedExtensionPref); + return; + } + updatePrivilegedExtensionPref.setPersistent(false); + updatePrivilegedExtensionPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { @@ -292,7 +253,7 @@ public class PreferencesFragment extends PreferenceFragment currentKeepCacheTime = Preferences.get().getKeepCacheTime(); initPrivilegedInstallerPreference(); - initManagePrivilegedAppPreference(); + initUpdatePrivilegedExtensionPreference(); // this pref's default is dynamically set based on whether Orbot is installed boolean useTor = Preferences.get().isTorEnabled(); useTorCheckPref.setDefaultValue(useTor); diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 6f5b404f3..2cccd9eb3 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -72,7 +72,8 @@ android:summary="@string/proxy_port_summary" android:dependency="enableProxy" /> - +