Fix context menu action applied to wrong item

When connections rollover occurred (after 8192 connections seen), a
context menu action could be applied to a wrong item if a new connection
appeared before the user selected an action from the context menu

Fixes #237
This commit is contained in:
emanuele-f 2022-07-22 11:25:03 +02:00
parent 11e860a988
commit 965077218c
4 changed files with 19 additions and 14 deletions

View File

@ -54,7 +54,7 @@ public class AppsStatsAdapter extends RecyclerView.Adapter<AppsStatsAdapter.View
private View.OnClickListener mListener;
private List<AppStats> mStats;
private final AppsResolver mApps;
private int mClickedPosition;
private AppStats mSelectedItem;
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView icon;
@ -131,7 +131,7 @@ public class AppsStatsAdapter extends RecyclerView.Adapter<AppsStatsAdapter.View
view.setOnLongClickListener(v -> {
// see registerForContextMenu
mClickedPosition = holder.getAbsoluteAdapterPosition();
mSelectedItem = getItem(holder.getAbsoluteAdapterPosition());
return false;
});
}
@ -160,8 +160,14 @@ public class AppsStatsAdapter extends RecyclerView.Adapter<AppsStatsAdapter.View
return mStats.get(pos);
}
public int getClickedItemPos() {
return mClickedPosition;
public AppStats getSelectedItem() {
return mSelectedItem;
}
public void notifyItemChanged(AppStats app) {
int pos = mStats.indexOf(app);
if(pos >= 0)
notifyItemChanged(pos);
}
public String getItemPackage(int pos) {

View File

@ -60,7 +60,7 @@ public class ConnectionsAdapter extends RecyclerView.Adapter<ConnectionsAdapter.
private View.OnClickListener mListener;
private final AppsResolver mApps;
private final Context mContext;
private int mClickedPosition;
private ConnectionDescriptor mSelectedItem;
private int mNumRemovedItems;
// maps a connection ID to a position in mFilteredConn. Positions are shifted by mNumRemovedItems
@ -201,7 +201,7 @@ public class ConnectionsAdapter extends RecyclerView.Adapter<ConnectionsAdapter.
view.setOnLongClickListener(v -> {
// see registerForContextMenu
mClickedPosition = holder.getAbsoluteAdapterPosition();
mSelectedItem = getItem(holder.getAbsoluteAdapterPosition());
return false;
});
@ -431,8 +431,8 @@ public class ConnectionsAdapter extends RecyclerView.Adapter<ConnectionsAdapter.
mListener = listener;
}
public ConnectionDescriptor getClickedItem() {
return getItem(mClickedPosition);
public ConnectionDescriptor getSelectedItem() {
return mSelectedItem;
}
public boolean hasFilter() {

View File

@ -146,7 +146,7 @@ public class AppsFragment extends Fragment implements ConnectionsListener {
MenuInflater inflater = requireActivity().getMenuInflater();
inflater.inflate(R.menu.app_context_menu, menu);
AppStats stats = mAdapter.getItem(mAdapter.getClickedItemPos());
AppStats stats = mAdapter.getSelectedItem();
if(stats == null)
return;
@ -166,8 +166,7 @@ public class AppsFragment extends Fragment implements ConnectionsListener {
public boolean onContextItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
Blocklist blocklist = PCAPdroid.getInstance().getBlocklist();
int itemPos = mAdapter.getClickedItemPos();
AppStats app = mAdapter.getItem(itemPos);
AppStats app = mAdapter.getSelectedItem();
if(id == R.id.block_app)
blocklist.addApp(app.getUid());
@ -187,7 +186,7 @@ public class AppsFragment extends Fragment implements ConnectionsListener {
CaptureService.requireInstance().reloadBlocklist();
// refresh the item
mAdapter.notifyItemChanged(itemPos);
mAdapter.notifyItemChanged(app);
return true;
}

View File

@ -304,7 +304,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener
inflater.inflate(R.menu.connection_context_menu, menu);
int max_length = 32;
ConnectionDescriptor conn = mAdapter.getClickedItem();
ConnectionDescriptor conn = mAdapter.getSelectedItem();
if(conn == null)
return;
@ -455,7 +455,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
Context ctx = requireContext();
ConnectionDescriptor conn = mAdapter.getClickedItem();
ConnectionDescriptor conn = mAdapter.getSelectedItem();
MatchList whitelist = PCAPdroid.getInstance().getMalwareWhitelist();
Blocklist blocklist = PCAPdroid.getInstance().getBlocklist();
boolean mask_changed = false;