Add CustomThemeListingActivity.

This commit is contained in:
Alex Ning 2020-03-24 14:14:47 +08:00
parent 9c4889b1b0
commit f5fc385039
9 changed files with 165 additions and 17 deletions

View File

@ -21,7 +21,10 @@
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"
tools:replace="android:label">
<activity android:name=".Activity.CustomThemeListingActivity"></activity>
<activity android:name=".Activity.CustomThemeListingActivity"
android:label="@string/custom_theme_listing_activity_label"
android:parentActivityName=".Activity.MainActivity"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".Activity.CustomizeThemeActivity"
android:parentActivityName=".Activity.MainActivity"

View File

@ -2,8 +2,12 @@ package ml.docilealligator.infinityforreddit.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.appbar.AppBarLayout;
@ -12,7 +16,11 @@ import javax.inject.Inject;
import javax.inject.Named;
import butterknife.BindView;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.Adapter.CustomThemeListingRecyclerViewAdapter;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeViewModel;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase;
@ -31,11 +39,40 @@ public class CustomThemeListingActivity extends BaseActivity {
RedditDataRoomDatabase redditDataRoomDatabase;
@Inject
CustomThemeWrapper customThemeWrapper;
public CustomThemeViewModel customThemeViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
((Infinity) getApplication()).getAppComponent().inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_theme_listing);
ButterKnife.bind(this);
applyCustomTheme();
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
CustomThemeListingRecyclerViewAdapter adapter = new CustomThemeListingRecyclerViewAdapter(this,
CustomThemeWrapper.getPredifinedThemes(this));
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
customThemeViewModel = new ViewModelProvider(this,
new CustomThemeViewModel.Factory(redditDataRoomDatabase))
.get(CustomThemeViewModel.class);
customThemeViewModel.getAllCustomThemes().observe(this, customThemes -> adapter.setUserThemes(customThemes));
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return false;
}
@Override

View File

@ -12,6 +12,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
@ -20,49 +21,123 @@ import ml.docilealligator.infinityforreddit.CustomTheme.CustomTheme;
import ml.docilealligator.infinityforreddit.R;
public class CustomThemeListingRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private ArrayList<CustomTheme> customThemes;
private static final int VIEW_TYPE_PREDEFINED_THEME = 0;
private static final int VIEW_TYPE_USER_THME = 1;
private static final int VIEW_TYPE_PREDEFINED_THEME_DIVIDER = 2;
private static final int VIEW_TYPE_USER_THEME_DIVIDER = 3;
public CustomThemeListingRecyclerViewAdapter(Context context) {
private Context context;
private ArrayList<CustomTheme> predefinedCustomThemes;
private ArrayList<CustomTheme> userCustomThemes;
public CustomThemeListingRecyclerViewAdapter(Context context, ArrayList<CustomTheme> predefinedCustomThemes) {
this.context = context;
customThemes = new ArrayList<>();
this.predefinedCustomThemes = predefinedCustomThemes;
userCustomThemes = new ArrayList<>();
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return VIEW_TYPE_PREDEFINED_THEME_DIVIDER;
} else if (position < 1 + predefinedCustomThemes.size()) {
return VIEW_TYPE_PREDEFINED_THEME;
} else if (position == 1 + predefinedCustomThemes.size()) {
return VIEW_TYPE_USER_THEME_DIVIDER;
} else {
return VIEW_TYPE_USER_THME;
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new CustomThemeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_custom_theme, parent, false));
switch (viewType) {
case VIEW_TYPE_PREDEFINED_THEME_DIVIDER:
return new PreDefinedThemeDividerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_theme_type_divider, parent, false));
case VIEW_TYPE_PREDEFINED_THEME:
return new PredefinedCustomThemeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_custom_theme, parent, false));
case VIEW_TYPE_USER_THEME_DIVIDER:
return new UserThemeDividerViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_theme_type_divider, parent, false));
default:
return new UserCustomThemeViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_custom_theme, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof CustomThemeViewHolder) {
CustomTheme customTheme = customThemes.get(position);
((CustomThemeViewHolder) holder).colorPrimaryView.setBackgroundTintList(ColorStateList.valueOf(customTheme.colorPrimary));
((CustomThemeViewHolder) holder).nameTextView.setText(customTheme.name);
((CustomThemeViewHolder) holder).itemView.setOnClickListener(view -> {
if (holder instanceof PredefinedCustomThemeViewHolder) {
CustomTheme customTheme = predefinedCustomThemes.get(position - 1);
((PredefinedCustomThemeViewHolder) holder).colorPrimaryView.setBackgroundTintList(ColorStateList.valueOf(customTheme.colorPrimary));
((PredefinedCustomThemeViewHolder) holder).nameTextView.setText(customTheme.name);
((PredefinedCustomThemeViewHolder) holder).itemView.setOnClickListener(view -> {
Intent intent = new Intent(context, CustomizeThemeActivity.class);
intent.putExtra(CustomizeThemeActivity.EXTRA_THEME_NAME, customTheme.name);
context.startActivity(intent);
});
} else if (holder instanceof UserCustomThemeViewHolder) {
CustomTheme customTheme = userCustomThemes.get(position - predefinedCustomThemes.size() - 2);
((UserCustomThemeViewHolder) holder).colorPrimaryView.setBackgroundTintList(ColorStateList.valueOf(customTheme.colorPrimary));
((UserCustomThemeViewHolder) holder).nameTextView.setText(customTheme.name);
((UserCustomThemeViewHolder) holder).itemView.setOnClickListener(view -> {
Intent intent = new Intent(context, CustomizeThemeActivity.class);
intent.putExtra(CustomizeThemeActivity.EXTRA_THEME_NAME, customTheme.name);
context.startActivity(intent);
});
} else if (holder instanceof PreDefinedThemeDividerViewHolder) {
((TextView) ((PreDefinedThemeDividerViewHolder) holder).itemView).setText(R.string.predefined_themes);
} else if (holder instanceof UserThemeDividerViewHolder) {
((TextView) ((UserThemeDividerViewHolder) holder).itemView).setText(R.string.user_themes);
}
}
@Override
public int getItemCount() {
return 0;
return predefinedCustomThemes.size() + userCustomThemes.size() + 2;
}
class CustomThemeViewHolder extends RecyclerView.ViewHolder {
public void setUserThemes(List<CustomTheme> userThemes) {
userCustomThemes = (ArrayList<CustomTheme>) userThemes;
notifyDataSetChanged();
}
class PredefinedCustomThemeViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.color_primary_item_custom_theme)
View colorPrimaryView;
@BindView(R.id.name_text_view_item_custom_theme)
TextView nameTextView;
public CustomThemeViewHolder(@NonNull View itemView) {
public PredefinedCustomThemeViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
class UserCustomThemeViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.color_primary_item_custom_theme)
View colorPrimaryView;
@BindView(R.id.name_text_view_item_custom_theme)
TextView nameTextView;
public UserCustomThemeViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
class PreDefinedThemeDividerViewHolder extends RecyclerView.ViewHolder {
public PreDefinedThemeDividerViewHolder(@NonNull View itemView) {
super(itemView);
}
}
class UserThemeDividerViewHolder extends RecyclerView.ViewHolder {
public UserThemeDividerViewHolder(@NonNull View itemView) {
super(itemView);
}
}
}

View File

@ -7,6 +7,7 @@ import ml.docilealligator.infinityforreddit.Activity.AccountPostsActivity;
import ml.docilealligator.infinityforreddit.Activity.AccountSavedThingActivity;
import ml.docilealligator.infinityforreddit.Activity.CommentActivity;
import ml.docilealligator.infinityforreddit.Activity.CreateMultiRedditActivity;
import ml.docilealligator.infinityforreddit.Activity.CustomThemeListingActivity;
import ml.docilealligator.infinityforreddit.Activity.CustomizeThemeActivity;
import ml.docilealligator.infinityforreddit.Activity.EditCommentActivity;
import ml.docilealligator.infinityforreddit.Activity.EditPostActivity;
@ -143,4 +144,6 @@ public interface AppComponent {
void inject(ThemePreferenceFragment themePreferenceFragment);
void inject(CustomizeThemeActivity customizeThemeActivity);
void inject(CustomThemeListingActivity customThemeListingActivity);
}

View File

@ -19,6 +19,7 @@ import org.greenrobot.eventbus.EventBus;
import javax.inject.Inject;
import ml.docilealligator.infinityforreddit.Activity.CustomThemeListingActivity;
import ml.docilealligator.infinityforreddit.Activity.CustomizeThemeActivity;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.Event.RecreateActivityEvent;
@ -52,6 +53,7 @@ public class ThemePreferenceFragment extends PreferenceFragmentCompat {
Preference customizeLightThemePreference = findPreference(SharedPreferencesUtils.CUSTOMIZE_LIGHT_THEME);
Preference customizeDarkThemePreference = findPreference(SharedPreferencesUtils.CUSTOMIZE_DARK_THEME);
Preference customizeAmoledThemePreference = findPreference(SharedPreferencesUtils.CUSTOMIZE_AMOLED_THEME);
Preference selectAndCustomizeThemePreference = findPreference(SharedPreferencesUtils.SELECT_AND_CUSTOMIZE_THEME);
boolean systemDefault = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q;
if (themePreference != null && amoledDarkSwitch != null) {
@ -112,7 +114,7 @@ public class ThemePreferenceFragment extends PreferenceFragmentCompat {
Intent intent = new Intent(activity, CustomizeThemeActivity.class);
intent.putExtra(CustomizeThemeActivity.EXTRA_THEME_TYPE, CustomizeThemeActivity.EXTRA_LIGHT_THEME);
startActivity(intent);
return false;
return true;
});
}
@ -121,7 +123,7 @@ public class ThemePreferenceFragment extends PreferenceFragmentCompat {
Intent intent = new Intent(activity, CustomizeThemeActivity.class);
intent.putExtra(CustomizeThemeActivity.EXTRA_THEME_TYPE, CustomizeThemeActivity.EXTRA_DARK_THEME);
startActivity(intent);
return false;
return true;
});
}
@ -130,7 +132,15 @@ public class ThemePreferenceFragment extends PreferenceFragmentCompat {
Intent intent = new Intent(activity, CustomizeThemeActivity.class);
intent.putExtra(CustomizeThemeActivity.EXTRA_THEME_TYPE, CustomizeThemeActivity.EXTRA_AMOLED_THEME);
startActivity(intent);
return false;
return true;
});
}
if (selectAndCustomizeThemePreference != null) {
selectAndCustomizeThemePreference.setOnPreferenceClickListener(preference -> {
Intent intent = new Intent(activity, CustomThemeListingActivity.class);
startActivity(intent);
return true;
});
}
}

View File

@ -80,4 +80,5 @@ public class SharedPreferencesUtils {
public static final String CUSTOMIZE_LIGHT_THEME = "customize_light_theme";
public static final String CUSTOMIZE_DARK_THEME = "customize_dark_theme";
public static final String CUSTOMIZE_AMOLED_THEME = "customize_amoled_theme";
public static final String SELECT_AND_CUSTOMIZE_THEME = "select_and_customize_theme";
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp" />

View File

@ -19,6 +19,7 @@
<string name="multi_reddit_listing_activity_label">Multireddit</string>
<string name="create_multi_reddit_activity_label">Create Multireddit</string>
<string name="subreddit_multiselection_activity_label">Select Subreddits</string>
<string name="custom_theme_listing_activity_label">Custom Themes</string>
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
@ -361,6 +362,8 @@
<string name="settings_customize_light_theme_title">Light Theme</string>
<string name="settings_customize_dark_theme_title">Dark Theme</string>
<string name="settings_customize_amoled_theme_title">Amoled Theme</string>
<string name="settings_select_and_customize_theme_title">Select and Customize Themes</string>
<string name="settings_custom_theme_cannot_apply_to_settings_page_title">Custom themes cannot be applied to settings page.</string>
<string name="no_link_available">Cannot get the link</string>
@ -598,6 +601,8 @@
<string name="theme_item_available_on_android_8">Only available for Android 8.0 or above.</string>
<string name="theme_item_available_on_android_6">Only available for Android 6.0 or above.</string>
<string name="predefined_themes">Predefined Themes</string>
<string name="user_themes">Your Themes</string>
<string name="theme_name_indigo">Indigo</string>
<string name="theme_name_indigo_dark">Indigo Dark</string>
<string name="theme_name_indigo_amoled">Indigo Amoled</string>

View File

@ -33,4 +33,13 @@
app:icon="@drawable/ic_dark_theme_preference_24dp"
app:title="@string/settings_customize_amoled_theme_title" />
<Preference
app:key="select_and_customize_theme"
app:icon="@drawable/ic_edit_24dp"
app:title="@string/settings_select_and_customize_theme_title" />
<Preference
app:summary="@string/settings_custom_theme_cannot_apply_to_settings_page_title"
app:enabled="false" />
</PreferenceScreen>