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

Commit e78dd5f0 authored by Bill Lin's avatar Bill Lin
Browse files

Fix NPE when device do NOT has FEATURE_PICTURE_IN_PICTURE

Some project may be config FEATURE_PICTURE_IN_PICTURE = false
If device not support PIP, components in PipController won't initialized,
but OverviewProxyService PipController APIs will lead NPE

Solution: Check if device has system PIP feature before calling

Bug: 161118569
Fixes: 167390795
Test: make SystemUI
Test: make ArcSystemUI
Test: lunch aosp_tv_arm-userdebug & make
Test: atest WindowManagerShellTests
Test: atest SystemUITests
Test: adb shell input keyevent 171(KEYCODE_WINDOW)
Test: manual test Pip demo AP
Change-Id: I0ac17901f31623f04ad5e6787be0f4f25e6066c5
parent 8f36c6e5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -280,6 +280,7 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac
        PackageManager pm = context.getPackageManager();
        boolean supportsPip = pm.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
        if (!supportsPip) {
            Log.w(TAG, "Device not support PIP feature");
            return;
        }

+12 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.recents;

import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.view.MotionEvent.ACTION_CANCEL;
import static android.view.MotionEvent.ACTION_DOWN;
@@ -143,6 +144,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
    private int mConnectionBackoffAttempts;
    private boolean mBound;
    private boolean mIsEnabled;
    private boolean mHasPipFeature;
    private int mCurrentBoundedUserId = -1;
    private float mNavBarButtonAlpha;
    private boolean mInputFocusTransferStarted;
@@ -383,7 +385,9 @@ public class OverviewProxyService extends CurrentUserTracker implements

        @Override
        public void setShelfHeight(boolean visible, int shelfHeight) {
            if (!verifyCaller("setShelfHeight")) {
            if (!verifyCaller("setShelfHeight") || !mHasPipFeature) {
                Log.w(TAG_OPS,
                        "ByPass setShelfHeight, FEATURE_PICTURE_IN_PICTURE:" + mHasPipFeature);
                return;
            }
            long token = Binder.clearCallingIdentity();
@@ -409,7 +413,9 @@ public class OverviewProxyService extends CurrentUserTracker implements

        @Override
        public void notifySwipeToHomeFinished() {
            if (!verifyCaller("notifySwipeToHomeFinished")) {
            if (!verifyCaller("notifySwipeToHomeFinished") || !mHasPipFeature) {
                Log.w(TAG_OPS, "ByPass notifySwipeToHomeFinished, FEATURE_PICTURE_IN_PICTURE:"
                        + mHasPipFeature);
                return;
            }
            long token = Binder.clearCallingIdentity();
@@ -424,7 +430,9 @@ public class OverviewProxyService extends CurrentUserTracker implements

        @Override
        public void setPinnedStackAnimationListener(IPinnedStackAnimationListener listener) {
            if (!verifyCaller("setPinnedStackAnimationListener")) {
            if (!verifyCaller("setPinnedStackAnimationListener") || !mHasPipFeature) {
                Log.w(TAG_OPS, "ByPass setPinnedStackAnimationListener, FEATURE_PICTURE_IN_PICTURE:"
                        + mHasPipFeature);
                return;
            }
            long token = Binder.clearCallingIdentity();
@@ -617,6 +625,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
        super(broadcastDispatcher);
        mContext = context;
        mPipOptional = pipOptional;
        mHasPipFeature = mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
        mStatusBarOptionalLazy = statusBarOptionalLazy;
        mHandler = new Handler();
        mNavBarControllerLazy = navBarControllerLazy;