diff --git a/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt b/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt index c109eb4134bb6..324ef4baf7d5b 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt @@ -58,6 +58,16 @@ class ToastLogger @Inject constructor( }) } + fun logOnSkipToastForInvalidDisplay(packageName: String, token: String, displayId: Int) { + log(DEBUG, { + str1 = packageName + str2 = token + int1 = displayId + }, { + "[$str2] Skip toast for [$str1] scheduled on unavailable display #$int1" + }) + } + private inline fun log( logLevel: LogLevel, initializer: LogMessage.() -> Unit, diff --git a/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java b/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java index ed14c8ad150c3..ae8128d20d3d2 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java +++ b/packages/SystemUI/src/com/android/systemui/toast/ToastUI.java @@ -32,6 +32,7 @@ import android.os.IBinder; import android.os.ServiceManager; import android.os.UserHandle; import android.util.Log; +import android.view.Display; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.IAccessibilityManager; import android.widget.ToastPresenter; @@ -115,8 +116,14 @@ public class ToastUI implements CoreStartable, CommandQueue.Callbacks { Context context = mContext.createContextAsUser(userHandle, 0); DisplayManager mDisplayManager = mContext.getSystemService(DisplayManager.class); - Context displayContext = context.createDisplayContext( - mDisplayManager.getDisplay(displayId)); + Display display = mDisplayManager.getDisplay(displayId); + if (display == null) { + // Display for which this toast was scheduled for is no longer available. + mToastLogger.logOnSkipToastForInvalidDisplay(packageName, token.toString(), + displayId); + return; + } + Context displayContext = context.createDisplayContext(display); mToast = mToastFactory.createToast(mContext /* sysuiContext */, text, packageName, userHandle.getIdentifier(), mOrientation); diff --git a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java index 27957ed06d116..f299ad45a7ea1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.app.Application; @@ -36,6 +37,7 @@ import android.app.ITransientNotificationCallback; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.hardware.display.DisplayManager; import android.os.Binder; import android.os.Build; import android.os.Parcel; @@ -74,6 +76,8 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; +import java.util.Arrays; + @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper @@ -400,6 +404,18 @@ public class ToastUITest extends SysuiTestCase { verify(mToastLogger, never()).logOnHideToast(PACKAGE_NAME_1, TOKEN_1.toString()); } + @Test + public void testShowToast_invalidDisplayId_logsAndSkipsToast() { + int invalidDisplayId = getInvalidDisplayId(); + + mToastUI.showToast(UID_1, PACKAGE_NAME_1, TOKEN_1, TEXT, WINDOW_TOKEN_1, Toast.LENGTH_LONG, + mCallback, invalidDisplayId); + + verify(mToastLogger).logOnSkipToastForInvalidDisplay(PACKAGE_NAME_1, TOKEN_1.toString(), + invalidDisplayId); + verifyZeroInteractions(mWindowManager); + } + private View verifyWmAddViewAndAttachToParent() { ArgumentCaptor viewCaptor = ArgumentCaptor.forClass(View.class); verify(mWindowManager).addView(viewCaptor.capture(), any()); @@ -416,4 +432,10 @@ public class ToastUITest extends SysuiTestCase { return null; }; } + + private int getInvalidDisplayId() { + return Arrays.stream( + mContext.getSystemService(DisplayManager.class).getDisplays()) + .map(Display::getDisplayId).max(Integer::compare).get() + 1; + } }