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;
*/
public class GridTabSwitcherCoordinator
implements Destroyable, GridTabSwitcher, GridTabSwitcherMediator.ResetHandler {
private final static String COMPONENT_NAME = "GridTabSwitcher";
final static String COMPONENT_NAME = "GridTabSwitcher";
private final PropertyModelChangeProcessor mContainerViewChangeProcessor;
private final ActivityLifecycleDispatcher mLifecycleDispatcher;
private final TabListCoordinator mTabGridCoordinator;
......
......@@ -28,7 +28,7 @@ import java.util.List;
* objects.
*/
public class TabGridSheetCoordinator implements Destroyable {
public final static String COMPONENT_NAME = "TabGridSheet";
final static String COMPONENT_NAME = "TabGridSheet";
private final Context mContext;
private final TabListCoordinator mTabGridCoordinator;
private final TabGridSheetMediator mMediator;
......
......@@ -34,7 +34,7 @@ import java.util.List;
*/
public class TabGroupUiCoordinator
implements TabGroupUiMediator.ResetHandler, TabGroupUi, PauseResumeWithNativeObserver {
public final static String COMPONENT_NAME = "TabStrip";
final static String COMPONENT_NAME = "TabStrip";
private final Context mContext;
private final PropertyModel mTabStripToolbarModel;
private final ThemeColorProvider mThemeColorProvider;
......
......@@ -8,12 +8,14 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.View;
import org.chromium.base.Callback;
import org.chromium.base.Log;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.metrics.RecordUserAction;
import org.chromium.chrome.browser.native_page.NativePageFactory;
......@@ -32,8 +34,12 @@ import org.chromium.components.feature_engagement.FeatureConstants;
import org.chromium.content_public.browser.NavigationHandle;
import org.chromium.ui.modelutil.PropertyModel;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.HashMap;
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
......@@ -110,6 +116,20 @@ class TabListMediator {
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 TabListModel mModel;
private final TabModelSelector mTabModelSelector;
......@@ -241,6 +261,28 @@ class TabListMediator {
@Override
public void tabClosureUndone(Tab tab) {
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
......@@ -261,13 +303,16 @@ class TabListMediator {
@Override
public void run(int tabId) {
RecordUserAction.record("MobileTabClosed." + mComponentName);
if (mCloseAllRelatedTabs) {
List<Tab> related = getRelatedTabsForId(tabId);
if (related.size() > 1) {
onGroupClosedFrom(tabId);
mTabModelSelector.getCurrentModel().closeMultipleTabs(related, true);
return;
}
}
onTabClosedFrom(tabId, mComponentName);
mTabModelSelector.getCurrentModel().closeTab(
TabModelUtils.getTabById(mTabModelSelector.getCurrentModel(), tabId), false,
false, true);
......@@ -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) {
mCloseAllRelatedTabs = closeAllRelatedTabs;
}
......
......@@ -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>
</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">
<owner>felt@chromium.org</owner>
<description>
......@@ -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>
</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">
<owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner>
......@@ -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>
</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">
<obsolete>The button option was removed and code deleted.</obsolete>
<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