/* * MaxLock, an Xposed applock module for Android * Copyright (C) 2014-2016 Max Rumpf alias Maxr1998 * * 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 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, see <http://www.gnu.org/licenses/>. */ package de.Maxr1998.xposed.maxlock.ui.settings; import android.annotation.SuppressLint; import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; import android.preference.TwoStatePreference; import android.support.annotation.NonNull; import android.support.annotation.StringRes; import android.support.annotation.XmlRes; import android.support.customtabs.CustomTabsIntent; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.content.ContextCompat; import android.support.v4.hardware.fingerprint.FingerprintManagerCompat; import android.support.v4.preference.PreferenceFragmentCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.CheckBox; import android.widget.Toast; import com.haibison.android.lockpattern.LockPatternActivity; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.TimeUnit; import java.util.zip.ZipOutputStream; import de.Maxr1998.xposed.maxlock.BuildConfig; import de.Maxr1998.xposed.maxlock.Common; import de.Maxr1998.xposed.maxlock.MLImplementation; import de.Maxr1998.xposed.maxlock.R; import de.Maxr1998.xposed.maxlock.ui.SettingsActivity; import de.Maxr1998.xposed.maxlock.ui.settings.applist.AppListFragment; import de.Maxr1998.xposed.maxlock.ui.settings.lockingtype.KnockCodeSetupFragment; import de.Maxr1998.xposed.maxlock.ui.settings.lockingtype.PinSetupFragment; import de.Maxr1998.xposed.maxlock.util.MLPreferences; import de.Maxr1998.xposed.maxlock.util.Util; import static de.Maxr1998.xposed.maxlock.ui.SettingsActivity.isSecondPane; public final class MaxLockPreferenceFragment extends PreferenceFragmentCompat { private static final int WALLPAPER_REQUEST_CODE = 42; private static final int BUG_REPORT_STORAGE_PERMISSION_REQUEST_CODE = 100; private SharedPreferences prefs; private Screen screen; private Snackbar snackCache; public static void launchFragment(@NonNull FragmentManager manager, @NonNull Fragment fragment, boolean fromRoot) { if (fromRoot) { manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } manager.beginTransaction() .setCustomAnimations(R.anim.fragment_in, R.anim.fragment_out, R.anim.fragment_pop_in, R.anim.fragment_pop_out) .replace(R.id.fragment_container, fragment).addToBackStack(null).commit(); SettingsActivity.showMultipane(manager); } private void setTitle() { // Only apply title for main screen if back stack is empty (prevent multipane from setting title) if ((getFragmentManager().getBackStackEntryCount() == 0 && screen == Screen.MAIN) || screen != Screen.MAIN) { if (screen == Screen.MAIN) { getActivity().setTitle(getName()); } else { getActivity().setTitle(screen.title); } } } @SuppressLint("WorldReadableFiles") @SuppressWarnings("deprecation") @Override public void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); if (getArguments() != null) { screen = Screen.valueOf(getArguments().getString(Screen.KEY, Screen.MAIN.toString())); } else { screen = Screen.MAIN; } prefs = MLPreferences.getPreferences(getActivity()); setTitle(); if (screen == Screen.IMOD) { getPreferenceManager().setSharedPreferencesName(Common.PREFS_APPS); } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) getPreferenceManager().setSharedPreferencesMode(Context.MODE_WORLD_READABLE); addPreferencesFromResource(screen.preferenceXML); switch (screen) { case MAIN: // Show changelog and rating dialog if (BuildConfig.VERSION_CODE > prefs.getInt(Common.LAST_VERSION_NUMBER, 0)) { showUpdatedMessage(); prefs.edit().putInt(Common.LAST_VERSION_NUMBER, BuildConfig.VERSION_CODE).apply(); } else { if (!isSecondPane(this) && allowRatingDialog()) { prefs.edit().putInt(Common.RATING_DIALOG_APP_OPENING_COUNTER, 0) .putLong(Common.RATING_DIALOG_LAST_SHOWN, System.currentTimeMillis()).apply(); @SuppressLint("InflateParams") View dialogView = getActivity().getLayoutInflater().inflate(R.layout.dialog_like_app, null); @SuppressWarnings("ResourceType") final CheckBox checkBox = (CheckBox) dialogView.findViewById(R.id.dialog_cb_never_again); DialogInterface.OnClickListener onClickListener = (dialogInterface, i) -> { if (checkBox.isChecked()) { prefs.edit().putBoolean(Common.RATING_DIALOG_SHOW_NEVER, true).apply(); } switch (i) { case -3: try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + BuildConfig.APPLICATION_ID))); } catch (ActivityNotFoundException e) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID))); } break; case -1: startActivity(new Intent(getActivity(), DonateActivity.class)); break; } }; new AlertDialog.Builder(getActivity()) .setTitle(R.string.dialog_like_app) .setView(dialogView) .setPositiveButton(R.string.dialog_button_donate, onClickListener) .setNeutralButton(R.string.dialog_button_rate, onClickListener) .setNegativeButton(android.R.string.cancel, onClickListener).create().show(); } } CheckBoxPreference useDark = (CheckBoxPreference) findPreference(Common.USE_DARK_STYLE); if (!useDark.isChecked()) { PreferenceCategory cat = (PreferenceCategory) findPreference(Common.CATEGORY_APPLICATION_UI); cat.removePreference(findPreference(Common.USE_AMOLED_BLACK)); } findPreference(Common.ABOUT).setTitle(getName() + " " + BuildConfig.VERSION_NAME); Preference pro = findPreference(Common.ENABLE_PRO); if (prefs.getBoolean(Common.DONATED, false)) { pro.setEnabled(false); pro.setSummary(""); if (!prefs.getBoolean(Common.ENABLE_PRO, false)) { prefs.edit().putBoolean(Common.ENABLE_PRO, true).apply(); prefs.edit().putBoolean(Common.ENABLE_LOGGING, true).apply(); } } break; case TYPE: FingerprintManagerCompat fpm = FingerprintManagerCompat.from(getActivity()); if (!fpm.isHardwareDetected()) { getPreferenceScreen().removePreference(findPreference(Common.SHADOW_FINGERPRINT)); getPreferenceScreen().removePreference(findPreference(Common.CATEGORY_FINGERPRINT)); } else { CheckBoxPreference disableFP = (CheckBoxPreference) findPreference(Common.DISABLE_FINGERPRINT); if (!fpm.hasEnrolledFingerprints() && !disableFP.isChecked()) { disableFP.setSummary(disableFP.getSummary() + getResources().getString(R.string.pref_fingerprint_summary_non_enrolled)); } } break; case UI: /*SharedPreferences prefsTheme = getActivity().getSharedPreferences(Common.PREFS_THEME, Context.MODE_WORLD_READABLE); Preference[] overriddenByTheme = {findPreference(Common.BACKGROUND), findPreference(Common.HIDE_TITLE_BAR), findPreference(Common.HIDE_INPUT_BAR), findPreference(Common.SHOW_KC_DIVIDER), findPreference(Common.MAKE_KC_TOUCH_VISIBLE)}; if (prefsTheme.contains(Common.THEME_PKG)) { Preference themeManager = findPreference(Common.OPEN_THEME_MANAGER); themeManager.setSummary(getString(R.string.pref_open_theme_manager_summary_applied) + prefsTheme.getString(Common.THEME_PKG, "")); for (Preference preference : overriddenByTheme) { preference.setEnabled(false); preference.setSummary(preference.getSummary() != null ? preference.getSummary() : " " + getString(R.string.pref_summary_overridden_by_theme)); } }*/ ListPreference lp = (ListPreference) findPreference(Common.BACKGROUND); findPreference(Common.BACKGROUND_COLOR).setEnabled(lp.getValue().equals("color")); lp.setOnPreferenceChangeListener((preference, newValue) -> { if (preference.getKey().equals(Common.BACKGROUND)) { if (newValue.toString().equals("custom")) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivityForResult(intent, WALLPAPER_REQUEST_CODE); } else { FileUtils.deleteQuietly(new File(getActivity().getFilesDir(), "background")); } findPreference(Common.BACKGROUND_COLOR).setEnabled(newValue.toString().equals("color")); } return true; }); break; case OPTIONS: Preference el = findPreference(Common.ENABLE_LOGGING); el.setEnabled(prefs.getBoolean(Common.ENABLE_PRO, false)); if (!prefs.getBoolean(Common.ENABLE_PRO, false)) { el.setSummary(R.string.toast_pro_required); } break; case IMOD: //Intika I.Mod - Pro setup Preference iModDelayGlobal = findPreference(Common.ENABLE_IMOD_DELAY_GLOBAL); Preference iModDelayPerApp = findPreference(Common.ENABLE_IMOD_DELAY_APP); iModDelayGlobal.setEnabled(prefs.getBoolean(Common.ENABLE_PRO, false)); iModDelayPerApp.setEnabled(prefs.getBoolean(Common.ENABLE_PRO, false)); if (!prefs.getBoolean(Common.ENABLE_PRO, false)) { iModDelayGlobal.setTitle(R.string.pref_delay_needpro); iModDelayPerApp.setTitle(R.string.pref_delay_needpro); } break; } } @Override public void onStart() { super.onStart(); setTitle(); if (screen == Screen.MAIN && ((SettingsActivity) getActivity()).isDeviceAdminActive()) { Preference protectOrUninstall = findPreference(Common.UNINSTALL); protectOrUninstall.setTitle(R.string.pref_uninstall); protectOrUninstall.setSummary(""); } // Show Snackbars if no password and/or packages set up if (screen == Screen.MAIN && !isSecondPane(this)) { @StringRes int stringId = 0; Fragment fragment = null; if (prefs.getString(Common.LOCKING_TYPE, "").equals("")) { stringId = R.string.sb_no_locking_type; fragment = Screen.TYPE.getScreen(); } else if (!new File(Util.dataDir(getContext()) + "shared_prefs" + File.separator + Common.PREFS_APPS + ".xml").exists()) { stringId = R.string.sb_no_locked_apps; fragment = new AppListFragment(); } if (stringId != 0 && fragment != null) { final Fragment copyFragment = fragment; snackCache = Snackbar.make(getActivity().findViewById(android.R.id.content), stringId, Snackbar.LENGTH_INDEFINITE) .setAction(R.string.sb_action_setup, v -> launchFragment(getFragmentManager(), copyFragment, true)); snackCache.show(); } } } @Override public void onStop() { super.onStop(); if (screen == Screen.MAIN && snackCache != null) { snackCache.dismiss(); snackCache = null; } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setTitle(); //noinspection ConstantConditions ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(screen != Screen.MAIN || getFragmentManager().getBackStackEntryCount() > 0); } @Override public void onViewCreated(View v, Bundle savedInstanceState) { getListView().setPadding(0, 0, 0, 0); getListView().setOverscrollFooter(new ColorDrawable(v.getContext().obtainStyledAttributes(new int[]{R.attr.windowBackground}).getColor(0, ContextCompat.getColor(v.getContext(), R.color.default_window_background)))); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { getListView().setSelector(v.getContext().obtainStyledAttributes(new int[]{R.attr.highlightDrawable}).getDrawable(0)); ContextCompat.getDrawable(v.getContext(), getResources().getIdentifier("overscroll_edge", "drawable", "android")).setColorFilter(ContextCompat.getColor(v.getContext(), R.color.primary_red), PorterDuff.Mode.SRC_ATOP); ContextCompat.getDrawable(v.getContext(), getResources().getIdentifier("overscroll_glow", "drawable", "android")).setColorFilter(ContextCompat.getColor(v.getContext(), R.color.primary_red), PorterDuff.Mode.SRC_ATOP); } } private StringBuilder getName() { StringBuilder name = new StringBuilder(getString(R.string.app_name)); if (!Util.isDevMode()) { if (prefs.getBoolean(Common.ENABLE_PRO, false)) { name.append(" "); name.append(getString(prefs.getBoolean(Common.DONATED, false) ? R.string.name_pro : R.string.name_pseudo_pro)); } } else { name.append(" Indev"); } return name; } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference.getKey() == null) { return false; } switch (screen) { case MAIN: switch (preference.getKey()) { case Common.ML_IMPLEMENTATION: AlertDialog implementation = new AlertDialog.Builder(getContext()) .setTitle(preference.getTitle()) .setView(MLImplementation.createImplementationDialog(getContext())) .setNegativeButton(android.R.string.ok, null) .setOnDismissListener(dialog -> ((SettingsActivity) getActivity()).updateXposedStatusAlert()) .create(); implementation.show(); return true; case Common.LOCKING_TYPE_SETTINGS: launchFragment(getFragmentManager(), Screen.TYPE.getScreen(), true); return true; case Common.LOCKING_UI_SETTINGS: launchFragment(getFragmentManager(), Screen.UI.getScreen(), true); return true; case Common.LOCKING_OPTIONS: launchFragment(getFragmentManager(), Screen.OPTIONS.getScreen(), true); return true; case Common.IMOD_OPTIONS: launchFragment(getFragmentManager(), Screen.IMOD.getScreen(), true); return true; case Common.CHOOSE_APPS: launchFragment(getFragmentManager(), new AppListFragment(), true); return true; case Common.HIDE_APP_FROM_LAUNCHER: TwoStatePreference hideApp = (TwoStatePreference) preference; if (hideApp.isChecked()) { Toast.makeText(getActivity(), R.string.reboot_required, Toast.LENGTH_SHORT).show(); ComponentName componentName = new ComponentName(getActivity(), "de.Maxr1998.xposed.maxlock.Main"); getActivity().getPackageManager().setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } else { ComponentName componentName = new ComponentName(getActivity(), "de.Maxr1998.xposed.maxlock.Main"); getActivity().getPackageManager().setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } return true; case Common.USE_DARK_STYLE: case Common.USE_AMOLED_BLACK: case Common.ENABLE_PRO: getActivity().recreate(); return true; case Common.ABOUT: launchFragment(getFragmentManager(), Screen.ABOUT.getScreen(), true); return true; case Common.DONATE: startActivity(new Intent(getActivity(), DonateActivity.class)); return true; case Common.UNINSTALL: if (!((SettingsActivity) getActivity()).isDeviceAdminActive()) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, ((SettingsActivity) getActivity()).deviceAdmin); startActivity(intent); } else { ((SettingsActivity) getActivity()).getDevicePolicyManager().removeActiveAdmin(((SettingsActivity) getActivity()).deviceAdmin); preference.setTitle(R.string.pref_prevent_uninstall); preference.setSummary(R.string.pref_prevent_uninstall_summary); Intent uninstall = new Intent(Intent.ACTION_DELETE); uninstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); uninstall.setData(Uri.parse("package:de.Maxr1998.xposed.maxlock")); startActivity(uninstall); } return true; case Common.SEND_FEEDBACK: File tempDirectory = new File(getActivity().getCacheDir(), "feedback-cache"); try { // Obtain data FileUtils.copyDirectoryToDirectory(new File(Util.dataDir(getActivity()), "shared_prefs"), tempDirectory); FileUtils.writeStringToFile(new File(tempDirectory, "device-info.txt"), "App Version: " + BuildConfig.VERSION_NAME + "\n\n" + "Device: " + Build.MANUFACTURER + " " + Build.MODEL + " (" + Build.PRODUCT + ")\n" + "API: " + Build.VERSION.SDK_INT + ", Fingerprint: " + Build.FINGERPRINT); FileUtils.copyFileToDirectory(getActivity().getFileStreamPath("history.json"), tempDirectory); Process process = Runtime.getRuntime().exec("logcat -d"); FileUtils.copyInputStreamToFile(process.getInputStream(), new File(tempDirectory, "logcat.txt")); FileUtils.copyFileToDirectory(new File(getActivity().getPackageManager() .getApplicationInfo("de.robv.android.xposed.installer", 0).dataDir + "/log", "error.log"), tempDirectory); // Create zip File zipFile = new File(getActivity().getCacheDir(), "report.zip"); ZipOutputStream stream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile))); Util.writeDirectoryToZip(tempDirectory, stream); stream.close(); FileUtils.deleteQuietly(tempDirectory); Util.checkForStoragePermission(this, BUG_REPORT_STORAGE_PERMISSION_REQUEST_CODE, R.string.dialog_storage_permission_bug_report); } catch (IOException | PackageManager.NameNotFoundException e) { e.printStackTrace(); } return true; } break; case TYPE: switch (preference.getKey()) { case Common.LOCKING_TYPE_PASSWORD: Util.setPassword(getActivity(), null); return true; case Common.LOCKING_TYPE_PIN: launchFragment(getFragmentManager(), new PinSetupFragment(), false); return true; case Common.LOCKING_TYPE_KNOCK_CODE: launchFragment(getFragmentManager(), new KnockCodeSetupFragment(), false); return true; case Common.LOCKING_TYPE_PATTERN: Intent intent = new Intent(LockPatternActivity.ACTION_CREATE_PATTERN, null, getActivity(), LockPatternActivity.class); startActivityForResult(intent, Util.getPatternCode(-1)); return true; } break; case OPTIONS: switch (preference.getKey()) { case Common.VIEW_LOGS: launchFragment(getFragmentManager(), new LogViewerFragment(), false); return true; } break; case ABOUT: switch (preference.getKey()) { case Common.SHOW_CHANGELOG: showChangelog(); return true; case Common.VISIT_WEBSITE: CustomTabsIntent devWebsite = new CustomTabsIntent.Builder(((SettingsActivity) getActivity()).getSession()) .setShowTitle(true) .enableUrlBarHiding() .setToolbarColor(Color.parseColor("#ffc107")) .build(); devWebsite.launchUrl(getActivity(), Common.MAXR1998_URI); return true; case Common.TECHNOSPARKS_PROFILE: CustomTabsIntent technosparksSite = new CustomTabsIntent.Builder(((SettingsActivity) getActivity()).getSession()) .setShowTitle(true) .enableUrlBarHiding() .setToolbarColor(Color.parseColor("#6d993f")) .build(); technosparksSite.launchUrl(getActivity(), Common.TECHNO_SPARKS_URI); return true; } break; } return super.onPreferenceTreeClick(preferenceScreen, preference); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (screen == Screen.TYPE && requestCode == Util.PATTERN_CODE && resultCode == LockPatternActivity.RESULT_OK) { Util.receiveAndSetPattern(getActivity(), data.getCharArrayExtra(LockPatternActivity.EXTRA_PATTERN), null); } else if (screen == Screen.UI && requestCode == WALLPAPER_REQUEST_CODE && resultCode == Activity.RESULT_OK) { Uri uri = null; if (data != null) { uri = data.getData(); } if (uri == null) { throw new NullPointerException(); } try { InputStream input = getActivity().getContentResolver().openInputStream(uri); FileOutputStream destination = getActivity().openFileOutput("background", 0); assert input != null; IOUtils.copy(input, destination); input.close(); destination.close(); } catch (IOException | AssertionError e) { e.printStackTrace(); } } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case BUG_REPORT_STORAGE_PERMISSION_REQUEST_CODE: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { File zipFile = new File(getActivity().getCacheDir(), "report.zip"); File external = new File(Common.EXTERNAL_FILES_DIR, zipFile.getName()); FileUtils.deleteQuietly(external); // Move files and send email final Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_EMAIL, new String[]{getString(R.string.dev_email)}); intent.putExtra(Intent.EXTRA_SUBJECT, "MaxLock feedback on " + Build.MODEL); intent.putExtra(Intent.EXTRA_TEXT, "Please here describe your issue as DETAILED as possible!"); try { FileUtils.moveFile(zipFile, external); FileUtils.deleteQuietly(zipFile); Uri uri = Uri.fromFile(external); intent.putExtra(Intent.EXTRA_STREAM, uri); } catch (IOException e) { e.printStackTrace(); } new AlertDialog.Builder(getActivity()) .setMessage(R.string.dialog_message_bugreport_finished_select_email) .setPositiveButton(android.R.string.ok, (dialog, which) -> startActivity(Intent.createChooser(intent, getString(R.string.share_menu_title_send_email)))).create().show(); } break; } } private boolean allowRatingDialog() { return !prefs.getBoolean(Common.RATING_DIALOG_SHOW_NEVER, false) && (prefs.getInt(Common.RATING_DIALOG_APP_OPENING_COUNTER, 0) >= 25 || System.currentTimeMillis() - prefs.getLong(Common.RATING_DIALOG_LAST_SHOWN, System.currentTimeMillis()) > TimeUnit.DAYS.toMillis(14)); } private void showUpdatedMessage() { AlertDialog message = new AlertDialog.Builder(getActivity()) .setMessage(R.string.dialog_maxlock_updated) .setNegativeButton(R.string.dialog_button_whats_new, (dialog, which) -> showChangelog()) .setPositiveButton(R.string.dialog_button_got_it, null) .create(); message.setCanceledOnTouchOutside(false); message.show(); } private void showChangelog() { AlertDialog.Builder changelog = new AlertDialog.Builder(getActivity()); WebView wv = new WebView(getContext()); wv.setWebViewClient(new WebViewClient()); wv.getSettings().setUserAgentString("MaxLock App v" + BuildConfig.VERSION_NAME); wv.loadUrl("http://maxlock.maxr1998.de/files/changelog-base.php"); changelog.setView(wv); changelog.setPositiveButton(android.R.string.ok, null); changelog.create().show(); } public enum Screen { MAIN(R.string.app_name, R.xml.preferences_main), TYPE(R.string.pref_screen_locking_type, R.xml.preferences_locking_type), UI(R.string.pref_screen_locking_ui, R.xml.preferences_locking_ui), OPTIONS(R.string.pref_screen_locking_options, R.xml.preferences_locking_options), IMOD(R.string.pref_screen_delayed_relock, R.xml.preferences_locking_imod), ABOUT(R.string.pref_screen_about, R.xml.preferences_about); public static String KEY = "screen"; private int title, preferenceXML; Screen(@StringRes int t, @XmlRes int p) { title = t; preferenceXML = p; } public MaxLockPreferenceFragment getScreen() { MaxLockPreferenceFragment f = new MaxLockPreferenceFragment(); Bundle b = new Bundle(1); b.putString(KEY, this.toString()); f.setArguments(b); return f; } } }