diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java index 160fc95f3f7c8..7a055d2948ad7 100644 --- a/services/core/java/com/android/server/wm/LockTaskController.java +++ b/services/core/java/com/android/server/wm/LockTaskController.java @@ -64,6 +64,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.policy.IKeyguardDismissCallback; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.statusbar.IStatusBarService; +import com.android.internal.telephony.CellBroadcastUtils; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService; @@ -392,6 +393,10 @@ public class LockTaskController { return false; } + if (isWirelessEmergencyAlert(intent)) { + return false; + } + return !(isTaskAuthAllowlisted(taskAuth) || mLockTaskModeTasks.isEmpty()); } @@ -424,6 +429,25 @@ public class LockTaskController { return isPackageAllowlisted(userId, packageName); } + private boolean isWirelessEmergencyAlert(Intent intent) { + if (intent == null) { + return false; + } + + final ComponentName cellBroadcastAlertDialogComponentName = + CellBroadcastUtils.getDefaultCellBroadcastAlertDialogComponent(mContext); + + if (cellBroadcastAlertDialogComponentName == null) { + return false; + } + + if (cellBroadcastAlertDialogComponentName.equals(intent.getComponent())) { + return true; + } + + return false; + } + private boolean isEmergencyCallIntent(Intent intent) { if (intent == null) { return false; diff --git a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java index 9fc9489e3c2e7..1d14dc31fa266 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java @@ -82,6 +82,7 @@ import android.util.Pair; import androidx.test.filters.SmallTest; import com.android.internal.statusbar.IStatusBarService; +import com.android.internal.telephony.CellBroadcastUtils; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; import com.android.server.statusbar.StatusBarManagerInternal; @@ -296,6 +297,22 @@ public class LockTaskControllerTest { assertTrue(mLockTaskController.isLockTaskModeViolation(dialer)); } + @Test + public void testLockTaskViolation_wirelessEmergencyAlerts() { + // GIVEN one task record with allowlisted auth that is in lock task mode + Task tr = getTask(LOCK_TASK_AUTH_ALLOWLISTED); + mLockTaskController.startLockTaskMode(tr, false, TEST_UID); + + // GIVEN cellbroadcast task necessary for emergency warning alerts + Task cellbroadcastreceiver = getTask( + new Intent().setComponent( + CellBroadcastUtils.getDefaultCellBroadcastAlertDialogComponent(mContext)), + LOCK_TASK_AUTH_PINNABLE); + + // THEN the cellbroadcast task should all be allowed + assertFalse(mLockTaskController.isLockTaskModeViolation(cellbroadcastreceiver)); + } + @Test public void testStopLockTaskMode() throws Exception { // GIVEN one task record with allowlisted auth that is in lock task mode diff --git a/telephony/common/com/android/internal/telephony/CellBroadcastUtils.java b/telephony/common/com/android/internal/telephony/CellBroadcastUtils.java index 6c63755862252..6181329bcb2ab 100644 --- a/telephony/common/com/android/internal/telephony/CellBroadcastUtils.java +++ b/telephony/common/com/android/internal/telephony/CellBroadcastUtils.java @@ -16,6 +16,7 @@ package com.android.internal.telephony; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -62,4 +63,17 @@ public class CellBroadcastUtils { return packageName; } + + /** + * Utility method to get cellbroadcast alert dialog component name + */ + public static ComponentName getDefaultCellBroadcastAlertDialogComponent(Context context) { + String cellBroadcastReceiverPackageName = + getDefaultCellBroadcastReceiverPackageName(context); + if (TextUtils.isEmpty(cellBroadcastReceiverPackageName)) { + return null; + } + return ComponentName.createRelative(cellBroadcastReceiverPackageName, + "com.android.cellbroadcastreceiver.CellBroadcastAlertDialog"); + } }