[go: up one dir, main page]

[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;