blob: 09c167ca59ccd86defca8571f2cbc2a252632893 [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tv.ui;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.TextView;
import com.android.tv.R;
import com.android.tv.ui.TunableTvView.BlockScreenType;
public class BlockScreenView extends FrameLayout {
private View mContainerView;
private View mImageContainer;
private ImageView mNormalLockIconView;
private ImageView mShrunkenLockIconView;
private View mSpace;
private TextView mBlockingInfoTextView;
private ImageView mBackgroundImageView;
private final int mSpacingNormal;
private final int mSpacingShrunken;
// Animator used to fade out the whole block screen.
private Animator mFadeOut;
// Animators used to fade in/out the block screen icon and info text.
private Animator mInfoFadeIn;
private Animator mInfoFadeOut;
public BlockScreenView(Context context) {
this(context, null, 0);
}
public BlockScreenView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public BlockScreenView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mSpacingNormal = getResources().getDimensionPixelOffset(
R.dimen.tvview_block_vertical_spacing);
mSpacingShrunken = getResources().getDimensionPixelOffset(
R.dimen.shrunken_tvview_block_vertical_spacing);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mContainerView = findViewById(R.id.block_screen_container);
mImageContainer = findViewById(R.id.image_container);
mNormalLockIconView = (ImageView) findViewById(R.id.block_screen_icon);
mShrunkenLockIconView = (ImageView) findViewById(R.id.block_screen_shrunken_icon);
mSpace = findViewById(R.id.space);
mBlockingInfoTextView = (TextView) findViewById(R.id.block_screen_text);
mBackgroundImageView = (ImageView) findViewById(R.id.background_image);
mFadeOut = AnimatorInflater.loadAnimator(getContext(),
R.animator.tvview_block_screen_fade_out);
mFadeOut.setTarget(this);
mFadeOut.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
setVisibility(GONE);
setBackgroundImage(null);
setAlpha(1.0f);
}
});
mInfoFadeIn = AnimatorInflater.loadAnimator(getContext(),
R.animator.tvview_block_screen_fade_in);
mInfoFadeIn.setTarget(mContainerView);
mInfoFadeOut = AnimatorInflater.loadAnimator(getContext(),
R.animator.tvview_block_screen_fade_out);
mInfoFadeOut.setTarget(mContainerView);
mInfoFadeOut.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mContainerView.setVisibility(GONE);
}
});
}
/**
* Sets the normal image.
*/
public void setIconImage(int resId) {
mNormalLockIconView.setImageResource(resId);
updateSpaceVisibility();
}
/**
* Sets the scale type of the normal image.
*/
public void setIconScaleType(ScaleType scaleType) {
mNormalLockIconView.setScaleType(scaleType);
updateSpaceVisibility();
}
/**
* Show or hide the image of this view.
*/
public void setIconVisibility(boolean visible) {
mImageContainer.setVisibility(visible ? VISIBLE : GONE);
updateSpaceVisibility();
}
/**
* Sets the text message.
*/
public void setInfoText(int resId) {
mBlockingInfoTextView.setText(resId);
updateSpaceVisibility();
}
/**
* Sets the text message.
*/
public void setInfoText(String text) {
mBlockingInfoTextView.setText(text);
updateSpaceVisibility();
}
/**
* Sets the background image should be displayed in the block screen view. Passes {@code null}
* to remove the currently displayed background image.
*/
public void setBackgroundImage(Drawable backgroundImage) {
mBackgroundImageView.setVisibility(backgroundImage == null ? GONE : VISIBLE);
mBackgroundImageView.setImageDrawable(backgroundImage);
}
private void updateSpaceVisibility() {
if (isImageViewVisible() && isTextViewVisible(mBlockingInfoTextView)) {
mSpace.setVisibility(VISIBLE);
} else {
mSpace.setVisibility(GONE);
}
}
private boolean isImageViewVisible() {
return mImageContainer.getVisibility() == VISIBLE
&& (isImageViewVisible(mNormalLockIconView)
|| isImageViewVisible(mShrunkenLockIconView));
}
private static boolean isImageViewVisible(ImageView imageView) {
return imageView.getVisibility() != GONE && imageView.getDrawable() != null;
}
private static boolean isTextViewVisible(TextView textView) {
return textView.getVisibility() != GONE && !TextUtils.isEmpty(textView.getText());
}
/**
* Changes the spacing between the image view and the text view according to the
* {@code blockScreenType}.
*/
public void setSpacing(@BlockScreenType int blockScreenType) {
mSpace.getLayoutParams().height =
blockScreenType == TunableTvView.BLOCK_SCREEN_TYPE_SHRUNKEN_TV_VIEW
? mSpacingShrunken : mSpacingNormal;
requestLayout();
}
/**
* Changes the view layout according to the {@code blockScreenType}.
*/
public void onBlockStatusChanged(@BlockScreenType int blockScreenType, boolean withAnimation) {
if (!withAnimation) {
switch (blockScreenType) {
case TunableTvView.BLOCK_SCREEN_TYPE_NO_UI:
mContainerView.setVisibility(GONE);
break;
case TunableTvView.BLOCK_SCREEN_TYPE_SHRUNKEN_TV_VIEW:
mNormalLockIconView.setVisibility(GONE);
mShrunkenLockIconView.setVisibility(VISIBLE);
mContainerView.setVisibility(VISIBLE);
mContainerView.setAlpha(1.0f);
break;
case TunableTvView.BLOCK_SCREEN_TYPE_NORMAL:
mNormalLockIconView.setVisibility(VISIBLE);
mShrunkenLockIconView.setVisibility(GONE);
mContainerView.setVisibility(VISIBLE);
mContainerView.setAlpha(1.0f);
break;
}
} else {
switch (blockScreenType) {
case TunableTvView.BLOCK_SCREEN_TYPE_NO_UI:
if (mContainerView.getVisibility() == VISIBLE) {
mInfoFadeOut.start();
}
break;
case TunableTvView.BLOCK_SCREEN_TYPE_SHRUNKEN_TV_VIEW:
mNormalLockIconView.setVisibility(GONE);
mShrunkenLockIconView.setVisibility(VISIBLE);
if (mContainerView.getVisibility() == GONE) {
mContainerView.setVisibility(VISIBLE);
mInfoFadeIn.start();
}
break;
case TunableTvView.BLOCK_SCREEN_TYPE_NORMAL:
mNormalLockIconView.setVisibility(VISIBLE);
mShrunkenLockIconView.setVisibility(GONE);
if (mContainerView.getVisibility() == GONE) {
mContainerView.setVisibility(VISIBLE);
mInfoFadeIn.start();
}
break;
}
}
updateSpaceVisibility();
}
/**
* Adds a listener to the fade-in animation of info text and icons of the block screen.
*/
public void addInfoFadeInAnimationListener(AnimatorListener listener) {
mInfoFadeIn.addListener(listener);
}
/**
* Fades out the block screen.
*/
public void fadeOut() {
if (getVisibility() == VISIBLE && !mFadeOut.isStarted()) {
mFadeOut.start();
}
}
/**
* Ends the currently running animations.
*/
public void endAnimations() {
if (mFadeOut != null && mFadeOut.isRunning()) {
mFadeOut.end();
}
if (mInfoFadeIn != null && mInfoFadeIn.isRunning()) {
mInfoFadeIn.end();
}
if (mInfoFadeOut != null && mInfoFadeOut.isRunning()) {
mInfoFadeOut.end();
}
}
}