Add button to reset apps stats

Closes #285
This commit is contained in:
emanuele-f 2022-12-02 00:00:17 +01:00
parent 235920b3cb
commit ac7a6e499c
8 changed files with 66 additions and 20 deletions

View File

@ -141,20 +141,10 @@ public class ConnectionsRegister {
int pos = firstPos();
removedItems = new ConnectionDescriptor[out_items];
// update the apps stats
for(int i=0; i<out_items; i++) {
ConnectionDescriptor conn = mItemsRing[pos];
if(conn != null) {
int uid = conn.uid;
AppStats stats = mAppsStats.get(uid);
assert stats != null;
stats.sentBytes -= conn.sent_bytes;
stats.rcvdBytes -= conn.rcvd_bytes;
if(--stats.numConnections <= 0)
mAppsStats.remove(uid);
if(conn.ifidx > 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<Integer> getSeenUids() {
ArraySet<Integer> rv = new ArraySet<>();

View File

@ -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;

View File

@ -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));

View File

@ -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) {

View File

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="?attr/colorControlNormal" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12.5,8c-2.65,0 -5.05,0.99 -6.9,2.6L2,7v9h9l-3.62,-3.62c1.39,-1.16 3.16,-1.88 5.12,-1.88 3.54,0 6.55,2.31 7.6,5.5l2.37,-0.78C21.08,11.03 17.15,8 12.5,8z"/>
</vector>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/reset"
android:title="@string/reset"
android:icon="@drawable/ic_reset"
app:showAsAction="ifRoom" />
</menu>

View File

@ -6,5 +6,6 @@
<item
android:id="@+id/reset_changes"
android:title="@string/reset"
android:icon="@drawable/ic_reset"
app:showAsAction="ifRoom" />
</menu>

View File

@ -423,4 +423,5 @@
<string name="firewall_whitelist_help">These rules specify which connections to allow. Blocklist rules have priority over whitelist rules</string>
<string name="add_to_whitelist">Add to whitelist</string>
<string name="remove_from_whitelist">Remove from whitelist</string>
<string name="reset_stats_confirm">Do you really want to reset these stats?</string>
</resources>