From 1e0f73a9cc2d9144a1326de2d8aad67bb5ea5313 Mon Sep 17 00:00:00 2001 From: 0xd9a <0xd9a@noreply.codeberg.org> Date: Fri, 19 Sep 2025 21:28:18 +0530 Subject: [PATCH] Add accessibility actions to hide, delete timelines in 'Manage timelines' page --- .../ui/drawer/ReorderBottomMenuAdapter.java | 42 +++--- .../mastodon/ui/drawer/ReorderTabAdapter.java | 139 ++++++++++-------- .../mastodon/layout/drawer_reorder.xml | 6 +- 3 files changed, 104 insertions(+), 83 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ReorderBottomMenuAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ReorderBottomMenuAdapter.java index 5f7e54b2..a725ddd9 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ReorderBottomMenuAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ReorderBottomMenuAdapter.java @@ -100,24 +100,7 @@ public class ReorderBottomMenuAdapter extends RecyclerView.Adapter { - bottomMenu.bottom_menu.get(position).visible = !bottomMenu.bottom_menu.get(position).visible; - bottomMenu.user_id = MainActivity.currentUserID; - bottomMenu.instance = MainActivity.currentInstance; - if (bottomMenu.bottom_menu.get(position).visible) { - holder.binding.hide.setImageResource(R.drawable.ic_baseline_visibility_24); - } else { - holder.binding.hide.setImageResource(R.drawable.ic_baseline_visibility_off_24); - } - new Thread(() -> { - try { - new BottomMenu(context).insertOrUpdate(bottomMenu); - ((ReorderTimelinesActivity) context).setBottomChanges(true); - } catch (DBException e) { - e.printStackTrace(); - } - }).start(); - }); + holder.binding.hide.setOnClickListener(v -> onHidePressed(holder, position)); // Start a drag whenever the handle view it touched holder.binding.handle.setOnTouchListener((v, event) -> { @@ -137,6 +120,29 @@ public class ReorderBottomMenuAdapter extends RecyclerView.Adapter { + onHidePressed(holder, position); + return true; + }); + } + + private void onHidePressed(ReorderViewHolder holder, int position) { + bottomMenu.bottom_menu.get(position).visible = !bottomMenu.bottom_menu.get(position).visible; + bottomMenu.user_id = MainActivity.currentUserID; + bottomMenu.instance = MainActivity.currentInstance; + if (bottomMenu.bottom_menu.get(position).visible) { + holder.binding.hide.setImageResource(R.drawable.ic_baseline_visibility_24); + } else { + holder.binding.hide.setImageResource(R.drawable.ic_baseline_visibility_off_24); + } + new Thread(() -> { + try { + new BottomMenu(context).insertOrUpdate(bottomMenu); + ((ReorderTimelinesActivity) context).setBottomChanges(true); + } catch (DBException e) { + e.printStackTrace(); + } + }).start(); } @Override diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ReorderTabAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ReorderTabAdapter.java index e6f99cfc..30f24b26 100644 --- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ReorderTabAdapter.java +++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/ReorderTabAdapter.java @@ -171,18 +171,7 @@ public class ReorderTabAdapter extends RecyclerView.Adapter { - pinned.pinnedTimelines.get(position).displayed = !pinned.pinnedTimelines.get(position).displayed; - notifyItemChanged(position); - new Thread(() -> { - try { - new Pinned(context).updatePinned(pinned); - ((ReorderTimelinesActivity) context).setChanges(true); - } catch (DBException e) { - e.printStackTrace(); - } - }).start(); - }); + holder.binding.hide.setOnClickListener(v -> onHidePressed(position)); // Start a drag whenever the handle view it touched holder.binding.handle.setOnTouchListener((v, event) -> { @@ -202,65 +191,89 @@ public class ReorderTabAdapter extends RecyclerView.Adapter { + onHidePressed(position); + return true; + }); PinnedTimeline item = pinned.pinnedTimelines.get(position); if (item.type == Timeline.TimeLineEnum.TAG || item.type == Timeline.TimeLineEnum.REMOTE || item.type == Timeline.TimeLineEnum.LIST) { holder.binding.delete.setVisibility(View.VISIBLE); + holder.binding.delete.setOnClickListener(v -> onDeletePressed(item, position)); + ViewCompat.addAccessibilityAction(holder.binding.getRoot(), context.getString(R.string.delete_timeline), (view, arguments) -> { + onDeletePressed(item, position); + return true; + }); } else { holder.binding.delete.setVisibility(View.GONE); } - holder.binding.delete.setOnClickListener(v -> { - if (item.type == Timeline.TimeLineEnum.TAG || item.type == Timeline.TimeLineEnum.REMOTE || item.type == Timeline.TimeLineEnum.LIST) { - AlertDialog.Builder alt_bld = new MaterialAlertDialogBuilder(context); - String title = ""; - String message = ""; - alt_bld.setTitle(R.string.action_lists_delete); - alt_bld.setMessage(R.string.action_lists_confirm_delete); - switch (item.type) { - case TAG: - case REMOTE: - title = context.getString(R.string.action_pinned_delete); - message = context.getString(R.string.unpin_timeline_description); - break; - case LIST: - title = context.getString(R.string.action_lists_delete); - message = context.getString(R.string.action_lists_confirm_delete); - break; - } - alt_bld.setTitle(title); - alt_bld.setMessage(message); - - alt_bld.setPositiveButton(R.string.delete, (dialog, id) -> { - //change position of pinned that are after the removed item - if (position < pinned.pinnedTimelines.size()) { - for (int i = item.position + 1; i < pinned.pinnedTimelines.size(); i++) { - pinned.pinnedTimelines.get(i).position -= 1; - } - pinned.pinnedTimelines.remove(position); - notifyItemRemoved(position); - notifyItemChanged(position, pinned.pinnedTimelines.size() - position); - try { - new Pinned(context).updatePinned(pinned); - } catch (DBException e) { - e.printStackTrace(); - } - } - - if (item.type == Timeline.TimeLineEnum.LIST) { - TimelinesVM timelinesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(TimelinesVM.class); - timelinesVM.deleteList(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, item.mastodonList.id); - } - - - ((ReorderTimelinesActivity) context).setChanges(true); - dialog.dismiss(); - - }); - alt_bld.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss()); - AlertDialog alert = alt_bld.create(); - alert.show(); + } + private void onHidePressed(int position) { + pinned.pinnedTimelines.get(position).displayed = !pinned.pinnedTimelines.get(position).displayed; + notifyItemChanged(position); + new Thread(() -> { + try { + new Pinned(context).updatePinned(pinned); + ((ReorderTimelinesActivity) context).setChanges(true); + } catch (DBException e) { + e.printStackTrace(); } - }); + }).start(); + } + + private void onDeletePressed(PinnedTimeline item, int position) { + if (item.type == Timeline.TimeLineEnum.TAG || item.type == Timeline.TimeLineEnum.REMOTE || item.type == Timeline.TimeLineEnum.LIST) { + AlertDialog.Builder alt_bld = new MaterialAlertDialogBuilder(context); + String title = ""; + String message = ""; + alt_bld.setTitle(R.string.action_lists_delete); + alt_bld.setMessage(R.string.action_lists_confirm_delete); + switch (item.type) { + case TAG: + case REMOTE: + title = context.getString(R.string.action_pinned_delete); + message = context.getString(R.string.unpin_timeline_description); + break; + case LIST: + title = context.getString(R.string.action_lists_delete); + message = context.getString(R.string.action_lists_confirm_delete); + break; + } + alt_bld.setTitle(title); + alt_bld.setMessage(message); + + alt_bld.setPositiveButton(R.string.delete, (dialog, id) -> { + //change position of pinned that are after the removed item + if (position < pinned.pinnedTimelines.size()) { + for (int i = item.position + 1; i < pinned.pinnedTimelines.size(); i++) { + pinned.pinnedTimelines.get(i).position -= 1; + } + pinned.pinnedTimelines.remove(position); + notifyItemRemoved(position); + notifyItemChanged(position, pinned.pinnedTimelines.size() - position); + try { + new Pinned(context).updatePinned(pinned); + } catch (DBException e) { + e.printStackTrace(); + } + } + + if (item.type == Timeline.TimeLineEnum.LIST) { + TimelinesVM timelinesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(TimelinesVM.class); + timelinesVM.deleteList(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, item.mastodonList.id); + } + + + ((ReorderTimelinesActivity) context).setChanges(true); + dialog.dismiss(); + + }); + alt_bld.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss()); + AlertDialog alert = alt_bld.create(); + alert.show(); + + } + } @Override diff --git a/app/src/main/res/layouts/mastodon/layout/drawer_reorder.xml b/app/src/main/res/layouts/mastodon/layout/drawer_reorder.xml index 769dc98f..6f56f4ed 100644 --- a/app/src/main/res/layouts/mastodon/layout/drawer_reorder.xml +++ b/app/src/main/res/layouts/mastodon/layout/drawer_reorder.xml @@ -30,13 +30,13 @@ android:layout_gravity="center_vertical" android:layout_weight="1" /> - @@ -47,10 +47,12 @@ android:layout_height="40dp" android:layout_gravity="center" android:contentDescription="@string/delete_timeline" + android:importantForAccessibility="no" android:scaleType="center" android:src="@drawable/ic_baseline_delete_24" android:visibility="gone" - tools:ignore="RtlHardcoded" /> + tools:ignore="RtlHardcoded" + tools:visibility="visible" />