From 50a75ea4f9bc7d3bccfa5c00db915b5397ba3430 Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Fri, 18 Sep 2020 12:13:17 +0800 Subject: Support Markdown bottom bar in EditCommentActivity, EditPostActivity and PostTextActivity. --- .../Activity/CommentActivity.java | 162 +------------ .../Activity/EditCommentActivity.java | 15 ++ .../Activity/EditPostActivity.java | 17 +- .../Activity/PostTextActivity.java | 13 + .../MarkdownBottomBarRecyclerViewAdapter.java | 163 +++++++++++++ app/src/main/res/layout/activity_edit_comment.xml | 38 ++- app/src/main/res/layout/activity_edit_post.xml | 97 ++++---- app/src/main/res/layout/activity_post_text.xml | 265 +++++++++++---------- 8 files changed, 428 insertions(+), 342 deletions(-) (limited to 'app') diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CommentActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CommentActivity.java index 1dab8fc3..66043919 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CommentActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/CommentActivity.java @@ -14,7 +14,6 @@ import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; -import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; @@ -263,165 +262,8 @@ public class CommentActivity extends BaseActivity { setSupportActionBar(toolbar); - MarkdownBottomBarRecyclerViewAdapter adapter = new MarkdownBottomBarRecyclerViewAdapter(mCustomThemeWrapper, new MarkdownBottomBarRecyclerViewAdapter.ItemClickListener() { - @Override - public void onClick(int item) { - switch (item) { - case MarkdownBottomBarRecyclerViewAdapter.BOLD: { - int start = Math.max(commentEditText.getSelectionStart(), 0); - int end = Math.max(commentEditText.getSelectionEnd(), 0); - if (end != start) { - String currentSelection = commentEditText.getText().subSequence(start, end).toString(); - commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), - "**" + currentSelection + "**", 0, "****".length() + currentSelection.length()); - } else { - commentEditText.getText().replace(start, end, - "****", 0, "****".length()); - commentEditText.setSelection(start + "**".length()); - } - break; - } - case MarkdownBottomBarRecyclerViewAdapter.ITALIC: { - int start = Math.max(commentEditText.getSelectionStart(), 0); - int end = Math.max(commentEditText.getSelectionEnd(), 0); - if (end != start) { - String currentSelection = commentEditText.getText().subSequence(start, end).toString(); - commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), - "*" + currentSelection + "*", 0, "**".length() + currentSelection.length()); - } else { - commentEditText.getText().replace(start, end, - "**", 0, "**".length()); - commentEditText.setSelection(start + "*".length()); - } - break; - } - case MarkdownBottomBarRecyclerViewAdapter.LINK: { - View dialogView = getLayoutInflater().inflate(R.layout.dialog_insert_link, null); - EditText textEditText = dialogView.findViewById(R.id.edit_text_insert_link_dialog); - EditText linkEditText = dialogView.findViewById(R.id.edit_link_insert_link_dialog); - - int start = Math.max(commentEditText.getSelectionStart(), 0); - int end = Math.max(commentEditText.getSelectionEnd(), 0); - if (end != start) { - String currentSelection = commentEditText.getText().subSequence(start, end).toString(); - textEditText.setText(currentSelection); - } - - new MaterialAlertDialogBuilder(CommentActivity.this, R.style.MaterialAlertDialogTheme) - .setTitle(R.string.insert_link) - .setView(dialogView) - .setPositiveButton(R.string.ok, (editTextDialogInterface, i1) - -> { - String text = textEditText.getText().toString(); - String link = linkEditText.getText().toString(); - - commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), - "[" + text + "](" + link + ")", 0, "[]()".length() + text.length() + link.length()); - }) - .setNegativeButton(R.string.cancel, null) - .show(); - break; - } - case MarkdownBottomBarRecyclerViewAdapter.STRIKE_THROUGH: { - int start = Math.max(commentEditText.getSelectionStart(), 0); - int end = Math.max(commentEditText.getSelectionEnd(), 0); - if (end != start) { - String currentSelection = commentEditText.getText().subSequence(start, end).toString(); - commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), - "~~" + currentSelection + "~~", 0, "~~~~".length() + currentSelection.length()); - } else { - commentEditText.getText().replace(start, end, - "~~~~", 0, "~~~~".length()); - commentEditText.setSelection(start + "~~".length()); - } - break; - } - case MarkdownBottomBarRecyclerViewAdapter.HEADER: { - View dialogView = getLayoutInflater().inflate(R.layout.dialog_select_header, null); - SeekBar seekBar = dialogView.findViewById(R.id.seek_bar_dialog_select_header); - new MaterialAlertDialogBuilder(CommentActivity.this, R.style.MaterialAlertDialogTheme) - .setTitle(R.string.select_header_size) - .setView(dialogView) - .setPositiveButton(R.string.ok, (editTextDialogInterface, i1) - -> { - int start = Math.max(commentEditText.getSelectionStart(), 0); - int end = Math.max(commentEditText.getSelectionEnd(), 0); - String hashTags; - switch (seekBar.getProgress()) { - case 0: - hashTags = "######"; - break; - case 1: - hashTags = "#####"; - break; - case 2: - hashTags = "####"; - break; - case 3: - hashTags = "###"; - break; - case 4: - hashTags = "##"; - break; - default: - hashTags = "#"; - break; - } - if (end != start) { - String currentSelection = commentEditText.getText().subSequence(start, end).toString(); - commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), - hashTags + currentSelection, 0, hashTags.length() + currentSelection.length()); - } else { - commentEditText.getText().replace(start, end, - hashTags, 0, hashTags.length()); - } - }) - .setNegativeButton(R.string.cancel, null) - .show(); - break; - } - case MarkdownBottomBarRecyclerViewAdapter.ORDERED_LIST: { - int start = Math.max(commentEditText.getSelectionStart(), 0); - int end = Math.max(commentEditText.getSelectionEnd(), 0); - if (end != start) { - String currentSelection = commentEditText.getText().subSequence(start, end).toString(); - commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), - "1. " + currentSelection, 0, "1. ".length() + currentSelection.length()); - } else { - commentEditText.getText().replace(start, end, - "1. ", 0, "1. ".length()); - } - break; - } - case MarkdownBottomBarRecyclerViewAdapter.UNORDERED_LIST: { - int start = Math.max(commentEditText.getSelectionStart(), 0); - int end = Math.max(commentEditText.getSelectionEnd(), 0); - if (end != start) { - String currentSelection = commentEditText.getText().subSequence(start, end).toString(); - commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), - "* " + currentSelection, 0, "* ".length() + currentSelection.length()); - } else { - commentEditText.getText().replace(start, end, - "* ", 0, "* ".length()); - } - break; - } - case MarkdownBottomBarRecyclerViewAdapter.SPOILER: { - int start = Math.max(commentEditText.getSelectionStart(), 0); - int end = Math.max(commentEditText.getSelectionEnd(), 0); - if (end != start) { - String currentSelection = commentEditText.getText().subSequence(start, end).toString(); - commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), - ">!" + currentSelection + "!<", 0, ">!!<".length() + currentSelection.length()); - } else { - commentEditText.getText().replace(start, end, - ">!!<", 0, ">!!<".length()); - commentEditText.setSelection(start + ">!".length()); - } - break; - } - } - } + MarkdownBottomBarRecyclerViewAdapter adapter = new MarkdownBottomBarRecyclerViewAdapter(mCustomThemeWrapper, item -> { + MarkdownBottomBarRecyclerViewAdapter.bindEditTextWithItemClickListener(this, commentEditText, item); }); markdownBottomBarRecyclerView.setLayoutManager(new LinearLayoutManager(this, diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/EditCommentActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/EditCommentActivity.java index b3ece3d2..b18618cf 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/EditCommentActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/EditCommentActivity.java @@ -14,6 +14,8 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -31,6 +33,7 @@ import javax.inject.Named; import butterknife.BindView; import butterknife.ButterKnife; import ml.docilealligator.infinityforreddit.API.RedditAPI; +import ml.docilealligator.infinityforreddit.Adapter.MarkdownBottomBarRecyclerViewAdapter; import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.Event.SwitchAccountEvent; import ml.docilealligator.infinityforreddit.Infinity; @@ -60,6 +63,8 @@ public class EditCommentActivity extends BaseActivity { Toolbar toolbar; @BindView(R.id.comment_edit_text_edit_comment_activity) EditText contentEditText; + @BindView(R.id.markdown_bottom_bar_recycler_view_edit_comment_activity) + RecyclerView markdownBottomBarRecyclerView; @Inject @Named("oauth") Retrofit mOauthRetrofit; @@ -77,6 +82,8 @@ public class EditCommentActivity extends BaseActivity { protected void onCreate(Bundle savedInstanceState) { ((Infinity) getApplication()).getAppComponent().inject(this); + setImmersiveModeNotApplicable(); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit_comment); @@ -99,6 +106,14 @@ public class EditCommentActivity extends BaseActivity { mCommentContent = getIntent().getStringExtra(EXTRA_CONTENT); contentEditText.setText(mCommentContent); + MarkdownBottomBarRecyclerViewAdapter adapter = new MarkdownBottomBarRecyclerViewAdapter(mCustomThemeWrapper, item -> { + MarkdownBottomBarRecyclerViewAdapter.bindEditTextWithItemClickListener(this, contentEditText, item); + }); + + markdownBottomBarRecyclerView.setLayoutManager(new LinearLayoutManager(this, + LinearLayoutManager.HORIZONTAL, false)); + markdownBottomBarRecyclerView.setAdapter(adapter); + contentEditText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/EditPostActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/EditPostActivity.java index e2671fdf..18e997ed 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/EditPostActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/EditPostActivity.java @@ -16,6 +16,8 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -33,11 +35,12 @@ import javax.inject.Named; import butterknife.BindView; import butterknife.ButterKnife; +import ml.docilealligator.infinityforreddit.API.RedditAPI; +import ml.docilealligator.infinityforreddit.Adapter.MarkdownBottomBarRecyclerViewAdapter; import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.Event.SwitchAccountEvent; import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.R; -import ml.docilealligator.infinityforreddit.API.RedditAPI; import ml.docilealligator.infinityforreddit.Utils.APIUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; import retrofit2.Call; @@ -64,6 +67,8 @@ public class EditPostActivity extends BaseActivity { View divider; @BindView(R.id.post_text_content_edit_text_edit_post_activity) EditText contentEditText; + @BindView(R.id.markdown_bottom_bar_recycler_view_edit_post_activity) + RecyclerView markdownBottomBarRecyclerView; @Inject @Named("oauth") Retrofit mOauthRetrofit; @@ -81,6 +86,8 @@ public class EditPostActivity extends BaseActivity { protected void onCreate(Bundle savedInstanceState) { ((Infinity) getApplication()).getAppComponent().inject(this); + setImmersiveModeNotApplicable(); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit_post); @@ -108,6 +115,14 @@ public class EditPostActivity extends BaseActivity { mPostContent = getIntent().getStringExtra(EXTRA_CONTENT); contentEditText.setText(mPostContent); + MarkdownBottomBarRecyclerViewAdapter adapter = new MarkdownBottomBarRecyclerViewAdapter(mCustomThemeWrapper, item -> { + MarkdownBottomBarRecyclerViewAdapter.bindEditTextWithItemClickListener(this, contentEditText, item); + }); + + markdownBottomBarRecyclerView.setLayoutManager(new LinearLayoutManager(this, + LinearLayoutManager.HORIZONTAL, false)); + markdownBottomBarRecyclerView.setAdapter(adapter); + contentEditText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/PostTextActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/PostTextActivity.java index 69568d88..de7bc72c 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/PostTextActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/PostTextActivity.java @@ -17,6 +17,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.Toolbar; import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; @@ -35,6 +37,7 @@ import javax.inject.Named; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; +import ml.docilealligator.infinityforreddit.Adapter.MarkdownBottomBarRecyclerViewAdapter; import ml.docilealligator.infinityforreddit.AsyncTask.GetCurrentAccountAsyncTask; import ml.docilealligator.infinityforreddit.AsyncTask.LoadSubredditIconAsyncTask; import ml.docilealligator.infinityforreddit.BottomSheetFragment.FlairBottomSheetFragment; @@ -97,6 +100,8 @@ public class PostTextActivity extends BaseActivity implements FlairBottomSheetFr View divider3; @BindView(R.id.post_text_content_edit_text_post_text_activity) EditText contentEditText; + @BindView(R.id.markdown_bottom_bar_recycler_view_post_text_activity) + RecyclerView markdownBottomBarRecyclerView; @Inject @Named("no_oauth") Retrofit mRetrofit; @@ -305,6 +310,14 @@ public class PostTextActivity extends BaseActivity implements FlairBottomSheetFr isNSFW = false; } }); + + MarkdownBottomBarRecyclerViewAdapter adapter = new MarkdownBottomBarRecyclerViewAdapter(mCustomThemeWrapper, item -> { + MarkdownBottomBarRecyclerViewAdapter.bindEditTextWithItemClickListener(this, contentEditText, item); + }); + + markdownBottomBarRecyclerView.setLayoutManager(new LinearLayoutManager(this, + LinearLayoutManager.HORIZONTAL, false)); + markdownBottomBarRecyclerView.setAdapter(adapter); } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/MarkdownBottomBarRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/MarkdownBottomBarRecyclerViewAdapter.java index 11d06b14..b421c2e0 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/MarkdownBottomBarRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/MarkdownBottomBarRecyclerViewAdapter.java @@ -1,13 +1,18 @@ package ml.docilealligator.infinityforreddit.Adapter; +import android.app.Activity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.EditText; import android.widget.ImageView; +import android.widget.SeekBar; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.R; @@ -80,6 +85,164 @@ public class MarkdownBottomBarRecyclerViewAdapter extends RecyclerView.Adapter { + String text = textEditText.getText().toString(); + String link = linkEditText.getText().toString(); + + commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), + "[" + text + "](" + link + ")", 0, "[]()".length() + text.length() + link.length()); + }) + .setNegativeButton(R.string.cancel, null) + .show(); + break; + } + case MarkdownBottomBarRecyclerViewAdapter.STRIKE_THROUGH: { + int start = Math.max(commentEditText.getSelectionStart(), 0); + int end = Math.max(commentEditText.getSelectionEnd(), 0); + if (end != start) { + String currentSelection = commentEditText.getText().subSequence(start, end).toString(); + commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), + "~~" + currentSelection + "~~", 0, "~~~~".length() + currentSelection.length()); + } else { + commentEditText.getText().replace(start, end, + "~~~~", 0, "~~~~".length()); + commentEditText.setSelection(start + "~~".length()); + } + break; + } + case MarkdownBottomBarRecyclerViewAdapter.HEADER: { + View dialogView = activity.getLayoutInflater().inflate(R.layout.dialog_select_header, null); + SeekBar seekBar = dialogView.findViewById(R.id.seek_bar_dialog_select_header); + new MaterialAlertDialogBuilder(activity, R.style.MaterialAlertDialogTheme) + .setTitle(R.string.select_header_size) + .setView(dialogView) + .setPositiveButton(R.string.ok, (editTextDialogInterface, i1) + -> { + int start = Math.max(commentEditText.getSelectionStart(), 0); + int end = Math.max(commentEditText.getSelectionEnd(), 0); + String hashTags; + switch (seekBar.getProgress()) { + case 0: + hashTags = "######"; + break; + case 1: + hashTags = "#####"; + break; + case 2: + hashTags = "####"; + break; + case 3: + hashTags = "###"; + break; + case 4: + hashTags = "##"; + break; + default: + hashTags = "#"; + break; + } + if (end != start) { + String currentSelection = commentEditText.getText().subSequence(start, end).toString(); + commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), + hashTags + currentSelection, 0, hashTags.length() + currentSelection.length()); + } else { + commentEditText.getText().replace(start, end, + hashTags, 0, hashTags.length()); + } + }) + .setNegativeButton(R.string.cancel, null) + .show(); + break; + } + case MarkdownBottomBarRecyclerViewAdapter.ORDERED_LIST: { + int start = Math.max(commentEditText.getSelectionStart(), 0); + int end = Math.max(commentEditText.getSelectionEnd(), 0); + if (end != start) { + String currentSelection = commentEditText.getText().subSequence(start, end).toString(); + commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), + "1. " + currentSelection, 0, "1. ".length() + currentSelection.length()); + } else { + commentEditText.getText().replace(start, end, + "1. ", 0, "1. ".length()); + } + break; + } + case MarkdownBottomBarRecyclerViewAdapter.UNORDERED_LIST: { + int start = Math.max(commentEditText.getSelectionStart(), 0); + int end = Math.max(commentEditText.getSelectionEnd(), 0); + if (end != start) { + String currentSelection = commentEditText.getText().subSequence(start, end).toString(); + commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), + "* " + currentSelection, 0, "* ".length() + currentSelection.length()); + } else { + commentEditText.getText().replace(start, end, + "* ", 0, "* ".length()); + } + break; + } + case MarkdownBottomBarRecyclerViewAdapter.SPOILER: { + int start = Math.max(commentEditText.getSelectionStart(), 0); + int end = Math.max(commentEditText.getSelectionEnd(), 0); + if (end != start) { + String currentSelection = commentEditText.getText().subSequence(start, end).toString(); + commentEditText.getText().replace(Math.min(start, end), Math.max(start, end), + ">!" + currentSelection + "!<", 0, ">!!<".length() + currentSelection.length()); + } else { + commentEditText.getText().replace(start, end, + ">!!<", 0, ">!!<".length()); + commentEditText.setSelection(start + ">!".length()); + } + break; + } + } + } + class MarkdownBottomBarItemViewHolder extends RecyclerView.ViewHolder { ImageView imageView; diff --git a/app/src/main/res/layout/activity_edit_comment.xml b/app/src/main/res/layout/activity_edit_comment.xml index ba239230..740aad93 100644 --- a/app/src/main/res/layout/activity_edit_comment.xml +++ b/app/src/main/res/layout/activity_edit_comment.xml @@ -23,18 +23,34 @@ - + android:orientation="vertical" + app:layout_behavior="@string/appbar_scrolling_view_behavior"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_edit_post.xml b/app/src/main/res/layout/activity_edit_post.xml index 5d124696..a7d0078f 100644 --- a/app/src/main/res/layout/activity_edit_post.xml +++ b/app/src/main/res/layout/activity_edit_post.xml @@ -13,65 +13,72 @@ android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> - - - - - + android:layout_height="wrap_content" + android:minHeight="?attr/actionBarSize" + app:popupTheme="@style/AppTheme.PopupOverlay" + app:navigationIcon="?attr/homeAsUpIndicator" /> - - + android:layout_height="0dp" + android:layout_weight="1"> - + android:layout_height="match_parent" + android:orientation="vertical"> - + - + + + + + + + + + - + - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_post_text.xml b/app/src/main/res/layout/activity_post_text.xml index 67ba4234..d9b02754 100644 --- a/app/src/main/res/layout/activity_post_text.xml +++ b/app/src/main/res/layout/activity_post_text.xml @@ -23,148 +23,163 @@ - - - - - - - - - -