Deleting and editing posts are now available.

This commit is contained in:
Alex Ning
2019-08-12 17:20:33 +08:00
parent 4df18af914
commit b1b3642ca8
27 changed files with 392 additions and 44 deletions

View File

@@ -31,4 +31,5 @@ interface AppComponent {
void inject(SearchSubredditsResultActivity searchSubredditsResultActivity);
void inject(FollowedUsersListingFragment followedUsersListingFragment);
void inject(SubredditSelectionActivity subredditSelectionActivity);
void inject(EditPostActivity editPostActivity);
}

View File

@@ -48,7 +48,7 @@ class CommentsListingRecyclerViewAdapter extends PagedListAdapter<CommentData, R
mOauthRetrofit = oauthRetrofit;
mAccessToken = accessToken;
mRetryLoadingMoreCallback = retryLoadingMoreCallback;
mTextColorPrimaryDark = mContext.getResources().getColor(R.color.textColorPrimaryDark);
mTextColorPrimaryDark = mContext.getResources().getColor(R.color.colorPrimaryDarkDayNightTheme);
mColorAccent = mContext.getResources().getColor(R.color.colorAccent);
}

View File

@@ -0,0 +1,38 @@
package ml.docilealligator.infinityforreddit;
import androidx.annotation.NonNull;
import java.util.HashMap;
import java.util.Map;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
class DeleteThing {
interface DeleteThingListener {
void deleteSuccess();
void deleteFailed();
}
static void delete(Retrofit oauthRetrofit, String fullname, String accessToken, DeleteThingListener deleteThingListener) {
Map<String, String> params = new HashMap<>();
params.put(RedditUtils.ID_KEY, fullname);
oauthRetrofit.create(RedditAPI.class).delete(RedditUtils.getOAuthHeader(accessToken), params).enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
if(response.isSuccessful()) {
deleteThingListener.deleteSuccess();
} else {
deleteThingListener.deleteFailed();
}
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
deleteThingListener.deleteFailed();
}
});
}
}

View File

@@ -0,0 +1,127 @@
package ml.docilealligator.infinityforreddit;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.ContextCompat;
import com.google.android.material.snackbar.Snackbar;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class EditPostActivity extends AppCompatActivity {
static final String EXTRA_TITLE = "ET";
static final String EXTRA_CONTENT = "EC";
static final String EXTRA_FULLNAME = "EF";
static final String EXTRA_ACCESS_TOKEN = "EAT";
@BindView(R.id.coordinator_layout_edit_post_activity) CoordinatorLayout coordinatorLayout;
@BindView(R.id.toolbar_edit_post_activity) Toolbar toolbar;
@BindView(R.id.post_title_text_view_edit_post_activity) TextView titleTextView;
@BindView(R.id.post_text_content_edit_text_edit_post_activity) EditText contentEditText;
private String mFullName;
private String mAccessToken;
private boolean isSubmitting = false;
@Inject
@Named("oauth")
Retrofit mOauthRetrofit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_post);
ButterKnife.bind(this);
((Infinity) getApplication()).getAppComponent().inject(this);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Window window = getWindow();
if((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) != Configuration.UI_MODE_NIGHT_YES) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
}
window.setNavigationBarColor(ContextCompat.getColor(this, R.color.navBarColor));
}
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mFullName = getIntent().getExtras().getString(EXTRA_FULLNAME);
mAccessToken = getIntent().getExtras().getString(EXTRA_ACCESS_TOKEN);
titleTextView.setText(getIntent().getExtras().getString(EXTRA_TITLE));
contentEditText.setText(getIntent().getExtras().getString(EXTRA_CONTENT));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.edit_post_activity, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if(item.getItemId() == R.id.action_send_edit_post_activity) {
if(!isSubmitting) {
isSubmitting = true;
Snackbar.make(coordinatorLayout, R.string.posting, Snackbar.LENGTH_SHORT).show();
Map<String, String> params = new HashMap<>();
params.put(RedditUtils.THING_ID_KEY, mFullName);
params.put(RedditUtils.TEXT_KEY, contentEditText.getText().toString());
mOauthRetrofit.create(RedditAPI.class)
.editPostOrComment(RedditUtils.getOAuthHeader(mAccessToken), params)
.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
isSubmitting = false;
Toast.makeText(EditPostActivity.this, R.string.edit_success, Toast.LENGTH_SHORT).show();
Intent returnIntent = new Intent();
setResult(RESULT_OK, returnIntent);
finish();
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
isSubmitting = false;
Snackbar.make(coordinatorLayout, R.string.post_failed, Snackbar.LENGTH_SHORT).show();
}
});
}
return true;
} else if(item.getItemId() == android.R.id.home) {
finish();
return true;
}
return false;
}
}

View File

@@ -279,7 +279,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
.into(((DataViewHolder) holder).iconGifImageView);
}
((DataViewHolder) holder).nameTextView.setTextColor(mContext.getResources().getColor(R.color.textColorPrimaryDark));
((DataViewHolder) holder).nameTextView.setTextColor(mContext.getResources().getColor(R.color.colorPrimaryDarkDayNightTheme));
((DataViewHolder) holder).nameTextView.setText(authorPrefixed);
((DataViewHolder) holder).iconNameLinearLayout.setOnClickListener(view -> {

View File

@@ -29,6 +29,7 @@ import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import com.evernote.android.state.State;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
import com.livefront.bridge.Bridge;
@@ -57,8 +58,11 @@ public class ViewPostDetailActivity extends AppCompatActivity {
static final String EXTRA_POST_LIST_POSITION = "EPLI";
static final String EXTRA_POST_ID = "EPI";
private static final int EDIT_POST_REQUEST_CODE = 2;
private RequestManager mGlide;
private Locale mLocale;
private Menu mMenu;
private int orientation;
private int postListPosition = -1;
@@ -68,6 +72,8 @@ public class ViewPostDetailActivity extends AppCompatActivity {
@State
String mAccessToken;
@State
String mAccountName;
@State
Post mPost;
@State
boolean isLoadingMoreChildren = false;
@@ -164,7 +170,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
int navBarResourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (navBarResourceId > 0) {
mRecyclerView.setPadding(0, 0, 0, resources.getDimensionPixelSize(navBarResourceId));
showToast = true;
}
}
@@ -197,6 +202,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
mNullAccessToken = true;
} else {
mAccessToken = account.getAccessToken();
mAccountName = account.getUsername();
}
bindView();
@@ -209,9 +215,14 @@ public class ViewPostDetailActivity extends AppCompatActivity {
}
if(mPost == null) {
mProgressBar.setVisibility(View.VISIBLE);
fetchPostAndCommentsById(getIntent().getExtras().getString(EXTRA_POST_ID));
} else {
if(mMenu != null && 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);
}
mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit,
mOauthRetrofit, mRedditDataRoomDatabase, mGlide, mAccessToken, mPost,
mPost.getSubredditNamePrefixed(), mLocale, mLoadSubredditIconAsyncTask,
@@ -236,7 +247,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
} else {
if(isRefreshing) {
isRefreshing = false;
refresh();
refresh(false);
} else {
mAdapter.addComments(comments, hasMoreChildren);
if(isLoadingMoreChildren) {
@@ -271,6 +282,13 @@ public class ViewPostDetailActivity extends AppCompatActivity {
public void onParsePostSuccess(Post post) {
mPost = post;
if(mMenu != null && 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);
}
mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit,
mOauthRetrofit, mRedditDataRoomDatabase, mGlide, mAccessToken, mPost,
mPost.getSubredditNamePrefixed(), mLocale, mLoadSubredditIconAsyncTask,
@@ -410,7 +428,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
});
}
private void refresh() {
private void refresh(boolean onlyRefreshPost) {
if(!isRefreshing) {
isRefreshing = true;
mChildrenStartingIndex = 0;
@@ -418,7 +436,9 @@ public class ViewPostDetailActivity extends AppCompatActivity {
mFetchPostInfoLinearLayout.setVisibility(View.GONE);
mGlide.clear(mFetchPostInfoImageView);
fetchComments();
if(!onlyRefreshPost) {
fetchComments();
}
Retrofit retrofit;
if(mAccessToken == null) {
@@ -438,11 +458,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
@Override
public void fetchPostFailed() {
if(showToast) {
Toast.makeText(ViewPostDetailActivity.this, R.string.refresh_post_failed, Toast.LENGTH_SHORT).show();
} else {
Snackbar.make(mCoordinatorLayout, R.string.refresh_post_failed, Snackbar.LENGTH_SHORT);
}
showErrorMessage(R.string.refresh_post_failed);
isRefreshing = false;
}
});
@@ -457,6 +473,14 @@ public class ViewPostDetailActivity extends AppCompatActivity {
mGlide.load(R.drawable.load_post_error_indicator).into(mFetchPostInfoImageView);
}
private void showErrorMessage(int resId) {
if(showToast) {
Toast.makeText(ViewPostDetailActivity.this, resId, Toast.LENGTH_SHORT).show();
} else {
Snackbar.make(mCoordinatorLayout, resId, Snackbar.LENGTH_SHORT);
}
}
@Subscribe
public void onPostUpdateEvent(PostUpdateEventToDetailActivity event) {
if(mPost.getId().equals(event.postId)) {
@@ -468,6 +492,13 @@ public class ViewPostDetailActivity extends AppCompatActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.view_post_detail_activity, menu);
mMenu = menu;
if(mPost != null && 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);
}
return true;
}
@@ -475,7 +506,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_refresh_view_post_detail_activity:
refresh();
refresh(false);
return true;
case R.id.action_comment_view_post_detail_activity:
if(mAccessToken == null) {
@@ -490,6 +521,34 @@ public class ViewPostDetailActivity extends AppCompatActivity {
intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, false);
startActivityForResult(intent, WRITE_COMMENT_REQUEST_CODE);
return true;
case R.id.action_edit_view_post_detail_activity:
Intent editPostItent = new Intent(this, EditPostActivity.class);
editPostItent.putExtra(EditPostActivity.EXTRA_ACCESS_TOKEN, mAccessToken);
editPostItent.putExtra(EditPostActivity.EXTRA_FULLNAME, mPost.getFullName());
editPostItent.putExtra(EditPostActivity.EXTRA_TITLE, mPost.getTitle());
editPostItent.putExtra(EditPostActivity.EXTRA_CONTENT, mPost.getSelfText());
startActivityForResult(editPostItent, EDIT_POST_REQUEST_CODE);
return true;
case R.id.action_delete_view_post_detail_activity:
new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
.setTitle(R.string.delete_this_post)
.setMessage(R.string.are_you_sure)
.setPositiveButton(R.string.delete, (dialogInterface, i)
-> DeleteThing.delete(mOauthRetrofit, mPost.getFullName(), mAccessToken, new DeleteThing.DeleteThingListener() {
@Override
public void deleteSuccess() {
Toast.makeText(ViewPostDetailActivity.this, R.string.delete_post_success, Toast.LENGTH_SHORT).show();
finish();
}
@Override
public void deleteFailed() {
showErrorMessage(R.string.delete_post_failed);
}
}))
.setNegativeButton(R.string.cancel, null)
.show();
return true;
case android.R.id.home:
onBackPressed();
return true;
@@ -500,18 +559,24 @@ public class ViewPostDetailActivity extends AppCompatActivity {
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data != null && resultCode == RESULT_OK && requestCode == WRITE_COMMENT_REQUEST_CODE) {
if(data.hasExtra(EXTRA_COMMENT_DATA_KEY)) {
CommentData comment = data.getExtras().getParcelable(EXTRA_COMMENT_DATA_KEY);
if(comment.getDepth() == 0) {
mAdapter.addComment(comment);
if(requestCode == WRITE_COMMENT_REQUEST_CODE) {
if(data != null && resultCode == RESULT_OK) {
if(data.hasExtra(EXTRA_COMMENT_DATA_KEY)) {
CommentData comment = data.getExtras().getParcelable(EXTRA_COMMENT_DATA_KEY);
if(comment.getDepth() == 0) {
mAdapter.addComment(comment);
} else {
String parentFullname = data.getExtras().getString(CommentActivity.EXTRA_PARENT_FULLNAME_KEY);
int parentPosition = data.getExtras().getInt(CommentActivity.EXTRA_PARENT_POSITION_KEY);
mAdapter.addChildComment(comment, parentFullname, parentPosition);
}
} else {
String parentFullname = data.getExtras().getString(CommentActivity.EXTRA_PARENT_FULLNAME_KEY);
int parentPosition = data.getExtras().getInt(CommentActivity.EXTRA_PARENT_POSITION_KEY);
mAdapter.addChildComment(comment, parentFullname, parentPosition);
Toast.makeText(this, R.string.send_comment_failed, Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, R.string.send_comment_failed, Toast.LENGTH_SHORT).show();
}
} else if(requestCode == EDIT_POST_REQUEST_CODE) {
if(resultCode == RESULT_OK) {
refresh(true);
}
}
}