From cb96685c8f5bea93b30d9e44dd53660c0b9212e0 Mon Sep 17 00:00:00 2001 From: Marco Ballesio Date: Fri, 1 May 2020 05:59:21 -0700 Subject: [PATCH] Developer option for the app freezer The app freezer allows the system to suspend execution for cached apps. Without it an app can receive CPU time even if cached, so this option will allow developers to test their code when frozen while their apps are cached. The new developer option will present a list of alternatives for the freezer operating mode: "device default": use device/system settings to determine whether the freezer is to be enabled or not. This is the current behavior, and default value for the option. "enabled": force freezer on "disabled": force freezer off A dialog prompting the user to reboot is presented upon freezer mode change. The device is automatically rebooted if the user decides to proceed. Bug: 155465196 Change-Id: I857b77cc4fc1ad766e8d5825ada9b271d3e1ab3a Test: manually verifued the option works as intendend when this patch is applied with its companion CLs Change-Id: I26450b7b7ea2b345fd3661d4869fbc74ae38c0c9 --- res/values/strings.xml | 3 + res/xml/development_settings.xml | 6 + ...CachedAppsFreezerPreferenceController.java | 134 ++++++++++++++++++ .../DevelopmentSettingsDashboardFragment.java | 1 + 4 files changed, 144 insertions(+) create mode 100644 src/com/android/settings/development/CachedAppsFreezerPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 18673e490c5..f05124b545f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12051,4 +12051,7 @@ When using 2 SIMs, this device will be limited to 4G. Learn more. + + + Suspend execution for cached apps diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 6dcc125fe1c..7dac1d087dd 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -577,6 +577,12 @@ android:title="@string/show_all_anrs" android:summary="@string/show_all_anrs_summary" /> + + { + Settings.Global.putString(mContext.getContentResolver(), + Settings.Global.CACHED_APPS_FREEZER_ENABLED, + newValue.toString()); + + updateState(mPreference); + + PowerManager pm = mContext.getSystemService(PowerManager.class); + pm.reboot(null); + }; + } + + private DialogInterface.OnClickListener getRebootDialogCancelListener() { + return (dialog, which) -> { + updateState(mPreference); + }; + } + + @Override + public void updateState(Preference preference) { + final ListPreference listPreference = (ListPreference) preference; + final String currentValue = Settings.Global.getString(mContext.getContentResolver(), + Settings.Global.CACHED_APPS_FREEZER_ENABLED); + + int index = 0; // Defaults to device default + for (int i = 0; i < mListValues.length; i++) { + if (TextUtils.equals(currentValue, mListValues[i])) { + index = i; + break; + } + } + + listPreference.setValue(mListValues[index]); + listPreference.setSummary(mListSummaries[index]); + } + + @Override + public void onDeveloperOptionsDisabled() { + super.onDeveloperOptionsDisabled(); + + Settings.Global.putString(mContext.getContentResolver(), + Settings.Global.CACHED_APPS_FREEZER_ENABLED, + mListValues[0].toString()); + } +} diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 878d442c168..76aaaa0a04f 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -499,6 +499,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra controllers.add(new ProfileGpuRenderingPreferenceController(context)); controllers.add(new KeepActivitiesPreferenceController(context)); controllers.add(new BackgroundProcessLimitPreferenceController(context)); + controllers.add(new CachedAppsFreezerPreferenceController(context)); controllers.add(new ShowFirstCrashDialogPreferenceController(context)); controllers.add(new AppsNotRespondingPreferenceController(context)); controllers.add(new NotificationChannelWarningsPreferenceController(context));