aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorDocile-Alligator <chineseperson5@gmail.com>2022-02-20 10:09:54 +0000
committerDocile-Alligator <chineseperson5@gmail.com>2022-02-20 10:09:54 +0000
commitfbc0006a4fc272e10b242b40f7d5a09814ed9a89 (patch)
tree1a97c1be7513b8c774d5563767f30e5ceaad5a47 /app
parentd76abc8c3eecb72705108f6d818a61658e172631 (diff)
downloadinfinity-for-reddit-fbc0006a4fc272e10b242b40f7d5a09814ed9a89.tar
infinity-for-reddit-fbc0006a4fc272e10b242b40f7d5a09814ed9a89.tar.gz
infinity-for-reddit-fbc0006a4fc272e10b242b40f7d5a09814ed9a89.tar.bz2
infinity-for-reddit-fbc0006a4fc272e10b242b40f7d5a09814ed9a89.tar.lz
infinity-for-reddit-fbc0006a4fc272e10b242b40f7d5a09814ed9a89.tar.xz
infinity-for-reddit-fbc0006a4fc272e10b242b40f7d5a09814ed9a89.tar.zst
infinity-for-reddit-fbc0006a4fc272e10b242b40f7d5a09814ed9a89.zip
Use ConcatAdapter for the navigation drawer.
Diffstat (limited to '')
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java16
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/NavigationDrawerRecyclerViewAdapter.java963
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/AccountManagementSectionRecyclerViewAdapter.java167
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/AccountSectionRecyclerViewAdapter.java188
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/FavoriteSubscribedSubredditsSectionRecyclerViewAdapter.java169
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/HeaderSectionRecyclerViewAdapter.java215
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/NavigationDrawerRecyclerViewMergedAdapter.java149
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/PostSectionRecyclerViewAdapter.java158
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/PreferenceSectionRecyclerViewAdapter.java187
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/RedditSectionRecyclerViewAdapter.java142
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/SubscribedSubredditsRecyclerViewAdapter.java169
-rw-r--r--app/src/main/res/drawable/ic_baseline_arrow_drop_down_24dp.xml (renamed from app/src/main/res/drawable/ic_baseline_arrow_drop_down_24px.xml)0
-rw-r--r--app/src/main/res/drawable/ic_baseline_arrow_drop_up_24dp.xml (renamed from app/src/main/res/drawable/ic_baseline_arrow_drop_up_24px.xml)0
-rw-r--r--app/src/main/res/layout/nav_header_main.xml2
14 files changed, 1552 insertions, 973 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java
index d42ca18d..2e253dfe 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java
@@ -83,8 +83,8 @@ import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
import ml.docilealligator.infinityforreddit.SortType;
import ml.docilealligator.infinityforreddit.SortTypeSelectionCallback;
import ml.docilealligator.infinityforreddit.account.AccountViewModel;
-import ml.docilealligator.infinityforreddit.adapters.NavigationDrawerRecyclerViewAdapter;
import ml.docilealligator.infinityforreddit.adapters.SubredditAutocompleteRecyclerViewAdapter;
+import ml.docilealligator.infinityforreddit.adapters.navigationdrawer.NavigationDrawerRecyclerViewMergedAdapter;
import ml.docilealligator.infinityforreddit.apis.RedditAPI;
import ml.docilealligator.infinityforreddit.asynctasks.InsertSubscribedThings;
import ml.docilealligator.infinityforreddit.asynctasks.SwitchAccount;
@@ -217,7 +217,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
Executor mExecutor;
private FragmentManager fragmentManager;
private SectionsPagerAdapter sectionsPagerAdapter;
- private NavigationDrawerRecyclerViewAdapter adapter;
+ private NavigationDrawerRecyclerViewMergedAdapter adapter;
private Call<String> subredditAutocompleteCall;
private String mAccessToken;
private String mAccountName;
@@ -297,9 +297,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
@Override
public void onDrawerClosed(View drawerView) {
if (adapter != null) {
- if (adapter.closeAccountSectionWithoutChangeIconResource(true)) {
- adapter.notifyItemChanged(0);
- }
+ adapter.closeAccountSectionWithoutChangeIconResource(true);
}
}
});
@@ -726,9 +724,9 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
});
fab.setVisibility(View.VISIBLE);
- adapter = new NavigationDrawerRecyclerViewAdapter(this, mSharedPreferences,
+ adapter = new NavigationDrawerRecyclerViewMergedAdapter(this, mSharedPreferences,
mNsfwAndSpoilerSharedPreferences, mNavigationDrawerSharedPreferences, mCustomThemeWrapper, mAccountName,
- new NavigationDrawerRecyclerViewAdapter.ItemClickListener() {
+ new NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener() {
@Override
public void onMenuClick(int stringId) {
Intent intent = null;
@@ -830,7 +828,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
});
adapter.setInboxCount(inboxCount);
navDrawerRecyclerView.setLayoutManager(new LinearLayoutManagerBugFixed(this));
- navDrawerRecyclerView.setAdapter(adapter);
+ navDrawerRecyclerView.setAdapter(adapter.getConcatAdapter());
int tabCount = mMainActivityTabsSharedPreferences.getInt((mAccountName == null ? "" : mAccountName) + SharedPreferencesUtils.MAIN_PAGE_TAB_COUNT, 3);
mShowFavoriteMultiReddits = mMainActivityTabsSharedPreferences.getBoolean((mAccountName == null ? "" : mAccountName) + SharedPreferencesUtils.MAIN_PAGE_SHOW_FAVORITE_MULTIREDDITS, false);
@@ -1241,7 +1239,7 @@ public class MainActivity extends BaseActivity implements SortTypeSelectionCallb
RecyclerView.LayoutManager layoutManager = navDrawerRecyclerView.getLayoutManager();
navDrawerRecyclerView.setAdapter(null);
navDrawerRecyclerView.setLayoutManager(null);
- navDrawerRecyclerView.setAdapter(adapter);
+ navDrawerRecyclerView.setAdapter(adapter.getConcatAdapter());
navDrawerRecyclerView.setLayoutManager(layoutManager);
if (previousPosition > 0) {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/NavigationDrawerRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/NavigationDrawerRecyclerViewAdapter.java
deleted file mode 100644
index d5e0f502..00000000
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/NavigationDrawerRecyclerViewAdapter.java
+++ /dev/null
@@ -1,963 +0,0 @@
-package ml.docilealligator.infinityforreddit.adapters;
-
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.biometric.BiometricManager;
-import androidx.biometric.BiometricPrompt;
-import androidx.core.content.ContextCompat;
-import androidx.core.content.res.ResourcesCompat;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.bumptech.glide.Glide;
-import com.bumptech.glide.RequestManager;
-import com.bumptech.glide.request.RequestOptions;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
-import ml.docilealligator.infinityforreddit.R;
-import ml.docilealligator.infinityforreddit.account.Account;
-import ml.docilealligator.infinityforreddit.activities.BaseActivity;
-import ml.docilealligator.infinityforreddit.activities.InboxActivity;
-import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
-import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubredditData;
-import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
-import pl.droidsonroids.gif.GifImageView;
-
-import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
-import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;
-
-public class NavigationDrawerRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
-
- public interface ItemClickListener {
- void onMenuClick(int stringId);
- void onSubscribedSubredditClick(String subredditName);
- void onAccountClick(String accountName);
- }
-
- private static final int VIEW_TYPE_NAV_HEADER = 0;
- private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
- private static final int VIEW_TYPE_MENU_ITEM = 2;
- private static final int VIEW_TYPE_DIVIDER = 3;
- private static final int VIEW_TYPE_FAVORITE_SUBSCRIBED_SUBREDDIT = 4;
- private static final int VIEW_TYPE_SUBSCRIBED_SUBREDDIT = 5;
- private static final int VIEW_TYPE_ACCOUNT = 6;
- private static final int CURRENT_MENU_ITEMS = 20;
- private static final int ACCOUNT_SECTION_ITEMS = 4;
- private static final int REDDIT_SECTION_ITEMS = 2;
- private static final int POST_SECTION_ITEMS = 5;
- private static final int PREFERENCES_SECTION_ITEMS = 3;
-
- private BaseActivity baseActivity;
- private Resources resources;
- private RequestManager glide;
- private String accountName;
- private String profileImageUrl;
- private String bannerImageUrl;
- private int karma;
- private int inboxCount;
- private boolean isNSFWEnabled;
- private boolean requireAuthToAccountSection;
- private boolean showAvatarOnTheRightInTheNavigationDrawer;
- private ItemClickListener itemClickListener;
- private boolean isLoggedIn;
- private boolean isInMainPage = true;
- private boolean collapseAccountSection;
- private boolean collapseRedditSection;
- private boolean collapsePostSection;
- private boolean collapsePreferencesSection;
- private boolean collapseFavoriteSubredditsSection;
- private boolean collapseSubscribedSubredditsSection;
- private boolean hideFavoriteSubredditsSection;
- private boolean hideSubscribedSubredditsSection;
- private ArrayList<SubscribedSubredditData> favoriteSubscribedSubreddits;
- private ArrayList<SubscribedSubredditData> subscribedSubreddits;
- private ArrayList<Account> accounts;
- private int primaryTextColor;
- private int secondaryTextColor;
- private int dividerColor;
- private int primaryIconColor;
-
- public NavigationDrawerRecyclerViewAdapter(BaseActivity baseActivity, SharedPreferences sharedPreferences,
- SharedPreferences nsfwAndSpoilerSharedPreferences,
- SharedPreferences navigationDrawerSharedPreferences,
- CustomThemeWrapper customThemeWrapper,
- String accountName,
- ItemClickListener itemClickListener) {
- this.baseActivity = baseActivity;
- resources = baseActivity.getResources();
- glide = Glide.with(baseActivity);
- this.accountName = accountName;
- isNSFWEnabled = nsfwAndSpoilerSharedPreferences.getBoolean((accountName == null ? "" : accountName) + SharedPreferencesUtils.NSFW_BASE, false);
- requireAuthToAccountSection = sharedPreferences.getBoolean(SharedPreferencesUtils.REQUIRE_AUTHENTICATION_TO_GO_TO_ACCOUNT_SECTION_IN_NAVIGATION_DRAWER, false);
- showAvatarOnTheRightInTheNavigationDrawer = sharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_AVATAR_ON_THE_RIGHT, false);
- isLoggedIn = accountName != null;
- collapseAccountSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_ACCOUNT_SECTION, false);
- collapseRedditSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_REDDIT_SECTION, false);
- collapsePostSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_POST_SECTION, false);
- collapsePreferencesSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_PREFERENCES_SECTION, false);
- collapseFavoriteSubredditsSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_FAVORITE_SUBREDDITS_SECTION, false);
- collapseSubscribedSubredditsSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_SUBSCRIBED_SUBREDDITS_SECTION, false);
- hideFavoriteSubredditsSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_FAVORITE_SUBREDDITS_SECTION, false);
- hideSubscribedSubredditsSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_SUBSCRIBED_SUBREDDITS_SECTIONS, false);
- showAvatarOnTheRightInTheNavigationDrawer = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_AVATAR_ON_THE_RIGHT, false);
-
- this.itemClickListener = itemClickListener;
- primaryTextColor = customThemeWrapper.getPrimaryTextColor();
- secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
- dividerColor = customThemeWrapper.getDividerColor();
- primaryIconColor = customThemeWrapper.getPrimaryIconColor();
- favoriteSubscribedSubreddits = new ArrayList<>();
- subscribedSubreddits = new ArrayList<>();
- }
-
- @Override
- public int getItemViewType(int position) {
- if (isInMainPage) {
- if (isLoggedIn) {
- if (position == CURRENT_MENU_ITEMS - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)) {
- return VIEW_TYPE_MENU_GROUP_TITLE;
- } else if (!hideFavoriteSubredditsSection && !favoriteSubscribedSubreddits.isEmpty() && position == CURRENT_MENU_ITEMS
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)
- + (collapseFavoriteSubredditsSection ? 0 : favoriteSubscribedSubreddits.size()) + 1) {
- return VIEW_TYPE_MENU_GROUP_TITLE;
- } else if (position > CURRENT_MENU_ITEMS - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)) {
- if (!favoriteSubscribedSubreddits.isEmpty() && !hideFavoriteSubredditsSection &&
- !collapseFavoriteSubredditsSection && position <= CURRENT_MENU_ITEMS
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)
- + favoriteSubscribedSubreddits.size()) {
- return VIEW_TYPE_FAVORITE_SUBSCRIBED_SUBREDDIT;
- } else {
- return VIEW_TYPE_SUBSCRIBED_SUBREDDIT;
- }
- } else if (position == 0) {
- return VIEW_TYPE_NAV_HEADER;
- } else if (position == 1
- || position == (ACCOUNT_SECTION_ITEMS + 2) - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- || position == (ACCOUNT_SECTION_ITEMS + REDDIT_SECTION_ITEMS + 3)
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- || position == (ACCOUNT_SECTION_ITEMS + REDDIT_SECTION_ITEMS + POST_SECTION_ITEMS + 4)
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)) {
- return VIEW_TYPE_MENU_GROUP_TITLE;
- } else if (position == (CURRENT_MENU_ITEMS - 1) - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)) {
- return VIEW_TYPE_DIVIDER;
- } else {
- return VIEW_TYPE_MENU_ITEM;
- }
- } else {
- if (position == 0) {
- return VIEW_TYPE_NAV_HEADER;
- } else {
- return VIEW_TYPE_MENU_ITEM;
- }
- }
- } else {
- if (position == 0) {
- return VIEW_TYPE_NAV_HEADER;
- }
- if (accounts != null) {
- if (position > accounts.size()) {
- return VIEW_TYPE_MENU_ITEM;
- } else {
- return VIEW_TYPE_ACCOUNT;
- }
- } else {
- return VIEW_TYPE_MENU_ITEM;
- }
- }
- }
-
- @NonNull
- @Override
- public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
- switch (viewType) {
- case VIEW_TYPE_NAV_HEADER:
- return new NavHeaderViewHolder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.nav_header_main, parent, false));
- case VIEW_TYPE_MENU_GROUP_TITLE:
- return new MenuGroupTitleViewHolder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.item_nav_drawer_menu_group_title, parent, false));
- case VIEW_TYPE_MENU_ITEM:
- return new MenuItemViewHolder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.item_nav_drawer_menu_item, parent, false));
- case VIEW_TYPE_DIVIDER:
- return new DividerViewHolder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.item_nav_drawer_divider, parent, false));
- case VIEW_TYPE_ACCOUNT:
- return new AccountViewHolder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.item_nav_drawer_account, parent, false));
- case VIEW_TYPE_FAVORITE_SUBSCRIBED_SUBREDDIT:
- return new FavoriteSubscribedThingViewHolder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.item_nav_drawer_subscribed_thing, parent, false));
- default:
- return new SubscribedThingViewHolder(LayoutInflater.from(parent.getContext())
- .inflate(R.layout.item_nav_drawer_subscribed_thing, parent, false));
- }
- }
-
- @Override
- public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
- if (holder instanceof NavHeaderViewHolder) {
- RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) ((NavHeaderViewHolder) holder).profileImageView.getLayoutParams();
- if (showAvatarOnTheRightInTheNavigationDrawer) {
- params.addRule(RelativeLayout.ALIGN_PARENT_END);
- } else {
- params.removeRule(RelativeLayout.ALIGN_PARENT_END);
- }
- ((NavHeaderViewHolder) holder).profileImageView.setLayoutParams(params);
- if (isLoggedIn) {
- ((NavHeaderViewHolder) holder).karmaTextView.setText(baseActivity.getString(R.string.karma_info, karma));
- ((NavHeaderViewHolder) holder).accountNameTextView.setText(accountName);
- if (profileImageUrl != null && !profileImageUrl.equals("")) {
- glide.load(profileImageUrl)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0)))
- .error(glide.load(R.drawable.subreddit_default_icon)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0))))
- .into(((NavHeaderViewHolder) holder).profileImageView);
- } else {
- glide.load(R.drawable.subreddit_default_icon)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0)))
- .into(((NavHeaderViewHolder) holder).profileImageView);
- }
-
- if (bannerImageUrl != null && !bannerImageUrl.equals("")) {
- glide.load(bannerImageUrl).into(((NavHeaderViewHolder) holder).bannerImageView);
- }
- } else {
- ((NavHeaderViewHolder) holder).karmaTextView.setText(R.string.press_here_to_login);
- ((NavHeaderViewHolder) holder).accountNameTextView.setText(R.string.anonymous_account);
- glide.load(R.drawable.subreddit_default_icon)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0)))
- .into(((NavHeaderViewHolder) holder).profileImageView);
- }
-
- if (isInMainPage) {
- ((NavHeaderViewHolder) holder).dropIconImageView.setImageDrawable(resources.getDrawable(R.drawable.ic_baseline_arrow_drop_down_24px));
- } else {
- ((NavHeaderViewHolder) holder).dropIconImageView.setImageDrawable(resources.getDrawable(R.drawable.ic_baseline_arrow_drop_up_24px));
- }
-
- holder.itemView.setOnClickListener(view -> {
- if (isInMainPage) {
- if (requireAuthToAccountSection) {
- BiometricManager biometricManager = BiometricManager.from(baseActivity);
- if (biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) == BiometricManager.BIOMETRIC_SUCCESS) {
- Executor executor = ContextCompat.getMainExecutor(baseActivity);
- BiometricPrompt biometricPrompt = new BiometricPrompt(baseActivity,
- executor, new BiometricPrompt.AuthenticationCallback() {
- @Override
- public void onAuthenticationSucceeded(
- @NonNull BiometricPrompt.AuthenticationResult result) {
- super.onAuthenticationSucceeded(result);
- openAccountSection(((NavHeaderViewHolder) holder).dropIconImageView);
- }
- });
-
- BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
- .setTitle(baseActivity.getString(R.string.unlock_account_section))
- .setAllowedAuthenticators(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)
- .build();
-
- biometricPrompt.authenticate(promptInfo);
- } else {
- openAccountSection(((NavHeaderViewHolder) holder).dropIconImageView);
- }
- } else {
- openAccountSection(((NavHeaderViewHolder) holder).dropIconImageView);
- }
- } else {
- ((NavHeaderViewHolder) holder).dropIconImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_baseline_arrow_drop_down_24px, null));
- closeAccountSectionWithoutChangeIconResource(false);
- }
- });
- } else if (holder instanceof MenuGroupTitleViewHolder) {
- int type;
- if (position == 1) {
- ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.label_account);
- if (collapseAccountSection) {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24px);
- } else {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24px);
- }
- type = 0;
- } else if (position == (ACCOUNT_SECTION_ITEMS + 2) - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)) {
- ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.label_reddit);
- if (collapseRedditSection) {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24px);
- } else {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24px);
- }
- type = 1;
- } else if (position == (ACCOUNT_SECTION_ITEMS + REDDIT_SECTION_ITEMS + 3)
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)) {
- ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.label_post);
- if (collapsePostSection) {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24px);
- } else {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24px);
- }
- type = 2;
- } else if (position == (ACCOUNT_SECTION_ITEMS + REDDIT_SECTION_ITEMS + POST_SECTION_ITEMS + 4)
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)) {
- ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.label_preferences);
- if (collapsePreferencesSection) {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24px);
- } else {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24px);
- }
- type = 3;
- } else {
- if (!hideFavoriteSubredditsSection && !favoriteSubscribedSubreddits.isEmpty() && position == CURRENT_MENU_ITEMS
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)) {
- ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.favorites);
- if (collapseFavoriteSubredditsSection) {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24px);
- } else {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24px);
- }
- type = 4;
- } else {
- ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.subscriptions);
- if (collapseSubscribedSubredditsSection) {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24px);
- } else {
- ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24px);
- }
- type = 5;
- }
- }
-
- holder.itemView.setOnClickListener(view -> {
- switch (type) {
- case 0:
- if (collapseAccountSection) {
- collapseAccountSection = !collapseAccountSection;
- notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, ACCOUNT_SECTION_ITEMS);
- } else {
- collapseAccountSection = !collapseAccountSection;
- notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, ACCOUNT_SECTION_ITEMS);
- }
- break;
- case 1:
- if (collapseRedditSection) {
- collapseRedditSection = !collapseRedditSection;
- notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, REDDIT_SECTION_ITEMS);
- } else {
- collapseRedditSection = !collapseRedditSection;
- notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, REDDIT_SECTION_ITEMS);
- }
- break;
- case 2:
- if (collapsePostSection) {
- collapsePostSection = !collapsePostSection;
- notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, POST_SECTION_ITEMS);
- } else {
- collapsePostSection = !collapsePostSection;
- notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, POST_SECTION_ITEMS);
- }
- break;
- case 3:
- if (collapsePreferencesSection) {
- collapsePreferencesSection = !collapsePreferencesSection;
- notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, PREFERENCES_SECTION_ITEMS);
- } else {
- collapsePreferencesSection = !collapsePreferencesSection;
- notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, PREFERENCES_SECTION_ITEMS);
- }
- break;
- case 4:
- if (collapseFavoriteSubredditsSection) {
- collapseFavoriteSubredditsSection = !collapseFavoriteSubredditsSection;
- notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, favoriteSubscribedSubreddits.size());
- } else {
- collapseFavoriteSubredditsSection = !collapseFavoriteSubredditsSection;
- notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, favoriteSubscribedSubreddits.size());
- }
- break;
- case 5:
- if (collapseSubscribedSubredditsSection) {
- collapseSubscribedSubredditsSection = !collapseSubscribedSubredditsSection;
- notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, subscribedSubreddits.size());
- } else {
- collapseSubscribedSubredditsSection = !collapseSubscribedSubredditsSection;
- notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, subscribedSubreddits.size());
- }
- break;
- }
- notifyItemChanged(holder.getBindingAdapterPosition());
- });
- } else if (holder instanceof MenuItemViewHolder) {
- int stringId = 0;
- int drawableId = 0;
- boolean setOnClickListener = true;
-
- if (isInMainPage) {
- if (isLoggedIn) {
- int pseudoPosition = position;
- if (collapseAccountSection && collapseRedditSection && collapsePostSection) {
- pseudoPosition += ACCOUNT_SECTION_ITEMS + REDDIT_SECTION_ITEMS + POST_SECTION_ITEMS;
- } else if (collapseAccountSection && collapseRedditSection) {
- pseudoPosition += ACCOUNT_SECTION_ITEMS + REDDIT_SECTION_ITEMS;
- } else if (collapseAccountSection && collapsePostSection) {
- if (position > REDDIT_SECTION_ITEMS + 2) {
- pseudoPosition += ACCOUNT_SECTION_ITEMS + POST_SECTION_ITEMS;
- } else {
- pseudoPosition += ACCOUNT_SECTION_ITEMS;
- }
- } else if (collapseRedditSection && collapsePostSection) {
- if (position > ACCOUNT_SECTION_ITEMS + 1) {
- pseudoPosition += REDDIT_SECTION_ITEMS + POST_SECTION_ITEMS;
- }
- } else if (collapseAccountSection) {
- pseudoPosition += ACCOUNT_SECTION_ITEMS;
- } else if (collapseRedditSection) {
- if (position > ACCOUNT_SECTION_ITEMS + 1) {
- pseudoPosition += REDDIT_SECTION_ITEMS;
- }
- } else if (collapsePostSection) {
- if (position > ACCOUNT_SECTION_ITEMS + REDDIT_SECTION_ITEMS + 2) {
- pseudoPosition += POST_SECTION_ITEMS;
- }
- }
- switch (pseudoPosition) {
- case 2:
- stringId = R.string.profile;
- drawableId = R.drawable.ic_account_circle_24dp;
- break;
- case 3:
- stringId = R.string.subscriptions;
- drawableId = R.drawable.ic_subscritptions_bottom_app_bar_24dp;
- break;
- case 4:
- stringId = R.string.multi_reddit;
- drawableId = R.drawable.ic_multi_reddit_24dp;
- break;
- case 5:
- setOnClickListener = false;
- if (inboxCount > 0) {
- ((MenuItemViewHolder) holder).menuTextView.setText(baseActivity.getString(R.string.inbox_with_count, inboxCount));
- } else {
- ((MenuItemViewHolder) holder).menuTextView.setText(R.string.inbox);
- }
- ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, R.drawable.ic_inbox_24dp));
- holder.itemView.setOnClickListener(view -> {
- Intent intent = new Intent(baseActivity, InboxActivity.class);
- baseActivity.startActivity(intent);
- });
- break;
- case 7:
- stringId = R.string.rpan;
- drawableId = R.drawable.ic_rpan_24dp;
- break;
- case 8:
- stringId = R.string.trending;
- drawableId = R.drawable.ic_trending_24dp;
- break;
- case 10:
- stringId = R.string.upvoted;
- drawableId = R.drawable.ic_arrow_upward_black_24dp;
- break;
- case 11:
- stringId = R.string.downvoted;
- drawableId = R.drawable.ic_arrow_downward_black_24dp;
- break;
- case 12:
- stringId = R.string.hidden;
- drawableId = R.drawable.ic_outline_lock_24dp;
- break;
- case 13:
- stringId = R.string.account_saved_thing_activity_label;
- drawableId = R.drawable.ic_outline_bookmarks_24dp;
- break;
- case 14:
- stringId = R.string.gilded;
- drawableId = R.drawable.ic_star_border_24dp;
- break;
- case 16:
- if ((resources.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) != Configuration.UI_MODE_NIGHT_YES) {
- stringId = R.string.dark_theme;
- drawableId = R.drawable.ic_dark_theme_24dp;
- } else {
- stringId = R.string.light_theme;
- drawableId = R.drawable.ic_light_theme_24dp;
- }
- break;
- case 17:
- setOnClickListener = false;
- if (isNSFWEnabled) {
- stringId = R.string.disable_nsfw;
- drawableId = R.drawable.ic_nsfw_off_24dp;
- } else {
- stringId = R.string.enable_nsfw;
- drawableId = R.drawable.ic_nsfw_on_24dp;
- }
-
- holder.itemView.setOnClickListener(view -> {
- if (isNSFWEnabled) {
- isNSFWEnabled = false;
- ((MenuItemViewHolder) holder).menuTextView.setText(R.string.enable_nsfw);
- ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, R.drawable.ic_nsfw_on_24dp));
- itemClickListener.onMenuClick(R.string.disable_nsfw);
- } else {
- isNSFWEnabled = true;
- ((MenuItemViewHolder) holder).menuTextView.setText(R.string.disable_nsfw);
- ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, R.drawable.ic_nsfw_off_24dp));
- itemClickListener.onMenuClick(R.string.enable_nsfw);
- }
- });
- break;
- case 18:
- stringId = R.string.settings;
- drawableId = R.drawable.ic_settings_24dp;
- }
- } else {
- switch (position) {
- case 1:
- stringId = R.string.subscriptions;
- drawableId = R.drawable.ic_subscritptions_bottom_app_bar_24dp;
- break;
- case 2:
- stringId = R.string.rpan;
- drawableId = R.drawable.ic_rpan_24dp;
- break;
- case 3:
- stringId = R.string.trending;
- drawableId = R.drawable.ic_trending_24dp;
- break;
- case 4:
- if ((resources.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) != Configuration.UI_MODE_NIGHT_YES) {
- stringId = R.string.dark_theme;
- drawableId = R.drawable.ic_dark_theme_24dp;
- } else {
- stringId = R.string.light_theme;
- drawableId = R.drawable.ic_light_theme_24dp;
- }
- break;
- case 5:
- setOnClickListener = false;
- if (isNSFWEnabled) {
- stringId = R.string.disable_nsfw;
- drawableId = R.drawable.ic_nsfw_off_24dp;
- } else {
- stringId = R.string.enable_nsfw;
- drawableId = R.drawable.ic_nsfw_on_24dp;
- }
-
- holder.itemView.setOnClickListener(view -> {
- if (isNSFWEnabled) {
- isNSFWEnabled = false;
- ((MenuItemViewHolder) holder).menuTextView.setText(R.string.enable_nsfw);
- ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, R.drawable.ic_nsfw_on_24dp));
- itemClickListener.onMenuClick(R.string.disable_nsfw);
- } else {
- isNSFWEnabled = true;
- ((MenuItemViewHolder) holder).menuTextView.setText(R.string.disable_nsfw);
- ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, R.drawable.ic_nsfw_off_24dp));
- itemClickListener.onMenuClick(R.string.enable_nsfw);
- }
- });
- break;
- case 6:
- stringId = R.string.settings;
- drawableId = R.drawable.ic_settings_24dp;
- }
- }
- } else {
- if (isLoggedIn) {
- int offset = accounts == null ? 0 : accounts.size();
- if (position == offset + 1) {
- stringId = R.string.add_account;
- drawableId = R.drawable.ic_outline_add_circle_outline_24dp;
- } else if (position == offset + 2) {
- stringId = R.string.anonymous_account;
- drawableId = R.drawable.ic_anonymous_24dp;
- } else if (position == offset + 3) {
- stringId = R.string.log_out;
- drawableId = R.drawable.ic_log_out_24dp;
- }
- } else {
- stringId = R.string.add_account;
- drawableId = R.drawable.ic_outline_add_circle_outline_24dp;
- }
- }
-
- if (stringId != 0) {
- ((MenuItemViewHolder) holder).menuTextView.setText(stringId);
- ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, drawableId));
- if (setOnClickListener) {
- int finalStringId = stringId;
- holder.itemView.setOnClickListener(view -> itemClickListener.onMenuClick(finalStringId));
- }
- }
- } else if (holder instanceof FavoriteSubscribedThingViewHolder) {
- SubscribedSubredditData subreddit = favoriteSubscribedSubreddits.get(position - (CURRENT_MENU_ITEMS
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0))
- - 1);
- String subredditName = subreddit.getName();
- String iconUrl = subreddit.getIconUrl();
- ((FavoriteSubscribedThingViewHolder) holder).subredditNameTextView.setText(subredditName);
- if (iconUrl != null && !iconUrl.equals("")) {
- glide.load(iconUrl)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
- .error(glide.load(R.drawable.subreddit_default_icon)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
- .into(((FavoriteSubscribedThingViewHolder) holder).iconGifImageView);
- } else {
- glide.load(R.drawable.subreddit_default_icon)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
- .into(((FavoriteSubscribedThingViewHolder) holder).iconGifImageView);
- }
-
- holder.itemView.setOnClickListener(view -> {
- itemClickListener.onSubscribedSubredditClick(subredditName);
- });
- } else if (holder instanceof SubscribedThingViewHolder) {
- SubscribedSubredditData subreddit = favoriteSubscribedSubreddits.isEmpty() || hideFavoriteSubredditsSection ? subscribedSubreddits.get(position - (CURRENT_MENU_ITEMS
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0))
- - 1)
- : subscribedSubreddits.get(position - (CURRENT_MENU_ITEMS
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0))
- - (collapseFavoriteSubredditsSection ? 0 : favoriteSubscribedSubreddits.size())
- - 2);
- String subredditName = subreddit.getName();
- String iconUrl = subreddit.getIconUrl();
- ((SubscribedThingViewHolder) holder).subredditNameTextView.setText(subredditName);
- if (iconUrl != null && !iconUrl.equals("")) {
- glide.load(iconUrl)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
- .error(glide.load(R.drawable.subreddit_default_icon)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
- .into(((SubscribedThingViewHolder) holder).iconGifImageView);
- } else {
- glide.load(R.drawable.subreddit_default_icon)
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
- .into(((SubscribedThingViewHolder) holder).iconGifImageView);
- }
-
- holder.itemView.setOnClickListener(view -> {
- itemClickListener.onSubscribedSubredditClick(subredditName);
- });
- } else if (holder instanceof AccountViewHolder) {
- glide.load(accounts.get(position - 1).getProfileImageUrl())
- .error(glide.load(R.drawable.subreddit_default_icon))
- .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(128, 0)))
- .into(((AccountViewHolder) holder).profileImageGifImageView);
- ((AccountViewHolder) holder).usernameTextView.setText(accounts.get(position - 1).getAccountName());
- holder.itemView.setOnClickListener(view ->
- itemClickListener.onAccountClick(accounts.get(position - 1).getAccountName()));
- }
- }
-
- public boolean closeAccountSectionWithoutChangeIconResource(boolean checkIsInMainPage) {
- if (!(checkIsInMainPage && isInMainPage)) {
- notifyItemRangeRemoved(1, getItemCount() - 1);
- if (isLoggedIn) {
- notifyItemRangeInserted(1, (favoriteSubscribedSubreddits.isEmpty() ? 0 : favoriteSubscribedSubreddits.size() + 1)
- + (subscribedSubreddits.isEmpty() ? 0 : subscribedSubreddits.size() + 1) + CURRENT_MENU_ITEMS - 1);
- } else {
- notifyItemRangeInserted(1, 2);
- }
- isInMainPage = true;
-
- return true;
- }
-
- return false;
- }
-
- private void openAccountSection(ImageView dropIconImageView) {
- dropIconImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_baseline_arrow_drop_up_24px, null));
- notifyItemRangeRemoved(1, getItemCount() - 1);
- if (accounts != null) {
- notifyItemRangeInserted(1, accounts.size() + 3);
- } else {
- if (isLoggedIn) {
- notifyItemRangeInserted(1, 3);
- } else {
- notifyItemInserted(1);
- }
- }
- isInMainPage = false;
- }
-
- @Override
- public int getItemCount() {
- if (isInMainPage) {
- if (isLoggedIn) {
- if (!(favoriteSubscribedSubreddits.isEmpty() && subscribedSubreddits.isEmpty())) {
- if (hideFavoriteSubredditsSection && hideSubscribedSubredditsSection) {
- return CURRENT_MENU_ITEMS
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0);
- } else if (hideFavoriteSubredditsSection) {
- return CURRENT_MENU_ITEMS
- + (subscribedSubreddits.isEmpty() ? 0 : subscribedSubreddits.size() + 1)
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)
- - (collapseSubscribedSubredditsSection ? subscribedSubreddits.size() : 0);
- } else if (hideSubscribedSubredditsSection) {
- return CURRENT_MENU_ITEMS + (favoriteSubscribedSubreddits.isEmpty() ? 0 : favoriteSubscribedSubreddits.size() + 1)
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)
- - (collapseFavoriteSubredditsSection ? favoriteSubscribedSubreddits.size() : 0);
- }
- return CURRENT_MENU_ITEMS + (favoriteSubscribedSubreddits.isEmpty() ? 0 : favoriteSubscribedSubreddits.size() + 1)
- + (subscribedSubreddits.isEmpty() ? 0 : subscribedSubreddits.size() + 1)
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0)
- - (collapseFavoriteSubredditsSection ? favoriteSubscribedSubreddits.size() : 0)
- - (collapseSubscribedSubredditsSection ? subscribedSubreddits.size() : 0);
- }
- return CURRENT_MENU_ITEMS - 1
- - (collapseAccountSection ? ACCOUNT_SECTION_ITEMS : 0)
- - (collapseRedditSection ? REDDIT_SECTION_ITEMS : 0)
- - (collapsePostSection ? POST_SECTION_ITEMS : 0)
- - (collapsePreferencesSection ? PREFERENCES_SECTION_ITEMS : 0);
- } else {
- return 7;
- }
- } else {
- if (isLoggedIn) {
- if (accounts != null && !accounts.isEmpty()) {
- return 4 + accounts.size();
- } else {
- return 4;
- }
- } else {
- if (accounts != null && !accounts.isEmpty()) {
- return 2 + accounts.size();
- } else {
- return 2;
- }
- }
- }
- }
-
- @Override
- public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
- super.onViewRecycled(holder);
- if (holder instanceof SubscribedThingViewHolder) {
- glide.clear(((SubscribedThingViewHolder) holder).iconGifImageView);
- }
- }
-
- public void setFavoriteSubscribedSubreddits(List<SubscribedSubredditData> favoriteSubscribedSubreddits) {
- this.favoriteSubscribedSubreddits = (ArrayList<SubscribedSubredditData>) favoriteSubscribedSubreddits;
- if (isInMainPage) {
- notifyDataSetChanged();
- }
- }
-
- public void setSubscribedSubreddits(List<SubscribedSubredditData> subscribedSubreddits) {
- this.subscribedSubreddits = (ArrayList<SubscribedSubredditData>) subscribedSubreddits;
- if (isInMainPage) {
- notifyDataSetChanged();
- }
- }
-
- public void changeAccountsDataset(List<Account> accounts) {
- this.accounts = (ArrayList<Account>) accounts;
- if (!isInMainPage) {
- notifyDataSetChanged();
- }
- }
-
- public void updateAccountInfo(String profileImageUrl, String bannerImageUrl, int karma) {
- this.profileImageUrl = profileImageUrl;
- this.bannerImageUrl = bannerImageUrl;
- this.karma = karma;
- notifyItemChanged(0);
- }
-
- public void setNSFWEnabled(boolean isNSFWEnabled) {
- this.isNSFWEnabled = isNSFWEnabled;
- if (isInMainPage) {
- if (isLoggedIn) {
- notifyItemChanged(CURRENT_MENU_ITEMS - 3);
- } else {
- notifyItemChanged(3);
- }
- }
- }
-
- public void setRequireAuthToAccountSection(boolean requireAuthToAccountSection) {
- this.requireAuthToAccountSection = requireAuthToAccountSection;
- }
-
- public void setShowAvatarOnTheRightInTheNavigationDrawer(boolean showAvatarOnTheRightInTheNavigationDrawer) {
- this.showAvatarOnTheRightInTheNavigationDrawer = showAvatarOnTheRightInTheNavigationDrawer;
- }
-
- public void setInboxCount(int inboxCount) {
- this.inboxCount = inboxCount;
- notifyDataSetChanged();
- }
-
- class NavHeaderViewHolder extends RecyclerView.ViewHolder {
- @BindView(R.id.name_text_view_nav_header_main)
- TextView accountNameTextView;
- @BindView(R.id.karma_text_view_nav_header_main)
- TextView karmaTextView;
- @BindView(R.id.profile_image_view_nav_header_main)
- GifImageView profileImageView;
- @BindView(R.id.banner_image_view_nav_header_main)
- ImageView bannerImageView;
- @BindView(R.id.account_switcher_image_view_nav_header_main)
- ImageView dropIconImageView;
-
- NavHeaderViewHolder(@NonNull View itemView) {
- super(itemView);
- ButterKnife.bind(this, itemView);
-
- if (baseActivity.typeface != null) {
- accountNameTextView.setTypeface(baseActivity.typeface);
- karmaTextView.setTypeface(baseActivity.typeface);
- }
- }
- }
-
- class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
- @BindView(R.id.title_text_view_item_nav_drawer_menu_group_title)
- TextView titleTextView;
- @BindView(R.id.collapse_indicator_image_view_item_nav_drawer_menu_group_title)
- ImageView collapseIndicatorImageView;
-
- MenuGroupTitleViewHolder(@NonNull View itemView) {
- super(itemView);
- ButterKnife.bind(this, itemView);
- if (baseActivity.typeface != null) {
- titleTextView.setTypeface(baseActivity.typeface);
- }
- titleTextView.setTextColor(secondaryTextColor);
- collapseIndicatorImageView.setColorFilter(secondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
- }
- }
-
- class MenuItemViewHolder extends RecyclerView.ViewHolder {
- @BindView(R.id.image_view_item_nav_drawer_menu_item)
- ImageView imageView;
- @BindView(R.id.text_view_item_nav_drawer_menu_item)
- TextView menuTextView;
-
- MenuItemViewHolder(@NonNull View itemView) {
- super(itemView);
- ButterKnife.bind(this, itemView);
- if (baseActivity.typeface != null) {
- menuTextView.setTypeface(baseActivity.typeface);
- }
- menuTextView.setTextColor(primaryTextColor);
- imageView.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
- }
- }
-
- class DividerViewHolder extends RecyclerView.ViewHolder {
-
- DividerViewHolder(@NonNull View itemView) {
- super(itemView);
- itemView.setBackgroundColor(dividerColor);
- }
- }
-
- class FavoriteSubscribedThingViewHolder extends RecyclerView.ViewHolder {
- @BindView(R.id.thing_icon_gif_image_view_item_nav_drawer_subscribed_thing)
- GifImageView iconGifImageView;
- @BindView(R.id.thing_name_text_view_item_nav_drawer_subscribed_thing)
- TextView subredditNameTextView;
-
- FavoriteSubscribedThingViewHolder(@NonNull View itemView) {
- super(itemView);
- ButterKnife.bind(this, itemView);
- if (baseActivity.typeface != null) {
- subredditNameTextView.setTypeface(baseActivity.typeface);
- }
- subredditNameTextView.setTextColor(primaryTextColor);
- }
- }
-
- class SubscribedThingViewHolder extends RecyclerView.ViewHolder {
- @BindView(R.id.thing_icon_gif_image_view_item_nav_drawer_subscribed_thing)
- GifImageView iconGifImageView;
- @BindView(R.id.thing_name_text_view_item_nav_drawer_subscribed_thing)
- TextView subredditNameTextView;
-
- SubscribedThingViewHolder(@NonNull View itemView) {
- super(itemView);
- ButterKnife.bind(this, itemView);
- if (baseActivity.typeface != null) {
- subredditNameTextView.setTypeface(baseActivity.typeface);
- }
- subredditNameTextView.setTextColor(primaryTextColor);
- }
- }
-
- class AccountViewHolder extends RecyclerView.ViewHolder {
- @BindView(R.id.profile_image_item_account)
- GifImageView profileImageGifImageView;
- @BindView(R.id.username_text_view_item_account)
- TextView usernameTextView;
-
- AccountViewHolder(@NonNull View itemView) {
- super(itemView);
- ButterKnife.bind(this, itemView);
- if (baseActivity.typeface != null) {
- usernameTextView.setTypeface(baseActivity.typeface);
- }
- usernameTextView.setTextColor(primaryTextColor);
- }
- }
-}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/AccountManagementSectionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/AccountManagementSectionRecyclerViewAdapter.java
new file mode 100644
index 00000000..55bf9602
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/AccountManagementSectionRecyclerViewAdapter.java
@@ -0,0 +1,167 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.RequestManager;
+import com.bumptech.glide.request.RequestOptions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.account.Account;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
+import pl.droidsonroids.gif.GifImageView;
+
+public class AccountManagementSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private static final int VIEW_TYPE_ACCOUNT = 1;
+ private static final int VIEW_TYPE_MENU_ITEM = 2;
+
+ private BaseActivity baseActivity;
+ private ArrayList<Account> accounts;
+ private RequestManager glide;
+ private int primaryTextColor;
+ private int primaryIconColor;
+ private boolean isLoggedIn;
+ private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
+
+ public AccountManagementSectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
+ RequestManager glide, boolean isLoggedIn,
+ NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener) {
+ this.baseActivity = baseActivity;
+ this.glide = glide;
+ primaryTextColor = customThemeWrapper.getPrimaryTextColor();
+ primaryIconColor = customThemeWrapper.getPrimaryIconColor();
+ this.isLoggedIn = isLoggedIn;
+ this.itemClickListener = itemClickListener;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ if (position >= accounts.size()) {
+ return VIEW_TYPE_MENU_ITEM;
+ } else {
+ return VIEW_TYPE_ACCOUNT;
+ }
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_ACCOUNT) {
+ return new AccountViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_account, parent, false));
+ }
+
+ return new MenuItemViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_item, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof AccountViewHolder) {
+ glide.load(accounts.get(position).getProfileImageUrl())
+ .error(glide.load(R.drawable.subreddit_default_icon))
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(128, 0)))
+ .into(((AccountViewHolder) holder).profileImageGifImageView);
+ ((AccountViewHolder) holder).usernameTextView.setText(accounts.get(position).getAccountName());
+ holder.itemView.setOnClickListener(view ->
+ itemClickListener.onAccountClick(accounts.get(position).getAccountName()));
+ } else if (holder instanceof MenuItemViewHolder) {
+ int stringId = 0;
+ int drawableId = 0;
+
+ if (isLoggedIn) {
+ int offset = accounts == null ? 0 : accounts.size();
+ if (position == offset) {
+ stringId = R.string.add_account;
+ drawableId = R.drawable.ic_outline_add_circle_outline_24dp;
+ } else if (position == offset + 1) {
+ stringId = R.string.anonymous_account;
+ drawableId = R.drawable.ic_anonymous_24dp;
+ } else if (position == offset + 2) {
+ stringId = R.string.log_out;
+ drawableId = R.drawable.ic_log_out_24dp;
+ }
+ } else {
+ stringId = R.string.add_account;
+ drawableId = R.drawable.ic_outline_add_circle_outline_24dp;
+ }
+
+ if (stringId != 0) {
+ ((MenuItemViewHolder) holder).menuTextView.setText(stringId);
+ ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, drawableId));
+ }
+ int finalStringId = stringId;
+ holder.itemView.setOnClickListener(view -> itemClickListener.onMenuClick(finalStringId));
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ if (isLoggedIn) {
+ if (accounts != null && !accounts.isEmpty()) {
+ return 3 + accounts.size();
+ } else {
+ return 3;
+ }
+ } else {
+ if (accounts != null && !accounts.isEmpty()) {
+ return 1 + accounts.size();
+ } else {
+ return 1;
+ }
+ }
+ }
+
+ public void changeAccountsDataset(List<Account> accounts) {
+ this.accounts = (ArrayList<Account>) accounts;
+ notifyDataSetChanged();
+ }
+
+ class AccountViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.profile_image_item_account)
+ GifImageView profileImageGifImageView;
+ @BindView(R.id.username_text_view_item_account)
+ TextView usernameTextView;
+
+ AccountViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ usernameTextView.setTypeface(baseActivity.typeface);
+ }
+ usernameTextView.setTextColor(primaryTextColor);
+ }
+ }
+
+ class MenuItemViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.image_view_item_nav_drawer_menu_item)
+ ImageView imageView;
+ @BindView(R.id.text_view_item_nav_drawer_menu_item)
+ TextView menuTextView;
+
+ MenuItemViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ menuTextView.setTypeface(baseActivity.typeface);
+ }
+ menuTextView.setTextColor(primaryTextColor);
+ imageView.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/AccountSectionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/AccountSectionRecyclerViewAdapter.java
new file mode 100644
index 00000000..348eb199
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/AccountSectionRecyclerViewAdapter.java
@@ -0,0 +1,188 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.activities.InboxActivity;
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
+
+public class AccountSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
+ private static final int VIEW_TYPE_MENU_ITEM = 2;
+ private static final int ACCOUNT_SECTION_ITEMS = 4;
+
+ private BaseActivity baseActivity;
+ private int inboxCount;
+ private int primaryTextColor;
+ private int secondaryTextColor;
+ private int primaryIconColor;
+ private boolean collapseAccountSection;
+ private boolean isLoggedIn;
+ private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
+
+ public AccountSectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
+ SharedPreferences navigationDrawerSharedPreferences, boolean isLoggedIn,
+ NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener) {
+ this.baseActivity = baseActivity;
+ primaryTextColor = customThemeWrapper.getPrimaryTextColor();
+ secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
+ primaryIconColor = customThemeWrapper.getPrimaryIconColor();
+ collapseAccountSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_ACCOUNT_SECTION, false);
+ this.isLoggedIn = isLoggedIn;
+ this.itemClickListener = itemClickListener;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return position == 0 ? VIEW_TYPE_MENU_GROUP_TITLE : VIEW_TYPE_MENU_ITEM;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_MENU_GROUP_TITLE) {
+ return new MenuGroupTitleViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_group_title, parent, false));
+ } else {
+ return new MenuItemViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_item, parent, false));
+ }
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof MenuGroupTitleViewHolder) {
+ ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.label_account);
+ if (collapseAccountSection) {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24dp);
+ } else {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24dp);
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ if (collapseAccountSection) {
+ collapseAccountSection = !collapseAccountSection;
+ notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, ACCOUNT_SECTION_ITEMS);
+ } else {
+ collapseAccountSection = !collapseAccountSection;
+ notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, ACCOUNT_SECTION_ITEMS);
+ }
+ notifyItemChanged(holder.getBindingAdapterPosition());
+ });
+ } else if (holder instanceof MenuItemViewHolder) {
+ int stringId = 0;
+ int drawableId = 0;
+ boolean setOnClickListener = true;
+
+ if (isLoggedIn) {
+ switch (position) {
+ case 1:
+ stringId = R.string.profile;
+ drawableId = R.drawable.ic_account_circle_24dp;
+ break;
+ case 2:
+ stringId = R.string.subscriptions;
+ drawableId = R.drawable.ic_subscritptions_bottom_app_bar_24dp;
+ break;
+ case 3:
+ stringId = R.string.multi_reddit;
+ drawableId = R.drawable.ic_multi_reddit_24dp;
+ break;
+ case 4:
+ setOnClickListener = false;
+ if (inboxCount > 0) {
+ ((MenuItemViewHolder) holder).menuTextView.setText(baseActivity.getString(R.string.inbox_with_count, inboxCount));
+ } else {
+ ((MenuItemViewHolder) holder).menuTextView.setText(R.string.inbox);
+ }
+ ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, R.drawable.ic_inbox_24dp));
+ holder.itemView.setOnClickListener(view -> {
+ Intent intent = new Intent(baseActivity, InboxActivity.class);
+ baseActivity.startActivity(intent);
+ });
+ break;
+
+ }
+ } else {
+ if (position == 1) {
+ stringId = R.string.subscriptions;
+ drawableId = R.drawable.ic_subscritptions_bottom_app_bar_24dp;
+ } else {
+ stringId = R.string.multi_reddit;
+ drawableId = R.drawable.ic_multi_reddit_24dp;
+ }
+ }
+
+ if (stringId != 0) {
+ ((MenuItemViewHolder) holder).menuTextView.setText(stringId);
+ ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, drawableId));
+ }
+ if (setOnClickListener) {
+ int finalStringId = stringId;
+ holder.itemView.setOnClickListener(view -> itemClickListener.onMenuClick(finalStringId));
+ }
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ if (isLoggedIn) {
+ return ACCOUNT_SECTION_ITEMS + 1;
+ }
+ return 3;
+ }
+
+ public void setInboxCount(int inboxCount) {
+ this.inboxCount = inboxCount;
+ notifyDataSetChanged();
+ }
+
+ class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.title_text_view_item_nav_drawer_menu_group_title)
+ TextView titleTextView;
+ @BindView(R.id.collapse_indicator_image_view_item_nav_drawer_menu_group_title)
+ ImageView collapseIndicatorImageView;
+
+ MenuGroupTitleViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ titleTextView.setTypeface(baseActivity.typeface);
+ }
+ titleTextView.setTextColor(secondaryTextColor);
+ collapseIndicatorImageView.setColorFilter(secondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+
+ class MenuItemViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.image_view_item_nav_drawer_menu_item)
+ ImageView imageView;
+ @BindView(R.id.text_view_item_nav_drawer_menu_item)
+ TextView menuTextView;
+
+ MenuItemViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ menuTextView.setTypeface(baseActivity.typeface);
+ }
+ menuTextView.setTextColor(primaryTextColor);
+ imageView.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/FavoriteSubscribedSubredditsSectionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/FavoriteSubscribedSubredditsSectionRecyclerViewAdapter.java
new file mode 100644
index 00000000..023b7944
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/FavoriteSubscribedSubredditsSectionRecyclerViewAdapter.java
@@ -0,0 +1,169 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import android.content.SharedPreferences;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.RequestManager;
+import com.bumptech.glide.request.RequestOptions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubredditData;
+import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
+import pl.droidsonroids.gif.GifImageView;
+
+public class FavoriteSubscribedSubredditsSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
+ private static final int VIEW_TYPE_FAVORITE_SUBSCRIBED_SUBREDDIT = 2;
+
+ private BaseActivity baseActivity;
+ private RequestManager glide;
+ private int primaryTextColor;
+ private int secondaryTextColor;
+ private boolean collapseFavoriteSubredditsSection;
+ private boolean hideFavoriteSubredditsSection;
+ private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
+ private ArrayList<SubscribedSubredditData> favoriteSubscribedSubreddits = new ArrayList<>();
+
+ public FavoriteSubscribedSubredditsSectionRecyclerViewAdapter(BaseActivity baseActivity, RequestManager glide,
+ CustomThemeWrapper customThemeWrapper,
+ SharedPreferences navigationDrawerSharedPreferences,
+ NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener) {
+ this.baseActivity = baseActivity;
+ this.glide = glide;
+ primaryTextColor = customThemeWrapper.getPrimaryTextColor();
+ secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
+ collapseFavoriteSubredditsSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_FAVORITE_SUBREDDITS_SECTION, false);
+ hideFavoriteSubredditsSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_FAVORITE_SUBREDDITS_SECTION, false);
+ this.itemClickListener = itemClickListener;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return position == 0 ? VIEW_TYPE_MENU_GROUP_TITLE : VIEW_TYPE_FAVORITE_SUBSCRIBED_SUBREDDIT;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_MENU_GROUP_TITLE) {
+ return new MenuGroupTitleViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_group_title, parent, false));
+ } else {
+ return new FavoriteSubscribedThingViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_subscribed_thing, parent, false));
+ }
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof MenuGroupTitleViewHolder) {
+ ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.favorites);
+ if (collapseFavoriteSubredditsSection) {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24dp);
+ } else {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24dp);
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ if (collapseFavoriteSubredditsSection) {
+ collapseFavoriteSubredditsSection = !collapseFavoriteSubredditsSection;
+ notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, favoriteSubscribedSubreddits.size());
+ } else {
+ collapseFavoriteSubredditsSection = !collapseFavoriteSubredditsSection;
+ notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, favoriteSubscribedSubreddits.size());
+ }
+ notifyItemChanged(holder.getBindingAdapterPosition());
+ });
+ } else if (holder instanceof FavoriteSubscribedThingViewHolder) {
+ SubscribedSubredditData subreddit = favoriteSubscribedSubreddits.get(position - 1);
+ String subredditName = subreddit.getName();
+ String iconUrl = subreddit.getIconUrl();
+ ((FavoriteSubscribedThingViewHolder) holder).subredditNameTextView.setText(subredditName);
+ if (iconUrl != null && !iconUrl.equals("")) {
+ glide.load(iconUrl)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
+ .error(glide.load(R.drawable.subreddit_default_icon)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
+ .into(((FavoriteSubscribedThingViewHolder) holder).iconGifImageView);
+ } else {
+ glide.load(R.drawable.subreddit_default_icon)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
+ .into(((FavoriteSubscribedThingViewHolder) holder).iconGifImageView);
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ itemClickListener.onSubscribedSubredditClick(subredditName);
+ });
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ if (hideFavoriteSubredditsSection) {
+ return 0;
+ }
+ return favoriteSubscribedSubreddits.isEmpty() ? 0 : (collapseFavoriteSubredditsSection ? 1 : favoriteSubscribedSubreddits.size() + 1);
+ }
+
+ @Override
+ public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
+ super.onViewRecycled(holder);
+ if (holder instanceof FavoriteSubscribedThingViewHolder) {
+ glide.clear(((FavoriteSubscribedThingViewHolder) holder).iconGifImageView);
+ }
+ }
+
+ public void setFavoriteSubscribedSubreddits(List<SubscribedSubredditData> favoriteSubscribedSubreddits) {
+ this.favoriteSubscribedSubreddits = (ArrayList<SubscribedSubredditData>) favoriteSubscribedSubreddits;
+ notifyDataSetChanged();
+ }
+
+ class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.title_text_view_item_nav_drawer_menu_group_title)
+ TextView titleTextView;
+ @BindView(R.id.collapse_indicator_image_view_item_nav_drawer_menu_group_title)
+ ImageView collapseIndicatorImageView;
+
+ MenuGroupTitleViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ titleTextView.setTypeface(baseActivity.typeface);
+ }
+ titleTextView.setTextColor(secondaryTextColor);
+ collapseIndicatorImageView.setColorFilter(secondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+
+ class FavoriteSubscribedThingViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.thing_icon_gif_image_view_item_nav_drawer_subscribed_thing)
+ GifImageView iconGifImageView;
+ @BindView(R.id.thing_name_text_view_item_nav_drawer_subscribed_thing)
+ TextView subredditNameTextView;
+
+ FavoriteSubscribedThingViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ subredditNameTextView.setTypeface(baseActivity.typeface);
+ }
+ subredditNameTextView.setTextColor(primaryTextColor);
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/HeaderSectionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/HeaderSectionRecyclerViewAdapter.java
new file mode 100644
index 00000000..6533f610
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/HeaderSectionRecyclerViewAdapter.java
@@ -0,0 +1,215 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
+import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;
+
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.biometric.BiometricManager;
+import androidx.biometric.BiometricPrompt;
+import androidx.core.content.ContextCompat;
+import androidx.core.content.res.ResourcesCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.RequestManager;
+import com.bumptech.glide.request.RequestOptions;
+
+import java.util.concurrent.Executor;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
+import pl.droidsonroids.gif.GifImageView;
+
+public class HeaderSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+ private BaseActivity baseActivity;
+ private Resources resources;
+ private RequestManager glide;
+ private String accountName;
+ private String profileImageUrl;
+ private String bannerImageUrl;
+ private int karma;
+ private boolean requireAuthToAccountSection;
+ private boolean showAvatarOnTheRightInTheNavigationDrawer;
+ private boolean isLoggedIn;
+ private boolean isInMainPage = true;
+ private PageToggle pageToggle;
+
+ public HeaderSectionRecyclerViewAdapter(BaseActivity baseActivity, RequestManager glide, String accountName,
+ SharedPreferences sharedPreferences,
+ SharedPreferences navigationDrawerSharedPreferences,
+ PageToggle pageToggle) {
+ this.baseActivity = baseActivity;
+ resources = baseActivity.getResources();
+ this.glide = glide;
+ this.accountName = accountName;
+ isLoggedIn = accountName != null;
+ this.pageToggle = pageToggle;
+ requireAuthToAccountSection = sharedPreferences.getBoolean(SharedPreferencesUtils.REQUIRE_AUTHENTICATION_TO_GO_TO_ACCOUNT_SECTION_IN_NAVIGATION_DRAWER, false);
+ showAvatarOnTheRightInTheNavigationDrawer = sharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_AVATAR_ON_THE_RIGHT, false);
+ showAvatarOnTheRightInTheNavigationDrawer = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_AVATAR_ON_THE_RIGHT, false);
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ return new NavHeaderViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.nav_header_main, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof NavHeaderViewHolder) {
+ RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) ((NavHeaderViewHolder) holder).profileImageView.getLayoutParams();
+ if (showAvatarOnTheRightInTheNavigationDrawer) {
+ params.addRule(RelativeLayout.ALIGN_PARENT_END);
+ } else {
+ params.removeRule(RelativeLayout.ALIGN_PARENT_END);
+ }
+ ((NavHeaderViewHolder) holder).profileImageView.setLayoutParams(params);
+ if (isLoggedIn) {
+ ((NavHeaderViewHolder) holder).karmaTextView.setText(baseActivity.getString(R.string.karma_info, karma));
+ ((NavHeaderViewHolder) holder).accountNameTextView.setText(accountName);
+ if (profileImageUrl != null && !profileImageUrl.equals("")) {
+ glide.load(profileImageUrl)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0)))
+ .error(glide.load(R.drawable.subreddit_default_icon)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0))))
+ .into(((NavHeaderViewHolder) holder).profileImageView);
+ } else {
+ glide.load(R.drawable.subreddit_default_icon)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0)))
+ .into(((NavHeaderViewHolder) holder).profileImageView);
+ }
+
+ if (bannerImageUrl != null && !bannerImageUrl.equals("")) {
+ glide.load(bannerImageUrl).into(((NavHeaderViewHolder) holder).bannerImageView);
+ }
+ } else {
+ ((NavHeaderViewHolder) holder).karmaTextView.setText(R.string.press_here_to_login);
+ ((NavHeaderViewHolder) holder).accountNameTextView.setText(R.string.anonymous_account);
+ glide.load(R.drawable.subreddit_default_icon)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(144, 0)))
+ .into(((NavHeaderViewHolder) holder).profileImageView);
+ }
+
+ if (isInMainPage) {
+ ((NavHeaderViewHolder) holder).dropIconImageView.setImageDrawable(resources.getDrawable(R.drawable.ic_baseline_arrow_drop_down_24dp));
+ } else {
+ ((NavHeaderViewHolder) holder).dropIconImageView.setImageDrawable(resources.getDrawable(R.drawable.ic_baseline_arrow_drop_up_24dp));
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ if (isInMainPage) {
+ if (requireAuthToAccountSection) {
+ BiometricManager biometricManager = BiometricManager.from(baseActivity);
+ if (biometricManager.canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) == BiometricManager.BIOMETRIC_SUCCESS) {
+ Executor executor = ContextCompat.getMainExecutor(baseActivity);
+ BiometricPrompt biometricPrompt = new BiometricPrompt(baseActivity,
+ executor, new BiometricPrompt.AuthenticationCallback() {
+ @Override
+ public void onAuthenticationSucceeded(
+ @NonNull BiometricPrompt.AuthenticationResult result) {
+ super.onAuthenticationSucceeded(result);
+ pageToggle.openAccountSection();
+ openAccountSection(((NavHeaderViewHolder) holder).dropIconImageView);
+ }
+ });
+
+ BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder()
+ .setTitle(baseActivity.getString(R.string.unlock_account_section))
+ .setAllowedAuthenticators(BIOMETRIC_STRONG | DEVICE_CREDENTIAL)
+ .build();
+
+ biometricPrompt.authenticate(promptInfo);
+ } else {
+ pageToggle.openAccountSection();
+ openAccountSection(((NavHeaderViewHolder) holder).dropIconImageView);
+ }
+ } else {
+ pageToggle.openAccountSection();
+ openAccountSection(((NavHeaderViewHolder) holder).dropIconImageView);
+ }
+ } else {
+ ((NavHeaderViewHolder) holder).dropIconImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_baseline_arrow_drop_down_24dp, null));
+ pageToggle.closeAccountSectionWithoutChangeIconResource();
+ closeAccountSectionWithoutChangeIconResource(false);
+ }
+ });
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return 1;
+ }
+
+ private void openAccountSection(ImageView dropIconImageView) {
+ dropIconImageView.setImageDrawable(ResourcesCompat.getDrawable(resources, R.drawable.ic_baseline_arrow_drop_up_24dp, null));
+ isInMainPage = false;
+ }
+
+ public boolean closeAccountSectionWithoutChangeIconResource(boolean checkIsInMainPage) {
+ if (!(checkIsInMainPage && isInMainPage)) {
+ isInMainPage = true;
+ return true;
+ }
+
+ notifyItemChanged(0);
+ return false;
+ }
+
+ public void updateAccountInfo(String profileImageUrl, String bannerImageUrl, int karma) {
+ this.profileImageUrl = profileImageUrl;
+ this.bannerImageUrl = bannerImageUrl;
+ this.karma = karma;
+ notifyItemChanged(0);
+ }
+
+ public void setRequireAuthToAccountSection(boolean requireAuthToAccountSection) {
+ this.requireAuthToAccountSection = requireAuthToAccountSection;
+ }
+
+ public void setShowAvatarOnTheRightInTheNavigationDrawer(boolean showAvatarOnTheRightInTheNavigationDrawer) {
+ this.showAvatarOnTheRightInTheNavigationDrawer = showAvatarOnTheRightInTheNavigationDrawer;
+ }
+
+ class NavHeaderViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.name_text_view_nav_header_main)
+ TextView accountNameTextView;
+ @BindView(R.id.karma_text_view_nav_header_main)
+ TextView karmaTextView;
+ @BindView(R.id.profile_image_view_nav_header_main)
+ GifImageView profileImageView;
+ @BindView(R.id.banner_image_view_nav_header_main)
+ ImageView bannerImageView;
+ @BindView(R.id.account_switcher_image_view_nav_header_main)
+ ImageView dropIconImageView;
+
+ NavHeaderViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+
+ if (baseActivity.typeface != null) {
+ accountNameTextView.setTypeface(baseActivity.typeface);
+ karmaTextView.setTypeface(baseActivity.typeface);
+ }
+ }
+ }
+
+ public interface PageToggle {
+ void openAccountSection();
+ void closeAccountSectionWithoutChangeIconResource();
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/NavigationDrawerRecyclerViewMergedAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/NavigationDrawerRecyclerViewMergedAdapter.java
new file mode 100644
index 00000000..553aaee4
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/NavigationDrawerRecyclerViewMergedAdapter.java
@@ -0,0 +1,149 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import android.content.SharedPreferences;
+import android.content.res.Resources;
+
+import androidx.recyclerview.widget.ConcatAdapter;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.RequestManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import ml.docilealligator.infinityforreddit.account.Account;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubredditData;
+
+public class NavigationDrawerRecyclerViewMergedAdapter {
+ private HeaderSectionRecyclerViewAdapter headerSectionRecyclerViewAdapter;
+ private AccountSectionRecyclerViewAdapter accountSectionRecyclerViewAdapter;
+ private RedditSectionRecyclerViewAdapter redditSectionRecyclerViewAdapter;
+ private PostSectionRecyclerViewAdapter postSectionRecyclerViewAdapter;
+ private PreferenceSectionRecyclerViewAdapter preferenceSectionRecyclerViewAdapter;
+ private FavoriteSubscribedSubredditsSectionRecyclerViewAdapter favoriteSubscribedSubredditsSectionRecyclerViewAdapter;
+ private SubscribedSubredditsRecyclerViewAdapter subscribedSubredditsRecyclerViewAdapter;
+ private AccountManagementSectionRecyclerViewAdapter accountManagementSectionRecyclerViewAdapter;
+ private ConcatAdapter mainPageConcatAdapter;
+
+ private Resources resources;
+ private ArrayList<Account> accounts;
+ private boolean isLoggedIn;
+ private boolean isInMainPage = true;
+
+ public NavigationDrawerRecyclerViewMergedAdapter(BaseActivity baseActivity, SharedPreferences sharedPreferences,
+ SharedPreferences nsfwAndSpoilerSharedPreferences,
+ SharedPreferences navigationDrawerSharedPreferences,
+ CustomThemeWrapper customThemeWrapper,
+ String accountName,
+ ItemClickListener itemClickListener) {
+ RequestManager glide = Glide.with(baseActivity);
+
+ headerSectionRecyclerViewAdapter = new HeaderSectionRecyclerViewAdapter(baseActivity, glide, accountName,
+ sharedPreferences, navigationDrawerSharedPreferences, new HeaderSectionRecyclerViewAdapter.PageToggle() {
+ @Override
+ public void openAccountSection() {
+ NavigationDrawerRecyclerViewMergedAdapter.this.openAccountSection();
+ }
+
+ @Override
+ public void closeAccountSectionWithoutChangeIconResource() {
+ NavigationDrawerRecyclerViewMergedAdapter.this.closeAccountSectionWithoutChangeIconResource();
+ }
+ });
+ accountSectionRecyclerViewAdapter = new AccountSectionRecyclerViewAdapter(baseActivity, customThemeWrapper,
+ navigationDrawerSharedPreferences, accountName != null, itemClickListener);
+ redditSectionRecyclerViewAdapter = new RedditSectionRecyclerViewAdapter(baseActivity, customThemeWrapper,
+ navigationDrawerSharedPreferences, itemClickListener);
+ postSectionRecyclerViewAdapter = new PostSectionRecyclerViewAdapter(baseActivity, customThemeWrapper,
+ navigationDrawerSharedPreferences, accountName != null, itemClickListener);
+ preferenceSectionRecyclerViewAdapter = new PreferenceSectionRecyclerViewAdapter(baseActivity, customThemeWrapper,
+ accountName, nsfwAndSpoilerSharedPreferences, navigationDrawerSharedPreferences, itemClickListener);
+ favoriteSubscribedSubredditsSectionRecyclerViewAdapter = new FavoriteSubscribedSubredditsSectionRecyclerViewAdapter(
+ baseActivity, glide, customThemeWrapper, navigationDrawerSharedPreferences, itemClickListener);
+ subscribedSubredditsRecyclerViewAdapter = new SubscribedSubredditsRecyclerViewAdapter(baseActivity, glide,
+ customThemeWrapper, navigationDrawerSharedPreferences, itemClickListener);
+ accountManagementSectionRecyclerViewAdapter = new AccountManagementSectionRecyclerViewAdapter(baseActivity,
+ customThemeWrapper, glide, accountName != null, itemClickListener);
+
+ mainPageConcatAdapter = new ConcatAdapter(
+ headerSectionRecyclerViewAdapter,
+ accountSectionRecyclerViewAdapter,
+ redditSectionRecyclerViewAdapter,
+ postSectionRecyclerViewAdapter,
+ preferenceSectionRecyclerViewAdapter,
+ favoriteSubscribedSubredditsSectionRecyclerViewAdapter,
+ subscribedSubredditsRecyclerViewAdapter);
+ }
+
+ public ConcatAdapter getConcatAdapter() {
+ return mainPageConcatAdapter;
+ }
+
+ private void openAccountSection() {
+ mainPageConcatAdapter.removeAdapter(accountSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.removeAdapter(redditSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.removeAdapter(postSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.removeAdapter(preferenceSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.removeAdapter(favoriteSubscribedSubredditsSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.removeAdapter(subscribedSubredditsRecyclerViewAdapter);
+
+ mainPageConcatAdapter.addAdapter(accountManagementSectionRecyclerViewAdapter);
+ isInMainPage = false;
+ }
+
+ public void closeAccountSectionWithoutChangeIconResource() {
+ mainPageConcatAdapter.removeAdapter(accountManagementSectionRecyclerViewAdapter);
+
+ mainPageConcatAdapter.addAdapter(accountSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.addAdapter(redditSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.addAdapter(postSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.addAdapter(preferenceSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.addAdapter(favoriteSubscribedSubredditsSectionRecyclerViewAdapter);
+ mainPageConcatAdapter.addAdapter(subscribedSubredditsRecyclerViewAdapter);
+ }
+
+ public void closeAccountSectionWithoutChangeIconResource(boolean checkIsInMainPage) {
+ closeAccountSectionWithoutChangeIconResource();
+ headerSectionRecyclerViewAdapter.closeAccountSectionWithoutChangeIconResource(checkIsInMainPage);
+ }
+
+ public void updateAccountInfo(String profileImageUrl, String bannerImageUrl, int karma) {
+ headerSectionRecyclerViewAdapter.updateAccountInfo(profileImageUrl, bannerImageUrl, karma);
+ }
+
+ public void setRequireAuthToAccountSection(boolean requireAuthToAccountSection) {
+ headerSectionRecyclerViewAdapter.setRequireAuthToAccountSection(requireAuthToAccountSection);
+ }
+
+ public void setShowAvatarOnTheRightInTheNavigationDrawer(boolean showAvatarOnTheRightInTheNavigationDrawer) {
+ headerSectionRecyclerViewAdapter.setShowAvatarOnTheRightInTheNavigationDrawer(showAvatarOnTheRightInTheNavigationDrawer);
+ }
+
+ public void changeAccountsDataset(List<Account> accounts) {
+ accountManagementSectionRecyclerViewAdapter.changeAccountsDataset(accounts);
+ }
+
+ public void setInboxCount(int inboxCount) {
+ accountSectionRecyclerViewAdapter.setInboxCount(inboxCount);
+ }
+
+ public void setNSFWEnabled(boolean isNSFWEnabled) {
+ preferenceSectionRecyclerViewAdapter.setNSFWEnabled(isNSFWEnabled);
+ }
+
+ public void setFavoriteSubscribedSubreddits(List<SubscribedSubredditData> favoriteSubscribedSubreddits) {
+ favoriteSubscribedSubredditsSectionRecyclerViewAdapter.setFavoriteSubscribedSubreddits(favoriteSubscribedSubreddits);
+ }
+
+ public void setSubscribedSubreddits(List<SubscribedSubredditData> subscribedSubreddits) {
+ subscribedSubredditsRecyclerViewAdapter.setSubscribedSubreddits(subscribedSubreddits);
+ }
+
+ public interface ItemClickListener {
+ void onMenuClick(int stringId);
+ void onSubscribedSubredditClick(String subredditName);
+ void onAccountClick(String accountName);
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/PostSectionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/PostSectionRecyclerViewAdapter.java
new file mode 100644
index 00000000..608d1e18
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/PostSectionRecyclerViewAdapter.java
@@ -0,0 +1,158 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import android.content.SharedPreferences;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
+
+public class PostSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
+ private static final int VIEW_TYPE_MENU_ITEM = 2;
+ private static final int POST_SECTION_ITEMS = 5;
+
+ private BaseActivity baseActivity;
+ private int primaryTextColor;
+ private int secondaryTextColor;
+ private int primaryIconColor;
+ private boolean collapsePostSection;
+ private boolean isLoggedIn;
+ private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
+
+ public PostSectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
+ SharedPreferences navigationDrawerSharedPreferences,
+ boolean isLoggedIn, NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener) {
+ this.baseActivity = baseActivity;
+ primaryTextColor = customThemeWrapper.getPrimaryTextColor();
+ secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
+ primaryIconColor = customThemeWrapper.getPrimaryIconColor();
+ collapsePostSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_POST_SECTION, false);
+ this.isLoggedIn = isLoggedIn;
+ this.itemClickListener = itemClickListener;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return position == 0 ? VIEW_TYPE_MENU_GROUP_TITLE : VIEW_TYPE_MENU_ITEM;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_MENU_GROUP_TITLE) {
+ return new MenuGroupTitleViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_group_title, parent, false));
+ } else {
+ return new MenuItemViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_item, parent, false));
+ }
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof MenuGroupTitleViewHolder) {
+ ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.label_post);
+ if (collapsePostSection) {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24dp);
+ } else {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24dp);
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ if (collapsePostSection) {
+ collapsePostSection = !collapsePostSection;
+ notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, POST_SECTION_ITEMS);
+ } else {
+ collapsePostSection = !collapsePostSection;
+ notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, POST_SECTION_ITEMS);
+ }
+ notifyItemChanged(holder.getBindingAdapterPosition());
+ });
+ } else if (holder instanceof MenuItemViewHolder) {
+ int stringId = 0;
+ int drawableId = 0;
+
+ if (isLoggedIn) {
+ switch (position) {
+ case 1:
+ stringId = R.string.upvoted;
+ drawableId = R.drawable.ic_arrow_upward_black_24dp;
+ break;
+ case 2:
+ stringId = R.string.downvoted;
+ drawableId = R.drawable.ic_arrow_downward_black_24dp;
+ break;
+ case 3:
+ stringId = R.string.hidden;
+ drawableId = R.drawable.ic_outline_lock_24dp;
+ break;
+ case 4:
+ stringId = R.string.account_saved_thing_activity_label;
+ drawableId = R.drawable.ic_outline_bookmarks_24dp;
+ break;
+ case 5:
+ stringId = R.string.gilded;
+ drawableId = R.drawable.ic_star_border_24dp;
+ break;
+ }
+ }
+
+ ((MenuItemViewHolder) holder).menuTextView.setText(stringId);
+ ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, drawableId));
+ int finalStringId = stringId;
+ holder.itemView.setOnClickListener(view -> itemClickListener.onMenuClick(finalStringId));
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return isLoggedIn ? POST_SECTION_ITEMS + 1 : 0;
+ }
+
+ class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.title_text_view_item_nav_drawer_menu_group_title)
+ TextView titleTextView;
+ @BindView(R.id.collapse_indicator_image_view_item_nav_drawer_menu_group_title)
+ ImageView collapseIndicatorImageView;
+
+ MenuGroupTitleViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ titleTextView.setTypeface(baseActivity.typeface);
+ }
+ titleTextView.setTextColor(secondaryTextColor);
+ collapseIndicatorImageView.setColorFilter(secondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+
+ class MenuItemViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.image_view_item_nav_drawer_menu_item)
+ ImageView imageView;
+ @BindView(R.id.text_view_item_nav_drawer_menu_item)
+ TextView menuTextView;
+
+ MenuItemViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ menuTextView.setTypeface(baseActivity.typeface);
+ }
+ menuTextView.setTextColor(primaryTextColor);
+ imageView.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/PreferenceSectionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/PreferenceSectionRecyclerViewAdapter.java
new file mode 100644
index 00000000..788b4895
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/PreferenceSectionRecyclerViewAdapter.java
@@ -0,0 +1,187 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
+
+public class PreferenceSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
+ private static final int VIEW_TYPE_MENU_ITEM = 2;
+ private static final int PREFERENCES_SECTION_ITEMS = 3;
+
+ private BaseActivity baseActivity;
+ private Resources resources;
+ private int primaryTextColor;
+ private int secondaryTextColor;
+ private int primaryIconColor;
+ private boolean isNSFWEnabled;
+ private boolean collapsePreferencesSection;
+ private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
+
+ public PreferenceSectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
+ String accountName, SharedPreferences nsfwAndSpoilerSharedPreferences,
+ SharedPreferences navigationDrawerSharedPreferences,
+ NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener) {
+ this.baseActivity = baseActivity;
+ resources = baseActivity.getResources();
+ primaryTextColor = customThemeWrapper.getPrimaryTextColor();
+ secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
+ primaryIconColor = customThemeWrapper.getPrimaryIconColor();
+ isNSFWEnabled = nsfwAndSpoilerSharedPreferences.getBoolean((accountName == null ? "" : accountName) + SharedPreferencesUtils.NSFW_BASE, false);
+ collapsePreferencesSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_PREFERENCES_SECTION, false);
+ this.itemClickListener = itemClickListener;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return position == 0 ? VIEW_TYPE_MENU_GROUP_TITLE : VIEW_TYPE_MENU_ITEM;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_MENU_GROUP_TITLE) {
+ return new MenuGroupTitleViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_group_title, parent, false));
+ } else {
+ return new MenuItemViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_item, parent, false));
+ }
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof MenuGroupTitleViewHolder) {
+ ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.label_preferences);
+ if (collapsePreferencesSection) {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24dp);
+ } else {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24dp);
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ if (collapsePreferencesSection) {
+ collapsePreferencesSection = !collapsePreferencesSection;
+ notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, PREFERENCES_SECTION_ITEMS);
+ } else {
+ collapsePreferencesSection = !collapsePreferencesSection;
+ notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, PREFERENCES_SECTION_ITEMS);
+ }
+ notifyItemChanged(holder.getBindingAdapterPosition());
+ });
+ } else if (holder instanceof MenuItemViewHolder) {
+ int stringId = 0;
+ int drawableId = 0;
+ boolean setOnClickListener = true;
+
+ switch (position) {
+ case 1:
+ if ((resources.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) != Configuration.UI_MODE_NIGHT_YES) {
+ stringId = R.string.dark_theme;
+ drawableId = R.drawable.ic_dark_theme_24dp;
+ } else {
+ stringId = R.string.light_theme;
+ drawableId = R.drawable.ic_light_theme_24dp;
+ }
+ break;
+ case 2:
+ setOnClickListener = false;
+ if (isNSFWEnabled) {
+ stringId = R.string.disable_nsfw;
+ drawableId = R.drawable.ic_nsfw_off_24dp;
+ } else {
+ stringId = R.string.enable_nsfw;
+ drawableId = R.drawable.ic_nsfw_on_24dp;
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ if (isNSFWEnabled) {
+ isNSFWEnabled = false;
+ ((MenuItemViewHolder) holder).menuTextView.setText(R.string.enable_nsfw);
+ ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, R.drawable.ic_nsfw_on_24dp));
+ itemClickListener.onMenuClick(R.string.disable_nsfw);
+ } else {
+ isNSFWEnabled = true;
+ ((MenuItemViewHolder) holder).menuTextView.setText(R.string.disable_nsfw);
+ ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, R.drawable.ic_nsfw_off_24dp));
+ itemClickListener.onMenuClick(R.string.enable_nsfw);
+ }
+ });
+ break;
+ case 3:
+ stringId = R.string.settings;
+ drawableId = R.drawable.ic_settings_24dp;
+ }
+
+ if (stringId != 0) {
+ ((MenuItemViewHolder) holder).menuTextView.setText(stringId);
+ ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, drawableId));
+ if (setOnClickListener) {
+ int finalStringId = stringId;
+ holder.itemView.setOnClickListener(view -> itemClickListener.onMenuClick(finalStringId));
+ }
+ }
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return PREFERENCES_SECTION_ITEMS + 1;
+ }
+
+ public void setNSFWEnabled(boolean isNSFWEnabled) {
+ this.isNSFWEnabled = isNSFWEnabled;
+ notifyItemChanged(3);
+ }
+
+ class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.title_text_view_item_nav_drawer_menu_group_title)
+ TextView titleTextView;
+ @BindView(R.id.collapse_indicator_image_view_item_nav_drawer_menu_group_title)
+ ImageView collapseIndicatorImageView;
+
+ MenuGroupTitleViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ titleTextView.setTypeface(baseActivity.typeface);
+ }
+ titleTextView.setTextColor(secondaryTextColor);
+ collapseIndicatorImageView.setColorFilter(secondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+
+ class MenuItemViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.image_view_item_nav_drawer_menu_item)
+ ImageView imageView;
+ @BindView(R.id.text_view_item_nav_drawer_menu_item)
+ TextView menuTextView;
+
+ MenuItemViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ menuTextView.setTypeface(baseActivity.typeface);
+ }
+ menuTextView.setTextColor(primaryTextColor);
+ imageView.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/RedditSectionRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/RedditSectionRecyclerViewAdapter.java
new file mode 100644
index 00000000..4d33b3ef
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/RedditSectionRecyclerViewAdapter.java
@@ -0,0 +1,142 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import android.content.SharedPreferences;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.recyclerview.widget.RecyclerView;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
+
+public class RedditSectionRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
+ private static final int VIEW_TYPE_MENU_ITEM = 2;
+ private static final int REDDIT_SECTION_ITEMS = 2;
+
+ private BaseActivity baseActivity;
+ private int primaryTextColor;
+ private int secondaryTextColor;
+ private int primaryIconColor;
+ private boolean collapseRedditSection;
+ private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
+
+ public RedditSectionRecyclerViewAdapter(BaseActivity baseActivity, CustomThemeWrapper customThemeWrapper,
+ SharedPreferences navigationDrawerSharedPreferences,
+ NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener) {
+ this.baseActivity = baseActivity;
+ primaryTextColor = customThemeWrapper.getPrimaryTextColor();
+ secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
+ primaryIconColor = customThemeWrapper.getPrimaryIconColor();
+ collapseRedditSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_REDDIT_SECTION, false);
+ this.itemClickListener = itemClickListener;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return position == 0 ? VIEW_TYPE_MENU_GROUP_TITLE : VIEW_TYPE_MENU_ITEM;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_MENU_GROUP_TITLE) {
+ return new MenuGroupTitleViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_group_title, parent, false));
+ } else {
+ return new MenuItemViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_item, parent, false));
+ }
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof MenuGroupTitleViewHolder) {
+ ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.label_reddit);
+ if (collapseRedditSection) {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24dp);
+ } else {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24dp);
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ if (collapseRedditSection) {
+ collapseRedditSection = !collapseRedditSection;
+ notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, REDDIT_SECTION_ITEMS);
+ } else {
+ collapseRedditSection = !collapseRedditSection;
+ notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, REDDIT_SECTION_ITEMS);
+ }
+ notifyItemChanged(holder.getBindingAdapterPosition());
+ });
+ } else if (holder instanceof MenuItemViewHolder) {
+ int stringId = 0;
+ int drawableId = 0;
+
+ switch (position) {
+ case 1:
+ stringId = R.string.rpan;
+ drawableId = R.drawable.ic_rpan_24dp;
+ break;
+ case 2:
+ stringId = R.string.trending;
+ drawableId = R.drawable.ic_trending_24dp;
+ break;
+ }
+
+ ((MenuItemViewHolder) holder).menuTextView.setText(stringId);
+ ((MenuItemViewHolder) holder).imageView.setImageDrawable(ContextCompat.getDrawable(baseActivity, drawableId));
+ int finalStringId = stringId;
+ holder.itemView.setOnClickListener(view -> itemClickListener.onMenuClick(finalStringId));
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ return REDDIT_SECTION_ITEMS + 1;
+ }
+
+ class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.title_text_view_item_nav_drawer_menu_group_title)
+ TextView titleTextView;
+ @BindView(R.id.collapse_indicator_image_view_item_nav_drawer_menu_group_title)
+ ImageView collapseIndicatorImageView;
+
+ MenuGroupTitleViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ titleTextView.setTypeface(baseActivity.typeface);
+ }
+ titleTextView.setTextColor(secondaryTextColor);
+ collapseIndicatorImageView.setColorFilter(secondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+
+ class MenuItemViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.image_view_item_nav_drawer_menu_item)
+ ImageView imageView;
+ @BindView(R.id.text_view_item_nav_drawer_menu_item)
+ TextView menuTextView;
+
+ MenuItemViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ menuTextView.setTypeface(baseActivity.typeface);
+ }
+ menuTextView.setTextColor(primaryTextColor);
+ imageView.setColorFilter(primaryIconColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/SubscribedSubredditsRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/SubscribedSubredditsRecyclerViewAdapter.java
new file mode 100644
index 00000000..3e77b1e0
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/navigationdrawer/SubscribedSubredditsRecyclerViewAdapter.java
@@ -0,0 +1,169 @@
+package ml.docilealligator.infinityforreddit.adapters.navigationdrawer;
+
+import android.content.SharedPreferences;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.RequestManager;
+import com.bumptech.glide.request.RequestOptions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.activities.BaseActivity;
+import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper;
+import ml.docilealligator.infinityforreddit.subscribedsubreddit.SubscribedSubredditData;
+import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils;
+import pl.droidsonroids.gif.GifImageView;
+
+public class SubscribedSubredditsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+ private static final int VIEW_TYPE_MENU_GROUP_TITLE = 1;
+ private static final int VIEW_TYPE_SUBSCRIBED_SUBREDDIT = 2;
+
+ private BaseActivity baseActivity;
+ private RequestManager glide;
+ private int primaryTextColor;
+ private int secondaryTextColor;
+ private boolean collapseSubscribedSubredditsSection;
+ private boolean hideSubscribedSubredditsSection;
+ private ArrayList<SubscribedSubredditData> subscribedSubreddits = new ArrayList<>();
+ private NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener;
+
+ public SubscribedSubredditsRecyclerViewAdapter(BaseActivity baseActivity, RequestManager glide,
+ CustomThemeWrapper customThemeWrapper,
+ SharedPreferences navigationDrawerSharedPreferences,
+ NavigationDrawerRecyclerViewMergedAdapter.ItemClickListener itemClickListener) {
+ this.baseActivity = baseActivity;
+ this.glide = glide;
+ primaryTextColor = customThemeWrapper.getPrimaryTextColor();
+ secondaryTextColor = customThemeWrapper.getSecondaryTextColor();
+ collapseSubscribedSubredditsSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.COLLAPSE_SUBSCRIBED_SUBREDDITS_SECTION, false);
+ hideSubscribedSubredditsSection = navigationDrawerSharedPreferences.getBoolean(SharedPreferencesUtils.HIDE_SUBSCRIBED_SUBREDDITS_SECTIONS, false);
+ this.itemClickListener = itemClickListener;
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return position == 0 ? VIEW_TYPE_MENU_GROUP_TITLE : VIEW_TYPE_SUBSCRIBED_SUBREDDIT;
+ }
+
+ @NonNull
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_MENU_GROUP_TITLE) {
+ return new MenuGroupTitleViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_menu_group_title, parent, false));
+ } else {
+ return new SubscribedThingViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.item_nav_drawer_subscribed_thing, parent, false));
+ }
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+ if (holder instanceof MenuGroupTitleViewHolder) {
+ ((MenuGroupTitleViewHolder) holder).titleTextView.setText(R.string.subscriptions);
+ if (collapseSubscribedSubredditsSection) {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_up_24dp);
+ } else {
+ ((MenuGroupTitleViewHolder) holder).collapseIndicatorImageView.setImageResource(R.drawable.ic_baseline_arrow_drop_down_24dp);
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ if (collapseSubscribedSubredditsSection) {
+ collapseSubscribedSubredditsSection = !collapseSubscribedSubredditsSection;
+ notifyItemRangeInserted(holder.getBindingAdapterPosition() + 1, subscribedSubreddits.size());
+ } else {
+ collapseSubscribedSubredditsSection = !collapseSubscribedSubredditsSection;
+ notifyItemRangeRemoved(holder.getBindingAdapterPosition() + 1, subscribedSubreddits.size());
+ }
+ notifyItemChanged(holder.getBindingAdapterPosition());
+ });
+ } else if (holder instanceof SubscribedThingViewHolder) {
+ SubscribedSubredditData subreddit = subscribedSubreddits.get(position - 1);
+ String subredditName = subreddit.getName();
+ String iconUrl = subreddit.getIconUrl();
+ ((SubscribedThingViewHolder) holder).subredditNameTextView.setText(subredditName);
+ if (iconUrl != null && !iconUrl.equals("")) {
+ glide.load(iconUrl)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
+ .error(glide.load(R.drawable.subreddit_default_icon)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0))))
+ .into(((SubscribedThingViewHolder) holder).iconGifImageView);
+ } else {
+ glide.load(R.drawable.subreddit_default_icon)
+ .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(72, 0)))
+ .into(((SubscribedThingViewHolder) holder).iconGifImageView);
+ }
+
+ holder.itemView.setOnClickListener(view -> {
+ itemClickListener.onSubscribedSubredditClick(subredditName);
+ });
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ if (hideSubscribedSubredditsSection) {
+ return 0;
+ }
+ return subscribedSubreddits.isEmpty() ? 0 : (collapseSubscribedSubredditsSection ? 1 : subscribedSubreddits.size() + 1);
+ }
+
+ @Override
+ public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
+ super.onViewRecycled(holder);
+ if (holder instanceof SubscribedThingViewHolder) {
+ glide.clear(((SubscribedThingViewHolder) holder).iconGifImageView);
+ }
+ }
+
+ public void setSubscribedSubreddits(List<SubscribedSubredditData> subscribedSubreddits) {
+ this.subscribedSubreddits = (ArrayList<SubscribedSubredditData>) subscribedSubreddits;
+ notifyDataSetChanged();
+ }
+
+ class MenuGroupTitleViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.title_text_view_item_nav_drawer_menu_group_title)
+ TextView titleTextView;
+ @BindView(R.id.collapse_indicator_image_view_item_nav_drawer_menu_group_title)
+ ImageView collapseIndicatorImageView;
+
+ MenuGroupTitleViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ titleTextView.setTypeface(baseActivity.typeface);
+ }
+ titleTextView.setTextColor(secondaryTextColor);
+ collapseIndicatorImageView.setColorFilter(secondaryTextColor, android.graphics.PorterDuff.Mode.SRC_IN);
+ }
+ }
+
+ class SubscribedThingViewHolder extends RecyclerView.ViewHolder {
+ @BindView(R.id.thing_icon_gif_image_view_item_nav_drawer_subscribed_thing)
+ GifImageView iconGifImageView;
+ @BindView(R.id.thing_name_text_view_item_nav_drawer_subscribed_thing)
+ TextView subredditNameTextView;
+
+ SubscribedThingViewHolder(@NonNull View itemView) {
+ super(itemView);
+ ButterKnife.bind(this, itemView);
+ if (baseActivity.typeface != null) {
+ subredditNameTextView.setTypeface(baseActivity.typeface);
+ }
+ subredditNameTextView.setTextColor(primaryTextColor);
+ }
+ }
+}
diff --git a/app/src/main/res/drawable/ic_baseline_arrow_drop_down_24px.xml b/app/src/main/res/drawable/ic_baseline_arrow_drop_down_24dp.xml
index af6df01c..af6df01c 100644
--- a/app/src/main/res/drawable/ic_baseline_arrow_drop_down_24px.xml
+++ b/app/src/main/res/drawable/ic_baseline_arrow_drop_down_24dp.xml
diff --git a/app/src/main/res/drawable/ic_baseline_arrow_drop_up_24px.xml b/app/src/main/res/drawable/ic_baseline_arrow_drop_up_24dp.xml
index 2cfbe4d2..2cfbe4d2 100644
--- a/app/src/main/res/drawable/ic_baseline_arrow_drop_up_24px.xml
+++ b/app/src/main/res/drawable/ic_baseline_arrow_drop_up_24dp.xml
diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml
index 8ccdbe04..2b30f55a 100644
--- a/app/src/main/res/layout/nav_header_main.xml
+++ b/app/src/main/res/layout/nav_header_main.xml
@@ -55,6 +55,6 @@
android:layout_margin="16dp"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
- android:src="@drawable/ic_baseline_arrow_drop_down_24px" />
+ android:src="@drawable/ic_baseline_arrow_drop_down_24dp" />
</RelativeLayout>