Anonymous subreddit subscription is available.

This commit is contained in:
Alex Ning 2021-03-04 22:45:41 +08:00
parent e8cb0d329c
commit 2ef72bc798
4 changed files with 166 additions and 104 deletions

View File

@ -817,15 +817,11 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
subscribeSubredditChip.setOnClickListener(view -> {
if (mAccessToken == null) {
Toast.makeText(ViewSubredditDetailActivity.this, R.string.login_first, Toast.LENGTH_SHORT).show();
return;
}
if (subscriptionReady) {
subscriptionReady = false;
if (getResources().getString(R.string.subscribe).contentEquals(subscribeSubredditChip.getText())) {
SubredditSubscription.subscribeToSubreddit(mOauthRetrofit, mRetrofit, mAccessToken,
subredditName, mAccountName, mRedditDataRoomDatabase,
SubredditSubscription.anonymousSubscribeToSubreddit(mExecutor, new Handler(),
mRetrofit, mRedditDataRoomDatabase, subredditName,
new SubredditSubscription.SubredditSubscriptionListener() {
@Override
public void onSubredditSubscriptionSuccess() {
@ -842,8 +838,8 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
}
});
} else {
SubredditSubscription.unsubscribeToSubreddit(mOauthRetrofit, mAccessToken,
subredditName, mAccountName, mRedditDataRoomDatabase,
SubredditSubscription.anonymousUnsubscribeToSubreddit(mExecutor, new Handler(),
mRedditDataRoomDatabase, subredditName,
new SubredditSubscription.SubredditSubscriptionListener() {
@Override
public void onSubredditSubscriptionSuccess() {
@ -861,6 +857,48 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
});
}
}
} else {
if (subscriptionReady) {
subscriptionReady = false;
if (getResources().getString(R.string.subscribe).contentEquals(subscribeSubredditChip.getText())) {
SubredditSubscription.subscribeToSubreddit(mExecutor, new Handler(), mOauthRetrofit,
mRetrofit, mAccessToken, subredditName, mAccountName, mRedditDataRoomDatabase,
new SubredditSubscription.SubredditSubscriptionListener() {
@Override
public void onSubredditSubscriptionSuccess() {
subscribeSubredditChip.setText(R.string.unsubscribe);
subscribeSubredditChip.setChipBackgroundColor(ColorStateList.valueOf(subscribedColor));
makeSnackbar(R.string.subscribed, false);
subscriptionReady = true;
}
@Override
public void onSubredditSubscriptionFail() {
makeSnackbar(R.string.subscribe_failed, false);
subscriptionReady = true;
}
});
} else {
SubredditSubscription.unsubscribeToSubreddit(mExecutor, new Handler(), mOauthRetrofit,
mAccessToken, subredditName, mAccountName, mRedditDataRoomDatabase,
new SubredditSubscription.SubredditSubscriptionListener() {
@Override
public void onSubredditSubscriptionSuccess() {
subscribeSubredditChip.setText(R.string.subscribe);
subscribeSubredditChip.setChipBackgroundColor(ColorStateList.valueOf(unsubscribedColor));
makeSnackbar(R.string.unsubscribed, false);
subscriptionReady = true;
}
@Override
public void onSubredditSubscriptionFail() {
makeSnackbar(R.string.unsubscribe_failed, false);
subscriptionReady = true;
}
});
}
}
}
});
CheckIsSubscribedToSubreddit.checkIsSubscribedToSubreddit(mExecutor, new Handler(),

View File

@ -155,8 +155,9 @@ public class SubredditListingRecyclerViewAdapter extends PagedListAdapter<Subred
public void isNotSubscribed() {
((DataViewHolder) holder).subscribeButton.setVisibility(View.VISIBLE);
((DataViewHolder) holder).subscribeButton.setOnClickListener(view -> {
SubredditSubscription.subscribeToSubreddit(oauthRetrofit, retrofit,
accessToken, subredditData.getName(), accountName, redditDataRoomDatabase,
SubredditSubscription.subscribeToSubreddit(executor, new Handler(),
oauthRetrofit, retrofit, accessToken, subredditData.getName(),
accountName, redditDataRoomDatabase,
new SubredditSubscription.SubredditSubscriptionListener() {
@Override
public void onSubredditSubscriptionSuccess() {

View File

@ -1,39 +1,77 @@
package ml.docilealligator.infinityforreddit.subreddit;
import android.os.AsyncTask;
import android.os.Handler;
import androidx.annotation.NonNull;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executor;
import ml.docilealligator.infinityforreddit.apis.RedditAPI;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.apis.RedditAPI;
import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubredditData;
import ml.docilealligator.infinityforreddit.utils.APIUtils;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class SubredditSubscription {
public static void subscribeToSubreddit(Retrofit oauthRetrofit, Retrofit retrofit,
public static void subscribeToSubreddit(Executor executor, Handler handler, Retrofit oauthRetrofit,
Retrofit retrofit, String accessToken, String subredditName,
String accountName, RedditDataRoomDatabase redditDataRoomDatabase,
SubredditSubscriptionListener subredditSubscriptionListener) {
subredditSubscription(executor, handler, oauthRetrofit, retrofit, accessToken, subredditName,
accountName, "sub", redditDataRoomDatabase, subredditSubscriptionListener);
}
public static void anonymousSubscribeToSubreddit(Executor executor, Handler handler, Retrofit retrofit,
RedditDataRoomDatabase redditDataRoomDatabase,
String subredditName,
SubredditSubscriptionListener subredditSubscriptionListener) {
retrofit.create(RedditAPI.class).getSubredditData(subredditName).enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) {
FetchSubredditData.fetchSubredditData(retrofit, subredditName, new FetchSubredditData.FetchSubredditDataListener() {
@Override
public void onFetchSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) {
insertSubscription(executor, handler, redditDataRoomDatabase,
subredditData, "-", subredditSubscriptionListener);
}
@Override
public void onFetchSubredditDataFail(boolean isQuarantined) {
}
});
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
subredditSubscriptionListener.onSubredditSubscriptionFail();
}
});
}
public static void unsubscribeToSubreddit(Executor executor, Handler handler, Retrofit oauthRetrofit,
String accessToken, String subredditName, String accountName,
RedditDataRoomDatabase redditDataRoomDatabase,
SubredditSubscriptionListener subredditSubscriptionListener) {
subredditSubscription(oauthRetrofit, retrofit, accessToken, subredditName, accountName, "sub",
redditDataRoomDatabase, subredditSubscriptionListener);
subredditSubscription(executor, handler, oauthRetrofit, null, accessToken, subredditName,
accountName, "unsub", redditDataRoomDatabase, subredditSubscriptionListener);
}
public static void unsubscribeToSubreddit(Retrofit oauthRetrofit, String accessToken,
String subredditName, String accountName,
public static void anonymousUnsubscribeToSubreddit(Executor executor, Handler handler,
RedditDataRoomDatabase redditDataRoomDatabase,
String subredditName,
SubredditSubscriptionListener subredditSubscriptionListener) {
subredditSubscription(oauthRetrofit, null, accessToken, subredditName, accountName, "unsub",
redditDataRoomDatabase, subredditSubscriptionListener);
removeSubscription(executor, handler, redditDataRoomDatabase, subredditName, "-", subredditSubscriptionListener);
}
private static void subredditSubscription(Retrofit oauthRetrofit, Retrofit retrofit, String accessToken,
String subredditName, String accountName, String action,
private static void subredditSubscription(Executor executor, Handler handler, Retrofit oauthRetrofit,
Retrofit retrofit, String accessToken, String subredditName,
String accountName, String action,
RedditDataRoomDatabase redditDataRoomDatabase,
SubredditSubscriptionListener subredditSubscriptionListener) {
RedditAPI api = oauthRetrofit.create(RedditAPI.class);
@ -51,8 +89,8 @@ public class SubredditSubscription {
FetchSubredditData.fetchSubredditData(retrofit, subredditName, new FetchSubredditData.FetchSubredditDataListener() {
@Override
public void onFetchSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) {
new UpdateSubscriptionAsyncTask(redditDataRoomDatabase,
subredditData, accountName, true).execute();
insertSubscription(executor, handler, redditDataRoomDatabase,
subredditData, accountName, subredditSubscriptionListener);
}
@Override
@ -61,9 +99,9 @@ public class SubredditSubscription {
}
});
} else {
new UpdateSubscriptionAsyncTask(redditDataRoomDatabase, subredditName, accountName, false).execute();
removeSubscription(executor, handler, redditDataRoomDatabase, subredditName,
accountName, subredditSubscriptionListener);
}
subredditSubscriptionListener.onSubredditSubscriptionSuccess();
} else {
subredditSubscriptionListener.onSubredditSubscriptionFail();
}
@ -82,39 +120,25 @@ public class SubredditSubscription {
void onSubredditSubscriptionFail();
}
private static class UpdateSubscriptionAsyncTask extends AsyncTask<Void, Void, Void> {
private RedditDataRoomDatabase redditDataRoomDatabase;
private String subredditName;
private String accountName;
private SubscribedSubredditData subscribedSubredditData;
private boolean isSubscribing;
UpdateSubscriptionAsyncTask(RedditDataRoomDatabase redditDataRoomDatabase, String subredditName,
String accountName, boolean isSubscribing) {
this.redditDataRoomDatabase = redditDataRoomDatabase;
this.subredditName = subredditName;
this.accountName = accountName;
this.isSubscribing = isSubscribing;
}
UpdateSubscriptionAsyncTask(RedditDataRoomDatabase redditDataRoomDatabase, SubredditData subredditData,
String accountName, boolean isSubscribing) {
this.redditDataRoomDatabase = redditDataRoomDatabase;
this.subscribedSubredditData = new SubscribedSubredditData(subredditData.getId(), subredditData.getName(),
private static void insertSubscription(Executor executor, Handler handler,
RedditDataRoomDatabase redditDataRoomDatabase,
SubredditData subredditData, String accountName,
SubredditSubscriptionListener subredditSubscriptionListener) {
executor.execute(() -> {
SubscribedSubredditData subscribedSubredditData = new SubscribedSubredditData(subredditData.getId(), subredditData.getName(),
subredditData.getIconUrl(), accountName, false);
this.accountName = accountName;
this.isSubscribing = isSubscribing;
redditDataRoomDatabase.subscribedSubredditDao().insert(subscribedSubredditData);
handler.post(subredditSubscriptionListener::onSubredditSubscriptionSuccess);
});
}
@Override
protected Void doInBackground(Void... voids) {
if (isSubscribing) {
redditDataRoomDatabase.subscribedSubredditDao().insert(subscribedSubredditData);
} else {
private static void removeSubscription(Executor executor, Handler handler,
RedditDataRoomDatabase redditDataRoomDatabase,
String subredditName, String accountName,
SubredditSubscriptionListener subredditSubscriptionListener) {
executor.execute(() -> {
redditDataRoomDatabase.subscribedSubredditDao().deleteSubscribedSubreddit(subredditName, accountName);
}
return null;
}
handler.post(subredditSubscriptionListener::onSubredditSubscriptionSuccess);
});
}
}

View File

@ -1,23 +1,9 @@
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:application="ml.docilealligator.infinityforreddit.fragments.PostFragment">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout_post_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ml.docilealligator.infinityforreddit.customviews.CustomToroContainer
android:id="@+id/recycler_view_post_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<LinearLayout
android:id="@+id/fetch_post_info_linear_layout_post_fragment"
android:layout_width="match_parent"
@ -44,4 +30,17 @@
</LinearLayout>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_layout_post_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ml.docilealligator.infinityforreddit.customviews.CustomToroContainer
android:id="@+id/recycler_view_post_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>