Merge "Fix NPE in systemui when showing up toast on released display." into udc-qpr-dev am: 06fe5e124b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24028668

Change-Id: I6cfd64e1c6d97a4dddf39319403f6de3f704297c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Ján Sebechlebský
2023-07-13 17:23:21 +00:00
committed by Automerger Merge Worker
3 changed files with 41 additions and 2 deletions

View File

@@ -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( private inline fun log(
logLevel: LogLevel, logLevel: LogLevel,
initializer: LogMessage.() -> Unit, initializer: LogMessage.() -> Unit,

View File

@@ -32,6 +32,7 @@ import android.os.IBinder;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.util.Log; import android.util.Log;
import android.view.Display;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.IAccessibilityManager; import android.view.accessibility.IAccessibilityManager;
import android.widget.ToastPresenter; import android.widget.ToastPresenter;
@@ -115,8 +116,14 @@ public class ToastUI implements CoreStartable, CommandQueue.Callbacks {
Context context = mContext.createContextAsUser(userHandle, 0); Context context = mContext.createContextAsUser(userHandle, 0);
DisplayManager mDisplayManager = mContext.getSystemService(DisplayManager.class); DisplayManager mDisplayManager = mContext.getSystemService(DisplayManager.class);
Context displayContext = context.createDisplayContext( Display display = mDisplayManager.getDisplay(displayId);
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, mToast = mToastFactory.createToast(mContext /* sysuiContext */, text, packageName,
userHandle.getIdentifier(), mOrientation); userHandle.getIdentifier(), mOrientation);

View File

@@ -28,6 +28,7 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.Application; import android.app.Application;
@@ -36,6 +37,7 @@ import android.app.ITransientNotificationCallback;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.hardware.display.DisplayManager;
import android.os.Binder; import android.os.Binder;
import android.os.Build; import android.os.Build;
import android.os.Parcel; import android.os.Parcel;
@@ -74,6 +76,8 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import java.util.Arrays;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper @TestableLooper.RunWithLooper
@@ -400,6 +404,18 @@ public class ToastUITest extends SysuiTestCase {
verify(mToastLogger, never()).logOnHideToast(PACKAGE_NAME_1, TOKEN_1.toString()); 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() { private View verifyWmAddViewAndAttachToParent() {
ArgumentCaptor<View> viewCaptor = ArgumentCaptor.forClass(View.class); ArgumentCaptor<View> viewCaptor = ArgumentCaptor.forClass(View.class);
verify(mWindowManager).addView(viewCaptor.capture(), any()); verify(mWindowManager).addView(viewCaptor.capture(), any());
@@ -416,4 +432,10 @@ public class ToastUITest extends SysuiTestCase {
return null; return null;
}; };
} }
private int getInvalidDisplayId() {
return Arrays.stream(
mContext.getSystemService(DisplayManager.class).getDisplays())
.map(Display::getDisplayId).max(Integer::compare).get() + 1;
}
} }