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