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

This commit is contained in:
Ján Sebechlebský
2023-07-13 16:43:18 +00:00
committed by Android (Google) Code Review
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(
logLevel: LogLevel,
initializer: LogMessage.() -> Unit,

View File

@@ -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);

View File

@@ -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<View> 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;
}
}