From 21e0421235b2b0b29119264b99504eccad099744 Mon Sep 17 00:00:00 2001 From: Jaewan Kim Date: Mon, 21 Mar 2016 14:22:33 +0900 Subject: [PATCH] PIP: Prevent PipOverlayActivity from restarting PipManager moves the PIPed activity to fullscreen if the activity is restarted. It's because the activity may be started by the Launcher or an intent again, but we don't want do so for the PipOverlayActivity. Bug: 27689029 Change-Id: Icebc09e22e5f5f4650fcdbfdd8c452b7cf23844b --- .../android/systemui/tv/pip/PipManager.java | 7 +--- .../systemui/tv/pip/PipOverlayActivity.java | 38 +++++++++++++++++-- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java index ff7ea276aa911..b4cb955eb7f5c 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java @@ -152,6 +152,7 @@ public class PipManager { private final Runnable mOnPinnedActivityRestartAttempt = new Runnable() { @Override public void run() { + // If PIPed activity is launched again by Launcher or intent, make it fullscreen. movePipToFullscreen(); } }; @@ -315,11 +316,7 @@ public class PipManager { private void showPipOverlay() { if (DEBUG) Log.d(TAG, "showPipOverlay()"); mState = STATE_PIP_OVERLAY; - Intent intent = new Intent(mContext, PipOverlayActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - final ActivityOptions options = ActivityOptions.makeBasic(); - options.setLaunchStackId(PINNED_STACK_ID); - mContext.startActivity(intent, options.toBundle()); + PipOverlayActivity.showPipOverlay(mContext); } /** diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipOverlayActivity.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipOverlayActivity.java index 95d655c2f3200..4bd3f49e1fc8e 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipOverlayActivity.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipOverlayActivity.java @@ -17,21 +17,31 @@ package com.android.systemui.tv.pip; import android.app.Activity; +import android.app.ActivityOptions; +import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.view.View; import com.android.systemui.R; +import static android.app.ActivityManager.StackId.PINNED_STACK_ID; + /** * Activity to show an overlay on top of PIP activity to show how to pop up PIP menu. */ public class PipOverlayActivity extends Activity implements PipManager.Listener { - private static final String TAG = "PipOverlayActivity"; - private static final boolean DEBUG = false; - private static final long SHOW_GUIDE_OVERLAY_VIEW_DURATION_MS = 4000; + /** + * The single instance of PipOverlayActivity to prevent it from restarting. + * Note that {@link PipManager} moves the PIPed activity to fullscreen if the activity is + * restarted. It's because the activity may be started by the Launcher or an intent again, + * but we don't want do so for the PipOverlayActivity. + */ + private static PipOverlayActivity sPipOverlayActivity; + private final PipManager mPipManager = PipManager.getInstance(); private final Handler mHandler = new Handler(); private View mGuideOverlayView; @@ -42,6 +52,19 @@ public class PipOverlayActivity extends Activity implements PipManager.Listener } }; + /** + * Launches the PIP overlay. This should be only called on the main thread. + */ + public static void showPipOverlay(Context context) { + if (sPipOverlayActivity == null) { + Intent intent = new Intent(context, PipOverlayActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + final ActivityOptions options = ActivityOptions.makeBasic(); + options.setLaunchStackId(PINNED_STACK_ID); + context.startActivity(intent, options.toBundle()); + } + } + @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); @@ -49,6 +72,8 @@ public class PipOverlayActivity extends Activity implements PipManager.Listener mGuideOverlayView = findViewById(R.id.guide_overlay); mGuideButtonsView = findViewById(R.id.guide_buttons); mPipManager.addListener(this); + + sPipOverlayActivity = this; } @Override @@ -76,6 +101,7 @@ public class PipOverlayActivity extends Activity implements PipManager.Listener @Override protected void onDestroy() { super.onDestroy(); + sPipOverlayActivity = null; mHandler.removeCallbacksAndMessages(null); mPipManager.removeListener(this); mPipManager.resumePipResizing( @@ -107,4 +133,10 @@ public class PipOverlayActivity extends Activity implements PipManager.Listener @Override public void onMediaControllerChanged() { } + + @Override + public void finish() { + sPipOverlayActivity = null; + super.finish(); + } }