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())); + } } }