From 29002aacb042aef6f839215054c08a32e9b3a0f9 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Fri, 19 Jan 2018 17:32:23 -0800 Subject: [PATCH] Revamp the battery detail page for each app 1. Move preferences to new postion 2. Change background activity pref from SwitchPreference to Preference and update the controller Bug: 72227981 Test: RunSettingsRoboTests Change-Id: Ib18ac7523c24d19754c37ab8ac527095d9ced49c --- res/values/strings.xml | 7 +- res/xml/power_usage_detail.xml | 32 ++++----- .../fuelgauge/AdvancedPowerUsageDetail.java | 2 +- ...ackgroundActivityPreferenceController.java | 52 +++++++------- ...roundActivityPreferenceControllerTest.java | 70 +++++++------------ 5 files changed, 77 insertions(+), 86 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 164f6d5de29..2a14ef5c906 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4719,7 +4719,7 @@ %1$s to charge - Background activity + Restricted Allow the app to run in the background @@ -7602,6 +7602,11 @@ No + + Yes + + No + Require PIN? diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml index acd63676e96..acc62b6cb8d 100644 --- a/res/xml/power_usage_detail.xml +++ b/res/xml/power_usage_detail.xml @@ -27,6 +27,22 @@ android:key="action_buttons" android:order="-9999"/> + + + + + + + + - - - - - - - - \ No newline at end of file diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java index 819846adea0..de027a3a199 100644 --- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java +++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java @@ -374,7 +374,7 @@ public class AdvancedPowerUsageDetail extends DashboardFragment implements @Override public void onLimitBackgroundActivity() { - mBackgroundActivityPreferenceController.setUnchecked( + mBackgroundActivityPreferenceController.setRestricted( findPreference(mBackgroundActivityPreferenceController.getPreferenceKey())); } } diff --git a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java index 8286774226a..01e41825074 100644 --- a/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceController.java @@ -43,12 +43,12 @@ import com.android.settingslib.fuelgauge.PowerWhitelistBackend; * Controller to control whether an app can run in the background */ public class BackgroundActivityPreferenceController extends AbstractPreferenceController - implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener { + implements PreferenceControllerMixin { private static final String TAG = "BgActivityPrefContr"; - private static final String KEY_BACKGROUND_ACTIVITY = "background_activity"; + @VisibleForTesting + static final String KEY_BACKGROUND_ACTIVITY = "background_activity"; - private final PackageManager mPackageManager; private final AppOpsManager mAppOpsManager; private final UserManager mUserManager; private final int mUid; @@ -70,7 +70,6 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo int uid, String packageName, PowerWhitelistBackend backend) { super(context); mPowerWhitelistBackend = backend; - mPackageManager = context.getPackageManager(); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mDpm = new DevicePolicyManagerWrapper( (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE)); @@ -86,11 +85,6 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo final int mode = mAppOpsManager .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage); final boolean whitelisted = mPowerWhitelistBackend.isWhitelisted(mTargetPackage); - // Set checked or not before we may set it disabled - if (mode != AppOpsManager.MODE_ERRORED) { - final boolean checked = whitelisted || mode != AppOpsManager.MODE_IGNORED; - ((SwitchPreference) preference).setChecked(checked); - } if (whitelisted || mode == AppOpsManager.MODE_ERRORED || Utils.isProfileOrDeviceOwner(mUserManager, mDpm, mTargetPackage)) { preference.setEnabled(false); @@ -109,9 +103,8 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo * Called from the warning dialog, if the user decides to go ahead and disable background * activity for this package */ - public void setUnchecked(Preference preference) { + public void setRestricted(Preference preference) { mBatteryUtils.setForceAppStandby(mUid, mTargetPackage, AppOpsManager.MODE_IGNORED); - ((SwitchPreference) preference).setChecked(false); updateSummary(preference); } @@ -121,17 +114,21 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo } @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - final boolean switchOn = (Boolean) newValue; - if (!switchOn) { - final WarningDialogFragment dialogFragment = new WarningDialogFragment(); - dialogFragment.setTargetFragment(mFragment, 0); - dialogFragment.show(mFragment.getFragmentManager(), TAG); - return false; + public boolean handlePreferenceTreeClick(Preference preference) { + if (KEY_BACKGROUND_ACTIVITY.equals(preference.getKey())) { + final int mode = mAppOpsManager + .checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, mUid, mTargetPackage); + final boolean restricted = mode == AppOpsManager.MODE_IGNORED; + if (!restricted) { + showDialog(); + return false; + } + mBatteryUtils.setForceAppStandby(mUid, mTargetPackage, AppOpsManager.MODE_ALLOWED); + updateSummary(preference); + return true; } - mBatteryUtils.setForceAppStandby(mUid, mTargetPackage, AppOpsManager.MODE_ALLOWED); - updateSummary(preference); - return true; + + return false; } @VisibleForTesting @@ -146,12 +143,19 @@ public class BackgroundActivityPreferenceController extends AbstractPreferenceCo if (mode == AppOpsManager.MODE_ERRORED) { preference.setSummary(R.string.background_activity_summary_disabled); } else { - final boolean checked = mode != AppOpsManager.MODE_IGNORED; - preference.setSummary(checked ? R.string.background_activity_summary_on - : R.string.background_activity_summary_off); + final boolean restricted = mode == AppOpsManager.MODE_IGNORED; + preference.setSummary(restricted ? R.string.restricted_true_label + : R.string.restricted_false_label); } } + @VisibleForTesting + void showDialog() { + final WarningDialogFragment dialogFragment = new WarningDialogFragment(); + dialogFragment.setTargetFragment(mFragment, 0 /* requestCode */); + dialogFragment.show(mFragment.getFragmentManager(), TAG); + } + interface WarningConfirmationListener { void onLimitBackgroundActivity(); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java index 0c9e394ffdd..30fdccb23ec 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java @@ -22,6 +22,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -38,6 +39,7 @@ import android.content.pm.PackageManager; import android.os.Build; import android.os.UserManager; import android.support.v14.preference.SwitchPreference; +import android.support.v7.preference.Preference; import android.widget.Button; import com.android.settings.R; @@ -92,12 +94,12 @@ public class BackgroundActivityPreferenceControllerTest { private DevicePolicyManager mDevicePolicyManager; @Mock private DevicePolicyManagerWrapper mDevicePolicyManagerWrapper; - @Mock + @Mock(answer = Answers.RETURNS_DEEP_STUBS) private AdvancedPowerUsageDetail mFragment; @Mock private PowerWhitelistBackend mPowerWhitelistBackend; private BackgroundActivityPreferenceController mController; - private SwitchPreference mPreference; + private Preference mPreference; private Context mShadowContext; private BatteryUtils mBatteryUtils; @@ -125,7 +127,8 @@ public class BackgroundActivityPreferenceControllerTest { mBatteryUtils = spy(new BatteryUtils(mShadowContext)); doNothing().when(mBatteryUtils).setForceAppStandby(anyInt(), anyString(), anyInt()); - mPreference = new SwitchPreference(mShadowContext); + mPreference = new Preference(mShadowContext); + mPreference.setKey(BackgroundActivityPreferenceController.KEY_BACKGROUND_ACTIVITY); mController = spy(new BackgroundActivityPreferenceController( mContext, mFragment, UID_LOW_SDK, LOW_SDK_PACKAGE, mPowerWhitelistBackend)); mController.mDpm = mDevicePolicyManagerWrapper; @@ -133,49 +136,33 @@ public class BackgroundActivityPreferenceControllerTest { } @Test - public void testOnPreferenceChange_TurnOnCheck_MethodInvoked() { - mController.onPreferenceChange(mPreference, true); + public void testHandlePreferenceTreeClick_restrictApp_showDialog() { + doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager).checkOpNoThrow(anyInt(), + anyInt(), anyString()); + + mController.handlePreferenceTreeClick(mPreference); + + verify(mController).showDialog(); + } + + @Test + public void testHandlePreferenceTreeClick_unRestrictApp_setModeAllowed() { + doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager).checkOpNoThrow(anyInt(), + anyInt(), anyString()); + + mController.handlePreferenceTreeClick(mPreference); verify(mBatteryUtils).setForceAppStandby(UID_LOW_SDK, LOW_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED); - assertThat(mPreference.getSummary()) - .isEqualTo(mShadowContext.getText(R.string.background_activity_summary_on)); } @Test - public void testOnPreferenceChange_TurnOnCheckHighSDK_MethodInvoked() { - mController = new BackgroundActivityPreferenceController(mContext, mFragment, UID_HIGH_SDK, - HIGH_SDK_PACKAGE, mPowerWhitelistBackend); - mController.mBatteryUtils = mBatteryUtils; - - mController.onPreferenceChange(mPreference, true); - - verify(mBatteryUtils).setForceAppStandby(UID_HIGH_SDK, HIGH_SDK_PACKAGE, - AppOpsManager.MODE_ALLOWED); - assertThat(mPreference.getSummary()) - .isEqualTo(mShadowContext.getText(R.string.background_activity_summary_on)); - } - - @Test - public void testUpdateState_CheckOn_SetCheckedTrue() { + public void testUpdateState_noError_setEnabled() { when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK, LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_ALLOWED); mController.updateState(mPreference); - assertThat(mPreference.isChecked()).isTrue(); - assertThat(mPreference.isEnabled()).isTrue(); - verify(mController).updateSummary(mPreference); - } - - @Test - public void testUpdateState_CheckOff_SetCheckedFalse() { - when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK, - LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED); - - mController.updateState(mPreference); - - assertThat(mPreference.isChecked()).isFalse(); assertThat(mPreference.isEnabled()).isTrue(); verify(mController).updateSummary(mPreference); } @@ -184,7 +171,6 @@ public class BackgroundActivityPreferenceControllerTest { public void testUpdateState_whitelisted() { when(mPowerWhitelistBackend.isWhitelisted(LOW_SDK_PACKAGE)).thenReturn(true); mController.updateState(mPreference); - assertThat(mPreference.isChecked()).isTrue(); assertThat(mPreference.isEnabled()).isFalse(); assertThat(mPreference.getSummary()).isEqualTo( mShadowContext.getText(R.string.background_activity_summary_whitelisted)); @@ -202,27 +188,23 @@ public class BackgroundActivityPreferenceControllerTest { } @Test - public void testUpdateSummary_modeDefault_showSummaryOn() { + public void testUpdateSummary_modeDefault_showNotRestricted() { when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK, LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_DEFAULT); - final CharSequence expectedSummary = mShadowContext.getText( - R.string.background_activity_summary_on); mController.updateSummary(mPreference); - assertThat(mPreference.getSummary()).isEqualTo(expectedSummary); + assertThat(mPreference.getSummary()).isEqualTo("No"); } @Test - public void testUpdateSummary_modeIgnored_showSummaryOff() { + public void testUpdateSummary_modeIgnored_showRestricted() { when(mAppOpsManager.checkOpNoThrow(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK, LOW_SDK_PACKAGE)).thenReturn(AppOpsManager.MODE_IGNORED); - final CharSequence expectedSummary = mShadowContext.getText( - R.string.background_activity_summary_off); mController.updateSummary(mPreference); - assertThat(mPreference.getSummary()).isEqualTo(expectedSummary); + assertThat(mPreference.getSummary()).isEqualTo("Yes"); } @Test