From 411d58d330eafb093fe7edfa3fcccfadfc470076 Mon Sep 17 00:00:00 2001 From: Jae Seo Date: Wed, 22 Apr 2015 16:21:08 -0700 Subject: [PATCH] TIF: Cache multiple app private commands Bug: 19809952 Change-Id: I458ab436761e8fd7e54fc7f49d86550e7945dca9 --- media/java/android/media/tv/TvView.java | 30 ++++++++++++------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java index 9451f69aa49ca..fd5d64739f42b 100644 --- a/media/java/android/media/tv/TvView.java +++ b/media/java/android/media/tv/TvView.java @@ -31,6 +31,7 @@ import android.os.Handler; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; +import android.util.Pair; import android.view.InputEvent; import android.view.KeyEvent; import android.view.MotionEvent; @@ -42,7 +43,9 @@ import android.view.ViewGroup; import android.view.ViewRootImpl; import java.lang.ref.WeakReference; +import java.util.ArrayDeque; import java.util.List; +import java.util.Queue; /** * Displays TV contents. The TvView class provides a high level interface for applications to show @@ -83,8 +86,7 @@ public class TvView extends ViewGroup { private OnUnhandledInputEventListener mOnUnhandledInputEventListener; private Float mStreamVolume; private Boolean mCaptionEnabled; - private String mAppPrivateCommandAction; - private Bundle mAppPrivateCommandData; + private final Queue> mPendingAppPrivateCommands = new ArrayDeque<>(); private boolean mSurfaceChanged; private int mSurfaceFormat; @@ -501,12 +503,9 @@ public class TvView extends ViewGroup { if (mSession != null) { mSession.sendAppPrivateCommand(action, data); } else { - Log.w(TAG, "sendAppPrivateCommand - session not created (action " + action + " cached)"); - if (mAppPrivateCommandAction != null) { - Log.w(TAG, "previous cached action " + action + " removed"); - } - mAppPrivateCommandAction = action; - mAppPrivateCommandData = data; + Log.w(TAG, "sendAppPrivateCommand - session not yet created (action \"" + action + + "\" pending)"); + mPendingAppPrivateCommands.add(Pair.create(action, data)); } } @@ -728,8 +727,7 @@ public class TvView extends ViewGroup { } private void release() { - mAppPrivateCommandAction = null; - mAppPrivateCommandData = null; + mPendingAppPrivateCommands.clear(); setSessionSurface(null); removeSessionOverlayView(); @@ -1002,6 +1000,12 @@ public class TvView extends ViewGroup { } mSession = session; if (session != null) { + // Sends the pending app private commands first. + for (Pair command : mPendingAppPrivateCommands) { + mSession.sendAppPrivateCommand(command.first, command.second); + } + mPendingAppPrivateCommands.clear(); + synchronized (sMainTvViewLock) { if (hasWindowFocus() && TvView.this == sMainTvView.get()) { mSession.setMain(); @@ -1024,12 +1028,6 @@ public class TvView extends ViewGroup { mSession.setCaptionEnabled(mCaptionEnabled); } mSession.tune(mChannelUri, mTuneParams); - if (mAppPrivateCommandAction != null) { - mSession.sendAppPrivateCommand( - mAppPrivateCommandAction, mAppPrivateCommandData); - mAppPrivateCommandAction = null; - mAppPrivateCommandData = null; - } ensurePositionTracking(); } else { mSessionCallback = null;