Commit 41cd6f2f authored by Henrique Nakashima's avatar Henrique Nakashima Committed by Commit Bot

Move Tab-to-GTS animation flag logic to TabFeatureUtilities.

More logic related to tabs will be moved to TabFeatureUtilities in
follow-ups.

Bug: 1012975
Change-Id: Ib4aa13e2cc94340b733326140656c48d0a5e52c9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1857581
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
Reviewed-by: default avatarWei-Yin Chen (陳威尹) <wychen@chromium.org>
Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#708199}
parent b123e4b8
......@@ -1565,6 +1565,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/tab/TabContextMenuPopulator.java",
"java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java",
"java/src/org/chromium/chrome/browser/tab/TabFavicon.java",
"java/src/org/chromium/chrome/browser/tab/TabFeatureUtilities.java",
"java/src/org/chromium/chrome/browser/tab/TabIdManager.java",
"java/src/org/chromium/chrome/browser/tab/TabImportanceManager.java",
"java/src/org/chromium/chrome/browser/tab/TabHelpers.java",
......
......@@ -34,10 +34,10 @@ import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
import org.chromium.chrome.browser.ui.widget.animation.Interpolators;
import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.ui.resources.ResourceManager;
import java.util.ArrayList;
......@@ -109,7 +109,7 @@ public class StartSurfaceLayout extends Layout implements StartSurface.OverviewM
// The Tab-to-GTS animation is done, and it's time to renew the thumbnail without causing
// janky frames.
// When animation is off, the thumbnail is already updated when showing the GTS.
if (FeatureUtilities.isTabToGtsAnimationEnabled()) {
if (TabFeatureUtilities.isTabToGtsAnimationEnabled()) {
// Delay thumbnail taking a bit more to make it less likely to happen before the
// thumbnail taking triggered by ThumbnailFetcher. See crbug.com/996385 for details.
new Handler().postDelayed(() -> {
......@@ -127,7 +127,7 @@ public class StartSurfaceLayout extends Layout implements StartSurface.OverviewM
// The Android View version of GTS overview is hidden.
// If not doing GTS-to-Tab transition animation, we show the fade-out instead, which was
// already done.
if (!FeatureUtilities.isTabToGtsAnimationEnabled()) {
if (!TabFeatureUtilities.isTabToGtsAnimationEnabled()) {
postHiding();
return;
}
......@@ -159,7 +159,8 @@ public class StartSurfaceLayout extends Layout implements StartSurface.OverviewM
public void show(long time, boolean animate) {
super.show(time, animate);
boolean showShrinkingAnimation = animate && FeatureUtilities.isTabToGtsAnimationEnabled();
boolean showShrinkingAnimation =
animate && TabFeatureUtilities.isTabToGtsAnimationEnabled();
boolean quick = mTabListDelegate.prepareOverview();
Log.d(TAG, "SkipSlowZooming = " + getSkipSlowZooming());
if (getSkipSlowZooming()) {
......@@ -219,7 +220,7 @@ public class StartSurfaceLayout extends Layout implements StartSurface.OverviewM
updateCacheVisibleIds(new LinkedList<>(Arrays.asList(sourceTabId)));
mIsAnimating = true;
mController.hideOverview(!FeatureUtilities.isTabToGtsAnimationEnabled());
mController.hideOverview(!TabFeatureUtilities.isTabToGtsAnimationEnabled());
}
@Override
......@@ -442,8 +443,8 @@ public class StartSurfaceLayout extends Layout implements StartSurface.OverviewM
// The content viewport is intentionally sent as both params below.
mSceneLayer.pushLayers(getContext(), contentViewport, contentViewport, this,
layerTitleCache, tabContentManager, resourceManager, fullscreenManager,
FeatureUtilities.isTabToGtsAnimationEnabled() ? mTabListDelegate.getResourceId()
: 0,
TabFeatureUtilities.isTabToGtsAnimationEnabled() ? mTabListDelegate.getResourceId()
: 0,
mBackgroundAlpha);
mFrameCount++;
if (mLastFrameTime != 0) {
......
......@@ -36,6 +36,7 @@ import org.chromium.chrome.browser.compositor.animation.CompositorAnimator;
import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.browser.tabmodel.TabSelectionType;
import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.chrome.tab_ui.R;
......@@ -105,7 +106,7 @@ public class StartSurfaceLayoutPerfTest {
mWaitingTime = 1000;
mTabNumCap = 0;
}
assertTrue(FeatureUtilities.isTabToGtsAnimationEnabled());
assertTrue(TabFeatureUtilities.isTabToGtsAnimationEnabled());
CriteriaHelper.pollUiThread(Criteria.equals(true,
mActivityTestRule.getActivity()
......
......@@ -52,6 +52,7 @@ import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.compositor.layouts.Layout;
import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabSelectionType;
import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
......@@ -153,7 +154,7 @@ public class StartSurfaceLayoutTest {
@DisabledTest(message = "crbug.com/991852 This test is flaky")
public void testTabToGridFromLiveTabAnimation() throws InterruptedException {
// clang-format on
assertTrue(FeatureUtilities.isTabToGtsAnimationEnabled());
assertTrue(TabFeatureUtilities.isTabToGtsAnimationEnabled());
prepareTabs(2, 0, NTP_URL);
testTabToGrid(mUrl);
......
......@@ -32,6 +32,7 @@ import org.chromium.chrome.browser.native_page.NativePageFactory;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelFilter;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
......@@ -776,7 +777,7 @@ class TabListMediator {
* The selected border should re-appear in the final fading-in stage.
*/
void prepareOverview() {
if (!FeatureUtilities.isTabToGtsAnimationEnabled()
if (!TabFeatureUtilities.isTabToGtsAnimationEnabled()
|| !mTabModelSelector.getTabModelFilterProvider()
.getCurrentTabModelFilter()
.isTabModelRestored()) {
......@@ -900,7 +901,7 @@ class TabListMediator {
&& (mModel.get(index).model.get(TabProperties.THUMBNAIL_FETCHER) == null
|| forceUpdate || isUpdatingId)) {
ThumbnailFetcher callback = new ThumbnailFetcher(mThumbnailProvider, tab, forceUpdate,
forceUpdate && !FeatureUtilities.isTabToGtsAnimationEnabled());
forceUpdate && !TabFeatureUtilities.isTabToGtsAnimationEnabled());
mModel.get(index).model.set(TabProperties.THUMBNAIL_FETCHER, callback);
}
}
......@@ -1071,7 +1072,7 @@ class TabListMediator {
if (mThumbnailProvider != null && mVisible) {
ThumbnailFetcher callback = new ThumbnailFetcher(mThumbnailProvider, tab, isSelected,
isSelected && !FeatureUtilities.isTabToGtsAnimationEnabled());
isSelected && !TabFeatureUtilities.isTabToGtsAnimationEnabled());
tabInfo.set(TabProperties.THUMBNAIL_FETCHER, callback);
}
tab.addObserver(mTabObserver);
......
......@@ -32,8 +32,8 @@ import androidx.annotation.Nullable;
import org.chromium.base.Log;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.chrome.tab_ui.R;
import org.chromium.ui.interpolators.BakedBezierInterpolator;
import org.chromium.ui.modelutil.SimpleRecyclerViewAdapter;
......@@ -153,8 +153,9 @@ class TabListRecyclerView extends RecyclerView {
assert mFadeOutAnimator == null;
mListener.startedShowing(animate);
long duration = FeatureUtilities.isTabToGtsAnimationEnabled() ? FINAL_FADE_IN_DURATION_MS
: BASE_ANIMATION_DURATION_MS;
long duration = TabFeatureUtilities.isTabToGtsAnimationEnabled()
? FINAL_FADE_IN_DURATION_MS
: BASE_ANIMATION_DURATION_MS;
setAlpha(0);
setVisibility(View.VISIBLE);
......@@ -178,7 +179,7 @@ class TabListRecyclerView extends RecyclerView {
mRecyclerViewFooter.setVisibility(VISIBLE);
}
// TODO(crbug.com/972157): remove this band-aid after we know why GTS is invisible.
if (FeatureUtilities.isTabToGtsAnimationEnabled()) {
if (TabFeatureUtilities.isTabToGtsAnimationEnabled()) {
requestLayout();
}
}
......
......@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
import org.chromium.chrome.browser.fullscreen.FullscreenManager;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
import org.chromium.chrome.browser.tabmodel.TabLaunchType;
......@@ -421,7 +422,7 @@ class TabSwitcherMediator implements TabSwitcher.Controller, TabListRecyclerView
mHandler.removeCallbacks(mSoftClearTabListRunnable);
mHandler.removeCallbacks(mClearTabListRunnable);
boolean quick = false;
if (FeatureUtilities.isTabToGtsAnimationEnabled()
if (TabFeatureUtilities.isTabToGtsAnimationEnabled()
&& mTabModelSelector.getTabModelFilterProvider()
.getCurrentTabModelFilter()
.isTabModelRestored()) {
......@@ -447,7 +448,7 @@ class TabSwitcherMediator implements TabSwitcher.Controller, TabListRecyclerView
.isTabModelRestored()) {
mResetHandler.resetWithTabList(
mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter(),
FeatureUtilities.isTabToGtsAnimationEnabled(), mShowTabsInMruOrder);
TabFeatureUtilities.isTabToGtsAnimationEnabled(), mShowTabsInMruOrder);
}
if (!animate) mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, false);
setVisibility(true);
......
......@@ -24,7 +24,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.ContextUtils;
import org.chromium.chrome.browser.util.FeatureUtilities;
import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.tab_ui.R;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
......@@ -52,7 +52,7 @@ public class TabGridDialogParentTest extends DummyUiActivityTestCase {
@Override
public void setUpTest() throws Exception {
super.setUpTest();
FeatureUtilities.setIsTabToGtsAnimationEnabledForTesting(true);
TabFeatureUtilities.setIsTabToGtsAnimationEnabledForTesting(true);
mDummyParent = new FrameLayout(getActivity());
mTabGridDialogParent = new TabGridDialogParent(getActivity(), mDummyParent);
......
// Copyright 2019 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.tab;
import android.os.Build;
import androidx.annotation.Nullable;
import org.chromium.base.Log;
import org.chromium.base.SysUtils;
import org.chromium.base.VisibleForTesting;
import org.chromium.chrome.browser.ChromeFeatureList;
/**
* Contains logic that decides whether to enable features related to tabs.
*/
public class TabFeatureUtilities {
private static final String TAG = "TabFeatureUtilities";
private static Boolean sIsTabToGtsAnimationEnabled;
/**
* Toggles whether the Tab-to-GTS animation is enabled for testing. Should be reset back to
* null after the test has finished.
*/
@VisibleForTesting
public static void setIsTabToGtsAnimationEnabledForTesting(@Nullable Boolean enabled) {
sIsTabToGtsAnimationEnabled = enabled;
}
/**
* @return Whether the Tab-to-Grid (and Grid-to-Tab) transition animation is enabled.
*/
public static boolean isTabToGtsAnimationEnabled() {
if (sIsTabToGtsAnimationEnabled != null) {
Log.d(TAG, "IsTabToGtsAnimationEnabled forced to " + sIsTabToGtsAnimationEnabled);
return sIsTabToGtsAnimationEnabled;
}
Log.d(TAG, "GTS.MinSdkVersion = " + GridTabSwitcherUtil.getMinSdkVersion());
Log.d(TAG, "GTS.MinMemoryMB = " + GridTabSwitcherUtil.getMinMemoryMB());
return ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
&& Build.VERSION.SDK_INT >= GridTabSwitcherUtil.getMinSdkVersion()
&& SysUtils.amountOfPhysicalMemoryKB() / 1024
>= GridTabSwitcherUtil.getMinMemoryMB();
}
private static class GridTabSwitcherUtil {
// Field trial parameter for the minimum Android SDK version to enable zooming animation.
private static final String MIN_SDK_PARAM = "zooming-min-sdk-version";
private static final int DEFAULT_MIN_SDK = Build.VERSION_CODES.O;
// Field trial parameter for the minimum physical memory size to enable zooming animation.
private static final String MIN_MEMORY_MB_PARAM = "zooming-min-memory-mb";
private static final int DEFAULT_MIN_MEMORY_MB = 2048;
private static int getMinSdkVersion() {
String sdkVersion = ChromeFeatureList.getFieldTrialParamByFeature(
ChromeFeatureList.TAB_TO_GTS_ANIMATION, MIN_SDK_PARAM);
try {
return Integer.valueOf(sdkVersion);
} catch (NumberFormatException e) {
return DEFAULT_MIN_SDK;
}
}
private static int getMinMemoryMB() {
String sdkVersion = ChromeFeatureList.getFieldTrialParamByFeature(
ChromeFeatureList.TAB_TO_GTS_ANIMATION, MIN_MEMORY_MB_PARAM);
try {
return Integer.valueOf(sdkVersion);
} catch (NumberFormatException e) {
return DEFAULT_MIN_MEMORY_MB;
}
}
}
}
......@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.appmenu.AppMenuButtonHelper;
import org.chromium.chrome.browser.device.DeviceClassManager;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.tab.TabFeatureUtilities;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.chrome.browser.toolbar.IncognitoStateProvider;
......@@ -157,7 +158,7 @@ public class TabSwitcherModeTTPhone extends OptimizedFrameLayout
setAlpha(inTabSwitcherMode ? 0.0f : 1.0f);
boolean showZoomingAnimation = FeatureUtilities.isGridTabSwitcherEnabled()
&& FeatureUtilities.isTabToGtsAnimationEnabled();
&& TabFeatureUtilities.isTabToGtsAnimationEnabled();
long duration = showZoomingAnimation
? TopToolbarCoordinator.TAB_SWITCHER_MODE_GTS_ANIMATION_DURATION_MS
: TopToolbarCoordinator.TAB_SWITCHER_MODE_NORMAL_ANIMATION_DURATION_MS;
......
......@@ -15,7 +15,6 @@ import org.chromium.base.BuildInfo;
import org.chromium.base.CommandLine;
import org.chromium.base.ContextUtils;
import org.chromium.base.FieldTrialList;
import org.chromium.base.Log;
import org.chromium.base.PackageManagerUtils;
import org.chromium.base.SysUtils;
import org.chromium.base.ThreadUtils;
......@@ -63,8 +62,6 @@ import java.util.Map;
* value in shared preferences.
*/
public class FeatureUtilities {
private static final String TAG = "FeatureUtilities";
/**
* Key for whether DownloadResumptionBackgroundTask should load native in service manager only
* mode.
......@@ -186,7 +183,6 @@ public class FeatureUtilities {
private static Map<String, Boolean> sFlags = new HashMap<>();
private static Boolean sHasRecognitionIntentHandler;
private static Boolean sIsTabToGtsAnimationEnabled;
private static String sReachedCodeProfilerTrialGroup;
/**
......@@ -584,31 +580,6 @@ public class FeatureUtilities {
sFlags.put(START_SURFACE_ENABLED_KEY, isEnabled);
}
/**
* Toggles whether the Tab-to-GTS animation is enabled for testing. Should be reset back to
* null after the test has finished.
*/
@VisibleForTesting
public static void setIsTabToGtsAnimationEnabledForTesting(@Nullable Boolean enabled) {
sIsTabToGtsAnimationEnabled = enabled;
}
/**
* @return Whether the Tab-to-Grid (and Grid-to-Tab) transition animation is enabled.
*/
public static boolean isTabToGtsAnimationEnabled() {
if (sIsTabToGtsAnimationEnabled != null) {
Log.d(TAG, "IsTabToGtsAnimationEnabled forced to " + sIsTabToGtsAnimationEnabled);
return sIsTabToGtsAnimationEnabled;
}
Log.d(TAG, "GTS.MinSdkVersion = " + GridTabSwitcherUtil.getMinSdkVersion());
Log.d(TAG, "GTS.MinMemoryMB = " + GridTabSwitcherUtil.getMinMemoryMB());
return ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
&& Build.VERSION.SDK_INT >= GridTabSwitcherUtil.getMinSdkVersion()
&& SysUtils.amountOfPhysicalMemoryKB() / 1024
>= GridTabSwitcherUtil.getMinMemoryMB();
}
private static boolean isHighEndPhone() {
return !SysUtils.isLowEndDevice()
&& !DeviceFormFactor.isNonMultiDisplayContextOnTablet(
......@@ -743,36 +714,6 @@ public class FeatureUtilities {
return sReachedCodeProfilerTrialGroup;
}
private static class GridTabSwitcherUtil {
// Field trial parameter for the minimum Android SDK version to enable zooming animation.
private static final String MIN_SDK_PARAM = "zooming-min-sdk-version";
private static final int DEFAULT_MIN_SDK = Build.VERSION_CODES.O;
// Field trial parameter for the minimum physical memory size to enable zooming animation.
private static final String MIN_MEMORY_MB_PARAM = "zooming-min-memory-mb";
private static final int DEFAULT_MIN_MEMORY_MB = 2048;
private static int getMinSdkVersion() {
String sdkVersion = ChromeFeatureList.getFieldTrialParamByFeature(
ChromeFeatureList.TAB_TO_GTS_ANIMATION, MIN_SDK_PARAM);
try {
return Integer.valueOf(sdkVersion);
} catch (NumberFormatException e) {
return DEFAULT_MIN_SDK;
}
}
private static int getMinMemoryMB() {
String sdkVersion = ChromeFeatureList.getFieldTrialParamByFeature(
ChromeFeatureList.TAB_TO_GTS_ANIMATION, MIN_MEMORY_MB_PARAM);
try {
return Integer.valueOf(sdkVersion);
} catch (NumberFormatException e) {
return DEFAULT_MIN_MEMORY_MB;
}
}
}
private static void cacheFlag(String preferenceName, String featureName) {
ChromePreferenceManager.getInstance().writeBoolean(
preferenceName, ChromeFeatureList.isEnabled(featureName));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment