[Touchless] Context menu for "Last tab" button
In this CL I only add "Add to my apps" item. Remove will be handled by
separate CL.
BUG=959317
R=​wylieb@chromium.org
(cherry picked from commit fc3d63a11c6b3e80c37f54d953cd048f1c7c5918)
Change-Id: Idc200d40c3a704b78f5a733485f037819d591dd6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1639521
Reviewed-by: Brandon Wylie <wylieb@chromium.org>
Commit-Queue: Pavel Yatsuk <pavely@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#665342}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1653289
Reviewed-by: Pavel Yatsuk <pavely@chromium.org>
Cr-Commit-Position: refs/branch-heads/3809@{#218}
Cr-Branched-From: d82dec1a818f378c464ba307ddd9c92133eac355-refs/heads/master@{#665002}
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabMediator.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabMediator.java
index 50ee47e..b790c3dc 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabMediator.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabMediator.java
@@ -17,6 +17,7 @@
import org.chromium.chrome.browser.history.BrowsingHistoryBridge;
import org.chromium.chrome.browser.history.HistoryItem;
import org.chromium.chrome.browser.history.HistoryProvider;
+import org.chromium.chrome.browser.native_page.ContextMenuManager;
import org.chromium.chrome.browser.native_page.NativePageHost;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.util.UrlUtilities;
@@ -120,12 +121,12 @@
boolean willReturnIcon = mIconBridge.getLargeIconForUrl(item.getUrl(),
mContext.getResources().getDimensionPixelSize(R.dimen.open_last_tab_icon_size),
(icon, fallbackColor, isFallbackColorDefault, iconType) -> {
- setAndShowButton(item.getUrl(), icon, fallbackColor);
+ setAndShowButton(item.getUrl(), icon, fallbackColor, title);
});
// False if icon bridge won't call us back.
if (!willReturnIcon) {
- setAndShowButton(item.getUrl(), null, R.color.default_icon_color);
+ setAndShowButton(item.getUrl(), null, R.color.default_icon_color, title);
}
mModel.set(OpenLastTabProperties.OPEN_LAST_TAB_LOAD_SUCCESS, true);
}
@@ -136,7 +137,7 @@
@Override
public void hasOtherFormsOfBrowsingData(boolean hasOtherForms) {}
- private void setAndShowButton(String url, Bitmap icon, int fallbackColor) {
+ private void setAndShowButton(String url, Bitmap icon, int fallbackColor, String title) {
mModel.set(OpenLastTabProperties.OPEN_LAST_TAB_ON_CLICK_LISTENER, view -> {
mNativePageHost.loadUrl(new LoadUrlParams(url, PageTransition.AUTO_BOOKMARK),
/* Explore page is never off the record. */ false);
@@ -147,5 +148,36 @@
icon = mIconGenerator.generateIconForUrl(url);
}
mModel.set(OpenLastTabProperties.OPEN_LAST_TAB_FAVICON, icon);
+
+ final Bitmap shortcutIcon = icon;
+ TouchlessContextMenuManager.Delegate delegate =
+ new TouchlessContextMenuManager.EmptyDelegate() {
+ @Override
+ public boolean isItemSupported(
+ @ContextMenuManager.ContextMenuItemId int menuItemId) {
+ return menuItemId == ContextMenuManager.ContextMenuItemId.ADD_TO_MY_APPS;
+ }
+
+ @Override
+ public String getUrl() {
+ return url;
+ }
+
+ @Override
+ public String getContextMenuTitle() {
+ return title;
+ }
+
+ @Override
+ public String getTitle() {
+ return title;
+ }
+
+ @Override
+ public Bitmap getIconBitmap() {
+ return shortcutIcon;
+ }
+ };
+ mModel.set(OpenLastTabProperties.CONTEXT_MENU_DELEGATE, delegate);
}
}
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabProperties.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabProperties.java
index 6c2ee7e..3cde4fe 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabProperties.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabProperties.java
@@ -8,6 +8,7 @@
import android.view.View;
import org.chromium.base.Callback;
+import org.chromium.chrome.browser.native_page.ContextMenuManager;
import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel;
@@ -41,9 +42,13 @@
.ReadableObjectPropertyKey<Callback<View>> ASYNC_FOCUS_DELEGATE =
new PropertyModel.ReadableObjectPropertyKey<>();
+ public static final PropertyModel
+ .WritableObjectPropertyKey<ContextMenuManager.Delegate> CONTEXT_MENU_DELEGATE =
+ new PropertyModel.WritableObjectPropertyKey<>();
+
// Property keys for the open last tab button.
public static final PropertyKey[] ALL_KEYS = {OPEN_LAST_TAB_ON_CLICK_LISTENER,
OPEN_LAST_TAB_FAVICON, OPEN_LAST_TAB_TITLE, OPEN_LAST_TAB_TIMESTAMP,
OPEN_LAST_TAB_LOAD_SUCCESS, OPEN_LAST_TAB_FIRST_LAUNCH, ON_FOCUS_CALLBACK,
- SHOULD_FOCUS_VIEW, ASYNC_FOCUS_DELEGATE};
+ SHOULD_FOCUS_VIEW, ASYNC_FOCUS_DELEGATE, CONTEXT_MENU_DELEGATE};
}
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabView.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabView.java
index e50e07d7..0a40482 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabView.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabView.java
@@ -16,6 +16,7 @@
import android.widget.TextView;
import org.chromium.base.Callback;
+import org.chromium.chrome.browser.native_page.ContextMenuManager;
import org.chromium.chrome.touchless.R;
/**
@@ -102,4 +103,8 @@
void setAsyncFocusDelegate(Callback<View> asyncFocusDelegate) {
mAsyncFocusDelegate = asyncFocusDelegate;
}
+
+ void setContextMenuDelegate(ContextMenuManager.Delegate delegate) {
+ ContextMenuManager.registerViewForTouchlessContextMenu(mLastTabView, delegate);
+ }
}
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabViewBinder.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabViewBinder.java
index 76de5934..a448710 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabViewBinder.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/OpenLastTabViewBinder.java
@@ -32,6 +32,8 @@
model.set(OpenLastTabProperties.SHOULD_FOCUS_VIEW, false);
} else if (propertyKey == OpenLastTabProperties.ASYNC_FOCUS_DELEGATE) {
view.setAsyncFocusDelegate(model.get(OpenLastTabProperties.ASYNC_FOCUS_DELEGATE));
+ } else if (propertyKey == OpenLastTabProperties.CONTEXT_MENU_DELEGATE) {
+ view.setContextMenuDelegate(model.get(OpenLastTabProperties.CONTEXT_MENU_DELEGATE));
} else {
assert false : "Unhandled property detected.";
}
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
index 3230c33..cbbe04a 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessContextMenuManager.java
@@ -43,6 +43,22 @@
Bitmap getIconBitmap();
}
+ /**
+ * Empty implementation of Delegate to allow derived classes to only implement methods they
+ * need.
+ */
+ public static class EmptyDelegate extends ContextMenuManager.EmptyDelegate implements Delegate {
+ @Override
+ public String getTitle() {
+ return null;
+ }
+
+ @Override
+ public Bitmap getIconBitmap() {
+ return null;
+ }
+ }
+
private final Activity mActivity;
private final ModalDialogManager mDialogManager;
private PropertyModel mTouchlessMenuModel;