From adfa14e32a47bc6d9f7d336deba3c4c2454cc117 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 19 Jun 2018 17:15:05 +0200 Subject: [PATCH 1/8] Fix #2705 - displaying copy icon and adding send action to the link menu # Conflicts: # src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java --- drawable_resources/ic_content-copy.svg | 1 + .../ui/activity/CopyToClipboardActivity.java | 3 +- .../ui/activity/FileDisplayActivity.java | 1 + .../fragment/FileDetailSharingFragment.java | 24 +++++++++++- .../owncloud/android/utils/ClipboardUtil.java | 37 +++++++++++++++++++ src/main/res/drawable/ic_content_copy.xml | 23 ++++++++++++ .../layout/file_details_sharing_fragment.xml | 18 ++++++++- .../menu/file_detail_sharing_link_menu.xml | 5 +++ src/main/res/values/strings.xml | 1 + 9 files changed, 108 insertions(+), 5 deletions(-) create mode 100644 drawable_resources/ic_content-copy.svg create mode 100644 src/main/java/com/owncloud/android/utils/ClipboardUtil.java create mode 100644 src/main/res/drawable/ic_content_copy.xml diff --git a/drawable_resources/ic_content-copy.svg b/drawable_resources/ic_content-copy.svg new file mode 100644 index 000000000000..bce7028fc2f6 --- /dev/null +++ b/drawable_resources/ic_content-copy.svg @@ -0,0 +1 @@ + diff --git a/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java b/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java index a04d9413a592..26dca3f4aaca 100644 --- a/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java @@ -23,6 +23,7 @@ import android.app.Activity; import android.content.ClipData; import android.content.ClipboardManager; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; @@ -45,7 +46,7 @@ public void onCreate(Bundle savedInstanceState) { try { // get the clipboard system service - ClipboardManager clipboardManager = (ClipboardManager) this.getSystemService(CLIPBOARD_SERVICE); + ClipboardManager clipboardManager = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); // get the text to copy into the clipboard Intent intent = getIntent(); diff --git a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index 1bd19493965e..4b5e02881f1c 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -1878,6 +1878,7 @@ private void onCreateShareViaLinkOperationFinish(CreateShareViaLinkOperation ope chooserDialog.show(getSupportFragmentManager(), FTAG_CHOOSER_DIALOG); fileDetailFragment.getFileDetailSharingFragment().refreshPublicShareFromDB(); + fileDetailFragment.getFileDetailSharingFragment().onUpdateShareInformation(result, getFile()); refreshListOfFilesFragment(false); } else { // Detect Failure (403) --> maybe needs password diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java index e3426ce22798..32f90010024d 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java @@ -52,6 +52,7 @@ import com.owncloud.android.lib.resources.shares.SharePermissionsBuilder; import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.lib.resources.status.OCCapability; +import com.owncloud.android.ui.activity.CopyToClipboardActivity; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.adapter.UserListAdapter; import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration; @@ -59,6 +60,7 @@ import com.owncloud.android.ui.dialog.SharePasswordDialogFragment; import com.owncloud.android.ui.fragment.util.FileDetailSharingFragmentHelper; import com.owncloud.android.ui.fragment.util.SharingMenuHelper; +import com.owncloud.android.utils.ClipboardUtil; import com.owncloud.android.utils.ThemeUtils; import java.util.ArrayList; @@ -95,6 +97,9 @@ public class FileDetailSharingFragment extends Fragment implements UserListAdapt @BindView(R.id.share_by_link) AppCompatCheckBox shareByLink; + @BindView(R.id.share_link_copy_icon) + ImageView shareLinkCopyIcon; + @BindView(R.id.overflow_menu_share_link) ImageView overflowMenuShareLink; @@ -171,6 +176,11 @@ private void setupView() { */ public void setShareByLinkInfo(boolean isShareByLink) { shareByLink.setChecked(isShareByLink); + if (isShareByLink) { + shareLinkCopyIcon.setVisibility(View.VISIBLE); + } else { + shareLinkCopyIcon.setVisibility(View.INVISIBLE); + } int accentColor = ThemeUtils.primaryAccentColor(getContext()); ThemeUtils.tintCheckbox(shareByLink, accentColor); ThemeUtils.tintCheckbox(shareByLinkAllowEditing, accentColor); @@ -240,13 +250,19 @@ public void toggleShareByLink() { } } - @OnClick(R.id.share_link_label) - public void showSendLinkTo() { + private void showSendLinkTo() { if (file.isSharedViaLink()) { ((FileActivity) getActivity()).getFileOperationsHelper().getFileWithLink(file); } } + @OnClick({R.id.share_link_label, R.id.share_link_copy_icon}) + public void copyLinkToClipboard() { + if (file.isSharedViaLink()) { + ClipboardUtil.copyToClipboard(getActivity(), file.getPublicLink()); + } + } + @OnClick(R.id.share_by_link_allow_editing) public void toggleShareLinkAllowEditing() { if (file.isSharedViaLink()) { @@ -315,6 +331,10 @@ private boolean optionsItemSelected(MenuItem item) { ); return true; } + case R.id.action_share_send_link: { + showSendLinkTo(); + return true; + } default: return super.onOptionsItemSelected(item); } diff --git a/src/main/java/com/owncloud/android/utils/ClipboardUtil.java b/src/main/java/com/owncloud/android/utils/ClipboardUtil.java new file mode 100644 index 000000000000..819dd62c52d0 --- /dev/null +++ b/src/main/java/com/owncloud/android/utils/ClipboardUtil.java @@ -0,0 +1,37 @@ +package com.owncloud.android.utils; + +import android.app.Activity; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.widget.Toast; + +import com.owncloud.android.R; +import com.owncloud.android.lib.common.utils.Log_OC; + +public class ClipboardUtil { + private static final String TAG = ClipboardUtil.class.getName(); + + private ClipboardUtil() { + } + + public static void copyToClipboard(Activity activity, String text) { + if (text != null && text.length() > 0) { + try { + ClipData clip = ClipData.newPlainText( + activity.getString( + R.string.clipboard_label, activity.getString(R.string.app_name)), + text + ); + ((ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(clip); + + Toast.makeText(activity, R.string.clipboard_text_copied, Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + Toast.makeText(activity, R.string.clipboard_uxexpected_error, Toast.LENGTH_SHORT).show(); + Log_OC.e(TAG, "Exception caught while copying to clipboard", e); + } + } else { + Toast.makeText(activity, R.string.clipboard_no_text_to_copy, Toast.LENGTH_SHORT).show(); + } + } +} diff --git a/src/main/res/drawable/ic_content_copy.xml b/src/main/res/drawable/ic_content_copy.xml new file mode 100644 index 000000000000..0c0f622bc4c1 --- /dev/null +++ b/src/main/res/drawable/ic_content_copy.xml @@ -0,0 +1,23 @@ + + + + diff --git a/src/main/res/layout/file_details_sharing_fragment.xml b/src/main/res/layout/file_details_sharing_fragment.xml index 031e8cb6d498..244874b23b74 100644 --- a/src/main/res/layout/file_details_sharing_fragment.xml +++ b/src/main/res/layout/file_details_sharing_fragment.xml @@ -58,16 +58,30 @@ + + + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 80e67ae35049..db56d8e48205 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -486,6 +486,7 @@ Expires %1$s Set expiration date Share link + Send link Password-protected Set password edit From 8a5470800904f7c8497b8cd3505c3b0833359f1b Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 19 Jun 2018 18:36:25 +0200 Subject: [PATCH 2/8] safeguard: if the file hasn't stored the link yet, retrieve it from server first --- .../android/ui/fragment/FileDetailSharingFragment.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java index 32f90010024d..41497b0314d1 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java @@ -34,6 +34,7 @@ import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -259,7 +260,11 @@ private void showSendLinkTo() { @OnClick({R.id.share_link_label, R.id.share_link_copy_icon}) public void copyLinkToClipboard() { if (file.isSharedViaLink()) { - ClipboardUtil.copyToClipboard(getActivity(), file.getPublicLink()); + if (TextUtils.isEmpty(file.getPublicLink())) { + showSendLinkTo(); + } else { + ClipboardUtil.copyToClipboard(getActivity(), file.getPublicLink()); + } } } From a30e5af4a73258ae268123cff6b3dd43da6983e9 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Tue, 19 Jun 2018 18:44:29 +0200 Subject: [PATCH 3/8] codacy: fix imports --- .../owncloud/android/ui/fragment/FileDetailSharingFragment.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java index 41497b0314d1..6ea3fcded2e0 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java @@ -53,7 +53,6 @@ import com.owncloud.android.lib.resources.shares.SharePermissionsBuilder; import com.owncloud.android.lib.resources.shares.ShareType; import com.owncloud.android.lib.resources.status.OCCapability; -import com.owncloud.android.ui.activity.CopyToClipboardActivity; import com.owncloud.android.ui.activity.FileActivity; import com.owncloud.android.ui.adapter.UserListAdapter; import com.owncloud.android.ui.decoration.SimpleListItemDividerDecoration; From f91309f160011f0803023423c91d0ee63a658af7 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Wed, 20 Jun 2018 09:42:20 +0200 Subject: [PATCH 4/8] add more whitespace to copy icon --- .../res/layout/file_details_sharing_fragment.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/res/layout/file_details_sharing_fragment.xml b/src/main/res/layout/file_details_sharing_fragment.xml index 244874b23b74..cd457eda8cfb 100644 --- a/src/main/res/layout/file_details_sharing_fragment.xml +++ b/src/main/res/layout/file_details_sharing_fragment.xml @@ -70,12 +70,12 @@ Date: Wed, 20 Jun 2018 09:44:05 +0200 Subject: [PATCH 5/8] fix typo in string-key # Conflicts: # src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java --- .../owncloud/android/ui/activity/CopyToClipboardActivity.java | 2 +- src/main/java/com/owncloud/android/utils/ClipboardUtil.java | 2 +- src/main/res/values/strings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java b/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java index 26dca3f4aaca..8892de91397c 100644 --- a/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java @@ -70,7 +70,7 @@ public void onCreate(Bundle savedInstanceState) { } } catch (Exception e) { - Toast.makeText(this, R.string.clipboard_uxexpected_error, Toast.LENGTH_SHORT).show(); + DisplayUtils.showSnackMessage(this, R.string.clipboard_unexpected_error); Log_OC.e(TAG, "Exception caught while copying to clipboard", e); } diff --git a/src/main/java/com/owncloud/android/utils/ClipboardUtil.java b/src/main/java/com/owncloud/android/utils/ClipboardUtil.java index 819dd62c52d0..893364d822d3 100644 --- a/src/main/java/com/owncloud/android/utils/ClipboardUtil.java +++ b/src/main/java/com/owncloud/android/utils/ClipboardUtil.java @@ -27,7 +27,7 @@ public static void copyToClipboard(Activity activity, String text) { Toast.makeText(activity, R.string.clipboard_text_copied, Toast.LENGTH_SHORT).show(); } catch (Exception e) { - Toast.makeText(activity, R.string.clipboard_uxexpected_error, Toast.LENGTH_SHORT).show(); + Toast.makeText(activity, R.string.clipboard_unexpected_error, Toast.LENGTH_SHORT).show(); Log_OC.e(TAG, "Exception caught while copying to clipboard", e); } } else { diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index db56d8e48205..e05758cadd3a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -365,7 +365,7 @@ Copy link Copied to clipboard Received no text to copy to clipboard - Unexpected error while copying to clipboard + Unexpected error while copying to clipboard Text copied from %1$s Critical error: Unable to perform operations From 1f50960dfeff9e5dbf896391111f84d8aa355687 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Wed, 20 Jun 2018 11:20:28 +0200 Subject: [PATCH 6/8] utilize newly created clipboard util implementation # Conflicts: # src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java --- .../ui/activity/CopyToClipboardActivity.java | 49 +++---------------- 1 file changed, 6 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java b/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java index 8892de91397c..16bdab55a069 100644 --- a/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/CopyToClipboardActivity.java @@ -1,8 +1,10 @@ -/** +/* * ownCloud Android client application * * @author David A. Velasco + * @author Andy Scherzinger * Copyright (C) 2015 ownCloud Inc. + * Copyright (C) 2018 Andy Scherzinger * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -15,66 +17,27 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * */ package com.owncloud.android.ui.activity; import android.app.Activity; -import android.content.ClipData; -import android.content.ClipboardManager; -import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.widget.Toast; -import com.owncloud.android.R; -import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.utils.ClipboardUtil; /** - * Activity copying the text of the received Intent into the system clibpoard. + * Activity copying the text of the received Intent into the system clipboard. */ -@SuppressWarnings("deprecation") public class CopyToClipboardActivity extends Activity { - private static final String TAG = CopyToClipboardActivity.class.getName(); - @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - try { - - // get the clipboard system service - ClipboardManager clipboardManager = (ClipboardManager) this.getSystemService(Context.CLIPBOARD_SERVICE); - - // get the text to copy into the clipboard - Intent intent = getIntent(); - CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_TEXT); - - if (text != null && text.length() > 0) { - // minimum API level >= 11 -> only modern Clipboard - ClipData clip = ClipData.newPlainText( - getString(R.string.clipboard_label, getString(R.string.app_name)), - text - ); - clipboardManager.setPrimaryClip(clip); - - // API level < 11 -> legacy Clipboard - NOT SUPPORTED ANYMORE - // clipboardManager.setText(text); - - // alert the user that the text is in the clipboard and we're done - Toast.makeText(this, R.string.clipboard_text_copied, Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(this, R.string.clipboard_no_text_to_copy, Toast.LENGTH_SHORT).show(); - } - - } catch (Exception e) { - DisplayUtils.showSnackMessage(this, R.string.clipboard_unexpected_error); - Log_OC.e(TAG, "Exception caught while copying to clipboard", e); - } + ClipboardUtil.copyToClipboard(this, getIntent().getCharSequenceExtra(Intent.EXTRA_TEXT).toString()); finish(); } - } From f423fb9c754be92a55f2ab3d0fcde92b590c5a07 Mon Sep 17 00:00:00 2001 From: AndyScherzinger Date: Wed, 20 Jun 2018 11:46:09 +0200 Subject: [PATCH 7/8] raise icon size --- .../owncloud/android/utils/ClipboardUtil.java | 23 +++++++++++++++++++ .../layout/file_details_sharing_fragment.xml | 9 ++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/owncloud/android/utils/ClipboardUtil.java b/src/main/java/com/owncloud/android/utils/ClipboardUtil.java index 893364d822d3..632aea487d98 100644 --- a/src/main/java/com/owncloud/android/utils/ClipboardUtil.java +++ b/src/main/java/com/owncloud/android/utils/ClipboardUtil.java @@ -1,3 +1,23 @@ +/* + * Nextcloud Android client application + * + * @author Andy Scherzinger + * Copyright (C) 2018 Andy Scherzinger + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see . + */ + package com.owncloud.android.utils; import android.app.Activity; @@ -9,6 +29,9 @@ import com.owncloud.android.R; import com.owncloud.android.lib.common.utils.Log_OC; +/** + * Helper implementation to copy a string into the system clipboard. + */ public class ClipboardUtil { private static final String TAG = ClipboardUtil.class.getName(); diff --git a/src/main/res/layout/file_details_sharing_fragment.xml b/src/main/res/layout/file_details_sharing_fragment.xml index cd457eda8cfb..b8dc2220ccd1 100644 --- a/src/main/res/layout/file_details_sharing_fragment.xml +++ b/src/main/res/layout/file_details_sharing_fragment.xml @@ -70,17 +70,18 @@ + android:src="@drawable/ic_content_copy" + android:layout_gravity="start|center"/> Date: Wed, 20 Jun 2018 11:59:59 +0200 Subject: [PATCH 8/8] make checkbox text a real label --- .../fragment/FileDetailSharingFragment.java | 2 +- .../layout/file_details_sharing_fragment.xml | 20 +++++-------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java index 6ea3fcded2e0..a94157452279 100644 --- a/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java +++ b/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java @@ -256,7 +256,7 @@ private void showSendLinkTo() { } } - @OnClick({R.id.share_link_label, R.id.share_link_copy_icon}) + @OnClick({R.id.share_link_copy_icon}) public void copyLinkToClipboard() { if (file.isSharedViaLink()) { if (TextUtils.isEmpty(file.getPublicLink())) { diff --git a/src/main/res/layout/file_details_sharing_fragment.xml b/src/main/res/layout/file_details_sharing_fragment.xml index b8dc2220ccd1..a6cb54643376 100644 --- a/src/main/res/layout/file_details_sharing_fragment.xml +++ b/src/main/res/layout/file_details_sharing_fragment.xml @@ -54,31 +54,21 @@ android:id="@+id/share_by_link" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_vertical"/> - - + android:layout_gravity="center_vertical" + android:text="@string/share_via_link_section_title"/>