From ac7a6e499c652c71d9ffc55485e3ca1d3f11ebf3 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Fri, 2 Dec 2022 00:00:17 +0100 Subject: [PATCH] Add button to reset apps stats Closes #285 --- .../remote_capture/ConnectionsRegister.java | 33 +++++++++---------- .../activities/AppsActivity.java | 1 - .../remote_capture/fragments/AppOverview.java | 2 +- .../fragments/AppsFragment.java | 32 +++++++++++++++++- app/src/main/res/drawable/ic_reset.xml | 5 +++ app/src/main/res/menu/apps_menu.xml | 11 +++++++ app/src/main/res/menu/edit_filter_menu.xml | 1 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 app/src/main/res/drawable/ic_reset.xml create mode 100644 app/src/main/res/menu/apps_menu.xml diff --git a/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java b/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java index 6f6eb08a..c101a524 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java +++ b/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java @@ -141,20 +141,10 @@ public class ConnectionsRegister { int pos = firstPos(); removedItems = new ConnectionDescriptor[out_items]; - // update the apps stats for(int i=0; i 0) { int num_conn = mConnsByIface.get(conn.ifidx); if(--num_conn <= 0) @@ -162,7 +152,6 @@ public class ConnectionsRegister { else mConnsByIface.put(conn.ifidx, num_conn); } - if(conn.isBlacklisted()) mNumMalicious--; } @@ -180,11 +169,7 @@ public class ConnectionsRegister { // update the apps stats int uid = conn.uid; - AppStats stats = mAppsStats.get(uid); - if(stats == null) { - stats = new AppStats(uid); - mAppsStats.put(uid, stats); - } + AppStats stats = getAppsStatsOrCreate(uid); if(conn.ifidx > 0) { int num_conn = mConnsByIface.get(conn.ifidx); @@ -243,7 +228,7 @@ public class ConnectionsRegister { assert(conn.incr_id == id); // update the app stats - AppStats stats = mAppsStats.get(conn.uid); + AppStats stats = getAppsStatsOrCreate(conn.uid); stats.sentBytes += update.sent_bytes - conn.sent_bytes; stats.rcvdBytes += update.rcvd_bytes - conn.rcvd_bytes; @@ -350,6 +335,20 @@ public class ConnectionsRegister { return rv; } + private synchronized AppStats getAppsStatsOrCreate(int uid) { + AppStats stats = mAppsStats.get(uid); + if(stats == null) { + stats = new AppStats(uid); + mAppsStats.put(uid, stats); + } + + return stats; + } + + public synchronized void resetAppsStats() { + mAppsStats.clear(); + } + public synchronized Set getSeenUids() { ArraySet rv = new ArraySet<>(); diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/AppsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/AppsActivity.java index 4b2c4722..c201625d 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/AppsActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/AppsActivity.java @@ -20,7 +20,6 @@ package com.emanuelef.remote_capture.activities; import android.os.Bundle; - import com.emanuelef.remote_capture.R; import com.emanuelef.remote_capture.fragments.AppsFragment; diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppOverview.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppOverview.java index eabda3c1..c973d435 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppOverview.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppOverview.java @@ -224,7 +224,7 @@ public class AppOverview extends Fragment implements MenuProvider { AppStats stats = reg.getAppStats(mUid); if(stats == null) - return; + stats = new AppStats(mUid); mBytes.setText(getString(R.string.rcvd_and_sent, Utils.formatBytes(stats.rcvdBytes), Utils.formatBytes(stats.sentBytes))); mConnections.setText(Utils.formatInteger(ctx, stats.numConnections)); diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsFragment.java index 2f2a19ef..142ca5a3 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/AppsFragment.java @@ -26,6 +26,7 @@ import android.os.Handler; import android.os.Looper; import android.view.ContextMenu; import android.view.LayoutInflater; +import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; @@ -34,7 +35,10 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.core.view.MenuProvider; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; import androidx.preference.PreferenceManager; import com.emanuelef.remote_capture.CaptureService; @@ -52,7 +56,7 @@ import com.emanuelef.remote_capture.model.MatchList; import com.emanuelef.remote_capture.model.Prefs; import com.emanuelef.remote_capture.views.EmptyRecyclerView; -public class AppsFragment extends Fragment implements ConnectionsListener { +public class AppsFragment extends Fragment implements ConnectionsListener, MenuProvider { private EmptyRecyclerView mRecyclerView; private AppsStatsAdapter mAdapter; private static final String TAG = "AppsFragment"; @@ -77,6 +81,7 @@ public class AppsFragment extends Fragment implements ConnectionsListener { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + requireActivity().addMenuProvider(this, getViewLifecycleOwner(), Lifecycle.State.RESUMED); return inflater.inflate(R.layout.apps_stats, container, false); } @@ -117,6 +122,31 @@ public class AppsFragment extends Fragment implements ConnectionsListener { }); } + @Override + public void onCreateMenu(@NonNull Menu menu, MenuInflater menuInflater) { + menuInflater.inflate(R.menu.apps_menu, menu); + } + + @Override + public boolean onMenuItemSelected(@NonNull MenuItem menuItem) { + if(menuItem.getItemId() == R.id.reset) { + new AlertDialog.Builder(requireContext()) + .setMessage(R.string.reset_stats_confirm) + .setPositiveButton(R.string.yes, (dialog, whichButton) -> { + ConnectionsRegister reg = CaptureService.getConnsRegister(); + if(reg != null) { + reg.resetAppsStats(); + doRefreshApps(); + } + }) + .setNegativeButton(R.string.no, (dialog, whichButton) -> {}) + .show(); + + return true; + } + return false; + } + @Override public void onCreateContextMenu(@NonNull ContextMenu menu, @NonNull View v, @Nullable ContextMenu.ContextMenuInfo menuInfo) { diff --git a/app/src/main/res/drawable/ic_reset.xml b/app/src/main/res/drawable/ic_reset.xml new file mode 100644 index 00000000..2f4be83f --- /dev/null +++ b/app/src/main/res/drawable/ic_reset.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/menu/apps_menu.xml b/app/src/main/res/menu/apps_menu.xml new file mode 100644 index 00000000..b4934406 --- /dev/null +++ b/app/src/main/res/menu/apps_menu.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/edit_filter_menu.xml b/app/src/main/res/menu/edit_filter_menu.xml index ff575c62..d807f687 100644 --- a/app/src/main/res/menu/edit_filter_menu.xml +++ b/app/src/main/res/menu/edit_filter_menu.xml @@ -6,5 +6,6 @@ \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 764a047e..63903955 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -423,4 +423,5 @@ These rules specify which connections to allow. Blocklist rules have priority over whitelist rules Add to whitelist Remove from whitelist + Do you really want to reset these stats?