Compare commits

...

5 Commits

Author SHA1 Message Date
copilot-swe-agent[bot] 71652290d5 Fix XML attribute ordering in context menu resource
Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com>
2026-02-11 19:33:59 +00:00
copilot-swe-agent[bot] 12a373b48d Refactor: Extract clearContextMenuState() helper method
Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com>
2026-02-11 19:32:17 +00:00
copilot-swe-agent[bot] 5df63855f9 Clean up context menu state to prevent memory leaks
Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com>
2026-02-11 19:31:24 +00:00
copilot-swe-agent[bot] 6d44e74dc2 Replace edit/delete buttons with context menu in relay list items
Co-authored-by: adbenitez <24558636+adbenitez@users.noreply.github.com>
2026-02-11 19:29:14 +00:00
copilot-swe-agent[bot] 29ec07a478 Initial plan 2026-02-11 19:26:06 +00:00
4 changed files with 70 additions and 39 deletions
@@ -3,7 +3,9 @@ package org.thoughtcrime.securesms.relay;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
@@ -43,6 +45,10 @@ public class RelayListActivity extends BaseActionBarActivity
private RelayListAdapter adapter;
private Rpc rpc;
private int accId;
/** Relay selected for context menu */
private EnteredLoginParam contextMenuRelay = null;
private boolean contextMenuRelayIsMain = false;
/** QR provided via Intent extras needs to be saved to pass it to QrCodeHandler when authorization finishes */
private String qrData = null;
@@ -166,6 +172,56 @@ public class RelayListActivity extends BaseActionBarActivity
.show();
}
@Override
public void onRelayLongClick(View view, EnteredLoginParam relay, boolean isMain) {
contextMenuRelay = relay;
contextMenuRelayIsMain = isMain;
registerForContextMenu(view);
openContextMenu(view);
unregisterForContextMenu(view);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.relay_item_context, menu);
// Hide delete option if this is the main relay
if (contextMenuRelayIsMain) {
menu.findItem(R.id.menu_delete).setVisible(false);
}
}
@Override
public void onContextMenuClosed(android.view.Menu menu) {
super.onContextMenuClosed(menu);
clearContextMenuState();
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.menu_edit) {
if (contextMenuRelay != null) {
onRelayEdit(contextMenuRelay);
clearContextMenuState();
}
return true;
} else if (itemId == R.id.menu_delete) {
if (contextMenuRelay != null) {
onRelayDelete(contextMenuRelay);
clearContextMenuState();
}
return true;
}
return super.onContextItemSelected(item);
}
private void clearContextMenuState() {
contextMenuRelay = null;
contextMenuRelayIsMain = false;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
@@ -27,6 +27,7 @@ public class RelayListAdapter extends RecyclerView.Adapter<RelayListAdapter.Rela
void onRelayClick(EnteredLoginParam relay);
void onRelayEdit(EnteredLoginParam relay);
void onRelayDelete(EnteredLoginParam relay);
void onRelayLongClick(View view, EnteredLoginParam relay, boolean isMain);
}
public RelayListAdapter(OnRelayClickListener listener) {
@@ -67,16 +68,12 @@ public class RelayListAdapter extends RecyclerView.Adapter<RelayListAdapter.Rela
private final TextView titleText;
private final TextView subtitleText;
private final ImageView mainIndicator;
private final ImageView editButton;
private final ImageView deleteButton;
public RelayViewHolder(@NonNull View itemView) {
super(itemView);
titleText = itemView.findViewById(R.id.title);
subtitleText = itemView.findViewById(R.id.subtitle);
mainIndicator = itemView.findViewById(R.id.main_indicator);
editButton = itemView.findViewById(R.id.edit_button);
deleteButton = itemView.findViewById(R.id.delete_button);
}
public void bind(EnteredLoginParam relay, boolean isMain, OnRelayClickListener listener) {
@@ -84,7 +81,6 @@ public class RelayListAdapter extends RecyclerView.Adapter<RelayListAdapter.Rela
titleText.setText(parts.length == 2? parts[1] : parts[0]);
subtitleText.setText(parts.length == 2? parts[0] : "");
mainIndicator.setVisibility(isMain ? View.VISIBLE : View.INVISIBLE);
deleteButton.setVisibility(isMain ? View.GONE : View.VISIBLE);
itemView.setOnClickListener(v -> {
if (listener != null) {
@@ -92,16 +88,11 @@ public class RelayListAdapter extends RecyclerView.Adapter<RelayListAdapter.Rela
}
});
editButton.setOnClickListener(v -> {
itemView.setOnLongClickListener(v -> {
if (listener != null) {
listener.onRelayEdit(relay);
}
});
deleteButton.setOnClickListener(v -> {
if (listener != null) {
listener.onRelayDelete(relay);
listener.onRelayLongClick(v, relay, isMain);
}
return true;
});
}
}
-26
View File
@@ -59,30 +59,4 @@
</LinearLayout>
<ImageView
android:id="@+id/delete_button"
android:layout_width="48dp"
android:layout_height="72dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:clickable="true"
android:focusable="true"
android:contentDescription="@string/remove_transport"
android:background="@drawable/touch_highlight_background"
android:src="@drawable/ic_delete_white_24dp"
app:tint="?attr/conversation_list_item_date_color" />
<ImageView
android:id="@+id/edit_button"
android:layout_width="48dp"
android:layout_height="72dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:clickable="true"
android:focusable="true"
android:contentDescription="@string/edit_transport"
android:background="@drawable/touch_highlight_background"
android:src="@drawable/ic_create_white_24dp"
app:tint="?attr/conversation_list_item_date_color" />
</LinearLayout>
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_edit"
android:title="@string/edit_transport"/>
<item android:id="@+id/menu_delete"
android:title="@string/remove_transport"/>
</menu>