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:
@@ -9464,6 +9464,13 @@
|
|||||||
other {# apps used memory in the last {time}}
|
other {# apps used memory in the last {time}}
|
||||||
}</string>
|
}</string>
|
||||||
|
|
||||||
|
<!-- Label for toggle that enables the profiling/aggregating of memory usage [CHAR LIMIT=40]-->
|
||||||
|
<string name="force_enable_pss_profiling_title">Enable memory usage profiling</string>
|
||||||
|
<!-- Description with an explanation of the extra resources used if profiling of memory usage is enabled [CHAR LIMIT=NONE]-->
|
||||||
|
<string name="force_enable_pss_profiling_summary">Memory usage profiling requires additional system resources.</string>
|
||||||
|
<!-- Summary that shows the current memory usage profiling status as disabled. [CHAR LIMIT=NONE]-->
|
||||||
|
<string name="pss_profiling_disabled">Memory profiling disabled</string>
|
||||||
|
|
||||||
<!-- Label for frequency that the app is runnig (e.g. always, sometimes, etc.) [CHAR LIMIT=25] -->
|
<!-- Label for frequency that the app is runnig (e.g. always, sometimes, etc.) [CHAR LIMIT=25] -->
|
||||||
<string name="running_frequency">Frequency</string>
|
<string name="running_frequency">Frequency</string>
|
||||||
|
|
||||||
|
@@ -19,45 +19,52 @@
|
|||||||
android:title="@string/app_memory_use"
|
android:title="@string/app_memory_use"
|
||||||
android:key="app_list">
|
android:key="app_list">
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:key="force_enable_pss_profiling"
|
||||||
|
android:title="@string/force_enable_pss_profiling_title"
|
||||||
|
android:summary="@string/force_enable_pss_profiling_summary" />
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/average_memory_use"/>
|
android:title="@string/average_memory_use"
|
||||||
|
android:key="memory_info">
|
||||||
|
|
||||||
<com.android.settings.SummaryPreference
|
<com.android.settings.SummaryPreference
|
||||||
android:key="status_header"
|
android:key="status_header"
|
||||||
android:selectable="false" />
|
android:selectable="false" />
|
||||||
|
|
||||||
<com.android.settings.applications.SpacePreference
|
<com.android.settings.applications.SpacePreference
|
||||||
android:layout_height="5dp" />
|
android:layout_height="5dp" />
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="performance"
|
android:key="performance"
|
||||||
android:selectable="false"
|
android:selectable="false"
|
||||||
android:layout="@layout/horizontal_preference"
|
android:layout="@layout/horizontal_preference"
|
||||||
android:title="@string/memory_performance" />
|
android:title="@string/memory_performance" />
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="total_memory"
|
android:key="total_memory"
|
||||||
android:selectable="false"
|
android:selectable="false"
|
||||||
android:layout="@layout/horizontal_preference"
|
android:layout="@layout/horizontal_preference"
|
||||||
android:title="@string/total_memory" />
|
android:title="@string/total_memory" />
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="average_used"
|
android:key="average_used"
|
||||||
android:selectable="false"
|
android:selectable="false"
|
||||||
android:layout="@layout/horizontal_preference"
|
android:layout="@layout/horizontal_preference"
|
||||||
android:title="@string/average_used" />
|
android:title="@string/average_used" />
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="free"
|
android:key="free"
|
||||||
android:selectable="false"
|
android:selectable="false"
|
||||||
android:layout="@layout/horizontal_preference"
|
android:layout="@layout/horizontal_preference"
|
||||||
android:title="@string/free_memory" />
|
android:title="@string/free_memory" />
|
||||||
|
|
||||||
<com.android.settings.applications.SpacePreference
|
<com.android.settings.applications.SpacePreference
|
||||||
android:layout_height="15dp" />
|
android:layout_height="15dp" />
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="apps_list"
|
android:key="apps_list"
|
||||||
android:title="@string/memory_usage_apps" />
|
android:title="@string/memory_usage_apps" />
|
||||||
|
|
||||||
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
@@ -16,20 +16,26 @@
|
|||||||
package com.android.settings.applications;
|
package com.android.settings.applications;
|
||||||
|
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.icu.text.MessageFormat;
|
import android.icu.text.MessageFormat;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Flags;
|
||||||
|
import android.provider.Settings;
|
||||||
import android.text.format.Formatter;
|
import android.text.format.Formatter;
|
||||||
import android.text.format.Formatter.BytesResult;
|
import android.text.format.Formatter.BytesResult;
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.Preference.OnPreferenceClickListener;
|
import androidx.preference.Preference.OnPreferenceClickListener;
|
||||||
|
import androidx.preference.PreferenceCategory;
|
||||||
|
import androidx.preference.SwitchPreference;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SummaryPreference;
|
import com.android.settings.SummaryPreference;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.applications.ProcStatsData.MemInfo;
|
import com.android.settings.applications.ProcStatsData.MemInfo;
|
||||||
import com.android.settings.core.SubSettingLauncher;
|
import com.android.settings.core.SubSettingLauncher;
|
||||||
|
import com.android.settings.development.DisableDevSettingsDialogFragment;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@@ -37,6 +43,8 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener {
|
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_STATUS_HEADER = "status_header";
|
||||||
|
|
||||||
private static final String KEY_PERFORMANCE = "performance";
|
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_AVERAGY_USED = "average_used";
|
||||||
private static final String KEY_FREE = "free";
|
private static final String KEY_FREE = "free";
|
||||||
private static final String KEY_APP_LIST = "apps_list";
|
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 SummaryPreference mSummaryPref;
|
||||||
|
|
||||||
private Preference mPerformance;
|
private Preference mPerformance;
|
||||||
@@ -52,12 +62,14 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
|
|||||||
private Preference mAverageUsed;
|
private Preference mAverageUsed;
|
||||||
private Preference mFree;
|
private Preference mFree;
|
||||||
private Preference mAppListPreference;
|
private Preference mAppListPreference;
|
||||||
|
private SwitchPreference mForceEnablePssProfiling;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle icicle) {
|
public void onCreate(Bundle icicle) {
|
||||||
super.onCreate(icicle);
|
super.onCreate(icicle);
|
||||||
|
|
||||||
addPreferencesFromResource(R.xml.process_stats_summary);
|
addPreferencesFromResource(R.xml.process_stats_summary);
|
||||||
|
mMemoryInfoPrefCategory = (PreferenceCategory) findPreference(KEY_MEMORY_INFO_PREF_GROUP);
|
||||||
mSummaryPref = (SummaryPreference) findPreference(KEY_STATUS_HEADER);
|
mSummaryPref = (SummaryPreference) findPreference(KEY_STATUS_HEADER);
|
||||||
mPerformance = findPreference(KEY_PERFORMANCE);
|
mPerformance = findPreference(KEY_PERFORMANCE);
|
||||||
mTotalMemory = findPreference(KEY_TOTAL_MEMORY);
|
mTotalMemory = findPreference(KEY_TOTAL_MEMORY);
|
||||||
@@ -65,11 +77,37 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
|
|||||||
mFree = findPreference(KEY_FREE);
|
mFree = findPreference(KEY_FREE);
|
||||||
mAppListPreference = findPreference(KEY_APP_LIST);
|
mAppListPreference = findPreference(KEY_APP_LIST);
|
||||||
mAppListPreference.setOnPreferenceClickListener(this);
|
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
|
@Override
|
||||||
public void refreshUi() {
|
public void refreshUi() {
|
||||||
Context context = getContext();
|
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();
|
MemInfo memInfo = mStatsManager.getMemInfo();
|
||||||
|
|
||||||
@@ -100,7 +138,8 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
|
|||||||
String durationString = getString(sDurationLabels[mDurationIndex]);
|
String durationString = getString(sDurationLabels[mDurationIndex]);
|
||||||
int numApps = mStatsManager.getEntries().size();
|
int numApps = mStatsManager.getEntries().size();
|
||||||
MessageFormat msgFormat = new MessageFormat(
|
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<>();
|
Map<String, Object> arguments = new HashMap<>();
|
||||||
arguments.put("count", numApps);
|
arguments.put("count", numApps);
|
||||||
arguments.put("time", durationString);
|
arguments.put("time", durationString);
|
||||||
@@ -131,7 +170,34 @@ public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenc
|
|||||||
.setSourceMetricsCategory(getMetricsCategory())
|
.setSourceMetricsCategory(getMetricsCategory())
|
||||||
.launch();
|
.launch();
|
||||||
return true;
|
return true;
|
||||||
|
} else if (preference == mForceEnablePssProfiling) {
|
||||||
|
DisableDevSettingsDialogFragment.show(this);
|
||||||
}
|
}
|
||||||
return false;
|
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()));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -29,6 +29,8 @@ import androidx.fragment.app.Fragment;
|
|||||||
import androidx.fragment.app.FragmentManager;
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.SettingsPreferenceFragment;
|
||||||
|
import com.android.settings.applications.ProcessStatsSummary;
|
||||||
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||||
|
|
||||||
public class DisableDevSettingsDialogFragment extends InstrumentedDialogFragment
|
public class DisableDevSettingsDialogFragment extends InstrumentedDialogFragment
|
||||||
@@ -42,7 +44,7 @@ public class DisableDevSettingsDialogFragment extends InstrumentedDialogFragment
|
|||||||
return dialog;
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void show(DevelopmentSettingsDashboardFragment host) {
|
public static void show(SettingsPreferenceFragment host) {
|
||||||
final DisableDevSettingsDialogFragment dialog = new DisableDevSettingsDialogFragment();
|
final DisableDevSettingsDialogFragment dialog = new DisableDevSettingsDialogFragment();
|
||||||
dialog.setTargetFragment(host, 0 /* requestCode */);
|
dialog.setTargetFragment(host, 0 /* requestCode */);
|
||||||
// We need to handle data changes and switch state based on which button user clicks,
|
// We need to handle data changes and switch state based on which button user clicks,
|
||||||
@@ -75,18 +77,31 @@ public class DisableDevSettingsDialogFragment extends InstrumentedDialogFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
Fragment fragment = getTargetFragment();
|
Fragment fragment = getTargetFragment();
|
||||||
if (!(fragment instanceof DevelopmentSettingsDashboardFragment)){
|
if (!(fragment instanceof DevelopmentSettingsDashboardFragment)
|
||||||
|
&& !(fragment instanceof ProcessStatsSummary)) {
|
||||||
Log.e(TAG, "getTargetFragment return unexpected type");
|
Log.e(TAG, "getTargetFragment return unexpected type");
|
||||||
}
|
}
|
||||||
|
|
||||||
final DevelopmentSettingsDashboardFragment host =
|
if (fragment instanceof DevelopmentSettingsDashboardFragment) {
|
||||||
(DevelopmentSettingsDashboardFragment) fragment;
|
final DevelopmentSettingsDashboardFragment host =
|
||||||
if (which == DialogInterface.BUTTON_POSITIVE) {
|
(DevelopmentSettingsDashboardFragment) fragment;
|
||||||
host.onDisableDevelopmentOptionsConfirmed();
|
if (which == DialogInterface.BUTTON_POSITIVE) {
|
||||||
PowerManager pm = getContext().getSystemService(PowerManager.class);
|
host.onDisableDevelopmentOptionsConfirmed();
|
||||||
pm.reboot(null);
|
PowerManager pm = getContext().getSystemService(PowerManager.class);
|
||||||
} else {
|
pm.reboot(null);
|
||||||
host.onDisableDevelopmentOptionsRejected();
|
} else {
|
||||||
|
host.onDisableDevelopmentOptionsRejected();
|
||||||
|
}
|
||||||
|
} else if (fragment instanceof ProcessStatsSummary) {
|
||||||
|
final ProcessStatsSummary host =
|
||||||
|
(ProcessStatsSummary) fragment;
|
||||||
|
if (which == DialogInterface.BUTTON_POSITIVE) {
|
||||||
|
host.onRebootDialogConfirmed();
|
||||||
|
PowerManager pm = getContext().getSystemService(PowerManager.class);
|
||||||
|
pm.reboot(null);
|
||||||
|
} else {
|
||||||
|
host.onRebootDialogCanceled();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -17,6 +17,8 @@
|
|||||||
package com.android.settings.development;
|
package com.android.settings.development;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.os.Flags;
|
||||||
|
import android.provider.Settings;
|
||||||
import android.text.format.Formatter;
|
import android.text.format.Formatter;
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
@@ -65,9 +67,13 @@ public class MemoryUsagePreferenceController extends DeveloperOptionsPreferenceC
|
|||||||
(long) memInfo.realUsedRam);
|
(long) memInfo.realUsedRam);
|
||||||
final String totalResult = Formatter.formatShortFileSize(mContext,
|
final String totalResult = Formatter.formatShortFileSize(mContext,
|
||||||
(long) memInfo.realTotalRam);
|
(long) memInfo.realTotalRam);
|
||||||
ThreadUtils.postOnMainThread(
|
boolean displayMemorySummary = !Flags.removeAppProfilerPssCollection();
|
||||||
() -> mPreference.setSummary(mContext.getString(R.string.memory_summary,
|
displayMemorySummary |= Settings.Global.getInt(mContext.getContentResolver(),
|
||||||
usedResult, totalResult)));
|
Settings.Global.FORCE_ENABLE_PSS_PROFILING, 0) == 1;
|
||||||
|
String summary = displayMemorySummary
|
||||||
|
? mContext.getString(R.string.memory_summary, usedResult, totalResult)
|
||||||
|
: mContext.getString(R.string.pss_profiling_disabled);
|
||||||
|
ThreadUtils.postOnMainThread(() -> mPreference.setSummary(summary));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.ui
|
||||||
|
|
||||||
|
import android.os.Flags
|
||||||
|
import android.platform.test.annotations.RequiresFlagsDisabled
|
||||||
|
import android.platform.test.annotations.RequiresFlagsEnabled
|
||||||
|
import android.provider.Settings
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||||
|
import androidx.test.filters.SmallTest
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
|
import androidx.test.uiautomator.By
|
||||||
|
import androidx.test.uiautomator.UiDevice
|
||||||
|
import com.android.settings.ui.testutils.SettingsTestUtils.assertHasTexts
|
||||||
|
import com.android.settings.ui.testutils.SettingsTestUtils.clickObject
|
||||||
|
import com.android.settings.ui.testutils.SettingsTestUtils.startMainActivityFromHomeScreen
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
@SmallTest
|
||||||
|
class MemorySettingsTest {
|
||||||
|
private val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setUp() {
|
||||||
|
device.startMainActivityFromHomeScreen(Settings.ACTION_DEVICE_INFO_SETTINGS)
|
||||||
|
device.assertHasTexts(listOf(BUILD_NUMBER))
|
||||||
|
repeat(7) { // Enable development mode
|
||||||
|
device.clickObject(By.text(BUILD_NUMBER))
|
||||||
|
}
|
||||||
|
device.startMainActivityFromHomeScreen(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS)
|
||||||
|
device.clickObject(By.text(MEMORY_PAGE))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@RequiresFlagsDisabled(Flags.FLAG_REMOVE_APP_PROFILER_PSS_COLLECTION)
|
||||||
|
fun memoryPageIfPssFlagDisabled() {
|
||||||
|
device.assertHasTexts(ON_SCREEN_TEXTS_DEFAULT)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@RequiresFlagsEnabled(Flags.FLAG_REMOVE_APP_PROFILER_PSS_COLLECTION)
|
||||||
|
fun memoryPageIfPssFlagEnabled() {
|
||||||
|
device.assertHasTexts(ON_SCREEN_TEXTS_PSS_PROFILING_DISABLED)
|
||||||
|
}
|
||||||
|
|
||||||
|
private companion object {
|
||||||
|
private const val BUILD_NUMBER = "Build number"
|
||||||
|
private const val MEMORY_PAGE = "Memory"
|
||||||
|
val ON_SCREEN_TEXTS_DEFAULT = listOf(
|
||||||
|
"Performance",
|
||||||
|
"Total memory",
|
||||||
|
"Average used (%)",
|
||||||
|
"Free",
|
||||||
|
)
|
||||||
|
val ON_SCREEN_TEXTS_PSS_PROFILING_DISABLED = listOf(
|
||||||
|
"Enable memory usage profiling",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user