aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/ui/TvViewUiManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/tv/ui/TvViewUiManager.java')
-rw-r--r--src/com/android/tv/ui/TvViewUiManager.java408
1 files changed, 79 insertions, 329 deletions
diff --git a/src/com/android/tv/ui/TvViewUiManager.java b/src/com/android/tv/ui/TvViewUiManager.java
index bf874fc7..f042987a 100644
--- a/src/com/android/tv/ui/TvViewUiManager.java
+++ b/src/com/android/tv/ui/TvViewUiManager.java
@@ -24,21 +24,19 @@ import android.animation.TimeInterpolator;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Point;
import android.hardware.display.DisplayManager;
+import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.preference.PreferenceManager;
import android.util.Log;
import android.util.Property;
import android.view.Display;
-import android.view.Gravity;
-import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.MarginLayoutParams;
@@ -52,9 +50,8 @@ import com.android.tv.data.DisplayMode;
import com.android.tv.util.TvSettings;
/**
- * The TvViewUiManager is responsible for handling UI layouting and animation of main and PIP
- * TvViews. It also control the settings regarding TvView UI such as display mode, PIP layout,
- * and PIP size.
+ * The TvViewUiManager is responsible for handling UI layouting and animation of main TvView.
+ * It also control the settings regarding TvView UI such as display mode.
*/
public class TvViewUiManager {
private static final String TAG = "TvViewManager";
@@ -69,42 +66,44 @@ public class TvViewUiManager {
private final Resources mResources;
private final FrameLayout mContentView;
private final TunableTvView mTvView;
- private final TunableTvView mPipView;
private final TvOptionsManager mTvOptionsManager;
- private final int mTvViewPapWidth;
private final int mTvViewShrunkenStartMargin;
private final int mTvViewShrunkenEndMargin;
- private final int mTvViewPapStartMargin;
- private final int mTvViewPapEndMargin;
private int mWindowWidth;
private int mWindowHeight;
- private final int mPipViewHorizontalMargin;
- private final int mPipViewTopMargin;
- private final int mPipViewBottomMargin;
private final SharedPreferences mSharedPreferences;
private final TimeInterpolator mLinearOutSlowIn;
private final TimeInterpolator mFastOutLinearIn;
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch(msg.what) {
- case MSG_SET_LAYOUT_PARAMS:
- FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) msg.obj;
- if (DEBUG) {
- Log.d(TAG, "setFixedSize: w=" + layoutParams.width + " h="
- + layoutParams.height);
- }
- mTvView.setLayoutParams(layoutParams);
- // Smooth PIP size change, we don't change surface size when
- // isInPictureInPictureMode is true.
- if (!Features.PICTURE_IN_PICTURE.isEnabled(mContext)
- || !((Activity) mContext).isInPictureInPictureMode()) {
- mTvView.setFixedSurfaceSize(layoutParams.width, layoutParams.height);
+ private final Handler mHandler =
+ new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_SET_LAYOUT_PARAMS:
+ FrameLayout.LayoutParams layoutParams =
+ (FrameLayout.LayoutParams) msg.obj;
+ if (DEBUG) {
+ Log.d(
+ TAG,
+ "setFixedSize: w="
+ + layoutParams.width
+ + " h="
+ + layoutParams.height);
+ }
+ mTvView.setTvViewLayoutParams(layoutParams);
+ mTvView.setLayoutParams(mTvViewFrame);
+ // Smooth PIP size change, we don't change surface size when
+ // isInPictureInPictureMode is true.
+ if (!Features.PICTURE_IN_PICTURE.isEnabled(mContext)
+ || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
+ && !((Activity) mContext).isInPictureInPictureMode())) {
+ mTvView.setFixedSurfaceSize(
+ layoutParams.width, layoutParams.height);
+ }
+ break;
}
- break;
- }
- }
- };
+ }
+ };
private int mDisplayMode;
// Used to restore the previous state from ShrunkenTvView state.
private int mTvViewStartMarginBeforeShrunken;
@@ -113,16 +112,13 @@ public class TvViewUiManager {
private boolean mIsUnderShrunkenTvView;
private int mTvViewStartMargin;
private int mTvViewEndMargin;
- private int mPipLayout;
- private int mPipSize;
- private boolean mPipStarted;
private ObjectAnimator mTvViewAnimator;
private FrameLayout.LayoutParams mTvViewLayoutParams;
// TV view's position when the display mode is FULL. It is used to compute PIP location relative
// to TV view's position.
- private MarginLayoutParams mTvViewFrame;
- private MarginLayoutParams mLastAnimatedTvViewFrame;
- private MarginLayoutParams mOldTvViewFrame;
+ private FrameLayout.LayoutParams mTvViewFrame;
+ private FrameLayout.LayoutParams mLastAnimatedTvViewFrame;
+ private FrameLayout.LayoutParams mOldTvViewFrame;
private ObjectAnimator mBackgroundAnimator;
private int mBackgroundColor;
private int mAppliedDisplayedMode = DisplayMode.MODE_NOT_DEFINED;
@@ -130,12 +126,11 @@ public class TvViewUiManager {
private int mAppliedTvViewEndMargin;
private float mAppliedVideoDisplayAspectRatio;
- public TvViewUiManager(Context context, TunableTvView tvView, TunableTvView pipView,
+ public TvViewUiManager(Context context, TunableTvView tvView,
FrameLayout contentView, TvOptionsManager tvOptionManager) {
mContext = context;
mResources = mContext.getResources();
mTvView = tvView;
- mPipView = pipView;
mContentView = contentView;
mTvOptionsManager = tvOptionManager;
@@ -147,18 +142,12 @@ public class TvViewUiManager {
mWindowWidth = size.x;
mWindowHeight = size.y;
- // Have an assumption that PIP and TvView Shrinking happens only in full screen.
+ // Have an assumption that TvView Shrinking happens only in full screen.
mTvViewShrunkenStartMargin = mResources
.getDimensionPixelOffset(R.dimen.shrunken_tvview_margin_start);
mTvViewShrunkenEndMargin =
mResources.getDimensionPixelOffset(R.dimen.shrunken_tvview_margin_end)
+ mResources.getDimensionPixelSize(R.dimen.side_panel_width);
- int papMarginHorizontal = mResources
- .getDimensionPixelOffset(R.dimen.papview_margin_horizontal);
- int papSpacing = mResources.getDimensionPixelOffset(R.dimen.papview_spacing);
- mTvViewPapWidth = (mWindowWidth - papSpacing) / 2 - papMarginHorizontal;
- mTvViewPapStartMargin = papMarginHorizontal + mTvViewPapWidth + papSpacing;
- mTvViewPapEndMargin = papMarginHorizontal;
mTvViewFrame = createMarginLayoutParams(0, 0, 0, 0);
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
@@ -167,11 +156,6 @@ public class TvViewUiManager {
.loadInterpolator(mContext, android.R.interpolator.linear_out_slow_in);
mFastOutLinearIn = AnimationUtils
.loadInterpolator(mContext, android.R.interpolator.fast_out_linear_in);
-
- mPipViewHorizontalMargin = mResources
- .getDimensionPixelOffset(R.dimen.pipview_margin_horizontal);
- mPipViewTopMargin = mResources.getDimensionPixelOffset(R.dimen.pipview_margin_top);
- mPipViewBottomMargin = mResources.getDimensionPixelOffset(R.dimen.pipview_margin_bottom);
}
public void onConfigurationChanged(final int windowWidth, final int windowHeight) {
@@ -200,18 +184,11 @@ public class TvViewUiManager {
*/
public void startShrunkenTvView() {
mIsUnderShrunkenTvView = true;
+ mTvView.setIsUnderShrunken(true);
mTvViewStartMarginBeforeShrunken = mTvViewStartMargin;
mTvViewEndMarginBeforeShrunken = mTvViewEndMargin;
- if (mPipStarted && getPipLayout() == TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
- float sidePanelWidth = mResources.getDimensionPixelOffset(R.dimen.side_panel_width);
- float factor = 1.0f - sidePanelWidth / mWindowWidth;
- int startMargin = (int) (mTvViewPapStartMargin * factor);
- int endMargin = (int) (mTvViewPapEndMargin * factor + sidePanelWidth);
- setTvViewMargin(startMargin, endMargin);
- } else {
- setTvViewMargin(mTvViewShrunkenStartMargin, mTvViewShrunkenEndMargin);
- }
+ setTvViewMargin(mTvViewShrunkenStartMargin, mTvViewShrunkenEndMargin);
mDisplayModeBeforeShrunken = setDisplayMode(DisplayMode.MODE_NORMAL, false, true);
}
@@ -221,6 +198,7 @@ public class TvViewUiManager {
*/
public void endShrunkenTvView() {
mIsUnderShrunkenTvView = false;
+ mTvView.setIsUnderShrunken(false);
setTvViewMargin(mTvViewStartMarginBeforeShrunken, mTvViewEndMarginBeforeShrunken);
setDisplayMode(mDisplayModeBeforeShrunken, false, true);
}
@@ -296,9 +274,9 @@ public class TvViewUiManager {
}
/**
- * Updates TvView. It is called when video resolution is updated.
+ * Updates TvView's aspect ratio. It should be called when video resolution is changed.
*/
- public void updateTvView() {
+ public void updateTvAspectRatio() {
applyDisplayMode(mTvView.getVideoDisplayAspectRatio(), false, false);
if (mTvView.isVideoAvailable() && mTvView.isFadedOut()) {
mTvView.fadeIn(mResources.getInteger(R.integer.tvview_fade_in_duration),
@@ -327,120 +305,6 @@ public class TvViewUiManager {
}
/**
- * Returns the current PIP layout. The layout should be one of
- * {@link TvSettings#PIP_LAYOUT_BOTTOM_RIGHT}, {@link TvSettings#PIP_LAYOUT_TOP_RIGHT},
- * {@link TvSettings#PIP_LAYOUT_TOP_LEFT}, {@link TvSettings#PIP_LAYOUT_BOTTOM_LEFT} and
- * {@link TvSettings#PIP_LAYOUT_SIDE_BY_SIDE}.
- */
- public int getPipLayout() {
- return mPipLayout;
- }
-
- /**
- * Sets the PIP layout. The layout should be one of
- * {@link TvSettings#PIP_LAYOUT_BOTTOM_RIGHT}, {@link TvSettings#PIP_LAYOUT_TOP_RIGHT},
- * {@link TvSettings#PIP_LAYOUT_TOP_LEFT}, {@link TvSettings#PIP_LAYOUT_BOTTOM_LEFT} and
- * {@link TvSettings#PIP_LAYOUT_SIDE_BY_SIDE}.
- *
- * @param storeInPreference if true, the stored value will be restored by
- * {@link #restorePipLayout()}.
- */
- public void setPipLayout(int pipLayout, boolean storeInPreference) {
- mPipLayout = pipLayout;
- if (storeInPreference) {
- TvSettings.setPipLayout(mContext, pipLayout);
- }
- updatePipView(mTvViewFrame);
- if (mPipLayout == TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
- setTvViewMargin(mTvViewPapStartMargin, mTvViewPapEndMargin);
- setDisplayMode(DisplayMode.MODE_NORMAL, false, false);
- } else {
- setTvViewMargin(0, 0);
- restoreDisplayMode(false);
- }
- mTvOptionsManager.onPipLayoutChanged(pipLayout);
- }
-
- /**
- * Restores the PIP layout which {@link #setPipLayout} lastly stores.
- */
- public void restorePipLayout() {
- setPipLayout(TvSettings.getPipLayout(mContext), false);
- }
-
- /**
- * Called when PIP is started.
- */
- public void onPipStart() {
- mPipStarted = true;
- updatePipView();
- mPipView.setVisibility(View.VISIBLE);
- }
-
- /**
- * Called when PIP is stopped.
- */
- public void onPipStop() {
- setTvViewMargin(0, 0);
- mPipView.setVisibility(View.GONE);
- mPipStarted = false;
- }
-
- /**
- * Called when PIP is resumed.
- */
- public void showPipForResume() {
- mPipView.setVisibility(View.VISIBLE);
- }
-
- /**
- * Called when PIP is paused.
- */
- public void hidePipForPause() {
- if (mPipLayout != TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
- mPipView.setVisibility(View.GONE);
- }
- }
-
- /**
- * Updates PIP view. It is usually called, when video resolution in PIP is updated.
- */
- public void updatePipView() {
- updatePipView(mTvViewFrame);
- }
-
- /**
- * Returns the size of the PIP view.
- */
- public int getPipSize() {
- return mPipSize;
- }
-
- /**
- * Sets PIP size and applies it immediately.
- *
- * @param pipSize PIP size. The value should be one of {@link TvSettings#PIP_SIZE_BIG}
- * and {@link TvSettings#PIP_SIZE_SMALL}.
- * @param storeInPreference if true, the stored value will be restored by
- * {@link #restorePipSize()}.
- */
- public void setPipSize(int pipSize, boolean storeInPreference) {
- mPipSize = pipSize;
- if (storeInPreference) {
- TvSettings.setPipSize(mContext, pipSize);
- }
- updatePipView(mTvViewFrame);
- mTvOptionsManager.onPipSizeChanged(pipSize);
- }
-
- /**
- * Restores the PIP size which {@link #setPipSize} lastly stores.
- */
- public void restorePipSize() {
- setPipSize(TvSettings.getPipSize(mContext), false);
- }
-
- /**
* This margins will be applied when applyDisplayMode is called.
*/
private void setTvViewMargin(int tvViewStartMargin, int tvViewEndMargin) {
@@ -488,14 +352,14 @@ public class TvViewUiManager {
}
private void setTvViewPosition(final FrameLayout.LayoutParams layoutParams,
- MarginLayoutParams tvViewFrame, boolean animate) {
+ FrameLayout.LayoutParams tvViewFrame, boolean animate) {
if (DEBUG) {
Log.d(TAG, "setTvViewPosition: w=" + layoutParams.width + " h=" + layoutParams.height
+ " s=" + layoutParams.getMarginStart() + " t=" + layoutParams.topMargin
+ " e=" + layoutParams.getMarginEnd() + " b=" + layoutParams.bottomMargin
+ " animate=" + animate);
}
- MarginLayoutParams oldTvViewFrame = mTvViewFrame;
+ FrameLayout.LayoutParams oldTvViewFrame = mTvViewFrame;
mTvViewLayoutParams = layoutParams;
mTvViewFrame = tvViewFrame;
if (animate) {
@@ -503,11 +367,11 @@ public class TvViewUiManager {
if (mTvViewAnimator.isStarted()) {
// Cancel the current animation and start new one.
mTvViewAnimator.cancel();
- mOldTvViewFrame = mLastAnimatedTvViewFrame;
+ mOldTvViewFrame = new FrameLayout.LayoutParams(mLastAnimatedTvViewFrame);
} else {
- mOldTvViewFrame = oldTvViewFrame;
+ mOldTvViewFrame = new FrameLayout.LayoutParams(oldTvViewFrame);
}
- mTvViewAnimator.setObjectValues(mTvView.getLayoutParams(), layoutParams);
+ mTvViewAnimator.setObjectValues(mTvView.getTvViewLayoutParams(), layoutParams);
mTvViewAnimator.setEvaluator(new TypeEvaluator<FrameLayout.LayoutParams>() {
FrameLayout.LayoutParams lp;
@Override
@@ -517,7 +381,7 @@ public class TvViewUiManager {
lp = new FrameLayout.LayoutParams(0, 0);
lp.gravity = startValue.gravity;
}
- interpolateMarginsRelative(lp, startValue, endValue, fraction);
+ interpolateMargins(lp, startValue, endValue, fraction);
return lp;
}
});
@@ -538,116 +402,10 @@ public class TvViewUiManager {
mHandler.removeMessages(MSG_SET_LAYOUT_PARAMS);
mHandler.obtainMessage(MSG_SET_LAYOUT_PARAMS, layoutParams).sendToTarget();
} else {
- mTvView.setLayoutParams(layoutParams);
- }
- updatePipView(mTvViewFrame);
- }
- }
-
- /**
- * The redlines assume that the ratio of the TV screen is 16:9. If the radio is not 16:9, the
- * layout of PAP can be broken.
- */
- @SuppressLint("RtlHardcoded")
- private void updatePipView(MarginLayoutParams tvViewFrame) {
- if (!mPipStarted) {
- return;
- }
- int width;
- int height;
- int startMargin;
- int endMargin;
- int topMargin;
- int bottomMargin;
- int gravity;
-
- if (mPipLayout == TvSettings.PIP_LAYOUT_SIDE_BY_SIDE) {
- gravity = Gravity.CENTER_VERTICAL | Gravity.START;
- height = tvViewFrame.height;
- float videoDisplayAspectRatio = mPipView.getVideoDisplayAspectRatio();
- if (videoDisplayAspectRatio <= 0f) {
- width = tvViewFrame.width;
- } else {
- width = (int) (height * videoDisplayAspectRatio);
- if (width > tvViewFrame.width) {
- width = tvViewFrame.width;
- }
- }
- startMargin = mResources.getDimensionPixelOffset(R.dimen.papview_margin_horizontal)
- * tvViewFrame.width / mTvViewPapWidth + (tvViewFrame.width - width) / 2;
- endMargin = 0;
- topMargin = 0;
- bottomMargin = 0;
- } else {
- int tvViewWidth = tvViewFrame.width;
- int tvViewHeight = tvViewFrame.height;
- int tvStartMargin = tvViewFrame.getMarginStart();
- int tvEndMargin = tvViewFrame.getMarginEnd();
- int tvTopMargin = tvViewFrame.topMargin;
- int tvBottomMargin = tvViewFrame.bottomMargin;
- float horizontalScaleFactor = (float) tvViewWidth / mWindowWidth;
- float verticalScaleFactor = (float) tvViewHeight / mWindowHeight;
-
- int maxWidth;
- if (mPipSize == TvSettings.PIP_SIZE_SMALL) {
- maxWidth = (int) (mResources.getDimensionPixelSize(R.dimen.pipview_small_size_width)
- * horizontalScaleFactor);
- height = (int) (mResources.getDimensionPixelSize(R.dimen.pipview_small_size_height)
- * verticalScaleFactor);
- } else if (mPipSize == TvSettings.PIP_SIZE_BIG) {
- maxWidth = (int) (mResources.getDimensionPixelSize(R.dimen.pipview_large_size_width)
- * horizontalScaleFactor);
- height = (int) (mResources.getDimensionPixelSize(R.dimen.pipview_large_size_height)
- * verticalScaleFactor);
- } else {
- throw new IllegalArgumentException("Invalid PIP size: " + mPipSize);
- }
- float videoDisplayAspectRatio = mPipView.getVideoDisplayAspectRatio();
- if (videoDisplayAspectRatio <= 0f) {
- width = maxWidth;
- } else {
- width = (int) (height * videoDisplayAspectRatio);
- if (width > maxWidth) {
- width = maxWidth;
- }
- }
-
- startMargin = tvStartMargin + (int) (mPipViewHorizontalMargin * horizontalScaleFactor);
- endMargin = tvEndMargin + (int) (mPipViewHorizontalMargin * horizontalScaleFactor);
- topMargin = tvTopMargin + (int) (mPipViewTopMargin * verticalScaleFactor);
- bottomMargin = tvBottomMargin + (int) (mPipViewBottomMargin * verticalScaleFactor);
-
- switch (mPipLayout) {
- case TvSettings.PIP_LAYOUT_TOP_LEFT:
- gravity = Gravity.TOP | Gravity.LEFT;
- break;
- case TvSettings.PIP_LAYOUT_TOP_RIGHT:
- gravity = Gravity.TOP | Gravity.RIGHT;
- break;
- case TvSettings.PIP_LAYOUT_BOTTOM_LEFT:
- gravity = Gravity.BOTTOM | Gravity.LEFT;
- break;
- case TvSettings.PIP_LAYOUT_BOTTOM_RIGHT:
- gravity = Gravity.BOTTOM | Gravity.RIGHT;
- break;
- default:
- throw new IllegalArgumentException("Invalid PIP location: " + mPipLayout);
+ mTvView.setTvViewLayoutParams(layoutParams);
+ mTvView.setLayoutParams(mTvViewFrame);
}
}
-
- FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mPipView.getLayoutParams();
- if (lp.width != width || lp.height != height || lp.getMarginStart() != startMargin
- || lp.getMarginEnd() != endMargin || lp.topMargin != topMargin
- || lp.bottomMargin != bottomMargin || lp.gravity != gravity) {
- lp.width = width;
- lp.height = height;
- lp.setMarginStart(startMargin);
- lp.setMarginEnd(endMargin);
- lp.topMargin = topMargin;
- lp.bottomMargin = bottomMargin;
- lp.gravity = gravity;
- mPipView.setLayoutParams(lp);
- }
}
private void initTvAnimatorIfNeeded() {
@@ -663,7 +421,7 @@ public class TvViewUiManager {
// because TvView may request layout itself during animation and layout SurfaceView with
// its own parameters when TvInputService requests to do so.
mTvViewAnimator = new ObjectAnimator();
- mTvViewAnimator.setTarget(mTvView);
+ mTvViewAnimator.setTarget(mTvView.getTvView());
mTvViewAnimator.setProperty(
Property.of(FrameLayout.class, ViewGroup.LayoutParams.class, "layoutParams"));
mTvViewAnimator.setDuration(mResources.getInteger(R.integer.tvview_anim_duration));
@@ -693,10 +451,10 @@ public class TvViewUiManager {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
float fraction = animator.getAnimatedFraction();
- mLastAnimatedTvViewFrame = new MarginLayoutParams(0, 0);
- interpolateMarginsRelative(mLastAnimatedTvViewFrame,
+ mLastAnimatedTvViewFrame = (FrameLayout.LayoutParams) mTvView.getLayoutParams();
+ interpolateMargins(mLastAnimatedTvViewFrame,
mOldTvViewFrame, mTvViewFrame, fraction);
- updatePipView(mLastAnimatedTvViewFrame);
+ mTvView.setLayoutParams(mLastAnimatedTvViewFrame);
}
});
}
@@ -745,66 +503,58 @@ public class TvViewUiManager {
}
int availableAreaWidth = mWindowWidth - mTvViewStartMargin - mTvViewEndMargin;
int availableAreaHeight = availableAreaWidth * mWindowHeight / mWindowWidth;
- FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(0, 0,
- ((FrameLayout.LayoutParams) mTvView.getLayoutParams()).gravity);
int displayMode = mDisplayMode;
- double availableAreaRatio = 0;
- double videoRatio = 0;
+ float availableAreaRatio = 0;
if (availableAreaWidth <= 0 || availableAreaHeight <= 0) {
displayMode = DisplayMode.MODE_FULL;
Log.w(TAG, "Some resolution info is missing during applyDisplayMode. ("
+ "availableAreaWidth=" + availableAreaWidth + ", availableAreaHeight="
+ availableAreaHeight + ")");
} else {
- availableAreaRatio = (double) availableAreaWidth / availableAreaHeight;
- videoRatio = videoDisplayAspectRatio;
+ availableAreaRatio = (float) availableAreaWidth / availableAreaHeight;
}
-
- int tvViewFrameTop = (mWindowHeight - availableAreaHeight) / 2;
- MarginLayoutParams tvViewFrame = createMarginLayoutParams(
- mTvViewStartMargin, mTvViewEndMargin, tvViewFrameTop, tvViewFrameTop);
- layoutParams.width = availableAreaWidth;
- layoutParams.height = availableAreaHeight;
+ FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(0, 0,
+ ((FrameLayout.LayoutParams) mTvView.getTvViewLayoutParams()).gravity);
switch (displayMode) {
- case DisplayMode.MODE_FULL:
- layoutParams.width = availableAreaWidth;
- layoutParams.height = availableAreaHeight;
- break;
case DisplayMode.MODE_ZOOM:
- if (videoRatio < availableAreaRatio) {
+ if (videoDisplayAspectRatio < availableAreaRatio) {
// Y axis will be clipped.
layoutParams.width = availableAreaWidth;
- layoutParams.height = (int) Math.round(availableAreaWidth / videoRatio);
+ layoutParams.height = Math.round(availableAreaWidth / videoDisplayAspectRatio);
} else {
// X axis will be clipped.
- layoutParams.width = (int) Math.round(availableAreaHeight * videoRatio);
+ layoutParams.width = Math.round(availableAreaHeight * videoDisplayAspectRatio);
layoutParams.height = availableAreaHeight;
}
break;
case DisplayMode.MODE_NORMAL:
- if (videoRatio < availableAreaRatio) {
+ if (videoDisplayAspectRatio < availableAreaRatio) {
// X axis has black area.
- layoutParams.width = (int) Math.round(availableAreaHeight * videoRatio);
+ layoutParams.width = Math.round(availableAreaHeight * videoDisplayAspectRatio);
layoutParams.height = availableAreaHeight;
} else {
// Y axis has black area.
layoutParams.width = availableAreaWidth;
- layoutParams.height = (int) Math.round(availableAreaWidth / videoRatio);
+ layoutParams.height = Math.round(availableAreaWidth / videoDisplayAspectRatio);
}
break;
+ case DisplayMode.MODE_FULL:
+ default:
+ layoutParams.width = availableAreaWidth;
+ layoutParams.height = availableAreaHeight;
+ break;
}
-
// FrameLayout has an issue with centering when left and right margins differ.
// So stick to Gravity.START | Gravity.CENTER_VERTICAL.
- int marginStart = mTvViewStartMargin + (availableAreaWidth - layoutParams.width) / 2;
+ int marginStart = (availableAreaWidth - layoutParams.width) / 2;
layoutParams.setMarginStart(marginStart);
- // Set marginEnd as well because setTvViewPosition uses both start/end margin.
- layoutParams.setMarginEnd(mWindowWidth - layoutParams.width - marginStart);
-
+ int tvViewFrameTop = (mWindowHeight - availableAreaHeight) / 2;
+ FrameLayout.LayoutParams tvViewFrame = createMarginLayoutParams(
+ mTvViewStartMargin, mTvViewEndMargin, tvViewFrameTop, tvViewFrameTop);
+ setTvViewPosition(layoutParams, tvViewFrame, animate);
setBackgroundColor(mResources.getColor(isTvViewFullScreen()
? R.color.tvactivity_background : R.color.tvactivity_background_on_shrunken_tvview,
- null), layoutParams, animate);
- setTvViewPosition(layoutParams, tvViewFrame, animate);
+ null), layoutParams, animate);
// Update the current display mode.
mTvOptionsManager.onDisplayModeChanged(displayMode);
@@ -814,7 +564,7 @@ public class TvViewUiManager {
return (int) (start + (end - start) * fraction);
}
- private static void interpolateMarginsRelative(MarginLayoutParams out,
+ private static void interpolateMargins(MarginLayoutParams out,
MarginLayoutParams startValue, MarginLayoutParams endValue, float fraction) {
out.topMargin = interpolate(startValue.topMargin, endValue.topMargin, fraction);
out.bottomMargin = interpolate(startValue.bottomMargin, endValue.bottomMargin, fraction);
@@ -825,9 +575,9 @@ public class TvViewUiManager {
out.height = interpolate(startValue.height, endValue.height, fraction);
}
- private MarginLayoutParams createMarginLayoutParams(
+ private FrameLayout.LayoutParams createMarginLayoutParams(
int startMargin, int endMargin, int topMargin, int bottomMargin) {
- MarginLayoutParams lp = new MarginLayoutParams(0, 0);
+ FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(0, 0);
lp.setMarginStart(startMargin);
lp.setMarginEnd(endMargin);
lp.topMargin = topMargin;
@@ -836,4 +586,4 @@ public class TvViewUiManager {
lp.height = mWindowHeight - topMargin - bottomMargin;
return lp;
}
-}
+} \ No newline at end of file