From 37d29ee6a68adaca75ba5a0a08ee13a6e93464e3 Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Tue, 20 Mar 2018 16:11:25 -0700 Subject: [PATCH] Only show restricted apps that belong to the user. Filter out the restricted apps that not belong to the correct user, in this way secondary user cannot see what apps been restricted by primary user. Bug: 74076658 Test: RunSettingsRoboTests Change-Id: I8471f07be747c177f8611cdc1973a8420dc41296 --- .../RestrictAppPreferenceController.java | 9 +++-- .../BatteryManagerPreferenceController.java | 5 ++- .../fuelgauge/batterytip/BatteryTipUtils.java | 10 ++++-- .../RestrictAppPreferenceControllerTest.java | 36 ++++++++++++++++++- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java index 100c5f685be..fce8a65e215 100644 --- a/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java +++ b/src/com/android/settings/fuelgauge/RestrictAppPreferenceController.java @@ -19,6 +19,8 @@ package com.android.settings.fuelgauge; import android.app.AppOpsManager; import android.content.Context; +import android.os.UserHandle; +import android.os.UserManager; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; @@ -38,14 +40,17 @@ public class RestrictAppPreferenceController extends BasePreferenceController { @VisibleForTesting static final String KEY_RESTRICT_APP = "restricted_app"; + @VisibleForTesting + List mAppInfos; private AppOpsManager mAppOpsManager; - private List mAppInfos; private SettingsActivity mSettingsActivity; private InstrumentedPreferenceFragment mPreferenceFragment; + private UserManager mUserManager; public RestrictAppPreferenceController(Context context) { super(context, KEY_RESTRICT_APP); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + mUserManager = context.getSystemService(UserManager.class); } public RestrictAppPreferenceController(SettingsActivity settingsActivity, @@ -64,7 +69,7 @@ public class RestrictAppPreferenceController extends BasePreferenceController { public void updateState(Preference preference) { super.updateState(preference); - mAppInfos = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager); + mAppInfos = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager, mUserManager); final int num = mAppInfos.size(); // Enable the preference if some apps already been restricted, otherwise disable it diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java index 087f98317eb..be2ed845beb 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryManagerPreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge.batterytip; import android.app.AppOpsManager; import android.content.Context; +import android.os.UserManager; import android.provider.Settings; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; @@ -35,12 +36,14 @@ public class BatteryManagerPreferenceController extends BasePreferenceController private static final int ON = 1; private PowerUsageFeatureProvider mPowerUsageFeatureProvider; private AppOpsManager mAppOpsManager; + private UserManager mUserManager; public BatteryManagerPreferenceController(Context context) { super(context, KEY_BATTERY_MANAGER); mPowerUsageFeatureProvider = FeatureFactory.getFactory( context).getPowerUsageFeatureProvider(context); mAppOpsManager = context.getSystemService(AppOpsManager.class); + mUserManager = context.getSystemService(UserManager.class); } @Override @@ -51,7 +54,7 @@ public class BatteryManagerPreferenceController extends BasePreferenceController @Override public void updateState(Preference preference) { super.updateState(preference); - final int num = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager).size(); + final int num = BatteryTipUtils.getRestrictedAppsList(mAppOpsManager, mUserManager).size(); final String setting = mPowerUsageFeatureProvider.isSmartBatterySupported() ? Settings.Global.APP_STANDBY_ENABLED : Settings.Global.APP_AUTO_RESTRICTION_ENABLED; diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java index a2179892dbb..a9e0fc87fa9 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipUtils.java @@ -21,6 +21,8 @@ import android.app.PendingIntent; import android.app.StatsManager; import android.content.Context; import android.content.Intent; +import android.os.UserHandle; +import android.os.UserManager; import android.support.annotation.NonNull; import com.android.internal.util.CollectionUtils; @@ -49,7 +51,9 @@ public class BatteryTipUtils { * Get a list of restricted apps with {@link AppOpsManager#OP_RUN_ANY_IN_BACKGROUND} */ @NonNull - public static List getRestrictedAppsList(AppOpsManager appOpsManager) { + public static List getRestrictedAppsList(AppOpsManager appOpsManager, + UserManager userManager) { + final List userHandles = userManager.getUserProfiles(); final List packageOpsList = appOpsManager.getPackagesForOps( new int[]{AppOpsManager.OP_RUN_ANY_IN_BACKGROUND}); final List appInfos = new ArrayList<>(); @@ -62,7 +66,9 @@ public class BatteryTipUtils { if (entry.getOp() != AppOpsManager.OP_RUN_ANY_IN_BACKGROUND) { continue; } - if (entry.getMode() != AppOpsManager.MODE_ALLOWED) { + if (entry.getMode() != AppOpsManager.MODE_ALLOWED + && userHandles.contains( + new UserHandle(UserHandle.getUserId(packageOps.getUid())))) { appInfos.add(new AppInfo.Builder() .setPackageName(packageOps.getPackageName()) .setUid(packageOps.getUid()) diff --git a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java index 57eff56bad8..5fdf6492b77 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/RestrictAppPreferenceControllerTest.java @@ -29,11 +29,14 @@ import static org.mockito.Mockito.verify; import android.app.AppOpsManager; import android.content.Context; import android.content.Intent; +import android.os.UserHandle; +import android.os.UserManager; import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.core.InstrumentedPreferenceFragment; +import com.android.settings.fuelgauge.batterytip.AppInfo; import org.junit.Before; import org.junit.Test; @@ -53,6 +56,7 @@ public class RestrictAppPreferenceControllerTest { private static final String ALLOWED_PACKAGE_NAME = "com.android.allowed.package"; private static final int RESTRICTED_UID = 222; private static final String RESTRICTED_PACKAGE_NAME = "com.android.restricted.package"; + private static final int OTHER_USER_UID = UserHandle.PER_USER_RANGE + RESTRICTED_UID; @Mock private AppOpsManager mAppOpsManager; @@ -61,9 +65,13 @@ public class RestrictAppPreferenceControllerTest { @Mock private AppOpsManager.PackageOps mAllowedPackageOps; @Mock + private AppOpsManager.PackageOps mOtherUserPackageOps; + @Mock private SettingsActivity mSettingsActivity; @Mock private InstrumentedPreferenceFragment mFragment; + @Mock + private UserManager mUserManager; private List mPackageOpsList; private RestrictAppPreferenceController mRestrictAppPreferenceController; private Preference mPreference; @@ -87,15 +95,23 @@ public class RestrictAppPreferenceControllerTest { doReturn(RESTRICTED_UID).when(mRestrictedPackageOps).getUid(); doReturn(RESTRICTED_PACKAGE_NAME).when(mRestrictedPackageOps).getPackageName(); doReturn(restrictedOps).when(mRestrictedPackageOps).getOps(); + doReturn(OTHER_USER_UID).when(mOtherUserPackageOps).getUid(); + doReturn(RESTRICTED_PACKAGE_NAME).when(mOtherUserPackageOps).getPackageName(); + doReturn(restrictedOps).when(mOtherUserPackageOps).getOps(); mContext = spy(RuntimeEnvironment.application); doReturn(mAppOpsManager).when(mContext).getSystemService(Context.APP_OPS_SERVICE); + doReturn(mUserManager).when(mContext).getSystemService(UserManager.class); doReturn(mContext).when(mSettingsActivity).getApplicationContext(); mRestrictAppPreferenceController = new RestrictAppPreferenceController(mSettingsActivity, mFragment); mPackageOpsList = new ArrayList<>(); mPreference = new Preference(mContext); mPreference.setKey(mRestrictAppPreferenceController.getPreferenceKey()); + + final List userHandles = new ArrayList<>(); + userHandles.add(new UserHandle(0)); + doReturn(userHandles).when(mUserManager).getUserProfiles(); } @Test @@ -109,10 +125,11 @@ public class RestrictAppPreferenceControllerTest { } @Test - public void testUpdateState_twoRestrictApps_showCorrectSummary() { + public void testUpdateState_twoRestrictedAppsForPrimaryUser_showCorrectSummary() { mPackageOpsList.add(mRestrictedPackageOps); mPackageOpsList.add(mRestrictedPackageOps); mPackageOpsList.add(mAllowedPackageOps); + mPackageOpsList.add(mOtherUserPackageOps); doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any()); mRestrictAppPreferenceController.updateState(mPreference); @@ -120,6 +137,23 @@ public class RestrictAppPreferenceControllerTest { assertThat(mPreference.getSummary()).isEqualTo("2 apps"); } + @Test + public void testUpdateState_oneRestrictedAppForTwoUsers_showSummaryAndContainCorrectApp() { + // Two packageOps share same package name but different uid. + mPackageOpsList.add(mRestrictedPackageOps); + mPackageOpsList.add(mOtherUserPackageOps); + doReturn(mPackageOpsList).when(mAppOpsManager).getPackagesForOps(any()); + + mRestrictAppPreferenceController.updateState(mPreference); + + assertThat(mPreference.getSummary()).isEqualTo("1 app"); + assertThat(mRestrictAppPreferenceController.mAppInfos).containsExactly( + new AppInfo.Builder() + .setUid(RESTRICTED_UID) + .setPackageName(RESTRICTED_PACKAGE_NAME) + .build()); + } + @Test public void testUpdateState_zeroRestrictApp_disabled() { mPackageOpsList.add(mAllowedPackageOps);