diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt index 44879aa9e85ba..b8a00133c728b 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt @@ -261,7 +261,7 @@ class ControlActionCoordinatorImpl @Inject constructor( taskViewFactory.get().create(context, uiExecutor, { dialog = DetailDialog( activityContext, broadcastSender, - it, pendingIntent, cvh + it, pendingIntent, cvh, keyguardStateController, activityStarter ).also { it.setOnDismissListener { _ -> dialog = null } it.show() diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt index 80589a2711ccf..edd1c6891946d 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt @@ -34,6 +34,8 @@ import android.widget.ImageView import com.android.internal.policy.ScreenDecorationsUtils import com.android.systemui.R import com.android.systemui.broadcast.BroadcastSender +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.wm.shell.TaskView /** @@ -46,7 +48,9 @@ class DetailDialog( val broadcastSender: BroadcastSender, val taskView: TaskView, val pendingIntent: PendingIntent, - val cvh: ControlViewHolder + val cvh: ControlViewHolder, + val keyguardStateController: KeyguardStateController, + val activityStarter: ActivityStarter ) : Dialog( activityContext, R.style.Theme_SystemUI_Dialog_Control_DetailPanel @@ -145,12 +149,25 @@ class DetailDialog( requireViewById(R.id.control_detail_open_in_app).apply { setOnClickListener { v: View -> - // Remove the task explicitly, since onRelease() callback will be executed after - // startActivity() below is called. removeDetailTask() dismiss() - broadcastSender.closeSystemDialogs() - pendingIntent.send() + + val action = ActivityStarter.OnDismissAction { + // Remove the task explicitly, since onRelease() callback will be executed after + // startActivity() below is called. + broadcastSender.closeSystemDialogs() + pendingIntent.send() + false + } + if (keyguardStateController.isUnlocked()) { + action.onDismiss() + } else { + activityStarter.dismissKeyguardThenExecute( + action, + null /* cancel */, + true /* afterKeyguardGone */ + ) + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt index 0166fa25d5267..6a6a65a601fb1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt @@ -22,6 +22,8 @@ import android.testing.TestableLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.broadcast.BroadcastSender +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.wm.shell.TaskView import org.junit.Before import org.junit.Test @@ -45,6 +47,10 @@ class DetailDialogTest : SysuiTestCase() { private lateinit var controlViewHolder: ControlViewHolder @Mock private lateinit var pendingIntent: PendingIntent + @Mock + private lateinit var keyguardStateController: KeyguardStateController + @Mock + private lateinit var activityStarter: ActivityStarter @Before fun setUp() { @@ -69,7 +75,9 @@ class DetailDialogTest : SysuiTestCase() { broadcastSender, taskView, pendingIntent, - controlViewHolder + controlViewHolder, + keyguardStateController, + activityStarter ) } }