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

Commit a98087e9 authored by Jan Sebechlebsky's avatar Jan Sebechlebsky Committed by Ján Sebechlebský
Browse files

Fix NPE in systemui when showing up toast on released display.

Bug: 265325338
Test: atest ToastTest ToastUITest
Change-Id: I3562040ce50a8550f7d9aac7c833e0dc2fd672ce
parent a4ddb0e5
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;
    }
}