Commit 8b84dc4a authored by Shimi Zhang's avatar Shimi Zhang Committed by Commit Bot

[Android] Add AdditionalMenuItemProvider interface

This CL is introducing an interface allow us to add more menu items
under certain circumstance.

A doc to explain weird decisions is here:
https://docs.google.com/document/d/1Zzeg9w0LQDG7hUkuJY4YNXFVKEknNiH8tv2zAOUh4G0

Bug: 808510, b/70523982
Change-Id: I3bec6ad76ad8ec5a3a54b406d0e47f7c0c2168ac
Reviewed-on: https://chromium-review.googlesource.com/977222Reviewed-by: default avatarBo <boliu@chromium.org>
Reviewed-by: default avatarPedro Amaral <amaralp@chromium.org>
Commit-Queue: Shimi Zhang <ctzsm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#545671}
parent cdb6910c
......@@ -208,6 +208,7 @@ android_library("content_java") {
"java/src/org/chromium/content/browser/picker/WeekPickerDialog.java",
"java/src/org/chromium/content/browser/remoteobjects/RemoteObjectAuditorImpl.java",
"java/src/org/chromium/content/browser/remoteobjects/RemoteObjectImpl.java",
"java/src/org/chromium/content/browser/selection/AdditionalMenuItemProvider.java",
"java/src/org/chromium/content/browser/selection/FloatingActionModeCallback.java",
"java/src/org/chromium/content/browser/selection/FloatingPastePopupMenu.java",
"java/src/org/chromium/content/browser/selection/HandleViewResources.java",
......
......@@ -5,6 +5,7 @@
package org.chromium.content.browser;
import org.chromium.base.ThreadUtils;
import org.chromium.content.browser.selection.AdditionalMenuItemProvider;
import org.chromium.content.browser.selection.SelectionInsertionHandleObserver;
import org.chromium.content.browser.selection.SelectionPopupControllerImpl;
......@@ -46,4 +47,12 @@ public class ContentClassFactory {
// Implemented by a subclass.
return null;
}
/**
* Creates AddtionalMenuItems object.
*/
public AdditionalMenuItemProvider createAddtionalMenuItemProvider() {
// Implemented by a subclass.
return null;
}
}
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.content.browser.selection;
import android.content.Context;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.textclassifier.TextClassification;
/**
* An interface for adding more menu items.
*/
public interface AdditionalMenuItemProvider {
/**
* Add menu items to the menu passed in.
* @param context The context from app.
* @param menu Add menu items to this menu.
* @param classification Providing info to generate menu items.
*/
void addMenuItems(Context context, Menu menu, TextClassification classification);
/**
* Call this to trigger internal cleanup.
*/
void clearMenuItemListeners();
/**
* Perform action for menu item.
* @param item The clicked menu item.
* @param view Perform action on this view.
*/
void performAction(MenuItem item, View view);
}
......@@ -173,6 +173,8 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
*/
private SelectionInsertionHandleObserver mHandleObserver;
private AdditionalMenuItemProvider mAdditionalMenuItemProvider;
/**
* An interface for getting {@link View} for readback.
*/
......@@ -274,6 +276,7 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
mResultCallback = new SmartSelectionCallback();
mLastSelectedText = "";
initHandleObserver();
mAdditionalMenuItemProvider = ContentClassFactory.get().createAddtionalMenuItemProvider();
if (initializeNative) mNativeSelectionPopupController = nativeInit(mWebContents);
getPopupController().registerPopup(this);
mInitialized = true;
......@@ -663,9 +666,14 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
if (mAdditionalMenuItemProvider != null) {
mAdditionalMenuItemProvider.clearMenuItemListeners();
}
// Only remove action mode items we added. See more http://crbug.com/709878.
menu.removeGroup(R.id.select_action_menu_default_items);
menu.removeGroup(R.id.select_action_menu_assist_items);
menu.removeGroup(R.id.select_action_menu_text_processing_menus);
menu.removeGroup(android.R.id.textAssist);
createActionMenu(mode, menu);
return true;
}
......@@ -703,6 +711,11 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
setPasteAsPlainTextMenuItemTitle(menu);
if (mClassificationResult != null && mAdditionalMenuItemProvider != null) {
mAdditionalMenuItemProvider.addMenuItems(
mContext, menu, mClassificationResult.textClassification);
}
if (!hasSelection() || isSelectionPassword()) return;
initializeTextProcessingMenu(menu);
......@@ -857,10 +870,10 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
if (hasSelection() && mSelectionMetricsLogger != null) {
mSelectionMetricsLogger.logSelectionAction(mLastSelectedText, mLastSelectionOffset,
getActionType(id), mClassificationResult);
getActionType(id, groupId), mClassificationResult);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && id == android.R.id.textAssist) {
if (groupId == R.id.select_action_menu_assist_items && id == android.R.id.textAssist) {
doAssistAction();
mode.finish();
} else if (id == R.id.select_action_menu_select_all) {
......@@ -888,6 +901,11 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
processText(item.getIntent());
// The ActionMode is not dismissed to match the behavior with
// TextView in Android M.
} else if (groupId == android.R.id.textAssist) {
if (mAdditionalMenuItemProvider != null) {
mAdditionalMenuItemProvider.performAction(item, mView);
mode.finish();
}
} else {
return false;
}
......@@ -937,7 +955,10 @@ public class SelectionPopupControllerImpl extends ActionModeCallbackHelper
return mWebContents.getRenderCoordinates().getDeviceScaleFactor();
}
private int getActionType(int menuItemId) {
private int getActionType(int menuItemId, int menuItemGroupId) {
if (menuItemGroupId == android.R.id.textAssist) {
return SmartSelectionMetricsLogger.ActionType.SMART_SHARE;
}
if (menuItemId == R.id.select_action_menu_select_all) {
return SmartSelectionMetricsLogger.ActionType.SELECT_ALL;
}
......
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