Loading packages/SystemUI/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,7 @@ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"/> <uses-permission android:name="android.permission.USE_EXACT_ALARM"/> <!-- Assist --> <uses-permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE" /> Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +0 −13 Original line number Diff line number Diff line Loading @@ -500,7 +500,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private final AlternateBouncerInteractor mAlternateBouncerInteractor; private final PluginDependencyProvider mPluginDependencyProvider; private final KeyguardDismissUtil mKeyguardDismissUtil; private final ExtensionController mExtensionController; private final UserInfoControllerImpl mUserInfoControllerImpl; private final DemoModeController mDemoModeController; Loading Loading @@ -787,7 +786,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { InitController initController, @Named(TIME_TICK_HANDLER_NAME) Handler timeTickHandler, PluginDependencyProvider pluginDependencyProvider, KeyguardDismissUtil keyguardDismissUtil, ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, PhoneStatusBarPolicy phoneStatusBarPolicy, Loading Loading @@ -884,7 +882,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mKeyguardViewMediatorCallback = viewMediatorCallback; mInitController = initController; mPluginDependencyProvider = pluginDependencyProvider; mKeyguardDismissUtil = keyguardDismissUtil; mExtensionController = extensionController; mUserInfoControllerImpl = userInfoControllerImpl; mIconPolicy = phoneStatusBarPolicy; Loading Loading @@ -1742,7 +1739,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mLightBarController.setBiometricUnlockController(mBiometricUnlockController); mMediaManager.setBiometricUnlockController(mBiometricUnlockController); mKeyguardDismissUtil.setDismissHandler(this::executeWhenUnlocked); Trace.endSection(); } Loading Loading @@ -2366,15 +2362,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mNotificationsController.resetUserExpandedStates(); } private void executeWhenUnlocked(OnDismissAction action, boolean requiresShadeOpen, boolean afterKeyguardGone) { if (mKeyguardStateController.isShowing() && requiresShadeOpen) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); } mActivityStarter.dismissKeyguardThenExecute(action, null /* cancelAction */, afterKeyguardGone /* afterKeyguardGone */); } /** * Notify the shade controller that the current user changed * Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java +18 −25 Original line number Diff line number Diff line Loading @@ -16,48 +16,41 @@ package com.android.systemui.statusbar.phone; import android.util.Log; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import javax.inject.Inject; /** * Executes actions that require the screen to be unlocked. Delegates the actual handling to an * implementation passed via {@link #setDismissHandler}. * Executes actions that require the screen to be unlocked. */ @SysUISingleton public class KeyguardDismissUtil implements KeyguardDismissHandler { private static final String TAG = "KeyguardDismissUtil"; private final KeyguardStateController mKeyguardStateController; private volatile KeyguardDismissHandler mDismissHandler; private final SysuiStatusBarStateController mStatusBarStateController; @Inject public KeyguardDismissUtil() { } private final ActivityStarter mActivityStarter; /** Sets the actual {@link KeyguardDismissHandler} implementation. */ public void setDismissHandler(KeyguardDismissHandler dismissHandler) { mDismissHandler = dismissHandler; @Inject public KeyguardDismissUtil(KeyguardStateController keyguardStateController, SysuiStatusBarStateController statusBarStateController, ActivityStarter activityStarter) { mKeyguardStateController = keyguardStateController; mStatusBarStateController = statusBarStateController; mActivityStarter = activityStarter; } /** * Executes an action that requires the screen to be unlocked. * * <p>Must be called after {@link #setDismissHandler}. * * @param requiresShadeOpen does the shade need to be forced open when hiding the keyguard? */ @Override public void executeWhenUnlocked(OnDismissAction action, boolean requiresShadeOpen, boolean afterKeyguardGone) { KeyguardDismissHandler dismissHandler = mDismissHandler; if (dismissHandler == null) { Log.wtf(TAG, "KeyguardDismissHandler not set."); action.onDismiss(); return; if (mKeyguardStateController.isShowing() && requiresShadeOpen) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); } dismissHandler.executeWhenUnlocked(action, requiresShadeOpen, afterKeyguardGone); mActivityStarter.dismissKeyguardThenExecute(action, null /* cancelAction */, afterKeyguardGone /* afterKeyguardGone */); } } packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingServiceTest.java +48 −13 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ package com.android.systemui.screenrecord; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; Loading @@ -32,6 +34,7 @@ import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.RemoteException; import android.os.UserHandle; import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; Loading @@ -41,7 +44,9 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.media.MediaProjectionCaptureTarget; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import com.android.systemui.statusbar.policy.KeyguardStateController; import org.junit.Before; import org.junit.Test; Loading Loading @@ -77,20 +82,38 @@ public class RecordingServiceTest extends SysuiTestCase { private UserContextProvider mUserContextTracker; @Captor private ArgumentCaptor<Runnable> mRunnableCaptor; private KeyguardDismissUtil mKeyguardDismissUtil = new KeyguardDismissUtil() { public void executeWhenUnlocked(ActivityStarter.OnDismissAction action, boolean requiresShadeOpen) { action.onDismiss(); } }; @Mock private KeyguardStateController mKeyguardStateController; @Mock private SysuiStatusBarStateController mStatusBarStateController; @Mock private ActivityStarter mActivityStarter; private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF"; private KeyguardDismissUtil mKeyguardDismissUtil = new KeyguardDismissUtil( mKeyguardStateController, mStatusBarStateController, mActivityStarter); private RecordingService mRecordingService; private class RecordingServiceTestable extends RecordingService { RecordingServiceTestable( RecordingController controller, Executor executor, Handler handler, UiEventLogger uiEventLogger, NotificationManager notificationManager, UserContextProvider userContextTracker, KeyguardDismissUtil keyguardDismissUtil) { super(controller, executor, handler, uiEventLogger, notificationManager, userContextTracker, keyguardDismissUtil); attachBaseContext(mContext); } } @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mRecordingService = Mockito.spy(new RecordingService(mController, mExecutor, mHandler, mUiEventLogger, mNotificationManager, mUserContextTracker, mKeyguardDismissUtil)); mRecordingService = Mockito.spy(new RecordingServiceTestable(mController, mExecutor, mHandler, mUiEventLogger, mNotificationManager, mUserContextTracker, mKeyguardDismissUtil)); // Return actual context info doReturn(mContext).when(mRecordingService).getApplicationContext(); Loading Loading @@ -160,8 +183,7 @@ public class RecordingServiceTest extends SysuiTestCase { Intent startIntent = RecordingService.getStartIntent(mContext, 0, 0, false, null); mRecordingService.onStartCommand(startIntent, 0, 0); // Then the state is set to not recording verify(mController).updateState(false); assertUpdateState(false); } @Test Loading @@ -179,7 +201,7 @@ public class RecordingServiceTest extends SysuiTestCase { mRecordingService.onStopped(); verify(mController).updateState(false); assertUpdateState(false); } @Test Loading Loading @@ -224,8 +246,21 @@ public class RecordingServiceTest extends SysuiTestCase { verify(mExecutor).execute(mRunnableCaptor.capture()); mRunnableCaptor.getValue().run(); // Then the state is set to not recording and we cancel the notification verify(mController).updateState(false); assertUpdateState(false); verify(mNotificationManager).cancelAsUser(any(), anyInt(), any()); } private void assertUpdateState(boolean state) { // Then the state is set to not recording, and we cancel the notification // non SYSTEM user doesn't have the reference to the correct controller, // so a broadcast is sent in case of non SYSTEM user. if (UserHandle.USER_SYSTEM == mContext.getUserId()) { verify(mController).updateState(state); } else { ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mRecordingService).sendBroadcast(argumentCaptor.capture(), eq(PERMISSION_SELF)); assertEquals(RecordingController.INTENT_UPDATE_STATE, argumentCaptor.getValue().getAction()); } } } packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +0 −2 Original line number Diff line number Diff line Loading @@ -287,7 +287,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase { @Mock private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; @Mock private ScreenPinningRequest mScreenPinningRequest; @Mock private PluginDependencyProvider mPluginDependencyProvider; @Mock private KeyguardDismissUtil mKeyguardDismissUtil; @Mock private ExtensionController mExtensionController; @Mock private UserInfoControllerImpl mUserInfoControllerImpl; @Mock private PhoneStatusBarPolicy mPhoneStatusBarPolicy; Loading Loading @@ -516,7 +515,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase { mInitController, new Handler(TestableLooper.get(this).getLooper()), mPluginDependencyProvider, mKeyguardDismissUtil, mExtensionController, mUserInfoControllerImpl, mPhoneStatusBarPolicy, Loading Loading
packages/SystemUI/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -176,6 +176,7 @@ <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"/> <uses-permission android:name="android.permission.USE_EXACT_ALARM"/> <!-- Assist --> <uses-permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE" /> Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +0 −13 Original line number Diff line number Diff line Loading @@ -500,7 +500,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private final AlternateBouncerInteractor mAlternateBouncerInteractor; private final PluginDependencyProvider mPluginDependencyProvider; private final KeyguardDismissUtil mKeyguardDismissUtil; private final ExtensionController mExtensionController; private final UserInfoControllerImpl mUserInfoControllerImpl; private final DemoModeController mDemoModeController; Loading Loading @@ -787,7 +786,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { InitController initController, @Named(TIME_TICK_HANDLER_NAME) Handler timeTickHandler, PluginDependencyProvider pluginDependencyProvider, KeyguardDismissUtil keyguardDismissUtil, ExtensionController extensionController, UserInfoControllerImpl userInfoControllerImpl, PhoneStatusBarPolicy phoneStatusBarPolicy, Loading Loading @@ -884,7 +882,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mKeyguardViewMediatorCallback = viewMediatorCallback; mInitController = initController; mPluginDependencyProvider = pluginDependencyProvider; mKeyguardDismissUtil = keyguardDismissUtil; mExtensionController = extensionController; mUserInfoControllerImpl = userInfoControllerImpl; mIconPolicy = phoneStatusBarPolicy; Loading Loading @@ -1742,7 +1739,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mLightBarController.setBiometricUnlockController(mBiometricUnlockController); mMediaManager.setBiometricUnlockController(mBiometricUnlockController); mKeyguardDismissUtil.setDismissHandler(this::executeWhenUnlocked); Trace.endSection(); } Loading Loading @@ -2366,15 +2362,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mNotificationsController.resetUserExpandedStates(); } private void executeWhenUnlocked(OnDismissAction action, boolean requiresShadeOpen, boolean afterKeyguardGone) { if (mKeyguardStateController.isShowing() && requiresShadeOpen) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); } mActivityStarter.dismissKeyguardThenExecute(action, null /* cancelAction */, afterKeyguardGone /* afterKeyguardGone */); } /** * Notify the shade controller that the current user changed * Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardDismissUtil.java +18 −25 Original line number Diff line number Diff line Loading @@ -16,48 +16,41 @@ package com.android.systemui.statusbar.phone; import android.util.Log; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.ActivityStarter.OnDismissAction; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.policy.KeyguardStateController; import javax.inject.Inject; /** * Executes actions that require the screen to be unlocked. Delegates the actual handling to an * implementation passed via {@link #setDismissHandler}. * Executes actions that require the screen to be unlocked. */ @SysUISingleton public class KeyguardDismissUtil implements KeyguardDismissHandler { private static final String TAG = "KeyguardDismissUtil"; private final KeyguardStateController mKeyguardStateController; private volatile KeyguardDismissHandler mDismissHandler; private final SysuiStatusBarStateController mStatusBarStateController; @Inject public KeyguardDismissUtil() { } private final ActivityStarter mActivityStarter; /** Sets the actual {@link KeyguardDismissHandler} implementation. */ public void setDismissHandler(KeyguardDismissHandler dismissHandler) { mDismissHandler = dismissHandler; @Inject public KeyguardDismissUtil(KeyguardStateController keyguardStateController, SysuiStatusBarStateController statusBarStateController, ActivityStarter activityStarter) { mKeyguardStateController = keyguardStateController; mStatusBarStateController = statusBarStateController; mActivityStarter = activityStarter; } /** * Executes an action that requires the screen to be unlocked. * * <p>Must be called after {@link #setDismissHandler}. * * @param requiresShadeOpen does the shade need to be forced open when hiding the keyguard? */ @Override public void executeWhenUnlocked(OnDismissAction action, boolean requiresShadeOpen, boolean afterKeyguardGone) { KeyguardDismissHandler dismissHandler = mDismissHandler; if (dismissHandler == null) { Log.wtf(TAG, "KeyguardDismissHandler not set."); action.onDismiss(); return; if (mKeyguardStateController.isShowing() && requiresShadeOpen) { mStatusBarStateController.setLeaveOpenOnKeyguardHide(true); } dismissHandler.executeWhenUnlocked(action, requiresShadeOpen, afterKeyguardGone); mActivityStarter.dismissKeyguardThenExecute(action, null /* cancelAction */, afterKeyguardGone /* afterKeyguardGone */); } }
packages/SystemUI/tests/src/com/android/systemui/screenrecord/RecordingServiceTest.java +48 −13 Original line number Diff line number Diff line Loading @@ -16,9 +16,11 @@ package com.android.systemui.screenrecord; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; Loading @@ -32,6 +34,7 @@ import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.RemoteException; import android.os.UserHandle; import android.testing.AndroidTestingRunner; import androidx.test.filters.SmallTest; Loading @@ -41,7 +44,9 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.media.MediaProjectionCaptureTarget; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import com.android.systemui.statusbar.policy.KeyguardStateController; import org.junit.Before; import org.junit.Test; Loading Loading @@ -77,20 +82,38 @@ public class RecordingServiceTest extends SysuiTestCase { private UserContextProvider mUserContextTracker; @Captor private ArgumentCaptor<Runnable> mRunnableCaptor; private KeyguardDismissUtil mKeyguardDismissUtil = new KeyguardDismissUtil() { public void executeWhenUnlocked(ActivityStarter.OnDismissAction action, boolean requiresShadeOpen) { action.onDismiss(); } }; @Mock private KeyguardStateController mKeyguardStateController; @Mock private SysuiStatusBarStateController mStatusBarStateController; @Mock private ActivityStarter mActivityStarter; private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF"; private KeyguardDismissUtil mKeyguardDismissUtil = new KeyguardDismissUtil( mKeyguardStateController, mStatusBarStateController, mActivityStarter); private RecordingService mRecordingService; private class RecordingServiceTestable extends RecordingService { RecordingServiceTestable( RecordingController controller, Executor executor, Handler handler, UiEventLogger uiEventLogger, NotificationManager notificationManager, UserContextProvider userContextTracker, KeyguardDismissUtil keyguardDismissUtil) { super(controller, executor, handler, uiEventLogger, notificationManager, userContextTracker, keyguardDismissUtil); attachBaseContext(mContext); } } @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); mRecordingService = Mockito.spy(new RecordingService(mController, mExecutor, mHandler, mUiEventLogger, mNotificationManager, mUserContextTracker, mKeyguardDismissUtil)); mRecordingService = Mockito.spy(new RecordingServiceTestable(mController, mExecutor, mHandler, mUiEventLogger, mNotificationManager, mUserContextTracker, mKeyguardDismissUtil)); // Return actual context info doReturn(mContext).when(mRecordingService).getApplicationContext(); Loading Loading @@ -160,8 +183,7 @@ public class RecordingServiceTest extends SysuiTestCase { Intent startIntent = RecordingService.getStartIntent(mContext, 0, 0, false, null); mRecordingService.onStartCommand(startIntent, 0, 0); // Then the state is set to not recording verify(mController).updateState(false); assertUpdateState(false); } @Test Loading @@ -179,7 +201,7 @@ public class RecordingServiceTest extends SysuiTestCase { mRecordingService.onStopped(); verify(mController).updateState(false); assertUpdateState(false); } @Test Loading Loading @@ -224,8 +246,21 @@ public class RecordingServiceTest extends SysuiTestCase { verify(mExecutor).execute(mRunnableCaptor.capture()); mRunnableCaptor.getValue().run(); // Then the state is set to not recording and we cancel the notification verify(mController).updateState(false); assertUpdateState(false); verify(mNotificationManager).cancelAsUser(any(), anyInt(), any()); } private void assertUpdateState(boolean state) { // Then the state is set to not recording, and we cancel the notification // non SYSTEM user doesn't have the reference to the correct controller, // so a broadcast is sent in case of non SYSTEM user. if (UserHandle.USER_SYSTEM == mContext.getUserId()) { verify(mController).updateState(state); } else { ArgumentCaptor<Intent> argumentCaptor = ArgumentCaptor.forClass(Intent.class); verify(mRecordingService).sendBroadcast(argumentCaptor.capture(), eq(PERMISSION_SELF)); assertEquals(RecordingController.INTENT_UPDATE_STATE, argumentCaptor.getValue().getAction()); } } }
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +0 −2 Original line number Diff line number Diff line Loading @@ -287,7 +287,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase { @Mock private StatusBarTouchableRegionManager mStatusBarTouchableRegionManager; @Mock private ScreenPinningRequest mScreenPinningRequest; @Mock private PluginDependencyProvider mPluginDependencyProvider; @Mock private KeyguardDismissUtil mKeyguardDismissUtil; @Mock private ExtensionController mExtensionController; @Mock private UserInfoControllerImpl mUserInfoControllerImpl; @Mock private PhoneStatusBarPolicy mPhoneStatusBarPolicy; Loading Loading @@ -516,7 +515,6 @@ public class CentralSurfacesImplTest extends SysuiTestCase { mInitController, new Handler(TestableLooper.get(this).getLooper()), mPluginDependencyProvider, mKeyguardDismissUtil, mExtensionController, mUserInfoControllerImpl, mPhoneStatusBarPolicy, Loading