mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2024-11-14 06:22:50 +01:00
Merge pull request #120 from OHermesJunior/see-removed
Feature: See removed posts and comments
This commit is contained in:
commit
dc550f1e18
@ -0,0 +1,13 @@
|
|||||||
|
package ml.docilealligator.infinityforreddit.API;
|
||||||
|
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.http.GET;
|
||||||
|
import retrofit2.http.Query;
|
||||||
|
|
||||||
|
public interface PushshiftAPI {
|
||||||
|
@GET("reddit/comment/search/")
|
||||||
|
Call<String> getRemovedComment(@Query("ids") String commentId);
|
||||||
|
|
||||||
|
@GET("reddit/submission/search/")
|
||||||
|
Call<String> getRemovedPost(@Query("ids") String postId);
|
||||||
|
}
|
@ -60,6 +60,8 @@ import ml.docilealligator.infinityforreddit.ActivityToolbarInterface;
|
|||||||
import ml.docilealligator.infinityforreddit.Adapter.CommentAndPostRecyclerViewAdapter;
|
import ml.docilealligator.infinityforreddit.Adapter.CommentAndPostRecyclerViewAdapter;
|
||||||
import ml.docilealligator.infinityforreddit.AsyncTask.GetCurrentAccountAsyncTask;
|
import ml.docilealligator.infinityforreddit.AsyncTask.GetCurrentAccountAsyncTask;
|
||||||
import ml.docilealligator.infinityforreddit.AsyncTask.SwitchAccountAsyncTask;
|
import ml.docilealligator.infinityforreddit.AsyncTask.SwitchAccountAsyncTask;
|
||||||
|
import ml.docilealligator.infinityforreddit.BottomSheetFragment.FlairBottomSheetFragment;
|
||||||
|
import ml.docilealligator.infinityforreddit.BottomSheetFragment.PostCommentSortTypeBottomSheetFragment;
|
||||||
import ml.docilealligator.infinityforreddit.CommentData;
|
import ml.docilealligator.infinityforreddit.CommentData;
|
||||||
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
|
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
|
||||||
import ml.docilealligator.infinityforreddit.CustomView.CustomToroContainer;
|
import ml.docilealligator.infinityforreddit.CustomView.CustomToroContainer;
|
||||||
@ -71,9 +73,9 @@ import ml.docilealligator.infinityforreddit.Event.PostUpdateEventToDetailActivit
|
|||||||
import ml.docilealligator.infinityforreddit.Event.PostUpdateEventToPostList;
|
import ml.docilealligator.infinityforreddit.Event.PostUpdateEventToPostList;
|
||||||
import ml.docilealligator.infinityforreddit.Event.SwitchAccountEvent;
|
import ml.docilealligator.infinityforreddit.Event.SwitchAccountEvent;
|
||||||
import ml.docilealligator.infinityforreddit.FetchComment;
|
import ml.docilealligator.infinityforreddit.FetchComment;
|
||||||
|
import ml.docilealligator.infinityforreddit.FetchRemovedComment;
|
||||||
|
import ml.docilealligator.infinityforreddit.FetchRemovedPost;
|
||||||
import ml.docilealligator.infinityforreddit.Flair;
|
import ml.docilealligator.infinityforreddit.Flair;
|
||||||
import ml.docilealligator.infinityforreddit.BottomSheetFragment.FlairBottomSheetFragment;
|
|
||||||
import ml.docilealligator.infinityforreddit.BottomSheetFragment.PostCommentSortTypeBottomSheetFragment;
|
|
||||||
import ml.docilealligator.infinityforreddit.Infinity;
|
import ml.docilealligator.infinityforreddit.Infinity;
|
||||||
import ml.docilealligator.infinityforreddit.ParseComment;
|
import ml.docilealligator.infinityforreddit.ParseComment;
|
||||||
import ml.docilealligator.infinityforreddit.Post.FetchPost;
|
import ml.docilealligator.infinityforreddit.Post.FetchPost;
|
||||||
@ -161,6 +163,9 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
@Named("no_oauth")
|
@Named("no_oauth")
|
||||||
Retrofit mRetrofit;
|
Retrofit mRetrofit;
|
||||||
@Inject
|
@Inject
|
||||||
|
@Named("pushshift")
|
||||||
|
Retrofit pushshiftRetrofit;
|
||||||
|
@Inject
|
||||||
@Named("oauth")
|
@Named("oauth")
|
||||||
Retrofit mOauthRetrofit;
|
Retrofit mOauthRetrofit;
|
||||||
@Inject
|
@Inject
|
||||||
@ -449,6 +454,61 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
if (mPost == null) {
|
if (mPost == null) {
|
||||||
fetchPostAndCommentsById(getIntent().getStringExtra(EXTRA_POST_ID));
|
fetchPostAndCommentsById(getIntent().getStringExtra(EXTRA_POST_ID));
|
||||||
} else {
|
} else {
|
||||||
|
setupMenu();
|
||||||
|
|
||||||
|
mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this,
|
||||||
|
mCustomThemeWrapper, mRetrofit, mOauthRetrofit, mRedditDataRoomDatabase, mGlide,
|
||||||
|
mAccessToken, mAccountName, mPost, mLocale, mSingleCommentId, isSingleCommentThreadMode,
|
||||||
|
mSharedPreferences, mExoCreator,
|
||||||
|
new CommentAndPostRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() {
|
||||||
|
@Override
|
||||||
|
public void updatePost(Post post) {
|
||||||
|
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void retryFetchingComments() {
|
||||||
|
fetchComments(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void retryFetchingMoreComments() {
|
||||||
|
isLoadingMoreChildren = false;
|
||||||
|
loadMoreChildrenSuccess = true;
|
||||||
|
|
||||||
|
fetchMoreComments();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
mRecyclerView.setAdapter(mAdapter);
|
||||||
|
|
||||||
|
if (comments == null) {
|
||||||
|
fetchComments(false);
|
||||||
|
} else {
|
||||||
|
if (isRefreshing) {
|
||||||
|
isRefreshing = false;
|
||||||
|
refresh(true, true);
|
||||||
|
} else if (isFetchingComments) {
|
||||||
|
fetchComments(false);
|
||||||
|
} else {
|
||||||
|
mAdapter.addComments(comments, hasMoreChildren);
|
||||||
|
if (isLoadingMoreChildren) {
|
||||||
|
isLoadingMoreChildren = false;
|
||||||
|
fetchMoreComments();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mRecyclerView.setCacheManager(mAdapter);
|
||||||
|
mRecyclerView.setPlayerInitializer(order -> {
|
||||||
|
VolumeInfo volumeInfo = new VolumeInfo(true, 0f);
|
||||||
|
return new PlaybackInfo(INDEX_UNSET, TIME_UNSET, volumeInfo);
|
||||||
|
});
|
||||||
|
|
||||||
|
fab.setOnClickListener(view -> scrollToNextParentComment());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupMenu() {
|
||||||
if (mMenu != null) {
|
if (mMenu != null) {
|
||||||
MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
|
MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
|
||||||
MenuItem hideItem = mMenu.findItem(R.id.action_hide_view_post_detail_activity);
|
MenuItem hideItem = mMenu.findItem(R.id.action_hide_view_post_detail_activity);
|
||||||
@ -505,59 +565,15 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
}
|
}
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_view_crosspost_parent_view_post_detail_activity).setVisible(mPost.getCrosspostParentId() != null);
|
mMenu.findItem(R.id.action_view_crosspost_parent_view_post_detail_activity).setVisible(mPost.getCrosspostParentId() != null);
|
||||||
}
|
|
||||||
|
|
||||||
mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this,
|
if ("[deleted]".equals(mPost.getAuthor()) ||
|
||||||
mCustomThemeWrapper, mRetrofit, mOauthRetrofit, mRedditDataRoomDatabase, mGlide,
|
"[deleted]".equals(mPost.getSelfText()) ||
|
||||||
mAccessToken, mAccountName, mPost, mLocale, mSingleCommentId, isSingleCommentThreadMode,
|
"[removed]".equals(mPost.getSelfText())
|
||||||
mSharedPreferences, mExoCreator,
|
) {
|
||||||
new CommentAndPostRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() {
|
mMenu.findItem(R.id.action_see_removed_view_post_detail_activity).setVisible(true);
|
||||||
@Override
|
|
||||||
public void updatePost(Post post) {
|
|
||||||
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void retryFetchingComments() {
|
|
||||||
fetchComments(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void retryFetchingMoreComments() {
|
|
||||||
isLoadingMoreChildren = false;
|
|
||||||
loadMoreChildrenSuccess = true;
|
|
||||||
|
|
||||||
fetchMoreComments();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
mRecyclerView.setAdapter(mAdapter);
|
|
||||||
|
|
||||||
if (comments == null) {
|
|
||||||
fetchComments(false);
|
|
||||||
} else {
|
|
||||||
if (isRefreshing) {
|
|
||||||
isRefreshing = false;
|
|
||||||
refresh(true, true);
|
|
||||||
} else if (isFetchingComments) {
|
|
||||||
fetchComments(false);
|
|
||||||
} else {
|
|
||||||
mAdapter.addComments(comments, hasMoreChildren);
|
|
||||||
if (isLoadingMoreChildren) {
|
|
||||||
isLoadingMoreChildren = false;
|
|
||||||
fetchMoreComments();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
mRecyclerView.setCacheManager(mAdapter);
|
|
||||||
mRecyclerView.setPlayerInitializer(order -> {
|
|
||||||
VolumeInfo volumeInfo = new VolumeInfo(true, 0f);
|
|
||||||
return new PlaybackInfo(INDEX_UNSET, TIME_UNSET, volumeInfo);
|
|
||||||
});
|
|
||||||
|
|
||||||
fab.setOnClickListener(view -> scrollToNextParentComment());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Drawable getMenuItemIcon(int drawableId) {
|
private Drawable getMenuItemIcon(int drawableId) {
|
||||||
Drawable icon = getDrawable(drawableId);
|
Drawable icon = getDrawable(drawableId);
|
||||||
@ -602,45 +618,7 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
public void onParsePostSuccess(Post post) {
|
public void onParsePostSuccess(Post post) {
|
||||||
mPost = post;
|
mPost = post;
|
||||||
|
|
||||||
if (mMenu != null) {
|
setupMenu();
|
||||||
MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
|
|
||||||
MenuItem hideItem = mMenu.findItem(R.id.action_hide_view_post_detail_activity);
|
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_comment_view_post_detail_activity).setVisible(true);
|
|
||||||
mMenu.findItem(R.id.action_sort_view_post_detail_activity).setVisible(true);
|
|
||||||
|
|
||||||
if (mAccessToken != null) {
|
|
||||||
if (post.isSaved()) {
|
|
||||||
saveItem.setVisible(true);
|
|
||||||
saveItem.setIcon(mSavedIcon);
|
|
||||||
} else {
|
|
||||||
saveItem.setVisible(true);
|
|
||||||
saveItem.setIcon(mUnsavedIcon);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (post.isHidden()) {
|
|
||||||
hideItem.setVisible(true);
|
|
||||||
hideItem.setTitle(R.string.action_unhide_post);
|
|
||||||
} else {
|
|
||||||
hideItem.setVisible(true);
|
|
||||||
hideItem.setTitle(R.string.action_hide_post);
|
|
||||||
}
|
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_report_view_post_detail_activity).setVisible(true);
|
|
||||||
} else {
|
|
||||||
saveItem.setVisible(false);
|
|
||||||
hideItem.setVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mPost.getAuthor().equals(mAccountName)) {
|
|
||||||
if (mPost.getPostType() == Post.TEXT_TYPE) {
|
|
||||||
mMenu.findItem(R.id.action_edit_view_post_detail_activity).setVisible(true);
|
|
||||||
}
|
|
||||||
mMenu.findItem(R.id.action_delete_view_post_detail_activity).setVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_view_crosspost_parent_view_post_detail_activity).setVisible(mPost.getCrosspostParentId() != null);
|
|
||||||
}
|
|
||||||
|
|
||||||
mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this,
|
mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this,
|
||||||
mCustomThemeWrapper, mRetrofit, mOauthRetrofit, mRedditDataRoomDatabase, mGlide,
|
mCustomThemeWrapper, mRetrofit, mOauthRetrofit, mRedditDataRoomDatabase, mGlide,
|
||||||
@ -910,38 +888,7 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
mAdapter.updatePost(mPost);
|
mAdapter.updatePost(mPost);
|
||||||
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
|
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
|
||||||
isRefreshing = false;
|
isRefreshing = false;
|
||||||
if (mMenu != null) {
|
setupMenu();
|
||||||
MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
|
|
||||||
MenuItem hideItem = mMenu.findItem(R.id.action_hide_view_post_detail_activity);
|
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_comment_view_post_detail_activity).setVisible(true);
|
|
||||||
mMenu.findItem(R.id.action_sort_view_post_detail_activity).setVisible(true);
|
|
||||||
|
|
||||||
if (mAccessToken != null) {
|
|
||||||
if (post.isSaved()) {
|
|
||||||
saveItem.setVisible(true);
|
|
||||||
saveItem.setIcon(mSavedIcon);
|
|
||||||
} else {
|
|
||||||
saveItem.setVisible(true);
|
|
||||||
saveItem.setIcon(mUnsavedIcon);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (post.isHidden()) {
|
|
||||||
hideItem.setVisible(true);
|
|
||||||
hideItem.setTitle(R.string.action_unhide_post);
|
|
||||||
} else {
|
|
||||||
hideItem.setVisible(true);
|
|
||||||
hideItem.setTitle(R.string.action_hide_post);
|
|
||||||
}
|
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_report_view_post_detail_activity).setVisible(true);
|
|
||||||
} else {
|
|
||||||
saveItem.setVisible(false);
|
|
||||||
hideItem.setVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_view_crosspost_parent_view_post_detail_activity).setVisible(mPost.getCrosspostParentId() != null);
|
|
||||||
}
|
|
||||||
mSwipeRefreshLayout.setRefreshing(false);
|
mSwipeRefreshLayout.setRefreshing(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1144,6 +1091,24 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showRemovedComment(CommentData comment, int position) {
|
||||||
|
Toast.makeText(ViewPostDetailActivity.this, R.string.fetching_removed_comment, Toast.LENGTH_SHORT).show();
|
||||||
|
FetchRemovedComment.fetchRemovedComment(
|
||||||
|
pushshiftRetrofit,
|
||||||
|
comment,
|
||||||
|
new FetchRemovedComment.FetchRemovedCommentListener() {
|
||||||
|
@Override
|
||||||
|
public void fetchSuccess(CommentData comment) {
|
||||||
|
mAdapter.editComment(comment.getAuthor(), comment.getCommentMarkdown(), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fetchFailed() {
|
||||||
|
Toast.makeText(ViewPostDetailActivity.this, R.string.show_removed_comment_failed, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public void changeToSingleThreadMode() {
|
public void changeToSingleThreadMode() {
|
||||||
isSingleCommentThreadMode = false;
|
isSingleCommentThreadMode = false;
|
||||||
mSingleCommentId = null;
|
mSingleCommentId = null;
|
||||||
@ -1257,65 +1222,30 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
applyMenuItemTheme(menu);
|
applyMenuItemTheme(menu);
|
||||||
mMenu = menu;
|
mMenu = menu;
|
||||||
if (mPost != null) {
|
if (mPost != null) {
|
||||||
MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
|
setupMenu();
|
||||||
MenuItem hideItem = mMenu.findItem(R.id.action_hide_view_post_detail_activity);
|
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_comment_view_post_detail_activity).setVisible(true);
|
|
||||||
mMenu.findItem(R.id.action_sort_view_post_detail_activity).setVisible(true);
|
|
||||||
|
|
||||||
if (mAccessToken != null) {
|
|
||||||
if (mPost.isSaved()) {
|
|
||||||
saveItem.setVisible(true);
|
|
||||||
saveItem.setIcon(mSavedIcon);
|
|
||||||
} else {
|
|
||||||
saveItem.setVisible(true);
|
|
||||||
saveItem.setIcon(mUnsavedIcon);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mPost.isHidden()) {
|
|
||||||
hideItem.setVisible(true);
|
|
||||||
hideItem.setTitle(R.string.action_unhide_post);
|
|
||||||
} else {
|
|
||||||
hideItem.setVisible(true);
|
|
||||||
hideItem.setTitle(R.string.action_hide_post);
|
|
||||||
}
|
|
||||||
|
|
||||||
mMenu.findItem(R.id.action_report_view_post_detail_activity).setVisible(true);
|
|
||||||
} else {
|
|
||||||
saveItem.setVisible(false);
|
|
||||||
hideItem.setVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mPost.getAuthor().equals(mAccountName)) {
|
|
||||||
if (mPost.getPostType() == Post.TEXT_TYPE) {
|
|
||||||
menu.findItem(R.id.action_edit_view_post_detail_activity).setVisible(true);
|
|
||||||
}
|
|
||||||
menu.findItem(R.id.action_delete_view_post_detail_activity).setVisible(true);
|
|
||||||
|
|
||||||
MenuItem nsfwItem = menu.findItem(R.id.action_nsfw_view_post_detail_activity);
|
|
||||||
nsfwItem.setVisible(true);
|
|
||||||
if (mPost.isNSFW()) {
|
|
||||||
nsfwItem.setTitle(R.string.action_unmark_nsfw);
|
|
||||||
} else {
|
|
||||||
nsfwItem.setTitle(R.string.action_mark_nsfw);
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuItem spoilerItem = menu.findItem(R.id.action_spoiler_view_post_detail_activity);
|
|
||||||
spoilerItem.setVisible(true);
|
|
||||||
if (mPost.isSpoiler()) {
|
|
||||||
spoilerItem.setTitle(R.string.action_unmark_spoiler);
|
|
||||||
} else {
|
|
||||||
spoilerItem.setTitle(R.string.action_mark_spoiler);
|
|
||||||
}
|
|
||||||
|
|
||||||
menu.findItem(R.id.action_edit_flair_view_post_detail_activity).setVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
menu.findItem(R.id.action_view_crosspost_parent_view_post_detail_activity).setVisible(mPost.getCrosspostParentId() != null);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showRemovedPost() {
|
||||||
|
Toast.makeText(ViewPostDetailActivity.this, R.string.fetching_removed_post, Toast.LENGTH_SHORT).show();
|
||||||
|
FetchRemovedPost.fetchRemovedPost(
|
||||||
|
pushshiftRetrofit,
|
||||||
|
mPost,
|
||||||
|
new FetchRemovedPost.FetchRemovedPostListener() {
|
||||||
|
@Override
|
||||||
|
public void fetchSuccess(Post post) {
|
||||||
|
mPost = post;
|
||||||
|
mAdapter.updatePost(post);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fetchFailed() {
|
||||||
|
Toast.makeText(ViewPostDetailActivity.this, R.string.show_removed_post_failed, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||||
switch (item.getItemId()) {
|
switch (item.getItemId()) {
|
||||||
@ -1450,12 +1380,12 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_edit_view_post_detail_activity:
|
case R.id.action_edit_view_post_detail_activity:
|
||||||
Intent editPostItent = new Intent(this, EditPostActivity.class);
|
Intent editPostIntent = new Intent(this, EditPostActivity.class);
|
||||||
editPostItent.putExtra(EditPostActivity.EXTRA_ACCESS_TOKEN, mAccessToken);
|
editPostIntent.putExtra(EditPostActivity.EXTRA_ACCESS_TOKEN, mAccessToken);
|
||||||
editPostItent.putExtra(EditPostActivity.EXTRA_FULLNAME, mPost.getFullName());
|
editPostIntent.putExtra(EditPostActivity.EXTRA_FULLNAME, mPost.getFullName());
|
||||||
editPostItent.putExtra(EditPostActivity.EXTRA_TITLE, mPost.getTitle());
|
editPostIntent.putExtra(EditPostActivity.EXTRA_TITLE, mPost.getTitle());
|
||||||
editPostItent.putExtra(EditPostActivity.EXTRA_CONTENT, mPost.getSelfText());
|
editPostIntent.putExtra(EditPostActivity.EXTRA_CONTENT, mPost.getSelfText());
|
||||||
startActivityForResult(editPostItent, EDIT_POST_REQUEST_CODE);
|
startActivityForResult(editPostIntent, EDIT_POST_REQUEST_CODE);
|
||||||
return true;
|
return true;
|
||||||
case R.id.action_delete_view_post_detail_activity:
|
case R.id.action_delete_view_post_detail_activity:
|
||||||
new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
|
new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
|
||||||
@ -1504,6 +1434,10 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
intent.putExtra(ReportActivity.EXTRA_SUBREDDIT_NAME, mPost.getSubredditName());
|
intent.putExtra(ReportActivity.EXTRA_SUBREDDIT_NAME, mPost.getSubredditName());
|
||||||
intent.putExtra(ReportActivity.EXTRA_THING_FULLNAME, mPost.getFullName());
|
intent.putExtra(ReportActivity.EXTRA_THING_FULLNAME, mPost.getFullName());
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
case R.id.action_see_removed_view_post_detail_activity:
|
||||||
|
showRemovedPost();
|
||||||
|
return true;
|
||||||
case android.R.id.home:
|
case android.R.id.home:
|
||||||
onBackPressed();
|
onBackPressed();
|
||||||
return true;
|
return true;
|
||||||
@ -1537,7 +1471,8 @@ public class ViewPostDetailActivity extends BaseActivity implements FlairBottomS
|
|||||||
}
|
}
|
||||||
} else if (requestCode == EDIT_COMMENT_REQUEST_CODE) {
|
} else if (requestCode == EDIT_COMMENT_REQUEST_CODE) {
|
||||||
if (data != null && resultCode == RESULT_OK) {
|
if (data != null && resultCode == RESULT_OK) {
|
||||||
mAdapter.editComment(data.getStringExtra(EditCommentActivity.EXTRA_EDITED_COMMENT_CONTENT),
|
mAdapter.editComment(null,
|
||||||
|
data.getStringExtra(EditCommentActivity.EXTRA_EDITED_COMMENT_CONTENT),
|
||||||
data.getExtras().getInt(EditCommentActivity.EXTRA_EDITED_COMMENT_POSITION));
|
data.getExtras().getInt(EditCommentActivity.EXTRA_EDITED_COMMENT_POSITION));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1384,8 +1384,11 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void editComment(String commentContent, int position) {
|
public void editComment(String commentAuthor, String commentContentMarkdown, int position) {
|
||||||
mVisibleComments.get(position).setCommentMarkdown(commentContent);
|
if (commentAuthor != null)
|
||||||
|
mVisibleComments.get(position).setAuthor(commentAuthor);
|
||||||
|
|
||||||
|
mVisibleComments.get(position).setCommentMarkdown(commentContentMarkdown);
|
||||||
if (mIsSingleCommentThreadMode) {
|
if (mIsSingleCommentThreadMode) {
|
||||||
notifyItemChanged(position + 2);
|
notifyItemChanged(position + 2);
|
||||||
} else {
|
} else {
|
||||||
|
@ -130,6 +130,16 @@ class AppModule {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Named("pushshift")
|
||||||
|
@Singleton
|
||||||
|
Retrofit providePushshiftRetrofit() {
|
||||||
|
return new Retrofit.Builder()
|
||||||
|
.baseUrl(APIUtils.PUSHSHIFT_API_BASE_URI)
|
||||||
|
.addConverterFactory(ScalarsConverterFactory.create())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
OkHttpClient provideOkHttpClient(@Named("no_oauth") Retrofit retrofit, RedditDataRoomDatabase accountRoomDatabase) {
|
OkHttpClient provideOkHttpClient(@Named("no_oauth") Retrofit retrofit, RedditDataRoomDatabase accountRoomDatabase) {
|
||||||
|
@ -47,7 +47,10 @@ public class CommentMoreBottomSheetFragment extends RoundedBottomSheetDialogFrag
|
|||||||
TextView copyTextView;
|
TextView copyTextView;
|
||||||
@BindView(R.id.report_view_comment_more_bottom_sheet_fragment)
|
@BindView(R.id.report_view_comment_more_bottom_sheet_fragment)
|
||||||
TextView reportTextView;
|
TextView reportTextView;
|
||||||
|
@BindView(R.id.see_removed_view_comment_more_bottom_sheet_fragment)
|
||||||
|
TextView seeRemovedTextView;
|
||||||
private AppCompatActivity activity;
|
private AppCompatActivity activity;
|
||||||
|
|
||||||
public CommentMoreBottomSheetFragment() {
|
public CommentMoreBottomSheetFragment() {
|
||||||
// Required empty public constructor
|
// Required empty public constructor
|
||||||
}
|
}
|
||||||
@ -131,6 +134,20 @@ public class CommentMoreBottomSheetFragment extends RoundedBottomSheetDialogFrag
|
|||||||
dismiss();
|
dismiss();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if ("[deleted]".equals(commentData.getAuthor()) ||
|
||||||
|
"[deleted]".equals(commentData.getCommentRawText()) ||
|
||||||
|
"[removed]".equals(commentData.getCommentRawText())
|
||||||
|
) {
|
||||||
|
seeRemovedTextView.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
|
seeRemovedTextView.setOnClickListener(view -> {
|
||||||
|
dismiss();
|
||||||
|
if (activity instanceof ViewPostDetailActivity) {
|
||||||
|
((ViewPostDetailActivity) activity).showRemovedComment(commentData, bundle.getInt(EXTRA_POSITION));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return rootView;
|
return rootView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,97 @@
|
|||||||
|
package ml.docilealligator.infinityforreddit;
|
||||||
|
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import ml.docilealligator.infinityforreddit.API.PushshiftAPI;
|
||||||
|
import ml.docilealligator.infinityforreddit.Utils.JSONUtils;
|
||||||
|
import ml.docilealligator.infinityforreddit.Utils.Utils;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
import retrofit2.Retrofit;
|
||||||
|
|
||||||
|
public class FetchRemovedComment {
|
||||||
|
|
||||||
|
public static void fetchRemovedComment(Retrofit retrofit, CommentData comment, FetchRemovedCommentListener listener) {
|
||||||
|
retrofit.create(PushshiftAPI.class).getRemovedComment(comment.getId())
|
||||||
|
.enqueue(new Callback<String>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||||
|
if (response.isSuccessful()) {
|
||||||
|
new ParseCommentAsyncTask(response.body(), comment, listener).execute();
|
||||||
|
} else {
|
||||||
|
listener.fetchFailed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
listener.fetchFailed();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static CommentData parseRemovedComment(JSONObject comment, CommentData commentData) throws JSONException {
|
||||||
|
String id = comment.getString(JSONUtils.ID_KEY);
|
||||||
|
if (id.equals(commentData.getId())) {
|
||||||
|
String author = comment.getString(JSONUtils.AUTHOR_KEY);
|
||||||
|
String commentMarkdown = "";
|
||||||
|
if (!comment.isNull(JSONUtils.BODY_KEY)) {
|
||||||
|
commentMarkdown = Utils.modifyMarkdown(comment.getString(JSONUtils.BODY_KEY).trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
commentData.setAuthor(author);
|
||||||
|
commentData.setCommentMarkdown(commentMarkdown);
|
||||||
|
commentData.setCommentRawText(commentMarkdown);
|
||||||
|
return commentData;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface FetchRemovedCommentListener {
|
||||||
|
void fetchSuccess(CommentData comment);
|
||||||
|
|
||||||
|
void fetchFailed();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ParseCommentAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
|
|
||||||
|
private String responseBody;
|
||||||
|
private FetchRemovedCommentListener listener;
|
||||||
|
CommentData comment;
|
||||||
|
|
||||||
|
public ParseCommentAsyncTask(String responseBody, CommentData comment, FetchRemovedCommentListener listener) {
|
||||||
|
this.responseBody = responseBody;
|
||||||
|
this.comment = comment;
|
||||||
|
this.listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... voids) {
|
||||||
|
try {
|
||||||
|
JSONObject commentJSON = new JSONObject(responseBody).getJSONArray(JSONUtils.DATA_KEY).getJSONObject(0);
|
||||||
|
comment = parseRemovedComment(commentJSON, comment);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
comment = null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Void aVoid) {
|
||||||
|
super.onPostExecute(aVoid);
|
||||||
|
if (comment != null)
|
||||||
|
listener.fetchSuccess(comment);
|
||||||
|
else
|
||||||
|
listener.fetchFailed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,133 @@
|
|||||||
|
package ml.docilealligator.infinityforreddit;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.text.Html;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import ml.docilealligator.infinityforreddit.API.PushshiftAPI;
|
||||||
|
import ml.docilealligator.infinityforreddit.Post.Post;
|
||||||
|
import ml.docilealligator.infinityforreddit.Utils.JSONUtils;
|
||||||
|
import ml.docilealligator.infinityforreddit.Utils.Utils;
|
||||||
|
import retrofit2.Call;
|
||||||
|
import retrofit2.Callback;
|
||||||
|
import retrofit2.Response;
|
||||||
|
import retrofit2.Retrofit;
|
||||||
|
|
||||||
|
public class FetchRemovedPost {
|
||||||
|
|
||||||
|
public static void fetchRemovedPost(Retrofit retrofit, Post post, FetchRemovedPostListener listener) {
|
||||||
|
retrofit.create(PushshiftAPI.class).getRemovedPost(post.getId())
|
||||||
|
.enqueue(new Callback<String>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
|
||||||
|
if (response.isSuccessful()) {
|
||||||
|
new ParsePostAsyncTask(response.body(), post, listener).execute();
|
||||||
|
} else {
|
||||||
|
listener.fetchFailed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
listener.fetchFailed();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Post parseRemovedPost(JSONObject postJson, Post post) throws JSONException {
|
||||||
|
String id = postJson.getString(JSONUtils.ID_KEY);
|
||||||
|
if (id.equals(post.getId())) {
|
||||||
|
String author = postJson.getString(JSONUtils.AUTHOR_KEY);
|
||||||
|
String title = postJson.getString(JSONUtils.TITLE_KEY);
|
||||||
|
String postContent = Utils.modifyMarkdown(postJson.getString(JSONUtils.SELFTEXT_KEY).trim());
|
||||||
|
|
||||||
|
post.setAuthor(author);
|
||||||
|
post.setTitle(title);
|
||||||
|
post.setSelfText(postContent);
|
||||||
|
post.setSelfTextPlain("");
|
||||||
|
post.setSelfTextPlainTrimmed("");
|
||||||
|
|
||||||
|
String url = postJson.optString(JSONUtils.URL_KEY);
|
||||||
|
|
||||||
|
if (url.endsWith("gif") || url.endsWith("mp4")) {
|
||||||
|
post.setVideoUrl(url);
|
||||||
|
post.setVideoDownloadUrl(url);
|
||||||
|
} else if (post.getPostType() == Post.VIDEO_TYPE || post.getPostType() == Post.GIF_TYPE) {
|
||||||
|
JSONObject redditVideoObject = postJson.getJSONObject("secure_media").getJSONObject(JSONUtils.REDDIT_VIDEO_KEY);
|
||||||
|
String videoUrl = Html.fromHtml(redditVideoObject.getString(JSONUtils.HLS_URL_KEY)).toString();
|
||||||
|
String videoDownloadUrl = redditVideoObject.getString(JSONUtils.FALLBACK_URL_KEY);
|
||||||
|
|
||||||
|
post.setVideoUrl(videoUrl);
|
||||||
|
post.setVideoDownloadUrl(videoDownloadUrl);
|
||||||
|
} else if (post.getPostType() == Post.LINK_TYPE) {
|
||||||
|
post.setUrl(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (post.getPostType() == Post.VIDEO_TYPE) {
|
||||||
|
try {
|
||||||
|
Uri uri = Uri.parse(url);
|
||||||
|
String authority = uri.getAuthority();
|
||||||
|
if (authority != null && (authority.contains("gfycat.com") || authority.contains("redgifs.com"))) {
|
||||||
|
post.setPostType(Post.LINK_TYPE);
|
||||||
|
post.setUrl(url);
|
||||||
|
}
|
||||||
|
} catch (IllegalArgumentException ignore) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!postJson.isNull("thumbnail")) {
|
||||||
|
post.setThumbnailPreviewUrl(postJson.getString("thumbnail"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return post;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface FetchRemovedPostListener {
|
||||||
|
void fetchSuccess(Post post);
|
||||||
|
|
||||||
|
void fetchFailed();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class ParsePostAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
|
|
||||||
|
private String responseBody;
|
||||||
|
private FetchRemovedPostListener listener;
|
||||||
|
Post post;
|
||||||
|
|
||||||
|
public ParsePostAsyncTask(String responseBody, Post post, FetchRemovedPostListener listener) {
|
||||||
|
this.responseBody = responseBody;
|
||||||
|
this.post = post;
|
||||||
|
this.listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... voids) {
|
||||||
|
try {
|
||||||
|
JSONObject postJson = new JSONObject(responseBody).getJSONArray(JSONUtils.DATA_KEY).getJSONObject(0);
|
||||||
|
post = parseRemovedPost(postJson, post);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
post = null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Void aVoid) {
|
||||||
|
super.onPostExecute(aVoid);
|
||||||
|
if (post != null)
|
||||||
|
listener.fetchSuccess(post);
|
||||||
|
else
|
||||||
|
listener.fetchFailed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -252,6 +252,11 @@ public class Post implements Parcelable {
|
|||||||
return author;
|
return author;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAuthor(String author) {
|
||||||
|
this.author = author;
|
||||||
|
this.authorNamePrefixed = "u/" + author;
|
||||||
|
}
|
||||||
|
|
||||||
public String getAuthorNamePrefixed() {
|
public String getAuthorNamePrefixed() {
|
||||||
return authorNamePrefixed;
|
return authorNamePrefixed;
|
||||||
}
|
}
|
||||||
@ -320,6 +325,10 @@ public class Post implements Parcelable {
|
|||||||
return thumbnailPreviewUrl;
|
return thumbnailPreviewUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setThumbnailPreviewUrl(String thumbnailPreviewUrl) {
|
||||||
|
this.thumbnailPreviewUrl = thumbnailPreviewUrl;
|
||||||
|
}
|
||||||
|
|
||||||
public String getUrl() {
|
public String getUrl() {
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,7 @@ public class APIUtils {
|
|||||||
public static final String GFYCAT_API_BASE_URI = "https://api.gfycat.com/v1/gfycats/";
|
public static final String GFYCAT_API_BASE_URI = "https://api.gfycat.com/v1/gfycats/";
|
||||||
public static final String REDGIFS_API_BASE_URI = "https://api.redgifs.com/v1/gfycats/";
|
public static final String REDGIFS_API_BASE_URI = "https://api.redgifs.com/v1/gfycats/";
|
||||||
public static final String IMGUR_API_BASE_URI = "https://api.imgur.com/3/";
|
public static final String IMGUR_API_BASE_URI = "https://api.imgur.com/3/";
|
||||||
|
public static final String PUSHSHIFT_API_BASE_URI = "https://api.pushshift.io/";
|
||||||
|
|
||||||
public static final String CLIENT_ID_KEY = "client_id";
|
public static final String CLIENT_ID_KEY = "client_id";
|
||||||
public static final String CLIENT_ID = "";
|
public static final String CLIENT_ID = "";
|
||||||
|
@ -104,6 +104,25 @@
|
|||||||
android:textSize="?attr/font_default"
|
android:textSize="?attr/font_default"
|
||||||
android:fontFamily="?attr/font_family" />
|
android:fontFamily="?attr/font_family" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/see_removed_view_comment_more_bottom_sheet_fragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?attr/selectableItemBackground"
|
||||||
|
android:clickable="true"
|
||||||
|
android:drawableStart="@drawable/ic_preview_24dp"
|
||||||
|
android:drawablePadding="48dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:paddingStart="32dp"
|
||||||
|
android:paddingTop="16dp"
|
||||||
|
android:paddingEnd="32dp"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
android:text="@string/see_removed_comment"
|
||||||
|
android:textColor="?attr/primaryTextColor"
|
||||||
|
android:textSize="?attr/font_default"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</androidx.core.widget.NestedScrollView>
|
</androidx.core.widget.NestedScrollView>
|
@ -80,5 +80,12 @@
|
|||||||
android:orderInCategory="12"
|
android:orderInCategory="12"
|
||||||
android:title="@string/action_report"
|
android:title="@string/action_report"
|
||||||
app:showAsAction="never"
|
app:showAsAction="never"
|
||||||
|
android:visible="false"/>
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_see_removed_view_post_detail_activity"
|
||||||
|
android:orderInCategory="13"
|
||||||
|
android:title="@string/action_see_removed"
|
||||||
|
app:showAsAction="never"
|
||||||
android:visible="false" />
|
android:visible="false" />
|
||||||
</menu>
|
</menu>
|
@ -61,6 +61,7 @@
|
|||||||
<string name="action_share">Share</string>
|
<string name="action_share">Share</string>
|
||||||
<string name="action_preview">Preview</string>
|
<string name="action_preview">Preview</string>
|
||||||
<string name="action_report">Report</string>
|
<string name="action_report">Report</string>
|
||||||
|
<string name="action_see_removed">See Removed</string>
|
||||||
<string name="action_set_wallpaper">Set as Wallpaper</string>
|
<string name="action_set_wallpaper">Set as Wallpaper</string>
|
||||||
|
|
||||||
<string name="parse_json_response_error">Error occurred when parsing the JSON response</string>
|
<string name="parse_json_response_error">Error occurred when parsing the JSON response</string>
|
||||||
@ -276,6 +277,11 @@
|
|||||||
<string name="are_you_sure">Are you sure?</string>
|
<string name="are_you_sure">Are you sure?</string>
|
||||||
<string name="edit">Edit</string>
|
<string name="edit">Edit</string>
|
||||||
<string name="delete">Delete</string>
|
<string name="delete">Delete</string>
|
||||||
|
<string name="see_removed_comment">See Removed Comment</string>
|
||||||
|
<string name="fetching_removed_comment">Fetching removed comment</string>
|
||||||
|
<string name="show_removed_comment_failed">Could not find the removed comment</string>
|
||||||
|
<string name="fetching_removed_post">Fetching removed post</string>
|
||||||
|
<string name="show_removed_post_failed">Could not find the removed post</string>
|
||||||
<string name="cancel">Cancel</string>
|
<string name="cancel">Cancel</string>
|
||||||
<string name="ok">OK</string>
|
<string name="ok">OK</string>
|
||||||
<string name="edit_success">Edit successful</string>
|
<string name="edit_success">Edit successful</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user