diff options
Diffstat (limited to 'app/src/main/java/ml')
38 files changed, 884 insertions, 506 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AccessTokenAuthenticator.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AccessTokenAuthenticator.java index 2aebbd52..0c568a06 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AccessTokenAuthenticator.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AccessTokenAuthenticator.java @@ -1,8 +1,10 @@ package ml.docilealligator.infinityforreddit; -import android.content.SharedPreferences; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + import org.json.JSONException; import org.json.JSONObject; @@ -10,8 +12,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; +import Account.Account; import okhttp3.Authenticator; import okhttp3.Headers; import okhttp3.Request; @@ -22,37 +23,38 @@ import retrofit2.Retrofit; class AccessTokenAuthenticator implements Authenticator { private Retrofit mRetrofit; - private SharedPreferences mAuthInfoSharedPreferences; + private RedditDataRoomDatabase mRedditDataRoomDatabase; - AccessTokenAuthenticator(Retrofit retrofit, SharedPreferences authInfoSharedPreferences) { + AccessTokenAuthenticator(Retrofit retrofit, RedditDataRoomDatabase accountRoomDatabase) { mRetrofit = retrofit; - mAuthInfoSharedPreferences = authInfoSharedPreferences; + mRedditDataRoomDatabase = accountRoomDatabase; } @Nullable @Override - public Request authenticate(@NonNull Route route, @NonNull Response response) { + public Request authenticate(Route route, @NonNull Response response) { if (response.code() == 401) { String accessToken = response.request().header(RedditUtils.AUTHORIZATION_KEY).substring(RedditUtils.AUTHORIZATION_BASE.length()); synchronized (this) { - String accessTokenFromSharedPreferences = mAuthInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); - if (accessToken.equals(accessTokenFromSharedPreferences)) { - String newAccessToken = refreshAccessToken(); + Account account = mRedditDataRoomDatabase.accountDao().getCurrentAccount(); + String accessTokenFromDatabase = account.getAccessToken(); + if (accessToken.equals(accessTokenFromDatabase)) { + String newAccessToken = refreshAccessToken(account); if (!newAccessToken.equals("")) { return response.request().newBuilder().headers(Headers.of(RedditUtils.getOAuthHeader(newAccessToken))).build(); } else { return null; } } else { - return response.request().newBuilder().headers(Headers.of(RedditUtils.getOAuthHeader(accessTokenFromSharedPreferences))).build(); + return response.request().newBuilder().headers(Headers.of(RedditUtils.getOAuthHeader(accessTokenFromDatabase))).build(); } } } return null; } - private String refreshAccessToken() { - String refreshToken = mAuthInfoSharedPreferences.getString(SharedPreferencesUtils.REFRESH_TOKEN_KEY, ""); + private String refreshAccessToken(Account account) { + String refreshToken = mRedditDataRoomDatabase.accountDao().getCurrentAccount().getRefreshToken(); RedditAPI api = mRetrofit.create(RedditAPI.class); @@ -63,11 +65,14 @@ class AccessTokenAuthenticator implements Authenticator { Call<String> accessTokenCall = api.getAccessToken(RedditUtils.getHttpBasicAuthHeader(), params); try { retrofit2.Response response = accessTokenCall.execute(); - JSONObject jsonObject = new JSONObject((String) response.body()); + if(response.body() == null) { + return ""; + } + JSONObject jsonObject = new JSONObject((String) response.body()); String newAccessToken = jsonObject.getString(RedditUtils.ACCESS_TOKEN_KEY); - - mAuthInfoSharedPreferences.edit().putString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, newAccessToken).apply(); + account.setAccessToken(newAccessToken); + mRedditDataRoomDatabase.accountDao().insert(account); Log.i("access token", newAccessToken); return newAccessToken; diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java index 3f93717a..12997920 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java @@ -26,4 +26,8 @@ interface AppComponent { void inject(RulesActivity rulesActivity); void inject(CommentsListingFragment commentsListingFragment); void inject(SubmitPostService submitPostService); + void inject(FilteredPostsActivity filteredPostsActivity); + void inject(SearchResultActivity searchResultActivity); + void inject(SearchSubredditsResultActivity searchSubredditsResultActivity); + void inject(FollowedUsersListingFragment followedUsersListingFragment); } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java index d690b164..76afe22c 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java @@ -60,9 +60,9 @@ class AppModule { @Provides @Singleton - OkHttpClient provideOkHttpClient(@Named("no_oauth") Retrofit retrofit, @Named("auth_info") SharedPreferences sharedPreferences) { + OkHttpClient provideOkHttpClient(@Named("no_oauth") Retrofit retrofit, RedditDataRoomDatabase accountRoomDatabase) { OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder(); - okHttpClientBuilder.authenticator(new AccessTokenAuthenticator(retrofit, sharedPreferences)); + okHttpClientBuilder.authenticator(new AccessTokenAuthenticator(retrofit, accountRoomDatabase)); return okHttpClientBuilder.build(); } @@ -76,4 +76,10 @@ class AppModule { SharedPreferences provideUserInfoSharedPreferences() { return mApplication.getSharedPreferences(SharedPreferencesUtils.USER_INFO_FILE_KEY, Context.MODE_PRIVATE); } + + @Provides + @Singleton + RedditDataRoomDatabase provideRedditDataRoomDatabase() { + return RedditDataRoomDatabase.getDatabase(mApplication); + } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CheckIsFollowingUserAsyncTask.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CheckIsFollowingUserAsyncTask.java index 4d75d155..cc4f75af 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CheckIsFollowingUserAsyncTask.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CheckIsFollowingUserAsyncTask.java @@ -7,7 +7,8 @@ import SubscribedUserDatabase.SubscribedUserData; public class CheckIsFollowingUserAsyncTask extends AsyncTask<Void, Void, Void> { private SubscribedUserDao subscribedUserDao; - private String userName; + private String username; + private String accountName; private SubscribedUserData subscribedUserData; private CheckIsFollowingUserListener checkIsFollowingUserListener; @@ -16,16 +17,17 @@ public class CheckIsFollowingUserAsyncTask extends AsyncTask<Void, Void, Void> { void isNotSubscribed(); } - CheckIsFollowingUserAsyncTask(SubscribedUserDao subscribedUserDao, String userName, + CheckIsFollowingUserAsyncTask(SubscribedUserDao subscribedUserDao, String username, String accountName, CheckIsFollowingUserListener checkIsFollowingUserListener) { this.subscribedUserDao = subscribedUserDao; - this.userName = userName; + this.username = username; + this.accountName = accountName; this.checkIsFollowingUserListener = checkIsFollowingUserListener; } @Override protected Void doInBackground(Void... voids) { - subscribedUserData = subscribedUserDao.getSubscribedUser(userName); + subscribedUserData = subscribedUserDao.getSubscribedUser(username, accountName); return null; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CheckIsSubscribedToSubredditAsyncTask.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CheckIsSubscribedToSubredditAsyncTask.java index d1cf3cf1..ee78c566 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CheckIsSubscribedToSubredditAsyncTask.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CheckIsSubscribedToSubredditAsyncTask.java @@ -9,6 +9,7 @@ class CheckIsSubscribedToSubredditAsyncTask extends AsyncTask<Void, Void, Void> private SubscribedSubredditDao subscribedSubredditDao; private String subredditName; + private String accountName; private SubscribedSubredditData subscribedSubredditData; private CheckIsSubscribedToSubredditListener checkIsSubscribedToSubredditListener; @@ -17,16 +18,18 @@ class CheckIsSubscribedToSubredditAsyncTask extends AsyncTask<Void, Void, Void> void isNotSubscribed(); } - CheckIsSubscribedToSubredditAsyncTask(SubscribedSubredditDao subscribedSubredditDao, String subredditName, + CheckIsSubscribedToSubredditAsyncTask(SubscribedSubredditDao subscribedSubredditDao, + String subredditName, String accountName, CheckIsSubscribedToSubredditListener checkIsSubscribedToSubredditListener) { this.subscribedSubredditDao = subscribedSubredditDao; this.subredditName =subredditName; + this.accountName = accountName; this.checkIsSubscribedToSubredditListener = checkIsSubscribedToSubredditListener; } @Override protected Void doInBackground(Void... voids) { - subscribedSubredditData = subscribedSubredditDao.getSubscribedSubreddit(subredditName); + subscribedSubredditData = subscribedSubredditDao.getSubscribedSubreddit(subredditName, accountName); return null; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentAndPostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentAndPostRecyclerViewAdapter.java index dcd2801a..0360abe8 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentAndPostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentAndPostRecyclerViewAdapter.java @@ -2,7 +2,6 @@ package ml.docilealligator.infinityforreddit; import android.app.Activity; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.ColorFilter; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; @@ -40,8 +39,6 @@ import java.util.Locale; import CustomView.AspectRatioGifImageView; import CustomView.CustomMarkwonView; -import SubredditDatabase.SubredditRoomDatabase; -import User.UserRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.BlurTransformation; @@ -61,8 +58,9 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie private Activity mActivity; private Retrofit mRetrofit; private Retrofit mOauthRetrofit; + private RedditDataRoomDatabase mRedditDataRoomDatabase; private RequestManager mGlide; - private SharedPreferences mSharedPreferences; + private String mAccessToken; private Post mPost; private ArrayList<CommentData> mVisibleComments; private String mSubredditNamePrefixed; @@ -79,15 +77,17 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie void retryFetchingMoreComments(); } - CommentAndPostRecyclerViewAdapter(Activity activity, Retrofit retrofit, Retrofit oauthRetrofit, RequestManager glide, - SharedPreferences sharedPreferences, Post post, String subredditNamePrefixed, + CommentAndPostRecyclerViewAdapter(Activity activity, Retrofit retrofit, Retrofit oauthRetrofit, + RedditDataRoomDatabase redditDataRoomDatabase, RequestManager glide, + String accessToken, Post post, String subredditNamePrefixed, Locale locale, LoadSubredditIconAsyncTask loadSubredditIconAsyncTask, CommentRecyclerViewAdapterCallback commentRecyclerViewAdapterCallback) { mActivity = activity; mRetrofit = retrofit; mOauthRetrofit = oauthRetrofit; + mRedditDataRoomDatabase = redditDataRoomDatabase; mGlide = glide; - mSharedPreferences = sharedPreferences; + mAccessToken = accessToken; mPost = post; mVisibleComments = new ArrayList<>(); mSubredditNamePrefixed = subredditNamePrefixed; @@ -164,7 +164,7 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie if(mPost.getSubredditNamePrefixed().equals("u/" + mPost.getAuthor())) { if(mPost.getAuthorIconUrl() == null) { - new LoadUserDataAsyncTask(UserRoomDatabase.getDatabase(mActivity).userDao(), mPost.getAuthor(), mOauthRetrofit, iconImageUrl -> { + new LoadUserDataAsyncTask(mRedditDataRoomDatabase.userDao(), mPost.getAuthor(), mOauthRetrofit, iconImageUrl -> { if(mActivity != null && getItemCount() > 0) { if(iconImageUrl == null || iconImageUrl.equals("")) { mGlide.load(R.drawable.subreddit_default_icon) @@ -200,7 +200,7 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie mLoadSubredditIconAsyncTask.cancel(true); } mLoadSubredditIconAsyncTask = new LoadSubredditIconAsyncTask( - SubredditRoomDatabase.getDatabase(mActivity).subredditDao(), mPost.getSubredditNamePrefixed().substring(2), + mRedditDataRoomDatabase.subredditDao(), mPost.getSubredditNamePrefixed().substring(2), mRetrofit, iconImageUrl -> { if(iconImageUrl == null || iconImageUrl.equals("")) { mGlide.load(R.drawable.subreddit_default_icon) @@ -749,7 +749,7 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie mCommentRecyclerViewAdapterCallback.updatePost(mPost); - VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() { + VoteThing.voteThing(mOauthRetrofit, mAccessToken, new VoteThing.VoteThingWithoutPositionListener() { @Override public void onVoteThingSuccess() { if(newVoteType.equals(RedditUtils.DIR_UPVOTE)) { @@ -808,7 +808,7 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie mCommentRecyclerViewAdapterCallback.updatePost(mPost); - VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() { + VoteThing.voteThing(mOauthRetrofit, mAccessToken, new VoteThing.VoteThingWithoutPositionListener() { @Override public void onVoteThingSuccess() { if(newVoteType.equals(RedditUtils.DIR_DOWNVOTE)) { @@ -911,7 +911,7 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie scoreTextView.setText(Integer.toString(mVisibleComments.get(getAdapterPosition() - 1).getScore() + mVisibleComments.get(getAdapterPosition() - 1).getVoteType())); - VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { + VoteThing.voteThing(mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() { @Override public void onVoteThingSuccess(int position) { if(newVoteType.equals(RedditUtils.DIR_UPVOTE)) { @@ -951,7 +951,7 @@ class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerVie scoreTextView.setText(Integer.toString(mVisibleComments.get(getAdapterPosition() - 1).getScore() + mVisibleComments.get(getAdapterPosition() - 1).getVoteType())); - VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { + VoteThing.voteThing(mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() { @Override public void onVoteThingSuccess(int position1) { if(newVoteType.equals(RedditUtils.DIR_DOWNVOTE)) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingFragment.java index fbe4a7a6..7a4e1fef 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingFragment.java @@ -3,7 +3,6 @@ package ml.docilealligator.infinityforreddit; import android.app.Activity; import android.content.Context; -import android.content.SharedPreferences; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -37,6 +36,7 @@ import retrofit2.Retrofit; public class CommentsListingFragment extends Fragment implements FragmentCommunicator { static final String EXTRA_USERNAME_KEY = "ENK"; + static final String EXTRA_ACCESS_TOKEN = "EAT"; @BindView(R.id.coordinator_layout_comments_listing_fragment) CoordinatorLayout mCoordinatorLayout; @BindView(R.id.recycler_view_comments_listing_fragment) RecyclerView mCommentRecyclerView; @@ -60,9 +60,6 @@ public class CommentsListingFragment extends Fragment implements FragmentCommuni @Inject @Named("oauth") Retrofit mOauthRetrofit; - @Inject @Named("auth_info") - SharedPreferences mSharedPreferences; - public CommentsListingFragment() { // Required empty public constructor } @@ -83,7 +80,7 @@ public class CommentsListingFragment extends Fragment implements FragmentCommuni CommentViewModel.Factory factory; mAdapter = new CommentsListingRecyclerViewAdapter(activity, mOauthRetrofit, - mSharedPreferences, () -> mCommentViewModel.retryLoadingMore()); + getArguments().getString(EXTRA_ACCESS_TOKEN), () -> mCommentViewModel.retryLoadingMore()); String username = getArguments().getString(EXTRA_USERNAME_KEY); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java index 6aac6a53..e61cca11 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/CommentsListingRecyclerViewAdapter.java @@ -2,7 +2,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -28,9 +27,9 @@ import retrofit2.Retrofit; class CommentsListingRecyclerViewAdapter extends PagedListAdapter<CommentData, RecyclerView.ViewHolder> { private Context mContext; private Retrofit mOauthRetrofit; - private SharedPreferences mSharedPreferences; - private int textColorPrimaryDark; - private int colorAccent; + private String mAccessToken; + private int mTextColorPrimaryDark; + private int mColorAccent; private static final int VIEW_TYPE_DATA = 0; private static final int VIEW_TYPE_ERROR = 1; @@ -43,15 +42,15 @@ class CommentsListingRecyclerViewAdapter extends PagedListAdapter<CommentData, R void retryLoadingMore(); } - protected CommentsListingRecyclerViewAdapter(Context context, Retrofit oauthRetrofit, SharedPreferences sharedPreferences, + protected CommentsListingRecyclerViewAdapter(Context context, Retrofit oauthRetrofit, String accessToken, RetryLoadingMoreCallback retryLoadingMoreCallback) { super(DIFF_CALLBACK); mContext = context; mOauthRetrofit = oauthRetrofit; - mSharedPreferences = sharedPreferences; + mAccessToken = accessToken; mRetryLoadingMoreCallback = retryLoadingMoreCallback; - textColorPrimaryDark = mContext.getResources().getColor(R.color.textColorPrimaryDark); - colorAccent = mContext.getResources().getColor(R.color.colorAccent); + mTextColorPrimaryDark = mContext.getResources().getColor(R.color.textColorPrimaryDark); + mColorAccent = mContext.getResources().getColor(R.color.colorAccent); } private static final DiffUtil.ItemCallback<CommentData> DIFF_CALLBACK = new DiffUtil.ItemCallback<CommentData>() { @@ -88,7 +87,7 @@ class CommentsListingRecyclerViewAdapter extends PagedListAdapter<CommentData, R if(comment.getAuthor().equals(comment.getSubredditName().substring(2))) { ((DataViewHolder) holder).authorTextView.setText("u/" + comment.getAuthor()); - ((DataViewHolder) holder).authorTextView.setTextColor(textColorPrimaryDark); + ((DataViewHolder) holder).authorTextView.setTextColor(mTextColorPrimaryDark); ((DataViewHolder) holder).authorTextView.setOnClickListener(view -> { Intent intent = new Intent(mContext, ViewUserDetailActivity.class); intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, comment.getAuthor()); @@ -96,7 +95,7 @@ class CommentsListingRecyclerViewAdapter extends PagedListAdapter<CommentData, R }); } else { ((DataViewHolder) holder).authorTextView.setText("r/" + comment.getSubredditName()); - ((DataViewHolder) holder).authorTextView.setTextColor(colorAccent); + ((DataViewHolder) holder).authorTextView.setTextColor(mColorAccent); ((DataViewHolder) holder).authorTextView.setOnClickListener(view -> { Intent intent = new Intent(mContext, ViewSubredditDetailActivity.class); intent.putExtra(ViewSubredditDetailActivity.EXTRA_SUBREDDIT_NAME_KEY, comment.getSubredditName()); @@ -225,7 +224,7 @@ class CommentsListingRecyclerViewAdapter extends PagedListAdapter<CommentData, R scoreTextView.setText(Integer.toString(getItem(getAdapterPosition()).getScore() + getItem(getAdapterPosition()).getVoteType())); - VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { + VoteThing.voteThing(mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() { @Override public void onVoteThingSuccess(int position) { if(newVoteType.equals(RedditUtils.DIR_UPVOTE)) { @@ -265,7 +264,7 @@ class CommentsListingRecyclerViewAdapter extends PagedListAdapter<CommentData, R scoreTextView.setText(Integer.toString(getItem(getAdapterPosition()).getScore() + getItem(getAdapterPosition()).getVoteType())); - VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { + VoteThing.voteThing(mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() { @Override public void onVoteThingSuccess(int position1) { if(newVoteType.equals(RedditUtils.DIR_DOWNVOTE)) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMyInfo.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMyInfo.java index 63b80532..33dd4f02 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMyInfo.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchMyInfo.java @@ -1,6 +1,5 @@ package ml.docilealligator.infinityforreddit; -import android.content.SharedPreferences; import android.util.Log; import androidx.annotation.NonNull; @@ -16,31 +15,6 @@ class FetchMyInfo { void onFetchMyInfoFail(); } - static void fetchMyInfo(final Retrofit retrofit, SharedPreferences authInfoSharedPreferences, - final FetchUserMyListener fetchUserMyListener) { - RedditAPI api = retrofit.create(RedditAPI.class); - - String accessToken = authInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); - Call<String> userInfo = api.getMyInfo(RedditUtils.getOAuthHeader(accessToken)); - userInfo.enqueue(new Callback<String>() { - @Override - public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { - if(response.isSuccessful()) { - fetchUserMyListener.onFetchMyInfoSuccess(response.body()); - } else { - Log.i("call failed", response.message()); - fetchUserMyListener.onFetchMyInfoFail(); - } - } - - @Override - public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) { - Log.i("call failed", t.getMessage()); - fetchUserMyListener.onFetchMyInfoFail(); - } - }); - } - static void fetchMyInfo(final Retrofit retrofit, String accessToken, final FetchUserMyListener fetchUserMyListener) { RedditAPI api = retrofit.create(RedditAPI.class); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubscribedThing.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubscribedThing.java index c0a96870..a6376432 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubscribedThing.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FetchSubscribedThing.java @@ -1,9 +1,9 @@ package ml.docilealligator.infinityforreddit; -import android.content.SharedPreferences; -import androidx.annotation.NonNull; import android.util.Log; +import androidx.annotation.NonNull; + import java.util.ArrayList; import SubredditDatabase.SubredditData; @@ -22,23 +22,20 @@ class FetchSubscribedThing { void onFetchSubscribedThingFail(); } - static void fetchSubscribedThing(final Retrofit retrofit, final SharedPreferences sharedPreferences, - final String lastItem, - final ArrayList<SubscribedSubredditData> subscribedSubredditData, + static void fetchSubscribedThing(final Retrofit retrofit, String accessToken, String accountName, + final String lastItem, final ArrayList<SubscribedSubredditData> subscribedSubredditData, final ArrayList<SubscribedUserData> subscribedUserData, final ArrayList<SubredditData> subredditData, final FetchSubscribedThingListener fetchSubscribedThingListener) { RedditAPI api = retrofit.create(RedditAPI.class); - String accessToken = sharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); - Call<String> subredditDataCall = api.getSubscribedThing(lastItem, RedditUtils.getOAuthHeader(accessToken)); subredditDataCall.enqueue(new Callback<String>() { @Override public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) { if(response.isSuccessful()) { - ParseSubscribedThing.parseSubscribedSubreddits(response.body(), subscribedSubredditData, - subscribedUserData, subredditData, + ParseSubscribedThing.parseSubscribedSubreddits(response.body(), accountName, + subscribedSubredditData, subscribedUserData, subredditData, new ParseSubscribedThing.ParseSubscribedSubredditsListener() { @Override @@ -50,8 +47,8 @@ class FetchSubscribedThing { fetchSubscribedThingListener.onFetchSubscribedThingSuccess( subscribedSubredditData, subscribedUserData, subredditData); } else { - fetchSubscribedThing(retrofit, sharedPreferences, lastItem, subscribedSubredditData, - subscribedUserData, subredditData, + fetchSubscribedThing(retrofit, accessToken, accountName, lastItem, + subscribedSubredditData, subscribedUserData, subredditData, fetchSubscribedThingListener); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FilteredPostsActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FilteredPostsActivity.java index eae90333..6d5d8a2d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FilteredPostsActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FilteredPostsActivity.java @@ -9,6 +9,8 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; +import javax.inject.Inject; + import butterknife.BindView; import butterknife.ButterKnife; @@ -21,10 +23,14 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType static final String EXTRA_POST_TYPE = "EPT"; static final String EXTRA_SORT_TYPE = "EST"; + private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; + private static final String ACCESS_TOKEN_STATE = "ATS"; private static final String FRAGMENT_OUT_STATE = "FOS"; @BindView(R.id.toolbar_filtered_posts_activity) Toolbar toolbar; + private boolean mNullAccessToken = false; + private String mAccessToken; private String name; private int postType; @@ -35,6 +41,9 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType private SortTypeBottomSheetFragment subredditSortTypeBottomSheetFragment; private SearchPostSortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment; + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -42,14 +51,43 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType ButterKnife.bind(this); + ((Infinity) getApplication()).getmAppComponent().inject(this); + setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); name = getIntent().getExtras().getString(EXTRA_NAME); - int filter = getIntent().getExtras().getInt(EXTRA_FILTER); postType = getIntent().getExtras().getInt(EXTRA_POST_TYPE); + int filter = getIntent().getExtras().getInt(EXTRA_FILTER); String sortType = getIntent().getExtras().getString(EXTRA_SORT_TYPE); + if(savedInstanceState != null) { + mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE); + mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE); + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndBindView(filter, sortType); + } else { + mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE); + getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_filtered_posts_activity, mFragment).commit(); + bindView(filter, sortType, false); + } + } else { + getCurrentAccountAndBindView(filter, sortType); + } + } + + private void getCurrentAccountAndBindView(int filter, String sortType) { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccessToken = true; + } else { + mAccessToken = account.getAccessToken(); + } + bindView(filter, sortType, true); + }).execute(); + } + + private void bindView(int filter, String sortType, boolean initializeFragment) { switch (postType) { case PostDataSource.TYPE_FRONT_PAGE: getSupportActionBar().setTitle(name); @@ -108,21 +146,19 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType toolbar.setSubtitle(R.string.gif); } - if(savedInstanceState == null) { + if(initializeFragment) { mFragment = new PostFragment(); Bundle bundle = new Bundle(); bundle.putString(PostFragment.EXTRA_NAME, name); bundle.putInt(PostFragment.EXTRA_POST_TYPE, postType); bundle.putString(PostFragment.EXTRA_SORT_TYPE, sortType); bundle.putInt(PostFragment.EXTRA_FILTER, filter); + bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); if(postType == PostDataSource.TYPE_SEARCH) { bundle.putString(PostFragment.EXTRA_QUERY, getIntent().getExtras().getString(EXTRA_QUERY)); } mFragment.setArguments(bundle); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_filtered_posts_activity, mFragment).commit(); - } else { - mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE); - getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_filtered_posts_activity, mFragment).commit(); } } @@ -170,6 +206,7 @@ public class FilteredPostsActivity extends AppCompatActivity implements SortType if (mFragment != null) { getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE, mFragment); } + outState.putString(ACCESS_TOKEN_STATE, mAccessToken); } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/FollowedUsersListingFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/FollowedUsersListingFragment.java index 3db27463..1d67a82d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/FollowedUsersListingFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/FollowedUsersListingFragment.java @@ -17,6 +17,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; +import javax.inject.Inject; + import SubscribedUserDatabase.SubscribedUserViewModel; import butterknife.BindView; import butterknife.ButterKnife; @@ -27,6 +29,8 @@ import butterknife.ButterKnife; */ public class FollowedUsersListingFragment extends Fragment { + static final String EXTRA_ACCOUNT_NAME = "EAN"; + @BindView(R.id.recycler_view_followed_users_listing_fragment) RecyclerView mRecyclerView; @BindView(R.id.no_subscriptions_linear_layout_followed_users_listing_fragment) LinearLayout mLinearLayout; @BindView(R.id.no_subscriptions_image_view_followed_users_listing_fragment) ImageView mImageView; @@ -41,6 +45,8 @@ public class FollowedUsersListingFragment extends Fragment { // Required empty public constructor } + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -51,13 +57,17 @@ public class FollowedUsersListingFragment extends Fragment { mActivity = getActivity(); + ((Infinity) mActivity.getApplication()).getmAppComponent().inject(this); + mGlide = Glide.with(this); mRecyclerView.setLayoutManager(new LinearLayoutManager(mActivity)); FollowedUsersRecyclerViewAdapter adapter = new FollowedUsersRecyclerViewAdapter(mActivity); mRecyclerView.setAdapter(adapter); - mSubscribedUserViewModel = ViewModelProviders.of(this).get(SubscribedUserViewModel.class); + mSubscribedUserViewModel = ViewModelProviders.of(this, + new SubscribedUserViewModel.Factory(mActivity.getApplication(), mRedditDataRoomDatabase, getArguments().getString(EXTRA_ACCOUNT_NAME))) + .get(SubscribedUserViewModel.class); mSubscribedUserViewModel.getAllSubscribedUsers().observe(this, subscribedUserData -> { if (subscribedUserData == null || subscribedUserData.size() == 0) { mRecyclerView.setVisibility(View.GONE); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/GetCurrentAccountAsyncTask.java b/app/src/main/java/ml/docilealligator/infinityforreddit/GetCurrentAccountAsyncTask.java new file mode 100644 index 00000000..ad740f92 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/GetCurrentAccountAsyncTask.java @@ -0,0 +1,33 @@ +package ml.docilealligator.infinityforreddit; + +import android.os.AsyncTask; + +import Account.Account; +import Account.AccountDao; + +class GetCurrentAccountAsyncTask extends AsyncTask<Void, Void, Void> { + + interface GetCurrentAccountAsyncTaskListener { + void success(Account account); + } + + Account account; + AccountDao accountDao; + GetCurrentAccountAsyncTaskListener getCurrentAccountAsyncTaskListener; + + GetCurrentAccountAsyncTask(AccountDao accountDao, GetCurrentAccountAsyncTaskListener getCurrentAccountAsyncTaskListener) { + this.accountDao = accountDao; + this.getCurrentAccountAsyncTaskListener = getCurrentAccountAsyncTaskListener; + } + + @Override + protected Void doInBackground(Void... voids) { + account = accountDao.getCurrentAccount(); + return null; + } + + @Override + protected void onPostExecute(Void aVoid) { + getCurrentAccountAsyncTaskListener.success(account); + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/LoginActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/LoginActivity.java index 20fa44fa..e5e125f3 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/LoginActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/LoginActivity.java @@ -1,9 +1,7 @@ package ml.docilealligator.infinityforreddit; import android.app.Activity; -import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; @@ -24,7 +22,6 @@ import java.util.Map; import javax.inject.Inject; import javax.inject.Named; -import Account.AccountRoomDatabase; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; @@ -42,6 +39,9 @@ public class LoginActivity extends AppCompatActivity { @Named("oauth") Retrofit mOauthRetrofit; + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -75,10 +75,6 @@ public class LoginActivity extends AppCompatActivity { if(state.equals(RedditUtils.STATE)) { authCode = uri.getQueryParameter("code"); - SharedPreferences.Editor editor = getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).edit(); - editor.putString(SharedPreferencesUtils.AUTH_CODE_KEY, authCode); - editor.apply(); - Map<String, String> params = new HashMap<>(); params.put(RedditUtils.GRANT_TYPE_KEY, "authorization_code"); params.put("code", authCode); @@ -107,8 +103,8 @@ public class LoginActivity extends AppCompatActivity { ParseMyInfo.parseMyInfo(response, new ParseMyInfo.ParseMyInfoListener() { @Override public void onParseMyInfoSuccess(String name, String profileImageUrl, String bannerImageUrl, int karma) { - new ParseAndInsertAccount(name, accessToken, refreshToken, profileImageUrl, bannerImageUrl, - karma, authCode, AccountRoomDatabase.getDatabase(LoginActivity.this).accountDao(), + new ParseAndInsertNewAccountAsyncTask(name, accessToken, refreshToken, profileImageUrl, bannerImageUrl, + karma, authCode, mRedditDataRoomDatabase.accountDao(), () -> { Intent resultIntent = new Intent(); setResult(Activity.RESULT_OK, resultIntent); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java index 68199d6d..a5e3018d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/MainActivity.java @@ -1,7 +1,6 @@ package ml.docilealligator.infinityforreddit; import android.app.Activity; -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; @@ -48,6 +47,8 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe private static final String FETCH_USER_INFO_STATE = "FUIS"; private static final String IS_IN_LAZY_MODE_STATE = "IILMS"; + private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; + private static final String ACCESS_TOKEN_STATE = "ATS"; private static final int LOGIN_ACTIVITY_REQUEST_CODE = 0; @@ -73,6 +74,8 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe private SortTypeBottomSheetFragment bestSortTypeBottomSheetFragment; private SortTypeBottomSheetFragment popularAndAllSortTypeBottomSheetFragment; + private boolean mNullAccessToken = false; + private String mAccessToken; private String mName; private String mProfileImageUrl; private String mBannerImageUrl; @@ -88,13 +91,12 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe SharedPreferences mUserInfoSharedPreferences; @Inject - @Named("auth_info") - SharedPreferences mAuthInfoSharedPreferences; - - @Inject @Named("oauth") Retrofit mOauthRetrofit; + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -127,85 +129,105 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams(); + if(savedInstanceState != null) { + mFetchUserInfoSuccess = savedInstanceState.getBoolean(FETCH_USER_INFO_STATE); + isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); + mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE); + mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE); + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndBindView(); + } else { + bindView(); + } + } else { + getCurrentAccountAndBindView(); + } + + fab.setOnClickListener(view -> postTypeBottomSheetFragment.show(getSupportFragmentManager(), postTypeBottomSheetFragment.getTag())); + } + + private void getCurrentAccountAndBindView() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + Intent loginIntent = new Intent(this, LoginActivity.class); + startActivityForResult(loginIntent, LOGIN_ACTIVITY_REQUEST_CODE); + } else { + mAccessToken = account.getAccessToken(); + if(mAccessToken == null) { + mNullAccessToken = true; + } + bindView(); + } + }).execute(); + } + + private void bindView() { sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(sectionsPagerAdapter); viewPager.setOffscreenPageLimit(2); tabLayout.setupWithViewPager(viewPager); - String accessToken = getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE).getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); - if (accessToken.equals("")) { - Intent loginIntent = new Intent(this, LoginActivity.class); - startActivityForResult(loginIntent, LOGIN_ACTIVITY_REQUEST_CODE); - } else { - if (savedInstanceState != null) { - mFetchUserInfoSuccess = savedInstanceState.getBoolean(FETCH_USER_INFO_STATE); - isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); + if(getIntent().hasExtra(EXTRA_POST_TYPE)) { + if(getIntent().getExtras().getString(EXTRA_POST_TYPE).equals("popular")) { + viewPager.setCurrentItem(1); } else { - if(getIntent().hasExtra(EXTRA_POST_TYPE)) { - if(getIntent().getExtras().getString(EXTRA_POST_TYPE).equals("popular")) { - viewPager.setCurrentItem(1); - } else { - viewPager.setCurrentItem(2); - } - } + viewPager.setCurrentItem(2); } + } - glide = Glide.with(this); - - View header = findViewById(R.id.nav_header_main_activity); - mNameTextView = header.findViewById(R.id.name_text_view_nav_header_main); - mKarmaTextView = header.findViewById(R.id.karma_text_view_nav_header_main); - mProfileImageView = header.findViewById(R.id.profile_image_view_nav_header_main); - mBannerImageView = header.findViewById(R.id.banner_image_view_nav_header_main); + glide = Glide.with(this); - loadUserData(); + View header = findViewById(R.id.nav_header_main_activity); + mNameTextView = header.findViewById(R.id.name_text_view_nav_header_main); + mKarmaTextView = header.findViewById(R.id.karma_text_view_nav_header_main); + mProfileImageView = header.findViewById(R.id.profile_image_view_nav_header_main); + mBannerImageView = header.findViewById(R.id.banner_image_view_nav_header_main); - mName = mUserInfoSharedPreferences.getString(SharedPreferencesUtils.USER_KEY, ""); - mProfileImageUrl = mUserInfoSharedPreferences.getString(SharedPreferencesUtils.PROFILE_IMAGE_URL_KEY, ""); - mBannerImageUrl = mUserInfoSharedPreferences.getString(SharedPreferencesUtils.BANNER_IMAGE_URL_KEY, ""); - mKarma = mUserInfoSharedPreferences.getString(SharedPreferencesUtils.KARMA_KEY, ""); + loadUserData(mAccessToken); - mNameTextView.setText(mName); - mKarmaTextView.setText(mKarma); + mName = mUserInfoSharedPreferences.getString(SharedPreferencesUtils.USER_KEY, ""); + mProfileImageUrl = mUserInfoSharedPreferences.getString(SharedPreferencesUtils.PROFILE_IMAGE_URL_KEY, ""); + mBannerImageUrl = mUserInfoSharedPreferences.getString(SharedPreferencesUtils.BANNER_IMAGE_URL_KEY, ""); + mKarma = mUserInfoSharedPreferences.getString(SharedPreferencesUtils.KARMA_KEY, ""); - if (!mProfileImageUrl.equals("")) { - glide.load(mProfileImageUrl) - .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0))) - .error(glide.load(R.drawable.subreddit_default_icon) - .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0)))) - .into(mProfileImageView); - } else { - glide.load(R.drawable.subreddit_default_icon) - .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0))) - .into(mProfileImageView); - } + mNameTextView.setText(mName); + mKarmaTextView.setText(mKarma); - if (!mBannerImageUrl.equals("")) { - glide.load(mBannerImageUrl).into(mBannerImageView); - } + if (!mProfileImageUrl.equals("")) { + glide.load(mProfileImageUrl) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0))) + .error(glide.load(R.drawable.subreddit_default_icon) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0)))) + .into(mProfileImageView); + } else { + glide.load(R.drawable.subreddit_default_icon) + .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0))) + .into(mProfileImageView); + } - profileLinearLayout.setOnClickListener(view -> { - Intent intent = new Intent(this, ViewUserDetailActivity.class); - intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, mName); - startActivity(intent); - }); + if (!mBannerImageUrl.equals("")) { + glide.load(mBannerImageUrl).into(mBannerImageView); + } - subscriptionLinearLayout.setOnClickListener(view -> { - Intent intent = new Intent(this, SubscribedThingListingActivity.class); - startActivity(intent); - }); + profileLinearLayout.setOnClickListener(view -> { + Intent intent = new Intent(this, ViewUserDetailActivity.class); + intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, mName); + startActivity(intent); + }); - settingsLinearLayout.setOnClickListener(view -> { + subscriptionLinearLayout.setOnClickListener(view -> { + Intent intent = new Intent(this, SubscribedThingListingActivity.class); + startActivity(intent); + }); - }); - } + settingsLinearLayout.setOnClickListener(view -> { - fab.setOnClickListener(view -> postTypeBottomSheetFragment.show(getSupportFragmentManager(), postTypeBottomSheetFragment.getTag())); + }); } - private void loadUserData() { + private void loadUserData(String accessToken) { if (!mFetchUserInfoSuccess) { - FetchMyInfo.fetchMyInfo(mOauthRetrofit, mAuthInfoSharedPreferences, new FetchMyInfo.FetchUserMyListener() { + FetchMyInfo.fetchMyInfo(mOauthRetrofit, accessToken, new FetchMyInfo.FetchUserMyListener() { @Override public void onFetchMyInfoSuccess(String response) { ParseMyInfo.parseMyInfo(response, new ParseMyInfo.ParseMyInfoListener() { @@ -306,7 +328,7 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe case R.id.action_refresh_main_activity: sectionsPagerAdapter.refresh(viewPager.getCurrentItem()); mFetchUserInfoSuccess = false; - loadUserData(); + loadUserData(mAccessToken); return true; case R.id.action_lazy_mode_main_activity: /*MenuItem lazyModeItem = mMenu.findItem(R.id.action_lazy_mode_main_activity); @@ -343,6 +365,8 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe super.onSaveInstanceState(outState); outState.putBoolean(FETCH_USER_INFO_STATE, mFetchUserInfoSuccess); outState.putBoolean(IS_IN_LAZY_MODE_STATE, isInLazyMode); + outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken); + outState.putString(ACCESS_TOKEN_STATE, mAccessToken); } @Override @@ -390,6 +414,7 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_FRONT_PAGE); bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST); bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER); + bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); fragment.setArguments(bundle); return fragment; } else if(position == 1) { @@ -399,6 +424,7 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe bundle.putString(PostFragment.EXTRA_NAME, "popular"); bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_HOT); bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER); + bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); fragment.setArguments(bundle); return fragment; } else { @@ -408,6 +434,7 @@ public class MainActivity extends AppCompatActivity implements SortTypeBottomShe bundle.putString(PostFragment.EXTRA_NAME, "all"); bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_HOT); bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER); + bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); fragment.setArguments(bundle); return fragment; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseAndInsertAccount.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseAndInsertNewAccountAsyncTask.java index e86fbada..f5a99d5d 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseAndInsertAccount.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseAndInsertNewAccountAsyncTask.java @@ -5,7 +5,7 @@ import android.os.AsyncTask; import Account.Account; import Account.AccountDao; -class ParseAndInsertAccount extends AsyncTask<Void, Void, Void> { +class ParseAndInsertNewAccountAsyncTask extends AsyncTask<Void, Void, Void> { interface ParseAndInsertAccountListener { void success(); @@ -21,9 +21,9 @@ class ParseAndInsertAccount extends AsyncTask<Void, Void, Void> { private AccountDao accountDao; private ParseAndInsertAccountListener parseAndInsertAccountListener; - ParseAndInsertAccount(String username, String accessToken, String refreshToken, String profileImageUrl, String bannerImageUrl, - int karma, String code, AccountDao accountDao, - ParseAndInsertAccountListener parseAndInsertAccountListener) { + ParseAndInsertNewAccountAsyncTask(String username, String accessToken, String refreshToken, String profileImageUrl, String bannerImageUrl, + int karma, String code, AccountDao accountDao, + ParseAndInsertAccountListener parseAndInsertAccountListener) { this.username = username; this.accessToken = accessToken; this.refreshToken = refreshToken; @@ -39,6 +39,7 @@ class ParseAndInsertAccount extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... voids) { Account account = new Account(username, accessToken, refreshToken, code, profileImageUrl, bannerImageUrl, karma, true); + accountDao.markAllAccountsNonCurrent(); accountDao.insert(account); return null; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java index fc69c82b..5121fc3b 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseSubscribedThing.java @@ -22,16 +22,18 @@ class ParseSubscribedThing { void onParseSubscribedSubredditsFail(); } - static void parseSubscribedSubreddits(String response, ArrayList<SubscribedSubredditData> subscribedSubredditData, - ArrayList<SubscribedUserData> subscribedUserData, - ArrayList<SubredditData> subredditData, - ParseSubscribedSubredditsListener parseSubscribedSubredditsListener) { - new ParseSubscribedSubredditsAsyncTask(response, subscribedSubredditData, subscribedUserData, subredditData, + static void parseSubscribedSubreddits(String response, String accountName, + ArrayList<SubscribedSubredditData> subscribedSubredditData, + ArrayList<SubscribedUserData> subscribedUserData, + ArrayList<SubredditData> subredditData, + ParseSubscribedSubredditsListener parseSubscribedSubredditsListener) { + new ParseSubscribedSubredditsAsyncTask(response, accountName, subscribedSubredditData, subscribedUserData, subredditData, parseSubscribedSubredditsListener).execute(); } private static class ParseSubscribedSubredditsAsyncTask extends AsyncTask<Void, Void, Void> { private JSONObject jsonResponse; + private String accountName; private boolean parseFailed; private String lastItem; private ArrayList<SubscribedSubredditData> subscribedSubredditData; @@ -42,12 +44,13 @@ class ParseSubscribedThing { private ArrayList<SubredditData> newSubredditData; private ParseSubscribedSubredditsListener parseSubscribedSubredditsListener; - ParseSubscribedSubredditsAsyncTask(String response, ArrayList<SubscribedSubredditData> subscribedSubredditData, + ParseSubscribedSubredditsAsyncTask(String response, String accountName, ArrayList<SubscribedSubredditData> subscribedSubredditData, ArrayList<SubscribedUserData> subscribedUserData, ArrayList<SubredditData> subredditData, ParseSubscribedSubredditsListener parseSubscribedSubredditsListener){ try { jsonResponse = new JSONObject(response); + this.accountName = accountName; parseFailed = false; this.subscribedSubredditData = subscribedSubredditData; this.subscribedUserData = subscribedUserData; @@ -94,12 +97,12 @@ class ParseSubscribedThing { if(data.getString(JSONUtils.SUBREDDIT_TYPE_KEY) .equals(JSONUtils.SUBREDDIT_TYPE_VALUE_USER)) { //It's a user - newSubscribedUserData.add(new SubscribedUserData(name.substring(2), iconUrl)); + newSubscribedUserData.add(new SubscribedUserData(name.substring(2), iconUrl, accountName)); } else { String subredditFullName = data.getString(JSONUtils.DISPLAY_NAME); String description = data.getString(JSONUtils.PUBLIC_DESCRIPTION_KEY).trim(); int nSubscribers = data.getInt(JSONUtils.SUBSCRIBERS_KEY); - newSubscribedSubredditData.add(new SubscribedSubredditData(id, name, iconUrl)); + newSubscribedSubredditData.add(new SubscribedSubredditData(id, name, iconUrl, accountName)); newSubredditData.add(new SubredditData(id, subredditFullName, iconUrl, bannerImageUrl, description, nSubscribers)); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java index dce8680f..6c75d4dc 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostFragment.java @@ -4,7 +4,6 @@ package ml.docilealligator.infinityforreddit; import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.os.CountDownTimer; import android.os.Handler; @@ -53,6 +52,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { static final String EXTRA_SORT_TYPE = "EST"; static final String EXTRA_FILTER = "EF"; static final int EXTRA_NO_FILTER = -1; + static final String EXTRA_ACCESS_TOKEN = "EAT"; private static final String IS_IN_LAZY_MODE_STATE = "IILMS"; @@ -87,8 +87,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator { @Inject @Named("oauth") Retrofit mOauthRetrofit; - @Inject @Named("auth_info") - SharedPreferences mSharedPreferences; + @Inject + RedditDataRoomDatabase redditDataRoomDatabase; public PostFragment() { // Required empty public constructor @@ -173,9 +173,7 @@ public class PostFragment extends Fragment implements FragmentCommunicator { int postType = getArguments().getInt(EXTRA_POST_TYPE); String sortType = getArguments().getString(EXTRA_SORT_TYPE); int filter = getArguments().getInt(EXTRA_FILTER); - - String accessToken = activity.getSharedPreferences(SharedPreferencesUtils.AUTH_CODE_FILE_KEY, Context.MODE_PRIVATE) - .getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); + String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN); PostViewModel.Factory factory; @@ -183,8 +181,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator { String subredditName = getArguments().getString(EXTRA_NAME); String query = getArguments().getString(EXTRA_QUERY); - mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, - mSharedPreferences, postType, true, new PostRecyclerViewAdapter.Callback() { + mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, redditDataRoomDatabase, + accessToken, postType, true, new PostRecyclerViewAdapter.Callback() { @Override public void retryLoadingMore() { mPostViewModel.retryLoadingMore(); @@ -221,8 +219,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator { String subredditName = getArguments().getString(EXTRA_NAME); boolean displaySubredditName = subredditName.equals("popular") || subredditName.equals("all"); - mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, - mSharedPreferences, postType, displaySubredditName, new PostRecyclerViewAdapter.Callback() { + mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, redditDataRoomDatabase, + accessToken, postType, displaySubredditName, new PostRecyclerViewAdapter.Callback() { @Override public void retryLoadingMore() { mPostViewModel.retryLoadingMore(); @@ -261,8 +259,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator { String username = getArguments().getString(EXTRA_USER_NAME); - mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, - mSharedPreferences, postType, true, new PostRecyclerViewAdapter.Callback() { + mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, redditDataRoomDatabase, + accessToken, postType, true, new PostRecyclerViewAdapter.Callback() { @Override public void retryLoadingMore() { mPostViewModel.retryLoadingMore(); @@ -296,8 +294,8 @@ public class PostFragment extends Fragment implements FragmentCommunicator { } }); } else { - mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, - mSharedPreferences, postType, true, new PostRecyclerViewAdapter.Callback() { + mAdapter = new PostRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, redditDataRoomDatabase, + accessToken, postType, true, new PostRecyclerViewAdapter.Callback() { @Override public void retryLoadingMore() { mPostViewModel.retryLoadingMore(); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java index 74e19f3a..927e33d7 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostImageActivity.java @@ -1,7 +1,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Intent; -import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -39,7 +38,6 @@ import java.io.IOException; import javax.inject.Inject; import javax.inject.Named; -import SubredditDatabase.SubredditRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; @@ -110,12 +108,7 @@ public class PostImageActivity extends AppCompatActivity implements FlairBottomS Retrofit mUploadMediaRetrofit; @Inject - @Named("user_info") - SharedPreferences mUserInfoSharedPreferences; - - @Inject - @Named("auth_info") - SharedPreferences sharedPreferences; + RedditDataRoomDatabase redditDataRoomDatabase; @Override protected void onCreate(Bundle savedInstanceState) { @@ -299,7 +292,7 @@ public class PostImageActivity extends AppCompatActivity implements FlairBottomS } private void loadSubredditIcon() { - new LoadSubredditIconAsyncTask(SubredditRoomDatabase.getDatabase(this).subredditDao(), + new LoadSubredditIconAsyncTask(redditDataRoomDatabase.subredditDao(), subredditName, mRetrofit, iconImageUrl -> { iconUrl = iconImageUrl; displaySubredditIcon(); @@ -441,11 +434,13 @@ public class PostImageActivity extends AppCompatActivity implements FlairBottomS public void onSubmitImagePostEvent(SubmitImagePostEvent submitImagePostEvent) { isPosting = false; if(submitImagePostEvent.postSuccess) { - Intent intent = new Intent(this, ViewUserDetailActivity.class); - intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, - mUserInfoSharedPreferences.getString(SharedPreferencesUtils.USER_KEY, "")); - startActivity(intent); - finish(); + new GetCurrentAccountAsyncTask(redditDataRoomDatabase.accountDao(), account -> { + Intent intent = new Intent(PostImageActivity.this, ViewUserDetailActivity.class); + intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, + account.getUsername()); + startActivity(intent); + finish(); + }).execute(); } else { mPostingSnackbar.dismiss(); mMemu.getItem(R.id.action_send_post_image_activity).setEnabled(true); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostLinkActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostLinkActivity.java index ed537d78..f0f866ff 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostLinkActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostLinkActivity.java @@ -1,7 +1,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; @@ -28,7 +27,6 @@ import org.greenrobot.eventbus.Subscribe; import javax.inject.Inject; import javax.inject.Named; -import SubredditDatabase.SubredditRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; @@ -48,6 +46,8 @@ public class PostLinkActivity extends AppCompatActivity implements FlairBottomSh private static final String FLAIR_STATE = "FS"; private static final String IS_SPOILER_STATE = "ISS"; private static final String IS_NSFW_STATE = "INS"; + private static final String NULL_ACCOUNT_NAME_STATE = "NATS"; + private static final String ACCOUNT_NAME_STATE = "ANS"; private static final int SUBREDDIT_SELECTION_REQUEST_CODE = 0; @@ -62,6 +62,8 @@ public class PostLinkActivity extends AppCompatActivity implements FlairBottomSh @BindView(R.id.post_title_edit_text_post_link_activity) EditText titleEditText; @BindView(R.id.post_link_edit_text_post_link_activity) EditText contentEditText; + private boolean mNullAccountName = false; + private String mAccountName; private String iconUrl; private String subredditName; private boolean subredditSelected = false; @@ -87,8 +89,7 @@ public class PostLinkActivity extends AppCompatActivity implements FlairBottomSh Retrofit mOauthRetrofit; @Inject - @Named("auth_info") - SharedPreferences sharedPreferences; + RedditDataRoomDatabase mRedditDataRoomDatabase; @Override protected void onCreate(Bundle savedInstanceState) { @@ -215,6 +216,16 @@ public class PostLinkActivity extends AppCompatActivity implements FlairBottomSh }); } + private void getCurrentAccountName() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccountName = true; + } else { + mAccountName = account.getUsername(); + } + }).execute(); + } + private void displaySubredditIcon() { if(iconUrl != null && !iconUrl.equals("")) { mGlide.load(iconUrl) @@ -230,7 +241,7 @@ public class PostLinkActivity extends AppCompatActivity implements FlairBottomSh } private void loadSubredditIcon() { - new LoadSubredditIconAsyncTask(SubredditRoomDatabase.getDatabase(this).subredditDao(), + new LoadSubredditIconAsyncTask(mRedditDataRoomDatabase.subredditDao(), subredditName, mRetrofit, iconImageUrl -> { iconUrl = iconImageUrl; displaySubredditIcon(); @@ -304,6 +315,8 @@ public class PostLinkActivity extends AppCompatActivity implements FlairBottomSh outState.putString(FLAIR_STATE, flair); outState.putBoolean(IS_SPOILER_STATE, isSpoiler); outState.putBoolean(IS_NSFW_STATE, isNSFW); + outState.putBoolean(NULL_ACCOUNT_NAME_STATE, mNullAccountName); + outState.putString(ACCOUNT_NAME_STATE, mAccountName); } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java index 79759c6c..3519633e 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostRecyclerViewAdapter.java @@ -2,7 +2,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.graphics.ColorFilter; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -43,9 +42,7 @@ import org.greenrobot.eventbus.EventBus; import CustomView.AspectRatioGifImageView; import SubredditDatabase.SubredditDao; -import SubredditDatabase.SubredditRoomDatabase; import User.UserDao; -import User.UserRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.BlurTransformation; @@ -60,20 +57,20 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo private Context mContext; private Retrofit mOauthRetrofit; private Retrofit mRetrofit; - private SharedPreferences mSharedPreferences; - private RequestManager glide; - private SubredditDao subredditDao; - private UserDao userDao; + private String mAccessToken; + private RequestManager mGlide; + private SubredditDao mSubredditDao; + private UserDao mUserDao; private boolean canStartActivity = true; - private int postType; - private boolean displaySubredditName; + private int mPostType; + private boolean mDisplaySubredditName; private static final int VIEW_TYPE_DATA = 0; private static final int VIEW_TYPE_ERROR = 1; private static final int VIEW_TYPE_LOADING = 2; private NetworkState networkState; - private Callback callback; + private Callback mCallback; interface Callback { void retryLoadingMore(); @@ -81,20 +78,21 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo } PostRecyclerViewAdapter(Context context, Retrofit oauthRetrofit, Retrofit retrofit, - SharedPreferences sharedPreferences, int postType, + RedditDataRoomDatabase redditDataRoomDatabase, + String accessToken, int postType, boolean displaySubredditName, Callback callback) { super(DIFF_CALLBACK); if(context != null) { mContext = context; mOauthRetrofit = oauthRetrofit; mRetrofit = retrofit; - mSharedPreferences = sharedPreferences; - this.postType = postType; - this.displaySubredditName = displaySubredditName; - glide = Glide.with(mContext.getApplicationContext()); - subredditDao = SubredditRoomDatabase.getDatabase(mContext.getApplicationContext()).subredditDao(); - userDao = UserRoomDatabase.getDatabase(mContext.getApplicationContext()).userDao(); - this.callback = callback; + mAccessToken = accessToken; + mPostType = postType; + mDisplaySubredditName = displaySubredditName; + mGlide = Glide.with(mContext.getApplicationContext()); + mSubredditDao = redditDataRoomDatabase.subredditDao(); + mUserDao = redditDataRoomDatabase.userDao(); + mCallback = callback; } } @@ -161,19 +159,19 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo } }); - if(displaySubredditName) { + if(mDisplaySubredditName) { if(authorPrefixed.equals(subredditNamePrefixed)) { if(post.getAuthorIconUrl() == null) { - new LoadUserDataAsyncTask(userDao, post.getAuthor(), mRetrofit, iconImageUrl -> { + new LoadUserDataAsyncTask(mUserDao, post.getAuthor(), mRetrofit, iconImageUrl -> { if(mContext != null && getItemCount() > 0) { if(iconImageUrl == null || iconImageUrl.equals("")) { - glide.load(R.drawable.subreddit_default_icon) + mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) .into(((DataViewHolder) holder).iconGifImageView); } else { - glide.load(iconImageUrl) + mGlide.load(iconImageUrl) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .error(glide.load(R.drawable.subreddit_default_icon) + .error(mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))) .into(((DataViewHolder) holder).iconGifImageView); } @@ -184,29 +182,29 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo } }).execute(); } else if(!post.getAuthorIconUrl().equals("")) { - glide.load(post.getAuthorIconUrl()) + mGlide.load(post.getAuthorIconUrl()) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .error(glide.load(R.drawable.subreddit_default_icon) + .error(mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))) .into(((DataViewHolder) holder).iconGifImageView); } else { - glide.load(R.drawable.subreddit_default_icon) + mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) .into(((DataViewHolder) holder).iconGifImageView); } } else { if(post.getSubredditIconUrl() == null) { - new LoadSubredditIconAsyncTask(subredditDao, subredditName, mRetrofit, + new LoadSubredditIconAsyncTask(mSubredditDao, subredditName, mRetrofit, iconImageUrl -> { if(mContext != null && getItemCount() > 0) { if(iconImageUrl == null || iconImageUrl.equals("")) { - glide.load(R.drawable.subreddit_default_icon) + mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) .into(((DataViewHolder) holder).iconGifImageView); } else { - glide.load(iconImageUrl) + mGlide.load(iconImageUrl) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .error(glide.load(R.drawable.subreddit_default_icon) + .error(mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))) .into(((DataViewHolder) holder).iconGifImageView); } @@ -217,13 +215,13 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo } }).execute(); } else if(!post.getSubredditIconUrl().equals("")) { - glide.load(post.getSubredditIconUrl()) + mGlide.load(post.getSubredditIconUrl()) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .error(glide.load(R.drawable.subreddit_default_icon) + .error(mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))) .into(((DataViewHolder) holder).iconGifImageView); } else { - glide.load(R.drawable.subreddit_default_icon) + mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) .into(((DataViewHolder) holder).iconGifImageView); } @@ -250,16 +248,16 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo }); } else { if(post.getAuthorIconUrl() == null) { - new LoadUserDataAsyncTask(userDao, post.getAuthor(), mRetrofit, iconImageUrl -> { + new LoadUserDataAsyncTask(mUserDao, post.getAuthor(), mRetrofit, iconImageUrl -> { if(mContext != null && getItemCount() > 0) { if(iconImageUrl == null || iconImageUrl.equals("")) { - glide.load(R.drawable.subreddit_default_icon) + mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) .into(((DataViewHolder) holder).iconGifImageView); } else { - glide.load(iconImageUrl) + mGlide.load(iconImageUrl) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .error(glide.load(R.drawable.subreddit_default_icon) + .error(mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))) .into(((DataViewHolder) holder).iconGifImageView); } @@ -270,13 +268,13 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo } }).execute(); } else if(!post.getAuthorIconUrl().equals("")) { - glide.load(post.getAuthorIconUrl()) + mGlide.load(post.getAuthorIconUrl()) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) - .error(glide.load(R.drawable.subreddit_default_icon) + .error(mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))) .into(((DataViewHolder) holder).iconGifImageView); } else { - glide.load(R.drawable.subreddit_default_icon) + mGlide.load(R.drawable.subreddit_default_icon) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))) .into(((DataViewHolder) holder).iconGifImageView); } @@ -300,7 +298,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo if(gilded > 0) { ((DataViewHolder) holder).gildedImageView.setVisibility(View.VISIBLE); - glide.load(R.drawable.gold).into(((DataViewHolder) holder).gildedImageView); + mGlide.load(R.drawable.gold).into(((DataViewHolder) holder).gildedImageView); ((DataViewHolder) holder).gildedNumberTextView.setVisibility(View.VISIBLE); String gildedNumber = mContext.getResources().getString(R.string.gilded, gilded); ((DataViewHolder) holder).gildedNumberTextView.setText(gildedNumber); @@ -345,9 +343,9 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo loadImage(holder, post); } - if(postType == PostDataSource.TYPE_SUBREDDIT && post.isStickied()) { + if(mPostType == PostDataSource.TYPE_SUBREDDIT && post.isStickied()) { ((DataViewHolder) holder).stickiedPostImageView.setVisibility(View.VISIBLE); - glide.load(R.drawable.thumbtack).into(((DataViewHolder) holder).stickiedPostImageView); + mGlide.load(R.drawable.thumbtack).into(((DataViewHolder) holder).stickiedPostImageView); } if(isArchived) { @@ -362,7 +360,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo } if(!(mContext instanceof FilteredPostsActivity)) { - ((DataViewHolder) holder).typeChip.setOnClickListener(view -> callback.typeChipClicked(post.getPostType())); + ((DataViewHolder) holder).typeChip.setOnClickListener(view -> mCallback.typeChipClicked(post.getPostType())); } switch (post.getPostType()) { @@ -481,7 +479,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo ((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + post.getVoteType())); - VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { + VoteThing.voteThing(mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() { @Override public void onVoteThingSuccess(int position1) { if(newVoteType.equals(RedditUtils.DIR_UPVOTE)) { @@ -541,7 +539,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo ((DataViewHolder) holder).scoreTextView.setText(Integer.toString(post.getScore() + post.getVoteType())); - VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingListener() { + VoteThing.voteThing(mOauthRetrofit, mAccessToken, new VoteThing.VoteThingListener() { @Override public void onVoteThingSuccess(int position1) { if(newVoteType.equals(RedditUtils.DIR_DOWNVOTE)) { @@ -584,7 +582,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo } private void loadImage(final RecyclerView.ViewHolder holder, final Post post) { - RequestBuilder imageRequestBuilder = glide.load(post.getPreviewUrl()).listener(new RequestListener<Drawable>() { + RequestBuilder imageRequestBuilder = mGlide.load(post.getPreviewUrl()).listener(new RequestListener<Drawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { ((DataViewHolder) holder).progressBar.setVisibility(View.GONE); @@ -699,7 +697,7 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo super(itemView); ButterKnife.bind(this, itemView); errorTextView.setText(R.string.load_posts_error); - retryButton.setOnClickListener(view -> callback.retryLoadingMore()); + retryButton.setOnClickListener(view -> mCallback.retryLoadingMore()); } } @@ -713,8 +711,8 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo @Override public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) { if(holder instanceof DataViewHolder) { - glide.clear(((DataViewHolder) holder).imageView); - glide.clear(((DataViewHolder) holder).iconGifImageView); + mGlide.clear(((DataViewHolder) holder).imageView); + mGlide.clear(((DataViewHolder) holder).iconGifImageView); ((DataViewHolder) holder).stickiedPostImageView.setVisibility(View.GONE); ((DataViewHolder) holder).relativeLayout.setVisibility(View.GONE); ((DataViewHolder) holder).gildedImageView.setVisibility(View.GONE); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostTextActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostTextActivity.java index d96dddc6..957360b1 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostTextActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostTextActivity.java @@ -28,7 +28,6 @@ import org.greenrobot.eventbus.Subscribe; import javax.inject.Inject; import javax.inject.Named; -import SubredditDatabase.SubredditRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; @@ -48,6 +47,8 @@ public class PostTextActivity extends AppCompatActivity implements FlairBottomSh private static final String FLAIR_STATE = "FS"; private static final String IS_SPOILER_STATE = "ISS"; private static final String IS_NSFW_STATE = "INS"; + private static final String NULL_ACCOUNT_NAME_STATE = "NATS"; + private static final String ACCOUNT_NAME_STATE = "ANS"; private static final int SUBREDDIT_SELECTION_REQUEST_CODE = 0; @@ -62,6 +63,8 @@ public class PostTextActivity extends AppCompatActivity implements FlairBottomSh @BindView(R.id.post_title_edit_text_post_text_activity) EditText titleEditText; @BindView(R.id.post_text_content_edit_text_post_text_activity) EditText contentEditText; + private boolean mNullAccountName = false; + private String mAccountName; private String iconUrl; private String subredditName; private boolean subredditSelected = false; @@ -90,6 +93,9 @@ public class PostTextActivity extends AppCompatActivity implements FlairBottomSh @Named("auth_info") SharedPreferences sharedPreferences; + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -220,6 +226,16 @@ public class PostTextActivity extends AppCompatActivity implements FlairBottomSh }); } + private void getCurrentAccountName() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccountName = true; + } else { + mAccountName = account.getUsername(); + } + }).execute(); + } + private void displaySubredditIcon() { if(iconUrl != null && !iconUrl.equals("")) { mGlide.load(iconUrl) @@ -235,7 +251,7 @@ public class PostTextActivity extends AppCompatActivity implements FlairBottomSh } private void loadSubredditIcon() { - new LoadSubredditIconAsyncTask(SubredditRoomDatabase.getDatabase(this).subredditDao(), + new LoadSubredditIconAsyncTask(mRedditDataRoomDatabase.subredditDao(), subredditName, mRetrofit, iconImageUrl -> { iconUrl = iconImageUrl; displaySubredditIcon(); @@ -309,6 +325,8 @@ public class PostTextActivity extends AppCompatActivity implements FlairBottomSh outState.putString(FLAIR_STATE, flair); outState.putBoolean(IS_SPOILER_STATE, isSpoiler); outState.putBoolean(IS_NSFW_STATE, isNSFW); + outState.putBoolean(NULL_ACCOUNT_NAME_STATE, mNullAccountName); + outState.putString(ACCOUNT_NAME_STATE, mAccountName); } @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java index 6df6134a..0864c8ff 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostVideoActivity.java @@ -1,7 +1,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Intent; -import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -34,7 +33,6 @@ import org.greenrobot.eventbus.Subscribe; import javax.inject.Inject; import javax.inject.Named; -import SubredditDatabase.SubredditRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; @@ -55,6 +53,8 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS private static final String FLAIR_STATE = "FS"; private static final String IS_SPOILER_STATE = "ISS"; private static final String IS_NSFW_STATE = "INS"; + private static final String NULL_ACCOUNT_NAME_STATE = "NATS"; + private static final String ACCOUNT_NAME_STATE = "ANS"; private static final int SUBREDDIT_SELECTION_REQUEST_CODE = 0; private static final int PICK_VIDEO_REQUEST_CODE = 1; @@ -75,6 +75,8 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS @BindView(R.id.select_again_text_view_post_video_activity) TextView selectAgainTextView; @BindView(R.id.video_view_post_video_activity) VideoView videoView; + private boolean mNullAccountName = false; + private String mAccountName; private String iconUrl; private String subredditName; private boolean subredditSelected = false; @@ -109,12 +111,7 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS Retrofit mUploadVideoRetrofit; @Inject - @Named("user_info") - SharedPreferences mUserInfoSharedPreferences; - - @Inject - @Named("auth_info") - SharedPreferences sharedPreferences; + RedditDataRoomDatabase mRedditDataRoomDatabase; @Override protected void onCreate(Bundle savedInstanceState) { @@ -142,6 +139,12 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS flair = savedInstanceState.getString(FLAIR_STATE); isSpoiler = savedInstanceState.getBoolean(IS_SPOILER_STATE); isNSFW = savedInstanceState.getBoolean(IS_NSFW_STATE); + mNullAccountName = savedInstanceState.getBoolean(NULL_ACCOUNT_NAME_STATE); + mAccountName = savedInstanceState.getString(ACCOUNT_NAME_STATE); + + if(!mNullAccountName && mAccountName == null) { + getCurrentAccountName(); + } if(savedInstanceState.getString(VIDEO_URI_STATE) != null) { videoUri = Uri.parse(savedInstanceState.getString(VIDEO_URI_STATE)); @@ -173,6 +176,8 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS nsfwTextView.setBackgroundColor(getResources().getColor(R.color.colorAccent)); } } else { + getCurrentAccountName(); + isPosting = false; if(getIntent().hasExtra(EXTRA_SUBREDDIT_NAME)) { @@ -272,6 +277,16 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS }); } + private void getCurrentAccountName() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccountName = true; + } else { + mAccountName = account.getUsername(); + } + }).execute(); + } + private void loadVideo() { constraintLayout.setVisibility(View.GONE); videoView.setVisibility(View.VISIBLE); @@ -295,7 +310,7 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS } private void loadSubredditIcon() { - new LoadSubredditIconAsyncTask(SubredditRoomDatabase.getDatabase(this).subredditDao(), + new LoadSubredditIconAsyncTask(mRedditDataRoomDatabase.subredditDao(), subredditName, mRetrofit, iconImageUrl -> { iconUrl = iconImageUrl; displaySubredditIcon(); @@ -387,6 +402,8 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS outState.putString(FLAIR_STATE, flair); outState.putBoolean(IS_SPOILER_STATE, isSpoiler); outState.putBoolean(IS_NSFW_STATE, isNSFW); + outState.putBoolean(NULL_ACCOUNT_NAME_STATE, mNullAccountName); + outState.putString(ACCOUNT_NAME_STATE, mAccountName); } @Override @@ -444,7 +461,7 @@ public class PostVideoActivity extends AppCompatActivity implements FlairBottomS if(submitVideoPostEvent.postSuccess) { Intent intent = new Intent(this, ViewUserDetailActivity.class); intent.putExtra(ViewUserDetailActivity.EXTRA_USER_NAME_KEY, - mUserInfoSharedPreferences.getString(SharedPreferencesUtils.USER_KEY, "")); + mAccountName); startActivity(intent); finish(); } else if(submitVideoPostEvent.errorProcessingVideo) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java new file mode 100644 index 00000000..4ba61434 --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java @@ -0,0 +1,42 @@ +package ml.docilealligator.infinityforreddit; + +import android.content.Context; + +import androidx.room.Database; +import androidx.room.Room; +import androidx.room.RoomDatabase; + +import Account.Account; +import Account.AccountDao; +import SubredditDatabase.SubredditDao; +import SubredditDatabase.SubredditData; +import SubscribedSubredditDatabase.SubscribedSubredditDao; +import SubscribedSubredditDatabase.SubscribedSubredditData; +import SubscribedUserDatabase.SubscribedUserDao; +import SubscribedUserDatabase.SubscribedUserData; +import User.UserDao; +import User.UserData; + +@Database(entities = {Account.class, SubredditData.class, SubscribedSubredditData.class, UserData.class, SubscribedUserData.class}, version = 1) +public abstract class RedditDataRoomDatabase extends RoomDatabase { + private static RedditDataRoomDatabase INSTANCE; + + public abstract AccountDao accountDao(); + public abstract SubredditDao subredditDao(); + public abstract SubscribedSubredditDao subscribedSubredditDao(); + public abstract UserDao userDao(); + public abstract SubscribedUserDao subscribedUserDao(); + + public static RedditDataRoomDatabase getDatabase(final Context context) { + if(INSTANCE == null) { + synchronized (RedditDataRoomDatabase.class) { + if(INSTANCE == null) { + INSTANCE = Room.databaseBuilder(context.getApplicationContext(), + RedditDataRoomDatabase.class, "reddit_data") + .build(); + } + } + } + return INSTANCE; + } +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java index a06f0f6c..42cf85b1 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchResultActivity.java @@ -16,6 +16,8 @@ import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; +import javax.inject.Inject; + import butterknife.BindView; import butterknife.ButterKnife; @@ -24,6 +26,13 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos static final String EXTRA_QUERY = "QK"; static final String EXTRA_SUBREDDIT_NAME = "ESN"; + private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; + private static final String ACCESS_TOKEN_STATE = "ATS"; + private static final String ACCOUNT_NAME_STATE = "ANS"; + + private boolean mNullAccessToken = false; + private String mAccessToken; + private String mAccountName; private String mQuery; private String mSubredditName; @@ -36,6 +45,9 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos private SearchPostSortTypeBottomSheetFragment searchPostSortTypeBottomSheetFragment; private SearchUserAndSubredditSortTypeBottomSheetFragment searchUserAndSubredditSortTypeBottomSheetFragment; + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -43,14 +55,23 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos ButterKnife.bind(this); + ((Infinity) getApplication()).getmAppComponent().inject(this); + setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - viewPager.setAdapter(sectionsPagerAdapter); - viewPager.setOffscreenPageLimit(2); - - tabLayout.setupWithViewPager(viewPager); + if(savedInstanceState == null) { + getCurrentAccountAndInitializeViewPager(); + } else { + mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE); + mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE); + mAccountName = savedInstanceState.getString(ACCOUNT_NAME_STATE); + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndInitializeViewPager(); + } else { + initializeViewPager(); + } + } searchPostSortTypeBottomSheetFragment = new SearchPostSortTypeBottomSheetFragment(); Bundle bundle = new Bundle(); @@ -72,6 +93,25 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos } } + private void getCurrentAccountAndInitializeViewPager() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccessToken = true; + } else { + mAccessToken = account.getAccessToken(); + mAccountName = account.getUsername(); + } + initializeViewPager(); + }).execute(); + } + + private void initializeViewPager() { + sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); + viewPager.setAdapter(sectionsPagerAdapter); + viewPager.setOffscreenPageLimit(2); + tabLayout.setupWithViewPager(viewPager); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search_result_activity, menu); @@ -113,6 +153,14 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos } @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken); + outState.putString(ACCESS_TOKEN_STATE, mAccessToken); + outState.putString(ACCOUNT_NAME_STATE, mAccountName); + } + + @Override public void searchSortTypeSelected(String sortType) { sectionsPagerAdapter.changeSortType(sortType, 0); } @@ -144,21 +192,26 @@ public class SearchResultActivity extends AppCompatActivity implements SearchPos bundle.putString(PostFragment.EXTRA_NAME, mSubredditName); bundle.putString(PostFragment.EXTRA_QUERY, mQuery); bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER); + bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); mFragment.setArguments(bundle); return mFragment; } case 1: { SubredditListingFragment mFragment = new SubredditListingFragment(); Bundle bundle = new Bundle(); - bundle.putString(SubredditListingFragment.EXTRA_QUERY_KEY, mQuery); + bundle.putString(SubredditListingFragment.EXTRA_QUERY, mQuery); bundle.putBoolean(SubredditListingFragment.EXTRA_IS_POSTING, false); + bundle.putString(SubredditListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken); + bundle.putString(SubredditListingFragment.EXTRA_ACCOUNT_NAME, mAccountName); mFragment.setArguments(bundle); return mFragment; } default: { UserListingFragment mFragment = new UserListingFragment(); Bundle bundle = new Bundle(); - bundle.putString(UserListingFragment.QUERY_KEY, mQuery); + bundle.putString(UserListingFragment.EXTRA_QUERY, mQuery); + bundle.putString(UserListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken); + bundle.putString(UserListingFragment.EXTRA_ACCOUNT_NAME, mAccountName); mFragment.setArguments(bundle); return mFragment; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java index 51003eae..aac45900 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SearchSubredditsResultActivity.java @@ -10,6 +10,8 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; +import javax.inject.Inject; + import butterknife.BindView; import butterknife.ButterKnife; @@ -19,12 +21,22 @@ public class SearchSubredditsResultActivity extends AppCompatActivity { static final String EXTRA_RETURN_SUBREDDIT_NAME = "ERSN"; static final String EXTRA_RETURN_SUBREDDIT_ICON_URL = "ERSIURL"; + private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; + private static final String ACCESS_TOKEN_STATE = "ATS"; + private static final String ACCOUNT_NAME_STATE = "ANS"; private static final String FRAGMENT_OUT_STATE = "FOS"; @BindView(R.id.toolbar_search_subreddits_result_activity) Toolbar toolbar; + private boolean mNullAccessToken = false; + private String mAccessToken; + private String mAccountName; + Fragment mFragment; + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -32,23 +44,46 @@ public class SearchSubredditsResultActivity extends AppCompatActivity { ButterKnife.bind(this); + ((Infinity) getApplication()).getmAppComponent().inject(this); + setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); String query = getIntent().getExtras().getString(EXTRA_QUERY); if(savedInstanceState == null) { + getCurrentAccountAndInitializeFragment(query); + } else { + mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE); + mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE); + mAccountName = savedInstanceState.getString(ACCOUNT_NAME_STATE); + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndInitializeFragment(query); + } else { + mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE); + getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_search_subreddits_result_activity, mFragment).commit(); + } + } + } + + private void getCurrentAccountAndInitializeFragment(String query) { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccessToken = true; + } else { + mAccessToken = account.getAccessToken(); + mAccountName = account.getUsername(); + } + mFragment = new SubredditListingFragment(); Bundle bundle = new Bundle(); - bundle.putString(SubredditListingFragment.EXTRA_QUERY_KEY, query); + bundle.putString(SubredditListingFragment.EXTRA_QUERY, query); bundle.putBoolean(SubredditListingFragment.EXTRA_IS_POSTING, true); + bundle.putString(SubredditListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken); + bundle.putString(SubredditListingFragment.EXTRA_ACCOUNT_NAME, mAccountName); mFragment.setArguments(bundle); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_search_subreddits_result_activity, mFragment).commit(); - } else { - mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE); - getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_search_subreddits_result_activity, mFragment).commit(); - - } + }).execute(); } void getSelectedSubreddit(String name, String iconUrl) { @@ -74,5 +109,8 @@ public class SearchSubredditsResultActivity extends AppCompatActivity { if (mFragment != null) { getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE, mFragment); } + outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken); + outState.putString(ACCESS_TOKEN_STATE, mAccessToken); + outState.putString(ACCOUNT_NAME_STATE, mAccountName); } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditListingFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditListingFragment.java index 7c250cdf..e4930217 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditListingFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditListingFragment.java @@ -12,6 +12,7 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import androidx.annotation.NonNull; import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; @@ -24,7 +25,6 @@ import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar; import javax.inject.Inject; import javax.inject.Named; -import SubscribedSubredditDatabase.SubscribedSubredditRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import retrofit2.Retrofit; @@ -35,8 +35,10 @@ import retrofit2.Retrofit; */ public class SubredditListingFragment extends Fragment implements FragmentCommunicator { - static final String EXTRA_QUERY_KEY = "EQK"; + static final String EXTRA_QUERY = "EQ"; static final String EXTRA_IS_POSTING = "EIP"; + static final String EXTRA_ACCESS_TOKEN = "EAT"; + static final String EXTRA_ACCOUNT_NAME = "EAN"; @BindView(R.id.coordinator_layout_subreddit_listing_fragment) CoordinatorLayout mCoordinatorLayout; @BindView(R.id.recycler_view_subreddit_listing_fragment) RecyclerView mSubredditListingRecyclerView; @@ -60,13 +62,16 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun @Inject @Named("oauth") Retrofit mOauthRetrofit; + @Inject + RedditDataRoomDatabase redditDataRoomDatabase; + public SubredditListingFragment() { // Required empty public constructor } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View rootView = inflater.inflate(R.layout.fragment_subreddit_listing, container, false); @@ -80,8 +85,10 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun mLinearLayoutManager = new LinearLayoutManager(getActivity()); mSubredditListingRecyclerView.setLayoutManager(mLinearLayoutManager); - String query = getArguments().getString(EXTRA_QUERY_KEY); + String query = getArguments().getString(EXTRA_QUERY); boolean isPosting = getArguments().getBoolean(EXTRA_IS_POSTING); + String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN); + String accountName = getArguments().getString(EXTRA_ACCOUNT_NAME); SubredditListingViewModel.Factory factory = new SubredditListingViewModel.Factory(mRetrofit, query, PostDataSource.SORT_TYPE_RELEVANCE, new SubredditListingDataSource.OnSubredditListingDataFetchedCallback() { @@ -99,9 +106,8 @@ public class SubredditListingFragment extends Fragment implements FragmentCommun } }); - mAdapter = new SubredditListingRecyclerViewAdapter(getActivity(), mOauthRetrofit, mRetrofit, - mAuthInfoSharedPreferences, - SubscribedSubredditRoomDatabase.getDatabase(getContext()).subscribedSubredditDao(), + mAdapter = new SubredditListingRecyclerViewAdapter(activity, mOauthRetrofit, mRetrofit, + accessToken, accountName, redditDataRoomDatabase.subscribedSubredditDao(), new SubredditListingRecyclerViewAdapter.Callback() { @Override public void retryLoadingMore() { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditListingRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditListingRecyclerViewAdapter.java index d18e48b6..853ae296 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditListingRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditListingRecyclerViewAdapter.java @@ -1,7 +1,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Context; -import android.content.SharedPreferences; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -44,21 +43,23 @@ public class SubredditListingRecyclerViewAdapter extends PagedListAdapter<Subred private Context context; private Retrofit oauthRetrofit; private Retrofit retrofit; - private SharedPreferences authInfoSharedPreferences; + private String accessToken; + private String accountName; private SubscribedSubredditDao subscribedSubredditDao; private NetworkState networkState; private Callback callback; SubredditListingRecyclerViewAdapter(Context context, Retrofit oauthRetrofit, Retrofit retrofit, - SharedPreferences authInfoSharedPreferences, + String accessToken, String accountName, SubscribedSubredditDao subscribedSubredditDao, Callback callback) { super(DIFF_CALLBACK); this.context = context; this.oauthRetrofit = oauthRetrofit; this.retrofit = retrofit; - this.authInfoSharedPreferences = authInfoSharedPreferences; + this.accessToken = accessToken; + this.accountName = accountName; this.subscribedSubredditDao = subscribedSubredditDao; this.callback = callback; glide = Glide.with(context.getApplicationContext()); @@ -112,7 +113,7 @@ public class SubredditListingRecyclerViewAdapter extends PagedListAdapter<Subred ((DataViewHolder) holder).subredditNameTextView.setText(subredditData.getName()); - new CheckIsSubscribedToSubredditAsyncTask(subscribedSubredditDao, subredditData.getName(), + new CheckIsSubscribedToSubredditAsyncTask(subscribedSubredditDao, subredditData.getName(), accountName, new CheckIsSubscribedToSubredditAsyncTask.CheckIsSubscribedToSubredditListener() { @Override public void isSubscribed() { @@ -124,7 +125,7 @@ public class SubredditListingRecyclerViewAdapter extends PagedListAdapter<Subred ((DataViewHolder) holder).subscribeButton.setVisibility(View.VISIBLE); ((DataViewHolder) holder).subscribeButton.setOnClickListener(view -> { SubredditSubscription.subscribeToSubreddit(oauthRetrofit, retrofit, - authInfoSharedPreferences, subredditData.getName(), subscribedSubredditDao, + accessToken, accountName, subredditData.getName(), subscribedSubredditDao, new SubredditSubscription.SubredditSubscriptionListener() { @Override public void onSubredditSubscriptionSuccess() { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditSubscription.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditSubscription.java index ea72db55..c8517154 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditSubscription.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubredditSubscription.java @@ -1,16 +1,16 @@ package ml.docilealligator.infinityforreddit; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.util.Log; +import androidx.annotation.NonNull; + import java.util.HashMap; import java.util.Map; import SubredditDatabase.SubredditData; import SubscribedSubredditDatabase.SubscribedSubredditDao; import SubscribedSubredditDatabase.SubscribedSubredditData; -import androidx.annotation.NonNull; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Retrofit; @@ -22,27 +22,27 @@ class SubredditSubscription { } static void subscribeToSubreddit(Retrofit oauthRetrofit, Retrofit retrofit, - SharedPreferences authInfoSharedPreferences, String subredditName, + String accessToken, String subredditName, String accountName, SubscribedSubredditDao subscribedSubredditDao, SubredditSubscriptionListener subredditSubscriptionListener) { - subredditSubscription(oauthRetrofit, retrofit, authInfoSharedPreferences, subredditName, "sub", + subredditSubscription(oauthRetrofit, retrofit, accessToken, subredditName, accountName, "sub", subscribedSubredditDao, subredditSubscriptionListener); } - static void unsubscribeToSubreddit(Retrofit oauthRetrofit, SharedPreferences authInfoSharedPreferences, - String subredditName, SubscribedSubredditDao subscribedSubredditDao, + static void unsubscribeToSubreddit(Retrofit oauthRetrofit, String accessToken, + String subredditName, String accountName, + SubscribedSubredditDao subscribedSubredditDao, SubredditSubscriptionListener subredditSubscriptionListener) { - subredditSubscription(oauthRetrofit, null, authInfoSharedPreferences, subredditName, "unsub", + subredditSubscription(oauthRetrofit, null, accessToken, subredditName, accountName, "unsub", subscribedSubredditDao,subredditSubscriptionListener); } - private static void subredditSubscription(Retrofit oauthRetrofit, Retrofit retrofit, SharedPreferences authInfoSharedPreferences, - String subredditName, String action, SubscribedSubredditDao subscribedSubredditDao, + private static void subredditSubscription(Retrofit oauthRetrofit, Retrofit retrofit, String accessToken, + String subredditName, String accountName, 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); @@ -57,7 +57,7 @@ class SubredditSubscription { @Override public void onFetchSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) { new UpdateSubscriptionAsyncTask(subscribedSubredditDao, - subredditData, true).execute(); + subredditData, accountName, true).execute(); } @Override @@ -66,7 +66,7 @@ class SubredditSubscription { } }); } else { - new UpdateSubscriptionAsyncTask(subscribedSubredditDao, subredditName, false).execute(); + new UpdateSubscriptionAsyncTask(subscribedSubredditDao, subredditName, accountName, false).execute(); } subredditSubscriptionListener.onSubredditSubscriptionSuccess(); } else { @@ -87,20 +87,24 @@ class SubredditSubscription { private SubscribedSubredditDao subscribedSubredditDao; private String subredditName; + private String accountName; private SubscribedSubredditData subscribedSubredditData; private boolean isSubscribing; UpdateSubscriptionAsyncTask(SubscribedSubredditDao subscribedSubredditDao, String subredditName, - boolean isSubscribing) { + String accountName, boolean isSubscribing) { this.subscribedSubredditDao = subscribedSubredditDao; this.subredditName = subredditName; + this.accountName = accountName; this.isSubscribing = isSubscribing; } - UpdateSubscriptionAsyncTask(SubscribedSubredditDao subscribedSubredditDao, SubscribedSubredditData subscribedSubredditData, - boolean isSubscribing) { + UpdateSubscriptionAsyncTask(SubscribedSubredditDao subscribedSubredditDao, SubredditData subredditData, + String accountName, boolean isSubscribing) { this.subscribedSubredditDao = subscribedSubredditDao; - this.subscribedSubredditData = subscribedSubredditData; + this.subscribedSubredditData = new SubscribedSubredditData(subredditData.getId(), subredditData.getName(), + subredditData.getIconUrl(), accountName); + this.accountName = accountName; this.isSubscribing = isSubscribing; } @@ -109,7 +113,7 @@ class SubredditSubscription { if(isSubscribing) { subscribedSubredditDao.insert(subscribedSubredditData); } else { - subscribedSubredditDao.deleteSubscribedSubreddit(subredditName);; + subscribedSubredditDao.deleteSubscribedSubreddit(subredditName, accountName); } return null; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedSubredditsListingFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedSubredditsListingFragment.java index 1e7304c6..21a7c894 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedSubredditsListingFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedSubredditsListingFragment.java @@ -2,7 +2,6 @@ package ml.docilealligator.infinityforreddit; import android.app.Activity; -import android.content.SharedPreferences; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -10,6 +9,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.LinearLayoutManager; @@ -19,7 +19,6 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; import javax.inject.Inject; -import javax.inject.Named; import SubscribedSubredditDatabase.SubscribedSubredditViewModel; import butterknife.BindView; @@ -31,6 +30,8 @@ import butterknife.ButterKnife; */ public class SubscribedSubredditsListingFragment extends Fragment { + static final String EXTRA_ACCOUNT_NAME = "EAT"; + static final String EXTRA_ACCOUNT_PROFILE_IMAGE_URL = "EAPIU"; static final String EXTRA_IS_SUBREDDIT_SELECTION = "EISS"; static final String EXTRA_EXTRA_CLEAR_SELECTION = "EECS"; @@ -45,15 +46,14 @@ public class SubscribedSubredditsListingFragment extends Fragment { private SubscribedSubredditViewModel mSubscribedSubredditViewModel; @Inject - @Named("user_info") - SharedPreferences sharedPreferences; + RedditDataRoomDatabase mRedditDataRoomDatabase; public SubscribedSubredditsListingFragment() { // Required empty public constructor } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_subscribed_subreddits_listing, container, false); @@ -63,8 +63,7 @@ public class SubscribedSubredditsListingFragment extends Fragment { ((Infinity) mActivity.getApplication()).getmAppComponent().inject(this); - String username = sharedPreferences.getString(SharedPreferencesUtils.USER_KEY, ""); - String userIconUrl = sharedPreferences.getString(SharedPreferencesUtils.PROFILE_IMAGE_URL_KEY, ""); + String accountName = getArguments().getString(EXTRA_ACCOUNT_NAME); mGlide = Glide.with(this); @@ -80,7 +79,9 @@ public class SubscribedSubredditsListingFragment extends Fragment { mRecyclerView.setAdapter(adapter); - mSubscribedSubredditViewModel = ViewModelProviders.of(this).get(SubscribedSubredditViewModel.class); + mSubscribedSubredditViewModel = ViewModelProviders.of(this, + new SubscribedSubredditViewModel.Factory(mActivity.getApplication(), mRedditDataRoomDatabase, accountName)) + .get(SubscribedSubredditViewModel.class); mSubscribedSubredditViewModel.getAllSubscribedSubreddits().observe(this, subscribedSubredditData -> { if (subscribedSubredditData == null || subscribedSubredditData.size() == 0) { mRecyclerView.setVisibility(View.GONE); @@ -91,7 +92,7 @@ public class SubscribedSubredditsListingFragment extends Fragment { mRecyclerView.setVisibility(View.VISIBLE); } - adapter.addUser(username, userIconUrl); + adapter.addUser(accountName, getArguments().getString(EXTRA_ACCOUNT_PROFILE_IMAGE_URL)); adapter.setSubscribedSubreddits(subscribedSubredditData); }); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedThingListingActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedThingListingActivity.java index 92568a9f..2ae3471f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedThingListingActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/SubscribedThingListingActivity.java @@ -1,6 +1,5 @@ package ml.docilealligator.infinityforreddit; -import android.content.SharedPreferences; import android.os.Bundle; import android.view.MenuItem; import android.view.ViewGroup; @@ -21,11 +20,8 @@ import javax.inject.Inject; import javax.inject.Named; import SubredditDatabase.SubredditData; -import SubredditDatabase.SubredditRoomDatabase; import SubscribedSubredditDatabase.SubscribedSubredditData; -import SubscribedSubredditDatabase.SubscribedSubredditRoomDatabase; import SubscribedUserDatabase.SubscribedUserData; -import SubscribedUserDatabase.SubscribedUserRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import retrofit2.Retrofit; @@ -34,22 +30,28 @@ public class SubscribedThingListingActivity extends AppCompatActivity { private static final String INSERT_SUBSCRIBED_SUBREDDIT_STATE = "ISSS"; + private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; + private static final String ACCESS_TOKEN_STATE = "ATS"; + private static final String ACCOUNT_NAME_STATE = "ANS"; + @BindView(R.id.toolbar_subscribed_thing_listing_activity) Toolbar toolbar; @BindView(R.id.tab_layout_subscribed_thing_listing_activity) TabLayout tabLayout; @BindView(R.id.view_pager_subscribed_thing_listing_activity) ViewPager viewPager; + private boolean mNullAccessToken = false; + private String mAccessToken; + private String mAccountName; private boolean mInsertSuccess = false; private SectionsPagerAdapter sectionsPagerAdapter; @Inject - @Named("auth_info") - SharedPreferences mAuthInfoSharedPreferences; - - @Inject @Named("oauth") Retrofit mOauthRetrofit; + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -62,15 +64,39 @@ public class SubscribedThingListingActivity extends AppCompatActivity { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + if(savedInstanceState != null) { + mInsertSuccess = savedInstanceState.getBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE); + mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE); + mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE); + mAccountName = savedInstanceState.getString(ACCOUNT_NAME_STATE); + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndInitializeViewPager(); + } else { + initializeViewPagerAndLoadSubscriptions(); + } + } else { + getCurrentAccountAndInitializeViewPager(); + } + } + + private void getCurrentAccountAndInitializeViewPager() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccessToken = true; + } else { + mAccessToken = account.getAccessToken(); + mAccountName = account.getUsername(); + } + initializeViewPagerAndLoadSubscriptions(); + }).execute(); + } + + private void initializeViewPagerAndLoadSubscriptions() { sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(sectionsPagerAdapter); viewPager.setOffscreenPageLimit(2); tabLayout.setupWithViewPager(viewPager); - if(savedInstanceState != null) { - mInsertSuccess = savedInstanceState.getBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE); - } - loadSubscriptions(); } @@ -88,11 +114,14 @@ public class SubscribedThingListingActivity extends AppCompatActivity { protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(INSERT_SUBSCRIBED_SUBREDDIT_STATE, mInsertSuccess); + outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken); + outState.putString(ACCESS_TOKEN_STATE, mAccessToken); + outState.putString(ACCOUNT_NAME_STATE, mAccountName); } private void loadSubscriptions() { if (!mInsertSuccess) { - FetchSubscribedThing.fetchSubscribedThing(mOauthRetrofit, mAuthInfoSharedPreferences, null, + FetchSubscribedThing.fetchSubscribedThing(mOauthRetrofit, mAccessToken, mAccountName, null, new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), new FetchSubscribedThing.FetchSubscribedThingListener() { @@ -101,9 +130,9 @@ public class SubscribedThingListingActivity extends AppCompatActivity { ArrayList<SubscribedUserData> subscribedUserData, ArrayList<SubredditData> subredditData) { new InsertSubscribedThingsAsyncTask( - SubscribedSubredditRoomDatabase.getDatabase(SubscribedThingListingActivity.this).subscribedSubredditDao(), - SubscribedUserRoomDatabase.getDatabase(SubscribedThingListingActivity.this).subscribedUserDao(), - SubredditRoomDatabase.getDatabase(SubscribedThingListingActivity.this).subredditDao(), + mRedditDataRoomDatabase.subscribedSubredditDao(), + mRedditDataRoomDatabase.subscribedUserDao(), + mRedditDataRoomDatabase.subredditDao(), subscribedSubredditData, subscribedUserData, subredditData, @@ -132,12 +161,17 @@ public class SubscribedThingListingActivity extends AppCompatActivity { SubscribedSubredditsListingFragment fragment = new SubscribedSubredditsListingFragment(); Bundle bundle = new Bundle(); bundle.putBoolean(SubscribedSubredditsListingFragment.EXTRA_IS_SUBREDDIT_SELECTION, false); + bundle.putString(SubscribedSubredditsListingFragment.EXTRA_ACCOUNT_NAME, mAccountName); fragment.setArguments(bundle); return fragment; } default: { - return new FollowedUsersListingFragment(); + FollowedUsersListingFragment fragment = new FollowedUsersListingFragment(); + Bundle bundle = new Bundle(); + bundle.putString(FollowedUsersListingFragment.EXTRA_ACCOUNT_NAME, mAccountName); + fragment.setArguments(bundle); + return fragment; } } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/UserFollowing.java b/app/src/main/java/ml/docilealligator/infinityforreddit/UserFollowing.java index 18fd09cb..cd7c4893 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/UserFollowing.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/UserFollowing.java @@ -1,6 +1,5 @@ package ml.docilealligator.infinityforreddit; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.util.Log; @@ -23,31 +22,29 @@ class UserFollowing { } static void followUser(Retrofit oauthRetrofit, Retrofit retrofit, - SharedPreferences authInfoSharedPreferences, String userName, + String accessToken, String username, String accountName, SubscribedUserDao subscribedUserDao, UserFollowingListener userFollowingListener) { - userFollowing(oauthRetrofit, retrofit, authInfoSharedPreferences, userName, "sub", + userFollowing(oauthRetrofit, retrofit, accessToken, username, accountName, "sub", subscribedUserDao, userFollowingListener); } static void unfollowUser(Retrofit oauthRetrofit, Retrofit retrofit, - SharedPreferences authInfoSharedPreferences, String userName, + String accessToken, String username, String accountName, SubscribedUserDao subscribedUserDao, UserFollowingListener userFollowingListener) { - userFollowing(oauthRetrofit, retrofit, authInfoSharedPreferences, userName, "unsub", + userFollowing(oauthRetrofit, retrofit, accessToken, username, accountName, "unsub", subscribedUserDao, userFollowingListener); } - private static void userFollowing(Retrofit oauthRetrofit, Retrofit retrofit, SharedPreferences authInfoSharedPreferences, - String userName, String action, SubscribedUserDao subscribedUserDao, + private static void userFollowing(Retrofit oauthRetrofit, Retrofit retrofit, String accessToken, + String username, String accountName, String action, SubscribedUserDao subscribedUserDao, UserFollowingListener userFollowingListener) { 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, "u_" + userName); + params.put(RedditUtils.SR_NAME_KEY, "u_" + username); Call<String> subredditSubscriptionCall = api.subredditSubscription(RedditUtils.getOAuthHeader(accessToken), params); subredditSubscriptionCall.enqueue(new Callback<String>() { @@ -55,10 +52,10 @@ class UserFollowing { public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) { if(response.isSuccessful()) { if(action.equals("sub")) { - FetchUserData.fetchUserData(retrofit, userName, new FetchUserData.FetchUserDataListener() { + FetchUserData.fetchUserData(retrofit, username, new FetchUserData.FetchUserDataListener() { @Override public void onFetchUserDataSuccess(UserData userData) { - new UpdateSubscriptionAsyncTask(subscribedUserDao, userData, true).execute(); + new UpdateSubscriptionAsyncTask(subscribedUserDao, userData, accountName, true).execute(); } @Override @@ -67,7 +64,7 @@ class UserFollowing { } }); } else { - new UpdateSubscriptionAsyncTask(subscribedUserDao, userName, false).execute(); + new UpdateSubscriptionAsyncTask(subscribedUserDao, username, accountName, false).execute(); } userFollowingListener.onUserFollowingSuccess(); } else { @@ -87,21 +84,25 @@ class UserFollowing { private static class UpdateSubscriptionAsyncTask extends AsyncTask<Void, Void, Void> { private SubscribedUserDao subscribedUserDao; - private String userName; + private String username; + private String accountName; private SubscribedUserData subscribedUserData; private boolean isSubscribing; - UpdateSubscriptionAsyncTask(SubscribedUserDao subscribedUserDao, String userName, - boolean isSubscribing) { + UpdateSubscriptionAsyncTask(SubscribedUserDao subscribedUserDao, String username, + String accountName, boolean isSubscribing) { this.subscribedUserDao = subscribedUserDao; - this.userName = userName; + this.username = username; + this.accountName = accountName; this.isSubscribing = isSubscribing; } - UpdateSubscriptionAsyncTask(SubscribedUserDao subscribedUserDao, SubscribedUserData subscribedUserData, - boolean isSubscribing) { + UpdateSubscriptionAsyncTask(SubscribedUserDao subscribedUserDao, UserData userData, + String accountName, boolean isSubscribing) { this.subscribedUserDao = subscribedUserDao; - this.subscribedUserData = subscribedUserData; + this.subscribedUserData = new SubscribedUserData(userData.getName(), userData.getIconUrl(), + userData.getName()); + this.accountName = accountName; this.isSubscribing = isSubscribing; } @@ -110,7 +111,7 @@ class UserFollowing { if(isSubscribing) { subscribedUserDao.insert(subscribedUserData); } else { - subscribedUserDao.deleteSubscribedUser(userName); + subscribedUserDao.deleteSubscribedUser(username, accountName); } return null; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/UserListingFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/UserListingFragment.java index 4b111a51..ae6f7a66 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/UserListingFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/UserListingFragment.java @@ -22,7 +22,6 @@ import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar; import javax.inject.Inject; import javax.inject.Named; -import SubscribedUserDatabase.SubscribedUserRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import retrofit2.Retrofit; @@ -32,20 +31,17 @@ import retrofit2.Retrofit; * A simple {@link Fragment} subclass. */ public class UserListingFragment extends Fragment implements FragmentCommunicator { - static final String QUERY_KEY = "QK"; - - @BindView(R.id.coordinator_layout_user_listing_fragment) - CoordinatorLayout mCoordinatorLayout; - @BindView(R.id.recycler_view_user_listing_fragment) - RecyclerView mUserListingRecyclerView; - @BindView(R.id.progress_bar_user_listing_fragment) - CircleProgressBar mProgressBar; - @BindView(R.id.fetch_user_listing_info_linear_layout_user_listing_fragment) - LinearLayout mFetchUserListingInfoLinearLayout; - @BindView(R.id.fetch_user_listing_info_image_view_user_listing_fragment) - ImageView mFetchUserListingInfoImageView; - @BindView(R.id.fetch_user_listing_info_text_view_user_listing_fragment) - TextView mFetchUserListingInfoTextView; + + static final String EXTRA_QUERY = "EQ"; + static final String EXTRA_ACCESS_TOKEN = "EAT"; + static final String EXTRA_ACCOUNT_NAME = "EAN"; + + @BindView(R.id.coordinator_layout_user_listing_fragment) CoordinatorLayout mCoordinatorLayout; + @BindView(R.id.recycler_view_user_listing_fragment) RecyclerView mUserListingRecyclerView; + @BindView(R.id.progress_bar_user_listing_fragment) CircleProgressBar mProgressBar; + @BindView(R.id.fetch_user_listing_info_linear_layout_user_listing_fragment) LinearLayout mFetchUserListingInfoLinearLayout; + @BindView(R.id.fetch_user_listing_info_image_view_user_listing_fragment) ImageView mFetchUserListingInfoImageView; + @BindView(R.id.fetch_user_listing_info_text_view_user_listing_fragment) TextView mFetchUserListingInfoTextView; private LinearLayoutManager mLinearLayoutManager; @@ -65,6 +61,9 @@ public class UserListingFragment extends Fragment implements FragmentCommunicato @Inject @Named("oauth") Retrofit mOauthRetrofit; + @Inject + RedditDataRoomDatabase redditDataRoomDatabase; + public UserListingFragment() { // Required empty public constructor } @@ -83,7 +82,9 @@ public class UserListingFragment extends Fragment implements FragmentCommunicato mLinearLayoutManager = new LinearLayoutManager(getActivity()); mUserListingRecyclerView.setLayoutManager(mLinearLayoutManager); - mQuery = getArguments().getString(QUERY_KEY); + mQuery = getArguments().getString(EXTRA_QUERY); + String accessToken = getArguments().getString(EXTRA_ACCESS_TOKEN); + String accountName = getArguments().getString(EXTRA_ACCOUNT_NAME); UserListingViewModel.Factory factory = new UserListingViewModel.Factory(mRetrofit, mQuery, PostDataSource.SORT_TYPE_RELEVANCE, new UserListingDataSource.OnUserListingDataFetchedCallback() { @@ -102,8 +103,7 @@ public class UserListingFragment extends Fragment implements FragmentCommunicato }); mAdapter = new UserListingRecyclerViewAdapter(getActivity(), mOauthRetrofit, mRetrofit, - mAuthInfoSharedPreferences, - SubscribedUserRoomDatabase.getDatabase(getContext()).subscribedUserDao(), + accessToken, accountName, redditDataRoomDatabase.subscribedUserDao(), () -> mUserListingViewModel.retryLoadingMore()); mUserListingRecyclerView.setAdapter(mAdapter); diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/UserListingRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/UserListingRecyclerViewAdapter.java index aa722fc6..415a6b41 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/UserListingRecyclerViewAdapter.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/UserListingRecyclerViewAdapter.java @@ -2,7 +2,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -44,21 +43,22 @@ public class UserListingRecyclerViewAdapter extends PagedListAdapter<UserData, R private Context context; private Retrofit oauthRetrofit; private Retrofit retrofit; - private SharedPreferences authInfoSharedPreferences; + private String accessToken; + private String accountName; private SubscribedUserDao subscribedUserDao; private NetworkState networkState; private UserListingRecyclerViewAdapter.RetryLoadingMoreCallback retryLoadingMoreCallback; UserListingRecyclerViewAdapter(Context context, Retrofit oauthRetrofit, Retrofit retrofit, - SharedPreferences authInfoSharedPreferences, - SubscribedUserDao subscribedUserDao, + String accessToken, String accountName, SubscribedUserDao subscribedUserDao, UserListingRecyclerViewAdapter.RetryLoadingMoreCallback retryLoadingMoreCallback) { super(DIFF_CALLBACK); this.context = context; this.oauthRetrofit = oauthRetrofit; this.retrofit = retrofit; - this.authInfoSharedPreferences = authInfoSharedPreferences; + this.accessToken = accessToken; + this.accountName = accountName; this.subscribedUserDao = subscribedUserDao; this.retryLoadingMoreCallback = retryLoadingMoreCallback; glide = Glide.with(context.getApplicationContext()); @@ -115,7 +115,7 @@ public class UserListingRecyclerViewAdapter extends PagedListAdapter<UserData, R ((UserListingRecyclerViewAdapter.DataViewHolder) holder).UserNameTextView.setText(userData.getName()); - new CheckIsFollowingUserAsyncTask(subscribedUserDao, userData.getName(), + new CheckIsFollowingUserAsyncTask(subscribedUserDao, userData.getName(), accountName, new CheckIsFollowingUserAsyncTask.CheckIsFollowingUserListener() { @Override public void isSubscribed() { @@ -127,7 +127,7 @@ public class UserListingRecyclerViewAdapter extends PagedListAdapter<UserData, R ((UserListingRecyclerViewAdapter.DataViewHolder) holder).subscribeButton.setVisibility(View.VISIBLE); ((UserListingRecyclerViewAdapter.DataViewHolder) holder).subscribeButton.setOnClickListener(view -> { UserFollowing.followUser(oauthRetrofit, retrofit, - authInfoSharedPreferences, userData.getName(), subscribedUserDao, + accessToken, userData.getName(), accountName, subscribedUserDao, new UserFollowing.UserFollowingListener() { @Override public void onUserFollowingSuccess() { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java index 87c4a380..a90e6d0a 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewPostDetailActivity.java @@ -2,7 +2,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Context; import android.content.Intent; -import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.Menu; @@ -60,6 +59,10 @@ public class ViewPostDetailActivity extends AppCompatActivity { private int postListPosition = -1; @State + boolean mNullAccessToken = false; + @State + String mAccessToken; + @State Post mPost; @State boolean isLoadingMoreChildren = false; @@ -94,8 +97,8 @@ public class ViewPostDetailActivity extends AppCompatActivity { @Inject @Named("oauth") Retrofit mOauthRetrofit; - @Inject @Named("auth_info") - SharedPreferences mSharedPreferences; + @Inject + RedditDataRoomDatabase mRedditDataRoomDatabase; @Override protected void onCreate(Bundle savedInstanceState) { @@ -121,6 +124,30 @@ public class ViewPostDetailActivity extends AppCompatActivity { orientation = getResources().getConfiguration().orientation; + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndBindView(); + } else { + bindView(); + } + + if(getIntent().hasExtra(EXTRA_POST_LIST_POSITION)) { + postListPosition = getIntent().getExtras().getInt(EXTRA_POST_LIST_POSITION); + } + } + + private void getCurrentAccountAndBindView() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccessToken = true; + } else { + mAccessToken = account.getAccessToken(); + } + + bindView(); + }).execute(); + } + + private void bindView() { if(mPost == null) { mPost = getIntent().getExtras().getParcelable(EXTRA_POST_DATA); } @@ -130,7 +157,7 @@ public class ViewPostDetailActivity extends AppCompatActivity { fetchPostAndCommentsById(getIntent().getExtras().getString(EXTRA_POST_ID)); } else { mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit, - mOauthRetrofit, mGlide, mSharedPreferences, mPost, + mOauthRetrofit, mRedditDataRoomDatabase, mGlide, mAccessToken, mPost, mPost.getSubredditNamePrefixed(), mLocale, mLoadSubredditIconAsyncTask, new CommentAndPostRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() { @Override @@ -163,12 +190,9 @@ public class ViewPostDetailActivity extends AppCompatActivity { } } } - - if(getIntent().hasExtra(EXTRA_POST_LIST_POSITION)) { - postListPosition = getIntent().getExtras().getInt(EXTRA_POST_LIST_POSITION); - } } + private void fetchPostAndCommentsById(String subredditId) { mFetchPostInfoLinearLayout.setVisibility(View.GONE); mGlide.clear(mFetchPostInfoImageView); @@ -190,7 +214,7 @@ public class ViewPostDetailActivity extends AppCompatActivity { mPost = post; mAdapter = new CommentAndPostRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit, - mOauthRetrofit, mGlide, mSharedPreferences, mPost, + mOauthRetrofit, mRedditDataRoomDatabase, mGlide, mAccessToken, mPost, mPost.getSubredditNamePrefixed(), mLocale, mLoadSubredditIconAsyncTask, new CommentAndPostRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() { @Override diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java index 6b7c67e9..287ebb5f 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewSubredditDetailActivity.java @@ -1,7 +1,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Intent; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.view.Menu; @@ -31,10 +30,8 @@ import javax.inject.Named; import SubredditDatabase.SubredditDao; import SubredditDatabase.SubredditData; -import SubredditDatabase.SubredditRoomDatabase; import SubredditDatabase.SubredditViewModel; import SubscribedSubredditDatabase.SubscribedSubredditDao; -import SubscribedSubredditDatabase.SubscribedSubredditRoomDatabase; import butterknife.BindView; import butterknife.ButterKnife; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; @@ -48,6 +45,9 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So private static final String FRAGMENT_OUT_STATE_KEY = "FOSK"; private static final String IS_IN_LAZY_MODE_STATE = "IILMS"; + private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; + private static final String ACCESS_TOKEN_STATE = "ATS"; + private static final String ACCOUNT_NAME_STATE = "ANS"; @BindView(R.id.coordinator_layout_view_subreddit_detail_activity) CoordinatorLayout coordinatorLayout; @BindView(R.id.appbar_layout_view_subreddit_detail) AppBarLayout appBarLayout; @@ -62,6 +62,9 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So @BindView(R.id.description_text_view_view_subreddit_detail_activity) TextView descriptionTextView; @BindView(R.id.fab_view_subreddit_detail_activity) FloatingActionButton fab; + private boolean mNullAccessToken = false; + private String mAccessToken; + private String mAccountName; private String subredditName; private boolean subscriptionReady = false; private boolean isInLazyMode = false; @@ -85,8 +88,7 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So Retrofit mOauthRetrofit; @Inject - @Named("auth_info") - SharedPreferences sharedPreferences; + RedditDataRoomDatabase mRedditDataRoomDatabase; @Override protected void onCreate(Bundle savedInstanceState) { @@ -97,6 +99,23 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So ((Infinity) getApplication()).getmAppComponent().inject(this); + if(savedInstanceState == null) { + getCurrentAccountAndBindView(); + } else { + mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE); + mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE); + mAccountName = savedInstanceState.getString(ACCOUNT_NAME_STATE); + isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); + + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndBindView(); + } else { + bindView(false); + mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY); + getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit(); + } + } + postTypeBottomSheetFragment = new PostTypeBottomSheetFragment(); sortTypeBottomSheetFragment = new SortTypeBottomSheetFragment(); @@ -123,10 +142,11 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams(); params.topMargin = statusBarHeight; - subscribedSubredditDao = SubscribedSubredditRoomDatabase.getDatabase(this).subscribedSubredditDao(); + subscribedSubredditDao = mRedditDataRoomDatabase.subscribedSubredditDao(); glide = Glide.with(this); - mSubredditViewModel = ViewModelProviders.of(this, new SubredditViewModel.Factory(getApplication(), subredditName)) + mSubredditViewModel = ViewModelProviders.of(this, + new SubredditViewModel.Factory(getApplication(), mRedditDataRoomDatabase, subredditName)) .get(SubredditViewModel.class); mSubredditViewModel.getSubredditLiveData().observe(this, subredditData -> { if(subredditData != null) { @@ -183,12 +203,44 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So } }); + FetchSubredditData.fetchSubredditData(mRetrofit, subredditName, new FetchSubredditData.FetchSubredditDataListener() { + @Override + public void onFetchSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) { + new InsertSubredditDataAsyncTask(mRedditDataRoomDatabase, subredditData) + .execute(); + String nOnlineSubscribers = getString(R.string.online_subscribers_number_detail, nCurrentOnlineSubscribers); + nOnlineSubscribersTextView.setText(nOnlineSubscribers); + } + + @Override + public void onFetchSubredditDataFail() { + + } + }); + + fab.setOnClickListener(view -> postTypeBottomSheetFragment.show(getSupportFragmentManager(), postTypeBottomSheetFragment.getTag())); + } + + private void getCurrentAccountAndBindView() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccessToken = true; + } else { + mAccessToken = account.getAccessToken(); + mAccountName = account.getUsername(); + } + bindView(true); + }).execute(); + } + + private void bindView(boolean initializeFragment) { 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() { + SubredditSubscription.subscribeToSubreddit(mOauthRetrofit, mRetrofit, mAccessToken, + subredditName, mAccountName, subscribedSubredditDao, + new SubredditSubscription.SubredditSubscriptionListener() { @Override public void onSubredditSubscriptionSuccess() { subscribeSubredditChip.setText(R.string.unsubscribe); @@ -204,8 +256,9 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So } }); } else { - SubredditSubscription.unsubscribeToSubreddit(mOauthRetrofit, sharedPreferences, - subredditName, subscribedSubredditDao, new SubredditSubscription.SubredditSubscriptionListener() { + SubredditSubscription.unsubscribeToSubreddit(mOauthRetrofit, mAccessToken, + subredditName, mAccountName, subscribedSubredditDao, + new SubredditSubscription.SubredditSubscriptionListener() { @Override public void onSubredditSubscriptionSuccess() { subscribeSubredditChip.setText(R.string.subscribe); @@ -224,63 +277,34 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So } }); - new CheckIsSubscribedToSubredditAsyncTask(subscribedSubredditDao, subredditName, + new CheckIsSubscribedToSubredditAsyncTask(subscribedSubredditDao, subredditName, mAccountName, 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.backgroundColorPrimaryDark)); - subscriptionReady = true; - } - }).execute(); - - FetchSubredditData.fetchSubredditData(mRetrofit, subredditName, new FetchSubredditData.FetchSubredditDataListener() { - @Override - public void onFetchSubredditDataSuccess(SubredditData subredditData, int nCurrentOnlineSubscribers) { - new InsertSubredditDataAsyncTask(SubredditRoomDatabase.getDatabase(ViewSubredditDetailActivity.this), subredditData) - .execute(); - String nOnlineSubscribers = getString(R.string.online_subscribers_number_detail, nCurrentOnlineSubscribers); - nOnlineSubscribersTextView.setText(nOnlineSubscribers); - } - - @Override - public void onFetchSubredditDataFail() { - - } - }); - - if(savedInstanceState == null) { + @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.backgroundColorPrimaryDark)); + subscriptionReady = true; + } + }).execute(); + + if(initializeFragment) { mFragment = new PostFragment(); Bundle bundle = new Bundle(); bundle.putString(PostFragment.EXTRA_NAME, subredditName); bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT); bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST); bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER); + bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); mFragment.setArguments(bundle); getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit(); - } else { - mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY); - if(mFragment == null) { - mFragment = new PostFragment(); - Bundle bundle = new Bundle(); - bundle.putString(PostFragment.EXTRA_NAME, subredditName); - bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_SUBREDDIT); - bundle.putString(PostFragment.EXTRA_SORT_TYPE, PostDataSource.SORT_TYPE_BEST); - bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER); - mFragment.setArguments(bundle); - } - isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); - getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit(); } - - fab.setOnClickListener(view -> postTypeBottomSheetFragment.show(getSupportFragmentManager(), postTypeBottomSheetFragment.getTag())); } @Override @@ -347,6 +371,9 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(IS_IN_LAZY_MODE_STATE, isInLazyMode); + outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken); + outState.putString(ACCESS_TOKEN_STATE, mAccessToken); + outState.putString(ACCOUNT_NAME_STATE, mAccountName); getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE_KEY, mFragment); } @@ -390,8 +417,8 @@ public class ViewSubredditDetailActivity extends AppCompatActivity implements So private SubredditDao mSubredditDao; private SubredditData subredditData; - InsertSubredditDataAsyncTask(SubredditRoomDatabase subredditDb, SubredditData subredditData) { - mSubredditDao = subredditDb.subredditDao(); + InsertSubredditDataAsyncTask(RedditDataRoomDatabase db, SubredditData subredditData) { + mSubredditDao = db.subredditDao(); this.subredditData = subredditData; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java index 2381c59a..fc5f7264 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ViewUserDetailActivity.java @@ -1,7 +1,6 @@ package ml.docilealligator.infinityforreddit; import android.content.Intent; -import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Bundle; import android.view.Menu; @@ -33,10 +32,8 @@ import javax.inject.Inject; import javax.inject.Named; import SubscribedUserDatabase.SubscribedUserDao; -import SubscribedUserDatabase.SubscribedUserRoomDatabase; import User.UserDao; import User.UserData; -import User.UserRoomDatabase; import User.UserViewModel; import butterknife.BindView; import butterknife.ButterKnife; @@ -48,6 +45,9 @@ public class ViewUserDetailActivity extends AppCompatActivity { public static final String EXTRA_USER_NAME_KEY = "EUNK"; + private static final String NULL_ACCESS_TOKEN_STATE = "NATS"; + private static final String ACCESS_TOKEN_STATE = "ATS"; + private static final String ACCOUNT_NAME_STATE = "ANS"; private static final String IS_IN_LAZY_MODE_STATE = "IILMS"; @BindView(R.id.coordinator_layout_view_user_detail_activity) CoordinatorLayout coordinatorLayout; @@ -69,6 +69,9 @@ public class ViewUserDetailActivity extends AppCompatActivity { private Menu mMenu; private AppBarLayout.LayoutParams params; + private boolean mNullAccessToken = false; + private String mAccessToken; + private String mAccountName; private String username; private boolean subscriptionReady = false; private boolean isInLazyMode = false; @@ -88,8 +91,7 @@ public class ViewUserDetailActivity extends AppCompatActivity { Retrofit mOauthRetrofit; @Inject - @Named("auth_info") - SharedPreferences sharedPreferences; + RedditDataRoomDatabase mRedditDataRoomDatabase; @Override protected void onCreate(Bundle savedInstanceState) { @@ -100,6 +102,23 @@ public class ViewUserDetailActivity extends AppCompatActivity { ((Infinity) getApplication()).getmAppComponent().inject(this); + if(savedInstanceState == null) { + getCurrentAccountAndInitializeViewPager(); + } else { + mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE); + mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE); + mAccountName = savedInstanceState.getString(ACCOUNT_NAME_STATE); + isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); + + if(!mNullAccessToken && mAccessToken == null) { + getCurrentAccountAndInitializeViewPager(); + } else { + initializeViewPager(); + } + } + + getCurrentAccountAndInitializeViewPager(); + params = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams(); //Get status bar height @@ -120,11 +139,6 @@ public class ViewUserDetailActivity extends AppCompatActivity { ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) toolbar.getLayoutParams(); params.topMargin = statusBarHeight; - sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - viewPager.setAdapter(sectionsPagerAdapter); - viewPager.setOffscreenPageLimit(2); - tabLayout.setupWithViewPager(viewPager); - expandedTabTextColor = getResources().getColor(R.color.tabLayoutWithExpandedCollapsingToolbarTextColor); expandedTabBackgroundColor = getResources().getColor(R.color.tabLayoutWithExpandedCollapsingToolbarTabBackground); expandedTabIndicatorColor = getResources().getColor(R.color.tabLayoutWithExpandedCollapsingToolbarTabIndicator); @@ -148,10 +162,10 @@ public class ViewUserDetailActivity extends AppCompatActivity { } }); - subscribedUserDao = SubscribedUserRoomDatabase.getDatabase(this).subscribedUserDao(); + subscribedUserDao = mRedditDataRoomDatabase.subscribedUserDao(); glide = Glide.with(this); - userViewModel = ViewModelProviders.of(this, new UserViewModel.Factory(getApplication(), username)) + userViewModel = ViewModelProviders.of(this, new UserViewModel.Factory(getApplication(), mRedditDataRoomDatabase, username)) .get(UserViewModel.class); userViewModel.getUserLiveData().observe(this, userData -> { if(userData != null) { @@ -199,8 +213,8 @@ public class ViewUserDetailActivity extends AppCompatActivity { if(subscriptionReady) { subscriptionReady = false; if(subscribeUserChip.getText().equals(getResources().getString(R.string.follow))) { - UserFollowing.followUser(mOauthRetrofit, mRetrofit, sharedPreferences, - username, subscribedUserDao, new UserFollowing.UserFollowingListener() { + UserFollowing.followUser(mOauthRetrofit, mRetrofit, mAccessToken, + username, mAccountName, subscribedUserDao, new UserFollowing.UserFollowingListener() { @Override public void onUserFollowingSuccess() { subscribeUserChip.setText(R.string.unfollow); @@ -216,8 +230,8 @@ public class ViewUserDetailActivity extends AppCompatActivity { } }); } else { - UserFollowing.unfollowUser(mOauthRetrofit, mRetrofit, sharedPreferences, - username, subscribedUserDao, new UserFollowing.UserFollowingListener() { + UserFollowing.unfollowUser(mOauthRetrofit, mRetrofit, mAccessToken, + username, mAccountName, subscribedUserDao, new UserFollowing.UserFollowingListener() { @Override public void onUserFollowingSuccess() { subscribeUserChip.setText(R.string.follow); @@ -236,7 +250,7 @@ public class ViewUserDetailActivity extends AppCompatActivity { } }); - new CheckIsFollowingUserAsyncTask(subscribedUserDao, username, new CheckIsFollowingUserAsyncTask.CheckIsFollowingUserListener() { + new CheckIsFollowingUserAsyncTask(subscribedUserDao, username, mAccountName, new CheckIsFollowingUserAsyncTask.CheckIsFollowingUserListener() { @Override public void isSubscribed() { subscribeUserChip.setText(R.string.unfollow); @@ -268,7 +282,7 @@ public class ViewUserDetailActivity extends AppCompatActivity { FetchUserData.fetchUserData(mRetrofit, username, new FetchUserData.FetchUserDataListener() { @Override public void onFetchUserDataSuccess(UserData userData) { - new InsertUserDataAsyncTask(UserRoomDatabase.getDatabase(ViewUserDetailActivity.this).userDao(), userData).execute(); + new InsertUserDataAsyncTask(mRedditDataRoomDatabase.userDao(), userData).execute(); } @Override @@ -276,26 +290,25 @@ public class ViewUserDetailActivity extends AppCompatActivity { makeSnackbar(R.string.cannot_fetch_user_info); } }); + } - if(savedInstanceState == null) { - /*mFragment = new PostFragment(); - Bundle bundle = new Bundle(); - bundle.putString(PostFragment.EXTRA_NAME, username); - bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER); - mFragment.setArguments(bundle); - getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_user_detail_activity, mFragment).commit();*/ - } else { - /*mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY); - if(mFragment == null) { - mFragment = new PostFragment(); - Bundle bundle = new Bundle(); - bundle.putString(PostFragment.EXTRA_NAME, username); - bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER); - mFragment.setArguments(bundle); - }*/ - isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE); - //getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_user_detail_activity, mFragment).commit(); - } + private void getCurrentAccountAndInitializeViewPager() { + new GetCurrentAccountAsyncTask(mRedditDataRoomDatabase.accountDao(), account -> { + if(account == null) { + mNullAccessToken = true; + } else { + mAccessToken = account.getAccessToken(); + mAccountName = account.getUsername(); + } + initializeViewPager(); + }).execute(); + } + + private void initializeViewPager() { + sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); + viewPager.setAdapter(sectionsPagerAdapter); + viewPager.setOffscreenPageLimit(2); + tabLayout.setupWithViewPager(viewPager); } @Override @@ -318,7 +331,7 @@ public class ViewUserDetailActivity extends AppCompatActivity { } @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); @@ -359,7 +372,9 @@ public class ViewUserDetailActivity extends AppCompatActivity { protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(IS_IN_LAZY_MODE_STATE, isInLazyMode); - //getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE_KEY, mFragment); + outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken); + outState.putString(ACCESS_TOKEN_STATE, mAccessToken); + outState.putString(ACCOUNT_NAME_STATE, mAccountName); } private void makeSnackbar(int resId) { @@ -438,12 +453,14 @@ public class ViewUserDetailActivity extends AppCompatActivity { bundle.putInt(PostFragment.EXTRA_POST_TYPE, PostDataSource.TYPE_USER); bundle.putString(PostFragment.EXTRA_USER_NAME, username); bundle.putInt(PostFragment.EXTRA_FILTER, PostFragment.EXTRA_NO_FILTER); + bundle.putString(PostFragment.EXTRA_ACCESS_TOKEN, mAccessToken); fragment.setArguments(bundle); return fragment; } CommentsListingFragment fragment = new CommentsListingFragment(); Bundle bundle = new Bundle(); bundle.putString(CommentsListingFragment.EXTRA_USERNAME_KEY, username); + bundle.putString(CommentsListingFragment.EXTRA_ACCESS_TOKEN, mAccessToken); fragment.setArguments(bundle); return fragment; } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/VoteThing.java b/app/src/main/java/ml/docilealligator/infinityforreddit/VoteThing.java index c6f8bc12..4bd39936 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/VoteThing.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/VoteThing.java @@ -1,6 +1,5 @@ package ml.docilealligator.infinityforreddit; -import android.content.SharedPreferences; import android.util.Log; import androidx.annotation.NonNull; @@ -28,12 +27,11 @@ class VoteThing { void onVoteThingFail(); } - static void voteThing(final Retrofit retrofit, SharedPreferences authInfoSharedPreferences, + static void voteThing(final Retrofit retrofit, String accessToken, final VoteThingListener voteThingListener, final String fullName, final String point, final int position) { RedditAPI api = retrofit.create(RedditAPI.class); - String accessToken = authInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); Map<String, String> params = new HashMap<>(); params.put(RedditUtils.DIR_KEY, point); params.put(RedditUtils.ID_KEY, fullName); @@ -58,12 +56,11 @@ class VoteThing { }); } - static void voteThing(final Retrofit retrofit, SharedPreferences authInfoSharedPreferences, + static void voteThing(final Retrofit retrofit, String accessToken, final VoteThingWithoutPositionListener voteThingWithoutPositionListener, final String fullName, final String point) { RedditAPI api = retrofit.create(RedditAPI.class); - String accessToken = authInfoSharedPreferences.getString(SharedPreferencesUtils.ACCESS_TOKEN_KEY, ""); Map<String, String> params = new HashMap<>(); params.put(RedditUtils.DIR_KEY, point); params.put(RedditUtils.ID_KEY, fullName); |