feat: add settings category view holder

Also adds a small proof of concept
This commit is contained in:
LucasGGamerM 2023-04-22 22:35:39 -03:00
parent 44b1bc70af
commit fc9ffc9aef
4 changed files with 125 additions and 12 deletions

View File

@ -47,6 +47,7 @@ import org.joinmastodon.android.events.ListDeletedEvent;
import org.joinmastodon.android.events.ListUpdatedCreatedEvent; import org.joinmastodon.android.events.ListUpdatedCreatedEvent;
import org.joinmastodon.android.events.SelfUpdateStateChangedEvent; import org.joinmastodon.android.events.SelfUpdateStateChangedEvent;
import org.joinmastodon.android.fragments.settings.SettingsFragment; import org.joinmastodon.android.fragments.settings.SettingsFragment;
import org.joinmastodon.android.fragments.settings.SettingsMainFragment;
import org.joinmastodon.android.model.Announcement; import org.joinmastodon.android.model.Announcement;
import org.joinmastodon.android.model.Hashtag; import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.HeaderPaginationList; import org.joinmastodon.android.model.HeaderPaginationList;
@ -462,7 +463,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
getToolbar().post(() -> overflowPopup.show()); getToolbar().post(() -> overflowPopup.show());
return true; return true;
} else if (id == R.id.settings || id == R.id.settings_action) { } else if (id == R.id.settings || id == R.id.settings_action) {
Nav.go(getActivity(), SettingsFragment.class, args); Nav.go(getActivity(), SettingsMainFragment.class, args);
} else if (id == R.id.announcements || id == R.id.announcements_action) { } else if (id == R.id.announcements || id == R.id.announcements_action) {
Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this); Nav.goForResult(getActivity(), AnnouncementsFragment.class, args, ANNOUNCEMENTS_RESULT, this);
} else if (id == R.id.edit_timelines) { } else if (id == R.id.edit_timelines) {

View File

@ -118,11 +118,11 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
private static abstract class Item{ static abstract class Item{
public abstract int getViewType(); public abstract int getViewType();
} }
private class HeaderItem extends Item{ protected class HeaderItem extends Item{
private String text; private String text;
public HeaderItem(@StringRes int text){ public HeaderItem(@StringRes int text){
@ -139,7 +139,7 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
} }
private class SwitchItem extends Item{ protected class SwitchItem extends Item{
private String text; private String text;
private int icon; private int icon;
private boolean checked; private boolean checked;
@ -167,7 +167,7 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
} }
private class UpdateItem extends SettingsBaseFragment.Item { protected class UpdateItem extends SettingsBaseFragment.Item {
@Override @Override
public int getViewType(){ public int getViewType(){
@ -175,7 +175,7 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
} }
private static class ThemeItem extends SettingsBaseFragment.Item { protected static class ThemeItem extends SettingsBaseFragment.Item {
@Override @Override
public int getViewType(){ public int getViewType(){
@ -183,7 +183,7 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
} }
private static class NotificationPolicyItem extends SettingsBaseFragment.Item { protected static class NotificationPolicyItem extends SettingsBaseFragment.Item {
@Override @Override
public int getViewType(){ public int getViewType(){
@ -192,7 +192,7 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
public class ButtonItem extends Item{ protected class ButtonItem extends Item{
private int text; private int text;
private int icon; private int icon;
private Consumer<Button> buttonConsumer; private Consumer<Button> buttonConsumer;
@ -209,7 +209,7 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
} }
private class SmallTextItem extends Item { protected class SmallTextItem extends Item {
private String text; private String text;
public SmallTextItem(String text) { public SmallTextItem(String text) {
@ -222,7 +222,7 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
} }
private class TextItem extends Item{ protected class TextItem extends Item{
private String text; private String text;
private String secondaryText; private String secondaryText;
private Runnable onClick; private Runnable onClick;
@ -266,7 +266,52 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
} }
private class FooterItem extends Item{ protected class SettingsCategoryItem extends Item{
private String text;
private String secondaryText;
private Runnable onClick;
private boolean loading;
private int icon;
public SettingsCategoryItem(@StringRes int text, Runnable onClick) {
this(text, null, onClick, false, 0);
}
public SettingsCategoryItem(@StringRes int text, Runnable onClick, @DrawableRes int icon) {
this(text, null, onClick, false, icon);
}
public SettingsCategoryItem(@StringRes int text, String secondaryText, Runnable onClick, @DrawableRes int icon) {
this(text, secondaryText, onClick, false, icon);
}
public SettingsCategoryItem(@StringRes int text, String secondaryText, Runnable onClick, boolean loading, @DrawableRes int icon){
this.text=getString(text);
this.onClick=onClick;
this.loading=loading;
this.icon=icon;
this.secondaryText = secondaryText;
}
public SettingsCategoryItem(String text, Runnable onClick){
this.text=text;
this.onClick=onClick;
}
public SettingsCategoryItem(String text, Runnable onClick, @DrawableRes int icon){
this.text=text;
this.onClick=onClick;
this.icon=icon;
}
@Override
public int getViewType(){
return Type.SETTINGS_CATEGORY.ordinal();
}
}
protected class FooterItem extends Item{
private String text; private String text;
private Runnable onClick; private Runnable onClick;
@ -290,7 +335,8 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
FOOTER, FOOTER,
BUTTON, BUTTON,
SMALL_TEXT, SMALL_TEXT,
UPDATER UPDATER,
SETTINGS_CATEGORY
} }
@ -310,6 +356,7 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
case BUTTON -> new ButtonViewHolder(); case BUTTON -> new ButtonViewHolder();
case SMALL_TEXT -> new SmallTextViewHolder(); case SMALL_TEXT -> new SmallTextViewHolder();
case UPDATER -> new UpdateViewHolder(); case UPDATER -> new UpdateViewHolder();
case SETTINGS_CATEGORY -> new SettingsCategoryViewHolder();
}; };
} }
@ -571,6 +618,25 @@ public abstract class SettingsBaseFragment extends MastodonToolbarFragment imple
} }
} }
private class SettingsCategoryViewHolder extends BindableViewHolder<SettingsCategoryItem>{
private final ImageView icon;
private final TextView text;
@SuppressLint("ClickableViewAccessibility")
public SettingsCategoryViewHolder(){
super(getActivity(), R.layout.item_settings_category, list);
text=findViewById(R.id.text);
icon=findViewById(R.id.icon);
}
@Override
public void onBind(SettingsCategoryItem item){
text.setText(item.text);
icon.setImageResource(item.icon);
item.onClick.run();
}
}
private class ButtonViewHolder extends BindableViewHolder<ButtonItem>{ private class ButtonViewHolder extends BindableViewHolder<ButtonItem>{
private final Button button; private final Button button;
private final ImageView icon; private final ImageView icon;

View File

@ -0,0 +1,14 @@
package org.joinmastodon.android.fragments.settings;
import org.joinmastodon.android.R;
import java.util.ArrayList;
public class SettingsMainFragment extends SettingsBaseFragment{
@Override
public void addItems(ArrayList<SettingsBaseFragment.Item> items) {
items.add(new SettingsBaseFragment.SettingsCategoryItem(R.string.settings_theme, () -> {
System.out.println("YAY");
}, R.drawable.ic_fluent_color_24_regular));
}
}

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:gravity="center_vertical"
android:layoutDirection="locale">
<ImageView
android:id="@+id/icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="32dp"
android:importantForAccessibility="no"
android:tint="?android:textColorPrimary"
tools:src="@drawable/ic_fluent_color_24_regular"/>
<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginEnd="8dp"
android:paddingVertical="8dp"
android:gravity="center_vertical"
android:textColor="?android:textColorPrimary"
android:textSize="16sp" />
</LinearLayout>