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);