blob: e4b6671865339cee35268d8a21144ed333de61e8 [file] [log] [blame]
// Copyright 2015 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.input;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Rect;
import android.os.Build;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import org.chromium.content.R;
import org.chromium.content.browser.SelectionPopupController;
import org.chromium.ui.base.DeviceFormFactor;
/**
* Paste popup implementation based on floating ActionModes.
*/
@TargetApi(Build.VERSION_CODES.M)
public class FloatingPastePopupMenu implements PastePopupMenu {
private final View mParent;
private final PastePopupMenuDelegate mDelegate;
private final Context mContext;
private ActionMode mActionMode;
private Rect mSelectionRect;
public FloatingPastePopupMenu(Context context, View parent, PastePopupMenuDelegate delegate) {
assert Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
mParent = parent;
mDelegate = delegate;
mContext = context;
}
@Override
public void show(Rect selectionRect) {
mSelectionRect = selectionRect;
if (mActionMode != null) {
mActionMode.invalidateContentRect();
return;
}
ensureActionMode();
}
@Override
public void hide() {
if (mActionMode != null) {
mActionMode.finish();
mActionMode = null;
}
}
private void ensureActionMode() {
if (mActionMode != null) return;
ActionMode actionMode = mParent.startActionMode(
new ActionModeCallback(), ActionMode.TYPE_FLOATING);
if (actionMode != null) {
// crbug.com/651706
LGEmailActionModeWorkaround.runIfNecessary(mContext, actionMode);
assert actionMode.getType() == ActionMode.TYPE_FLOATING;
mActionMode = actionMode;
}
}
private class ActionModeCallback extends ActionMode.Callback2 {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
createPasteMenu(mode, menu);
return true;
}
private void createPasteMenu(ActionMode mode, Menu menu) {
mode.setTitle(DeviceFormFactor.isTablet(mContext)
? mContext.getString(R.string.actionbar_textselection_title) : null);
mode.setSubtitle(null);
SelectionPopupController.initializeMenu(mContext, mode, menu);
if (!mDelegate.canPaste()) menu.removeItem(R.id.select_action_menu_paste);
if (!mDelegate.canSelectAll()) menu.removeItem(R.id.select_action_menu_select_all);
if (!mDelegate.canPasteAsPlainText()) {
menu.removeItem(R.id.select_action_menu_paste_as_plain_text);
}
// TODO(ctzsm): Remove runtime title set after O SDK rolls.
MenuItem item = menu.findItem(R.id.select_action_menu_paste_as_plain_text);
if (item != null) {
item.setTitle(mContext.getResources().getIdentifier(
"paste_as_plain_text", "string", "android"));
}
menu.removeItem(R.id.select_action_menu_cut);
menu.removeItem(R.id.select_action_menu_copy);
menu.removeItem(R.id.select_action_menu_share);
menu.removeItem(R.id.select_action_menu_web_search);
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
int id = item.getItemId();
if (id == R.id.select_action_menu_paste) {
mDelegate.paste();
mode.finish();
}
if (id == R.id.select_action_menu_paste_as_plain_text) {
mDelegate.pasteAsPlainText();
mode.finish();
}
if (id == R.id.select_action_menu_select_all) {
mDelegate.selectAll();
mode.finish();
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
}
@Override
public void onGetContentRect(ActionMode mode, View view, Rect outRect) {
outRect.set(mSelectionRect);
}
};
}