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

Commit e0a83eb6 authored by Ján Sebechlebský's avatar Ján Sebechlebský Committed by Automerger Merge Worker
Browse files

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

Merge "Fix NPE in systemui when showing up toast on released display." into udc-qpr-dev am: 06fe5e12 am: 46c51d08

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24028668



Change-Id: I28d7e5397704ee13b5ba2ca7f3a5cfa533ba5e25
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 84e296e6 46c51d08
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;
    }
}