Add restrict app detail page
1. Move force standby action to BatteryUtils 2. Add click action for restricted preference(go to detail page) 3. Build app list in detail page using packageOps list Bug: 71502850 Test: RunSettingsRoboTests Change-Id: I1e6733e5402e7a854b07a8bbb43a86255276bfaa
This commit is contained in:
@@ -18,6 +18,10 @@ package com.android.settings.fuelgauge;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
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.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
@@ -38,6 +42,7 @@ import android.widget.Button;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.TestConfig;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.testutils.shadow.SettingsShadowResources;
|
||||
import com.android.settings.testutils.shadow.ShadowFragment;
|
||||
import com.android.settings.wrapper.DevicePolicyManagerWrapper;
|
||||
@@ -94,12 +99,14 @@ public class BackgroundActivityPreferenceControllerTest {
|
||||
private BackgroundActivityPreferenceController mController;
|
||||
private SwitchPreference mPreference;
|
||||
private Context mShadowContext;
|
||||
private BatteryUtils mBatteryUtils;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mShadowContext = RuntimeEnvironment.application;
|
||||
FakeFeatureFactory.setupForTest();
|
||||
when(mContext.getPackageManager()).thenReturn(mPackageManager);
|
||||
when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager);
|
||||
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
|
||||
@@ -115,21 +122,22 @@ public class BackgroundActivityPreferenceControllerTest {
|
||||
mHighApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
|
||||
mLowApplicationInfo.targetSdkVersion = Build.VERSION_CODES.L;
|
||||
|
||||
mBatteryUtils = spy(new BatteryUtils(mShadowContext));
|
||||
doNothing().when(mBatteryUtils).setForceAppStandby(anyInt(), anyString(), anyInt());
|
||||
|
||||
mPreference = new SwitchPreference(mShadowContext);
|
||||
mController = spy(new BackgroundActivityPreferenceController(
|
||||
mContext, mFragment, UID_LOW_SDK, LOW_SDK_PACKAGE, mPowerWhitelistBackend));
|
||||
mController.mDpm = mDevicePolicyManagerWrapper;
|
||||
mController.mBatteryUtils = mBatteryUtils;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOnPreferenceChange_TurnOnCheck_MethodInvoked() {
|
||||
mController.onPreferenceChange(mPreference, true);
|
||||
|
||||
verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_LOW_SDK,
|
||||
LOW_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
|
||||
verify(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_LOW_SDK,
|
||||
LOW_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
|
||||
|
||||
verify(mBatteryUtils).setForceAppStandby(UID_LOW_SDK, LOW_SDK_PACKAGE,
|
||||
AppOpsManager.MODE_ALLOWED);
|
||||
assertThat(mPreference.getSummary())
|
||||
.isEqualTo(mShadowContext.getText(R.string.background_activity_summary_on));
|
||||
}
|
||||
@@ -138,11 +146,12 @@ public class BackgroundActivityPreferenceControllerTest {
|
||||
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(mAppOpsManager).setMode(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, UID_HIGH_SDK,
|
||||
HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
|
||||
verify(mAppOpsManager, never()).setMode(AppOpsManager.OP_RUN_IN_BACKGROUND, UID_HIGH_SDK,
|
||||
HIGH_SDK_PACKAGE, AppOpsManager.MODE_ALLOWED);
|
||||
|
||||
verify(mBatteryUtils).setForceAppStandby(UID_HIGH_SDK, HIGH_SDK_PACKAGE,
|
||||
AppOpsManager.MODE_ALLOWED);
|
||||
assertThat(mPreference.getSummary())
|
||||
.isEqualTo(mShadowContext.getText(R.string.background_activity_summary_on));
|
||||
}
|
||||
@@ -216,16 +225,6 @@ public class BackgroundActivityPreferenceControllerTest {
|
||||
assertThat(mPreference.getSummary()).isEqualTo(expectedSummary);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLegacyApp_SdkLowerThanO_ReturnTrue() {
|
||||
assertThat(mController.isLegacyApp(LOW_SDK_PACKAGE)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLegacyApp_SdkLargerOrEqualThanO_ReturnFalse() {
|
||||
assertThat(mController.isLegacyApp(HIGH_SDK_PACKAGE)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsAvailable_ReturnTrue() {
|
||||
assertThat(mController.isAvailable()).isTrue();
|
||||
|
@@ -103,6 +103,8 @@ public class BatteryUtilsTest {
|
||||
private static final double PRECISION = 0.001;
|
||||
private static final int SDK_VERSION = Build.VERSION_CODES.L;
|
||||
private static final String PACKAGE_NAME = "com.android.app";
|
||||
private static final String HIGH_SDK_PACKAGE = "com.android.package.high";
|
||||
private static final String LOW_SDK_PACKAGE = "com.android.package.low";
|
||||
|
||||
@Mock
|
||||
private BatteryStats.Uid mUid;
|
||||
@@ -137,16 +139,18 @@ public class BatteryUtilsTest {
|
||||
@Mock
|
||||
private ApplicationInfo mApplicationInfo;
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Context mContext;
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private BatteryStatsHelper mBatteryStatsHelper;
|
||||
@Mock
|
||||
private ApplicationInfo mHighApplicationInfo;
|
||||
@Mock
|
||||
private ApplicationInfo mLowApplicationInfo;
|
||||
private BatteryUtils mBatteryUtils;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
private PowerUsageFeatureProvider mProvider;
|
||||
private List<BatterySipper> mUsageList;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
public void setUp() throws PackageManager.NameNotFoundException {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
@@ -165,6 +169,14 @@ public class BatteryUtilsTest {
|
||||
when(mBatteryStatsHelper.getStats().computeBatteryRealtime(anyLong(), anyInt())).thenReturn(
|
||||
TIME_SINCE_LAST_FULL_CHARGE_US);
|
||||
|
||||
when(mPackageManager.getApplicationInfo(HIGH_SDK_PACKAGE, PackageManager.GET_META_DATA))
|
||||
.thenReturn(mHighApplicationInfo);
|
||||
when(mPackageManager.getApplicationInfo(LOW_SDK_PACKAGE, PackageManager.GET_META_DATA))
|
||||
.thenReturn(mLowApplicationInfo);
|
||||
mHighApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
|
||||
mLowApplicationInfo.targetSdkVersion = Build.VERSION_CODES.L;
|
||||
|
||||
|
||||
mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
|
||||
mNormalBatterySipper.totalPowerMah = TOTAL_BATTERY_USAGE;
|
||||
|
||||
@@ -501,4 +513,14 @@ public class BatteryUtilsTest {
|
||||
assertThat(mBatteryUtils.calculateScreenUsageTime(mBatteryStatsHelper)).isEqualTo(
|
||||
TIME_EXPECTED_FOREGROUND);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLegacyApp_SdkLowerThanO_ReturnTrue() {
|
||||
assertThat(mBatteryUtils.isLegacyApp(LOW_SDK_PACKAGE)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsLegacyApp_SdkLargerOrEqualThanO_ReturnFalse() {
|
||||
assertThat(mBatteryUtils.isLegacyApp(HIGH_SDK_PACKAGE)).isFalse();
|
||||
}
|
||||
}
|
||||
|
@@ -19,13 +19,18 @@ package com.android.settings.fuelgauge;
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.content.Context;
|
||||
import android.support.v14.preference.PreferenceFragment;
|
||||
import android.support.v7.preference.Preference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.TestConfig;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -48,6 +53,10 @@ public class RestrictAppPreferenceControllerTest {
|
||||
private AppOpsManager mAppOpsManager;
|
||||
@Mock
|
||||
private AppOpsManager.PackageOps mPackageOps;
|
||||
@Mock
|
||||
private SettingsActivity mSettingsActivity;
|
||||
@Mock
|
||||
private PreferenceFragment mFragment;
|
||||
private List<AppOpsManager.PackageOps> mPackageOpsList;
|
||||
private RestrictAppPreferenceController mRestrictAppPreferenceController;
|
||||
private Preference mPreference;
|
||||
@@ -59,9 +68,12 @@ public class RestrictAppPreferenceControllerTest {
|
||||
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE);
|
||||
mRestrictAppPreferenceController = new RestrictAppPreferenceController(mContext);
|
||||
doReturn(mContext).when(mSettingsActivity).getApplicationContext();
|
||||
mRestrictAppPreferenceController = new RestrictAppPreferenceController(mSettingsActivity,
|
||||
mFragment);
|
||||
mPackageOpsList = new ArrayList<>();
|
||||
mPreference = new Preference(mContext);
|
||||
mPreference.setKey(mRestrictAppPreferenceController.getPreferenceKey());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -85,4 +97,22 @@ public class RestrictAppPreferenceControllerTest {
|
||||
assertThat(mPreference.getSummary()).isEqualTo("2 apps");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdateState_zeroApp_disabled() {
|
||||
doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any());
|
||||
|
||||
mRestrictAppPreferenceController.updateState(mPreference);
|
||||
|
||||
assertThat(mPreference.isEnabled()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHandlePreferenceTreeClick_startFragment() {
|
||||
mRestrictAppPreferenceController.handlePreferenceTreeClick(mPreference);
|
||||
|
||||
verify(mSettingsActivity).startPreferencePanelAsUser(eq(mFragment),
|
||||
eq(RestrictedAppDetails.class.getName()), any(), eq(R.string.restricted_app_title),
|
||||
any(), any());
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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.fuelgauge;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.support.v7.preference.PreferenceCategory;
|
||||
import android.support.v7.preference.PreferenceManager;
|
||||
|
||||
import com.android.settings.TestConfig;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||
public class RestrictedAppDetailsTest {
|
||||
private static final String PACKAGE_NAME = "com.android.app";
|
||||
private static final String APP_NAME = "app";
|
||||
private static final int UID = 1234;
|
||||
@Mock
|
||||
private PackageManager mPackageManager;
|
||||
@Mock
|
||||
private ApplicationInfo mApplicationInfo;
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private PreferenceManager mPreferenceManager;
|
||||
private RestrictedAppDetails mFragment;
|
||||
private Context mContext;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
mFragment = spy(new RestrictedAppDetails());
|
||||
|
||||
doReturn(mPreferenceManager).when(mFragment).getPreferenceManager();
|
||||
doReturn(mContext).when(mPreferenceManager).getContext();
|
||||
mFragment.mPackageManager = mPackageManager;
|
||||
mFragment.mPackageOpsList = new ArrayList<>();
|
||||
mFragment.mPackageOpsList.add(
|
||||
new AppOpsManager.PackageOps(PACKAGE_NAME, UID, null /* entries */));
|
||||
mFragment.mRestrictedAppListGroup = spy(new PreferenceCategory(mContext));
|
||||
doReturn(mPreferenceManager).when(mFragment.mRestrictedAppListGroup).getPreferenceManager();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRefreshUi_displayPreference() throws Exception {
|
||||
doReturn(mApplicationInfo).when(mPackageManager).getApplicationInfo(PACKAGE_NAME, 0);
|
||||
doReturn(APP_NAME).when(mPackageManager).getApplicationLabel(mApplicationInfo);
|
||||
|
||||
mFragment.refreshUi();
|
||||
|
||||
assertThat(mFragment.mRestrictedAppListGroup.getPreferenceCount()).isEqualTo(1);
|
||||
final Preference preference = mFragment.mRestrictedAppListGroup.getPreference(0);
|
||||
assertThat(preference.getKey()).isEqualTo(PACKAGE_NAME);
|
||||
assertThat(preference.getTitle()).isEqualTo(APP_NAME);
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user