diff options
5 files changed, 93 insertions, 21 deletions
diff --git a/packages/BackupRestoreConfirmation/res/values-fa/strings.xml b/packages/BackupRestoreConfirmation/res/values-fa/strings.xml index d8155a6bcdee..a8c9d9e1ab09 100644 --- a/packages/BackupRestoreConfirmation/res/values-fa/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-fa/strings.xml @@ -18,7 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="backup_confirm_title" msgid="827563724209303345">"پشتیبانگیری کامل"</string> <string name="restore_confirm_title" msgid="5469365809567486602">"بازیابی کامل"</string> - <string name="backup_confirm_text" msgid="1878021282758896593">"درخواست پشتیبان گیری کامل از تمام دادهها به یک رایانه دسکتاپ متصل داده شده است. آیا میخواهید این عمل انجام شود؟\n\nاگر شما درخواست تهیهٔ نسخهٔ پشتیبان را ندادهاید، اجازه ادامه عملیات را ندهید."</string> + <string name="backup_confirm_text" msgid="1878021282758896593">"درخواست پشتیبان گیری کامل از تمام دادهها به یک رایانه دسکتاپ متصل داده شده است. آیا میخواهید این کار انجام شود؟\n\nاگر شما درخواست تهیهٔ نسخهٔ پشتیبان را ندادهاید، اجازه ادامه عملیات را ندهید."</string> <string name="allow_backup_button_label" msgid="4217228747769644068">"پشتیبانگیری از دادههای من"</string> <string name="deny_backup_button_label" msgid="6009119115581097708">"نسخهٔ پشتیبان تهیه نشود"</string> <string name="restore_confirm_text" msgid="7499866728030461776">"بازیابی کامل تمام دادهها از یک رایانه دسک تاپ متصل درخواست شده است. آیا میخواهید این اجازه را بدهید؟\n\nاگر خود شما درخواست بازیابی ندادهاید، اجازه ادامه این عملیات را ندهید. با این کار همه دادههایی که اکنون روی دستگاه است جایگزین میشود!"</string> @@ -31,9 +31,9 @@ <string name="backup_enc_password_optional" msgid="1350137345907579306">"اگر میخواهید تمام نسخه پشتیبانی داده را رمزدار کنید، یک گذرواژه در زیر وارد کنید:"</string> <string name="backup_enc_password_required" msgid="7889652203371654149">"چون دستگاهتان رمزگذاری شده است، باید نسخه پشتیبان خودتان را رمزگذاری کنید. لطفاً گذرواژهای را در زیر وارد کنید:"</string> <string name="restore_enc_password_text" msgid="6140898525580710823">"اگر داده بازیابی شده رمزگذاری شده است، لطفاً گذرواژه را در زیر وارد کنید:"</string> - <string name="toast_backup_started" msgid="550354281452756121">"شروع پشتیبانگیری..."</string> - <string name="toast_backup_ended" msgid="3818080769548726424">"پشتیبانگیری پایان یافت"</string> - <string name="toast_restore_started" msgid="7881679218971277385">"شروع بازیابی..."</string> + <string name="toast_backup_started" msgid="550354281452756121">"شروع پشتیبانگیری…"</string> + <string name="toast_backup_ended" msgid="3818080769548726424">"پشتیبانگیری تمام شد"</string> + <string name="toast_restore_started" msgid="7881679218971277385">"شروع بازیابی…"</string> <string name="toast_restore_ended" msgid="1764041639199696132">"بازیابی پایان یافت"</string> <string name="toast_timeout" msgid="5276598587087626877">"مهلت عملیات تمام شد"</string> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java index d4c73668d0ed..20477975a6dd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java @@ -104,15 +104,19 @@ public class KeyguardSliceProvider extends SliceProvider implements private final AlarmManager.OnAlarmListener mUpdateNextAlarm = this::updateNextAlarm; private final HashSet<Integer> mMediaInvisibleStates; private final Object mMediaToken = new Object(); - private SettableWakeLock mMediaWakeLock; - private ZenModeController mZenModeController; + @VisibleForTesting + protected SettableWakeLock mMediaWakeLock; + @VisibleForTesting + protected ZenModeController mZenModeController; private String mDatePattern; private DateFormat mDateFormat; private String mLastText; private boolean mRegistered; private String mNextAlarm; private NextAlarmController mNextAlarmController; + @VisibleForTesting protected AlarmManager mAlarmManager; + @VisibleForTesting protected ContentResolver mContentResolver; private AlarmManager.AlarmClockInfo mNextAlarmInfo; private PendingIntent mPendingIntent; @@ -297,22 +301,44 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public boolean onCreateSliceProvider() { - mAlarmManager = getContext().getSystemService(AlarmManager.class); - mContentResolver = getContext().getContentResolver(); - mNextAlarmController = new NextAlarmControllerImpl(getContext()); - mNextAlarmController.addCallback(this); - mZenModeController = new ZenModeControllerImpl(getContext(), mHandler); - mZenModeController.addCallback(this); - mDatePattern = getContext().getString(R.string.system_ui_aod_date_pattern); - mPendingIntent = PendingIntent.getActivity(getContext(), 0, new Intent(), 0); - mMediaWakeLock = new SettableWakeLock(WakeLock.createPartial(getContext(), "media"), - "media"); - KeyguardSliceProvider.sInstance = this; - registerClockUpdate(); - updateClockLocked(); + synchronized (this) { + KeyguardSliceProvider oldInstance = KeyguardSliceProvider.sInstance; + if (oldInstance != null) { + oldInstance.onDestroy(); + } + + mAlarmManager = getContext().getSystemService(AlarmManager.class); + mContentResolver = getContext().getContentResolver(); + mNextAlarmController = new NextAlarmControllerImpl(getContext()); + mNextAlarmController.addCallback(this); + mZenModeController = new ZenModeControllerImpl(getContext(), mHandler); + mZenModeController.addCallback(this); + mDatePattern = getContext().getString(R.string.system_ui_aod_date_pattern); + mPendingIntent = PendingIntent.getActivity(getContext(), 0, new Intent(), 0); + mMediaWakeLock = new SettableWakeLock(WakeLock.createPartial(getContext(), "media"), + "media"); + KeyguardSliceProvider.sInstance = this; + registerClockUpdate(); + updateClockLocked(); + } return true; } + @VisibleForTesting + protected void onDestroy() { + synchronized (this) { + mNextAlarmController.removeCallback(this); + mZenModeController.removeCallback(this); + mMediaWakeLock.setAcquired(false); + mAlarmManager.cancel(mUpdateNextAlarm); + if (mRegistered) { + mRegistered = false; + getKeyguardUpdateMonitor().removeCallback(mKeyguardUpdateMonitorCallback); + getContext().unregisterReceiver(mIntentReceiver); + } + } + } + @Override public void onZenChanged(int zen) { notifyChange(); @@ -350,7 +376,8 @@ public class KeyguardSliceProvider extends SliceProvider implements * Registers a broadcast receiver for clock updates, include date, time zone and manually * changing the date/time via the settings app. */ - private void registerClockUpdate() { + @VisibleForTesting + protected void registerClockUpdate() { synchronized (this) { if (mRegistered) { return; diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java index 355e26071b2a..857f50c0f561 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java @@ -48,6 +48,9 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationMediaManager; +import com.android.systemui.statusbar.phone.KeyguardBypassController; +import com.android.systemui.statusbar.policy.ZenModeController; +import com.android.systemui.util.wakelock.SettableWakeLock; import org.junit.Assert; import org.junit.Before; @@ -73,6 +76,14 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { private NotificationMediaManager mNotificationMediaManager; @Mock private StatusBarStateController mStatusBarStateController; + @Mock + private KeyguardBypassController mKeyguardBypassController; + @Mock + private ZenModeController mZenModeController; + @Mock + private SettableWakeLock mMediaWakeLock; + @Mock + private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private TestableKeyguardSliceProvider mProvider; private boolean mIsZenMode; @@ -194,6 +205,20 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { verify(mContentResolver, never()).notifyChange(eq(mProvider.getUri()), eq(null)); } + @Test + public void onDestroy_noCrash() { + mProvider.onDestroy(); + } + + @Test + public void onDestroy_unregisterListeners() { + mProvider.registerClockUpdate(); + mProvider.onDestroy(); + verify(mMediaWakeLock).setAcquired(eq(false)); + verify(mAlarmManager).cancel(any(AlarmManager.OnAlarmListener.class)); + verify(mKeyguardUpdateMonitor).removeCallback(any()); + } + private class TestableKeyguardSliceProvider extends KeyguardSliceProvider { int mCleanDateFormatInvokations; private int mCounter; @@ -207,6 +232,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { super.onCreateSliceProvider(); mAlarmManager = KeyguardSliceProviderTest.this.mAlarmManager; mContentResolver = KeyguardSliceProviderTest.this.mContentResolver; + mZenModeController = KeyguardSliceProviderTest.this.mZenModeController; + mMediaWakeLock = KeyguardSliceProviderTest.this.mMediaWakeLock; return true; } @@ -223,7 +250,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Override public KeyguardUpdateMonitor getKeyguardUpdateMonitor() { - return mock(KeyguardUpdateMonitor.class); + return mKeyguardUpdateMonitor; } @Override diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 495a2edf8057..bd198dd74af7 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -7151,6 +7151,10 @@ public class NotificationManagerService extends SystemService { return false; } + if (userId == UserHandle.USER_ALL) { + userId = USER_SYSTEM; + } + try { final String[] pkgs = mPackageManager.getPackagesForUid(callingUid); if (pkgs == null) { diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index e75a30b12f68..5ba1eb29f6b4 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -3807,6 +3807,20 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testIsCallerInstantApp_userAllNotification() throws Exception { + ApplicationInfo info = new ApplicationInfo(); + info.privateFlags = ApplicationInfo.PRIVATE_FLAG_INSTANT; + when(mPackageManager.getApplicationInfo(anyString(), anyInt(), eq(UserHandle.USER_SYSTEM))) + .thenReturn(info); + when(mPackageManager.getPackagesForUid(anyInt())).thenReturn(new String[]{"any"}); + + assertTrue(mService.isCallerInstantApp(45770, UserHandle.USER_ALL)); + + info.privateFlags = 0; + assertFalse(mService.isCallerInstantApp(575370, UserHandle.USER_ALL )); + } + + @Test public void testResolveNotificationUid_sameApp_nonSystemUser() throws Exception { ApplicationInfo info = new ApplicationInfo(); info.uid = Binder.getCallingUid(); |