From d20062fb69a37e492038f1ac85de8ccbd3335dd0 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Thu, 24 Oct 2019 00:58:22 +0200 Subject: [PATCH] Move app selector to menu dialog --- .../emanuelef/remote_capture/AppsView.java | 63 +++++++++++++ .../remote_capture/MainActivity.java | 94 +++++++------------ app/src/main/res/layout/activity_main.xml | 5 - app/src/main/res/menu/settings_menu.xml | 8 ++ app/src/main/res/values/strings.xml | 2 + 5 files changed, 105 insertions(+), 67 deletions(-) create mode 100644 app/src/main/java/com/emanuelef/remote_capture/AppsView.java diff --git a/app/src/main/java/com/emanuelef/remote_capture/AppsView.java b/app/src/main/java/com/emanuelef/remote_capture/AppsView.java new file mode 100644 index 00000000..b7c1d594 --- /dev/null +++ b/app/src/main/java/com/emanuelef/remote_capture/AppsView.java @@ -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 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 getInstalledApps() { + PackageManager pm = getContext().getPackageManager(); + List apps = new ArrayList<>(); + List 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; + } +} diff --git a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java index 4be6acbf..7634f33c 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java @@ -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 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 getInstalledApps() { - List apps = new ArrayList<>(); - List 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; - } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0d103842..36f4b2d3 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -13,9 +13,4 @@ android:layout_height="wrap_content" android:text="@string/start_button" /> - - \ No newline at end of file diff --git a/app/src/main/res/menu/settings_menu.xml b/app/src/main/res/menu/settings_menu.xml index 83588825..8a5cecfb 100644 --- a/app/src/main/res/menu/settings_menu.xml +++ b/app/src/main/res/menu/settings_menu.xml @@ -2,6 +2,14 @@ + + Start Stop Settings + No Filter 127.0.0.1 @@ -12,4 +13,5 @@ Remote Collector IP Address Port + App Filter