From b1b3642ca8ceb159282dc684be2d75afa4b37a91 Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Mon, 12 Aug 2019 17:20:33 +0800 Subject: Deleting and editing posts are now available. --- .../infinityforreddit/AppComponent.java | 1 + .../CommentsListingRecyclerViewAdapter.java | 2 +- .../infinityforreddit/DeleteThing.java | 38 ++++++ .../infinityforreddit/EditPostActivity.java | 127 +++++++++++++++++++++ .../infinityforreddit/PostRecyclerViewAdapter.java | 2 +- .../infinityforreddit/ViewPostDetailActivity.java | 107 +++++++++++++---- 6 files changed, 254 insertions(+), 23 deletions(-) create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/DeleteThing.java create mode 100644 app/src/main/java/ml/docilealligator/infinityforreddit/EditPostActivity.java (limited to 'app/src/main/java') diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java index 39616ae6..d77f2397 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java @@ -31,4 +31,5 @@ interface AppComponent { void inject(SearchSubredditsResultActivity searchSubredditsResultActivity); void inject(FollowedUsersListingFragment followedUsersListingFragment); void inject(SubredditSelectionActivity subredditSelectionActivity); + void inject(EditPostActivity editPostActivity); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java index 9a7fa962..e2fd34b5 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java @@ -48,7 +48,7 @@ class CommentsListingRecyclerViewAdapter extends PagedListAdapter params = new HashMap<>(); + params.put(RedditUtils.ID_KEY, fullname); + oauthRetrofit.create(RedditAPI.class).delete(RedditUtils.getOAuthHeader(accessToken), params).enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if(response.isSuccessful()) { + deleteThingListener.deleteSuccess(); + } else { + deleteThingListener.deleteFailed(); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + deleteThingListener.deleteFailed(); + } + }); + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/EditPostActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/EditPostActivity.java new file mode 100644 index 00000000..7213522a --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/EditPostActivity.java @@ -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 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() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response 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 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; + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index c669d14a..0b71a15a 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -279,7 +279,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java index 4be80aa7..ad65fe4f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java @@ -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); } } } -- cgit v1.2.3