// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.chrome.browser.widget.emptybackground; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageButton; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper; import org.chromium.chrome.browser.appmenu.AppMenuHandler; import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.widget.incognitotoggle.IncognitoToggleButtonTablet; import org.chromium.ui.UiUtils; /** * Represents the background screen that shows when no tabs are visible. This {@link View} * handles making itself invisible or not automatically depending on the state of the system. */ public class EmptyBackgroundViewTablet extends FrameLayout { private static final int ANIMATE_DURATION_MS = 200; private TabModelSelector mTabModelSelector; private TabCreator mTabCreator; private Animator mCurrentTransitionAnimation; private Animator mAnimateInAnimation; private Animator mAnimateOutAnimation; private IncognitoToggleButtonTablet mIncognitoToggleButton; /** * Creates an instance of {@link EmptyBackgroundViewTablet}. * @param context The {@link Context} to create this {@link View} under. * @param attrs An {@link AttributeSet} that contains information on how to build this * {@link View}. */ public EmptyBackgroundViewTablet(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void onFinishInflate() { super.onFinishInflate(); View newTabButton = findViewById(R.id.empty_new_tab_button); newTabButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mTabCreator == null) return; mTabModelSelector.getModel(false).commitAllTabClosures(); mTabCreator.launchNTP(); } }); buildAnimatorSets(); } /** * Sets the {@link TabModelSelector} that will be queried for information about the state of * the system. * @param tabModelSelector A {@link TabModelSelector} that represents the state of the system. */ public void setTabModelSelector(TabModelSelector tabModelSelector) { mTabModelSelector = tabModelSelector; mIncognitoToggleButton = (IncognitoToggleButtonTablet) findViewById( R.id.empty_incognito_toggle_button); mIncognitoToggleButton.setTabModelSelector(mTabModelSelector); } /** * Sets the {@link TabCreator} that will be used to open the New Tab Page. * @param tabCreator A {@link TabCreator} to open the New Tab Page. */ public void setTabCreator(TabCreator tabCreator) { mTabCreator = tabCreator; } /** * Creates an on touch listener for the menu button using the given menu handler. * @param menuHandler The menu handler to be used for showing the pop up menu. */ public void setMenuOnTouchListener(final AppMenuHandler menuHandler) { final ImageButton menuBtn = (ImageButton) findViewById(R.id.empty_menu_button); final AppMenuButtonHelper menuPopupButtonHelper = new AppMenuButtonHelper(menuHandler); menuBtn.setOnTouchListener(menuPopupButtonHelper); menuPopupButtonHelper.setOnAppMenuShownListener(new Runnable() { @Override public void run() { RecordUserAction.record("MobileToolbarShowMenu"); } }); } public void setEmptyContainerState(boolean shouldShow) { Animator nextAnimator = null; if (shouldShow && getVisibility() != View.VISIBLE && mCurrentTransitionAnimation != mAnimateInAnimation) { nextAnimator = mAnimateInAnimation; UiUtils.hideKeyboard(this); } else if (!shouldShow && getVisibility() != View.GONE && mCurrentTransitionAnimation != mAnimateOutAnimation) { nextAnimator = mAnimateOutAnimation; } if (nextAnimator != null) { if (mCurrentTransitionAnimation != null) mCurrentTransitionAnimation.cancel(); mCurrentTransitionAnimation = nextAnimator; mCurrentTransitionAnimation.start(); } } private void buildAnimatorSets() { TypedArray a = getContext().getTheme().obtainStyledAttributes(R.style.ToolbarButton, new int[] {android.R.attr.layout_height}); int viewHeight = a.getDimensionPixelSize(0, 0); a.recycle(); View view = findViewById(R.id.empty_layout_button_container); // Build the in animation mAnimateInAnimation = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, -viewHeight, 0.f); mAnimateInAnimation.setDuration(ANIMATE_DURATION_MS); mAnimateInAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animator animation) { mCurrentTransitionAnimation = null; getRootView().findViewById(R.id.control_container).setVisibility(INVISIBLE); } }); // Build the out animation mAnimateOutAnimation = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, 0.f, -viewHeight); mAnimateOutAnimation.setDuration(ANIMATE_DURATION_MS); mAnimateOutAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { setVisibility(View.VISIBLE); getRootView().findViewById(R.id.control_container).setVisibility(VISIBLE); // Disable the incognito toggle button while the tab switcher animation is running // to avoid getting into a weird UI state if the button is clicked multiple times. // See crbug.com/586875. mIncognitoToggleButton.setEnabled(false); } @Override public void onAnimationEnd(Animator animation) { setVisibility(View.GONE); mCurrentTransitionAnimation = null; mIncognitoToggleButton.setEnabled(true); } }); } }