Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +71 −7 Original line number Diff line number Diff line Loading @@ -574,6 +574,8 @@ public class StatusBar extends SystemUI implements DemoMode, private NotificationEntry mDraggedDownEntry; private boolean mLaunchCameraWhenFinishedWaking; private boolean mLaunchCameraOnFinishedGoingToSleep; private boolean mLaunchEmergencyActionWhenFinishedWaking; private boolean mLaunchEmergencyActionOnFinishedGoingToSleep; private int mLastCameraLaunchSource; protected PowerManager.WakeLock mGestureWakeLock; private Vibrator mVibrator; Loading Loading @@ -3844,6 +3846,14 @@ public class StatusBar extends SystemUI implements DemoMode, // is correct. mHandler.post(() -> onCameraLaunchGestureDetected(mLastCameraLaunchSource)); } if (mLaunchEmergencyActionOnFinishedGoingToSleep) { mLaunchEmergencyActionOnFinishedGoingToSleep = false; // This gets executed before we will show Keyguard, so post it in order that the // state is correct. mHandler.post(() -> onEmergencyActionLaunchGestureDetected()); } updateIsKeyguard(); } Loading Loading @@ -3890,6 +3900,13 @@ public class StatusBar extends SystemUI implements DemoMode, false /* animate */, mLastCameraLaunchSource); mLaunchCameraWhenFinishedWaking = false; } if (mLaunchEmergencyActionWhenFinishedWaking) { mLaunchEmergencyActionWhenFinishedWaking = false; Intent emergencyIntent = getEmergencyActionIntent(); if (emergencyIntent != null) { mContext.startActivityAsUser(emergencyIntent, UserHandle.CURRENT); } } updateScrimController(); } }; Loading Loading @@ -4027,20 +4044,65 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onEmergencyActionLaunchGestureDetected() { // TODO (b/169793384) Polish the panic gesture to be just like its older brother, camera. Intent emergencyIntent = getEmergencyActionIntent(); if (emergencyIntent == null) { Log.wtf(TAG, "Couldn't find an app to process the emergency intent."); return; } if (isGoingToSleep()) { mLaunchEmergencyActionOnFinishedGoingToSleep = true; return; } if (!mDeviceInteractive) { mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE, "com.android.systemui:EMERGENCY_GESTURE"); } // TODO(b/169087248) Possibly add haptics here for emergency action. Currently disabled for // app-side haptic experimentation. if (!mStatusBarKeyguardViewManager.isShowing()) { startActivityDismissingKeyguard(emergencyIntent, false /* onlyProvisioned */, true /* dismissShade */, true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0); return; } if (!mDeviceInteractive) { // Avoid flickering of the scrim when we instant launch the camera and the bouncer // comes on. mGestureWakeLock.acquire(LAUNCH_TRANSITION_TIMEOUT_MS + 1000L); } if (isWakingUpOrAwake()) { if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mStatusBarKeyguardViewManager.reset(true /* hide */); } mContext.startActivityAsUser(emergencyIntent, UserHandle.CURRENT); return; } // We need to defer the emergency action launch until the screen comes on, since otherwise // we will dismiss us too early since we are waiting on an activity to be drawn and // incorrectly get notified because of the screen on event (which resumes and pauses // some activities) mLaunchEmergencyActionWhenFinishedWaking = true; } private @Nullable Intent getEmergencyActionIntent() { Intent emergencyIntent = new Intent(EmergencyGesture.ACTION_LAUNCH_EMERGENCY); PackageManager pm = mContext.getPackageManager(); ResolveInfo resolveInfo = pm.resolveActivity(emergencyIntent, /*flags=*/0); if (resolveInfo == null) { // TODO(b/171084088) Upgrade log to wtf when we have default app in main branch. Log.d(TAG, "Couldn't find an app to process the emergency intent."); return; Log.wtf(TAG, "Couldn't find an app to process the emergency intent."); return null; } emergencyIntent.setComponent(new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name)); emergencyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(emergencyIntent, /*dismissShade=*/true); return emergencyIntent; } boolean isCameraAllowedByAdmin() { Loading Loading @@ -4100,8 +4162,10 @@ public class StatusBar extends SystemUI implements DemoMode, ScrimState state = mStatusBarKeyguardViewManager.bouncerNeedsScrimming() ? ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER; mScrimController.transitionTo(state); } else if (isInLaunchTransition() || mLaunchCameraWhenFinishedWaking } else if (isInLaunchTransition() || mLaunchCameraWhenFinishedWaking || launchingAffordanceWithPreview) { // TODO(b/170133395) Investigate whether Emergency Gesture flag should be included here. mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback); } else if (mBrightnessMirrorVisible) { mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR); Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +0 −19 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static junit.framework.TestCase.fail; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; Loading @@ -35,7 +34,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading @@ -45,7 +43,6 @@ import android.app.StatusBarManager; import android.app.trust.TrustManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Intent; import android.content.IntentFilter; import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.fingerprint.FingerprintManager; Loading Loading @@ -87,7 +84,6 @@ import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.emergency.EmergencyGesture; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; Loading Loading @@ -151,10 +147,8 @@ import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; Loading Loading @@ -887,19 +881,6 @@ public class StatusBarTest extends SysuiTestCase { verify(mDozeServiceHost).setDozeSuppressed(false); } @Ignore // TODO (b/175240607) - Figure out if the device will actually dial 911. @Test public void onEmergencyActionLaunchGesture_launchesEmergencyIntent() { ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); StatusBar statusBarSpy = spy(mStatusBar); statusBarSpy.onEmergencyActionLaunchGestureDetected(); verify(statusBarSpy).startActivity(intentCaptor.capture(), eq(true)); Intent sentIntent = intentCaptor.getValue(); assertEquals(sentIntent.getAction(), EmergencyGesture.ACTION_LAUNCH_EMERGENCY); } public static class TestableNotificationInterruptStateProviderImpl extends NotificationInterruptStateProviderImpl { Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +71 −7 Original line number Diff line number Diff line Loading @@ -574,6 +574,8 @@ public class StatusBar extends SystemUI implements DemoMode, private NotificationEntry mDraggedDownEntry; private boolean mLaunchCameraWhenFinishedWaking; private boolean mLaunchCameraOnFinishedGoingToSleep; private boolean mLaunchEmergencyActionWhenFinishedWaking; private boolean mLaunchEmergencyActionOnFinishedGoingToSleep; private int mLastCameraLaunchSource; protected PowerManager.WakeLock mGestureWakeLock; private Vibrator mVibrator; Loading Loading @@ -3844,6 +3846,14 @@ public class StatusBar extends SystemUI implements DemoMode, // is correct. mHandler.post(() -> onCameraLaunchGestureDetected(mLastCameraLaunchSource)); } if (mLaunchEmergencyActionOnFinishedGoingToSleep) { mLaunchEmergencyActionOnFinishedGoingToSleep = false; // This gets executed before we will show Keyguard, so post it in order that the // state is correct. mHandler.post(() -> onEmergencyActionLaunchGestureDetected()); } updateIsKeyguard(); } Loading Loading @@ -3890,6 +3900,13 @@ public class StatusBar extends SystemUI implements DemoMode, false /* animate */, mLastCameraLaunchSource); mLaunchCameraWhenFinishedWaking = false; } if (mLaunchEmergencyActionWhenFinishedWaking) { mLaunchEmergencyActionWhenFinishedWaking = false; Intent emergencyIntent = getEmergencyActionIntent(); if (emergencyIntent != null) { mContext.startActivityAsUser(emergencyIntent, UserHandle.CURRENT); } } updateScrimController(); } }; Loading Loading @@ -4027,20 +4044,65 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onEmergencyActionLaunchGestureDetected() { // TODO (b/169793384) Polish the panic gesture to be just like its older brother, camera. Intent emergencyIntent = getEmergencyActionIntent(); if (emergencyIntent == null) { Log.wtf(TAG, "Couldn't find an app to process the emergency intent."); return; } if (isGoingToSleep()) { mLaunchEmergencyActionOnFinishedGoingToSleep = true; return; } if (!mDeviceInteractive) { mPowerManager.wakeUp(SystemClock.uptimeMillis(), PowerManager.WAKE_REASON_GESTURE, "com.android.systemui:EMERGENCY_GESTURE"); } // TODO(b/169087248) Possibly add haptics here for emergency action. Currently disabled for // app-side haptic experimentation. if (!mStatusBarKeyguardViewManager.isShowing()) { startActivityDismissingKeyguard(emergencyIntent, false /* onlyProvisioned */, true /* dismissShade */, true /* disallowEnterPictureInPictureWhileLaunching */, null /* callback */, 0); return; } if (!mDeviceInteractive) { // Avoid flickering of the scrim when we instant launch the camera and the bouncer // comes on. mGestureWakeLock.acquire(LAUNCH_TRANSITION_TIMEOUT_MS + 1000L); } if (isWakingUpOrAwake()) { if (mStatusBarKeyguardViewManager.isBouncerShowing()) { mStatusBarKeyguardViewManager.reset(true /* hide */); } mContext.startActivityAsUser(emergencyIntent, UserHandle.CURRENT); return; } // We need to defer the emergency action launch until the screen comes on, since otherwise // we will dismiss us too early since we are waiting on an activity to be drawn and // incorrectly get notified because of the screen on event (which resumes and pauses // some activities) mLaunchEmergencyActionWhenFinishedWaking = true; } private @Nullable Intent getEmergencyActionIntent() { Intent emergencyIntent = new Intent(EmergencyGesture.ACTION_LAUNCH_EMERGENCY); PackageManager pm = mContext.getPackageManager(); ResolveInfo resolveInfo = pm.resolveActivity(emergencyIntent, /*flags=*/0); if (resolveInfo == null) { // TODO(b/171084088) Upgrade log to wtf when we have default app in main branch. Log.d(TAG, "Couldn't find an app to process the emergency intent."); return; Log.wtf(TAG, "Couldn't find an app to process the emergency intent."); return null; } emergencyIntent.setComponent(new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name)); emergencyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(emergencyIntent, /*dismissShade=*/true); return emergencyIntent; } boolean isCameraAllowedByAdmin() { Loading Loading @@ -4100,8 +4162,10 @@ public class StatusBar extends SystemUI implements DemoMode, ScrimState state = mStatusBarKeyguardViewManager.bouncerNeedsScrimming() ? ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER; mScrimController.transitionTo(state); } else if (isInLaunchTransition() || mLaunchCameraWhenFinishedWaking } else if (isInLaunchTransition() || mLaunchCameraWhenFinishedWaking || launchingAffordanceWithPreview) { // TODO(b/170133395) Investigate whether Emergency Gesture flag should be included here. mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback); } else if (mBrightnessMirrorVisible) { mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR); Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +0 −19 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static junit.framework.TestCase.fail; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; Loading @@ -35,7 +34,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading @@ -45,7 +43,6 @@ import android.app.StatusBarManager; import android.app.trust.TrustManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Intent; import android.content.IntentFilter; import android.hardware.display.AmbientDisplayConfiguration; import android.hardware.fingerprint.FingerprintManager; Loading Loading @@ -87,7 +84,6 @@ import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.emergency.EmergencyGesture; import com.android.systemui.keyguard.DismissCallbackRegistry; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.keyguard.ScreenLifecycle; Loading Loading @@ -151,10 +147,8 @@ import com.android.wm.shell.bubbles.Bubbles; import com.android.wm.shell.legacysplitscreen.LegacySplitScreen; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; Loading Loading @@ -887,19 +881,6 @@ public class StatusBarTest extends SysuiTestCase { verify(mDozeServiceHost).setDozeSuppressed(false); } @Ignore // TODO (b/175240607) - Figure out if the device will actually dial 911. @Test public void onEmergencyActionLaunchGesture_launchesEmergencyIntent() { ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); StatusBar statusBarSpy = spy(mStatusBar); statusBarSpy.onEmergencyActionLaunchGestureDetected(); verify(statusBarSpy).startActivity(intentCaptor.capture(), eq(true)); Intent sentIntent = intentCaptor.getValue(); assertEquals(sentIntent.getAction(), EmergencyGesture.ACTION_LAUNCH_EMERGENCY); } public static class TestableNotificationInterruptStateProviderImpl extends NotificationInterruptStateProviderImpl { Loading