Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06fe5e12 authored by Ján Sebechlebský's avatar Ján Sebechlebský Committed by Android (Google) Code Review
Browse files

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

parents b8d99735 a98087e9
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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,
+9 −2
Original line number Diff line number Diff line
@@ -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);

+22 −0
Original line number Diff line number Diff line
@@ -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;
    }
}