New feature: Subscribe or unsubscribe to a subreddit. Allow clear text traffic in Android Pie. Rewrite some code in lambda.

This commit is contained in:
Alex Ning 2019-01-07 19:03:49 +08:00
parent 9d729579bf
commit 38be0ba01f
23 changed files with 699 additions and 634 deletions

Binary file not shown.

View File

@ -17,7 +17,8 @@
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme"> android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name" android:label="@string/app_name"

View File

@ -14,11 +14,8 @@ public interface SubredditDao {
@Query("DELETE FROM subreddits") @Query("DELETE FROM subreddits")
void deleteAllSubreddits(); void deleteAllSubreddits();
@Query("SELECT * from subreddits WHERE id = :id")
LiveData<SubredditData> getSubredditLiveDataById(String id);
@Query("SELECT * from subreddits WHERE name = :namePrefixed") @Query("SELECT * from subreddits WHERE name = :namePrefixed")
LiveData<SubredditData> getSubredditLiveDataByNamePrefixed(String namePrefixed); LiveData<SubredditData> getSubredditLiveDataByName(String namePrefixed);
@Query("SELECT * from subreddits WHERE name = :namePrefixed LIMIT 1") @Query("SELECT * from subreddits WHERE name = :namePrefixed LIMIT 1")
SubredditData getSubredditData(String namePrefixed); SubredditData getSubredditData(String namePrefixed);

View File

@ -2,23 +2,13 @@ package SubredditDatabase;
import android.arch.persistence.room.ColumnInfo; import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity; import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import SubscribedSubredditDatabase.SubscribedSubredditData;
@Entity(tableName = "subreddits") @Entity(tableName = "subreddits")
public class SubredditData { public class SubredditData extends SubscribedSubredditData {
@PrimaryKey @ColumnInfo(name = "banner")
@NonNull
@ColumnInfo(name = "id")
private String id;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "icon_url")
private String iconUrl;
@ColumnInfo(name = "banner_url")
private String bannerUrl; private String bannerUrl;
@ColumnInfo(name = "description") @ColumnInfo(name = "description")
@ -28,27 +18,12 @@ public class SubredditData {
private int nSubscribers; private int nSubscribers;
public SubredditData(@NonNull String id, String name, String iconUrl, String bannerUrl, String description, int nSubscribers) { public SubredditData(@NonNull String id, String name, String iconUrl, String bannerUrl, String description, int nSubscribers) {
this.id = id; super(id, name, iconUrl);
this.name = name;
this.iconUrl = iconUrl;
this.bannerUrl = bannerUrl; this.bannerUrl = bannerUrl;
this.description = description; this.description = description;
this.nSubscribers = nSubscribers; this.nSubscribers = nSubscribers;
} }
@NonNull
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getIconUrl() {
return iconUrl;
}
public String getBannerUrl() { public String getBannerUrl() {
return bannerUrl; return bannerUrl;
} }

View File

@ -8,14 +8,11 @@ public class SubredditRepository {
private SubredditDao mSubredditDao; private SubredditDao mSubredditDao;
private LiveData<SubredditData> mSubredditLiveData; private LiveData<SubredditData> mSubredditLiveData;
SubredditRepository(Application application, String value, boolean isId) { SubredditRepository(Application application, String subredditName) {
SubredditRoomDatabase db = SubredditRoomDatabase.getDatabase(application); SubredditRoomDatabase db = SubredditRoomDatabase.getDatabase(application);
mSubredditDao = db.subredditDao(); mSubredditDao = db.subredditDao();
if(isId) {
mSubredditLiveData = mSubredditDao.getSubredditLiveDataById(value); mSubredditLiveData = mSubredditDao.getSubredditLiveDataByName(subredditName);
} else {
mSubredditLiveData = mSubredditDao.getSubredditLiveDataByNamePrefixed(value);
}
} }
LiveData<SubredditData> getSubredditLiveData() { LiveData<SubredditData> getSubredditLiveData() {

View File

@ -11,9 +11,9 @@ public class SubredditViewModel extends AndroidViewModel {
private SubredditRepository mSubredditRepository; private SubredditRepository mSubredditRepository;
private LiveData<SubredditData> mSubredditLiveData; private LiveData<SubredditData> mSubredditLiveData;
SubredditViewModel(Application application, String id, boolean isId) { SubredditViewModel(Application application, String id) {
super(application); super(application);
mSubredditRepository = new SubredditRepository(application, id, isId); mSubredditRepository = new SubredditRepository(application, id);
mSubredditLiveData = mSubredditRepository.getSubredditLiveData(); mSubredditLiveData = mSubredditRepository.getSubredditLiveData();
} }
@ -30,19 +30,17 @@ public class SubredditViewModel extends AndroidViewModel {
@NonNull @NonNull
private final Application mApplication; private final Application mApplication;
private final String value; private final String subredditName;
private final boolean isId;
public Factory(@NonNull Application application, String value, boolean isId) { public Factory(@NonNull Application application, String subredditName) {
mApplication = application; mApplication = application;
this.value = value; this.subredditName = subredditName;
this.isId = isId;
} }
@Override @Override
public <T extends ViewModel> T create(Class<T> modelClass) { public <T extends ViewModel> T create(Class<T> modelClass) {
//noinspection unchecked //noinspection unchecked
return (T) new SubredditViewModel(mApplication, value, isId); return (T) new SubredditViewModel(mApplication, subredditName);
} }
} }
} }

View File

@ -18,4 +18,10 @@ public interface SubscribedSubredditDao {
@Query("SELECT * from subscribed_subreddits ORDER BY name COLLATE NOCASE ASC") @Query("SELECT * from subscribed_subreddits ORDER BY name COLLATE NOCASE ASC")
LiveData<List<SubscribedSubredditData>> getAllSubscribedSubreddits(); LiveData<List<SubscribedSubredditData>> getAllSubscribedSubreddits();
@Query("SELECT * from subscribed_subreddits WHERE name = :subredditName LIMIT 1")
SubscribedSubredditData getSubscribedSubreddit(String subredditName);
@Query("DELETE FROM subscribed_subreddits WHERE name = :subredditName")
void deleteSubscribedSubreddit(String subredditName);
} }

View File

@ -64,7 +64,6 @@ public class JSONUtils {
static final String SUBSCRIBERS_KEY = "subscribers"; static final String SUBSCRIBERS_KEY = "subscribers";
static final String PUBLIC_DESCRIPTION_KEY = "public_description"; static final String PUBLIC_DESCRIPTION_KEY = "public_description";
static final String ACTIVE_USER_COUNT_KEY = "active_user_count"; static final String ACTIVE_USER_COUNT_KEY = "active_user_count";
static final String DISPLAY_NAME_PREFIXED_KEY = "display_name_prefixed";
static final String LINK_ID_KEY = "link_id"; static final String LINK_ID_KEY = "link_id";
public static final String IS_GOLD_KEY = "is_gold"; public static final String IS_GOLD_KEY = "is_gold";
public static final String IS_FRIEND_KEY = "is_friend"; public static final String IS_FRIEND_KEY = "is_friend";

View File

@ -1,5 +0,0 @@
package ml.docilealligator.infinityforreddit;
interface LastItemSynchronizer {
void lastItemChanged(String lastItem);
}

View File

@ -1,6 +0,0 @@
package ml.docilealligator.infinityforreddit;
interface PaginationNotifier {
void LoadMorePostSuccess();
void LoadMorePostFail();
}

View File

@ -1,5 +0,0 @@
package ml.docilealligator.infinityforreddit;
interface PaginationRetryNotifier {
void retry();
}

View File

@ -1,65 +0,0 @@
package ml.docilealligator.infinityforreddit;
import java.util.ArrayList;
class PaginationSynchronizer {
private boolean loadingState;
private boolean loadSuccess;
private PaginationNotifier paginationNotifier;
private PaginationRetryNotifier paginationRetryNotifier;
private ArrayList<LastItemSynchronizer> lastItemSynchronizers;
PaginationSynchronizer() {
lastItemSynchronizers = new ArrayList<>();
loadingState = false;
loadSuccess = true;
}
void setLoadingState(boolean isLoading) {
this.loadingState = isLoading;
}
public boolean isLoading() {
return loadingState;
}
void loadSuccess(boolean state) {
loadSuccess = state;
if(loadSuccess) {
paginationNotifier.LoadMorePostSuccess();
} else {
paginationNotifier.LoadMorePostFail();
}
}
void setLoadSuccess(boolean loadSuccess) {
this.loadSuccess = loadSuccess;
}
boolean isLoadingMorePostsSuccess() {
return loadSuccess;
}
void setPaginationNotifier(PaginationNotifier paginationNotifier) {
this.paginationNotifier = paginationNotifier;
}
void setPaginationRetryNotifier(PaginationRetryNotifier paginationRetryNotifier) {
this.paginationRetryNotifier = paginationRetryNotifier;
}
PaginationRetryNotifier getPaginationRetryNotifier() {
return paginationRetryNotifier;
}
void addLastItemSynchronizer(LastItemSynchronizer lastItemSynchronizer) {
lastItemSynchronizers.add(lastItemSynchronizer);
}
void notifyLastItemChanged(String lastItem) {
for(LastItemSynchronizer l : lastItemSynchronizers) {
l.lastItemChanged(lastItem);
}
}
}

View File

@ -14,7 +14,7 @@ class ParseSubredditData {
void onParseSubredditDataFail(); void onParseSubredditDataFail();
} }
static void parseComment(String response, ParseSubredditDataListener parseSubredditDataListener) { static void parseSubredditData(String response, ParseSubredditDataListener parseSubredditDataListener) {
new ParseSubredditDataAsyncTask(response, parseSubredditDataListener).execute(); new ParseSubredditDataAsyncTask(response, parseSubredditDataListener).execute();
} }
@ -41,7 +41,7 @@ class ParseSubredditData {
try { try {
JSONObject data = jsonResponse.getJSONObject(JSONUtils.DATA_KEY); JSONObject data = jsonResponse.getJSONObject(JSONUtils.DATA_KEY);
String id = data.getString(JSONUtils.NAME_KEY); String id = data.getString(JSONUtils.NAME_KEY);
String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME_PREFIXED_KEY); String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME);
String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim(); String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim();
String bannerImageUrl = data.getString(JSONUtils.BANNER_BACKGROUND_IMAGE_KEY); String bannerImageUrl = data.getString(JSONUtils.BANNER_BACKGROUND_IMAGE_KEY);
if(bannerImageUrl.equals("") || bannerImageUrl.equals("null")) { if(bannerImageUrl.equals("") || bannerImageUrl.equals("null")) {

View File

@ -96,7 +96,7 @@ class ParseSubscribedThing {
//It's a user //It's a user
newSubscribedUserData.add(new SubscribedUserData(id, name.substring(2), iconUrl)); newSubscribedUserData.add(new SubscribedUserData(id, name.substring(2), iconUrl));
} else { } else {
String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME_PREFIXED_KEY); String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME);
String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim(); String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim();
int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY); int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY);
newSubscribedSubredditData.add(new SubscribedSubredditData(id, name, iconUrl)); newSubscribedSubredditData.add(new SubscribedSubredditData(id, name, iconUrl));

View File

@ -127,7 +127,8 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
Log.i("is null", Integer.toString(holder.getAdapterPosition())); Log.i("is null", Integer.toString(holder.getAdapterPosition()));
} else { } else {
final String id = post.getFullName(); final String id = post.getFullName();
final String subredditName = post.getSubredditNamePrefixed(); final String subredditNamePrefixed = post.getSubredditNamePrefixed();
String subredditName = subredditNamePrefixed.substring(2);
String author = "u/" + post.getAuthor(); String author = "u/" + post.getAuthor();
final String postTime = post.getPostTime(); final String postTime = post.getPostTime();
final String title = post.getTitle(); final String title = post.getTitle();
@ -217,28 +218,19 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
post.getSubredditNamePrefixed().substring(2)); post.getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY,
post.getSubredditNamePrefixed());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false);
mContext.startActivity(intent); mContext.startActivity(intent);
} }
}); });
((DataViewHolder) holder).subredditNameTextView.setText(subredditName); ((DataViewHolder) holder).subredditNameTextView.setText(subredditNamePrefixed);
((DataViewHolder) holder).subredditNameTextView.setOnClickListener(new View.OnClickListener() { ((DataViewHolder) holder).subredditNameTextView.setOnClickListener(view -> {
@Override if(canStartActivity) {
public void onClick(View view) { canStartActivity = false;
if(canStartActivity) { Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
canStartActivity = false; intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); post.getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, mContext.startActivity(intent);
post.getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY,
post.getSubredditNamePrefixed());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false);
mContext.startActivity(intent);
}
} }
}); });
} else { } else {
@ -374,32 +366,26 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
((DataViewHolder) holder).typeChip.setText("IMAGE"); ((DataViewHolder) holder).typeChip.setText("IMAGE");
final String imageUrl = post.getUrl(); final String imageUrl = post.getUrl();
((DataViewHolder) holder).imageView.setOnClickListener(new View.OnClickListener() { ((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@Override Intent intent = new Intent(mContext, ViewImageActivity.class);
public void onClick(View view) { intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, imageUrl);
Intent intent = new Intent(mContext, ViewImageActivity.class); intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, imageUrl); intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditNamePrefixed.substring(2)
intent.putExtra(ViewImageActivity.TITLE_KEY, title); + "-" + id.substring(3));
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName.substring(2) mContext.startActivity(intent);
+ "-" + id.substring(3));
mContext.startActivity(intent);
}
}); });
break; break;
case Post.LINK_TYPE: case Post.LINK_TYPE:
((DataViewHolder) holder).typeChip.setVisibility(View.VISIBLE); ((DataViewHolder) holder).typeChip.setVisibility(View.VISIBLE);
((DataViewHolder) holder).typeChip.setText("LINK"); ((DataViewHolder) holder).typeChip.setText("LINK");
((DataViewHolder) holder).imageView.setOnClickListener(new View.OnClickListener() { ((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@Override CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
public void onClick(View view) { // add share action to menu list
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); builder.addDefaultShareMenuItem();
// add share action to menu list builder.setToolbarColor(mContext.getResources().getColor(R.color.colorPrimary));
builder.addDefaultShareMenuItem(); CustomTabsIntent customTabsIntent = builder.build();
builder.setToolbarColor(mContext.getResources().getColor(R.color.colorPrimary)); customTabsIntent.launchUrl(mContext, Uri.parse(post.getUrl()));
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(mContext, Uri.parse(post.getUrl()));
}
}); });
break; break;
case Post.GIF_VIDEO_TYPE: case Post.GIF_VIDEO_TYPE:
@ -407,21 +393,18 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
((DataViewHolder) holder).typeChip.setText("GIF"); ((DataViewHolder) holder).typeChip.setText("GIF");
final Uri gifVideoUri = Uri.parse(post.getVideoUrl()); final Uri gifVideoUri = Uri.parse(post.getVideoUrl());
((DataViewHolder) holder).imageView.setOnClickListener(new View.OnClickListener() { ((DataViewHolder) holder).imageView.setOnClickListener(view -> {
@Override Intent intent = new Intent(mContext, ViewVideoActivity.class);
public void onClick(View view) { intent.setData(gifVideoUri);
Intent intent = new Intent(mContext, ViewVideoActivity.class); intent.putExtra(ViewVideoActivity.TITLE_KEY, title);
intent.setData(gifVideoUri); intent.putExtra(ViewVideoActivity.IS_DASH_VIDEO_KEY, post.isDashVideo());
intent.putExtra(ViewVideoActivity.TITLE_KEY, title); intent.putExtra(ViewVideoActivity.IS_DOWNLOADABLE_KEY, post.isDownloadableGifOrVideo());
intent.putExtra(ViewVideoActivity.IS_DASH_VIDEO_KEY, post.isDashVideo()); if(post.isDownloadableGifOrVideo()) {
intent.putExtra(ViewVideoActivity.IS_DOWNLOADABLE_KEY, post.isDownloadableGifOrVideo()); intent.putExtra(ViewVideoActivity.DOWNLOAD_URL_KEY, post.getGifOrVideoDownloadUrl());
if(post.isDownloadableGifOrVideo()) { intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, subredditNamePrefixed);
intent.putExtra(ViewVideoActivity.DOWNLOAD_URL_KEY, post.getGifOrVideoDownloadUrl()); intent.putExtra(ViewVideoActivity.ID_KEY, id);
intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, subredditName);
intent.putExtra(ViewVideoActivity.ID_KEY, id);
}
mContext.startActivity(intent);
} }
mContext.startActivity(intent);
}); });
break; break;
case Post.VIDEO_TYPE: case Post.VIDEO_TYPE:
@ -437,7 +420,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
intent.putExtra(ViewVideoActivity.IS_DOWNLOADABLE_KEY, post.isDownloadableGifOrVideo()); intent.putExtra(ViewVideoActivity.IS_DOWNLOADABLE_KEY, post.isDownloadableGifOrVideo());
if(post.isDownloadableGifOrVideo()) { if(post.isDownloadableGifOrVideo()) {
intent.putExtra(ViewVideoActivity.DOWNLOAD_URL_KEY, post.getGifOrVideoDownloadUrl()); intent.putExtra(ViewVideoActivity.DOWNLOAD_URL_KEY, post.getGifOrVideoDownloadUrl());
intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, subredditName); intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, subredditNamePrefixed);
intent.putExtra(ViewVideoActivity.ID_KEY, id); intent.putExtra(ViewVideoActivity.ID_KEY, id);
} }
mContext.startActivity(intent); mContext.startActivity(intent);
@ -448,16 +431,13 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
((DataViewHolder) holder).typeChip.setText("LINK"); ((DataViewHolder) holder).typeChip.setText("LINK");
final String noPreviewLinkUrl = post.getUrl(); final String noPreviewLinkUrl = post.getUrl();
((DataViewHolder) holder).noPreviewLinkImageView.setVisibility(View.VISIBLE); ((DataViewHolder) holder).noPreviewLinkImageView.setVisibility(View.VISIBLE);
((DataViewHolder) holder).noPreviewLinkImageView.setOnClickListener(new View.OnClickListener() { ((DataViewHolder) holder).noPreviewLinkImageView.setOnClickListener(view -> {
@Override CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
public void onClick(View view) { // add share action to menu list
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); builder.addDefaultShareMenuItem();
// add share action to menu list builder.setToolbarColor(mContext.getResources().getColor(R.color.colorPrimary));
builder.addDefaultShareMenuItem(); CustomTabsIntent customTabsIntent = builder.build();
builder.setToolbarColor(mContext.getResources().getColor(R.color.colorPrimary)); customTabsIntent.launchUrl(mContext, Uri.parse(noPreviewLinkUrl));
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(mContext, Uri.parse(noPreviewLinkUrl));
}
}); });
break; break;
case Post.TEXT_TYPE: case Post.TEXT_TYPE:
@ -465,133 +445,124 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
break; break;
} }
((DataViewHolder) holder).upvoteButton.setOnClickListener(new View.OnClickListener() { ((DataViewHolder) holder).upvoteButton.setOnClickListener(view -> {
@Override final boolean isDownvotedBefore = ((DataViewHolder) holder).downvoteButton.getColorFilter() != null;
public void onClick(View view) {
final boolean isDownvotedBefore = ((DataViewHolder) holder).downvoteButton.getColorFilter() != null;
final ColorFilter downvoteButtonColorFilter = ((DataViewHolder) holder).downvoteButton.getColorFilter(); final ColorFilter downvoteButtonColorFilter = ((DataViewHolder) holder).downvoteButton.getColorFilter();
((DataViewHolder) holder).downvoteButton.clearColorFilter(); ((DataViewHolder) holder).downvoteButton.clearColorFilter();
if (((DataViewHolder) holder).upvoteButton.getColorFilter() == null) { if (((DataViewHolder) holder).upvoteButton.getColorFilter() == null) {
((DataViewHolder) holder).upvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN); ((DataViewHolder) holder).upvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN);
if(isDownvotedBefore) { if(isDownvotedBefore) {
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 2)); ((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 2));
} else {
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 1));
}
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() {
@Override
public void onVoteThingSuccess(int position) {
post.setVoteType(1);
if(isDownvotedBefore) {
post.setScore(post.getScore() + 2);
} else {
post.setScore(post.getScore() + 1);
}
}
@Override
public void onVoteThingFail(int position) {
Toast.makeText(mContext, "Cannot upvote this post", Toast.LENGTH_SHORT).show();
((DataViewHolder) holder).upvoteButton.clearColorFilter();
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
((DataViewHolder) holder).downvoteButton.setColorFilter(downvoteButtonColorFilter);
}
}, id, RedditUtils.DIR_UPVOTE, holder.getAdapterPosition());
} else { } else {
//Upvoted before ((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 1));
((DataViewHolder) holder).upvoteButton.clearColorFilter(); }
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() - 1));
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() {
@Override @Override
public void onVoteThingSuccess(int position) { public void onVoteThingSuccess(int position1) {
post.setVoteType(0); post.setVoteType(1);
post.setScore(post.getScore() - 1); if(isDownvotedBefore) {
} post.setScore(post.getScore() + 2);
} else {
@Override
public void onVoteThingFail(int position) {
Toast.makeText(mContext, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 1));
((DataViewHolder) holder).upvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN);
post.setScore(post.getScore() + 1); post.setScore(post.getScore() + 1);
} }
}, id, RedditUtils.DIR_UNVOTE, holder.getAdapterPosition());
}
}
});
((DataViewHolder) holder).downvoteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final boolean isUpvotedBefore = ((DataViewHolder) holder).upvoteButton.getColorFilter() != null;
final ColorFilter upvoteButtonColorFilter = ((DataViewHolder) holder).upvoteButton.getColorFilter();
((DataViewHolder) holder).upvoteButton.clearColorFilter();
if (((DataViewHolder) holder).downvoteButton.getColorFilter() == null) {
((DataViewHolder) holder).downvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
if (isUpvotedBefore) {
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() - 2));
} else {
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() - 1));
} }
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { @Override
@Override public void onVoteThingFail(int position1) {
public void onVoteThingSuccess(int position) { Toast.makeText(mContext, "Cannot upvote this post", Toast.LENGTH_SHORT).show();
post.setVoteType(-1); ((DataViewHolder) holder).upvoteButton.clearColorFilter();
if(isUpvotedBefore) { ((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
post.setScore(post.getScore() - 2); ((DataViewHolder) holder).downvoteButton.setColorFilter(downvoteButtonColorFilter);
} else { }
post.setScore(post.getScore() - 1); }, id, RedditUtils.DIR_UPVOTE, holder.getAdapterPosition());
} } else {
} //Upvoted before
((DataViewHolder) holder).upvoteButton.clearColorFilter();
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() - 1));
@Override VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() {
public void onVoteThingFail(int position) { @Override
Toast.makeText(mContext, "Cannot downvote this post", Toast.LENGTH_SHORT).show(); public void onVoteThingSuccess(int position1) {
((DataViewHolder) holder).downvoteButton.clearColorFilter(); post.setVoteType(0);
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore())); post.setScore(post.getScore() - 1);
((DataViewHolder) holder).upvoteButton.setColorFilter(upvoteButtonColorFilter); }
}
}, id, RedditUtils.DIR_DOWNVOTE, holder.getAdapterPosition());
} else {
//Down voted before
((DataViewHolder) holder).downvoteButton.clearColorFilter();
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 1));
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { @Override
@Override public void onVoteThingFail(int position1) {
public void onVoteThingSuccess(int position) { Toast.makeText(mContext, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
post.setVoteType(0); ((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 1));
post.setScore(post.getScore()); ((DataViewHolder) holder).upvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN);
} post.setScore(post.getScore() + 1);
}
@Override }, id, RedditUtils.DIR_UNVOTE, holder.getAdapterPosition());
public void onVoteThingFail(int position) {
Toast.makeText(mContext, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
((DataViewHolder) holder).downvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
post.setScore(post.getScore());
}
}, id, RedditUtils.DIR_UNVOTE, holder.getAdapterPosition());
}
} }
}); });
((DataViewHolder) holder).shareButton.setOnClickListener(new View.OnClickListener() { ((DataViewHolder) holder).downvoteButton.setOnClickListener(view -> {
@Override final boolean isUpvotedBefore = ((DataViewHolder) holder).upvoteButton.getColorFilter() != null;
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_SEND); final ColorFilter upvoteButtonColorFilter = ((DataViewHolder) holder).upvoteButton.getColorFilter();
intent.setType("text/plain"); ((DataViewHolder) holder).upvoteButton.clearColorFilter();
String extraText = title + "\n" + permalink; if (((DataViewHolder) holder).downvoteButton.getColorFilter() == null) {
intent.putExtra(Intent.EXTRA_TEXT, extraText); ((DataViewHolder) holder).downvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
mContext.startActivity(Intent.createChooser(intent, "Share")); if (isUpvotedBefore) {
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() - 2));
} else {
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() - 1));
}
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() {
@Override
public void onVoteThingSuccess(int position12) {
post.setVoteType(-1);
if(isUpvotedBefore) {
post.setScore(post.getScore() - 2);
} else {
post.setScore(post.getScore() - 1);
}
}
@Override
public void onVoteThingFail(int position12) {
Toast.makeText(mContext, "Cannot downvote this post", Toast.LENGTH_SHORT).show();
((DataViewHolder) holder).downvoteButton.clearColorFilter();
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
((DataViewHolder) holder).upvoteButton.setColorFilter(upvoteButtonColorFilter);
}
}, id, RedditUtils.DIR_DOWNVOTE, holder.getAdapterPosition());
} else {
//Down voted before
((DataViewHolder) holder).downvoteButton.clearColorFilter();
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 1));
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() {
@Override
public void onVoteThingSuccess(int position12) {
post.setVoteType(0);
post.setScore(post.getScore());
}
@Override
public void onVoteThingFail(int position12) {
Toast.makeText(mContext, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
((DataViewHolder) holder).downvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
post.setScore(post.getScore());
}
}, id, RedditUtils.DIR_UNVOTE, holder.getAdapterPosition());
} }
}); });
((DataViewHolder) holder).shareButton.setOnClickListener(view -> {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
String extraText = title + "\n" + permalink;
intent.putExtra(Intent.EXTRA_TEXT, extraText);
mContext.startActivity(Intent.createChooser(intent, "Share"));
});
} }
} }
} }
@ -602,13 +573,10 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
((DataViewHolder) holder).progressBar.setVisibility(View.GONE); ((DataViewHolder) holder).progressBar.setVisibility(View.GONE);
((DataViewHolder) holder).errorRelativeLayout.setVisibility(View.VISIBLE); ((DataViewHolder) holder).errorRelativeLayout.setVisibility(View.VISIBLE);
((DataViewHolder)holder).errorRelativeLayout.setOnClickListener(new View.OnClickListener() { ((DataViewHolder)holder).errorRelativeLayout.setOnClickListener(view -> {
@Override ((DataViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
public void onClick(View view) { ((DataViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
((DataViewHolder) holder).progressBar.setVisibility(View.VISIBLE); loadImage(holder, post);
((DataViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
loadImage(holder, post);
}
}); });
return false; return false;
} }

View File

@ -41,4 +41,8 @@ public interface RedditAPI {
@GET("user/{username}/about.json?raw_json=1") @GET("user/{username}/about.json?raw_json=1")
Call<String> getUserData(@Path("username") String username); Call<String> getUserData(@Path("username") String username);
@FormUrlEncoded
@POST("api/subscribe")
Call<String> subredditSubscription(@HeaderMap Map<String, String> headers, @FieldMap Map<String, String> params);
} }

View File

@ -45,6 +45,9 @@ public class RedditUtils {
static final String DIR_DOWNVOTE = "-1"; static final String DIR_DOWNVOTE = "-1";
static final String RANK = "10"; static final String RANK = "10";
static final String ACTION_KEY = "action";
static final String SR_NAME_KEY = "sr_name";
static Map<String, String> getHttpBasicAuthHeader() { static Map<String, String> getHttpBasicAuthHeader() {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
String credentials = String.format("%s:%s", RedditUtils.CLIENT_ID, ""); String credentials = String.format("%s:%s", RedditUtils.CLIENT_ID, "");

View File

@ -0,0 +1,127 @@
package ml.docilealligator.infinityforreddit;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.support.annotation.NonNull;
import android.util.Log;
import java.util.HashMap;
import java.util.Map;
import SubredditDatabase.SubredditData;
import SubscribedSubredditDatabase.SubscribedSubredditDao;
import SubscribedSubredditDatabase.SubscribedSubredditData;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
class SubredditSubscription {
interface SubredditSubscriptionListener {
void onSubredditSubscriptionSuccess();
void onSubredditSubscriptionFail();
}
static void subscribeToSubreddit(Retrofit oauthRetrofit, Retrofit retrofit,
SharedPreferences authInfoSharedPreferences, String subredditName,
SubscribedSubredditDao subscribedSubredditDao,
SubredditSubscriptionListener subredditSubscriptionListener) {
subredditSubscription(oauthRetrofit, retrofit, authInfoSharedPreferences, subredditName, "sub",
subscribedSubredditDao, subredditSubscriptionListener);
}
static void unsubscribeToSubreddit(Retrofit oauthRetrofit, SharedPreferences authInfoSharedPreferences,
String subredditName, SubscribedSubredditDao subscribedSubredditDao,
SubredditSubscriptionListener subredditSubscriptionListener) {
subredditSubscription(oauthRetrofit, null, authInfoSharedPreferences, subredditName, "unsub",
subscribedSubredditDao,subredditSubscriptionListener);
}
private static void subredditSubscription(Retrofit oauthRetrofit, Retrofit retrofit, SharedPreferences authInfoSharedPreferences,
String subredditName, String action, SubscribedSubredditDao subscribedSubredditDao,
SubredditSubscriptionListener subredditSubscriptionListener) {
RedditAPI api = oauthRetrofit.create(RedditAPI.class);
String accessToken = authInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, "");
Map<String, String> params = new HashMap<>();
params.put(RedditUtils.ACTION_KEY, action);
params.put(RedditUtils.SR_NAME_KEY, subredditName);
Call<String> subredditSubscriptionCall = api.subredditSubscription(RedditUtils.getOAuthHeader(accessToken), params);
subredditSubscriptionCall.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
if(action.equals("sub")) {
FetchSubredditData.fetchSubredditData(retrofit, subredditName, new FetchSubredditData.FetchSubredditDataListener() {
@Override
public void onFetchSubredditDataSuccess(String response) {
ParseSubredditData.parseSubredditData(response, new ParseSubredditData.ParseSubredditDataListener() {
@Override
public void onParseSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) {
new UpdateSubscriptionAsyncTask(subscribedSubredditDao,
subredditData, true).execute();
}
@Override
public void onParseSubredditDataFail() {
}
});
}
@Override
public void onFetchSubredditDataFail() {
}
});
} else {
new UpdateSubscriptionAsyncTask(subscribedSubredditDao, subredditName, false).execute();
}
subredditSubscriptionListener.onSubredditSubscriptionSuccess();
} else {
Log.i("call failed", response.message());
subredditSubscriptionListener.onSubredditSubscriptionFail();
}
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
Log.i("call failed", t.getMessage());
subredditSubscriptionListener.onSubredditSubscriptionFail();
}
});
}
private static class UpdateSubscriptionAsyncTask extends AsyncTask<Void, Void, Void> {
private SubscribedSubredditDao subscribedSubredditDao;
private String subredditName;
private SubscribedSubredditData subscribedSubredditData;
private boolean isSubscribing;
UpdateSubscriptionAsyncTask(SubscribedSubredditDao subscribedSubredditDao, String subredditName,
boolean isSubscribing) {
this.subscribedSubredditDao = subscribedSubredditDao;
this.subredditName = subredditName;
this.isSubscribing = isSubscribing;
}
UpdateSubscriptionAsyncTask(SubscribedSubredditDao subscribedSubredditDao, SubscribedSubredditData subscribedSubredditData,
boolean isSubscribing) {
this.subscribedSubredditDao = subscribedSubredditDao;
this.subscribedSubredditData = subscribedSubredditData;
this.isSubscribing = isSubscribing;
}
@Override
protected Void doInBackground(Void... voids) {
if(isSubscribing) {
subscribedSubredditDao.insert(subscribedSubredditData);
} else {
subscribedSubredditDao.deleteSubscribedSubreddit(subredditName);;
}
return null;
}
}
}

View File

@ -50,17 +50,12 @@ class SubscribedSubredditRecyclerViewAdapter extends RecyclerView.Adapter<Recycl
@Override @Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, final int i) { public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, final int i) {
viewHolder.itemView.setOnClickListener(new View.OnClickListener() { viewHolder.itemView.setOnClickListener(view -> {
@Override if(viewHolder.getAdapterPosition() >= 0) {
public void onClick(View view) { mOnItemClickListener.onClick();
if(viewHolder.getAdapterPosition() >= 0) { Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
mOnItemClickListener.onClick(); intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getName());
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); mContext.startActivity(intent);
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getName());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getId());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, true);
mContext.startActivity(intent);
}
} }
}); });
if(!mSubscribedSubredditData.get(i).getIconUrl().equals("")) { if(!mSubscribedSubredditData.get(i).getIconUrl().equals("")) {

View File

@ -123,20 +123,17 @@ public class ViewPostDetailActivity extends AppCompatActivity {
if(mPost.getSubredditIconUrl() == null) { if(mPost.getSubredditIconUrl() == null) {
mLoadSubredditIconAsyncTask = new LoadSubredditIconAsyncTask( mLoadSubredditIconAsyncTask = new LoadSubredditIconAsyncTask(
SubredditRoomDatabase.getDatabase(this).subredditDao(), mPost.getSubredditNamePrefixed(), SubredditRoomDatabase.getDatabase(this).subredditDao(), mPost.getSubredditNamePrefixed(),
new LoadSubredditIconAsyncTask.LoadSubredditIconAsyncTaskListener() { iconImageUrl -> {
@Override if(!iconImageUrl.equals("")) {
public void loadIconSuccess(String iconImageUrl) { Glide.with(ViewPostDetailActivity.this).load(iconImageUrl)
if(!iconImageUrl.equals("")) { .into(mSubredditIconCircleImageView);
Glide.with(ViewPostDetailActivity.this).load(iconImageUrl) } else {
.into(mSubredditIconCircleImageView); Glide.with(ViewPostDetailActivity.this).load(R.drawable.subreddit_default_icon)
} else { .into(mSubredditIconCircleImageView);
Glide.with(ViewPostDetailActivity.this).load(R.drawable.subreddit_default_icon) }
.into(mSubredditIconCircleImageView);
}
mPost.setSubredditIconUrl(iconImageUrl); mPost.setSubredditIconUrl(iconImageUrl);
} });
});
mLoadSubredditIconAsyncTask.execute(); mLoadSubredditIconAsyncTask.execute();
} else if(!mPost.getSubredditIconUrl().equals("")) { } else if(!mPost.getSubredditIconUrl().equals("")) {
Glide.with(this).load(mPost.getSubredditIconUrl()).into(mSubredditIconCircleImageView); Glide.with(this).load(mPost.getSubredditIconUrl()).into(mSubredditIconCircleImageView);
@ -144,17 +141,11 @@ public class ViewPostDetailActivity extends AppCompatActivity {
Glide.with(this).load(R.drawable.subreddit_default_icon).into(mSubredditIconCircleImageView); Glide.with(this).load(R.drawable.subreddit_default_icon).into(mSubredditIconCircleImageView);
} }
mSubredditIconCircleImageView.setOnClickListener(new View.OnClickListener() { mSubredditIconCircleImageView.setOnClickListener(view -> {
@Override Intent intent = new Intent(ViewPostDetailActivity.this, ViewSubredditDetailActivity.class);
public void onClick(View view) { intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
Intent intent = new Intent(ViewPostDetailActivity.this, ViewSubredditDetailActivity.class); mPost.getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, startActivity(intent);
mPost.getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY,
mPost.getSubredditNamePrefixed());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false);
startActivity(intent);
}
}); });
switch (mPost.getVoteType()) { switch (mPost.getVoteType()) {
@ -184,17 +175,11 @@ public class ViewPostDetailActivity extends AppCompatActivity {
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
mSubredditTextView.setText(mPost.getSubredditNamePrefixed()); mSubredditTextView.setText(mPost.getSubredditNamePrefixed());
mSubredditTextView.setOnClickListener(new View.OnClickListener() { mSubredditTextView.setOnClickListener(view -> {
@Override Intent intent = new Intent(ViewPostDetailActivity.this, ViewSubredditDetailActivity.class);
public void onClick(View view) { intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
Intent intent = new Intent(ViewPostDetailActivity.this, ViewSubredditDetailActivity.class); mPost.getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, startActivity(intent);
mPost.getSubredditNamePrefixed().substring(2));
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY,
mPost.getSubredditNamePrefixed());
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false);
startActivity(intent);
}
}); });
mPostTimeTextView.setText(mPost.getPostTime()); mPostTimeTextView.setText(mPost.getPostTime());
@ -212,87 +197,72 @@ public class ViewPostDetailActivity extends AppCompatActivity {
} }
mScoreTextView.setText(Integer.toString(mPost.getScore())); mScoreTextView.setText(Integer.toString(mPost.getScore()));
mShareButton.setOnClickListener(new View.OnClickListener() { mShareButton.setOnClickListener(view -> {
@Override Intent intent = new Intent(Intent.ACTION_SEND);
public void onClick(View view) { intent.setType("text/plain");
Intent intent = new Intent(Intent.ACTION_SEND); String extraText = mPost.getTitle() + "\n" + mPost.getPermalink();
intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, extraText);
String extraText = mPost.getTitle() + "\n" + mPost.getPermalink(); startActivity(Intent.createChooser(intent, "Share"));
intent.putExtra(Intent.EXTRA_TEXT, extraText);
startActivity(Intent.createChooser(intent, "Share"));
}
}); });
switch (mPost.getPostType()) { switch (mPost.getPostType()) {
case Post.IMAGE_TYPE: case Post.IMAGE_TYPE:
mTypeChip.setText("IMAGE"); mTypeChip.setText("IMAGE");
mImageView.setOnClickListener(new View.OnClickListener() { mImageView.setOnClickListener(view -> {
@Override Intent intent = new Intent(ViewPostDetailActivity.this, ViewImageActivity.class);
public void onClick(View view) { intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, mPost.getUrl());
Intent intent = new Intent(ViewPostDetailActivity.this, ViewImageActivity.class); intent.putExtra(ViewImageActivity.TITLE_KEY, mPost.getTitle());
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, mPost.getUrl()); intent.putExtra(ViewImageActivity.FILE_NAME_KEY, mPost.getSubredditNamePrefixed().substring(2)
intent.putExtra(ViewImageActivity.TITLE_KEY, mPost.getTitle()); + "-" + mPost.getId().substring(3));
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, mPost.getSubredditNamePrefixed().substring(2) startActivity(intent);
+ "-" + mPost.getId().substring(3));
startActivity(intent);
}
}); });
break; break;
case Post.LINK_TYPE: case Post.LINK_TYPE:
mTypeChip.setText("LINK"); mTypeChip.setText("LINK");
mImageView.setOnClickListener(new View.OnClickListener() { mImageView.setOnClickListener(view -> {
@Override CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
public void onClick(View view) { // add share action to menu list
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); builder.addDefaultShareMenuItem();
// add share action to menu list builder.setToolbarColor(getResources().getColor(R.color.colorPrimary));
builder.addDefaultShareMenuItem(); CustomTabsIntent customTabsIntent = builder.build();
builder.setToolbarColor(getResources().getColor(R.color.colorPrimary)); customTabsIntent.launchUrl(ViewPostDetailActivity.this, Uri.parse(mPost.getUrl()));
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(ViewPostDetailActivity.this, Uri.parse(mPost.getUrl()));
}
}); });
break; break;
case Post.GIF_VIDEO_TYPE: case Post.GIF_VIDEO_TYPE:
mTypeChip.setText("GIF"); mTypeChip.setText("GIF");
final Uri gifVideoUri = Uri.parse(mPost.getVideoUrl()); final Uri gifVideoUri = Uri.parse(mPost.getVideoUrl());
mImageView.setOnClickListener(new View.OnClickListener() { mImageView.setOnClickListener(view -> {
@Override Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class);
public void onClick(View view) { intent.setData(gifVideoUri);
Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class); intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle());
intent.setData(gifVideoUri); intent.putExtra(ViewVideoActivity.IS_DASH_VIDEO_KEY, mPost.isDashVideo());
intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle()); intent.putExtra(ViewVideoActivity.IS_DOWNLOADABLE_KEY, mPost.isDownloadableGifOrVideo());
intent.putExtra(ViewVideoActivity.IS_DASH_VIDEO_KEY, mPost.isDashVideo()); if(mPost.isDownloadableGifOrVideo()) {
intent.putExtra(ViewVideoActivity.IS_DOWNLOADABLE_KEY, mPost.isDownloadableGifOrVideo()); intent.putExtra(ViewVideoActivity.DOWNLOAD_URL_KEY, mPost.getGifOrVideoDownloadUrl());
if(mPost.isDownloadableGifOrVideo()) { intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, mPost.getSubredditNamePrefixed());
intent.putExtra(ViewVideoActivity.DOWNLOAD_URL_KEY, mPost.getGifOrVideoDownloadUrl()); intent.putExtra(ViewVideoActivity.ID_KEY, mPost.getId());
intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, mPost.getSubredditNamePrefixed());
intent.putExtra(ViewVideoActivity.ID_KEY, mPost.getId());
}
startActivity(intent);
} }
startActivity(intent);
}); });
break; break;
case Post.VIDEO_TYPE: case Post.VIDEO_TYPE:
mTypeChip.setText("VIDEO"); mTypeChip.setText("VIDEO");
final Uri videoUri = Uri.parse(mPost.getVideoUrl()); final Uri videoUri = Uri.parse(mPost.getVideoUrl());
mImageView.setOnClickListener(new View.OnClickListener() { mImageView.setOnClickListener(view -> {
@Override Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class);
public void onClick(View view) { intent.setData(videoUri);
Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class); intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle());
intent.setData(videoUri); intent.putExtra(ViewVideoActivity.IS_DASH_VIDEO_KEY, mPost.isDashVideo());
intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle()); intent.putExtra(ViewVideoActivity.IS_DOWNLOADABLE_KEY, mPost.isDownloadableGifOrVideo());
intent.putExtra(ViewVideoActivity.IS_DASH_VIDEO_KEY, mPost.isDashVideo()); if(mPost.isDownloadableGifOrVideo()) {
intent.putExtra(ViewVideoActivity.IS_DOWNLOADABLE_KEY, mPost.isDownloadableGifOrVideo()); intent.putExtra(ViewVideoActivity.DOWNLOAD_URL_KEY, mPost.getGifOrVideoDownloadUrl());
if(mPost.isDownloadableGifOrVideo()) { intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, mPost.getSubredditNamePrefixed());
intent.putExtra(ViewVideoActivity.DOWNLOAD_URL_KEY, mPost.getGifOrVideoDownloadUrl()); intent.putExtra(ViewVideoActivity.ID_KEY, mPost.getId());
intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, mPost.getSubredditNamePrefixed());
intent.putExtra(ViewVideoActivity.ID_KEY, mPost.getId());
}
startActivity(intent);
} }
startActivity(intent);
}); });
break; break;
case Post.NO_PREVIEW_LINK_TYPE: case Post.NO_PREVIEW_LINK_TYPE:
@ -302,16 +272,13 @@ public class ViewPostDetailActivity extends AppCompatActivity {
mContentTextView.setHtml(mPost.getSelfText()); mContentTextView.setHtml(mPost.getSelfText());
} }
mNoPreviewLinkImageView.setVisibility(View.VISIBLE); mNoPreviewLinkImageView.setVisibility(View.VISIBLE);
mNoPreviewLinkImageView.setOnClickListener(new View.OnClickListener() { mNoPreviewLinkImageView.setOnClickListener(view -> {
@Override CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
public void onClick(View view) { // add share action to menu list
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); builder.addDefaultShareMenuItem();
// add share action to menu list builder.setToolbarColor(getResources().getColor(R.color.colorPrimary));
builder.addDefaultShareMenuItem(); CustomTabsIntent customTabsIntent = builder.build();
builder.setToolbarColor(getResources().getColor(R.color.colorPrimary)); customTabsIntent.launchUrl(ViewPostDetailActivity.this, Uri.parse(mPost.getUrl()));
CustomTabsIntent customTabsIntent = builder.build();
customTabsIntent.launchUrl(ViewPostDetailActivity.this, Uri.parse(mPost.getUrl()));
}
}); });
break; break;
case Post.TEXT_TYPE: case Post.TEXT_TYPE:
@ -324,123 +291,115 @@ public class ViewPostDetailActivity extends AppCompatActivity {
} }
queryComment(); queryComment();
mUpvoteButton.setOnClickListener(new View.OnClickListener() { mUpvoteButton.setOnClickListener(view -> {
@Override final boolean isDownvotedBefore = mDownvoteButton.getColorFilter() != null;
public void onClick(View view) {
//observable.subscribe(observer);
final boolean isDownvotedBefore = mDownvoteButton.getColorFilter() != null;
final ColorFilter downVoteButtonColorFilter = mDownvoteButton.getColorFilter(); final ColorFilter downVoteButtonColorFilter = mDownvoteButton.getColorFilter();
mDownvoteButton.clearColorFilter(); mDownvoteButton.clearColorFilter();
if (mUpvoteButton.getColorFilter() == null) { if (mUpvoteButton.getColorFilter() == null) {
mUpvoteButton.setColorFilter(ContextCompat.getColor(ViewPostDetailActivity.this, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN); mUpvoteButton.setColorFilter(ContextCompat.getColor(ViewPostDetailActivity.this, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN);
if(isDownvotedBefore) { if(isDownvotedBefore) {
mScoreTextView.setText(Integer.toString(mPost.getScore() + 2)); mScoreTextView.setText(Integer.toString(mPost.getScore() + 2));
} else {
mScoreTextView.setText(Integer.toString(mPost.getScore() + 1));
}
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() {
@Override
public void onVoteThingSuccess() {
mPost.setVoteType(1);
if(isDownvotedBefore) {
mPost.setScore(mPost.getScore() + 2);
} else {
mPost.setScore(mPost.getScore() + 1);
}
}
@Override
public void onVoteThingFail() {
Toast.makeText(ViewPostDetailActivity.this, "Cannot upvote this post", Toast.LENGTH_SHORT).show();
mUpvoteButton.clearColorFilter();
mScoreTextView.setText(Integer.toString(mPost.getScore()));
mDownvoteButton.setColorFilter(downVoteButtonColorFilter);
}
}, mPost.getFullName(), RedditUtils.DIR_UPVOTE);
} else { } else {
//Upvoted before mScoreTextView.setText(Integer.toString(mPost.getScore() + 1));
mUpvoteButton.clearColorFilter(); }
mScoreTextView.setText(Integer.toString(mPost.getScore() - 1));
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() { VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() {
@Override @Override
public void onVoteThingSuccess() { public void onVoteThingSuccess() {
mPost.setVoteType(0); mPost.setVoteType(1);
mPost.setScore(mPost.getScore() - 1); if(isDownvotedBefore) {
} mPost.setScore(mPost.getScore() + 2);
} else {
@Override
public void onVoteThingFail() {
Toast.makeText(ViewPostDetailActivity.this, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
mScoreTextView.setText(Integer.toString(mPost.getScore() + 1));
mUpvoteButton.setColorFilter(ContextCompat.getColor(ViewPostDetailActivity.this, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN);
mPost.setScore(mPost.getScore() + 1); mPost.setScore(mPost.getScore() + 1);
} }
}, mPost.getFullName(), RedditUtils.DIR_UNVOTE); }
}
@Override
public void onVoteThingFail() {
Toast.makeText(ViewPostDetailActivity.this, "Cannot upvote this post", Toast.LENGTH_SHORT).show();
mUpvoteButton.clearColorFilter();
mScoreTextView.setText(Integer.toString(mPost.getScore()));
mDownvoteButton.setColorFilter(downVoteButtonColorFilter);
}
}, mPost.getFullName(), RedditUtils.DIR_UPVOTE);
} else {
//Upvoted before
mUpvoteButton.clearColorFilter();
mScoreTextView.setText(Integer.toString(mPost.getScore() - 1));
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() {
@Override
public void onVoteThingSuccess() {
mPost.setVoteType(0);
mPost.setScore(mPost.getScore() - 1);
}
@Override
public void onVoteThingFail() {
Toast.makeText(ViewPostDetailActivity.this, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
mScoreTextView.setText(Integer.toString(mPost.getScore() + 1));
mUpvoteButton.setColorFilter(ContextCompat.getColor(ViewPostDetailActivity.this, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN);
mPost.setScore(mPost.getScore() + 1);
}
}, mPost.getFullName(), RedditUtils.DIR_UNVOTE);
} }
}); });
mDownvoteButton.setOnClickListener(new View.OnClickListener() { mDownvoteButton.setOnClickListener(view -> {
@Override final boolean isUpvotedBefore = mUpvoteButton.getColorFilter() != null;
public void onClick(View view) {
//observable.subscribe(observer);
final boolean isUpvotedBefore = mUpvoteButton.getColorFilter() != null;
final ColorFilter upvoteButtonColorFilter = mUpvoteButton.getColorFilter(); final ColorFilter upvoteButtonColorFilter = mUpvoteButton.getColorFilter();
mUpvoteButton.clearColorFilter(); mUpvoteButton.clearColorFilter();
if (mDownvoteButton.getColorFilter() == null) { if (mDownvoteButton.getColorFilter() == null) {
mDownvoteButton.setColorFilter(ContextCompat.getColor(ViewPostDetailActivity.this, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN); mDownvoteButton.setColorFilter(ContextCompat.getColor(ViewPostDetailActivity.this, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
if (isUpvotedBefore) { if (isUpvotedBefore) {
mScoreTextView.setText(Integer.toString(mPost.getScore() - 2)); mScoreTextView.setText(Integer.toString(mPost.getScore() - 2));
} else { } else {
mScoreTextView.setText(Integer.toString(mPost.getScore() - 1)); mScoreTextView.setText(Integer.toString(mPost.getScore() - 1));
}
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() {
@Override
public void onVoteThingSuccess() {
mPost.setVoteType(-1);
if(isUpvotedBefore) {
mPost.setScore(mPost.getScore() - 2);
} else {
mPost.setScore(mPost.getScore() - 1);
}
} }
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() { @Override
@Override public void onVoteThingFail() {
public void onVoteThingSuccess() { Toast.makeText(ViewPostDetailActivity.this, "Cannot downvote this post", Toast.LENGTH_SHORT).show();
mPost.setVoteType(-1); mDownvoteButton.clearColorFilter();
if(isUpvotedBefore) { mScoreTextView.setText(Integer.toString(mPost.getScore()));
mPost.setScore(mPost.getScore() - 2); mUpvoteButton.setColorFilter(upvoteButtonColorFilter);
} else { }
mPost.setScore(mPost.getScore() - 1); }, mPost.getFullName(), RedditUtils.DIR_DOWNVOTE);
} } else {
} //Down voted before
mDownvoteButton.clearColorFilter();
mScoreTextView.setText(Integer.toString(mPost.getScore() + 1));
@Override VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() {
public void onVoteThingFail() { @Override
Toast.makeText(ViewPostDetailActivity.this, "Cannot downvote this post", Toast.LENGTH_SHORT).show(); public void onVoteThingSuccess() {
mDownvoteButton.clearColorFilter(); mPost.setVoteType(0);
mScoreTextView.setText(Integer.toString(mPost.getScore())); mPost.setScore(mPost.getScore());
mUpvoteButton.setColorFilter(upvoteButtonColorFilter); }
}
}, mPost.getFullName(), RedditUtils.DIR_DOWNVOTE);
} else {
//Down voted before
mDownvoteButton.clearColorFilter();
mScoreTextView.setText(Integer.toString(mPost.getScore() + 1));
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() { @Override
@Override public void onVoteThingFail() {
public void onVoteThingSuccess() { Toast.makeText(ViewPostDetailActivity.this, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
mPost.setVoteType(0); mDownvoteButton.setColorFilter(ContextCompat.getColor(ViewPostDetailActivity.this, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
mPost.setScore(mPost.getScore()); mScoreTextView.setText(Integer.toString(mPost.getScore()));
} mPost.setScore(mPost.getScore());
}
@Override }, mPost.getFullName(), RedditUtils.DIR_UNVOTE);
public void onVoteThingFail() {
Toast.makeText(ViewPostDetailActivity.this, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
mDownvoteButton.setColorFilter(ContextCompat.getColor(ViewPostDetailActivity.this, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
mScoreTextView.setText(Integer.toString(mPost.getScore()));
mPost.setScore(mPost.getScore());
}
}, mPost.getFullName(), RedditUtils.DIR_UNVOTE);
}
} }
}); });
} }
@ -500,13 +459,10 @@ public class ViewPostDetailActivity extends AppCompatActivity {
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
mLoadImageProgressBar.setVisibility(View.GONE); mLoadImageProgressBar.setVisibility(View.GONE);
mLoadImageErrorTextView.setVisibility(View.VISIBLE); mLoadImageErrorTextView.setVisibility(View.VISIBLE);
mLoadImageErrorTextView.setOnClickListener(new View.OnClickListener() { mLoadImageErrorTextView.setOnClickListener(view -> {
@Override mLoadImageProgressBar.setVisibility(View.VISIBLE);
public void onClick(View view) { mLoadImageErrorTextView.setVisibility(View.GONE);
mLoadImageProgressBar.setVisibility(View.VISIBLE); loadImage();
mLoadImageErrorTextView.setVisibility(View.GONE);
loadImage();
}
}); });
return false; return false;
} }

View File

@ -1,15 +1,18 @@
package ml.docilealligator.infinityforreddit; package ml.docilealligator.infinityforreddit;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders; import android.arch.lifecycle.ViewModelProviders;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.Animatable; import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.chip.Chip;
import android.support.design.widget.AppBarLayout; import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
@ -37,6 +40,9 @@ import SubredditDatabase.SubredditDao;
import SubredditDatabase.SubredditData; import SubredditDatabase.SubredditData;
import SubredditDatabase.SubredditRoomDatabase; import SubredditDatabase.SubredditRoomDatabase;
import SubredditDatabase.SubredditViewModel; import SubredditDatabase.SubredditViewModel;
import SubscribedSubredditDatabase.SubscribedSubredditDao;
import SubscribedSubredditDatabase.SubscribedSubredditData;
import SubscribedSubredditDatabase.SubscribedSubredditRoomDatabase;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
@ -45,27 +51,38 @@ import retrofit2.Retrofit;
public class ViewSubredditDetailActivity extends AppCompatActivity { public class ViewSubredditDetailActivity extends AppCompatActivity {
static final String EXTRA_SUBREDDIT_NAME_KEY = "ESN"; static final String EXTRA_SUBREDDIT_NAME_KEY = "ESN";
static final String EXTRA_SUBREDDIT_VALUE_KEY = "ESV";
static final String EXTRA_QUERY_BY_ID_KEY = "EQBI";
private static final String FRAGMENT_OUT_STATE_KEY = "FOSK"; private static final String FRAGMENT_OUT_STATE_KEY = "FOSK";
@BindView(R.id.coordinator_layout_view_subreddit_detail_activity) CoordinatorLayout coordinatorLayout;
@BindView(R.id.banner_image_view_view_subreddit_detail_activity) ImageView bannerImageView; @BindView(R.id.banner_image_view_view_subreddit_detail_activity) ImageView bannerImageView;
@BindView(R.id.icon_gif_image_view_view_subreddit_detail_activity) GifImageView iconGifImageView; @BindView(R.id.icon_gif_image_view_view_subreddit_detail_activity) GifImageView iconGifImageView;
@BindView(R.id.subscribe_subreddit_chip_view_subreddit_detail_activity) Chip subscribeSubredditChip;
@BindView(R.id.subreddit_name_text_view_view_subreddit_detail_activity) TextView subredditNameTextView; @BindView(R.id.subreddit_name_text_view_view_subreddit_detail_activity) TextView subredditNameTextView;
@BindView(R.id.subscriber_count_text_view_view_subreddit_detail_activity) TextView nSubscribersTextView; @BindView(R.id.subscriber_count_text_view_view_subreddit_detail_activity) TextView nSubscribersTextView;
@BindView(R.id.online_subscriber_count_text_view_view_subreddit_detail_activity) TextView nOnlineSubscribersTextView; @BindView(R.id.online_subscriber_count_text_view_view_subreddit_detail_activity) TextView nOnlineSubscribersTextView;
@BindView(R.id.description_text_view_view_subreddit_detail_activity) TextView descriptionTextView; @BindView(R.id.description_text_view_view_subreddit_detail_activity) TextView descriptionTextView;
private boolean subscriptionReady = false;
private RequestManager glide; private RequestManager glide;
private Fragment mFragment; private Fragment mFragment;
private SubscribedSubredditDao subscribedSubredditDao;
private SubredditViewModel mSubredditViewModel; private SubredditViewModel mSubredditViewModel;
@Inject @Inject
@Named("no_oauth") @Named("no_oauth")
Retrofit mRetrofit; Retrofit mRetrofit;
@Inject
@Named("oauth")
Retrofit mOauthRetrofit;
@Inject
@Named("auth_info")
SharedPreferences sharedPreferences;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -118,97 +135,140 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
} }
}); });
subscribedSubredditDao = SubscribedSubredditRoomDatabase.getDatabase(this).subscribedSubredditDao();
glide = Glide.with(ViewSubredditDetailActivity.this); glide = Glide.with(ViewSubredditDetailActivity.this);
String value = getIntent().getExtras().getString(EXTRA_SUBREDDIT_VALUE_KEY); SubredditViewModel.Factory factory = new SubredditViewModel.Factory(getApplication(), subredditName);
boolean queryById = getIntent().getExtras().getBoolean(EXTRA_QUERY_BY_ID_KEY);
SubredditViewModel.Factory factory = new SubredditViewModel.Factory(getApplication(), value, queryById);
mSubredditViewModel = ViewModelProviders.of(this, factory).get(SubredditViewModel.class); mSubredditViewModel = ViewModelProviders.of(this, factory).get(SubredditViewModel.class);
mSubredditViewModel.getSubredditLiveData().observe(this, new Observer<SubredditData>() { mSubredditViewModel.getSubredditLiveData().observe(this, subredditData -> {
@Override if(subredditData != null) {
public void onChanged(@Nullable final SubredditData subredditData) { if(subredditData.getBannerUrl().equals("")) {
if(subredditData != null) { iconGifImageView.setOnClickListener(view -> {
if(subredditData.getBannerUrl().equals("")) { //Do nothing as it has no image
iconGifImageView.setOnClickListener(new View.OnClickListener() { });
@Override } else {
public void onClick(View view) { glide.load(subredditData.getBannerUrl()).into(bannerImageView);
//Do nothing as it has no image bannerImageView.setOnClickListener(view -> {
} Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
}); intent.putExtra(ViewImageActivity.TITLE_KEY, title);
} else { intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getBannerUrl());
glide.load(subredditData.getBannerUrl()).into(bannerImageView); intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-banner");
bannerImageView.setOnClickListener(new View.OnClickListener() { startActivity(intent);
@Override });
public void onClick(View view) { }
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getBannerUrl());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-banner");
startActivity(intent);
}
});
}
if(subredditData.getIconUrl().equals("")) { if(subredditData.getIconUrl().equals("")) {
glide.load(getDrawable(R.drawable.subreddit_default_icon)) glide.load(getDrawable(R.drawable.subreddit_default_icon))
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0))) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0)))
.into(iconGifImageView); .into(iconGifImageView);
iconGifImageView.setOnClickListener(new View.OnClickListener() { iconGifImageView.setOnClickListener(view -> {
@Override //Do nothing as it is a default icon
public void onClick(View view) { });
//Do nothing as it is a default icon } else {
} glide.load(subredditData.getIconUrl())
}); .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0)))
} else { .error(glide.load(R.drawable.subreddit_default_icon))
glide.load(subredditData.getIconUrl()) .listener(new RequestListener<Drawable>() {
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0))) @Override
.error(glide.load(R.drawable.subreddit_default_icon)) public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
.listener(new RequestListener<Drawable>() { return false;
@Override }
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false; @Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
if(resource instanceof Animatable) {
//This is a gif
((Animatable) resource).start();
iconGifImageView.startAnimation();
} }
return false;
}
})
.into(iconGifImageView);
iconGifImageView.setOnClickListener(view -> {
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getIconUrl());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-icon");
startActivity(intent);
});
}
@Override String subredditFullName = "r/" + subredditData.getName();
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { subredditNameTextView.setText(subredditFullName);
if(resource instanceof Animatable) { String nSubscribers = getString(R.string.subscribers_number_detail, subredditData.getNSubscribers());
//This is a gif nSubscribersTextView.setText(nSubscribers);
((Animatable) resource).start(); if(subredditData.getDescription().equals("")) {
iconGifImageView.startAnimation(); descriptionTextView.setVisibility(View.GONE);
} } else {
return false; descriptionTextView.setVisibility(View.VISIBLE);
} descriptionTextView.setText(subredditData.getDescription());
})
.into(iconGifImageView);
iconGifImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getIconUrl());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-icon");
startActivity(intent);
}
});
}
subredditNameTextView.setText(subredditData.getName());
String nSubscribers = getString(R.string.subscribers_number_detail, subredditData.getNSubscribers());
nSubscribersTextView.setText(nSubscribers);
if(subredditData.getDescription().equals("")) {
descriptionTextView.setVisibility(View.GONE);
} else {
descriptionTextView.setVisibility(View.VISIBLE);
descriptionTextView.setText(subredditData.getDescription());
}
} }
} }
}); });
subscribeSubredditChip.setOnClickListener(view -> {
if(subscriptionReady) {
subscriptionReady = false;
if(subscribeSubredditChip.getText().equals(getResources().getString(R.string.subscribe))) {
SubredditSubscription.subscribeToSubreddit(mOauthRetrofit, mRetrofit, sharedPreferences,
subredditName, subscribedSubredditDao, new SubredditSubscription.SubredditSubscriptionListener() {
@Override
public void onSubredditSubscriptionSuccess() {
subscribeSubredditChip.setText(R.string.unsubscribe);
subscribeSubredditChip.setChipBackgroundColor(getResources().getColorStateList(R.color.colorAccent));
makeSnackbar(R.string.subscribed);
subscriptionReady = true;
}
@Override
public void onSubredditSubscriptionFail() {
makeSnackbar(R.string.subscribe_failed);
subscriptionReady = true;
}
});
} else {
SubredditSubscription.unsubscribeToSubreddit(mOauthRetrofit, sharedPreferences,
subredditName, subscribedSubredditDao, new SubredditSubscription.SubredditSubscriptionListener() {
@Override
public void onSubredditSubscriptionSuccess() {
subscribeSubredditChip.setText(R.string.subscribe);
subscribeSubredditChip.setChipBackgroundColor(getResources().getColorStateList(R.color.colorPrimaryDark));
makeSnackbar(R.string.unsubscribed);
subscriptionReady = true;
}
@Override
public void onSubredditSubscriptionFail() {
makeSnackbar(R.string.unsubscribe_failed);
subscriptionReady = true;
}
});
}
}
});
new CheckIsSubscribedToSubredditAsyncTask(subscribedSubredditDao, subredditName,
new CheckIsSubscribedToSubredditAsyncTask.CheckIsSubscribedToSubredditListener() {
@Override
public void isSubscribed() {
subscribeSubredditChip.setText(R.string.unsubscribe);
subscribeSubredditChip.setChipBackgroundColor(getResources().getColorStateList(R.color.colorAccent));
subscriptionReady = true;
}
@Override
public void isNotSubscribed() {
subscribeSubredditChip.setText(R.string.subscribe);
subscribeSubredditChip.setChipBackgroundColor(getResources().getColorStateList(R.color.colorPrimaryDark));
subscriptionReady = true;
}
}).execute();
FetchSubredditData.fetchSubredditData(mRetrofit, subredditName, new FetchSubredditData.FetchSubredditDataListener() { FetchSubredditData.fetchSubredditData(mRetrofit, subredditName, new FetchSubredditData.FetchSubredditDataListener() {
@Override @Override
public void onFetchSubredditDataSuccess(String response) { public void onFetchSubredditDataSuccess(String response) {
ParseSubredditData.parseComment(response, new ParseSubredditData.ParseSubredditDataListener() { ParseSubredditData.parseSubredditData(response, new ParseSubredditData.ParseSubredditDataListener() {
@Override @Override
public void onParseSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) { public void onParseSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) {
new InsertSubredditDataAsyncTask(SubredditRoomDatabase.getDatabase(ViewSubredditDetailActivity.this), subredditData) new InsertSubredditDataAsyncTask(SubredditRoomDatabase.getDatabase(ViewSubredditDetailActivity.this), subredditData)
@ -271,6 +331,10 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
} }
} }
private void makeSnackbar(int resId) {
Snackbar.make(coordinatorLayout, resId, Snackbar.LENGTH_SHORT).show();
}
private static class InsertSubredditDataAsyncTask extends AsyncTask<Void, Void, Void> { private static class InsertSubredditDataAsyncTask extends AsyncTask<Void, Void, Void> {
private SubredditDao mSubredditDao; private SubredditDao mSubredditDao;
@ -287,4 +351,40 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
return null; return null;
} }
} }
private static class CheckIsSubscribedToSubredditAsyncTask extends AsyncTask<Void, Void, Void> {
private SubscribedSubredditDao subscribedSubredditDao;
private String subredditName;
private SubscribedSubredditData subscribedSubredditData;
private CheckIsSubscribedToSubredditListener checkIsSubscribedToSubredditListener;
interface CheckIsSubscribedToSubredditListener {
void isSubscribed();
void isNotSubscribed();
}
CheckIsSubscribedToSubredditAsyncTask(SubscribedSubredditDao subscribedSubredditDao, String subredditName,
CheckIsSubscribedToSubredditListener checkIsSubscribedToSubredditListener) {
this.subscribedSubredditDao = subscribedSubredditDao;
this.subredditName =subredditName;
this.checkIsSubscribedToSubredditListener = checkIsSubscribedToSubredditListener;
}
@Override
protected Void doInBackground(Void... voids) {
subscribedSubredditData = subscribedSubredditDao.getSubscribedSubreddit(subredditName);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if(subscribedSubredditData != null) {
checkIsSubscribedToSubredditListener.isSubscribed();
} else {
checkIsSubscribedToSubredditListener.isNotSubscribed();
}
}
}
} }

View File

@ -47,6 +47,10 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:paddingTop="36dp"
android:paddingBottom="16dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:layout_below="@id/banner_image_view_view_subreddit_detail_activity" android:layout_below="@id/banner_image_view_view_subreddit_detail_activity"
android:background="@android:color/white"> android:background="@android:color/white">
@ -54,33 +58,45 @@
android:id="@+id/subreddit_name_text_view_view_subreddit_detail_activity" android:id="@+id/subreddit_name_text_view_view_subreddit_detail_activity"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="36dp" android:layout_marginBottom="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:textSize="18sp" android:textSize="18sp"
android:textColor="@color/colorAccent"/> android:textColor="@color/colorAccent"
android:layout_gravity="center_horizontal"/>
<android.support.design.chip.Chip
android:id="@+id/subscribe_subreddit_chip_view_subreddit_detail_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:layout_gravity="center_horizontal"/>
<!--<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="48dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp">
</RelativeLayout>-->
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="16dp"> android:layout_marginTop="16dp">
<TextView <TextView
android:id="@+id/subscriber_count_text_view_view_subreddit_detail_activity" android:id="@+id/subscriber_count_text_view_view_subreddit_detail_activity"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:textColor="@android:color/black"
android:layout_marginStart="16dp" android:layout_marginBottom="16dp"/>
android:layout_marginEnd="16dp"
android:textColor="@android:color/black" />
<TextView <TextView
android:id="@+id/online_subscriber_count_text_view_view_subreddit_detail_activity" android:id="@+id/online_subscriber_count_text_view_view_subreddit_detail_activity"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_toStartOf="@id/subscriber_count_text_view_view_subreddit_detail_activity" android:layout_toStartOf="@id/subscriber_count_text_view_view_subreddit_detail_activity"
android:textColor="@android:color/black" /> android:textColor="@android:color/black" />
@ -91,9 +107,6 @@
android:id="@+id/description_text_view_view_subreddit_detail_activity" android:id="@+id/description_text_view_view_subreddit_detail_activity"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:textColor="@android:color/black" android:textColor="@android:color/black"
android:visibility="gone"/> android:visibility="gone"/>

View File

@ -118,4 +118,11 @@
"For example, position the FAB to one side of stream of a cards so the FAB wont interfere " "For example, position the FAB to one side of stream of a cards so the FAB wont interfere "
"when a user tries to pick up one of cards.\n\n" "when a user tries to pick up one of cards.\n\n"
</string> </string>
<string name="subscribe">Subscribe</string>
<string name="unsubscribe">Unsubscribe</string>
<string name="subscribed">Subscribed</string>"
<string name="subscribe_failed">Subscribe Failed</string>
<string name="unsubscribed">Unsubscribed</string>"
<string name="unsubscribe_failed">Unsubscribe Failed</string>
</resources> </resources>