Fix NPE in systemui when showing up toast on released display.
Bug: 265325338 Test: atest ToastTest ToastUITest Change-Id: I3562040ce50a8550f7d9aac7c833e0dc2fd672ce
This commit is contained in:
committed by
Ján Sebechlebský
parent
a4ddb0e5fd
commit
a98087e968
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user