Move app selector to menu dialog

This commit is contained in:
emanuele-f 2019-10-24 00:58:22 +02:00
parent bb7968c541
commit d20062fb69
5 changed files with 105 additions and 67 deletions

View 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;
}
}

View File

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

View File

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

View File

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

View File

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