From e5bc7fa4e83b33fc3eee343e560a4f8cb91eacd6 Mon Sep 17 00:00:00 2001 From: Mert Tümer Date: Wed, 14 Mar 2018 19:19:56 +0300 Subject: tdf#96796 - Added clipboard actions for the Android Viewer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I52e134532ab70e765b6ccd929f189be84f9c9a90 Signed-off-by: Mert Tümer Reviewed-on: https://gerrit.libreoffice.org/51286 Tested-by: Jenkins Reviewed-by: Thorsten Behrens --- .../java/org/libreoffice/InvalidationHandler.java | 3 + .../java/org/libreoffice/LOKitTileProvider.java | 21 +++++++ .../src/java/org/libreoffice/TileProvider.java | 13 ++++ .../java/org/libreoffice/ToolbarController.java | 70 ++++++++++++++++++++++ 4 files changed, 107 insertions(+) (limited to 'android/source/src/java/org/libreoffice') diff --git a/android/source/src/java/org/libreoffice/InvalidationHandler.java b/android/source/src/java/org/libreoffice/InvalidationHandler.java index e411770976c9..eb22f6c8f3d3 100644 --- a/android/source/src/java/org/libreoffice/InvalidationHandler.java +++ b/android/source/src/java/org/libreoffice/InvalidationHandler.java @@ -452,6 +452,7 @@ public class InvalidationHandler implements Document.MessageCallback, Office.Mes if (mContext.isSpreadsheet()) { mDocumentOverlay.showHeaderSelection(null); } + mContext.getToolbarController().showHideClipboardCutAndCopy(false); } else { List rectangles = convertPayloadToRectangles(payload); if (mState != OverlayState.SELECTION) { @@ -462,6 +463,8 @@ public class InvalidationHandler implements Document.MessageCallback, Office.Mes if (mContext.isSpreadsheet()) { mDocumentOverlay.showHeaderSelection(rectangles.get(0)); } + String selectedText = mContext.getTileProvider().getTextSelection(""); + mContext.getToolbarController().showClipboardActions(selectedText); } } diff --git a/android/source/src/java/org/libreoffice/LOKitTileProvider.java b/android/source/src/java/org/libreoffice/LOKitTileProvider.java index df5a7d780b78..4a8720cb9d01 100644 --- a/android/source/src/java/org/libreoffice/LOKitTileProvider.java +++ b/android/source/src/java/org/libreoffice/LOKitTileProvider.java @@ -603,6 +603,27 @@ class LOKitTileProvider implements TileProvider { setTextSelection(Document.SET_TEXT_SELECTION_RESET, documentCoordinate); } + /** + * @param mimeType + * @return + */ + @Override + public String getTextSelection(String mimeType) { + return mDocument.getTextSelection(mimeType); + } + + /** + * paste + * @param mimeType + * @param data + * @return + */ + @Override + public boolean paste(String mimeType, String data) { + return mDocument.paste(mimeType, data); + } + + /** * @see org.libreoffice.TileProvider#setGraphicSelectionStart(android.graphics.PointF) */ diff --git a/android/source/src/java/org/libreoffice/TileProvider.java b/android/source/src/java/org/libreoffice/TileProvider.java index 71c27146e6f1..10d578337680 100644 --- a/android/source/src/java/org/libreoffice/TileProvider.java +++ b/android/source/src/java/org/libreoffice/TileProvider.java @@ -135,6 +135,19 @@ public interface TileProvider { */ void setTextSelectionEnd(PointF documentCoordinate); + /** + * get selected text + * @param mimeType + */ + String getTextSelection(String mimeType); + + /** + * copy + * @param mimeType + * @param data + * @return + */ + boolean paste(String mimeType, String data); /** * Send text selection reset coordinate. * @param documentCoordinate diff --git a/android/source/src/java/org/libreoffice/ToolbarController.java b/android/source/src/java/org/libreoffice/ToolbarController.java index 87a84f0878d1..21e3e5ca7be2 100644 --- a/android/source/src/java/org/libreoffice/ToolbarController.java +++ b/android/source/src/java/org/libreoffice/ToolbarController.java @@ -8,8 +8,12 @@ */ package org.libreoffice; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.support.v7.widget.Toolbar; import android.util.Log; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; @@ -25,6 +29,9 @@ public class ToolbarController implements Toolbar.OnMenuItemClickListener { private final Menu mMainMenu; private boolean isEditModeOn = false; + private String clipboardText = null; + ClipboardManager clipboardManager; + ClipData clipData; public ToolbarController(LibreOfficeMainActivity context, Toolbar toolbarTop) { mToolbarTop = toolbarTop; @@ -35,6 +42,7 @@ public class ToolbarController implements Toolbar.OnMenuItemClickListener { switchToViewMode(); mMainMenu = mToolbarTop.getMenu(); + clipboardManager = (ClipboardManager)mContext.getSystemService(Context.CLIPBOARD_SERVICE); } public void disableMenuItem(final int menuItemId, final boolean disabled) { @@ -77,6 +85,48 @@ public class ToolbarController implements Toolbar.OnMenuItemClickListener { }); } + /** + * Show clipboard Actions on the toolbar + * */ + void showClipboardActions(final String value){ + LOKitShell.getMainHandler().post(new Runnable() { + @Override + public void run() { + if(value != null){ + mMainMenu.setGroupVisible(R.id.group_edit_actions, false); + mMainMenu.setGroupVisible(R.id.group_edit_clipboard, true); + if(getEditModeStatus()){ + showHideClipboardCutAndCopy(true); + } else { + mMainMenu.findItem(R.id.action_cut).setVisible(false); + mMainMenu.findItem(R.id.action_paste).setVisible(false); + } + clipboardText = value; + } + } + }); + } + + void hideClipboardActions(){ + LOKitShell.getMainHandler().post(new Runnable() { + @Override + public void run() { + mMainMenu.setGroupVisible(R.id.group_edit_actions, getEditModeStatus()); + mMainMenu.setGroupVisible(R.id.group_edit_clipboard, false); + } + }); + } + + void showHideClipboardCutAndCopy(final boolean option){ + LOKitShell.getMainHandler().post(new Runnable() { + @Override + public void run() { + mMainMenu.findItem(R.id.action_copy).setVisible(option); + mMainMenu.findItem(R.id.action_cut).setVisible(option); + } + }); + } + /** * Change the toolbar to view mode. */ @@ -141,6 +191,26 @@ public class ToolbarController implements Toolbar.OnMenuItemClickListener { case R.id.action_add_worksheet: mContext.addPart(); return true; + case R.id.action_back: + hideClipboardActions(); + return true; + case R.id.action_copy: + LOKitShell.sendEvent(new LOEvent(LOEvent.UNO_COMMAND, ".uno:Copy")); + clipData = ClipData.newPlainText("clipboard data", clipboardText); + clipboardManager.setPrimaryClip(clipData); + Toast.makeText(mContext, mContext.getResources().getString(R.string.action_text_copied), Toast.LENGTH_SHORT).show(); + return true; + case R.id.action_paste: + clipData = clipboardManager.getPrimaryClip(); + ClipData.Item clipItem = clipData.getItemAt(0); + mContext.setDocumentChanged(true); + return mContext.getTileProvider().paste("text/plain;charset=utf-16", clipItem.getText().toString()); + case R.id.action_cut: + clipData = ClipData.newPlainText("clipboard data", clipboardText); + clipboardManager.setPrimaryClip(clipData); + LOKitShell.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)); + mContext.setDocumentChanged(true); + return true; } return false; } -- cgit