diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java index 14dab410..b15d9416 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java @@ -74,6 +74,7 @@ import ml.docilealligator.infinityforreddit.CommentData; import ml.docilealligator.infinityforreddit.CustomView.AspectRatioGifImageView; import ml.docilealligator.infinityforreddit.CustomView.MarkwonLinearLayoutManager; import ml.docilealligator.infinityforreddit.FetchComment; +import ml.docilealligator.infinityforreddit.Fragment.CopyTextBottomSheetFragment; import ml.docilealligator.infinityforreddit.Fragment.ModifyCommentBottomSheetFragment; import ml.docilealligator.infinityforreddit.Fragment.ShareLinkBottomSheetFragment; import ml.docilealligator.infinityforreddit.Post.Post; @@ -126,6 +127,7 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter { + Bundle bundle = new Bundle(); + bundle.putString(CopyTextBottomSheetFragment.EXTRA_RAW_TEXT, mPost.getSelfTextPlain()); + bundle.putString(CopyTextBottomSheetFragment.EXTRA_MARKDOWN, mPost.getSelfText()); + mCopyTextBottomSheetFragment.setArguments(bundle); + mCopyTextBottomSheetFragment.show(mActivity.getSupportFragmentManager(), mCopyTextBottomSheetFragment.getTag()); + return true; + }); } @Override @@ -225,6 +235,7 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter { + showCopyDialog(rawText); + dismiss(); + }); + + copyMarkdownTextView.setOnClickListener(view -> { + showCopyDialog(markdownText); + dismiss(); + }); + + copyAllRawTextTextView.setOnClickListener(view -> { + copyText(rawText); + dismiss(); + }); + + copyAllMarkdownTextView.setOnClickListener(view -> { + copyText(markdownText); + dismiss(); + }); + + return rootView; + } + + private void showCopyDialog(String text) { + LayoutInflater inflater = activity.getLayoutInflater(); + View layout = inflater.inflate(R.layout.copy_text_material_dialog, null); + TextView textView = layout.findViewById(R.id.text_view_copy_text_material_dialog); + textView.setText(text); + new MaterialAlertDialogBuilder(activity, R.style.CopyTextMaterialAlertDialogTheme) + .setTitle(R.string.copy_text) + .setView(layout) + .setPositiveButton(R.string.copy_all, (dialogInterface, i) -> copyText(text)) + .setNegativeButton(R.string.cancel, null) + .show(); + } + + private void copyText(String text) { + ClipboardManager clipboard = (ClipboardManager) activity.getSystemService(Context.CLIPBOARD_SERVICE); + if (clipboard != null) { + ClipData clip = ClipData.newPlainText("simple text", text); + clipboard.setPrimaryClip(clip); + Toast.makeText(activity, R.string.copy_success, Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(activity, R.string.copy_failed, Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + activity = (Activity) context; + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/SortTypeBottomSheetFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/SortTypeBottomSheetFragment.java index f5ee3696..ba03d93c 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/SortTypeBottomSheetFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Fragment/SortTypeBottomSheetFragment.java @@ -109,6 +109,6 @@ public class SortTypeBottomSheetFragment extends RoundedBottomSheetDialogFragmen @Override public void onAttach(@NonNull Context context) { super.onAttach(context); - this.activity = (Activity) context; + activity = (Activity) context; } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java index 25a0e1cd..435cce53 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java @@ -133,6 +133,7 @@ public class ParsePost { } else { String selfTextPlain = Utils.trimTrailingWhitespace( Html.fromHtml(data.getString(JSONUtils.SELFTEXT_HTML_KEY))).toString(); + post.setSelfTextPlain(selfTextPlain); if (selfTextPlain.length() > 250) { selfTextPlain = selfTextPlain.substring(0, 250); } @@ -234,6 +235,7 @@ public class ParsePost { } else { String selfTextPlain = Utils.trimTrailingWhitespace( Html.fromHtml(data.getString(JSONUtils.SELFTEXT_HTML_KEY))).toString(); + post.setSelfTextPlain(selfTextPlain); if (selfTextPlain.length() > 250) { selfTextPlain = selfTextPlain.substring(0, 250); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Post/Post.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/Post.java index e16893c2..8a025c97 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Post/Post.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post/Post.java @@ -39,6 +39,7 @@ public class Post implements Parcelable { private String postTime; private String title; private String selfText; + private String selfTextPlain; private String selfTextPlainTrimmed; private String previewUrl; private String thumbnailPreviewUrl; @@ -177,6 +178,7 @@ public class Post implements Parcelable { postTimeMillis = in.readLong(); title = in.readString(); selfText = in.readString(); + selfTextPlain = in.readString(); selfTextPlainTrimmed = in.readString(); previewUrl = in.readString(); thumbnailPreviewUrl = in.readString(); @@ -267,6 +269,14 @@ public class Post implements Parcelable { this.selfText = selfText; } + public String getSelfTextPlain() { + return selfTextPlain; + } + + public void setSelfTextPlain(String selfTextPlain) { + this.selfTextPlain = selfTextPlain; + } + public String getSelfTextPlainTrimmed() { return selfTextPlainTrimmed; } @@ -438,6 +448,7 @@ public class Post implements Parcelable { parcel.writeLong(postTimeMillis); parcel.writeString(title); parcel.writeString(selfText); + parcel.writeString(selfTextPlain); parcel.writeString(selfTextPlainTrimmed); parcel.writeString(previewUrl); parcel.writeString(thumbnailPreviewUrl); diff --git a/app/src/main/res/layout/copy_text_material_dialog.xml b/app/src/main/res/layout/copy_text_material_dialog.xml new file mode 100644 index 00000000..a8dfb7a5 --- /dev/null +++ b/app/src/main/res/layout/copy_text_material_dialog.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_copy_text_bottom_sheet.xml b/app/src/main/res/layout/fragment_copy_text_bottom_sheet.xml new file mode 100644 index 00000000..43044ca2 --- /dev/null +++ b/app/src/main/res/layout/fragment_copy_text_bottom_sheet.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_post_detail.xml b/app/src/main/res/layout/item_post_detail.xml index e23da92c..1ccdf2a1 100644 --- a/app/src/main/res/layout/item_post_detail.xml +++ b/app/src/main/res/layout/item_post_detail.xml @@ -79,7 +79,11 @@ android:paddingStart="16dp" android:paddingEnd="16dp" android:textColor="@color/primaryTextColor" - android:textSize="?attr/title_font_18" /> + android:textSize="?attr/title_font_18" + android:textIsSelectable="true" + android:enabled="true" + android:focusable="true" + android:longClickable="true" /> Copied Cannot copy the link + Copy + Copy All + Copy Markdown + Copy Raw Text + Copy All Markdown + Copy All Raw Text diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3248cfd4..b91ecdb1 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -58,6 +58,12 @@ @style/MaterialAlertDialogNegativeButtonStyle + +