mirror of
https://github.com/emanuele-f/PCAPdroid.git
synced 2026-06-16 21:10:57 +08:00
Move app selector to menu dialog
This commit is contained in:
parent
bb7968c541
commit
d20062fb69
63
app/src/main/java/com/emanuelef/remote_capture/AppsView.java
Normal file
63
app/src/main/java/com/emanuelef/remote_capture/AppsView.java
Normal file
@ -0,0 +1,63 @@
|
||||
package com.emanuelef.remote_capture;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
// TODO add searchbar
|
||||
// https://stackoverflow.com/questions/31085086/how-to-implement-floating-searchwidget-android
|
||||
|
||||
class AppsView extends ListView {
|
||||
public interface OnSelectedAppListener {
|
||||
void onSelectedApp(AppDescriptor app);
|
||||
}
|
||||
|
||||
public AppsView(Context context) {
|
||||
super(context);
|
||||
|
||||
List<AppDescriptor> installedApps = getInstalledApps();
|
||||
AppAdapter installedAppAdapter = new AppAdapter(getContext(), installedApps);
|
||||
|
||||
setAdapter(installedAppAdapter);
|
||||
}
|
||||
|
||||
public void setSelectedAppListener(final OnSelectedAppListener listener) {
|
||||
setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
||||
AppDescriptor app = ((AppDescriptor) getAdapter().getItem(i));
|
||||
listener.onSelectedApp(app);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private List<AppDescriptor> getInstalledApps() {
|
||||
PackageManager pm = getContext().getPackageManager();
|
||||
List<AppDescriptor> apps = new ArrayList<>();
|
||||
List<PackageInfo> packs = pm.getInstalledPackages(0);
|
||||
|
||||
// Add the "No Filter" app
|
||||
apps.add(new AppDescriptor("", getResources().getDrawable(android.R.drawable.ic_menu_view), getResources().getString(R.string.no_filter), -1));
|
||||
|
||||
for (int i = 0; i < packs.size(); i++) {
|
||||
PackageInfo p = packs.get(i);
|
||||
|
||||
if((p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
|
||||
String appName = p.applicationInfo.loadLabel(pm).toString();
|
||||
Drawable icon = p.applicationInfo.loadIcon(pm);
|
||||
String packages = p.applicationInfo.packageName;
|
||||
int uid = p.applicationInfo.uid;
|
||||
apps.add(new AppDescriptor(appName, icon, packages, uid));
|
||||
}
|
||||
}
|
||||
return apps;
|
||||
}
|
||||
}
|
||||
@ -19,14 +19,11 @@
|
||||
|
||||
package com.emanuelef.remote_capture;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.VpnService;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
@ -36,21 +33,15 @@ import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.Button;
|
||||
import android.widget.ListView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import cat.ereza.customactivityoncrash.config.CaocConfig;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
ListView mAppList;
|
||||
Button mStartButton;
|
||||
View mSelectedApp;
|
||||
int mFilterUid;
|
||||
SharedPreferences mPrefs;
|
||||
Menu mMenu;
|
||||
int mFilterUid;
|
||||
|
||||
private static final int REQUECT_CODE_VPN = 2;
|
||||
|
||||
@ -68,6 +59,8 @@ public class MainActivity extends AppCompatActivity {
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
mFilterUid = -1;
|
||||
|
||||
CaocConfig.Builder.create()
|
||||
.errorDrawable(R.drawable.ic_app_crash)
|
||||
.apply();
|
||||
@ -75,39 +68,8 @@ public class MainActivity extends AppCompatActivity {
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
mFilterUid = -1;
|
||||
|
||||
mAppList = findViewById(R.id.installed_app_list);
|
||||
mStartButton = findViewById(R.id.button_start);
|
||||
|
||||
List<AppDescriptor> installedApps = getInstalledApps();
|
||||
AppAdapter installedAppAdapter = new AppAdapter(MainActivity.this, installedApps);
|
||||
//mAppList.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
|
||||
mAppList.setAdapter(installedAppAdapter);
|
||||
mAppList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
||||
if(CaptureService.isRunning())
|
||||
return;
|
||||
|
||||
if(mSelectedApp == view) {
|
||||
// Deselect
|
||||
mSelectedApp = null;
|
||||
mFilterUid = -1;
|
||||
view.setBackgroundColor(Color.TRANSPARENT);
|
||||
} else {
|
||||
if(mSelectedApp != null)
|
||||
mSelectedApp.setBackgroundColor(Color.TRANSPARENT);
|
||||
|
||||
view.setBackgroundColor(Color.LTGRAY);
|
||||
mSelectedApp = view;
|
||||
mFilterUid = ((AppDescriptor) mAppList.getAdapter().getItem(i)).getUid();
|
||||
}
|
||||
|
||||
Log.w("Main", "App filter: " + mFilterUid);
|
||||
}
|
||||
});
|
||||
|
||||
updateConnectStatus(CaptureService.isRunning());
|
||||
|
||||
mStartButton.setOnClickListener(new View.OnClickListener() {
|
||||
@ -135,9 +97,32 @@ public class MainActivity extends AppCompatActivity {
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
MenuInflater menuInflater = getMenuInflater();
|
||||
menuInflater.inflate(R.menu.settings_menu, menu);
|
||||
mMenu = menu;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void openAppSelector() {
|
||||
AppsView apps = new AppsView(this);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle(R.string.app_filter);
|
||||
builder.setView(apps);
|
||||
|
||||
final AlertDialog alert = builder.create();
|
||||
|
||||
apps.setSelectedAppListener(new AppsView.OnSelectedAppListener() {
|
||||
@Override
|
||||
public void onSelectedApp(AppDescriptor app) {
|
||||
mFilterUid = app.getUid();
|
||||
mMenu.getItem(0).setIcon(app.getIcon());
|
||||
|
||||
// dismiss the dialog
|
||||
alert.cancel();
|
||||
}
|
||||
});
|
||||
|
||||
alert.show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
@ -145,6 +130,9 @@ public class MainActivity extends AppCompatActivity {
|
||||
Intent intent = new Intent(MainActivity.this, SettingsActivity.class);
|
||||
startActivity(intent);
|
||||
return true;
|
||||
} else if(id == R.id.action_show_app_filter) {
|
||||
openAppSelector();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
@ -169,22 +157,4 @@ public class MainActivity extends AppCompatActivity {
|
||||
startService(intent);
|
||||
}
|
||||
}
|
||||
|
||||
private List<AppDescriptor> getInstalledApps() {
|
||||
List<AppDescriptor> apps = new ArrayList<>();
|
||||
List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
|
||||
|
||||
for (int i = 0; i < packs.size(); i++) {
|
||||
PackageInfo p = packs.get(i);
|
||||
|
||||
if((p.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
|
||||
String appName = p.applicationInfo.loadLabel(getPackageManager()).toString();
|
||||
Drawable icon = p.applicationInfo.loadIcon(getPackageManager());
|
||||
String packages = p.applicationInfo.packageName;
|
||||
int uid = p.applicationInfo.uid;
|
||||
apps.add(new AppDescriptor(appName, icon, packages, uid));
|
||||
}
|
||||
}
|
||||
return apps;
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,9 +13,4 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/start_button" />
|
||||
|
||||
<ListView
|
||||
android:id="@+id/installed_app_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
</LinearLayout>
|
||||
@ -2,6 +2,14 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<item
|
||||
android:id="@+id/action_show_app_filter"
|
||||
android:title="@string/app_filter"
|
||||
android:orderInCategory="100"
|
||||
android:icon="@android:drawable/ic_menu_view"
|
||||
app:showAsAction="always"
|
||||
/>
|
||||
|
||||
<item
|
||||
android:id="@+id/action_settings"
|
||||
android:title="@string/title_activity_settings"
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
<string name="start_button">Start</string>
|
||||
<string name="stop_button">Stop</string>
|
||||
<string name="title_activity_settings">Settings</string>
|
||||
<string name="no_filter">No Filter</string>
|
||||
|
||||
<!-- Defaults -->
|
||||
<string name="default_collector_ip">127.0.0.1</string>
|
||||
@ -12,4 +13,5 @@
|
||||
<string name="collector_prefs_header">Remote Collector</string>
|
||||
<string name="ip_address">IP Address</string>
|
||||
<string name="port">Port</string>
|
||||
<string name="app_filter">App Filter</string>
|
||||
</resources>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user