From 11ac14a3f13c893ff9cd98d01abe586a3c794bd9 Mon Sep 17 00:00:00 2001 From: Alex Ning Date: Fri, 5 Oct 2018 14:28:14 +0800 Subject: Display a crosspost icon if the post is a crosspost. Hide the thumbtack icon if the post is not viewed in its subreddit. Tweak the post layout. Minor bugs fixed. --- .../infinityforreddit/MainActivity.java | 43 +++++++++++----------- .../infinityforreddit/ParsePost.java | 24 ++++++------ .../infinityforreddit/PostData.java | 17 +++++++-- .../infinityforreddit/PostFragment.java | 6 +-- .../infinityforreddit/PostRecyclerViewAdapter.java | 38 +++++++++++-------- .../infinityforreddit/ViewPostDetailActivity.java | 9 ++++- 6 files changed, 80 insertions(+), 57 deletions(-) (limited to 'app/src/main/java/ml/docilealligator/infinityforreddit') diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java index 606126fe..e6f705a8 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java @@ -33,14 +33,13 @@ import de.hdodenhof.circleimageview.CircleImageView; public class MainActivity extends AppCompatActivity { - private static final String FRAGMENT_OUT_STATE_KEY = "FOSK"; - - private String nameState = "NS"; - private String profileImageUrlState = "PIUS"; - private String bannerImageUrlState = "BIUS"; - private String karmaState = "KS"; - private String fetchUserInfoState = "FUIS"; - private String insertSubscribedSubredditState = "ISSS"; + private static final String FRAGMENT_OUT_STATE = "FOS"; + private static final String NAME_STATE = "NS"; + private static final String PROFILE_IMAGE_URL_STATE = "PIUS"; + private static final String BANNER_IMAGE_URL_STATE = "BIUS"; + private static final String KARMA_STATE = "KS"; + private static final String FETCH_USER_INFO_STATE = "FUIS"; + private static final String INSERT_SUBSCRIBED_SUBREDDIT_STATE = "ISSS"; private TextView mNameTextView; private TextView mKarmaTextView; @@ -87,7 +86,7 @@ public class MainActivity extends AppCompatActivity { mFragment.setArguments(bundle); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit(); } else { - mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY); + mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_content_main, mFragment).commit(); } @@ -290,25 +289,25 @@ public class MainActivity extends AppCompatActivity { protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if(mFragment != null) { - getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE_KEY, mFragment); + getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE, mFragment); } - outState.putString(nameState, mName); - outState.putString(profileImageUrlState, mProfileImageUrl); - outState.putString(bannerImageUrlState, mBannerImageUrl); - outState.putString(karmaState, mKarma); - outState.putBoolean(fetchUserInfoState, mFetchUserInfoSuccess); - outState.putBoolean(insertSubscribedSubredditState, mInsertSuccess); + outState.putString(NAME_STATE, mName); + outState.putString(PROFILE_IMAGE_URL_STATE, mProfileImageUrl); + outState.putString(BANNER_IMAGE_URL_STATE, mBannerImageUrl); + outState.putString(KARMA_STATE, mKarma); + outState.putBoolean(FETCH_USER_INFO_STATE, mFetchUserInfoSuccess); + outState.putBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE, mInsertSuccess); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); - mName = savedInstanceState.getString(nameState); - mProfileImageUrl = savedInstanceState.getString(profileImageUrlState); - mBannerImageUrl = savedInstanceState.getString(bannerImageUrlState); - mKarma = savedInstanceState.getString(karmaState); - mFetchUserInfoSuccess = savedInstanceState.getBoolean(fetchUserInfoState); - mInsertSuccess = savedInstanceState.getBoolean(insertSubscribedSubredditState); + mName = savedInstanceState.getString(NAME_STATE); + mProfileImageUrl = savedInstanceState.getString(PROFILE_IMAGE_URL_STATE); + mBannerImageUrl = savedInstanceState.getString(BANNER_IMAGE_URL_STATE); + mKarma = savedInstanceState.getString(KARMA_STATE); + mFetchUserInfoSuccess = savedInstanceState.getBoolean(FETCH_USER_INFO_STATE); + mInsertSuccess = savedInstanceState.getBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE); mNameTextView.setText(mName); mKarmaTextView.setText(mKarma); if(!mProfileImageUrl.equals("")) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java index 381f8044..4330afe3 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java @@ -91,10 +91,10 @@ class ParsePost { //Cross post data = data.getJSONArray(JSONUtils.CROSSPOST_PARENT_LIST).getJSONObject(0); parseData(data, permalink, newPostData, id, fullName, subredditNamePrefixed, - formattedPostTime, title, previewUrl, score, voteType, gilded, nsfw, stickied, i); + formattedPostTime, title, previewUrl, score, voteType, gilded, nsfw, stickied, true, i); } else { parseData(data, permalink, newPostData, id, fullName, subredditNamePrefixed, - formattedPostTime, title, previewUrl, score, voteType, gilded, nsfw, stickied, i); + formattedPostTime, title, previewUrl, score, voteType, gilded, nsfw, stickied, false, i); } } } catch (JSONException e) { @@ -118,7 +118,7 @@ class ParsePost { private static void parseData(JSONObject data, String permalink, ArrayList bestPostData, String id, String fullName, String subredditNamePrefixed, String formattedPostTime, String title, String previewUrl, int score, int voteType, int gilded, - boolean nsfw, boolean stickied, int i) throws JSONException { + boolean nsfw, boolean stickied, boolean isCrosspost, int i) throws JSONException { boolean isVideo = data.getBoolean(JSONUtils.IS_VIDEO_KEY); String url = data.getString(JSONUtils.URL_KEY); @@ -128,7 +128,7 @@ class ParsePost { Log.i("text", Integer.toString(i)); int postType = PostData.TEXT_TYPE; PostData postData = new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, - title, permalink, score, postType, voteType, gilded, nsfw, stickied); + title, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) { postData.setSelfText(""); } else { @@ -140,7 +140,7 @@ class ParsePost { Log.i("no preview link", Integer.toString(i)); int postType = PostData.NO_PREVIEW_LINK_TYPE; PostData linkPostData = new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, - title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied); + title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) { linkPostData.setSelfText(""); } else { @@ -156,7 +156,7 @@ class ParsePost { String videoUrl = redditVideoObject.getString(JSONUtils.DASH_URL_KEY); PostData videoPostData = new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, - title, previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, true); + title, previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost, true); videoPostData.setVideoUrl(videoUrl); videoPostData.setDownloadableGifOrVideo(false); @@ -171,7 +171,7 @@ class ParsePost { String videoUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.MP4_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY); String gifDownloadUrl = variations.getJSONObject(JSONUtils.VARIANTS_KEY).getJSONObject(JSONUtils.GIF_KEY).getJSONObject(JSONUtils.SOURCE_KEY).getString(JSONUtils.URL_KEY); PostData post = new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, title, - previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, false); + previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost, false); post.setVideoUrl(videoUrl); post.setDownloadableGifOrVideo(true); @@ -186,7 +186,7 @@ class ParsePost { .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.DASH_URL_KEY); PostData post = new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, title, - previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, true); + previewUrl, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost, true); post.setVideoUrl(videoUrl); post.setDownloadableGifOrVideo(false); @@ -198,13 +198,13 @@ class ParsePost { Log.i("image", Integer.toString(i)); int postType = PostData.IMAGE_TYPE; bestPostData.add(new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, - title, url, url, permalink, score, postType, voteType, gilded, nsfw, stickied)); + title, url, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost)); } else { //Link post Log.i("link", Integer.toString(i)); int postType = PostData.LINK_TYPE; PostData linkPostData = new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, - title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied); + title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); if(data.isNull(JSONUtils.SELFTEXT_HTML_KEY)) { linkPostData.setSelfText(""); } else { @@ -219,13 +219,13 @@ class ParsePost { Log.i("CP no preview image", Integer.toString(i)); int postType = PostData.IMAGE_TYPE; bestPostData.add(new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, title, - url, url, permalink, score, postType, voteType, gilded, nsfw, stickied)); + url, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost)); } else { //Link post Log.i("CP no preview link", Integer.toString(i)); int postType = PostData.LINK_TYPE; PostData linkPostData = new PostData(id, fullName, subredditNamePrefixed, formattedPostTime, - title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied); + title, previewUrl, url, permalink, score, postType, voteType, gilded, nsfw, stickied, isCrosspost); bestPostData.add(linkPostData); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostData.java index 93b8d832..289ca083 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostData.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostData.java @@ -33,12 +33,14 @@ class PostData implements Parcelable { private int gilded; private boolean nsfw; private boolean stickied; + private boolean isCrosspost; private boolean isDashVideo; private boolean isDownloadableGifOrVideo; + private PostData crosspostParentPostData; PostData(String id, String fullName, String subredditNamePrefixed, String postTime, String title, String previewUrl, String permalink, int score, int postType, int voteType, int gilded, - boolean nsfw, boolean stickied, boolean isDashVideo) { + boolean nsfw, boolean stickied, boolean isCrosspost, boolean isDashVideo) { this.id = id; this.fullName = fullName; this.subredditNamePrefixed = subredditNamePrefixed; @@ -52,12 +54,13 @@ class PostData implements Parcelable { this.gilded = gilded; this.nsfw = nsfw; this.stickied = stickied; + this.isCrosspost = isCrosspost; this.isDashVideo = isDashVideo; } PostData(String id, String fullName, String subredditNamePrefixed, String postTime, String title, String previewUrl, String url, String permalink, int score, int postType, int voteType, - int gilded, boolean nsfw, boolean stickied) { + int gilded, boolean nsfw, boolean stickied, boolean isCrosspost) { this.id = id; this.fullName = fullName; this.subredditNamePrefixed = subredditNamePrefixed; @@ -72,11 +75,12 @@ class PostData implements Parcelable { this.gilded = gilded; this.nsfw = nsfw; this.stickied = stickied; + this.isCrosspost = isCrosspost; } PostData(String id, String fullName, String subredditNamePrefixed, String postTime, String title, String permalink, int score, int postType, int voteType, int gilded, boolean nsfw, - boolean stickied) { + boolean stickied, boolean isCrosspost) { this.id = id; this.fullName = fullName; this.subredditNamePrefixed = subredditNamePrefixed; @@ -89,6 +93,7 @@ class PostData implements Parcelable { this.gilded = gilded; this.nsfw = nsfw; this.stickied = stickied; + this.isCrosspost= isCrosspost; } protected PostData(Parcel in) { @@ -110,6 +115,7 @@ class PostData implements Parcelable { gilded = in.readInt(); nsfw = in.readByte() != 0; stickied = in.readByte() != 0; + isCrosspost = in.readByte() != 0; isDashVideo = in.readByte() != 0; isDownloadableGifOrVideo = in.readByte() != 0; } @@ -243,6 +249,10 @@ class PostData implements Parcelable { return stickied; } + public boolean isCrosspost() { + return isCrosspost; + } + @Override public void writeToParcel(Parcel parcel, int i) { parcel.writeString(id); @@ -263,6 +273,7 @@ class PostData implements Parcelable { parcel.writeInt(gilded); parcel.writeByte((byte) (nsfw ? 1 : 0)); parcel.writeByte((byte) (stickied ? 1 : 0)); + parcel.writeByte((byte) (isCrosspost ? 1 : 0)); parcel.writeByte((byte) (isDashVideo ? 1 : 0)); parcel.writeByte((byte) (isDownloadableGifOrVideo ? 1 : 0)); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java index afad78ca..0dd4b50f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java @@ -127,7 +127,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { }); mPaginationSynchronizer.setLoadSuccess(savedInstanceState.getBoolean(LOAD_SUCCESS_STATE)); mPaginationSynchronizer.setLoadingState(savedInstanceState.getBoolean(LOADING_STATE_STATE)); - PostRecyclerViewAdapter adapter = new PostRecyclerViewAdapter(getActivity(), mPostData, mPaginationSynchronizer); + PostRecyclerViewAdapter adapter = new PostRecyclerViewAdapter(getActivity(), mPostData, mPaginationSynchronizer, mIsBestPost); mPostRecyclerView.setAdapter(adapter); mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener( getActivity(), mLinearLayoutManager, adapter, mLastItem, mPostData, @@ -187,7 +187,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { if(isAdded() && getActivity() != null) { mPostData = postData; mLastItem = lastItem; - PostRecyclerViewAdapter adapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer); + PostRecyclerViewAdapter adapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mIsBestPost); mPostRecyclerView.setAdapter(adapter); mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener( @@ -259,7 +259,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { if(isAdded() && getActivity() != null) { mPostData = postData; mLastItem = lastItem; - PostRecyclerViewAdapter adapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer); + PostRecyclerViewAdapter adapter = new PostRecyclerViewAdapter(getActivity(), postData, mPaginationSynchronizer, mIsBestPost); mPostRecyclerView.setAdapter(adapter); mPostRecyclerView.addOnScrollListener(new PostPaginationScrollListener( diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index d9b6c146..d3075ee0 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -9,6 +9,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.customtabs.CustomTabsIntent; import android.support.v4.content.ContextCompat; +import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; @@ -46,20 +47,20 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter postData, PaginationSynchronizer paginationSynchronizer) { + PostRecyclerViewAdapter(Context context, ArrayList postData, PaginationSynchronizer paginationSynchronizer, boolean hasMultipleSubreddits) { if(context != null) { mContext = context; mPostData = postData; mPaginationSynchronizer = paginationSynchronizer; - isLoadingMorePostSuccess = true; - canStartActivity = true; + this.hasMultipleSubreddits = hasMultipleSubreddits; glide = Glide.with(mContext); subredditDao = SubredditRoomDatabase.getDatabase(mContext).subredditDao(); } @@ -73,8 +74,8 @@ class PostRecyclerViewAdapter extends RecyclerView.Adapter