Merge "Fix NPE in systemui when showing up toast on released display." into udc-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
06fe5e124b
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user