fix hashtag options showing up for all timelines
This commit is contained in:
parent
70328217c6
commit
d5b6750abe
|
@ -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){
|
||||||
//I’ll Be Back
|
//I’ll 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue