diff --git a/res/values/strings.xml b/res/values/strings.xml index 5a75d1d49..e003e5f07 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -235,5 +235,8 @@ Security System Wallpaper - + + Root access + Requesting root access… + diff --git a/src/org/fdroid/fdroid/PreferencesActivity.java b/src/org/fdroid/fdroid/PreferencesActivity.java index 9e05c0303..7125dd34a 100644 --- a/src/org/fdroid/fdroid/PreferencesActivity.java +++ b/src/org/fdroid/fdroid/PreferencesActivity.java @@ -20,6 +20,7 @@ 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; @@ -27,15 +28,16 @@ import android.preference.ListPreference; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.view.MenuItem; - import android.support.v4.app.NavUtils; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.compat.ActionBarCompat; +import org.fdroid.fdroid.installer.CheckRootAsyncTask; +import org.fdroid.fdroid.installer.CheckRootAsyncTask.CheckRootCallback; public class PreferencesActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { - + public static final int RESULT_RESTART = 4; private int result = 0; @@ -155,6 +157,56 @@ public class PreferencesActivity extends PreferenceActivity implements } } + + /** + * Initializes RootInstaller preference. This method ensures that the preference can only be enabled + * when the user grants access to 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 disallowed + SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); + editor.putBoolean(Preferences.PREF_ROOT_INSTALLER, false); + editor.commit(); + pref.setChecked(false); + } + } + }); + checkTask.execute(); + } else { + SharedPreferences.Editor editor = pref.getSharedPreferences().edit(); + editor.putBoolean(Preferences.PREF_ROOT_INSTALLER, false); + editor.commit(); + pref.setChecked(false); + } + + return true; + } + }); + + } @Override protected void onResume() { @@ -166,6 +218,8 @@ public class PreferencesActivity extends PreferenceActivity implements for (String key : summariesToUpdate) { updateSummary(key, false); } + + initRootInstallerPreference(); } @Override diff --git a/src/org/fdroid/fdroid/installer/CheckRootAsyncTask.java b/src/org/fdroid/fdroid/installer/CheckRootAsyncTask.java new file mode 100644 index 000000000..c0254905f --- /dev/null +++ b/src/org/fdroid/fdroid/installer/CheckRootAsyncTask.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2014 Dominik Schürmann + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 3 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +package org.fdroid.fdroid.installer; + +import org.fdroid.fdroid.R; + +import eu.chainfire.libsuperuser.Shell; +import android.app.ProgressDialog; +import android.content.Context; +import android.os.AsyncTask; + +public class CheckRootAsyncTask extends AsyncTask { + + ProgressDialog mDialog; + Context mContext; + CheckRootCallback mCallback; + + public interface CheckRootCallback { + public void onRootCheck(boolean rootGranted); + } + + public CheckRootAsyncTask(Context context, CheckRootCallback callback) { + super(); + this.mContext = context; + this.mCallback = callback; + } + + @Override + protected void onPreExecute() { + super.onPreExecute(); + + mDialog = new ProgressDialog(mContext); + mDialog.setTitle(R.string.requesting_root_access_title); + mDialog.setMessage(mContext.getString(R.string.requesting_root_access_body)); + mDialog.setIndeterminate(true); + mDialog.setCancelable(false); + mDialog.show(); + } + + @Override + protected Boolean doInBackground(Void... params) { + + boolean suAvailable = Shell.SU.available(); + + return suAvailable; + } + + @Override + protected void onPostExecute(Boolean result) { + super.onPostExecute(result); + + mDialog.dismiss(); + + mCallback.onRootCheck(result); + } + +} diff --git a/src/org/fdroid/fdroid/installer/Installer.java b/src/org/fdroid/fdroid/installer/Installer.java index 54d0bd171..f27857f81 100644 --- a/src/org/fdroid/fdroid/installer/Installer.java +++ b/src/org/fdroid/fdroid/installer/Installer.java @@ -93,7 +93,7 @@ abstract public class Installer { * Creates a new Installer for installing/deleting processes starting from * an Activity * - * @param context + * @param activity * @param pm * @param callback * @return