From e78dd5f06870cdf98b1627345efe8ed69950105c Mon Sep 17 00:00:00 2001 From: Bill Lin Date: Wed, 2 Sep 2020 00:56:18 +0800 Subject: [PATCH] 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 --- .../android/systemui/pip/phone/PipController.java | 1 + .../systemui/recents/OverviewProxyService.java | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipController.java index 1a805daef77ec..6998e90b3a7c7 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipController.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipController.java @@ -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; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 62b35f9f5e2d0..56f010d7e8665 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -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;