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); + } + + +}