| Index: chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java
|
| diff --git a/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java b/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java
|
| deleted file mode 100644
|
| index a4bfc8754f3de1c943b654044a36ad842a6d4055..0000000000000000000000000000000000000000
|
| --- a/chrome/android/java_staging/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java
|
| +++ /dev/null
|
| @@ -1,548 +0,0 @@
|
| -// 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.compositor.overlays.strip;
|
| -
|
| -import static org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.AnimatableAnimation.createAnimation;
|
| -
|
| -import android.content.Context;
|
| -import android.graphics.RectF;
|
| -
|
| -import org.chromium.base.VisibleForTesting;
|
| -import org.chromium.chrome.R;
|
| -import org.chromium.chrome.browser.Tab;
|
| -import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation;
|
| -import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animatable;
|
| -import org.chromium.chrome.browser.compositor.layouts.ChromeAnimation.Animation;
|
| -import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
|
| -import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton;
|
| -import org.chromium.chrome.browser.compositor.layouts.components.VirtualView;
|
| -import org.chromium.chrome.browser.compositor.overlays.strip.TabLoadTracker.TabLoadTrackerCallback;
|
| -import org.chromium.chrome.browser.util.MathUtils;
|
| -import org.chromium.ui.base.LocalizationUtils;
|
| -import org.chromium.ui.resources.AndroidResourceType;
|
| -import org.chromium.ui.resources.LayoutResource;
|
| -import org.chromium.ui.resources.ResourceManager;
|
| -
|
| -import java.util.List;
|
| -
|
| -/**
|
| - * {@link StripLayoutTab} is used to keep track of the strip position and rendering information for
|
| - * a particular tab so it can draw itself onto the GL canvas.
|
| - */
|
| -public class StripLayoutTab
|
| - implements ChromeAnimation.Animatable<StripLayoutTab.Property>, VirtualView {
|
| - /**
|
| - * Animatable properties that can be used with a {@link ChromeAnimation.Animatable} on a
|
| - * {@link StripLayoutTab}.
|
| - */
|
| - enum Property {
|
| - X_OFFSET,
|
| - Y_OFFSET,
|
| - WIDTH,
|
| - }
|
| -
|
| - // Behavior Constants
|
| - private static final float VISIBILITY_FADE_CLOSE_BUTTON_PERCENTAGE = 0.99f;
|
| -
|
| - // Animation/Timer Constants
|
| - private static final int ANIM_TAB_CLOSE_BUTTON_FADE_MS = 150;
|
| -
|
| - // Close button width
|
| - private static final int CLOSE_BUTTON_WIDTH_DP = 36;
|
| -
|
| - private int mId = Tab.INVALID_TAB_ID;
|
| -
|
| - private final TabLoadTracker mLoadTracker;
|
| - private final LayoutRenderHost mRenderHost;
|
| -
|
| - private boolean mVisible = true;
|
| - private boolean mIsDying = false;
|
| - private boolean mCanShowCloseButton = true;
|
| - private final boolean mIncognito;
|
| - private float mContentOffsetX;
|
| - private float mVisiblePercentage = 1.f;
|
| - private String mAccessibilityDescription;
|
| -
|
| - // Ideal intermediate parameters
|
| - private float mIdealX;
|
| - private float mTabOffsetX;
|
| - private float mTabOffsetY;
|
| -
|
| - // Actual draw parameters
|
| - private float mDrawX;
|
| - private float mDrawY;
|
| - private float mWidth;
|
| - private float mHeight;
|
| - private final RectF mTouchTarget = new RectF();
|
| -
|
| - private boolean mShowingCloseButton = true;
|
| -
|
| - private final CompositorButton mCloseButton;
|
| -
|
| - // Content Animations
|
| - private ChromeAnimation<Animatable<?>> mContentAnimations;
|
| -
|
| - // Preallocated
|
| - private final RectF mClosePlacement = new RectF();
|
| -
|
| - /**
|
| - * Create a {@link StripLayoutTab} that represents the {@link Tab} with an id of
|
| - * {@code id}.
|
| - *
|
| - * @param context An Android context for accessing system resources.
|
| - * @param id The id of the {@link Tab} to visually represent.
|
| - * @param loadTrackerCallback The {@link TabLoadTrackerCallback} to be notified of loading state
|
| - * changes.
|
| - * @param renderHost The {@link LayoutRenderHost}.
|
| - * @param incogntio Whether or not this layout tab is icognito.
|
| - */
|
| - public StripLayoutTab(Context context, int id, TabLoadTrackerCallback loadTrackerCallback,
|
| - LayoutRenderHost renderHost, boolean incognito) {
|
| - mId = id;
|
| - mLoadTracker = new TabLoadTracker(id, loadTrackerCallback);
|
| - mRenderHost = renderHost;
|
| - mIncognito = incognito;
|
| - mCloseButton = new CompositorButton(context, 0, 0);
|
| - mCloseButton.setResources(R.drawable.btn_tab_close_normal, R.drawable.btn_tab_close_pressed,
|
| - R.drawable.btn_tab_close_white_normal, R.drawable.btn_tab_close_white_pressed);
|
| - mCloseButton.setIncognito(mIncognito);
|
| - mCloseButton.setBounds(getCloseRect());
|
| - mCloseButton.setClickSlop(0.f);
|
| - String description =
|
| - context.getResources().getString(R.string.accessibility_tabstrip_btn_close_tab);
|
| - mCloseButton.setAccessibilityDescription(description, description);
|
| - }
|
| -
|
| - /**
|
| - * Get a list of virtual views for accessibility events.
|
| - *
|
| - * @param views A List to populate with virtual views.
|
| - */
|
| - public void getVirtualViews(List<VirtualView> views) {
|
| - if (mShowingCloseButton) views.add(mCloseButton);
|
| - views.add(this);
|
| - }
|
| -
|
| - /**
|
| - * @param description A description for accessibility events.
|
| - */
|
| - public void setAccessibilityDescription(String description) {
|
| - mAccessibilityDescription = description;
|
| - }
|
| -
|
| - @Override
|
| - public String getAccessibilityDescription() {
|
| - return mAccessibilityDescription;
|
| - }
|
| -
|
| - @Override
|
| - public void getTouchTarget(RectF target) {
|
| - target.set(mTouchTarget);
|
| - }
|
| -
|
| - @Override
|
| - public boolean checkClicked(float x, float y) {
|
| - return mTouchTarget.contains(x, y);
|
| - }
|
| -
|
| - /**
|
| - * @return The id of the {@link Tab} this {@link StripLayoutTab} represents.
|
| - */
|
| - public int getId() {
|
| - return mId;
|
| - }
|
| -
|
| - /**
|
| - * @param foreground Whether or not this tab is a foreground tab.
|
| - * @return The Android resource that represents the tab background.
|
| - */
|
| - public int getResourceId(boolean foreground) {
|
| - if (foreground) {
|
| - return mIncognito ? R.drawable.bg_tabstrip_incognito_tab : R.drawable.bg_tabstrip_tab;
|
| - }
|
| - return mIncognito ? R.drawable.bg_tabstrip_incognito_background_tab
|
| - : R.drawable.bg_tabstrip_background_tab;
|
| - }
|
| -
|
| - /**
|
| - * @param visible Whether or not this {@link StripLayoutTab} should be drawn.
|
| - */
|
| - public void setVisible(boolean visible) {
|
| - mVisible = visible;
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not this {@link StripLayoutTab} should be drawn.
|
| - */
|
| - public boolean isVisible() {
|
| - return mVisible;
|
| - }
|
| -
|
| - /**
|
| - * Mark this tab as in the process of dying. This lets us track which tabs are dead after
|
| - * animations.
|
| - * @param isDying Whether or not the tab is dying.
|
| - */
|
| - public void setIsDying(boolean isDying) {
|
| - mIsDying = isDying;
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not the tab is dying.
|
| - */
|
| - public boolean isDying() {
|
| - return mIsDying;
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not this tab should be visually represented as loading.
|
| - */
|
| - public boolean isLoading() {
|
| - return mLoadTracker.isLoading();
|
| - }
|
| -
|
| - /**
|
| - * Called when this tab has started loading.
|
| - */
|
| - public void pageLoadingStarted() {
|
| - mLoadTracker.pageLoadingStarted();
|
| - }
|
| -
|
| - /**
|
| - * Called when this tab has finished loading.
|
| - */
|
| - public void pageLoadingFinished() {
|
| - mLoadTracker.pageLoadingFinished();
|
| - }
|
| -
|
| - /**
|
| - * Called when this tab has started loading resources.
|
| - */
|
| - public void loadingStarted() {
|
| - mLoadTracker.loadingStarted();
|
| - }
|
| -
|
| - /**
|
| - * Called when this tab has finished loading resources.
|
| - */
|
| - public void loadingFinished() {
|
| - mLoadTracker.loadingFinished();
|
| - }
|
| -
|
| - /**
|
| - * @param offsetX How far to offset the tab content (favicons and title).
|
| - */
|
| - public void setContentOffsetX(float offsetX) {
|
| - mContentOffsetX = MathUtils.clamp(offsetX, 0.f, mWidth);
|
| - }
|
| -
|
| - /**
|
| - * @return How far to offset the tab content (favicons and title).
|
| - */
|
| - public float getContentOffsetX() {
|
| - return mContentOffsetX;
|
| - }
|
| -
|
| - /**
|
| - * @param visiblePercentage How much of the tab is visible (not overlapped by other tabs).
|
| - */
|
| - public void setVisiblePercentage(float visiblePercentage) {
|
| - mVisiblePercentage = visiblePercentage;
|
| - checkCloseButtonVisibility(true);
|
| - }
|
| -
|
| - /**
|
| - * @return How much of the tab is visible (not overlapped by other tabs).
|
| - */
|
| - @VisibleForTesting
|
| - public float getVisiblePercentage() {
|
| - return mVisiblePercentage;
|
| - }
|
| -
|
| - /**
|
| - * @param show Whether or not the close button is allowed to be shown.
|
| - */
|
| - public void setCanShowCloseButton(boolean show) {
|
| - mCanShowCloseButton = show;
|
| - checkCloseButtonVisibility(true);
|
| - }
|
| -
|
| - /**
|
| - * @param x The actual position in the strip, taking into account stacking, scrolling, etc.
|
| - */
|
| - public void setDrawX(float x) {
|
| - mCloseButton.setX(mCloseButton.getX() + (x - mDrawX));
|
| - mDrawX = x;
|
| - mTouchTarget.left = mDrawX;
|
| - mTouchTarget.right = mDrawX + mWidth;
|
| - }
|
| -
|
| - /**
|
| - * @return The actual position in the strip, taking into account stacking, scrolling, etc.
|
| - */
|
| - public float getDrawX() {
|
| - return mDrawX;
|
| - }
|
| -
|
| - /**
|
| - * @param y The vertical position for the tab.
|
| - */
|
| - public void setDrawY(float y) {
|
| - mCloseButton.setY(mCloseButton.getY() + (y - mDrawY));
|
| - mDrawY = y;
|
| - mTouchTarget.top = mDrawY;
|
| - mTouchTarget.bottom = mDrawY + mHeight;
|
| - }
|
| -
|
| - /**
|
| - * @return The vertical position for the tab.
|
| - */
|
| - public float getDrawY() {
|
| - return mDrawY;
|
| - }
|
| -
|
| - /**
|
| - * @param width The width of the tab.
|
| - */
|
| - public void setWidth(float width) {
|
| - mWidth = width;
|
| - resetCloseRect();
|
| - mTouchTarget.right = mDrawX + mWidth;
|
| - }
|
| -
|
| - /**
|
| - * @return The width of the tab.
|
| - */
|
| - public float getWidth() {
|
| - return mWidth;
|
| - }
|
| -
|
| - /**
|
| - * @param height The height of the tab.
|
| - */
|
| - public void setHeight(float height) {
|
| - mHeight = height;
|
| - resetCloseRect();
|
| - mTouchTarget.bottom = mDrawY + mHeight;
|
| - }
|
| -
|
| - /**
|
| - * @return The height of the tab.
|
| - */
|
| - public float getHeight() {
|
| - return mHeight;
|
| - }
|
| -
|
| - /**
|
| - * @param closePressed The current pressed state of the attached button.
|
| - */
|
| - public void setClosePressed(boolean closePressed) {
|
| - mCloseButton.setPressed(closePressed);
|
| - }
|
| -
|
| - /**
|
| - * @return The current pressed state of the close button.
|
| - */
|
| - public boolean getClosePressed() {
|
| - return mCloseButton.isPressed();
|
| - }
|
| -
|
| - /**
|
| - * @return The close button for this tab.
|
| - */
|
| - public CompositorButton getCloseButton() {
|
| - return mCloseButton;
|
| - }
|
| -
|
| - /**
|
| - * This represents how much this tab's width should be counted when positioning tabs in the
|
| - * stack. As tabs close or open, their width weight is increased. They visually take up
|
| - * the same amount of space but the other tabs will smoothly move out of the way to make room.
|
| - * @return The weight from 0 to 1 that the width of this tab should have on the stack.
|
| - */
|
| - public float getWidthWeight() {
|
| - return MathUtils.clamp(1.f - mDrawY / mHeight, 0.f, 1.f);
|
| - }
|
| -
|
| - /**
|
| - * @param x The x position of the position to test.
|
| - * @param y The y position of the position to test.
|
| - * @return Whether or not {@code x} and {@code y} is over the close button for this tab and
|
| - * if the button can be clicked.
|
| - */
|
| - public boolean checkCloseHitTest(float x, float y) {
|
| - return mShowingCloseButton ? mCloseButton.checkClicked(x, y) : false;
|
| - }
|
| -
|
| - /**
|
| - * This is used to help calculate the tab's position and is not used for rendering.
|
| - * @param offsetX The offset of the tab (used for drag and drop, slide animating, etc).
|
| - */
|
| - public void setOffsetX(float offsetX) {
|
| - mTabOffsetX = offsetX;
|
| - }
|
| -
|
| - /**
|
| - * This is used to help calculate the tab's position and is not used for rendering.
|
| - * @return The offset of the tab (used for drag and drop, slide animating, etc).
|
| - */
|
| - public float getOffsetX() {
|
| - return mTabOffsetX;
|
| - }
|
| -
|
| - /**
|
| - * This is used to help calculate the tab's position and is not used for rendering.
|
| - * @param x The ideal position, in an infinitely long strip, of this tab.
|
| - */
|
| - public void setIdealX(float x) {
|
| - mIdealX = x;
|
| - }
|
| -
|
| - /**
|
| - * This is used to help calculate the tab's position and is not used for rendering.
|
| - * @return The ideal position, in an infinitely long strip, of this tab.
|
| - */
|
| - public float getIdealX() {
|
| - return mIdealX;
|
| - }
|
| -
|
| - /**
|
| - * This is used to help calculate the tab's position and is not used for rendering.
|
| - * @param offsetY The vertical offset of the tab.
|
| - */
|
| - public void setOffsetY(float offsetY) {
|
| - mTabOffsetY = offsetY;
|
| - }
|
| -
|
| - /**
|
| - * This is used to help calculate the tab's position and is not used for rendering.
|
| - * @return The vertical offset of the tab.
|
| - */
|
| - public float getOffsetY() {
|
| - return mTabOffsetY;
|
| - }
|
| -
|
| - private void startAnimation(Animation<Animatable<?>> animation, boolean finishPrevious) {
|
| - if (finishPrevious) finishAnimation();
|
| -
|
| - if (mContentAnimations == null) {
|
| - mContentAnimations = new ChromeAnimation<Animatable<?>>();
|
| - }
|
| -
|
| - mContentAnimations.add(animation);
|
| - }
|
| -
|
| - /**
|
| - * Finishes any content animations currently owned and running on this StripLayoutTab.
|
| - */
|
| - public void finishAnimation() {
|
| - if (mContentAnimations == null) return;
|
| -
|
| - mContentAnimations.updateAndFinish();
|
| - mContentAnimations = null;
|
| - }
|
| -
|
| - /**
|
| - * @return Whether or not there are any content animations running on this StripLayoutTab.
|
| - */
|
| - public boolean isAnimating() {
|
| - return mContentAnimations != null;
|
| - }
|
| -
|
| - /**
|
| - * Updates any content animations on this StripLayoutTab.
|
| - * @param time The current time of the app in ms.
|
| - * @param jumpToEnd Whether or not to force any current animations to end.
|
| - * @return Whether or not animations are done.
|
| - */
|
| - public boolean onUpdateAnimation(long time, boolean jumpToEnd) {
|
| - if (mContentAnimations == null) return true;
|
| -
|
| - boolean finished = true;
|
| - if (jumpToEnd) {
|
| - finished = mContentAnimations.finished();
|
| - } else {
|
| - finished = mContentAnimations.update(time);
|
| - }
|
| -
|
| - if (jumpToEnd || finished) finishAnimation();
|
| -
|
| - return finished;
|
| - }
|
| -
|
| - @Override
|
| - public void setProperty(Property prop, float val) {
|
| - switch (prop) {
|
| - case X_OFFSET:
|
| - setOffsetX(val);
|
| - break;
|
| - case Y_OFFSET:
|
| - setOffsetY(val);
|
| - break;
|
| - case WIDTH:
|
| - setWidth(val);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - private void resetCloseRect() {
|
| - RectF closeRect = getCloseRect();
|
| - mCloseButton.setWidth(closeRect.width());
|
| - mCloseButton.setHeight(closeRect.height());
|
| - mCloseButton.setX(closeRect.left);
|
| - mCloseButton.setY(closeRect.top);
|
| - }
|
| -
|
| - private RectF getCloseRect() {
|
| - if (!LocalizationUtils.isLayoutRtl()) {
|
| - mClosePlacement.left = getWidth() - CLOSE_BUTTON_WIDTH_DP;
|
| - mClosePlacement.right = mClosePlacement.left + CLOSE_BUTTON_WIDTH_DP;
|
| - } else {
|
| - mClosePlacement.left = 0;
|
| - mClosePlacement.right = CLOSE_BUTTON_WIDTH_DP;
|
| - }
|
| -
|
| - mClosePlacement.top = 0;
|
| - mClosePlacement.bottom = getHeight();
|
| -
|
| - float xOffset = 0;
|
| - ResourceManager manager = mRenderHost.getResourceManager();
|
| - if (manager != null) {
|
| - LayoutResource resource =
|
| - manager.getResource(AndroidResourceType.STATIC, getResourceId(false));
|
| - if (resource != null) {
|
| - xOffset = LocalizationUtils.isLayoutRtl()
|
| - ? resource.getPadding().left
|
| - : -(resource.getBitmapSize().width() - resource.getPadding().right);
|
| - }
|
| - }
|
| -
|
| - mClosePlacement.offset(getDrawX() + xOffset, getDrawY());
|
| - return mClosePlacement;
|
| - }
|
| -
|
| - // TODO(dtrainor): Don't animate this if we're selecting or deselecting this tab.
|
| - private void checkCloseButtonVisibility(boolean animate) {
|
| - boolean shouldShow =
|
| - mCanShowCloseButton && mVisiblePercentage > VISIBILITY_FADE_CLOSE_BUTTON_PERCENTAGE;
|
| -
|
| - if (shouldShow != mShowingCloseButton) {
|
| - float opacity = shouldShow ? 1.f : 0.f;
|
| - if (animate) {
|
| - startAnimation(buildCloseButtonOpacityAnimation(opacity), true);
|
| - } else {
|
| - mCloseButton.setOpacity(opacity);
|
| - }
|
| - mShowingCloseButton = shouldShow;
|
| - if (!mShowingCloseButton) mCloseButton.setPressed(false);
|
| - }
|
| - }
|
| -
|
| - private Animation<Animatable<?>> buildCloseButtonOpacityAnimation(float finalOpacity) {
|
| - return createAnimation(mCloseButton, CompositorButton.Property.OPACITY,
|
| - mCloseButton.getOpacity(), finalOpacity, ANIM_TAB_CLOSE_BUTTON_FADE_MS, 0, false,
|
| - ChromeAnimation.getLinearInterpolator());
|
| - }
|
| -}
|
|
|