Commit 4aa85f1c authored by Mei Liang's avatar Mei Liang Committed by Commit Bot

[UMA] Add undo closed tab user action for TabGroups UI

This CL adds the following user actions for TabGroups UI:
  * GridTabSwitcher.UndoCloseTab
  * GridTabSwitcher.UndoCloseTabGroup
  * TabGridSheet.UndoCloseTab
  * TabStrip.UndoCloseTab

Bug: 950190
Change-Id: Ic456b9f118e185f62c3866492e77ade27b51f7aa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1553090
Commit-Queue: Mei Liang <meiliang@chromium.org>
Reviewed-by: default avatarIlya Sherman <isherman@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@{#649244}
parent 8da36dff
...@@ -29,7 +29,7 @@ import java.util.List; ...@@ -29,7 +29,7 @@ import java.util.List;
*/ */
public class GridTabSwitcherCoordinator public class GridTabSwitcherCoordinator
implements Destroyable, GridTabSwitcher, GridTabSwitcherMediator.ResetHandler { implements Destroyable, GridTabSwitcher, GridTabSwitcherMediator.ResetHandler {
private final static String COMPONENT_NAME = "GridTabSwitcher"; final static String COMPONENT_NAME = "GridTabSwitcher";
private final PropertyModelChangeProcessor mContainerViewChangeProcessor; private final PropertyModelChangeProcessor mContainerViewChangeProcessor;
private final ActivityLifecycleDispatcher mLifecycleDispatcher; private final ActivityLifecycleDispatcher mLifecycleDispatcher;
private final TabListCoordinator mTabGridCoordinator; private final TabListCoordinator mTabGridCoordinator;
......
...@@ -28,7 +28,7 @@ import java.util.List; ...@@ -28,7 +28,7 @@ import java.util.List;
* objects. * objects.
*/ */
public class TabGridSheetCoordinator implements Destroyable { public class TabGridSheetCoordinator implements Destroyable {
public final static String COMPONENT_NAME = "TabGridSheet"; final static String COMPONENT_NAME = "TabGridSheet";
private final Context mContext; private final Context mContext;
private final TabListCoordinator mTabGridCoordinator; private final TabListCoordinator mTabGridCoordinator;
private final TabGridSheetMediator mMediator; private final TabGridSheetMediator mMediator;
......
...@@ -34,7 +34,7 @@ import java.util.List; ...@@ -34,7 +34,7 @@ import java.util.List;
*/ */
public class TabGroupUiCoordinator public class TabGroupUiCoordinator
implements TabGroupUiMediator.ResetHandler, TabGroupUi, PauseResumeWithNativeObserver { implements TabGroupUiMediator.ResetHandler, TabGroupUi, PauseResumeWithNativeObserver {
public final static String COMPONENT_NAME = "TabStrip"; final static String COMPONENT_NAME = "TabStrip";
private final Context mContext; private final Context mContext;
private final PropertyModel mTabStripToolbarModel; private final PropertyModel mTabStripToolbarModel;
private final ThemeColorProvider mThemeColorProvider; private final ThemeColorProvider mThemeColorProvider;
......
...@@ -8,12 +8,14 @@ import android.graphics.Bitmap; ...@@ -8,12 +8,14 @@ import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Handler; import android.os.Handler;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper; import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.View; import android.view.View;
import org.chromium.base.Callback; import org.chromium.base.Callback;
import org.chromium.base.Log;
import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.native_page.NativePageFactory; import org.chromium.chrome.browser.native_page.NativePageFactory;
...@@ -32,8 +34,12 @@ import org.chromium.components.feature_engagement.FeatureConstants; ...@@ -32,8 +34,12 @@ import org.chromium.components.feature_engagement.FeatureConstants;
import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* Mediator for business logic for the tab grid. This class should be initialized with a list of * Mediator for business logic for the tab grid. This class should be initialized with a list of
...@@ -110,6 +116,20 @@ class TabListMediator { ...@@ -110,6 +116,20 @@ class TabListMediator {
TabActionListener getCreateGroupButtonOnClickListener(Tab tab); TabActionListener getCreateGroupButtonOnClickListener(Tab tab);
} }
@IntDef({TabClosedFrom.TAB_STRIP, TabClosedFrom.TAB_GRID_SHEET, TabClosedFrom.GRID_TAB_SWITCHER,
TabClosedFrom.GRID_TAB_SWITCHER_GROUP})
@Retention(RetentionPolicy.SOURCE)
private @interface TabClosedFrom {
int TAB_STRIP = 0;
int TAB_GRID_SHEET = 1;
int GRID_TAB_SWITCHER = 2;
int GRID_TAB_SWITCHER_GROUP = 3;
int NUM_ENTRIES = 4;
}
private static final String TAG = "TabListMediator";
private static Map<Integer, Integer> sTabClosedFromMapTabClosedFromMap = new HashMap<>();
private final TabListFaviconProvider mTabListFaviconProvider; private final TabListFaviconProvider mTabListFaviconProvider;
private final TabListModel mModel; private final TabListModel mModel;
private final TabModelSelector mTabModelSelector; private final TabModelSelector mTabModelSelector;
...@@ -241,6 +261,28 @@ class TabListMediator { ...@@ -241,6 +261,28 @@ class TabListMediator {
@Override @Override
public void tabClosureUndone(Tab tab) { public void tabClosureUndone(Tab tab) {
onTabAdded(tab, !mCloseAllRelatedTabs); onTabAdded(tab, !mCloseAllRelatedTabs);
if (sTabClosedFromMapTabClosedFromMap.containsKey(tab.getId())) {
@TabClosedFrom
int from = sTabClosedFromMapTabClosedFromMap.get(tab.getId());
switch (from) {
case TabClosedFrom.TAB_STRIP:
RecordUserAction.record("TabStrip.UndoCloseTab");
break;
case TabClosedFrom.TAB_GRID_SHEET:
RecordUserAction.record("TabGridSheet.UndoCloseTab");
break;
case TabClosedFrom.GRID_TAB_SWITCHER:
RecordUserAction.record("GridTabSwitch.UndoCloseTab");
break;
case TabClosedFrom.GRID_TAB_SWITCHER_GROUP:
RecordUserAction.record("GridTabSwitcher.UndoCloseTabGroup");
break;
default:
assert false
: "tabClosureUndone for tab that closed from an unknown UI";
}
sTabClosedFromMapTabClosedFromMap.remove(tab.getId());
}
} }
@Override @Override
...@@ -261,13 +303,16 @@ class TabListMediator { ...@@ -261,13 +303,16 @@ class TabListMediator {
@Override @Override
public void run(int tabId) { public void run(int tabId) {
RecordUserAction.record("MobileTabClosed." + mComponentName); RecordUserAction.record("MobileTabClosed." + mComponentName);
if (mCloseAllRelatedTabs) { if (mCloseAllRelatedTabs) {
List<Tab> related = getRelatedTabsForId(tabId); List<Tab> related = getRelatedTabsForId(tabId);
if (related.size() > 1) { if (related.size() > 1) {
onGroupClosedFrom(tabId);
mTabModelSelector.getCurrentModel().closeMultipleTabs(related, true); mTabModelSelector.getCurrentModel().closeMultipleTabs(related, true);
return; return;
} }
} }
onTabClosedFrom(tabId, mComponentName);
mTabModelSelector.getCurrentModel().closeTab( mTabModelSelector.getCurrentModel().closeTab(
TabModelUtils.getTabById(mTabModelSelector.getCurrentModel(), tabId), false, TabModelUtils.getTabById(mTabModelSelector.getCurrentModel(), tabId), false,
false, true); false, true);
...@@ -275,6 +320,26 @@ class TabListMediator { ...@@ -275,6 +320,26 @@ class TabListMediator {
}; };
} }
private void onTabClosedFrom(int tabId, String fromComponent) {
@TabClosedFrom
int from;
if (fromComponent.equals(TabGroupUiCoordinator.COMPONENT_NAME)) {
from = TabClosedFrom.TAB_STRIP;
} else if (fromComponent.equals(TabGridSheetCoordinator.COMPONENT_NAME)) {
from = TabClosedFrom.TAB_GRID_SHEET;
} else if (fromComponent.equals(GridTabSwitcherCoordinator.COMPONENT_NAME)) {
from = TabClosedFrom.GRID_TAB_SWITCHER;
} else {
Log.w(TAG, "Attempting to close tab from Unknown UI");
return;
}
sTabClosedFromMapTabClosedFromMap.put(tabId, from);
}
private void onGroupClosedFrom(int tabId) {
sTabClosedFromMapTabClosedFromMap.put(tabId, TabClosedFrom.GRID_TAB_SWITCHER_GROUP);
}
public void setCloseAllRelatedTabsForTest(boolean closeAllRelatedTabs) { public void setCloseAllRelatedTabsForTest(boolean closeAllRelatedTabs) {
mCloseAllRelatedTabs = closeAllRelatedTabs; mCloseAllRelatedTabs = closeAllRelatedTabs;
} }
......
...@@ -5941,6 +5941,22 @@ should be able to be added at any place in this file. ...@@ -5941,6 +5941,22 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description> <description>Please enter the description of this user action.</description>
</action> </action>
<action name="GridTabSwitch.UndoCloseTab">
<owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner>
<description>
User undoes the closed tab that was closed from grid tab switcher.
</description>
</action>
<action name="GridTabSwitcher.UndoCloseTabGroup">
<owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner>
<description>
User undoes closed group that was closed from grid tab switcher.
</description>
</action>
<action name="HarmfulInterstitial.Advanced"> <action name="HarmfulInterstitial.Advanced">
<owner>felt@chromium.org</owner> <owner>felt@chromium.org</owner>
<description> <description>
...@@ -20387,6 +20403,14 @@ should be able to be added at any place in this file. ...@@ -20387,6 +20403,14 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description> <description>Please enter the description of this user action.</description>
</action> </action>
<action name="TabGridSheet.UndoCloseTab">
<owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner>
<description>
User undoes the closed tab that was closed from tab grid sheet.
</description>
</action>
<action name="TabGroup.Created"> <action name="TabGroup.Created">
<owner>yusufo@chromium.org</owner> <owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner> <owner>wychen@chromium.org</owner>
...@@ -20516,6 +20540,14 @@ should be able to be added at any place in this file. ...@@ -20516,6 +20540,14 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description> <description>Please enter the description of this user action.</description>
</action> </action>
<action name="TabStrip.UndoCloseTab">
<owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner>
<description>
User undoes the closed tab that was closed from tab strip.
</description>
</action>
<action name="TaskManagement.OpenInChromeActionButtonClicked"> <action name="TaskManagement.OpenInChromeActionButtonClicked">
<obsolete>The button option was removed and code deleted.</obsolete> <obsolete>The button option was removed and code deleted.</obsolete>
<owner>dfalcantara@chromium.org</owner> <owner>dfalcantara@chromium.org</owner>
......
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