fix hashtag options showing up for all timelines

This commit is contained in:
sk 2023-11-13 21:17:58 +01:00
parent 70328217c6
commit d5b6750abe
1 changed files with 339 additions and 338 deletions

View File

@ -60,191 +60,191 @@ import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.utils.BindableViewHolder; import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.views.UsableRecyclerView; import me.grishka.appkit.views.UsableRecyclerView;
public class EditTimelinesFragment extends MastodonRecyclerFragment<TimelineDefinition> implements ScrollableToTop { public class EditTimelinesFragment extends MastodonRecyclerFragment<TimelineDefinition> implements ScrollableToTop{
private String accountID; private String accountID;
private TimelinesAdapter adapter; private TimelinesAdapter adapter;
private final ItemTouchHelper itemTouchHelper; private final ItemTouchHelper itemTouchHelper;
private Menu optionsMenu; private Menu optionsMenu;
private boolean updated; private boolean updated;
private final Map<MenuItem, TimelineDefinition> timelineByMenuItem = new HashMap<>(); private final Map<MenuItem, TimelineDefinition> timelineByMenuItem=new HashMap<>();
private final List<ListTimeline> listTimelines = new ArrayList<>(); private final List<ListTimeline> listTimelines=new ArrayList<>();
private final List<Hashtag> hashtags = new ArrayList<>(); private final List<Hashtag> hashtags=new ArrayList<>();
private MenuItem addHashtagItem; private MenuItem addHashtagItem;
public EditTimelinesFragment() { public EditTimelinesFragment(){
super(10); super(10);
ItemTouchHelper.SimpleCallback itemTouchCallback = new ItemTouchHelperCallback() ; ItemTouchHelper.SimpleCallback itemTouchCallback=new ItemTouchHelperCallback();
itemTouchHelper = new ItemTouchHelper(itemTouchCallback); itemTouchHelper=new ItemTouchHelper(itemTouchCallback);
} }
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setHasOptionsMenu(true); setHasOptionsMenu(true);
setTitle(R.string.sk_timelines); setTitle(R.string.sk_timelines);
accountID = getArguments().getString("account"); accountID=getArguments().getString("account");
new GetLists().setCallback(new Callback<>() { new GetLists().setCallback(new Callback<>(){
@Override @Override
public void onSuccess(List<ListTimeline> result) { public void onSuccess(List<ListTimeline> result){
listTimelines.addAll(result); listTimelines.addAll(result);
updateOptionsMenu(); updateOptionsMenu();
} }
@Override @Override
public void onError(ErrorResponse error) { public void onError(ErrorResponse error){
error.showToast(getContext()); error.showToast(getContext());
} }
}).exec(accountID); }).exec(accountID);
new GetFollowedHashtags().setCallback(new Callback<>() { new GetFollowedHashtags().setCallback(new Callback<>(){
@Override @Override
public void onSuccess(HeaderPaginationList<Hashtag> result) { public void onSuccess(HeaderPaginationList<Hashtag> result){
hashtags.addAll(result); hashtags.addAll(result);
updateOptionsMenu(); updateOptionsMenu();
} }
@Override @Override
public void onError(ErrorResponse error) { public void onError(ErrorResponse error){
error.showToast(getContext()); error.showToast(getContext());
} }
}).exec(accountID); }).exec(accountID);
} }
@Override @Override
protected void onShown(){ protected void onShown(){
super.onShown(); super.onShown();
if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading) loadData(); if(!getArguments().getBoolean("noAutoLoad") && !loaded && !dataLoading) loadData();
} }
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
itemTouchHelper.attachToRecyclerView(list); itemTouchHelper.attachToRecyclerView(list);
refreshLayout.setEnabled(false); refreshLayout.setEnabled(false);
list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorM3OutlineVariant, 0.5f, 56, 16)); list.addItemDecoration(new DividerItemDecoration(getActivity(), R.attr.colorM3OutlineVariant, 0.5f, 56, 16));
} }
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
this.optionsMenu = menu; this.optionsMenu=menu;
updateOptionsMenu(); updateOptionsMenu();
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item){
if (item.getItemId() == R.id.menu_back) { if(item.getItemId()==R.id.menu_back){
updateOptionsMenu(); updateOptionsMenu();
optionsMenu.performIdentifierAction(R.id.menu_add_timeline, 0); optionsMenu.performIdentifierAction(R.id.menu_add_timeline, 0);
return true; return true;
} }
TimelineDefinition tl = timelineByMenuItem.get(item); TimelineDefinition tl=timelineByMenuItem.get(item);
if (tl != null) { if(tl!=null){
addTimeline(tl); addTimeline(tl);
} else if (item == addHashtagItem) { }else if(item==addHashtagItem){
makeTimelineEditor(null, (hashtag) -> { makeTimelineEditor(null, (hashtag)->{
if (hashtag != null) addTimeline(hashtag); if(hashtag!=null) addTimeline(hashtag);
}, null); }, null);
} }
return true; return true;
} }
private void addTimeline(TimelineDefinition tl) { private void addTimeline(TimelineDefinition tl){
data.add(tl.copy()); data.add(tl.copy());
adapter.notifyItemInserted(data.size()); adapter.notifyItemInserted(data.size());
saveTimelines(); saveTimelines();
updateOptionsMenu(); updateOptionsMenu();
} }
private void addTimelineToOptions(TimelineDefinition tl, Menu menu) { private void addTimelineToOptions(TimelineDefinition tl, Menu menu){
if (data.contains(tl)) return; if(data.contains(tl)) return;
MenuItem item = addOptionsItem(menu, tl.getTitle(getContext()), tl.getIcon().iconRes); MenuItem item=addOptionsItem(menu, tl.getTitle(getContext()), tl.getIcon().iconRes);
timelineByMenuItem.put(item, tl); timelineByMenuItem.put(item, tl);
} }
private MenuItem addOptionsItem(Menu menu, String name, @DrawableRes int icon) { private MenuItem addOptionsItem(Menu menu, String name, @DrawableRes int icon){
MenuItem item = menu.add(0, View.generateViewId(), Menu.NONE, name); MenuItem item=menu.add(0, View.generateViewId(), Menu.NONE, name);
item.setIcon(icon); item.setIcon(icon);
return item; return item;
} }
private void updateOptionsMenu() { private void updateOptionsMenu(){
if(getActivity()==null) return; if(getActivity()==null) return;
optionsMenu.clear(); optionsMenu.clear();
timelineByMenuItem.clear(); timelineByMenuItem.clear();
SubMenu menu = optionsMenu.addSubMenu(0, R.id.menu_add_timeline, NONE, R.string.sk_timelines_add); SubMenu menu=optionsMenu.addSubMenu(0, R.id.menu_add_timeline, NONE, R.string.sk_timelines_add);
menu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.getItem().setIcon(R.drawable.ic_fluent_add_24_regular); menu.getItem().setIcon(R.drawable.ic_fluent_add_24_regular);
SubMenu timelinesMenu = menu.addSubMenu(R.string.sk_timeline); SubMenu timelinesMenu=menu.addSubMenu(R.string.sk_timeline);
timelinesMenu.getItem().setIcon(R.drawable.ic_fluent_timeline_24_regular); timelinesMenu.getItem().setIcon(R.drawable.ic_fluent_timeline_24_regular);
SubMenu listsMenu = menu.addSubMenu(R.string.sk_list); SubMenu listsMenu=menu.addSubMenu(R.string.sk_list);
listsMenu.getItem().setIcon(R.drawable.ic_fluent_people_24_regular); listsMenu.getItem().setIcon(R.drawable.ic_fluent_people_24_regular);
SubMenu hashtagsMenu = menu.addSubMenu(R.string.sk_hashtag); SubMenu hashtagsMenu=menu.addSubMenu(R.string.sk_hashtag);
hashtagsMenu.getItem().setIcon(R.drawable.ic_fluent_number_symbol_24_regular); hashtagsMenu.getItem().setIcon(R.drawable.ic_fluent_number_symbol_24_regular);
makeBackItem(timelinesMenu); makeBackItem(timelinesMenu);
makeBackItem(listsMenu); makeBackItem(listsMenu);
makeBackItem(hashtagsMenu); makeBackItem(hashtagsMenu);
TimelineDefinition.getAllTimelines(accountID).stream().forEach(tl -> addTimelineToOptions(tl, timelinesMenu)); TimelineDefinition.getAllTimelines(accountID).stream().forEach(tl->addTimelineToOptions(tl, timelinesMenu));
listTimelines.stream().map(TimelineDefinition::ofList).forEach(tl -> addTimelineToOptions(tl, listsMenu)); listTimelines.stream().map(TimelineDefinition::ofList).forEach(tl->addTimelineToOptions(tl, listsMenu));
addHashtagItem = addOptionsItem(hashtagsMenu, getContext().getString(R.string.sk_timelines_add), R.drawable.ic_fluent_add_24_regular); addHashtagItem=addOptionsItem(hashtagsMenu, getContext().getString(R.string.sk_timelines_add), R.drawable.ic_fluent_add_24_regular);
hashtags.stream().map(TimelineDefinition::ofHashtag).forEach(tl -> addTimelineToOptions(tl, hashtagsMenu)); hashtags.stream().map(TimelineDefinition::ofHashtag).forEach(tl->addTimelineToOptions(tl, hashtagsMenu));
timelinesMenu.getItem().setVisible(timelinesMenu.size() > 0); timelinesMenu.getItem().setVisible(timelinesMenu.size()>0);
listsMenu.getItem().setVisible(listsMenu.size() > 0); listsMenu.getItem().setVisible(listsMenu.size()>0);
hashtagsMenu.getItem().setVisible(hashtagsMenu.size() > 0); hashtagsMenu.getItem().setVisible(hashtagsMenu.size()>0);
UiUtils.enableOptionsMenuIcons(getContext(), optionsMenu, R.id.menu_add_timeline); UiUtils.enableOptionsMenuIcons(getContext(), optionsMenu, R.id.menu_add_timeline);
} }
private void saveTimelines() { private void saveTimelines(){
updated=true; updated=true;
AccountLocalPreferences prefs=AccountSessionManager.get(accountID).getLocalPreferences(); AccountLocalPreferences prefs=AccountSessionManager.get(accountID).getLocalPreferences();
if(data.isEmpty()) data.add(TimelineDefinition.HOME_TIMELINE); if(data.isEmpty()) data.add(TimelineDefinition.HOME_TIMELINE);
prefs.timelines=data; prefs.timelines=data;
prefs.save(); prefs.save();
} }
private void removeTimeline(int position) { private void removeTimeline(int position){
data.remove(position); data.remove(position);
adapter.notifyItemRemoved(position); adapter.notifyItemRemoved(position);
saveTimelines(); saveTimelines();
updateOptionsMenu(); updateOptionsMenu();
} }
@Override @Override
protected void doLoadData(int offset, int count){ protected void doLoadData(int offset, int count){
onDataLoaded(AccountSessionManager.get(accountID).getLocalPreferences().timelines); onDataLoaded(AccountSessionManager.get(accountID).getLocalPreferences().timelines);
updateOptionsMenu(); updateOptionsMenu();
} }
@Override @Override
protected RecyclerView.Adapter<TimelineViewHolder> getAdapter() { protected RecyclerView.Adapter<TimelineViewHolder> getAdapter(){
return adapter = new TimelinesAdapter(); return adapter=new TimelinesAdapter();
} }
@Override @Override
public void scrollToTop() { public void scrollToTop(){
smoothScrollRecyclerViewToTop(list); smoothScrollRecyclerViewToTop(list);
} }
@Override @Override
public void onDestroy() { public void onDestroy(){
super.onDestroy(); super.onDestroy();
if (updated) UiUtils.restartApp(); if(updated) UiUtils.restartApp();
} }
private boolean setTagListContent(NachoTextView editText, @Nullable List<String> tags) { private boolean setTagListContent(NachoTextView editText, @Nullable List<String> tags){
if (tags == null || tags.isEmpty()) return false; if(tags==null || tags.isEmpty()) return false;
editText.setText(tags); editText.setText(tags);
editText.chipifyAllUnterminatedTokens(); editText.chipifyAllUnterminatedTokens();
return true; return true;
} }
private NachoTextView prepareChipTextView(NachoTextView nacho) { private NachoTextView prepareChipTextView(NachoTextView nacho){
//Ill Be Back //Ill Be Back
nacho.setChipTerminators( nacho.setChipTerminators(
Map.of( Map.of(
@ -254,223 +254,224 @@ public class EditTimelinesFragment extends MastodonRecyclerFragment<TimelineDefi
';', BEHAVIOR_CHIPIFY_ALL ';', BEHAVIOR_CHIPIFY_ALL
) )
); );
nacho.enableEditChipOnTouch(true, true); nacho.enableEditChipOnTouch(true, true);
nacho.setOnFocusChangeListener((v, hasFocus) -> nacho.chipifyAllUnterminatedTokens()); nacho.setOnFocusChangeListener((v, hasFocus)->nacho.chipifyAllUnterminatedTokens());
return nacho; return nacho;
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
protected void makeTimelineEditor(@Nullable TimelineDefinition item, Consumer<TimelineDefinition> onSave, Runnable onRemove) { protected void makeTimelineEditor(@Nullable TimelineDefinition item, Consumer<TimelineDefinition> onSave, Runnable onRemove){
Context ctx = getContext(); Context ctx=getContext();
View view = getActivity().getLayoutInflater().inflate(R.layout.edit_timeline, list, false); View view=getActivity().getLayoutInflater().inflate(R.layout.edit_timeline, list, false);
View divider = view.findViewById(R.id.divider); View divider=view.findViewById(R.id.divider);
Button advancedBtn = view.findViewById(R.id.advanced); Button advancedBtn=view.findViewById(R.id.advanced);
EditText editText = view.findViewById(R.id.input); EditText editText=view.findViewById(R.id.input);
if (item != null) editText.setText(item.getCustomTitle()); if(item!=null) editText.setText(item.getCustomTitle());
editText.setHint(item != null ? item.getDefaultTitle(ctx) : ctx.getString(R.string.sk_hashtag)); editText.setHint(item!=null ? item.getDefaultTitle(ctx) : ctx.getString(R.string.sk_hashtag));
LinearLayout tagWrap = view.findViewById(R.id.tag_wrap); LinearLayout tagWrap=view.findViewById(R.id.tag_wrap);
boolean advancedOptionsAvailable = item == null || item.getType() == TimelineDefinition.TimelineType.HASHTAG; boolean hashtagOptionsAvailable=item==null || item.getType()==TimelineDefinition.TimelineType.HASHTAG;
advancedBtn.setVisibility(advancedOptionsAvailable ? View.VISIBLE : View.GONE); advancedBtn.setVisibility(hashtagOptionsAvailable ? View.VISIBLE : View.GONE);
advancedBtn.setOnClickListener(l -> { advancedBtn.setOnClickListener(l->{
advancedBtn.setSelected(!advancedBtn.isSelected()); advancedBtn.setSelected(!advancedBtn.isSelected());
advancedBtn.setText(advancedBtn.isSelected() ? R.string.sk_advanced_options_hide : R.string.sk_advanced_options_show); advancedBtn.setText(advancedBtn.isSelected() ? R.string.sk_advanced_options_hide : R.string.sk_advanced_options_show);
divider.setVisibility(advancedBtn.isSelected() ? View.VISIBLE : View.GONE); divider.setVisibility(advancedBtn.isSelected() ? View.VISIBLE : View.GONE);
tagWrap.setVisibility(advancedBtn.isSelected() ? View.VISIBLE : View.GONE); tagWrap.setVisibility(advancedBtn.isSelected() ? View.VISIBLE : View.GONE);
UiUtils.beginLayoutTransition((ViewGroup) view); UiUtils.beginLayoutTransition((ViewGroup) view);
}); });
Switch localOnlySwitch = view.findViewById(R.id.local_only_switch); Switch localOnlySwitch=view.findViewById(R.id.local_only_switch);
view.findViewById(R.id.local_only) view.findViewById(R.id.local_only).setOnClickListener(l->localOnlySwitch.setChecked(!localOnlySwitch.isChecked()));
.setOnClickListener(l -> localOnlySwitch.setChecked(!localOnlySwitch.isChecked()));
EditText tagMain = view.findViewById(R.id.tag_main); EditText tagMain=view.findViewById(R.id.tag_main);
NachoTextView tagsAny = prepareChipTextView(view.findViewById(R.id.tags_any)); NachoTextView tagsAny=prepareChipTextView(view.findViewById(R.id.tags_any));
NachoTextView tagsAll = prepareChipTextView(view.findViewById(R.id.tags_all)); NachoTextView tagsAll=prepareChipTextView(view.findViewById(R.id.tags_all));
NachoTextView tagsNone = prepareChipTextView(view.findViewById(R.id.tags_none)); NachoTextView tagsNone=prepareChipTextView(view.findViewById(R.id.tags_none));
if (item != null) {
tagMain.setText(item.getHashtagName()); if(item!=null && hashtagOptionsAvailable){
boolean hasAdvanced = !TextUtils.isEmpty(item.getCustomTitle()) && !Objects.equals(item.getHashtagName(), item.getCustomTitle()); tagMain.setText(item.getHashtagName());
hasAdvanced = setTagListContent(tagsAny, item.getHashtagAny()) || hasAdvanced; boolean hasAdvanced=!TextUtils.isEmpty(item.getCustomTitle()) && !Objects.equals(item.getHashtagName(), item.getCustomTitle());
hasAdvanced = setTagListContent(tagsAll, item.getHashtagAll()) || hasAdvanced; hasAdvanced=setTagListContent(tagsAny, item.getHashtagAny()) || hasAdvanced;
hasAdvanced = setTagListContent(tagsNone, item.getHashtagNone()) || hasAdvanced; hasAdvanced=setTagListContent(tagsAll, item.getHashtagAll()) || hasAdvanced;
if (item.isHashtagLocalOnly()) { hasAdvanced=setTagListContent(tagsNone, item.getHashtagNone()) || hasAdvanced;
localOnlySwitch.setChecked(true); if(item.isHashtagLocalOnly()){
hasAdvanced = true; localOnlySwitch.setChecked(true);
} hasAdvanced=true;
if (hasAdvanced) { }
advancedBtn.setSelected(true); if(hasAdvanced){
advancedBtn.setText(R.string.sk_advanced_options_hide); advancedBtn.setSelected(true);
advancedBtn.setText(R.string.sk_advanced_options_hide);
tagWrap.setVisibility(View.VISIBLE); tagWrap.setVisibility(View.VISIBLE);
divider.setVisibility(View.VISIBLE); divider.setVisibility(View.VISIBLE);
} }
} }
ImageButton btn = view.findViewById(R.id.button); ImageButton btn=view.findViewById(R.id.button);
PopupMenu popup = new PopupMenu(ctx, btn); PopupMenu popup=new PopupMenu(ctx, btn);
TimelineDefinition.Icon currentIcon = item != null ? item.getIcon() : TimelineDefinition.Icon.HASHTAG; TimelineDefinition.Icon currentIcon=item!=null ? item.getIcon() : TimelineDefinition.Icon.HASHTAG;
btn.setImageResource(currentIcon.iconRes); btn.setImageResource(currentIcon.iconRes);
btn.setTag(currentIcon.ordinal()); btn.setTag(currentIcon.ordinal());
btn.setContentDescription(ctx.getString(currentIcon.nameRes)); btn.setContentDescription(ctx.getString(currentIcon.nameRes));
btn.setOnTouchListener(popup.getDragToOpenListener()); btn.setOnTouchListener(popup.getDragToOpenListener());
btn.setOnClickListener(l -> popup.show()); btn.setOnClickListener(l->popup.show());
Menu menu = popup.getMenu(); Menu menu=popup.getMenu();
TimelineDefinition.Icon defaultIcon = item != null ? item.getDefaultIcon() : TimelineDefinition.Icon.HASHTAG; TimelineDefinition.Icon defaultIcon=item!=null ? item.getDefaultIcon() : TimelineDefinition.Icon.HASHTAG;
menu.add(0, currentIcon.ordinal(), NONE, currentIcon.nameRes).setIcon(currentIcon.iconRes); menu.add(0, currentIcon.ordinal(), NONE, currentIcon.nameRes).setIcon(currentIcon.iconRes);
if (!currentIcon.equals(defaultIcon)) { if(!currentIcon.equals(defaultIcon)){
menu.add(0, defaultIcon.ordinal(), NONE, defaultIcon.nameRes).setIcon(defaultIcon.iconRes); menu.add(0, defaultIcon.ordinal(), NONE, defaultIcon.nameRes).setIcon(defaultIcon.iconRes);
} }
for (TimelineDefinition.Icon icon : TimelineDefinition.Icon.values()) { for(TimelineDefinition.Icon icon : TimelineDefinition.Icon.values()){
if (icon.hidden || icon.ordinal() == (int) btn.getTag()) continue; if(icon.hidden || icon.ordinal()==(int) btn.getTag()) continue;
menu.add(0, icon.ordinal(), NONE, icon.nameRes).setIcon(icon.iconRes); menu.add(0, icon.ordinal(), NONE, icon.nameRes).setIcon(icon.iconRes);
} }
UiUtils.enablePopupMenuIcons(ctx, popup); UiUtils.enablePopupMenuIcons(ctx, popup);
popup.setOnMenuItemClickListener(menuItem -> { popup.setOnMenuItemClickListener(menuItem->{
TimelineDefinition.Icon icon = TimelineDefinition.Icon.values()[menuItem.getItemId()]; TimelineDefinition.Icon icon=TimelineDefinition.Icon.values()[menuItem.getItemId()];
btn.setImageResource(icon.iconRes); btn.setImageResource(icon.iconRes);
btn.setTag(menuItem.getItemId()); btn.setTag(menuItem.getItemId());
btn.setContentDescription(ctx.getString(icon.nameRes)); btn.setContentDescription(ctx.getString(icon.nameRes));
return true; return true;
}); });
AlertDialog.Builder builder = new M3AlertDialogBuilder(ctx) AlertDialog.Builder builder=new M3AlertDialogBuilder(ctx)
.setTitle(item == null ? R.string.sk_add_timeline : R.string.sk_edit_timeline) .setTitle(item==null ? R.string.sk_add_timeline : R.string.sk_edit_timeline)
.setView(view) .setView(view)
.setPositiveButton(R.string.save, (d, which) -> { .setPositiveButton(R.string.save, (d, which)->{
tagsAny.chipifyAllUnterminatedTokens(); tagsAny.chipifyAllUnterminatedTokens();
tagsAll.chipifyAllUnterminatedTokens(); tagsAll.chipifyAllUnterminatedTokens();
tagsNone.chipifyAllUnterminatedTokens(); tagsNone.chipifyAllUnterminatedTokens();
String name = editText.getText().toString().trim(); String name=editText.getText().toString().trim();
String mainHashtag = tagMain.getText().toString().trim(); String mainHashtag=tagMain.getText().toString().trim();
if (TextUtils.isEmpty(mainHashtag)) { if(TextUtils.isEmpty(mainHashtag)){
mainHashtag = name; mainHashtag=name;
name = null; name=null;
} }
if (TextUtils.isEmpty(mainHashtag) && (item != null && item.getType() == TimelineDefinition.TimelineType.HASHTAG)) { if(TextUtils.isEmpty(mainHashtag) && (item!=null && item.getType()==TimelineDefinition.TimelineType.HASHTAG)){
Toast.makeText(ctx, R.string.sk_add_timeline_tag_error_empty, Toast.LENGTH_SHORT).show(); Toast.makeText(ctx, R.string.sk_add_timeline_tag_error_empty, Toast.LENGTH_SHORT).show();
onSave.accept(null); onSave.accept(null);
return; return;
} }
TimelineDefinition tl = item != null ? item : TimelineDefinition.ofHashtag(name); TimelineDefinition tl=item!=null ? item : TimelineDefinition.ofHashtag(name);
TimelineDefinition.Icon icon = TimelineDefinition.Icon.values()[(int) btn.getTag()]; TimelineDefinition.Icon icon=TimelineDefinition.Icon.values()[(int) btn.getTag()];
tl.setIcon(icon); tl.setIcon(icon);
tl.setTitle(name); tl.setTitle(name);
tl.setTagOptions( tl.setTagOptions(
mainHashtag, mainHashtag,
tagsAny.getChipValues(), tagsAny.getChipValues(),
tagsAll.getChipValues(), tagsAll.getChipValues(),
tagsNone.getChipValues(), tagsNone.getChipValues(),
localOnlySwitch.isChecked() localOnlySwitch.isChecked()
); );
onSave.accept(tl); onSave.accept(tl);
}) })
.setNegativeButton(R.string.cancel, (d, which) -> {}); .setNegativeButton(R.string.cancel, (d, which)->{
});
if (onRemove != null) builder.setNeutralButton(R.string.sk_remove, (d, which) -> onRemove.run()); if(onRemove!=null) builder.setNeutralButton(R.string.sk_remove, (d, which)->onRemove.run());
builder.show(); builder.show();
btn.requestFocus(); btn.requestFocus();
} }
private class TimelinesAdapter extends RecyclerView.Adapter<TimelineViewHolder>{ private class TimelinesAdapter extends RecyclerView.Adapter<TimelineViewHolder>{
@NonNull @NonNull
@Override @Override
public TimelineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){ public TimelineViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
return new TimelineViewHolder(); return new TimelineViewHolder();
} }
@Override @Override
public void onBindViewHolder(@NonNull TimelineViewHolder holder, int position) { public void onBindViewHolder(@NonNull TimelineViewHolder holder, int position){
holder.bind(data.get(position)); holder.bind(data.get(position));
} }
@Override @Override
public int getItemCount() { public int getItemCount(){
return data.size(); return data.size();
} }
} }
private class TimelineViewHolder extends BindableViewHolder<TimelineDefinition> implements UsableRecyclerView.Clickable{ private class TimelineViewHolder extends BindableViewHolder<TimelineDefinition> implements UsableRecyclerView.Clickable{
private final TextView title; private final TextView title;
private final ImageView dragger; private final ImageView dragger;
public TimelineViewHolder(){ public TimelineViewHolder(){
super(getActivity(), R.layout.item_text, list); super(getActivity(), R.layout.item_text, list);
title=findViewById(R.id.title); title=findViewById(R.id.title);
dragger=findViewById(R.id.dragger_thingy); dragger=findViewById(R.id.dragger_thingy);
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onBind(TimelineDefinition item) { public void onBind(TimelineDefinition item){
title.setText(item.getTitle(getContext())); title.setText(item.getTitle(getContext()));
title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(item.getIcon().iconRes), null, null, null); title.setCompoundDrawablesRelativeWithIntrinsicBounds(itemView.getContext().getDrawable(item.getIcon().iconRes), null, null, null);
dragger.setVisibility(View.VISIBLE); dragger.setVisibility(View.VISIBLE);
dragger.setOnTouchListener((View v, MotionEvent event) -> { dragger.setOnTouchListener((View v, MotionEvent event)->{
if (event.getAction() == MotionEvent.ACTION_DOWN) { if(event.getAction()==MotionEvent.ACTION_DOWN){
itemTouchHelper.startDrag(this); itemTouchHelper.startDrag(this);
return true; return true;
} }
return false; return false;
}); });
} }
private void onSave(TimelineDefinition tl) { private void onSave(TimelineDefinition tl){
saveTimelines(); saveTimelines();
rebind(); rebind();
} }
private void onRemove() { private void onRemove(){
removeTimeline(getAbsoluteAdapterPosition()); removeTimeline(getAbsoluteAdapterPosition());
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public void onClick() { public void onClick(){
makeTimelineEditor(item, this::onSave, this::onRemove); makeTimelineEditor(item, this::onSave, this::onRemove);
} }
} }
private class ItemTouchHelperCallback extends ItemTouchHelper.SimpleCallback { private class ItemTouchHelperCallback extends ItemTouchHelper.SimpleCallback{
public ItemTouchHelperCallback() { public ItemTouchHelperCallback(){
super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT); super(ItemTouchHelper.UP|ItemTouchHelper.DOWN, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT);
} }
@Override @Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target){
int fromPosition = viewHolder.getAbsoluteAdapterPosition(); int fromPosition=viewHolder.getAbsoluteAdapterPosition();
int toPosition = target.getAbsoluteAdapterPosition(); int toPosition=target.getAbsoluteAdapterPosition();
if (Math.max(fromPosition, toPosition) >= data.size() || Math.min(fromPosition, toPosition) < 0) { if(Math.max(fromPosition, toPosition)>=data.size() || Math.min(fromPosition, toPosition)<0){
return false; return false;
} else { }else{
Collections.swap(data, fromPosition, toPosition); Collections.swap(data, fromPosition, toPosition);
adapter.notifyItemMoved(fromPosition, toPosition); adapter.notifyItemMoved(fromPosition, toPosition);
saveTimelines(); saveTimelines();
return true; return true;
} }
} }
@Override @Override
public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) { public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState){
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG && viewHolder != null) { if(actionState==ItemTouchHelper.ACTION_STATE_DRAG && viewHolder!=null){
viewHolder.itemView.animate().alpha(0.65f); viewHolder.itemView.animate().alpha(0.65f);
} }
} }
@Override @Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder){
super.clearView(recyclerView, viewHolder); super.clearView(recyclerView, viewHolder);
viewHolder.itemView.animate().alpha(1f); viewHolder.itemView.animate().alpha(1f);
} }
@Override @Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction){
int position = viewHolder.getAbsoluteAdapterPosition(); int position=viewHolder.getAbsoluteAdapterPosition();
removeTimeline(position); removeTimeline(position);
} }
} }
} }