Saving and unsaving post are now available. Disable commenting and replying for locked posts in last commit.

This commit is contained in:
Alex Ning 2019-08-22 17:01:25 +08:00
parent 5f7bfd88b7
commit d4fc671605
13 changed files with 294 additions and 71 deletions

View File

@ -35,9 +35,9 @@
<map> <map>
<entry key="assetSourceType" value="FILE" /> <entry key="assetSourceType" value="FILE" />
<entry key="color" value="ffffff" /> <entry key="color" value="ffffff" />
<entry key="outputName" value="ic_outline_color_lens_24px" /> <entry key="outputName" value="ic_baseline_bookmark_24px" />
<entry key="overrideSize" value="true" /> <entry key="overrideSize" value="true" />
<entry key="sourceFile" value="$USER_HOME$/Downloads/outline-color_lens-24px.svg" /> <entry key="sourceFile" value="$USER_HOME$/Downloads/baseline-bookmark-24px.svg" />
</map> </map>
</option> </option>
</PersistentState> </PersistentState>

View File

@ -76,6 +76,7 @@ public class JSONUtils {
static final String DESCRIPTION_HTML_KEY = "description_html"; static final String DESCRIPTION_HTML_KEY = "description_html";
static final String ARCHIVED_KEY = "archived"; static final String ARCHIVED_KEY = "archived";
static final String LOCKEC_KEY = "locked"; static final String LOCKEC_KEY = "locked";
static final String SAVED_KEY = "saved";
static final String TEXT_EDITABLE_KEY = "text_editable"; static final String TEXT_EDITABLE_KEY = "text_editable";
static final String SUBJECT_KEY = "subject"; static final String SUBJECT_KEY = "subject";
static final String CONTEXT_KEY = "context"; static final String CONTEXT_KEY = "context";

View File

@ -317,7 +317,7 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
.build(); .build();
workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG, workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.REPLACE, pullNotificationRequest); ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
} else { } else {
workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG); workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG);
} }
@ -343,7 +343,7 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
.build(); .build();
workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG, workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.REPLACE, pullNotificationRequest); ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
} else { } else {
workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG); workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG);
} }
@ -373,7 +373,7 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe
.build(); .build();
workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG, workManager.enqueueUniquePeriodicWork(PullNotificationWorker.WORKER_TAG,
ExistingPeriodicWorkPolicy.REPLACE, pullNotificationRequest); ExistingPeriodicWorkPolicy.KEEP, pullNotificationRequest);
} else { } else {
workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG); workManager.cancelAllWorkByTag(PullNotificationWorker.WORKER_TAG);
} }

View File

@ -167,6 +167,7 @@ class ParsePost {
boolean stickied = data.getBoolean(JSONUtils.STICKIED_KEY); boolean stickied = data.getBoolean(JSONUtils.STICKIED_KEY);
boolean archived = data.getBoolean(JSONUtils.ARCHIVED_KEY); boolean archived = data.getBoolean(JSONUtils.ARCHIVED_KEY);
boolean locked = data.getBoolean(JSONUtils.LOCKEC_KEY); boolean locked = data.getBoolean(JSONUtils.LOCKEC_KEY);
boolean saved = data.getBoolean(JSONUtils.SAVED_KEY);
String flair = null; String flair = null;
if(!data.isNull(JSONUtils.LINK_FLAIR_TEXT_KEY)) { if(!data.isNull(JSONUtils.LINK_FLAIR_TEXT_KEY)) {
flair = data.getString(JSONUtils.LINK_FLAIR_TEXT_KEY); flair = data.getString(JSONUtils.LINK_FLAIR_TEXT_KEY);
@ -201,11 +202,13 @@ class ParsePost {
data = data.getJSONArray(JSONUtils.CROSSPOST_PARENT_LIST).getJSONObject(0); data = data.getJSONArray(JSONUtils.CROSSPOST_PARENT_LIST).getJSONObject(0);
return parseData(data, permalink, id, fullName, subredditName, subredditNamePrefixed, return parseData(data, permalink, id, fullName, subredditName, subredditNamePrefixed,
author, formattedPostTime, title, previewUrl, previewWidth, previewHeight, author, formattedPostTime, title, previewUrl, previewWidth, previewHeight,
score, voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, true, i); score, voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, saved,
true, i);
} else { } else {
return parseData(data, permalink, id, fullName, subredditName, subredditNamePrefixed, return parseData(data, permalink, id, fullName, subredditName, subredditNamePrefixed,
author, formattedPostTime, title, previewUrl, previewWidth, previewHeight, author, formattedPostTime, title, previewUrl, previewWidth, previewHeight,
score, voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, false, i); score, voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, saved,
false, i);
} }
} }
@ -214,7 +217,7 @@ class ParsePost {
String formattedPostTime, String title, String previewUrl, int previewWidth, String formattedPostTime, String title, String previewUrl, int previewWidth,
int previewHeight, int score, int voteType, int gilded, String flair, int previewHeight, int score, int voteType, int gilded, String flair,
boolean spoiler, boolean nsfw, boolean stickied, boolean archived, boolean spoiler, boolean nsfw, boolean stickied, boolean archived,
boolean locked, boolean isCrosspost, int i) throws JSONException { boolean locked, boolean saved, boolean isCrosspost, int i) throws JSONException {
Post post; Post post;
boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY); boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY);
@ -227,7 +230,7 @@ class ParsePost {
int postType = Post.TEXT_TYPE; int postType = Post.TEXT_TYPE;
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime,
title, permalink, score, postType, voteType, gilded, flair, spoiler, nsfw, title, permalink, score, postType, voteType, gilded, flair, spoiler, nsfw,
stickied, archived, locked, isCrosspost); stickied, archived, locked, saved, isCrosspost);
if(data.isNull(JSONUtils.SELFTEXT_KEY)) { if(data.isNull(JSONUtils.SELFTEXT_KEY)) {
post.setSelfText(""); post.setSelfText("");
} else { } else {
@ -239,7 +242,7 @@ class ParsePost {
int postType = Post.NO_PREVIEW_LINK_TYPE; int postType = Post.NO_PREVIEW_LINK_TYPE;
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime,
title, previewUrl, url, permalink, score, postType, title, previewUrl, url, permalink, score, postType,
voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, isCrosspost); voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost);
if(data.isNull(JSONUtils.SELFTEXT_KEY)) { if(data.isNull(JSONUtils.SELFTEXT_KEY)) {
post.setSelfText(""); post.setSelfText("");
} else { } else {
@ -261,7 +264,7 @@ class ParsePost {
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime,
title, previewUrl, permalink, score, postType, voteType, title, previewUrl, permalink, score, postType, voteType,
gilded, flair, spoiler, nsfw, stickied, archived, locked, isCrosspost, true); gilded, flair, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost, true);
post.setPreviewWidth(previewWidth); post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight); post.setPreviewHeight(previewHeight);
@ -278,7 +281,7 @@ class ParsePost {
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, title, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, title,
previewUrl, permalink, score, postType, voteType, previewUrl, permalink, score, postType, voteType,
gilded, flair, spoiler, nsfw, stickied, archived, locked, isCrosspost, false); gilded, flair, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost, false);
post.setPreviewWidth(previewWidth); post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight); post.setPreviewHeight(previewHeight);
post.setVideoUrl(videoUrl); post.setVideoUrl(videoUrl);
@ -293,7 +296,7 @@ class ParsePost {
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, title, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, title,
previewUrl, permalink, score, postType, voteType, previewUrl, permalink, score, postType, voteType,
gilded, flair, spoiler, nsfw, stickied, archived, locked, isCrosspost, true); gilded, flair, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost, true);
post.setPreviewWidth(previewWidth); post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight); post.setPreviewHeight(previewHeight);
post.setVideoUrl(videoUrl); post.setVideoUrl(videoUrl);
@ -306,7 +309,7 @@ class ParsePost {
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime,
title, url, url, permalink, score, postType, title, url, url, permalink, score, postType,
voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, isCrosspost); voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost);
post.setPreviewWidth(previewWidth); post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight); post.setPreviewHeight(previewHeight);
@ -318,7 +321,7 @@ class ParsePost {
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime,
title, permalink, score, postType, voteType, gilded, flair, spoiler, title, permalink, score, postType, voteType, gilded, flair, spoiler,
nsfw, stickied, archived, locked, isCrosspost); nsfw, stickied, archived, locked, saved, isCrosspost);
post.setPreviewWidth(previewWidth); post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight); post.setPreviewHeight(previewHeight);
@ -335,7 +338,7 @@ class ParsePost {
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime,
title, previewUrl, url, permalink, score, postType, voteType, gilded, title, previewUrl, url, permalink, score, postType, voteType, gilded,
flair, spoiler, nsfw, stickied, archived, locked, isCrosspost); flair, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost);
if(data.isNull(JSONUtils.SELFTEXT_KEY)) { if(data.isNull(JSONUtils.SELFTEXT_KEY)) {
post.setSelfText(""); post.setSelfText("");
} else { } else {
@ -355,7 +358,7 @@ class ParsePost {
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime,
title, previewUrl, url, permalink, score, postType, title, previewUrl, url, permalink, score, postType,
voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, isCrosspost); voteType, gilded, flair, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost);
post.setPreviewWidth(previewWidth); post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight); post.setPreviewHeight(previewHeight);
} else { } else {
@ -365,7 +368,7 @@ class ParsePost {
post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, title, post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, formattedPostTime, title,
url, url, permalink, score, postType, voteType, url, url, permalink, score, postType, voteType,
gilded, flair, spoiler, nsfw, stickied, archived, locked, isCrosspost); gilded, flair, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost);
} }
} }
} }

View File

@ -43,6 +43,7 @@ class Post implements Parcelable {
private boolean stickied; private boolean stickied;
private boolean archived; private boolean archived;
private boolean locked; private boolean locked;
private boolean saved;
private boolean isCrosspost; private boolean isCrosspost;
private boolean isDashVideo; private boolean isDashVideo;
private boolean isDownloadableGifOrVideo; private boolean isDownloadableGifOrVideo;
@ -50,7 +51,7 @@ class Post implements Parcelable {
Post(String id, String fullName, String subredditName, String subredditNamePrefixed, String author, Post(String id, String fullName, String subredditName, String subredditNamePrefixed, String author,
String postTime, String title, String previewUrl, String permalink, int score, int postType, String postTime, String title, String previewUrl, String permalink, int score, int postType,
int voteType, int gilded, String flair, boolean spoiler, boolean nsfw, boolean stickied, int voteType, int gilded, String flair, boolean spoiler, boolean nsfw, boolean stickied,
boolean archived, boolean locked, boolean isCrosspost, boolean isDashVideo) { boolean archived, boolean locked, boolean saved, boolean isCrosspost, boolean isDashVideo) {
this.id = id; this.id = id;
this.fullName = fullName; this.fullName = fullName;
this.subredditName = subredditName; this.subredditName = subredditName;
@ -71,6 +72,7 @@ class Post implements Parcelable {
this.stickied = stickied; this.stickied = stickied;
this.archived = archived; this.archived = archived;
this.locked = locked; this.locked = locked;
this.saved = saved;
this.isCrosspost = isCrosspost; this.isCrosspost = isCrosspost;
this.isDashVideo = isDashVideo; this.isDashVideo = isDashVideo;
} }
@ -78,7 +80,7 @@ class Post implements Parcelable {
Post(String id, String fullName, String subredditName, String subredditNamePrefixed, String author, Post(String id, String fullName, String subredditName, String subredditNamePrefixed, String author,
String postTime, String title, String previewUrl, String url, String permalink, int score, String postTime, String title, String previewUrl, String url, String permalink, int score,
int postType, int voteType, int gilded, String flair, boolean spoiler, boolean nsfw, boolean stickied, int postType, int voteType, int gilded, String flair, boolean spoiler, boolean nsfw, boolean stickied,
boolean archived, boolean locked, boolean isCrosspost) { boolean archived, boolean locked, boolean saved, boolean isCrosspost) {
this.id = id; this.id = id;
this.fullName = fullName; this.fullName = fullName;
this.subredditName = subredditName; this.subredditName = subredditName;
@ -100,13 +102,14 @@ class Post implements Parcelable {
this.stickied = stickied; this.stickied = stickied;
this.archived = archived; this.archived = archived;
this.locked = locked; this.locked = locked;
this.saved = saved;
this.isCrosspost = isCrosspost; this.isCrosspost = isCrosspost;
} }
Post(String id, String fullName, String subredditName, String subredditNamePrefixed, String author, Post(String id, String fullName, String subredditName, String subredditNamePrefixed, String author,
String postTime, String title, String permalink, int score, int postType, int voteType, int gilded, String postTime, String title, String permalink, int score, int postType, int voteType, int gilded,
String flair, boolean spoiler, boolean nsfw, boolean stickied, boolean archived, boolean locked, String flair, boolean spoiler, boolean nsfw, boolean stickied, boolean archived, boolean locked,
boolean isCrosspost) { boolean saved, boolean isCrosspost) {
this.id = id; this.id = id;
this.fullName = fullName; this.fullName = fullName;
this.subredditName = subredditName; this.subredditName = subredditName;
@ -126,6 +129,7 @@ class Post implements Parcelable {
this.stickied = stickied; this.stickied = stickied;
this.archived = archived; this.archived = archived;
this.locked = locked; this.locked = locked;
this.saved = saved;
this.isCrosspost= isCrosspost; this.isCrosspost= isCrosspost;
} }
@ -158,6 +162,7 @@ class Post implements Parcelable {
stickied = in.readByte() != 0; stickied = in.readByte() != 0;
archived = in.readByte() != 0; archived = in.readByte() != 0;
locked = in.readByte() != 0; locked = in.readByte() != 0;
saved = in.readByte() != 0;
isCrosspost = in.readByte() != 0; isCrosspost = in.readByte() != 0;
isDashVideo = in.readByte() != 0; isDashVideo = in.readByte() != 0;
isDownloadableGifOrVideo = in.readByte() != 0; isDownloadableGifOrVideo = in.readByte() != 0;
@ -356,6 +361,14 @@ class Post implements Parcelable {
return locked; return locked;
} }
boolean isSaved() {
return saved;
}
void setSaved(boolean saved) {
this.saved = saved;
}
boolean isCrosspost() { boolean isCrosspost() {
return isCrosspost; return isCrosspost;
} }
@ -390,6 +403,7 @@ class Post implements Parcelable {
parcel.writeByte((byte) (stickied ? 1 : 0)); parcel.writeByte((byte) (stickied ? 1 : 0));
parcel.writeByte((byte) (archived ? 1 : 0)); parcel.writeByte((byte) (archived ? 1 : 0));
parcel.writeByte((byte) (locked ? 1 : 0)); parcel.writeByte((byte) (locked ? 1 : 0));
parcel.writeByte((byte) (saved ? 1 : 0));
parcel.writeByte((byte) (isCrosspost ? 1 : 0)); parcel.writeByte((byte) (isCrosspost ? 1 : 0));
parcel.writeByte((byte) (isDashVideo ? 1 : 0)); parcel.writeByte((byte) (isDashVideo ? 1 : 0));
parcel.writeByte((byte) (isDownloadableGifOrVideo ? 1 : 0)); parcel.writeByte((byte) (isDownloadableGifOrVideo ? 1 : 0));

View File

@ -445,6 +445,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator {
post.setNSFW(event.post.isNSFW()); post.setNSFW(event.post.isNSFW());
post.setSpoiler(event.post.isSpoiler()); post.setSpoiler(event.post.isSpoiler());
post.setFlair(event.post.getFlair()); post.setFlair(event.post.getFlair());
post.setSaved(event.post.isSaved());
mAdapter.notifyItemChanged(event.positionInList); mAdapter.notifyItemChanged(event.positionInList);
} }
} }

View File

@ -168,4 +168,12 @@ public interface RedditAPI {
@FormUrlEncoded @FormUrlEncoded
@POST("/api/read_message") @POST("/api/read_message")
Call<String> readMessage(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> ids); Call<String> readMessage(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> ids);
@FormUrlEncoded
@POST("/api/save")
Call<String> save(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params);
@FormUrlEncoded
@POST("/api/unsave")
Call<String> unsave(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params);
} }

View File

@ -0,0 +1,60 @@
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 SaveThing {
interface SaveThingListener {
void success();
void failed();
}
static void saveThing(Retrofit oauthRetrofit, String accessToken, String fullname,
SaveThingListener saveThingListener) {
Map<String, String> params = new HashMap<>();
params.put(RedditUtils.ID_KEY, fullname);
oauthRetrofit.create(RedditAPI.class).save(RedditUtils.getOAuthHeader(accessToken), params).enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
if(response.isSuccessful()) {
saveThingListener.success();
} else {
saveThingListener.failed();
}
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
saveThingListener.failed();
}
});
}
static void unsaveThing(Retrofit oauthRetrofit, String accessToken, String fullname,
SaveThingListener saveThingListener) {
Map<String, String> params = new HashMap<>();
params.put(RedditUtils.ID_KEY, fullname);
oauthRetrofit.create(RedditAPI.class).unsave(RedditUtils.getOAuthHeader(accessToken), params).enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
if(response.isSuccessful()) {
saveThingListener.success();
} else {
saveThingListener.failed();
}
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
saveThingListener.failed();
}
});
}
}

View File

@ -6,6 +6,7 @@ import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -296,36 +297,53 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo
} }
if(mPost == null) { if(mPost == null) {
mPost = getIntent().getExtras().getParcelable(EXTRA_POST_DATA); mPost = getIntent().getParcelableExtra(EXTRA_POST_DATA);
} }
Log.i("asdfasdfadfadf", "" + mPost.isSaved());
if(mPost == null) { if(mPost == null) {
fetchPostAndCommentsById(getIntent().getExtras().getString(EXTRA_POST_ID)); fetchPostAndCommentsById(getIntent().getStringExtra(EXTRA_POST_ID));
} else { } else {
if(mMenu != null && mPost.getAuthor().equals(mAccountName)) { if(mMenu != null) {
if(mPost.getPostType() == Post.TEXT_TYPE) { MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
mMenu.findItem(R.id.action_edit_view_post_detail_activity).setVisible(true); if(mAccessToken != null) {
} if(mPost.isSaved()) {
mMenu.findItem(R.id.action_delete_view_post_detail_activity).setVisible(true); saveItem.setVisible(true);
saveItem.setIcon(R.drawable.ic_baseline_bookmark_24px);
MenuItem nsfwItem = mMenu.findItem(R.id.action_nsfw_view_post_detail_activity); } else {
nsfwItem.setVisible(true); saveItem.setVisible(true);
if(mPost.isNSFW()) { saveItem.setIcon(R.drawable.ic_baseline_bookmark_border_24px);
nsfwItem.setTitle(R.string.action_unmark_nsfw); }
} else { } else {
nsfwItem.setTitle(R.string.action_mark_nsfw); saveItem.setVisible(false);
} }
MenuItem spoilerItem = mMenu.findItem(R.id.action_spoiler_view_post_detail_activity); if(mPost.getAuthor().equals(mAccountName)) {
spoilerItem.setVisible(true); if(mPost.getPostType() == Post.TEXT_TYPE) {
if(mPost.isSpoiler()) { mMenu.findItem(R.id.action_edit_view_post_detail_activity).setVisible(true);
spoilerItem.setTitle(R.string.action_unmark_spoiler); }
} else { mMenu.findItem(R.id.action_delete_view_post_detail_activity).setVisible(true);
spoilerItem.setTitle(R.string.action_mark_spoiler);
}
mMenu.findItem(R.id.action_edit_flair_view_post_detail_activity).setVisible(true); MenuItem nsfwItem = mMenu.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 = mMenu.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);
}
mMenu.findItem(R.id.action_edit_flair_view_post_detail_activity).setVisible(true);
}
} }
mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit, mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit,
mOauthRetrofit, mRedditDataRoomDatabase, mGlide, mAccessToken, mAccountName, mPost, mOauthRetrofit, mRedditDataRoomDatabase, mGlide, mAccessToken, mAccountName, mPost,
mLocale, mSingleCommentId, isSingleCommentThreadMode, mLocale, mSingleCommentId, isSingleCommentThreadMode,
@ -395,6 +413,21 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo
public void onParsePostSuccess(Post post) { public void onParsePostSuccess(Post post) {
mPost = post; mPost = post;
if(mMenu != null) {
MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
if(mAccessToken != null) {
if(post.isSaved()) {
saveItem.setVisible(true);
saveItem.setIcon(R.drawable.ic_baseline_bookmark_24px);
} else {
saveItem.setVisible(true);
saveItem.setIcon(R.drawable.ic_baseline_bookmark_border_24px);
}
} else {
saveItem.setVisible(false);
}
}
if(mMenu != null && mPost.getAuthor().equals(mAccountName)) { if(mMenu != null && mPost.getAuthor().equals(mAccountName)) {
if(mPost.getPostType() == Post.TEXT_TYPE) { if(mPost.getPostType() == Post.TEXT_TYPE) {
mMenu.findItem(R.id.action_edit_view_post_detail_activity).setVisible(true); mMenu.findItem(R.id.action_edit_view_post_detail_activity).setVisible(true);
@ -582,6 +615,20 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo
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) {
MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
if(mAccessToken != null) {
if(post.isSaved()) {
saveItem.setVisible(true);
saveItem.setIcon(R.drawable.ic_baseline_bookmark_24px);
} else {
saveItem.setVisible(true);
saveItem.setIcon(R.drawable.ic_baseline_bookmark_border_24px);
}
} else {
saveItem.setVisible(false);
}
}
} }
@Override @Override
@ -744,29 +791,44 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.view_post_detail_activity, menu); getMenuInflater().inflate(R.menu.view_post_detail_activity, menu);
mMenu = menu; mMenu = menu;
if(mPost != null && mPost.getAuthor().equals(mAccountName)) { if(mPost != null) {
if(mPost.getPostType() == Post.TEXT_TYPE) { MenuItem saveItem = mMenu.findItem(R.id.action_save_view_post_detail_activity);
menu.findItem(R.id.action_edit_view_post_detail_activity).setVisible(true); if(mAccessToken != null) {
} if(mPost.isSaved()) {
menu.findItem(R.id.action_delete_view_post_detail_activity).setVisible(true); saveItem.setVisible(true);
saveItem.setIcon(R.drawable.ic_baseline_bookmark_24px);
MenuItem nsfwItem = menu.findItem(R.id.action_nsfw_view_post_detail_activity); } else {
nsfwItem.setVisible(true); saveItem.setVisible(true);
if(mPost.isNSFW()) { saveItem.setIcon(R.drawable.ic_baseline_bookmark_border_24px);
nsfwItem.setTitle(R.string.action_unmark_nsfw); }
} else { } else {
nsfwItem.setTitle(R.string.action_mark_nsfw); saveItem.setVisible(false);
} }
MenuItem spoilerItem = menu.findItem(R.id.action_spoiler_view_post_detail_activity); if(mPost.getAuthor().equals(mAccountName)) {
spoilerItem.setVisible(true); if(mPost.getPostType() == Post.TEXT_TYPE) {
if(mPost.isSpoiler()) { menu.findItem(R.id.action_edit_view_post_detail_activity).setVisible(true);
spoilerItem.setTitle(R.string.action_unmark_spoiler); }
} else { menu.findItem(R.id.action_delete_view_post_detail_activity).setVisible(true);
spoilerItem.setTitle(R.string.action_mark_spoiler);
}
menu.findItem(R.id.action_edit_flair_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);
}
} }
return true; return true;
} }
@ -800,6 +862,51 @@ public class ViewPostDetailActivity extends AppCompatActivity implements FlairBo
intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, false); intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, false);
startActivityForResult(intent, WRITE_COMMENT_REQUEST_CODE); startActivityForResult(intent, WRITE_COMMENT_REQUEST_CODE);
return true; return true;
case R.id.action_save_view_post_detail_activity:
if(mPost != null && mAccessToken != null) {
if(mPost.isSaved()) {
item.setIcon(R.drawable.ic_baseline_bookmark_border_24px);
SaveThing.unsaveThing(mOauthRetrofit, mAccessToken, mPost.getFullName(),
new SaveThing.SaveThingListener() {
@Override
public void success() {
mPost.setSaved(false);
item.setIcon(R.drawable.ic_baseline_bookmark_border_24px);
showMessage(R.string.post_unsaved_success);
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
}
@Override
public void failed() {
mPost.setSaved(true);
item.setIcon(R.drawable.ic_baseline_bookmark_24px);
showMessage(R.string.post_unsaved_failed);
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
}
});
} else {
item.setIcon(R.drawable.ic_baseline_bookmark_24px);
SaveThing.saveThing(mOauthRetrofit, mAccessToken, mPost.getFullName(),
new SaveThing.SaveThingListener() {
@Override
public void success() {
mPost.setSaved(true);
item.setIcon(R.drawable.ic_baseline_bookmark_24px);
showMessage(R.string.post_saved_success);
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
}
@Override
public void failed() {
mPost.setSaved(false);
item.setIcon(R.drawable.ic_baseline_bookmark_border_24px);
showMessage(R.string.post_saved_failed);
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
}
});
}
}
break;
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 editPostItent = new Intent(this, EditPostActivity.class);
editPostItent.putExtra(EditPostActivity.EXTRA_ACCESS_TOKEN, mAccessToken); editPostItent.putExtra(EditPostActivity.EXTRA_ACCESS_TOKEN, mAccessToken);

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M17,3L7,3c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3L19,5c0,-1.1 -0.9,-2 -2,-2zM17,18l-5,-2.18L7,18L7,5h10v13z"/>
</vector>

View File

@ -9,40 +9,47 @@
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_refresh_view_post_detail_activity" android:id="@+id/action_save_view_post_detail_activity"
android:orderInCategory="2" android:orderInCategory="2"
android:title="@string/action_add_comment"
app:showAsAction="ifRoom"
android:visible="false" />
<item
android:id="@+id/action_refresh_view_post_detail_activity"
android:orderInCategory="3"
android:title="@string/action_refresh" android:title="@string/action_refresh"
app:showAsAction="never" /> app:showAsAction="never" />
<item <item
android:id="@+id/action_edit_view_post_detail_activity" android:id="@+id/action_edit_view_post_detail_activity"
android:orderInCategory="3" android:orderInCategory="4"
android:title="@string/action_edit_post" android:title="@string/action_edit_post"
app:showAsAction="never" app:showAsAction="never"
android:visible="false" /> android:visible="false" />
<item <item
android:id="@+id/action_delete_view_post_detail_activity" android:id="@+id/action_delete_view_post_detail_activity"
android:orderInCategory="4" android:orderInCategory="5"
android:title="@string/action_delete_post" android:title="@string/action_delete_post"
app:showAsAction="never" app:showAsAction="never"
android:visible="false" /> android:visible="false" />
<item <item
android:id="@+id/action_nsfw_view_post_detail_activity" android:id="@+id/action_nsfw_view_post_detail_activity"
android:orderInCategory="5"
app:showAsAction="never"
android:visible="false" />
<item
android:id="@+id/action_spoiler_view_post_detail_activity"
android:orderInCategory="6" android:orderInCategory="6"
app:showAsAction="never" app:showAsAction="never"
android:visible="false" /> android:visible="false" />
<item <item
android:id="@+id/action_edit_flair_view_post_detail_activity" android:id="@+id/action_spoiler_view_post_detail_activity"
android:orderInCategory="7" android:orderInCategory="7"
app:showAsAction="never"
android:visible="false" />
<item
android:id="@+id/action_edit_flair_view_post_detail_activity"
android:orderInCategory="8"
android:title="@string/action_edit_flair" android:title="@string/action_edit_flair"
app:showAsAction="never" app:showAsAction="never"
android:visible="false" /> android:visible="false" />

View File

@ -206,6 +206,10 @@
<string name="press_here_to_login">Press here to login</string> <string name="press_here_to_login">Press here to login</string>
<string name="login_first">Login first</string> <string name="login_first">Login first</string>
<string name="post_saved_success">Post saved</string>
<string name="post_saved_failed">Unable to save post</string>
<string name="post_unsaved_success">Post unsaved</string>
<string name="post_unsaved_failed">Unable to unsave post</string>
<string name="delete_this_post">Delete This Post</string> <string name="delete_this_post">Delete This Post</string>
<string name="delete_this_comment">Delete This Comment</string> <string name="delete_this_comment">Delete This Comment</string>
<string name="are_you_sure">Are you sure?</string> <string name="are_you_sure">Are you sure?</string>