Hide Memory usage UI fields if flag is enabled

This change updates the Memory use UI in developer settings to hide
memory fields by default if the AppProfiler PSS deprecation flag is
enabled. A toggle is provided to resume PSS profiling and reinstate the
memory fields, and shows a dialog to reboot if the toggle is updated.

The summary for the "Memory" button in developer settings will show
"Memory profiling disabled" instead of "Avg X GB of Y memory used" if
PSS profiling is not enabled.

Test: With the flag enabled, flash and verify that:
      - The memory fields are hidden by default, and the summary shows
	the expected "Memory profiling disabled" text
      - Clicking the toggle shows the reboot dialog, which will
	correctly change the setting and reboot if accepted, and keep
	the setting and not reboot if denied
      - Check that AppProfiler correctly profiles PSS or RSS based on
	the state of the toggle, which persists across reboots
      - Included UI test for Memory page elements based on flag value.
Bug: 296454553
Change-Id: Ie21791502445a321446cb8110e5800089f47ac58
This commit is contained in:
Kevin Jeon
2023-12-14 18:11:56 -05:00
parent b1ab7f0373
commit 55c8c9b86c
6 changed files with 222 additions and 45 deletions

View File

@@ -16,20 +16,26 @@
package com.android.settings.applications;
import android.app.settings.SettingsEnums;
import android.content.ContentResolver;
import android.content.Context;
import android.icu.text.MessageFormat;
import android.os.Bundle;
import android.os.Flags;
import android.provider.Settings;
import android.text.format.Formatter;
import android.text.format.Formatter.BytesResult;
import androidx.preference.Preference;
import androidx.preference.Preference.OnPreferenceClickListener;
import androidx.preference.PreferenceCategory;
import androidx.preference.SwitchPreference;
import com.android.settings.R;
import com.android.settings.SummaryPreference;
import com.android.settings.Utils;
import com.android.settings.applications.ProcStatsData.MemInfo;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.development.DisableDevSettingsDialogFragment;
import java.util.HashMap;
import java.util.Locale;
@@ -37,6 +43,8 @@ import java.util.Map;
public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener {
private static final String KEY_PREF_SCREEN = "app_list";
private static final String KEY_MEMORY_INFO_PREF_GROUP = "memory_info";
private static final String KEY_STATUS_HEADER = "status_header";
private static final String KEY_PERFORMANCE = "performance";
@@ -44,7 +52,9 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
private static final String KEY_AVERAGY_USED = "average_used";
private static final String KEY_FREE = "free";
private static final String KEY_APP_LIST = "apps_list";
private static final String KEY_FORCE_ENABLE_PSS_PROFILING = "force_enable_pss_profiling";
private PreferenceCategory mMemoryInfoPrefCategory;
private SummaryPreference mSummaryPref;
private Preference mPerformance;
@@ -52,12 +62,14 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
private Preference mAverageUsed;
private Preference mFree;
private Preference mAppListPreference;
private SwitchPreference mForceEnablePssProfiling;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
addPreferencesFromResource(R.xml.process_stats_summary);
mMemoryInfoPrefCategory = (PreferenceCategory) findPreference(KEY_MEMORY_INFO_PREF_GROUP);
mSummaryPref = (SummaryPreference) findPreference(KEY_STATUS_HEADER);
mPerformance = findPreference(KEY_PERFORMANCE);
mTotalMemory = findPreference(KEY_TOTAL_MEMORY);
@@ -65,11 +77,37 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
mFree = findPreference(KEY_FREE);
mAppListPreference = findPreference(KEY_APP_LIST);
mAppListPreference.setOnPreferenceClickListener(this);
// This preference is only applicable if the flag for PSS deprecation in AppProfiler is
// enabled. Otherwise, it can immediately be hidden.
mForceEnablePssProfiling =
(SwitchPreference) findPreference(KEY_FORCE_ENABLE_PSS_PROFILING);
if (Flags.removeAppProfilerPssCollection()) {
mForceEnablePssProfiling.setOnPreferenceClickListener(this);
// Make the toggle reflect the current state of the global setting.
mForceEnablePssProfiling.setChecked(isPssProfilingForceEnabled(getContext()));
} else {
mForceEnablePssProfiling.setVisible(false);
}
}
private void refreshPreferences() {
// The memory fields should be static if the flag is not enabled.
if (!Flags.removeAppProfilerPssCollection()) {
return;
}
mMemoryInfoPrefCategory.setVisible(mForceEnablePssProfiling.isChecked());
}
@Override
public void refreshUi() {
Context context = getContext();
refreshPreferences();
// If PSS collection is not enabled, none of the following work needs to be done.
if (Flags.removeAppProfilerPssCollection() && !isPssProfilingForceEnabled(context)) {
return;
}
MemInfo memInfo = mStatsManager.getMemInfo();
@@ -100,7 +138,8 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
String durationString = getString(sDurationLabels[mDurationIndex]);
int numApps = mStatsManager.getEntries().size();
MessageFormat msgFormat = new MessageFormat(
getResources().getString(R.string.memory_usage_apps_summary), Locale.getDefault());
getResources().getString(R.string.memory_usage_apps_summary),
Locale.getDefault());
Map<String, Object> arguments = new HashMap<>();
arguments.put("count", numApps);
arguments.put("time", durationString);
@@ -131,7 +170,34 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
.setSourceMetricsCategory(getMetricsCategory())
.launch();
return true;
} else if (preference == mForceEnablePssProfiling) {
DisableDevSettingsDialogFragment.show(this);
}
return false;
}
private boolean isPssProfilingForceEnabled(Context context) {
ContentResolver cr = context.getContentResolver();
return Settings.Global.getInt(cr, Settings.Global.FORCE_ENABLE_PSS_PROFILING, 0) == 1;
}
/**
* Called when the reboot confirmation button is clicked.
*/
public void onRebootDialogConfirmed() {
Context context = getContext();
ContentResolver cr = context.getContentResolver();
Settings.Global.putInt(cr, Settings.Global.FORCE_ENABLE_PSS_PROFILING,
mForceEnablePssProfiling.isChecked() ? 1 : 0);
refreshPreferences();
}
/**
* Called when the reboot deny button is clicked.
*/
public void onRebootDialogCanceled() {
// Set the toggle to reflect the state of the setting, which should not have changed.
mForceEnablePssProfiling.setChecked(isPssProfilingForceEnabled(getContext()));
}
}