Loading packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt +10 −0 Original line number Diff line number Diff line Loading @@ -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, Loading packages/SystemUI/src/com/android/systemui/toast/ToastUI.java +9 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java +22 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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<View> viewCaptor = ArgumentCaptor.forClass(View.class); verify(mWindowManager).addView(viewCaptor.capture(), any()); Loading @@ -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; } } Loading
packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt +10 −0 Original line number Diff line number Diff line Loading @@ -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, Loading
packages/SystemUI/src/com/android/systemui/toast/ToastUI.java +9 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading
packages/SystemUI/tests/src/com/android/systemui/toast/ToastUITest.java +22 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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<View> viewCaptor = ArgumentCaptor.forClass(View.class); verify(mWindowManager).addView(viewCaptor.capture(), any()); Loading @@ -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; } }