mirror of
https://github.com/emanuele-f/PCAPdroid.git
synced 2026-07-03 21:21:12 +08:00
parent
235920b3cb
commit
ac7a6e499c
@ -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<>();
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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) {
|
||||
|
||||
5
app/src/main/res/drawable/ic_reset.xml
Normal file
5
app/src/main/res/drawable/ic_reset.xml
Normal 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>
|
||||
11
app/src/main/res/menu/apps_menu.xml
Normal file
11
app/src/main/res/menu/apps_menu.xml
Normal 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>
|
||||
@ -6,5 +6,6 @@
|
||||
<item
|
||||
android:id="@+id/reset_changes"
|
||||
android:title="@string/reset"
|
||||
android:icon="@drawable/ic_reset"
|
||||
app:showAsAction="ifRoom" />
|
||||
</menu>
|
||||
@ -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>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user