Loading services/core/java/com/android/server/locales/LocaleManagerBackupHelper.java +7 −9 Original line number Original line Diff line number Diff line Loading @@ -30,8 +30,6 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.HandlerThread; import android.os.HandlerThread; import android.os.LocaleList; import android.os.LocaleList; import android.os.RemoteException; import android.os.RemoteException; Loading Loading @@ -78,7 +76,7 @@ class LocaleManagerBackupHelper { private static final Duration STAGE_DATA_RETENTION_PERIOD = Duration.ofDays(3); private static final Duration STAGE_DATA_RETENTION_PERIOD = Duration.ofDays(3); private final LocaleManagerService mLocaleManagerService; private final LocaleManagerService mLocaleManagerService; private final PackageManagerInternal mPackageManagerInternal; private final PackageManager mPackageManager; private final Clock mClock; private final Clock mClock; private final Context mContext; private final Context mContext; private final Object mStagedDataLock = new Object(); private final Object mStagedDataLock = new Object(); Loading @@ -90,18 +88,18 @@ class LocaleManagerBackupHelper { private final BroadcastReceiver mUserMonitor; private final BroadcastReceiver mUserMonitor; LocaleManagerBackupHelper(LocaleManagerService localeManagerService, LocaleManagerBackupHelper(LocaleManagerService localeManagerService, PackageManagerInternal pmInternal, HandlerThread broadcastHandlerThread) { PackageManager packageManager, HandlerThread broadcastHandlerThread) { this(localeManagerService.mContext, localeManagerService, pmInternal, Clock.systemUTC(), this(localeManagerService.mContext, localeManagerService, packageManager, Clock.systemUTC(), new SparseArray<>(), broadcastHandlerThread); new SparseArray<>(), broadcastHandlerThread); } } @VisibleForTesting LocaleManagerBackupHelper(Context context, @VisibleForTesting LocaleManagerBackupHelper(Context context, LocaleManagerService localeManagerService, LocaleManagerService localeManagerService, PackageManagerInternal pmInternal, Clock clock, SparseArray<StagedData> stagedData, PackageManager packageManager, Clock clock, SparseArray<StagedData> stagedData, HandlerThread broadcastHandlerThread) { HandlerThread broadcastHandlerThread) { mContext = context; mContext = context; mLocaleManagerService = localeManagerService; mLocaleManagerService = localeManagerService; mPackageManagerInternal = pmInternal; mPackageManager = packageManager; mClock = clock; mClock = clock; mStagedData = stagedData; mStagedData = stagedData; Loading Loading @@ -130,8 +128,8 @@ class LocaleManagerBackupHelper { } } HashMap<String, String> pkgStates = new HashMap<>(); HashMap<String, String> pkgStates = new HashMap<>(); for (ApplicationInfo appInfo : mPackageManagerInternal.getInstalledApplications(/*flags*/0, for (ApplicationInfo appInfo : mPackageManager.getInstalledApplicationsAsUser( userId, Binder.getCallingUid())) { PackageManager.ApplicationInfoFlags.of(0), userId)) { try { try { LocaleList appLocales = mLocaleManagerService.getApplicationLocales( LocaleList appLocales = mLocaleManagerService.getApplicationLocales( appInfo.packageName, appInfo.packageName, Loading services/core/java/com/android/server/locales/LocaleManagerService.java +12 −8 Original line number Original line Diff line number Diff line Loading @@ -28,7 +28,7 @@ import android.app.ILocaleManager; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManager.PackageInfoFlags; import android.content.res.Configuration; import android.content.res.Configuration; import android.os.Binder; import android.os.Binder; import android.os.HandlerThread; import android.os.HandlerThread; Loading Loading @@ -60,7 +60,7 @@ public class LocaleManagerService extends SystemService { private final LocaleManagerService.LocaleManagerBinderService mBinderService; private final LocaleManagerService.LocaleManagerBinderService mBinderService; private ActivityTaskManagerInternal mActivityTaskManagerInternal; private ActivityTaskManagerInternal mActivityTaskManagerInternal; private ActivityManagerInternal mActivityManagerInternal; private ActivityManagerInternal mActivityManagerInternal; private PackageManagerInternal mPackageManagerInternal; private PackageManager mPackageManager; private LocaleManagerBackupHelper mBackupHelper; private LocaleManagerBackupHelper mBackupHelper; Loading @@ -74,7 +74,7 @@ public class LocaleManagerService extends SystemService { mBinderService = new LocaleManagerBinderService(); mBinderService = new LocaleManagerBinderService(); mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class); mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mPackageManager = mContext.getPackageManager(); HandlerThread broadcastHandlerThread = new HandlerThread(TAG, HandlerThread broadcastHandlerThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND); Process.THREAD_PRIORITY_BACKGROUND); Loading @@ -90,7 +90,7 @@ public class LocaleManagerService extends SystemService { }); }); mBackupHelper = new LocaleManagerBackupHelper(this, mBackupHelper = new LocaleManagerBackupHelper(this, mPackageManagerInternal, broadcastHandlerThread); mPackageManager, broadcastHandlerThread); mPackageMonitor = new LocaleManagerServicePackageMonitor(mBackupHelper, mPackageMonitor = new LocaleManagerServicePackageMonitor(mBackupHelper, systemAppUpdateTracker); systemAppUpdateTracker); Loading @@ -102,7 +102,7 @@ public class LocaleManagerService extends SystemService { @VisibleForTesting @VisibleForTesting LocaleManagerService(Context context, ActivityTaskManagerInternal activityTaskManagerInternal, LocaleManagerService(Context context, ActivityTaskManagerInternal activityTaskManagerInternal, ActivityManagerInternal activityManagerInternal, ActivityManagerInternal activityManagerInternal, PackageManagerInternal packageManagerInternal, PackageManager packageManager, LocaleManagerBackupHelper localeManagerBackupHelper, LocaleManagerBackupHelper localeManagerBackupHelper, PackageMonitor packageMonitor) { PackageMonitor packageMonitor) { super(context); super(context); Loading @@ -110,7 +110,7 @@ public class LocaleManagerService extends SystemService { mBinderService = new LocaleManagerBinderService(); mBinderService = new LocaleManagerBinderService(); mActivityTaskManagerInternal = activityTaskManagerInternal; mActivityTaskManagerInternal = activityTaskManagerInternal; mActivityManagerInternal = activityManagerInternal; mActivityManagerInternal = activityManagerInternal; mPackageManagerInternal = packageManagerInternal; mPackageManager = packageManager; mBackupHelper = localeManagerBackupHelper; mBackupHelper = localeManagerBackupHelper; mPackageMonitor = packageMonitor; mPackageMonitor = packageMonitor; } } Loading Loading @@ -419,8 +419,12 @@ public class LocaleManagerService extends SystemService { } } private int getPackageUid(String appPackageName, int userId) { private int getPackageUid(String appPackageName, int userId) { return mPackageManagerInternal try { .getPackageUid(appPackageName, /* flags */ 0, userId); return mPackageManager .getPackageUidAsUser(appPackageName, PackageInfoFlags.of(0), userId); } catch (PackageManager.NameNotFoundException e) { return Process.INVALID_UID; } } } @Nullable @Nullable Loading services/tests/servicestests/src/com/android/server/locales/LocaleManagerBackupRestoreTest.java +13 −18 Original line number Original line Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static junit.framework.Assert.assertNull; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing; Loading @@ -39,7 +38,6 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Binder; import android.os.HandlerThread; import android.os.HandlerThread; import android.os.LocaleList; import android.os.LocaleList; Loading Loading @@ -102,8 +100,6 @@ public class LocaleManagerBackupRestoreTest { @Mock @Mock private Context mMockContext; private Context mMockContext; @Mock @Mock private PackageManagerInternal mMockPackageManagerInternal; @Mock private PackageManager mMockPackageManager; private PackageManager mMockPackageManager; @Mock @Mock private LocaleManagerService mMockLocaleManagerService; private LocaleManagerService mMockLocaleManagerService; Loading @@ -129,7 +125,6 @@ public class LocaleManagerBackupRestoreTest { @Before @Before public void setUp() throws Exception { public void setUp() throws Exception { mMockContext = mock(Context.class); mMockContext = mock(Context.class); mMockPackageManagerInternal = mock(PackageManagerInternal.class); mMockPackageManager = mock(PackageManager.class); mMockPackageManager = mock(PackageManager.class); mMockLocaleManagerService = mock(LocaleManagerService.class); mMockLocaleManagerService = mock(LocaleManagerService.class); SystemAppUpdateTracker systemAppUpdateTracker = mock(SystemAppUpdateTracker.class); SystemAppUpdateTracker systemAppUpdateTracker = mock(SystemAppUpdateTracker.class); Loading @@ -141,7 +136,7 @@ public class LocaleManagerBackupRestoreTest { broadcastHandlerThread.start(); broadcastHandlerThread.start(); mBackupHelper = spy(new ShadowLocaleManagerBackupHelper(mMockContext, mBackupHelper = spy(new ShadowLocaleManagerBackupHelper(mMockContext, mMockLocaleManagerService, mMockPackageManagerInternal, mClock, STAGE_DATA, mMockLocaleManagerService, mMockPackageManager, mClock, STAGE_DATA, broadcastHandlerThread)); broadcastHandlerThread)); doNothing().when(mBackupHelper).notifyBackupManager(); doNothing().when(mBackupHelper).notifyBackupManager(); Loading @@ -158,8 +153,8 @@ public class LocaleManagerBackupRestoreTest { @Test @Test public void testBackupPayload_noAppsInstalled_returnsNull() throws Exception { public void testBackupPayload_noAppsInstalled_returnsNull() throws Exception { doReturn(List.of()).when(mMockPackageManagerInternal) doReturn(List.of()).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); } } Loading Loading @@ -198,8 +193,8 @@ public class LocaleManagerBackupRestoreTest { ApplicationInfo anotherAppInfo = new ApplicationInfo(); ApplicationInfo anotherAppInfo = new ApplicationInfo(); defaultAppInfo.packageName = DEFAULT_PACKAGE_NAME; defaultAppInfo.packageName = DEFAULT_PACKAGE_NAME; anotherAppInfo.packageName = "com.android.anotherapp"; anotherAppInfo.packageName = "com.android.anotherapp"; doReturn(List.of(defaultAppInfo, anotherAppInfo)).when(mMockPackageManagerInternal) doReturn(List.of(defaultAppInfo, anotherAppInfo)).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); setUpLocalesForPackage(DEFAULT_PACKAGE_NAME, DEFAULT_LOCALES); setUpLocalesForPackage(DEFAULT_PACKAGE_NAME, DEFAULT_LOCALES); // Exception when getting locales for anotherApp. // Exception when getting locales for anotherApp. Loading Loading @@ -447,8 +442,8 @@ public class LocaleManagerBackupRestoreTest { // Retention period has not elapsed. // Retention period has not elapsed. setCurrentTimeMillis( setCurrentTimeMillis( DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.minusHours(1).toMillis()); DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.minusHours(1).toMillis()); doReturn(List.of()).when(mMockPackageManagerInternal) doReturn(List.of()).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); checkStageDataExists(DEFAULT_USER_ID); checkStageDataExists(DEFAULT_USER_ID); Loading @@ -456,8 +451,8 @@ public class LocaleManagerBackupRestoreTest { // Exactly RETENTION_PERIOD amount of time has passed so stage data should still not be // Exactly RETENTION_PERIOD amount of time has passed so stage data should still not be // removed. // removed. setCurrentTimeMillis(DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.toMillis()); setCurrentTimeMillis(DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.toMillis()); doReturn(List.of()).when(mMockPackageManagerInternal) doReturn(List.of()).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); checkStageDataExists(DEFAULT_USER_ID); checkStageDataExists(DEFAULT_USER_ID); Loading @@ -465,8 +460,8 @@ public class LocaleManagerBackupRestoreTest { // Retention period has now expired, stage data should be deleted. // Retention period has now expired, stage data should be deleted. setCurrentTimeMillis( setCurrentTimeMillis( DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.plusSeconds(1).toMillis()); DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.plusSeconds(1).toMillis()); doReturn(List.of()).when(mMockPackageManagerInternal) doReturn(List.of()).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); checkStageDataDoesNotExist(DEFAULT_USER_ID); checkStageDataDoesNotExist(DEFAULT_USER_ID); Loading Loading @@ -577,8 +572,8 @@ public class LocaleManagerBackupRestoreTest { private void setUpDummyAppForPackageManager(String packageName) { private void setUpDummyAppForPackageManager(String packageName) { ApplicationInfo dummyApp = new ApplicationInfo(); ApplicationInfo dummyApp = new ApplicationInfo(); dummyApp.packageName = packageName; dummyApp.packageName = packageName; doReturn(List.of(dummyApp)).when(mMockPackageManagerInternal) doReturn(List.of(dummyApp)).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); } } /** /** Loading services/tests/servicestests/src/com/android/server/locales/LocaleManagerServiceTest.java +24 −27 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,6 @@ import static junit.framework.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing; Loading @@ -40,7 +39,6 @@ import android.content.Context; import android.content.pm.InstallSourceInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Binder; import android.os.LocaleList; import android.os.LocaleList; Loading Loading @@ -80,7 +78,7 @@ public class LocaleManagerServiceTest { @Mock @Mock private Context mMockContext; private Context mMockContext; @Mock @Mock private PackageManagerInternal mMockPackageManagerInternal; private PackageManager mMockPackageManager; @Mock @Mock private FakePackageConfigurationUpdater mFakePackageConfigurationUpdater; private FakePackageConfigurationUpdater mFakePackageConfigurationUpdater; @Mock @Mock Loading @@ -95,14 +93,13 @@ public class LocaleManagerServiceTest { mMockContext = mock(Context.class); mMockContext = mock(Context.class); mMockActivityTaskManager = mock(ActivityTaskManagerInternal.class); mMockActivityTaskManager = mock(ActivityTaskManagerInternal.class); mMockActivityManager = mock(ActivityManagerInternal.class); mMockActivityManager = mock(ActivityManagerInternal.class); mMockPackageManagerInternal = mock(PackageManagerInternal.class); mMockPackageManager = mock(PackageManager.class); mMockPackageMonitor = mock(PackageMonitor.class); mMockPackageMonitor = mock(PackageMonitor.class); // For unit tests, set the default installer info // For unit tests, set the default installer info PackageManager mockPackageManager = mock(PackageManager.class); doReturn(DEFAULT_INSTALL_SOURCE_INFO).when(mMockPackageManager) doReturn(DEFAULT_INSTALL_SOURCE_INFO).when(mockPackageManager) .getInstallSourceInfo(anyString()); .getInstallSourceInfo(anyString()); doReturn(mockPackageManager).when(mMockContext).getPackageManager(); doReturn(mMockPackageManager).when(mMockContext).getPackageManager(); mFakePackageConfigurationUpdater = new FakePackageConfigurationUpdater(); mFakePackageConfigurationUpdater = new FakePackageConfigurationUpdater(); doReturn(mFakePackageConfigurationUpdater) doReturn(mFakePackageConfigurationUpdater) Loading @@ -117,14 +114,14 @@ public class LocaleManagerServiceTest { mMockBackupHelper = mock(ShadowLocaleManagerBackupHelper.class); mMockBackupHelper = mock(ShadowLocaleManagerBackupHelper.class); mLocaleManagerService = new LocaleManagerService(mMockContext, mMockActivityTaskManager, mLocaleManagerService = new LocaleManagerService(mMockContext, mMockActivityTaskManager, mMockActivityManager, mMockPackageManagerInternal, mMockActivityManager, mMockPackageManager, mMockBackupHelper, mMockPackageMonitor); mMockBackupHelper, mMockPackageMonitor); } } @Test(expected = SecurityException.class) @Test(expected = SecurityException.class) public void testSetApplicationLocales_arbitraryAppWithoutPermissions_fails() throws Exception { public void testSetApplicationLocales_arbitraryAppWithoutPermissions_fails() throws Exception { doReturn(DEFAULT_UID) doReturn(DEFAULT_UID) .when(mMockPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt()); .when(mMockPackageManager).getPackageUidAsUser(anyString(), any(), anyInt()); setUpFailingPermissionCheckFor(Manifest.permission.CHANGE_CONFIGURATION); setUpFailingPermissionCheckFor(Manifest.permission.CHANGE_CONFIGURATION); try { try { Loading Loading @@ -170,7 +167,7 @@ public class LocaleManagerServiceTest { @Test @Test public void testSetApplicationLocales_arbitraryAppWithPermission_succeeds() throws Exception { public void testSetApplicationLocales_arbitraryAppWithPermission_succeeds() throws Exception { doReturn(DEFAULT_UID) doReturn(DEFAULT_UID) .when(mMockPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt()); .when(mMockPackageManager).getPackageUidAsUser(anyString(), any(), anyInt()); // if package is not owned by the caller, the calling app should have the following // if package is not owned by the caller, the calling app should have the following // permission. We will mock this to succeed to imitate that. // permission. We will mock this to succeed to imitate that. setUpPassingPermissionCheckFor(Manifest.permission.CHANGE_CONFIGURATION); setUpPassingPermissionCheckFor(Manifest.permission.CHANGE_CONFIGURATION); Loading @@ -186,7 +183,7 @@ public class LocaleManagerServiceTest { @Test @Test public void testSetApplicationLocales_callerOwnsPackage_succeeds() throws Exception { public void testSetApplicationLocales_callerOwnsPackage_succeeds() throws Exception { doReturn(Binder.getCallingUid()) doReturn(Binder.getCallingUid()) .when(mMockPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt()); .when(mMockPackageManager).getPackageUidAsUser(anyString(), any(), anyInt()); mLocaleManagerService.setApplicationLocales(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID, mLocaleManagerService.setApplicationLocales(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID, DEFAULT_LOCALES); DEFAULT_LOCALES); Loading @@ -197,8 +194,8 @@ public class LocaleManagerServiceTest { @Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class) public void testSetApplicationLocales_invalidPackageOrUserId_fails() throws Exception { public void testSetApplicationLocales_invalidPackageOrUserId_fails() throws Exception { doReturn(INVALID_UID) doThrow(new PackageManager.NameNotFoundException("Mock")) .when(mMockPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt()); .when(mMockPackageManager).getPackageUidAsUser(anyString(), any(), anyInt()); try { try { mLocaleManagerService.setApplicationLocales(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID, mLocaleManagerService.setApplicationLocales(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID, LocaleList.getEmptyLocaleList()); LocaleList.getEmptyLocaleList()); Loading @@ -211,8 +208,8 @@ public class LocaleManagerServiceTest { @Test(expected = SecurityException.class) @Test(expected = SecurityException.class) public void testGetApplicationLocales_arbitraryAppWithoutPermission_fails() throws Exception { public void testGetApplicationLocales_arbitraryAppWithoutPermission_fails() throws Exception { doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); setUpFailingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); setUpFailingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); try { try { Loading @@ -229,8 +226,8 @@ public class LocaleManagerServiceTest { public void testGetApplicationLocales_appSpecificConfigAbsent_returnsEmptyList() public void testGetApplicationLocales_appSpecificConfigAbsent_returnsEmptyList() throws Exception { throws Exception { // any valid app calling for its own package or having appropriate permission // any valid app calling for its own package or having appropriate permission doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); doReturn(null) doReturn(null) .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); Loading @@ -244,8 +241,8 @@ public class LocaleManagerServiceTest { @Test @Test public void testGetApplicationLocales_appSpecificLocalesAbsent_returnsEmptyList() public void testGetApplicationLocales_appSpecificLocalesAbsent_returnsEmptyList() throws Exception { throws Exception { doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); doReturn(new PackageConfig(/* nightMode = */ 0, /* locales = */ null)) doReturn(new PackageConfig(/* nightMode = */ 0, /* locales = */ null)) .when(mMockActivityTaskManager).getApplicationConfig(any(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(any(), anyInt()); Loading @@ -259,8 +256,8 @@ public class LocaleManagerServiceTest { @Test @Test public void testGetApplicationLocales_callerOwnsAppAndConfigPresent_returnsLocales() public void testGetApplicationLocales_callerOwnsAppAndConfigPresent_returnsLocales() throws Exception { throws Exception { doReturn(Binder.getCallingUid()).when(mMockPackageManagerInternal) doReturn(Binder.getCallingUid()).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); Loading @@ -273,8 +270,8 @@ public class LocaleManagerServiceTest { @Test @Test public void testGetApplicationLocales_arbitraryCallerWithPermissions_returnsLocales() public void testGetApplicationLocales_arbitraryCallerWithPermissions_returnsLocales() throws Exception { throws Exception { doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); Loading @@ -288,10 +285,10 @@ public class LocaleManagerServiceTest { @Test @Test public void testGetApplicationLocales_callerIsInstaller_returnsLocales() public void testGetApplicationLocales_callerIsInstaller_returnsLocales() throws Exception { throws Exception { doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(eq(DEFAULT_PACKAGE_NAME), anyLong(), anyInt()); .getPackageUidAsUser(eq(DEFAULT_PACKAGE_NAME), any(), anyInt()); doReturn(Binder.getCallingUid()).when(mMockPackageManagerInternal) doReturn(Binder.getCallingUid()).when(mMockPackageManager) .getPackageUid(eq(DEFAULT_INSTALLER_PACKAGE_NAME), anyLong(), anyInt()); .getPackageUidAsUser(eq(DEFAULT_INSTALLER_PACKAGE_NAME), any(), anyInt()); doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); Loading services/tests/servicestests/src/com/android/server/locales/ShadowLocaleManagerBackupHelper.java +4 −3 Original line number Original line Diff line number Diff line Loading @@ -17,7 +17,7 @@ package com.android.server.locales; package com.android.server.locales; import android.content.Context; import android.content.Context; import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManager; import android.os.HandlerThread; import android.os.HandlerThread; import android.util.SparseArray; import android.util.SparseArray; Loading @@ -31,9 +31,10 @@ import java.time.Clock; public class ShadowLocaleManagerBackupHelper extends LocaleManagerBackupHelper { public class ShadowLocaleManagerBackupHelper extends LocaleManagerBackupHelper { ShadowLocaleManagerBackupHelper(Context context, ShadowLocaleManagerBackupHelper(Context context, LocaleManagerService localeManagerService, LocaleManagerService localeManagerService, PackageManagerInternal pmInternal, Clock clock, PackageManager packageManager, Clock clock, SparseArray<LocaleManagerBackupHelper.StagedData> stagedData, SparseArray<LocaleManagerBackupHelper.StagedData> stagedData, HandlerThread broadcastHandlerThread) { HandlerThread broadcastHandlerThread) { super(context, localeManagerService, pmInternal, clock, stagedData, broadcastHandlerThread); super(context, localeManagerService, packageManager, clock, stagedData, broadcastHandlerThread); } } } } Loading
services/core/java/com/android/server/locales/LocaleManagerBackupHelper.java +7 −9 Original line number Original line Diff line number Diff line Loading @@ -30,8 +30,6 @@ import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.HandlerThread; import android.os.HandlerThread; import android.os.LocaleList; import android.os.LocaleList; import android.os.RemoteException; import android.os.RemoteException; Loading Loading @@ -78,7 +76,7 @@ class LocaleManagerBackupHelper { private static final Duration STAGE_DATA_RETENTION_PERIOD = Duration.ofDays(3); private static final Duration STAGE_DATA_RETENTION_PERIOD = Duration.ofDays(3); private final LocaleManagerService mLocaleManagerService; private final LocaleManagerService mLocaleManagerService; private final PackageManagerInternal mPackageManagerInternal; private final PackageManager mPackageManager; private final Clock mClock; private final Clock mClock; private final Context mContext; private final Context mContext; private final Object mStagedDataLock = new Object(); private final Object mStagedDataLock = new Object(); Loading @@ -90,18 +88,18 @@ class LocaleManagerBackupHelper { private final BroadcastReceiver mUserMonitor; private final BroadcastReceiver mUserMonitor; LocaleManagerBackupHelper(LocaleManagerService localeManagerService, LocaleManagerBackupHelper(LocaleManagerService localeManagerService, PackageManagerInternal pmInternal, HandlerThread broadcastHandlerThread) { PackageManager packageManager, HandlerThread broadcastHandlerThread) { this(localeManagerService.mContext, localeManagerService, pmInternal, Clock.systemUTC(), this(localeManagerService.mContext, localeManagerService, packageManager, Clock.systemUTC(), new SparseArray<>(), broadcastHandlerThread); new SparseArray<>(), broadcastHandlerThread); } } @VisibleForTesting LocaleManagerBackupHelper(Context context, @VisibleForTesting LocaleManagerBackupHelper(Context context, LocaleManagerService localeManagerService, LocaleManagerService localeManagerService, PackageManagerInternal pmInternal, Clock clock, SparseArray<StagedData> stagedData, PackageManager packageManager, Clock clock, SparseArray<StagedData> stagedData, HandlerThread broadcastHandlerThread) { HandlerThread broadcastHandlerThread) { mContext = context; mContext = context; mLocaleManagerService = localeManagerService; mLocaleManagerService = localeManagerService; mPackageManagerInternal = pmInternal; mPackageManager = packageManager; mClock = clock; mClock = clock; mStagedData = stagedData; mStagedData = stagedData; Loading Loading @@ -130,8 +128,8 @@ class LocaleManagerBackupHelper { } } HashMap<String, String> pkgStates = new HashMap<>(); HashMap<String, String> pkgStates = new HashMap<>(); for (ApplicationInfo appInfo : mPackageManagerInternal.getInstalledApplications(/*flags*/0, for (ApplicationInfo appInfo : mPackageManager.getInstalledApplicationsAsUser( userId, Binder.getCallingUid())) { PackageManager.ApplicationInfoFlags.of(0), userId)) { try { try { LocaleList appLocales = mLocaleManagerService.getApplicationLocales( LocaleList appLocales = mLocaleManagerService.getApplicationLocales( appInfo.packageName, appInfo.packageName, Loading
services/core/java/com/android/server/locales/LocaleManagerService.java +12 −8 Original line number Original line Diff line number Diff line Loading @@ -28,7 +28,7 @@ import android.app.ILocaleManager; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManager.PackageInfoFlags; import android.content.res.Configuration; import android.content.res.Configuration; import android.os.Binder; import android.os.Binder; import android.os.HandlerThread; import android.os.HandlerThread; Loading Loading @@ -60,7 +60,7 @@ public class LocaleManagerService extends SystemService { private final LocaleManagerService.LocaleManagerBinderService mBinderService; private final LocaleManagerService.LocaleManagerBinderService mBinderService; private ActivityTaskManagerInternal mActivityTaskManagerInternal; private ActivityTaskManagerInternal mActivityTaskManagerInternal; private ActivityManagerInternal mActivityManagerInternal; private ActivityManagerInternal mActivityManagerInternal; private PackageManagerInternal mPackageManagerInternal; private PackageManager mPackageManager; private LocaleManagerBackupHelper mBackupHelper; private LocaleManagerBackupHelper mBackupHelper; Loading @@ -74,7 +74,7 @@ public class LocaleManagerService extends SystemService { mBinderService = new LocaleManagerBinderService(); mBinderService = new LocaleManagerBinderService(); mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class); mActivityTaskManagerInternal = LocalServices.getService(ActivityTaskManagerInternal.class); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mPackageManager = mContext.getPackageManager(); HandlerThread broadcastHandlerThread = new HandlerThread(TAG, HandlerThread broadcastHandlerThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND); Process.THREAD_PRIORITY_BACKGROUND); Loading @@ -90,7 +90,7 @@ public class LocaleManagerService extends SystemService { }); }); mBackupHelper = new LocaleManagerBackupHelper(this, mBackupHelper = new LocaleManagerBackupHelper(this, mPackageManagerInternal, broadcastHandlerThread); mPackageManager, broadcastHandlerThread); mPackageMonitor = new LocaleManagerServicePackageMonitor(mBackupHelper, mPackageMonitor = new LocaleManagerServicePackageMonitor(mBackupHelper, systemAppUpdateTracker); systemAppUpdateTracker); Loading @@ -102,7 +102,7 @@ public class LocaleManagerService extends SystemService { @VisibleForTesting @VisibleForTesting LocaleManagerService(Context context, ActivityTaskManagerInternal activityTaskManagerInternal, LocaleManagerService(Context context, ActivityTaskManagerInternal activityTaskManagerInternal, ActivityManagerInternal activityManagerInternal, ActivityManagerInternal activityManagerInternal, PackageManagerInternal packageManagerInternal, PackageManager packageManager, LocaleManagerBackupHelper localeManagerBackupHelper, LocaleManagerBackupHelper localeManagerBackupHelper, PackageMonitor packageMonitor) { PackageMonitor packageMonitor) { super(context); super(context); Loading @@ -110,7 +110,7 @@ public class LocaleManagerService extends SystemService { mBinderService = new LocaleManagerBinderService(); mBinderService = new LocaleManagerBinderService(); mActivityTaskManagerInternal = activityTaskManagerInternal; mActivityTaskManagerInternal = activityTaskManagerInternal; mActivityManagerInternal = activityManagerInternal; mActivityManagerInternal = activityManagerInternal; mPackageManagerInternal = packageManagerInternal; mPackageManager = packageManager; mBackupHelper = localeManagerBackupHelper; mBackupHelper = localeManagerBackupHelper; mPackageMonitor = packageMonitor; mPackageMonitor = packageMonitor; } } Loading Loading @@ -419,8 +419,12 @@ public class LocaleManagerService extends SystemService { } } private int getPackageUid(String appPackageName, int userId) { private int getPackageUid(String appPackageName, int userId) { return mPackageManagerInternal try { .getPackageUid(appPackageName, /* flags */ 0, userId); return mPackageManager .getPackageUidAsUser(appPackageName, PackageInfoFlags.of(0), userId); } catch (PackageManager.NameNotFoundException e) { return Process.INVALID_UID; } } } @Nullable @Nullable Loading
services/tests/servicestests/src/com/android/server/locales/LocaleManagerBackupRestoreTest.java +13 −18 Original line number Original line Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static junit.framework.Assert.assertNull; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing; Loading @@ -39,7 +38,6 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Binder; import android.os.HandlerThread; import android.os.HandlerThread; import android.os.LocaleList; import android.os.LocaleList; Loading Loading @@ -102,8 +100,6 @@ public class LocaleManagerBackupRestoreTest { @Mock @Mock private Context mMockContext; private Context mMockContext; @Mock @Mock private PackageManagerInternal mMockPackageManagerInternal; @Mock private PackageManager mMockPackageManager; private PackageManager mMockPackageManager; @Mock @Mock private LocaleManagerService mMockLocaleManagerService; private LocaleManagerService mMockLocaleManagerService; Loading @@ -129,7 +125,6 @@ public class LocaleManagerBackupRestoreTest { @Before @Before public void setUp() throws Exception { public void setUp() throws Exception { mMockContext = mock(Context.class); mMockContext = mock(Context.class); mMockPackageManagerInternal = mock(PackageManagerInternal.class); mMockPackageManager = mock(PackageManager.class); mMockPackageManager = mock(PackageManager.class); mMockLocaleManagerService = mock(LocaleManagerService.class); mMockLocaleManagerService = mock(LocaleManagerService.class); SystemAppUpdateTracker systemAppUpdateTracker = mock(SystemAppUpdateTracker.class); SystemAppUpdateTracker systemAppUpdateTracker = mock(SystemAppUpdateTracker.class); Loading @@ -141,7 +136,7 @@ public class LocaleManagerBackupRestoreTest { broadcastHandlerThread.start(); broadcastHandlerThread.start(); mBackupHelper = spy(new ShadowLocaleManagerBackupHelper(mMockContext, mBackupHelper = spy(new ShadowLocaleManagerBackupHelper(mMockContext, mMockLocaleManagerService, mMockPackageManagerInternal, mClock, STAGE_DATA, mMockLocaleManagerService, mMockPackageManager, mClock, STAGE_DATA, broadcastHandlerThread)); broadcastHandlerThread)); doNothing().when(mBackupHelper).notifyBackupManager(); doNothing().when(mBackupHelper).notifyBackupManager(); Loading @@ -158,8 +153,8 @@ public class LocaleManagerBackupRestoreTest { @Test @Test public void testBackupPayload_noAppsInstalled_returnsNull() throws Exception { public void testBackupPayload_noAppsInstalled_returnsNull() throws Exception { doReturn(List.of()).when(mMockPackageManagerInternal) doReturn(List.of()).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); } } Loading Loading @@ -198,8 +193,8 @@ public class LocaleManagerBackupRestoreTest { ApplicationInfo anotherAppInfo = new ApplicationInfo(); ApplicationInfo anotherAppInfo = new ApplicationInfo(); defaultAppInfo.packageName = DEFAULT_PACKAGE_NAME; defaultAppInfo.packageName = DEFAULT_PACKAGE_NAME; anotherAppInfo.packageName = "com.android.anotherapp"; anotherAppInfo.packageName = "com.android.anotherapp"; doReturn(List.of(defaultAppInfo, anotherAppInfo)).when(mMockPackageManagerInternal) doReturn(List.of(defaultAppInfo, anotherAppInfo)).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); setUpLocalesForPackage(DEFAULT_PACKAGE_NAME, DEFAULT_LOCALES); setUpLocalesForPackage(DEFAULT_PACKAGE_NAME, DEFAULT_LOCALES); // Exception when getting locales for anotherApp. // Exception when getting locales for anotherApp. Loading Loading @@ -447,8 +442,8 @@ public class LocaleManagerBackupRestoreTest { // Retention period has not elapsed. // Retention period has not elapsed. setCurrentTimeMillis( setCurrentTimeMillis( DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.minusHours(1).toMillis()); DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.minusHours(1).toMillis()); doReturn(List.of()).when(mMockPackageManagerInternal) doReturn(List.of()).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); checkStageDataExists(DEFAULT_USER_ID); checkStageDataExists(DEFAULT_USER_ID); Loading @@ -456,8 +451,8 @@ public class LocaleManagerBackupRestoreTest { // Exactly RETENTION_PERIOD amount of time has passed so stage data should still not be // Exactly RETENTION_PERIOD amount of time has passed so stage data should still not be // removed. // removed. setCurrentTimeMillis(DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.toMillis()); setCurrentTimeMillis(DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.toMillis()); doReturn(List.of()).when(mMockPackageManagerInternal) doReturn(List.of()).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); checkStageDataExists(DEFAULT_USER_ID); checkStageDataExists(DEFAULT_USER_ID); Loading @@ -465,8 +460,8 @@ public class LocaleManagerBackupRestoreTest { // Retention period has now expired, stage data should be deleted. // Retention period has now expired, stage data should be deleted. setCurrentTimeMillis( setCurrentTimeMillis( DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.plusSeconds(1).toMillis()); DEFAULT_CREATION_TIME_MILLIS + RETENTION_PERIOD.plusSeconds(1).toMillis()); doReturn(List.of()).when(mMockPackageManagerInternal) doReturn(List.of()).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); assertNull(mBackupHelper.getBackupPayload(DEFAULT_USER_ID)); checkStageDataDoesNotExist(DEFAULT_USER_ID); checkStageDataDoesNotExist(DEFAULT_USER_ID); Loading Loading @@ -577,8 +572,8 @@ public class LocaleManagerBackupRestoreTest { private void setUpDummyAppForPackageManager(String packageName) { private void setUpDummyAppForPackageManager(String packageName) { ApplicationInfo dummyApp = new ApplicationInfo(); ApplicationInfo dummyApp = new ApplicationInfo(); dummyApp.packageName = packageName; dummyApp.packageName = packageName; doReturn(List.of(dummyApp)).when(mMockPackageManagerInternal) doReturn(List.of(dummyApp)).when(mMockPackageManager) .getInstalledApplications(anyLong(), anyInt(), anyInt()); .getInstalledApplicationsAsUser(any(), anyInt()); } } /** /** Loading
services/tests/servicestests/src/com/android/server/locales/LocaleManagerServiceTest.java +24 −27 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,6 @@ import static junit.framework.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doNothing; Loading @@ -40,7 +39,6 @@ import android.content.Context; import android.content.pm.InstallSourceInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Binder; import android.os.LocaleList; import android.os.LocaleList; Loading Loading @@ -80,7 +78,7 @@ public class LocaleManagerServiceTest { @Mock @Mock private Context mMockContext; private Context mMockContext; @Mock @Mock private PackageManagerInternal mMockPackageManagerInternal; private PackageManager mMockPackageManager; @Mock @Mock private FakePackageConfigurationUpdater mFakePackageConfigurationUpdater; private FakePackageConfigurationUpdater mFakePackageConfigurationUpdater; @Mock @Mock Loading @@ -95,14 +93,13 @@ public class LocaleManagerServiceTest { mMockContext = mock(Context.class); mMockContext = mock(Context.class); mMockActivityTaskManager = mock(ActivityTaskManagerInternal.class); mMockActivityTaskManager = mock(ActivityTaskManagerInternal.class); mMockActivityManager = mock(ActivityManagerInternal.class); mMockActivityManager = mock(ActivityManagerInternal.class); mMockPackageManagerInternal = mock(PackageManagerInternal.class); mMockPackageManager = mock(PackageManager.class); mMockPackageMonitor = mock(PackageMonitor.class); mMockPackageMonitor = mock(PackageMonitor.class); // For unit tests, set the default installer info // For unit tests, set the default installer info PackageManager mockPackageManager = mock(PackageManager.class); doReturn(DEFAULT_INSTALL_SOURCE_INFO).when(mMockPackageManager) doReturn(DEFAULT_INSTALL_SOURCE_INFO).when(mockPackageManager) .getInstallSourceInfo(anyString()); .getInstallSourceInfo(anyString()); doReturn(mockPackageManager).when(mMockContext).getPackageManager(); doReturn(mMockPackageManager).when(mMockContext).getPackageManager(); mFakePackageConfigurationUpdater = new FakePackageConfigurationUpdater(); mFakePackageConfigurationUpdater = new FakePackageConfigurationUpdater(); doReturn(mFakePackageConfigurationUpdater) doReturn(mFakePackageConfigurationUpdater) Loading @@ -117,14 +114,14 @@ public class LocaleManagerServiceTest { mMockBackupHelper = mock(ShadowLocaleManagerBackupHelper.class); mMockBackupHelper = mock(ShadowLocaleManagerBackupHelper.class); mLocaleManagerService = new LocaleManagerService(mMockContext, mMockActivityTaskManager, mLocaleManagerService = new LocaleManagerService(mMockContext, mMockActivityTaskManager, mMockActivityManager, mMockPackageManagerInternal, mMockActivityManager, mMockPackageManager, mMockBackupHelper, mMockPackageMonitor); mMockBackupHelper, mMockPackageMonitor); } } @Test(expected = SecurityException.class) @Test(expected = SecurityException.class) public void testSetApplicationLocales_arbitraryAppWithoutPermissions_fails() throws Exception { public void testSetApplicationLocales_arbitraryAppWithoutPermissions_fails() throws Exception { doReturn(DEFAULT_UID) doReturn(DEFAULT_UID) .when(mMockPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt()); .when(mMockPackageManager).getPackageUidAsUser(anyString(), any(), anyInt()); setUpFailingPermissionCheckFor(Manifest.permission.CHANGE_CONFIGURATION); setUpFailingPermissionCheckFor(Manifest.permission.CHANGE_CONFIGURATION); try { try { Loading Loading @@ -170,7 +167,7 @@ public class LocaleManagerServiceTest { @Test @Test public void testSetApplicationLocales_arbitraryAppWithPermission_succeeds() throws Exception { public void testSetApplicationLocales_arbitraryAppWithPermission_succeeds() throws Exception { doReturn(DEFAULT_UID) doReturn(DEFAULT_UID) .when(mMockPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt()); .when(mMockPackageManager).getPackageUidAsUser(anyString(), any(), anyInt()); // if package is not owned by the caller, the calling app should have the following // if package is not owned by the caller, the calling app should have the following // permission. We will mock this to succeed to imitate that. // permission. We will mock this to succeed to imitate that. setUpPassingPermissionCheckFor(Manifest.permission.CHANGE_CONFIGURATION); setUpPassingPermissionCheckFor(Manifest.permission.CHANGE_CONFIGURATION); Loading @@ -186,7 +183,7 @@ public class LocaleManagerServiceTest { @Test @Test public void testSetApplicationLocales_callerOwnsPackage_succeeds() throws Exception { public void testSetApplicationLocales_callerOwnsPackage_succeeds() throws Exception { doReturn(Binder.getCallingUid()) doReturn(Binder.getCallingUid()) .when(mMockPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt()); .when(mMockPackageManager).getPackageUidAsUser(anyString(), any(), anyInt()); mLocaleManagerService.setApplicationLocales(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID, mLocaleManagerService.setApplicationLocales(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID, DEFAULT_LOCALES); DEFAULT_LOCALES); Loading @@ -197,8 +194,8 @@ public class LocaleManagerServiceTest { @Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class) public void testSetApplicationLocales_invalidPackageOrUserId_fails() throws Exception { public void testSetApplicationLocales_invalidPackageOrUserId_fails() throws Exception { doReturn(INVALID_UID) doThrow(new PackageManager.NameNotFoundException("Mock")) .when(mMockPackageManagerInternal).getPackageUid(anyString(), anyLong(), anyInt()); .when(mMockPackageManager).getPackageUidAsUser(anyString(), any(), anyInt()); try { try { mLocaleManagerService.setApplicationLocales(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID, mLocaleManagerService.setApplicationLocales(DEFAULT_PACKAGE_NAME, DEFAULT_USER_ID, LocaleList.getEmptyLocaleList()); LocaleList.getEmptyLocaleList()); Loading @@ -211,8 +208,8 @@ public class LocaleManagerServiceTest { @Test(expected = SecurityException.class) @Test(expected = SecurityException.class) public void testGetApplicationLocales_arbitraryAppWithoutPermission_fails() throws Exception { public void testGetApplicationLocales_arbitraryAppWithoutPermission_fails() throws Exception { doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); setUpFailingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); setUpFailingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); try { try { Loading @@ -229,8 +226,8 @@ public class LocaleManagerServiceTest { public void testGetApplicationLocales_appSpecificConfigAbsent_returnsEmptyList() public void testGetApplicationLocales_appSpecificConfigAbsent_returnsEmptyList() throws Exception { throws Exception { // any valid app calling for its own package or having appropriate permission // any valid app calling for its own package or having appropriate permission doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); doReturn(null) doReturn(null) .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); Loading @@ -244,8 +241,8 @@ public class LocaleManagerServiceTest { @Test @Test public void testGetApplicationLocales_appSpecificLocalesAbsent_returnsEmptyList() public void testGetApplicationLocales_appSpecificLocalesAbsent_returnsEmptyList() throws Exception { throws Exception { doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); doReturn(new PackageConfig(/* nightMode = */ 0, /* locales = */ null)) doReturn(new PackageConfig(/* nightMode = */ 0, /* locales = */ null)) .when(mMockActivityTaskManager).getApplicationConfig(any(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(any(), anyInt()); Loading @@ -259,8 +256,8 @@ public class LocaleManagerServiceTest { @Test @Test public void testGetApplicationLocales_callerOwnsAppAndConfigPresent_returnsLocales() public void testGetApplicationLocales_callerOwnsAppAndConfigPresent_returnsLocales() throws Exception { throws Exception { doReturn(Binder.getCallingUid()).when(mMockPackageManagerInternal) doReturn(Binder.getCallingUid()).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); Loading @@ -273,8 +270,8 @@ public class LocaleManagerServiceTest { @Test @Test public void testGetApplicationLocales_arbitraryCallerWithPermissions_returnsLocales() public void testGetApplicationLocales_arbitraryCallerWithPermissions_returnsLocales() throws Exception { throws Exception { doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(anyString(), anyLong(), anyInt()); .getPackageUidAsUser(anyString(), any(), anyInt()); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); setUpPassingPermissionCheckFor(Manifest.permission.READ_APP_SPECIFIC_LOCALES); doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); Loading @@ -288,10 +285,10 @@ public class LocaleManagerServiceTest { @Test @Test public void testGetApplicationLocales_callerIsInstaller_returnsLocales() public void testGetApplicationLocales_callerIsInstaller_returnsLocales() throws Exception { throws Exception { doReturn(DEFAULT_UID).when(mMockPackageManagerInternal) doReturn(DEFAULT_UID).when(mMockPackageManager) .getPackageUid(eq(DEFAULT_PACKAGE_NAME), anyLong(), anyInt()); .getPackageUidAsUser(eq(DEFAULT_PACKAGE_NAME), any(), anyInt()); doReturn(Binder.getCallingUid()).when(mMockPackageManagerInternal) doReturn(Binder.getCallingUid()).when(mMockPackageManager) .getPackageUid(eq(DEFAULT_INSTALLER_PACKAGE_NAME), anyLong(), anyInt()); .getPackageUidAsUser(eq(DEFAULT_INSTALLER_PACKAGE_NAME), any(), anyInt()); doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) doReturn(new PackageConfig(/* nightMode = */ 0, DEFAULT_LOCALES)) .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); .when(mMockActivityTaskManager).getApplicationConfig(anyString(), anyInt()); Loading
services/tests/servicestests/src/com/android/server/locales/ShadowLocaleManagerBackupHelper.java +4 −3 Original line number Original line Diff line number Diff line Loading @@ -17,7 +17,7 @@ package com.android.server.locales; package com.android.server.locales; import android.content.Context; import android.content.Context; import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManager; import android.os.HandlerThread; import android.os.HandlerThread; import android.util.SparseArray; import android.util.SparseArray; Loading @@ -31,9 +31,10 @@ import java.time.Clock; public class ShadowLocaleManagerBackupHelper extends LocaleManagerBackupHelper { public class ShadowLocaleManagerBackupHelper extends LocaleManagerBackupHelper { ShadowLocaleManagerBackupHelper(Context context, ShadowLocaleManagerBackupHelper(Context context, LocaleManagerService localeManagerService, LocaleManagerService localeManagerService, PackageManagerInternal pmInternal, Clock clock, PackageManager packageManager, Clock clock, SparseArray<LocaleManagerBackupHelper.StagedData> stagedData, SparseArray<LocaleManagerBackupHelper.StagedData> stagedData, HandlerThread broadcastHandlerThread) { HandlerThread broadcastHandlerThread) { super(context, localeManagerService, pmInternal, clock, stagedData, broadcastHandlerThread); super(context, localeManagerService, packageManager, clock, stagedData, broadcastHandlerThread); } } } }