From b381dfaf18e2f229a2da950fe54a3c2b088adfdc Mon Sep 17 00:00:00 2001 From: Joshua Duong Date: Fri, 15 May 2020 09:56:26 -0700 Subject: [PATCH] Don't attach PendingIntent if settings app is hidden. The settings app may not be available. In that case, just show the adb notification without a PendingIntent. Bug: 156453114 Test: atest AdbNotificationsTest Test: With USB debugging enabled, install TestDPC, and use it to hide settings app. Unplug and replug USB. USB debugging notification shows up and clicking it does nothing. Change-Id: Ie29d2c425c05bce9371600d76e4eb2eaba692fd7 Change-Id: Ie5f746cbc7b8a32fc280177bf281a9e973c8df12 --- core/java/android/debug/AdbNotifications.java | 19 ++++++++++++++----- .../android/debug/AdbNotificationsTest.java | 14 ++++++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/core/java/android/debug/AdbNotifications.java b/core/java/android/debug/AdbNotifications.java index fed5f5f9a0bf2..9f1a5f80aa4dc 100644 --- a/core/java/android/debug/AdbNotifications.java +++ b/core/java/android/debug/AdbNotifications.java @@ -17,11 +17,13 @@ package android.debug; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.os.UserHandle; import android.provider.Settings; @@ -42,8 +44,9 @@ public final class AdbNotifications { * Builds a notification to show connected state for adb over a transport type. * @param context the context * @param transportType the adb transport type. - * @return a newly created Notification for the transport type. + * @return a newly created Notification for the transport type, or null on error. */ + @Nullable public static Notification createNotification(@NonNull Context context, byte transportType) { Resources resources = context.getResources(); @@ -66,10 +69,16 @@ public final class AdbNotifications { Intent intent = new Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - intent.setPackage(context.getPackageManager().resolveActivity(intent, - PackageManager.MATCH_SYSTEM_ONLY).activityInfo.packageName); - PendingIntent pIntent = PendingIntent.getActivityAsUser(context, 0, intent, - PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); + ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, + PackageManager.MATCH_SYSTEM_ONLY); + // Settings app may not be available (e.g. device policy manager removes it) + PendingIntent pIntent = null; + if (resolveInfo != null) { + intent.setPackage(resolveInfo.activityInfo.packageName); + pIntent = PendingIntent.getActivityAsUser(context, 0, intent, + PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); + } + return new Notification.Builder(context, SystemNotificationChannels.DEVELOPER_IMPORTANT) .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) diff --git a/core/tests/coretests/src/android/debug/AdbNotificationsTest.java b/core/tests/coretests/src/android/debug/AdbNotificationsTest.java index 6c187ea6e17ae..3496e2c7fea3d 100644 --- a/core/tests/coretests/src/android/debug/AdbNotificationsTest.java +++ b/core/tests/coretests/src/android/debug/AdbNotificationsTest.java @@ -56,8 +56,11 @@ public final class AdbNotificationsTest { // Verify that the adb notification for usb connections has the correct text. assertEquals(title, notification.extras.getCharSequence(Notification.EXTRA_TITLE, "")); assertEquals(message, notification.extras.getCharSequence(Notification.EXTRA_TEXT, "")); - // Verify the PendingIntent has an explicit intent (b/153356209). - assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage())); + // Verify the PendingIntent has an explicit intent (b/153356209), if there is a + // PendingIntent attached. + if (notification.contentIntent != null) { + assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage())); + } } @Test @@ -73,7 +76,10 @@ public final class AdbNotificationsTest { // Verify that the adb notification for usb connections has the correct text. assertEquals(title, notification.extras.getCharSequence(Notification.EXTRA_TITLE, "")); assertEquals(message, notification.extras.getCharSequence(Notification.EXTRA_TEXT, "")); - // Verify the PendingIntent has an explicit intent (b/153356209). - assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage())); + // Verify the PendingIntent has an explicit intent (b/153356209), if there is a + // PendingIntent attached. + if (notification.contentIntent != null) { + assertFalse(TextUtils.isEmpty(notification.contentIntent.getIntent().getPackage())); + } } }