mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2025-02-10 00:18:44 +01:00
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:
parent
9d729579bf
commit
38be0ba01f
BIN
.idea/caches/build_file_checksums.ser
generated
BIN
.idea/caches/build_file_checksums.ser
generated
Binary file not shown.
@ -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"
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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() {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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";
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
package ml.docilealligator.infinityforreddit;
|
|
||||||
|
|
||||||
interface LastItemSynchronizer {
|
|
||||||
void lastItemChanged(String lastItem);
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
package ml.docilealligator.infinityforreddit;
|
|
||||||
|
|
||||||
interface PaginationNotifier {
|
|
||||||
void LoadMorePostSuccess();
|
|
||||||
void LoadMorePostFail();
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
package ml.docilealligator.infinityforreddit;
|
|
||||||
|
|
||||||
interface PaginationRetryNotifier {
|
|
||||||
void retry();
|
|
||||||
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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")) {
|
||||||
|
@ -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));
|
||||||
|
@ -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,29 +218,20 @@ 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
|
|
||||||
public void onClick(View view) {
|
|
||||||
if(canStartActivity) {
|
if(canStartActivity) {
|
||||||
canStartActivity = false;
|
canStartActivity = false;
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
if(post.getAuthorIconUrl() == null) {
|
if(post.getAuthorIconUrl() == null) {
|
||||||
@ -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
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(mContext, ViewImageActivity.class);
|
Intent intent = new Intent(mContext, ViewImageActivity.class);
|
||||||
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, imageUrl);
|
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, imageUrl);
|
||||||
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
|
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
|
||||||
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName.substring(2)
|
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditNamePrefixed.substring(2)
|
||||||
+ "-" + id.substring(3));
|
+ "-" + id.substring(3));
|
||||||
mContext.startActivity(intent);
|
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
||||||
// add share action to menu list
|
// add share action to menu list
|
||||||
builder.addDefaultShareMenuItem();
|
builder.addDefaultShareMenuItem();
|
||||||
builder.setToolbarColor(mContext.getResources().getColor(R.color.colorPrimary));
|
builder.setToolbarColor(mContext.getResources().getColor(R.color.colorPrimary));
|
||||||
CustomTabsIntent customTabsIntent = builder.build();
|
CustomTabsIntent customTabsIntent = builder.build();
|
||||||
customTabsIntent.launchUrl(mContext, Uri.parse(post.getUrl()));
|
customTabsIntent.launchUrl(mContext, Uri.parse(post.getUrl()));
|
||||||
}
|
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case Post.GIF_VIDEO_TYPE:
|
case Post.GIF_VIDEO_TYPE:
|
||||||
@ -407,9 +393,7 @@ 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
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(mContext, ViewVideoActivity.class);
|
Intent intent = new Intent(mContext, ViewVideoActivity.class);
|
||||||
intent.setData(gifVideoUri);
|
intent.setData(gifVideoUri);
|
||||||
intent.putExtra(ViewVideoActivity.TITLE_KEY, title);
|
intent.putExtra(ViewVideoActivity.TITLE_KEY, title);
|
||||||
@ -417,11 +401,10 @@ 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);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
||||||
// add share action to menu list
|
// add share action to menu list
|
||||||
builder.addDefaultShareMenuItem();
|
builder.addDefaultShareMenuItem();
|
||||||
builder.setToolbarColor(mContext.getResources().getColor(R.color.colorPrimary));
|
builder.setToolbarColor(mContext.getResources().getColor(R.color.colorPrimary));
|
||||||
CustomTabsIntent customTabsIntent = builder.build();
|
CustomTabsIntent customTabsIntent = builder.build();
|
||||||
customTabsIntent.launchUrl(mContext, Uri.parse(noPreviewLinkUrl));
|
customTabsIntent.launchUrl(mContext, Uri.parse(noPreviewLinkUrl));
|
||||||
}
|
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case Post.TEXT_TYPE:
|
case Post.TEXT_TYPE:
|
||||||
@ -465,9 +445,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
((DataViewHolder) holder).upvoteButton.setOnClickListener(new View.OnClickListener() {
|
((DataViewHolder) holder).upvoteButton.setOnClickListener(view -> {
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
final boolean isDownvotedBefore = ((DataViewHolder) holder).downvoteButton.getColorFilter() != null;
|
final boolean isDownvotedBefore = ((DataViewHolder) holder).downvoteButton.getColorFilter() != null;
|
||||||
|
|
||||||
final ColorFilter downvoteButtonColorFilter = ((DataViewHolder) holder).downvoteButton.getColorFilter();
|
final ColorFilter downvoteButtonColorFilter = ((DataViewHolder) holder).downvoteButton.getColorFilter();
|
||||||
@ -483,7 +461,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
|
|
||||||
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(1);
|
post.setVoteType(1);
|
||||||
if(isDownvotedBefore) {
|
if(isDownvotedBefore) {
|
||||||
post.setScore(post.getScore() + 2);
|
post.setScore(post.getScore() + 2);
|
||||||
@ -493,7 +471,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onVoteThingFail(int position) {
|
public void onVoteThingFail(int position1) {
|
||||||
Toast.makeText(mContext, "Cannot upvote this post", Toast.LENGTH_SHORT).show();
|
Toast.makeText(mContext, "Cannot upvote this post", Toast.LENGTH_SHORT).show();
|
||||||
((DataViewHolder) holder).upvoteButton.clearColorFilter();
|
((DataViewHolder) holder).upvoteButton.clearColorFilter();
|
||||||
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
|
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
|
||||||
@ -507,13 +485,13 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
|
|
||||||
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(0);
|
||||||
post.setScore(post.getScore() - 1);
|
post.setScore(post.getScore() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onVoteThingFail(int position) {
|
public void onVoteThingFail(int position1) {
|
||||||
Toast.makeText(mContext, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
|
Toast.makeText(mContext, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
|
||||||
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + 1));
|
((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);
|
((DataViewHolder) holder).upvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.colorPrimary), android.graphics.PorterDuff.Mode.SRC_IN);
|
||||||
@ -521,12 +499,9 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
}
|
}
|
||||||
}, id, RedditUtils.DIR_UNVOTE, holder.getAdapterPosition());
|
}, id, RedditUtils.DIR_UNVOTE, holder.getAdapterPosition());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
((DataViewHolder) holder).downvoteButton.setOnClickListener(new View.OnClickListener() {
|
((DataViewHolder) holder).downvoteButton.setOnClickListener(view -> {
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
final boolean isUpvotedBefore = ((DataViewHolder) holder).upvoteButton.getColorFilter() != null;
|
final boolean isUpvotedBefore = ((DataViewHolder) holder).upvoteButton.getColorFilter() != null;
|
||||||
|
|
||||||
final ColorFilter upvoteButtonColorFilter = ((DataViewHolder) holder).upvoteButton.getColorFilter();
|
final ColorFilter upvoteButtonColorFilter = ((DataViewHolder) holder).upvoteButton.getColorFilter();
|
||||||
@ -541,7 +516,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
|
|
||||||
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 position12) {
|
||||||
post.setVoteType(-1);
|
post.setVoteType(-1);
|
||||||
if(isUpvotedBefore) {
|
if(isUpvotedBefore) {
|
||||||
post.setScore(post.getScore() - 2);
|
post.setScore(post.getScore() - 2);
|
||||||
@ -551,7 +526,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onVoteThingFail(int position) {
|
public void onVoteThingFail(int position12) {
|
||||||
Toast.makeText(mContext, "Cannot downvote this post", Toast.LENGTH_SHORT).show();
|
Toast.makeText(mContext, "Cannot downvote this post", Toast.LENGTH_SHORT).show();
|
||||||
((DataViewHolder) holder).downvoteButton.clearColorFilter();
|
((DataViewHolder) holder).downvoteButton.clearColorFilter();
|
||||||
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
|
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
|
||||||
@ -565,13 +540,13 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
|
|
||||||
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 position12) {
|
||||||
post.setVoteType(0);
|
post.setVoteType(0);
|
||||||
post.setScore(post.getScore());
|
post.setScore(post.getScore());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onVoteThingFail(int position) {
|
public void onVoteThingFail(int position12) {
|
||||||
Toast.makeText(mContext, "Cannot unvote this post", Toast.LENGTH_SHORT).show();
|
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).downvoteButton.setColorFilter(ContextCompat.getColor(mContext, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
|
||||||
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
|
((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore()));
|
||||||
@ -579,18 +554,14 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
|||||||
}
|
}
|
||||||
}, id, RedditUtils.DIR_UNVOTE, holder.getAdapterPosition());
|
}, id, RedditUtils.DIR_UNVOTE, holder.getAdapterPosition());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
((DataViewHolder) holder).shareButton.setOnClickListener(new View.OnClickListener() {
|
((DataViewHolder) holder).shareButton.setOnClickListener(view -> {
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
intent.setType("text/plain");
|
intent.setType("text/plain");
|
||||||
String extraText = title + "\n" + permalink;
|
String extraText = title + "\n" + permalink;
|
||||||
intent.putExtra(Intent.EXTRA_TEXT, extraText);
|
intent.putExtra(Intent.EXTRA_TEXT, extraText);
|
||||||
mContext.startActivity(Intent.createChooser(intent, "Share"));
|
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
((DataViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
|
((DataViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
|
||||||
((DataViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
|
((DataViewHolder) holder).errorRelativeLayout.setVisibility(View.GONE);
|
||||||
loadImage(holder, post);
|
loadImage(holder, post);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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, "");
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -50,18 +50,13 @@ 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
|
|
||||||
public void onClick(View view) {
|
|
||||||
if(viewHolder.getAdapterPosition() >= 0) {
|
if(viewHolder.getAdapterPosition() >= 0) {
|
||||||
mOnItemClickListener.onClick();
|
mOnItemClickListener.onClick();
|
||||||
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
|
Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class);
|
||||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, mSubscribedSubredditData.get(viewHolder.getAdapterPosition()).getName());
|
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);
|
mContext.startActivity(intent);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
if(!mSubscribedSubredditData.get(i).getIconUrl().equals("")) {
|
if(!mSubscribedSubredditData.get(i).getIconUrl().equals("")) {
|
||||||
glide.load(mSubscribedSubredditData.get(i).getIconUrl())
|
glide.load(mSubscribedSubredditData.get(i).getIconUrl())
|
||||||
|
@ -123,9 +123,7 @@ 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
|
|
||||||
public void loadIconSuccess(String iconImageUrl) {
|
|
||||||
if(!iconImageUrl.equals("")) {
|
if(!iconImageUrl.equals("")) {
|
||||||
Glide.with(ViewPostDetailActivity.this).load(iconImageUrl)
|
Glide.with(ViewPostDetailActivity.this).load(iconImageUrl)
|
||||||
.into(mSubredditIconCircleImageView);
|
.into(mSubredditIconCircleImageView);
|
||||||
@ -135,7 +133,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mPost.setSubredditIconUrl(iconImageUrl);
|
mPost.setSubredditIconUrl(iconImageUrl);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
mLoadSubredditIconAsyncTask.execute();
|
mLoadSubredditIconAsyncTask.execute();
|
||||||
} else if(!mPost.getSubredditIconUrl().equals("")) {
|
} else if(!mPost.getSubredditIconUrl().equals("")) {
|
||||||
@ -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
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(ViewPostDetailActivity.this, ViewSubredditDetailActivity.class);
|
Intent intent = new Intent(ViewPostDetailActivity.this, ViewSubredditDetailActivity.class);
|
||||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
|
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
|
||||||
mPost.getSubredditNamePrefixed().substring(2));
|
mPost.getSubredditNamePrefixed().substring(2));
|
||||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY,
|
|
||||||
mPost.getSubredditNamePrefixed());
|
|
||||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false);
|
|
||||||
startActivity(intent);
|
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(ViewPostDetailActivity.this, ViewSubredditDetailActivity.class);
|
Intent intent = new Intent(ViewPostDetailActivity.this, ViewSubredditDetailActivity.class);
|
||||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
|
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY,
|
||||||
mPost.getSubredditNamePrefixed().substring(2));
|
mPost.getSubredditNamePrefixed().substring(2));
|
||||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_VALUE_KEY,
|
|
||||||
mPost.getSubredditNamePrefixed());
|
|
||||||
intent.putExtra(ViewSubredditDetailActivity.EXTRA_QUERY_BY_ID_KEY, false);
|
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
mPostTimeTextView.setText(mPost.getPostTime());
|
mPostTimeTextView.setText(mPost.getPostTime());
|
||||||
@ -212,54 +197,43 @@ 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
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
intent.setType("text/plain");
|
intent.setType("text/plain");
|
||||||
String extraText = mPost.getTitle() + "\n" + mPost.getPermalink();
|
String extraText = mPost.getTitle() + "\n" + mPost.getPermalink();
|
||||||
intent.putExtra(Intent.EXTRA_TEXT, extraText);
|
intent.putExtra(Intent.EXTRA_TEXT, extraText);
|
||||||
startActivity(Intent.createChooser(intent, "Share"));
|
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(ViewPostDetailActivity.this, ViewImageActivity.class);
|
Intent intent = new Intent(ViewPostDetailActivity.this, ViewImageActivity.class);
|
||||||
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, mPost.getUrl());
|
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, mPost.getUrl());
|
||||||
intent.putExtra(ViewImageActivity.TITLE_KEY, mPost.getTitle());
|
intent.putExtra(ViewImageActivity.TITLE_KEY, mPost.getTitle());
|
||||||
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, mPost.getSubredditNamePrefixed().substring(2)
|
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, mPost.getSubredditNamePrefixed().substring(2)
|
||||||
+ "-" + mPost.getId().substring(3));
|
+ "-" + mPost.getId().substring(3));
|
||||||
startActivity(intent);
|
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
||||||
// add share action to menu list
|
// add share action to menu list
|
||||||
builder.addDefaultShareMenuItem();
|
builder.addDefaultShareMenuItem();
|
||||||
builder.setToolbarColor(getResources().getColor(R.color.colorPrimary));
|
builder.setToolbarColor(getResources().getColor(R.color.colorPrimary));
|
||||||
CustomTabsIntent customTabsIntent = builder.build();
|
CustomTabsIntent customTabsIntent = builder.build();
|
||||||
customTabsIntent.launchUrl(ViewPostDetailActivity.this, Uri.parse(mPost.getUrl()));
|
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class);
|
Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class);
|
||||||
intent.setData(gifVideoUri);
|
intent.setData(gifVideoUri);
|
||||||
intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle());
|
intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle());
|
||||||
@ -271,16 +245,13 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
intent.putExtra(ViewVideoActivity.ID_KEY, mPost.getId());
|
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class);
|
Intent intent = new Intent(ViewPostDetailActivity.this, ViewVideoActivity.class);
|
||||||
intent.setData(videoUri);
|
intent.setData(videoUri);
|
||||||
intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle());
|
intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle());
|
||||||
@ -292,7 +263,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
intent.putExtra(ViewVideoActivity.ID_KEY, mPost.getId());
|
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
|
||||||
// add share action to menu list
|
// add share action to menu list
|
||||||
builder.addDefaultShareMenuItem();
|
builder.addDefaultShareMenuItem();
|
||||||
builder.setToolbarColor(getResources().getColor(R.color.colorPrimary));
|
builder.setToolbarColor(getResources().getColor(R.color.colorPrimary));
|
||||||
CustomTabsIntent customTabsIntent = builder.build();
|
CustomTabsIntent customTabsIntent = builder.build();
|
||||||
customTabsIntent.launchUrl(ViewPostDetailActivity.this, Uri.parse(mPost.getUrl()));
|
customTabsIntent.launchUrl(ViewPostDetailActivity.this, Uri.parse(mPost.getUrl()));
|
||||||
}
|
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case Post.TEXT_TYPE:
|
case Post.TEXT_TYPE:
|
||||||
@ -324,10 +291,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
queryComment();
|
queryComment();
|
||||||
|
|
||||||
mUpvoteButton.setOnClickListener(new View.OnClickListener() {
|
mUpvoteButton.setOnClickListener(view -> {
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
//observable.subscribe(observer);
|
|
||||||
final boolean isDownvotedBefore = mDownvoteButton.getColorFilter() != null;
|
final boolean isDownvotedBefore = mDownvoteButton.getColorFilter() != null;
|
||||||
|
|
||||||
final ColorFilter downVoteButtonColorFilter = mDownvoteButton.getColorFilter();
|
final ColorFilter downVoteButtonColorFilter = mDownvoteButton.getColorFilter();
|
||||||
@ -381,13 +345,9 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
}, mPost.getFullName(), RedditUtils.DIR_UNVOTE);
|
}, mPost.getFullName(), RedditUtils.DIR_UNVOTE);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
mDownvoteButton.setOnClickListener(new View.OnClickListener() {
|
mDownvoteButton.setOnClickListener(view -> {
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
//observable.subscribe(observer);
|
|
||||||
final boolean isUpvotedBefore = mUpvoteButton.getColorFilter() != null;
|
final boolean isUpvotedBefore = mUpvoteButton.getColorFilter() != null;
|
||||||
|
|
||||||
final ColorFilter upvoteButtonColorFilter = mUpvoteButton.getColorFilter();
|
final ColorFilter upvoteButtonColorFilter = mUpvoteButton.getColorFilter();
|
||||||
@ -441,7 +401,6 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
}, mPost.getFullName(), RedditUtils.DIR_UNVOTE);
|
}, 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
|
|
||||||
public void onClick(View view) {
|
|
||||||
mLoadImageProgressBar.setVisibility(View.VISIBLE);
|
mLoadImageProgressBar.setVisibility(View.VISIBLE);
|
||||||
mLoadImageErrorTextView.setVisibility(View.GONE);
|
mLoadImageErrorTextView.setVisibility(View.GONE);
|
||||||
loadImage();
|
loadImage();
|
||||||
}
|
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -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,34 +135,25 @@ 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
|
|
||||||
public void onChanged(@Nullable final SubredditData subredditData) {
|
|
||||||
if(subredditData != null) {
|
if(subredditData != null) {
|
||||||
if(subredditData.getBannerUrl().equals("")) {
|
if(subredditData.getBannerUrl().equals("")) {
|
||||||
iconGifImageView.setOnClickListener(new View.OnClickListener() {
|
iconGifImageView.setOnClickListener(view -> {
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
//Do nothing as it has no image
|
//Do nothing as it has no image
|
||||||
}
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
glide.load(subredditData.getBannerUrl()).into(bannerImageView);
|
glide.load(subredditData.getBannerUrl()).into(bannerImageView);
|
||||||
bannerImageView.setOnClickListener(new View.OnClickListener() {
|
bannerImageView.setOnClickListener(view -> {
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
|
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
|
||||||
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
|
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
|
||||||
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getBannerUrl());
|
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getBannerUrl());
|
||||||
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-banner");
|
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-banner");
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,11 +161,8 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
|
|||||||
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
|
|
||||||
public void onClick(View view) {
|
|
||||||
//Do nothing as it is a default icon
|
//Do nothing as it is a default icon
|
||||||
}
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
glide.load(subredditData.getIconUrl())
|
glide.load(subredditData.getIconUrl())
|
||||||
@ -180,19 +185,17 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.into(iconGifImageView);
|
.into(iconGifImageView);
|
||||||
iconGifImageView.setOnClickListener(new View.OnClickListener() {
|
iconGifImageView.setOnClickListener(view -> {
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
|
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
|
||||||
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
|
intent.putExtra(ViewImageActivity.TITLE_KEY, title);
|
||||||
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getIconUrl());
|
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getIconUrl());
|
||||||
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-icon");
|
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-icon");
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
subredditNameTextView.setText(subredditData.getName());
|
String subredditFullName = "r/" + subredditData.getName();
|
||||||
|
subredditNameTextView.setText(subredditFullName);
|
||||||
String nSubscribers = getString(R.string.subscribers_number_detail, subredditData.getNSubscribers());
|
String nSubscribers = getString(R.string.subscribers_number_detail, subredditData.getNSubscribers());
|
||||||
nSubscribersTextView.setText(nSubscribers);
|
nSubscribersTextView.setText(nSubscribers);
|
||||||
if(subredditData.getDescription().equals("")) {
|
if(subredditData.getDescription().equals("")) {
|
||||||
@ -202,13 +205,70 @@ public class ViewSubredditDetailActivity extends AppCompatActivity {
|
|||||||
descriptionTextView.setText(subredditData.getDescription());
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"/>
|
||||||
|
|
||||||
|
@ -118,4 +118,11 @@
|
|||||||
"For example, position the FAB to one side of stream of a cards so the FAB won’t interfere "
|
"For example, position the FAB to one side of stream of a cards so the FAB won’t 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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user