Commit a73d601a authored by gogerald's avatar gogerald Committed by Commit Bot

[StartSurface] Add bookmarks, recent tabs, history and downloads menu items

Screenshots:
https://drive.google.com/file/d/1CGan4-nzQYh3xGi6le-vp070Xn6EI2qG/view?usp=sharing

Known issue to be fixed in the following CL:
Bookmarks and history is opened in standard tab in incognito mode tab switcher
when there is no incognito tab.

Bug: 1021577
Change-Id: I330b413603cafd3dcda184b29f552084ad60be0b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1896865
Commit-Queue: Ganggui Tang <gogerald@chromium.org>
Auto-Submit: Ganggui Tang <gogerald@chromium.org>
Reviewed-by: default avatarYusuf Ozuysal <yusufo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#722749}
parent 54f2731c
......@@ -42,7 +42,7 @@
<item android:id="@+id/new_incognito_tab_menu_id"
android:title="@string/menu_new_incognito_tab" />
<item android:id="@+id/all_bookmarks_menu_id"
android:title="@null" />
android:title="@string/menu_bookmarks" />
<item android:id="@+id/recent_tabs_menu_id"
android:title="@string/menu_recent_tabs" />
<item android:id="@+id/open_history_menu_id"
......@@ -90,18 +90,43 @@
<!-- Items shown only in the tab switcher -->
<group android:id="@+id/OVERVIEW_MODE_MENU"
android:visible="false">
<item android:id="@id/new_tab_menu_id"
android:title="@string/menu_new_tab" />
<item android:id="@id/new_incognito_tab_menu_id"
android:title="@string/menu_new_incognito_tab" />
<item android:id="@+id/close_all_tabs_menu_id"
android:title="@string/menu_close_all_tabs" />
<item android:id="@+id/close_all_incognito_tabs_menu_id"
android:title="@string/menu_close_all_incognito_tabs" />
<item android:id="@+id/menu_group_tabs"
android:title="@string/menu_group_tabs" />
<item android:id="@id/preferences_id"
android:title="@string/menu_preferences" />
<item android:id="@id/new_tab_menu_id"
android:title="@string/menu_new_tab" />
<item android:id="@id/new_incognito_tab_menu_id"
android:title="@string/menu_new_incognito_tab" />
<item android:id="@+id/close_all_tabs_menu_id"
android:title="@string/menu_close_all_tabs" />
<item android:id="@+id/close_all_incognito_tabs_menu_id"
android:title="@string/menu_close_all_incognito_tabs" />
<item android:id="@+id/menu_group_tabs"
android:title="@string/menu_group_tabs" />
<item android:id="@id/preferences_id"
android:title="@string/menu_preferences" />
</group>
<!-- Items shown only in the tab switcher when start surface is enabled -->
<group android:id="@+id/START_SURFACE_MODE_MENU"
android:visible="false">
<item android:id="@id/new_tab_menu_id"
android:title="@string/menu_new_tab" />
<item android:id="@id/new_incognito_tab_menu_id"
android:title="@string/menu_new_incognito_tab" />
<item android:id="@+id/all_bookmarks_menu_id"
android:title="@string/menu_bookmarks" />
<item android:id="@+id/recent_tabs_menu_id"
android:title="@string/menu_recent_tabs" />
<item android:id="@+id/open_history_menu_id"
android:title="@string/menu_history" />
<item android:id="@+id/downloads_menu_id"
android:title="@string/menu_downloads" />
<item android:id="@+id/close_all_tabs_menu_id"
android:title="@string/menu_close_all_tabs" />
<item android:id="@+id/close_all_incognito_tabs_menu_id"
android:title="@string/menu_close_all_incognito_tabs" />
<item android:id="@+id/menu_group_tabs"
android:title="@string/menu_group_tabs" />
<item android:id="@id/preferences_id"
android:title="@string/menu_preferences" />
</group>
<!-- Items shown only when the tablet has no visible tabs -->
......
......@@ -2154,6 +2154,17 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
return true;
}
if (id == R.id.open_history_menu_id) {
// 'currentTab' could only be null when opening history from start surface, which is
// not available on tablet.
assert (isTablet() && currentTab != null) || !isTablet();
if (currentTab != null && NewTabPage.isNTPUrl(currentTab.getUrl())) {
NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_HISTORY_MANAGER);
}
RecordUserAction.record("MobileMenuHistory");
HistoryManagerUtils.showHistoryManager(this, currentTab);
}
// All the code below assumes currentTab is not null, so return early if it is null.
if (currentTab == null) {
return false;
......@@ -2179,12 +2190,6 @@ public abstract class ChromeActivity<C extends ChromeActivityComponent>
} else if (id == R.id.info_menu_id) {
PageInfoController.show(
this, currentTab, null, PageInfoController.OpenedFromSource.MENU);
} else if (id == R.id.open_history_menu_id) {
if (NewTabPage.isNTPUrl(currentTab.getUrl())) {
NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_HISTORY_MANAGER);
}
RecordUserAction.record("MobileMenuHistory");
HistoryManagerUtils.showHistoryManager(this, currentTab);
} else if (id == R.id.translate_id) {
RecordUserAction.record("MobileMenuTranslate");
Tracker tracker =
......
......@@ -1295,11 +1295,6 @@ public class ChromeTabbedActivity extends ChromeActivity implements ScreenshotMo
TabModel tabModel = getCurrentTabModel();
switch (tabOpenType) {
case TabOpenType.REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB:
// Used by the bookmarks application.
if (tabModel.getCount() > 0 && mUIWithNativeInitialized
&& mOverviewModeController.overviewVisible()) {
mOverviewModeController.hideOverview(true);
}
mTabModelSelectorImpl.tryToRestoreTabStateForUrl(url);
int tabToBeClobberedIndex = TabModelUtils.getTabIndexByUrl(tabModel, url);
Tab tabToBeClobbered = tabModel.getTabAt(tabToBeClobberedIndex);
......@@ -1333,11 +1328,6 @@ public class ChromeTabbedActivity extends ChromeActivity implements ScreenshotMo
TabModelUtils.setIndex(tabModel, tabIndex);
}
if (tabModel.getCount() > 0 && mUIWithNativeInitialized
&& mOverviewModeController.overviewVisible()) {
mOverviewModeController.hideOverview(true);
}
logMobileReceivedExternalIntent(externalAppId, intent);
break;
case TabOpenType.CLOBBER_CURRENT_TAB:
......@@ -1448,9 +1438,14 @@ public class ChromeTabbedActivity extends ChromeActivity implements ScreenshotMo
assert false : "Unknown TabOpenType: " + tabOpenType;
break;
}
getToolbarManager().setUrlBarFocusOnceNativeInitialized(focus,
focus ? LocationBar.OmniboxFocusReason.LAUNCH_NEW_INCOGNITO_TAB
: LocationBar.OmniboxFocusReason.UNFOCUS);
if (tabModel.getCount() > 0 && isInOverviewMode() && !isTablet()) {
mOverviewModeController.hideOverview(true);
}
}
@Override
......@@ -1708,26 +1703,33 @@ public class ChromeTabbedActivity extends ChromeActivity implements ScreenshotMo
getTabCreator(true).launchNTP();
}
} else if (id == R.id.all_bookmarks_menu_id) {
if (currentTab != null) {
getCompositorViewHolder().hideKeyboard(() -> {
BookmarkUtils.showBookmarkManager(ChromeTabbedActivity.this);
});
if (currentTabIsNtp) {
NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_BOOKMARKS_MANAGER);
}
RecordUserAction.record("MobileMenuAllBookmarks");
// Note that 'currentTab' could be null in overview mode when start surface is
// enabled.
getCompositorViewHolder().hideKeyboard(
() -> { BookmarkUtils.showBookmarkManager(ChromeTabbedActivity.this); });
if (currentTabIsNtp) {
NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_BOOKMARKS_MANAGER);
}
RecordUserAction.record("MobileMenuAllBookmarks");
} else if (id == R.id.recent_tabs_menu_id) {
LoadUrlParams params =
new LoadUrlParams(UrlConstants.RECENT_TABS_URL, PageTransition.AUTO_BOOKMARK);
if (currentTab != null) {
LoadUrlParams params = new LoadUrlParams(
UrlConstants.RECENT_TABS_URL, PageTransition.AUTO_BOOKMARK);
currentTab.loadUrl(params);
if (currentTabIsNtp) {
NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_RECENT_TABS_MANAGER);
}
} else {
// Note that 'currentTab' could be null in overview mode when start surface is
// enabled.
getTabCreator(getCurrentTabModel().isIncognito())
.createNewTab(params, TabLaunchType.FROM_CHROME_UI, null);
}
if (isInOverviewMode() && !isTablet()) {
mOverviewModeController.hideOverview(true);
}
RecordUserAction.record("MobileMenuRecentTabs");
if (currentTabIsNtp) {
NewTabPageUma.recordAction(NewTabPageUma.ACTION_OPENED_RECENT_TABS_MANAGER);
}
RecordUserAction.record("MobileMenuRecentTabs");
} else if (id == R.id.close_tab) {
getCurrentTabModel().closeTab(currentTab, true, false, true);
RecordUserAction.record("MobileTabClosed");
......
......@@ -17,6 +17,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import org.chromium.base.Callback;
......@@ -74,6 +75,15 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
private @Nullable Callback<OverviewModeBehavior> mOverviewModeSupplierCallback;
private Callback<BookmarkBridge> mBookmarkBridgeSupplierCallback;
private boolean mUpdateMenuItemVisible;
@IntDef({MenuGroup.INVALID, MenuGroup.PAGE_MENU, MenuGroup.OVERVIEW_MODE_MENU,
MenuGroup.START_SURFACE_MODE_MENU, MenuGroup.TABLET_EMPTY_MODE_MENU})
private @interface MenuGroup {
int INVALID = -1;
int PAGE_MENU = 0;
int OVERVIEW_MODE_MENU = 1;
int START_SURFACE_MODE_MENU = 2;
int TABLET_EMPTY_MODE_MENU = 3;
}
protected @Nullable OverviewModeBehavior mOverviewModeBehavior;
protected BookmarkBridge mBookmarkBridge;
......@@ -157,34 +167,36 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
@Override
public void prepareMenu(Menu menu, AppMenuHandler handler) {
// Exactly one of these will be true, depending on the type of menu showing.
boolean isPageMenu = shouldShowPageMenu();
boolean isOverviewMenu;
boolean isTabletEmptyModeMenu;
// Determine which menu to show.
@MenuGroup
int menuGroup = MenuGroup.INVALID;
if (shouldShowPageMenu()) menuGroup = MenuGroup.PAGE_MENU;
boolean isOverview =
mOverviewModeBehavior != null && mOverviewModeBehavior.overviewVisible();
boolean isIncognito = mTabModelSelector.getCurrentModel().isIncognito();
Tab currentTab = mActivityTabProvider.get();
// Determine which menu to show.
if (mIsTablet) {
boolean hasTabs = mTabModelSelector.getCurrentModel().getCount() != 0;
isOverviewMenu = hasTabs && isOverview;
isTabletEmptyModeMenu = !hasTabs;
} else {
isOverviewMenu = isOverview;
isTabletEmptyModeMenu = false;
if (hasTabs && isOverview) {
menuGroup = MenuGroup.OVERVIEW_MODE_MENU;
} else if (!hasTabs) {
menuGroup = MenuGroup.TABLET_EMPTY_MODE_MENU;
}
} else if (isOverview) {
menuGroup = FeatureUtilities.isStartSurfaceEnabled() ? MenuGroup.START_SURFACE_MODE_MENU
: MenuGroup.OVERVIEW_MODE_MENU;
}
int visibleMenus =
(isPageMenu ? 1 : 0) + (isOverviewMenu ? 1 : 0) + (isTabletEmptyModeMenu ? 1 : 0);
assert visibleMenus == 1;
assert menuGroup != MenuGroup.INVALID;
menu.setGroupVisible(R.id.PAGE_MENU, isPageMenu);
menu.setGroupVisible(R.id.OVERVIEW_MODE_MENU, isOverviewMenu);
menu.setGroupVisible(R.id.TABLET_EMPTY_MODE_MENU, isTabletEmptyModeMenu);
menu.setGroupVisible(R.id.PAGE_MENU, menuGroup == MenuGroup.PAGE_MENU);
menu.setGroupVisible(R.id.OVERVIEW_MODE_MENU, menuGroup == MenuGroup.OVERVIEW_MODE_MENU);
menu.setGroupVisible(
R.id.START_SURFACE_MODE_MENU, menuGroup == MenuGroup.START_SURFACE_MODE_MENU);
menu.setGroupVisible(
R.id.TABLET_EMPTY_MODE_MENU, menuGroup == MenuGroup.TABLET_EMPTY_MODE_MENU);
if (isPageMenu && currentTab != null) {
boolean isIncognito = mTabModelSelector.getCurrentModel().isIncognito();
Tab currentTab = mActivityTabProvider.get();
if (menuGroup == MenuGroup.PAGE_MENU && currentTab != null) {
String url = currentTab.getUrl();
boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_URL_PREFIX)
|| url.startsWith(UrlConstants.CHROME_NATIVE_URL_PREFIX);
......@@ -235,13 +247,6 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
.setVisible(mMultiWindowModeStateDispatcher.isOpenInOtherWindowSupported()
&& hasMoreThanOneTab);
MenuItem recentTabsMenuItem = menu.findItem(R.id.recent_tabs_menu_id);
recentTabsMenuItem.setVisible(!isIncognito);
recentTabsMenuItem.setTitle(R.string.menu_recent_tabs);
MenuItem allBookmarksMenuItem = menu.findItem(R.id.all_bookmarks_menu_id);
allBookmarksMenuItem.setTitle(mContext.getString(R.string.menu_bookmarks));
// Don't allow either "chrome://" pages or interstitial pages to be shared.
menu.findItem(R.id.share_row_menu_id)
.setVisible(
......@@ -284,7 +289,7 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
ChromeSwitches.ENABLE_VR_SHELL_DEV));
}
if (isOverviewMenu) {
if (menuGroup == MenuGroup.OVERVIEW_MODE_MENU) {
if (isIncognito) {
// Hide normal close all tabs item.
menu.findItem(R.id.close_all_tabs_menu_id).setVisible(false);
......@@ -314,10 +319,13 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
// than one menu items.
for (int i = 0; i < menu.size(); ++i) {
MenuItem item = menu.getItem(i);
if (item.getItemId() == R.id.new_incognito_tab_menu_id) {
item.setTitle(R.string.menu_new_incognito_tab);
} else if (item.getItemId() == R.id.close_all_incognito_tabs_menu_id) {
item.setTitle(R.string.menu_close_all_incognito_tabs);
if (item.getItemId() == R.id.recent_tabs_menu_id) {
if ((menuGroup == MenuGroup.START_SURFACE_MODE_MENU
&& item.getGroupId() == R.id.START_SURFACE_MODE_MENU)
|| (menuGroup == MenuGroup.PAGE_MENU
&& item.getGroupId() == R.id.PAGE_MENU)) {
item.setVisible(!isIncognito);
}
}
}
......
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