From 3050e3dbc50a4851fc8ca6f258538fd11d5c5220 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Tue, 3 Jun 2014 08:19:26 +0930 Subject: [PATCH] Migrating activities to appcompat-v7 The only remaining activity is the AppDetails acvitity, which will require a little more than just making it extend ActionBarActivity. Currently, it extends ListActivity. To support appcompat-v7, it really should have two fragments - the details one and the list one. Then, when the orientation is changed, it should load a different layout with the fragments side by side. Although Google is encouraging people to make old devices run apps with the action bar (via appcompat-v7), they haven't provided a way for people to create preference/setting screens with an action bar. There are plenty of issues in the Android issue tracker relating to this, but it doesn't yet seem to be on the radar of the Android devs. Until there is a native implementation of PreferenceFragment in the appcompat-v7 support library, this submodule provides is a 3rd party solution. It is actually a fork of the first repo in github, though that was a bit of an upload and dump, without accepting MR's. This fork includes gradle support. --- AndroidManifest.xml | 9 +- src/org/fdroid/fdroid/FDroidApp.java | 4 +- src/org/fdroid/fdroid/ManageRepo.java | 2 +- .../fdroid/fdroid/NfcNotEnabledActivity.java | 3 + .../fdroid/fdroid/PreferencesActivity.java | 298 ++---------------- src/org/fdroid/fdroid/SearchResults.java | 4 +- .../fdroid/views/LocalRepoActivity.java | 2 +- .../views/QrWizardDownloadActivity.java | 2 +- .../views/QrWizardWifiNetworkActivity.java | 3 +- .../fdroid/views/RepoDetailsActivity.java | 22 +- .../fdroid/views/SelectLocalAppsActivity.java | 2 +- .../views/fragments/PreferenceFragment.java | 279 ++++++++++++++++ 12 files changed, 338 insertions(+), 292 deletions(-) create mode 100644 src/org/fdroid/fdroid/views/fragments/PreferenceFragment.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 0a372cd23..7185fa2d9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -203,6 +203,9 @@ android:launchMode="singleTop" android:parentActivityName=".FDroid" android:screenOrientation="portrait" > + + android:windowSoftInputMode="stateHidden"> + + = 16) { doOnJellybean(intent); diff --git a/src/org/fdroid/fdroid/PreferencesActivity.java b/src/org/fdroid/fdroid/PreferencesActivity.java index 9bf66d4b0..cc7c4940b 100644 --- a/src/org/fdroid/fdroid/PreferencesActivity.java +++ b/src/org/fdroid/fdroid/PreferencesActivity.java @@ -19,288 +19,42 @@ package org.fdroid.fdroid; import android.os.Bundle; -import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; -import android.preference.PreferenceActivity; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.app.AlertDialog; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.view.MenuItem; +import android.support.v4.app.FragmentManager; import android.support.v4.app.NavUtils; +import android.support.v7.app.ActionBarActivity; +import android.view.MenuItem; +import android.widget.LinearLayout; +import org.fdroid.fdroid.views.fragments.PreferenceFragment; -import org.fdroid.fdroid.Preferences; -import org.fdroid.fdroid.compat.ActionBarCompat; -import org.fdroid.fdroid.installer.CheckRootAsyncTask; -import org.fdroid.fdroid.installer.CheckRootAsyncTask.CheckRootCallback; -import org.fdroid.fdroid.installer.Installer; - -public class PreferencesActivity extends PreferenceActivity implements - OnSharedPreferenceChangeListener { +public class PreferencesActivity extends ActionBarActivity { public static final int RESULT_RESTART = 4; - private int result = 0; - - private static String[] summariesToUpdate = { - Preferences.PREF_UPD_INTERVAL, - Preferences.PREF_UPD_WIFI_ONLY, - Preferences.PREF_UPD_NOTIFY, - Preferences.PREF_UPD_HISTORY, - Preferences.PREF_ROOTED, - Preferences.PREF_INCOMP_VER, - Preferences.PREF_THEME, - Preferences.PREF_PERMISSIONS, - Preferences.PREF_COMPACT_LAYOUT, - Preferences.PREF_IGN_TOUCH, - Preferences.PREF_LOCAL_REPO_BONJOUR, - Preferences.PREF_LOCAL_REPO_NAME, - Preferences.PREF_LOCAL_REPO_HTTPS, - Preferences.PREF_CACHE_APK, - Preferences.PREF_EXPERT, - Preferences.PREF_ROOT_INSTALLER, - Preferences.PREF_SYSTEM_INSTALLER - }; @Override protected void onCreate(Bundle savedInstanceState) { + ((FDroidApp) getApplication()).applyTheme(this); super.onCreate(savedInstanceState); + FragmentManager fm = getSupportFragmentManager(); + if (fm.findFragmentById(android.R.id.content) == null) { + // Need to set a dummy view (which will get overridden by the fragment manager + // below) so that we can call setContentView(). This is a work around for + // a (bug?) thing in 3.0, 3.1 which requires setContentView to be invoked before + // the actionbar is played with: + // http://blog.perpetumdesign.com/2011/08/strange-case-of-dr-action-and-mr-bar.html + setContentView( new LinearLayout(this) ); + + PreferenceFragment preferenceFragment = new PreferenceFragment(); + fm.beginTransaction() + .add(android.R.id.content, preferenceFragment) + .commit(); + } + // Actionbar cannot be accessed until after setContentView (on 3.0 and 3.1 devices) // see: http://blog.perpetumdesign.com/2011/08/strange-case-of-dr-action-and-mr-bar.html // for reason why. - ActionBarCompat.create(this).setDisplayHomeAsUpEnabled(true); - - addPreferencesFromResource(R.xml.preferences); - } - - protected void onoffSummary(String key, int on, int off) { - CheckBoxPreference pref = (CheckBoxPreference)findPreference(key); - if (pref.isChecked()) { - pref.setSummary(on); - } else { - pref.setSummary(off); - } - } - - protected void entrySummary(String key) { - ListPreference pref = (ListPreference)findPreference(key); - pref.setSummary(pref.getEntry()); - } - - protected void textSummary(String key, int resId) { - EditTextPreference pref = (EditTextPreference)findPreference(key); - pref.setSummary(getString(resId, pref.getText())); - } - - protected void updateSummary(String key, boolean changing) { - - if (key.equals(Preferences.PREF_UPD_INTERVAL)) { - ListPreference pref = (ListPreference)findPreference( - Preferences.PREF_UPD_INTERVAL); - int interval = Integer.parseInt(pref.getValue().toString()); - Preference onlyOnWifi = findPreference( - Preferences.PREF_UPD_WIFI_ONLY); - onlyOnWifi.setEnabled(interval > 0); - if (interval == 0) { - pref.setSummary(R.string.update_interval_zero); - } else { - pref.setSummary(pref.getEntry()); - } - - } else if (key.equals(Preferences.PREF_UPD_WIFI_ONLY)) { - onoffSummary(key, R.string.automatic_scan_wifi_on, - R.string.automatic_scan_wifi_off); - - } else if (key.equals(Preferences.PREF_UPD_NOTIFY)) { - onoffSummary(key, R.string.notify_on, - R.string.notify_off); - - } else if (key.equals(Preferences.PREF_UPD_HISTORY)) { - textSummary(key, R.string.update_history_summ); - - } else if (key.equals(Preferences.PREF_PERMISSIONS)) { - onoffSummary(key, R.string.showPermissions_on, - R.string.showPermissions_off); - - } else if (key.equals(Preferences.PREF_COMPACT_LAYOUT)) { - onoffSummary(key, R.string.compactlayout_on, - R.string.compactlayout_off); - - } else if (key.equals(Preferences.PREF_THEME)) { - entrySummary(key); - if (changing) { - result |= RESULT_RESTART; - setResult(result); - } - - } else if (key.equals(Preferences.PREF_INCOMP_VER)) { - onoffSummary(key, R.string.show_incompat_versions_on, - R.string.show_incompat_versions_off); - - } else if (key.equals(Preferences.PREF_ROOTED)) { - onoffSummary(key, R.string.rooted_on, - R.string.rooted_off); - - } else if (key.equals(Preferences.PREF_IGN_TOUCH)) { - onoffSummary(key, R.string.ignoreTouch_on, - R.string.ignoreTouch_off); - - } else if (key.equals(Preferences.PREF_LOCAL_REPO_BONJOUR)) { - onoffSummary(key, R.string.local_repo_bonjour_on, - R.string.local_repo_bonjour_off); - - } else if (key.equals(Preferences.PREF_LOCAL_REPO_NAME)) { - textSummary(key, R.string.local_repo_name_summary); - - } else if (key.equals(Preferences.PREF_LOCAL_REPO_HTTPS)) { - onoffSummary(key, R.string.local_repo_https_on, - R.string.local_repo_https_off); - - } else if (key.equals(Preferences.PREF_CACHE_APK)) { - onoffSummary(key, R.string.cache_downloaded_on, - R.string.cache_downloaded_off); - - } else if (key.equals(Preferences.PREF_EXPERT)) { - onoffSummary(key, R.string.expert_on, - R.string.expert_off); - - } else if (key.equals(Preferences.PREF_ROOT_INSTALLER)) { - onoffSummary(key, R.string.root_installer_on, - R.string.root_installer_off); - - } else if (key.equals(Preferences.PREF_SYSTEM_INSTALLER)) { - onoffSummary(key, R.string.system_installer_on, - R.string.system_installer_off); - - } - } - - /** - * Initializes RootInstaller preference. This method ensures that the preference can only be checked and persisted - * when the user grants root access for F-Droid. - */ - protected void initRootInstallerPreference() { - CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_ROOT_INSTALLER); - - // we are handling persistence ourself! - pref.setPersistent(false); - - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - final CheckBoxPreference pref = (CheckBoxPreference) preference; - - if (pref.isChecked()) { - CheckRootAsyncTask checkTask = new CheckRootAsyncTask(PreferencesActivity.this, new CheckRootCallback() { - - @Override - public void onRootCheck(boolean rootGranted) { - if (rootGranted) { - // root access granted - SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); - editor.putBoolean(Preferences.PREF_ROOT_INSTALLER, true); - editor.commit(); - pref.setChecked(true); - } else { - // root access denied - SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); - editor.putBoolean(Preferences.PREF_ROOT_INSTALLER, false); - editor.commit(); - pref.setChecked(false); - - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(PreferencesActivity.this); - alertBuilder.setTitle(R.string.root_access_denied_title); - alertBuilder.setMessage(PreferencesActivity.this.getString(R.string.root_access_denied_body)); - alertBuilder.setNeutralButton(android.R.string.ok, null); - alertBuilder.create().show(); - } - } - }); - checkTask.execute(); - } else { - SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); - editor.putBoolean(Preferences.PREF_ROOT_INSTALLER, false); - editor.commit(); - pref.setChecked(false); - } - - return true; - } - }); - } - - /** - * Initializes SystemInstaller preference, which can only be enabled when F-Droid is installed as a system-app - */ - protected void initSystemInstallerPreference() { - CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_SYSTEM_INSTALLER); - - // we are handling persistence ourself! - pref.setPersistent(false); - - pref.setOnPreferenceClickListener(new OnPreferenceClickListener() { - - @Override - public boolean onPreferenceClick(Preference preference) { - final CheckBoxPreference pref = (CheckBoxPreference) preference; - - if (pref.isChecked()) { - if (Installer.hasSystemPermissions(PreferencesActivity.this, PreferencesActivity.this.getPackageManager())) { - // system-permission are granted, i.e. F-Droid is a system-app - SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); - editor.putBoolean(Preferences.PREF_SYSTEM_INSTALLER, true); - editor.commit(); - pref.setChecked(true); - } else { - // system-permission not available - SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); - editor.putBoolean(Preferences.PREF_SYSTEM_INSTALLER, false); - editor.commit(); - pref.setChecked(false); - - AlertDialog.Builder alertBuilder = new AlertDialog.Builder(PreferencesActivity.this); - alertBuilder.setTitle(R.string.system_permission_denied_title); - alertBuilder.setMessage(PreferencesActivity.this.getString(R.string.system_permission_denied_body)); - alertBuilder.setNeutralButton(android.R.string.ok, null); - alertBuilder.create().show(); - } - } else { - SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); - editor.putBoolean(Preferences.PREF_SYSTEM_INSTALLER, false); - editor.commit(); - pref.setChecked(false); - } - - return true; - } - }); - } - - @Override - protected void onResume() { - super.onResume(); - - getPreferenceScreen().getSharedPreferences() - .registerOnSharedPreferenceChangeListener(this); - - for (String key : summariesToUpdate) { - updateSummary(key, false); - } - - initRootInstallerPreference(); - initSystemInstallerPreference(); - } - - @Override - protected void onPause() { - super.onPause(); - - getPreferenceScreen().getSharedPreferences() - .unregisterOnSharedPreferenceChangeListener(this); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override @@ -313,10 +67,4 @@ public class PreferencesActivity extends PreferenceActivity implements return super.onOptionsItemSelected(item); } - @Override - public void onSharedPreferenceChanged( - SharedPreferences sharedPreferences, String key) { - updateSummary(key, true); - } - } diff --git a/src/org/fdroid/fdroid/SearchResults.java b/src/org/fdroid/fdroid/SearchResults.java index 545401a7a..08bab2480 100644 --- a/src/org/fdroid/fdroid/SearchResults.java +++ b/src/org/fdroid/fdroid/SearchResults.java @@ -20,14 +20,13 @@ package org.fdroid.fdroid; import android.content.Intent; import android.os.Bundle; -import android.support.v7.app.ActionBarActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.NavUtils; import android.support.v4.view.MenuItemCompat; +import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.LinearLayout; -import org.fdroid.fdroid.compat.ActionBarCompat; import org.fdroid.fdroid.views.fragments.SearchResultsFragment; public class SearchResults extends ActionBarActivity { @@ -38,7 +37,6 @@ public class SearchResults extends ActionBarActivity { public void onCreate(Bundle savedInstanceState) { ((FDroidApp) getApplication()).applyTheme(this); - super.onCreate(savedInstanceState); // Start a search by just typing diff --git a/src/org/fdroid/fdroid/views/LocalRepoActivity.java b/src/org/fdroid/fdroid/views/LocalRepoActivity.java index e596c4d27..0741eb182 100644 --- a/src/org/fdroid/fdroid/views/LocalRepoActivity.java +++ b/src/org/fdroid/fdroid/views/LocalRepoActivity.java @@ -60,8 +60,8 @@ public class LocalRepoActivity extends ActionBarActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); ((FDroidApp) getApplication()).applyTheme(this); + super.onCreate(savedInstanceState); setContentView(R.layout.local_repo_activity); enableWifiButton = (Button) findViewById(R.id.enable_wifi); diff --git a/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java b/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java index 4ebfbf0f2..dbdd9b4f9 100644 --- a/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java +++ b/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java @@ -24,8 +24,8 @@ public class QrWizardDownloadActivity extends ActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); ((FDroidApp) getApplication()).applyTheme(this); + super.onCreate(savedInstanceState); setContentView(R.layout.qr_wizard_activity); TextView instructions = (TextView) findViewById(R.id.qrWizardInstructions); instructions.setText(R.string.qr_wizard_download_instructions); diff --git a/src/org/fdroid/fdroid/views/QrWizardWifiNetworkActivity.java b/src/org/fdroid/fdroid/views/QrWizardWifiNetworkActivity.java index 3f5c8dc4c..5d7419e82 100644 --- a/src/org/fdroid/fdroid/views/QrWizardWifiNetworkActivity.java +++ b/src/org/fdroid/fdroid/views/QrWizardWifiNetworkActivity.java @@ -28,12 +28,13 @@ public class QrWizardWifiNetworkActivity extends ActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { + ((FDroidApp) getApplication()).applyTheme(this); super.onCreate(savedInstanceState); + wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); wifiManager.setWifiEnabled(true); FDroidApp.startLocalRepoService(this); - ((FDroidApp) getApplication()).applyTheme(this); setContentView(R.layout.qr_wizard_activity); TextView instructions = (TextView) findViewById(R.id.qrWizardInstructions); instructions.setText(R.string.qr_wizard_wifi_network_instructions); diff --git a/src/org/fdroid/fdroid/views/RepoDetailsActivity.java b/src/org/fdroid/fdroid/views/RepoDetailsActivity.java index f0daf679d..495603692 100644 --- a/src/org/fdroid/fdroid/views/RepoDetailsActivity.java +++ b/src/org/fdroid/fdroid/views/RepoDetailsActivity.java @@ -10,19 +10,19 @@ import android.nfc.NfcAdapter; import android.os.Build; import android.os.Bundle; import android.os.Parcelable; -import android.support.v4.app.FragmentActivity; +import android.support.v4.app.NavUtils; +import android.support.v7.app.ActionBarActivity; import android.util.Log; +import android.view.MenuItem; import android.widget.LinearLayout; import android.widget.Toast; - import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.compat.ActionBarCompat; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.views.fragments.RepoDetailsFragment; -public class RepoDetailsActivity extends FragmentActivity { +public class RepoDetailsActivity extends ActionBarActivity { public static final String TAG = "RepoDetailsActivity"; private Repo repo; @@ -33,7 +33,6 @@ public class RepoDetailsActivity extends FragmentActivity { protected void onCreate(Bundle savedInstanceState) { ((FDroidApp) getApplication()).applyTheme(this); - super.onCreate(savedInstanceState); long repoId = getIntent().getLongExtra(RepoDetailsFragment.ARG_REPO_ID, 0); @@ -62,7 +61,7 @@ public class RepoDetailsActivity extends FragmentActivity { }; repo = RepoProvider.Helper.findById(this, repoId, projection); - ActionBarCompat.create(this).setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); setTitle(repo.getName()); } @@ -123,4 +122,15 @@ public class RepoDetailsActivity extends FragmentActivity { finish(); } } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + NavUtils.navigateUpFromSameTask(this); + return true; + } + return super.onOptionsItemSelected(item); + } + } diff --git a/src/org/fdroid/fdroid/views/SelectLocalAppsActivity.java b/src/org/fdroid/fdroid/views/SelectLocalAppsActivity.java index d61f95d4d..b438915ec 100644 --- a/src/org/fdroid/fdroid/views/SelectLocalAppsActivity.java +++ b/src/org/fdroid/fdroid/views/SelectLocalAppsActivity.java @@ -23,8 +23,8 @@ public class SelectLocalAppsActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); ((FDroidApp) getApplication()).applyTheme(this); + super.onCreate(savedInstanceState); setContentView(R.layout.select_local_apps_activity); } diff --git a/src/org/fdroid/fdroid/views/fragments/PreferenceFragment.java b/src/org/fdroid/fdroid/views/fragments/PreferenceFragment.java new file mode 100644 index 000000000..5ef5ca048 --- /dev/null +++ b/src/org/fdroid/fdroid/views/fragments/PreferenceFragment.java @@ -0,0 +1,279 @@ +package org.fdroid.fdroid.views.fragments; + +import android.app.AlertDialog; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.EditTextPreference; +import android.preference.ListPreference; +import android.preference.Preference; +import org.fdroid.fdroid.Preferences; +import org.fdroid.fdroid.PreferencesActivity; +import org.fdroid.fdroid.R; +import org.fdroid.fdroid.installer.CheckRootAsyncTask; +import org.fdroid.fdroid.installer.Installer; + +public class PreferenceFragment + extends android.support.v4.preference.PreferenceFragment + implements SharedPreferences.OnSharedPreferenceChangeListener { + + private static String[] summariesToUpdate = { + Preferences.PREF_UPD_INTERVAL, + Preferences.PREF_UPD_WIFI_ONLY, + Preferences.PREF_UPD_NOTIFY, + Preferences.PREF_UPD_HISTORY, + Preferences.PREF_ROOTED, + Preferences.PREF_INCOMP_VER, + Preferences.PREF_THEME, + Preferences.PREF_PERMISSIONS, + Preferences.PREF_COMPACT_LAYOUT, + Preferences.PREF_IGN_TOUCH, + Preferences.PREF_LOCAL_REPO_BONJOUR, + Preferences.PREF_LOCAL_REPO_NAME, + Preferences.PREF_LOCAL_REPO_HTTPS, + Preferences.PREF_CACHE_APK, + Preferences.PREF_EXPERT, + Preferences.PREF_ROOT_INSTALLER, + Preferences.PREF_SYSTEM_INSTALLER + }; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.preferences); + } + + protected void onoffSummary(String key, int on, int off) { + CheckBoxPreference pref = (CheckBoxPreference)findPreference(key); + if (pref.isChecked()) { + pref.setSummary(on); + } else { + pref.setSummary(off); + } + } + + protected void entrySummary(String key) { + ListPreference pref = (ListPreference)findPreference(key); + pref.setSummary(pref.getEntry()); + } + + protected void textSummary(String key, int resId) { + EditTextPreference pref = (EditTextPreference)findPreference(key); + pref.setSummary(getString(resId, pref.getText())); + } + + protected void updateSummary(String key, boolean changing) { + + int result = 0; + + if (key.equals(Preferences.PREF_UPD_INTERVAL)) { + ListPreference pref = (ListPreference)findPreference( + Preferences.PREF_UPD_INTERVAL); + int interval = Integer.parseInt(pref.getValue()); + Preference onlyOnWifi = findPreference( + Preferences.PREF_UPD_WIFI_ONLY); + onlyOnWifi.setEnabled(interval > 0); + if (interval == 0) { + pref.setSummary(R.string.update_interval_zero); + } else { + pref.setSummary(pref.getEntry()); + } + + } else if (key.equals(Preferences.PREF_UPD_WIFI_ONLY)) { + onoffSummary(key, R.string.automatic_scan_wifi_on, + R.string.automatic_scan_wifi_off); + + } else if (key.equals(Preferences.PREF_UPD_NOTIFY)) { + onoffSummary(key, R.string.notify_on, + R.string.notify_off); + + } else if (key.equals(Preferences.PREF_UPD_HISTORY)) { + textSummary(key, R.string.update_history_summ); + + } else if (key.equals(Preferences.PREF_PERMISSIONS)) { + onoffSummary(key, R.string.showPermissions_on, + R.string.showPermissions_off); + + } else if (key.equals(Preferences.PREF_COMPACT_LAYOUT)) { + onoffSummary(key, R.string.compactlayout_on, + R.string.compactlayout_off); + + } else if (key.equals(Preferences.PREF_THEME)) { + entrySummary(key); + if (changing) { + result |= PreferencesActivity.RESULT_RESTART; + getActivity().setResult(result); + } + + } else if (key.equals(Preferences.PREF_INCOMP_VER)) { + onoffSummary(key, R.string.show_incompat_versions_on, + R.string.show_incompat_versions_off); + + } else if (key.equals(Preferences.PREF_ROOTED)) { + onoffSummary(key, R.string.rooted_on, + R.string.rooted_off); + + } else if (key.equals(Preferences.PREF_IGN_TOUCH)) { + onoffSummary(key, R.string.ignoreTouch_on, + R.string.ignoreTouch_off); + + } else if (key.equals(Preferences.PREF_LOCAL_REPO_BONJOUR)) { + onoffSummary(key, R.string.local_repo_bonjour_on, + R.string.local_repo_bonjour_off); + + } else if (key.equals(Preferences.PREF_LOCAL_REPO_NAME)) { + textSummary(key, R.string.local_repo_name_summary); + + } else if (key.equals(Preferences.PREF_LOCAL_REPO_HTTPS)) { + onoffSummary(key, R.string.local_repo_https_on, + R.string.local_repo_https_off); + + } else if (key.equals(Preferences.PREF_CACHE_APK)) { + onoffSummary(key, R.string.cache_downloaded_on, + R.string.cache_downloaded_off); + + } else if (key.equals(Preferences.PREF_EXPERT)) { + onoffSummary(key, R.string.expert_on, + R.string.expert_off); + + } else if (key.equals(Preferences.PREF_ROOT_INSTALLER)) { + onoffSummary(key, R.string.root_installer_on, + R.string.root_installer_off); + + } else if (key.equals(Preferences.PREF_SYSTEM_INSTALLER)) { + onoffSummary(key, R.string.system_installer_on, + R.string.system_installer_off); + + } + } + + /** + * Initializes RootInstaller preference. This method ensures that the preference can only be checked and persisted + * when the user grants root access for F-Droid. + */ + protected void initRootInstallerPreference() { + CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_ROOT_INSTALLER); + + // we are handling persistence ourself! + pref.setPersistent(false); + + pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + final CheckBoxPreference pref = (CheckBoxPreference) preference; + + if (pref.isChecked()) { + CheckRootAsyncTask checkTask = new CheckRootAsyncTask(getActivity(), new CheckRootAsyncTask.CheckRootCallback() { + + @Override + public void onRootCheck(boolean rootGranted) { + if (rootGranted) { + // root access granted + SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); + editor.putBoolean(Preferences.PREF_ROOT_INSTALLER, true); + editor.commit(); + pref.setChecked(true); + } else { + // root access denied + SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); + editor.putBoolean(Preferences.PREF_ROOT_INSTALLER, false); + editor.commit(); + pref.setChecked(false); + + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity()); + alertBuilder.setTitle(R.string.root_access_denied_title); + alertBuilder.setMessage(getActivity().getString(R.string.root_access_denied_body)); + alertBuilder.setNeutralButton(android.R.string.ok, null); + alertBuilder.create().show(); + } + } + }); + checkTask.execute(); + } else { + SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); + editor.putBoolean(Preferences.PREF_ROOT_INSTALLER, false); + editor.commit(); + pref.setChecked(false); + } + + return true; + } + }); + } + + /** + * Initializes SystemInstaller preference, which can only be enabled when F-Droid is installed as a system-app + */ + protected void initSystemInstallerPreference() { + CheckBoxPreference pref = (CheckBoxPreference) findPreference(Preferences.PREF_SYSTEM_INSTALLER); + + // we are handling persistence ourself! + pref.setPersistent(false); + + pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + + @Override + public boolean onPreferenceClick(Preference preference) { + final CheckBoxPreference pref = (CheckBoxPreference) preference; + + if (pref.isChecked()) { + if (Installer.hasSystemPermissions(getActivity(), getActivity().getPackageManager())) { + // system-permission are granted, i.e. F-Droid is a system-app + SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); + editor.putBoolean(Preferences.PREF_SYSTEM_INSTALLER, true); + editor.commit(); + pref.setChecked(true); + } else { + // system-permission not available + SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); + editor.putBoolean(Preferences.PREF_SYSTEM_INSTALLER, false); + editor.commit(); + pref.setChecked(false); + + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity()); + alertBuilder.setTitle(R.string.system_permission_denied_title); + alertBuilder.setMessage(getActivity().getString(R.string.system_permission_denied_body)); + alertBuilder.setNeutralButton(android.R.string.ok, null); + alertBuilder.create().show(); + } + } else { + SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); + editor.putBoolean(Preferences.PREF_SYSTEM_INSTALLER, false); + editor.commit(); + pref.setChecked(false); + } + + return true; + } + }); + } + + @Override + public void onResume() { + super.onResume(); + + getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + + for (String key : summariesToUpdate) { + updateSummary(key, false); + } + + initRootInstallerPreference(); + initSystemInstallerPreference(); + } + + @Override + public void onPause() { + super.onPause(); + getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); + } + + @Override + public void onSharedPreferenceChanged( + SharedPreferences sharedPreferences, String key) { + updateSummary(key, true); + } + + +}