You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CustoMIUIzer/app/src/main/java/name/mikanoshi/customiuizer/subs/AppSelector.java

264 lines
12 KiB
Java

package name.mikanoshi.customiuizer.subs;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
import java.lang.reflect.Method;
import java.util.LinkedHashSet;
import java.util.Set;
import name.mikanoshi.customiuizer.R;
import name.mikanoshi.customiuizer.SharedPrefsProvider;
import name.mikanoshi.customiuizer.SubFragmentWithSearch;
import name.mikanoshi.customiuizer.utils.AppData;
import name.mikanoshi.customiuizer.utils.AppDataAdapter;
import name.mikanoshi.customiuizer.utils.Helpers;
import name.mikanoshi.customiuizer.utils.Helpers.MimeType;
import name.mikanoshi.customiuizer.utils.LockedAppAdapter;
import name.mikanoshi.customiuizer.utils.PrivacyAppAdapter;
public class AppSelector extends SubFragmentWithSearch {
boolean initialized = false;
boolean standalone = false;
boolean multi = false;
boolean bwlist = false;
boolean privacy = false;
boolean applock = false;
boolean customTitles = false;
boolean share = false;
boolean openwith = false;
boolean activity = false;
String key = null;
Runnable process = null;
@Override
public void onCreate(Bundle savedInstanceState) {
this.padded = false;
super.onCreate(savedInstanceState);
standalone = getArguments().getBoolean("standalone");
multi = getArguments().getBoolean("multi");
bwlist = getArguments().getBoolean("bw");
privacy = getArguments().getBoolean("privacy");
applock = getArguments().getBoolean("applock");
customTitles = getArguments().getBoolean("custom_titles");
share = getArguments().getBoolean("share");
openwith = getArguments().getBoolean("openwith");
activity = getArguments().getBoolean("activity");
key = getArguments().getString("key");
process = new Runnable() {
@Override
public void run() {
Context context = getValidContext();
if (context == null || !AppSelector.this.isAdded()) return;
if (multi && key != null) {
if (openwith) {
if (Helpers.openWithAppsList == null) return;
listView.setAdapter(new AppDataAdapter(context, Helpers.openWithAppsList, Helpers.AppAdapterType.Mutli, key));
} else if (share) {
if (Helpers.shareAppsList == null) return;
listView.setAdapter(new AppDataAdapter(context, Helpers.shareAppsList, Helpers.AppAdapterType.Mutli, key));
} else {
if (Helpers.installedAppsList == null) return;
listView.setAdapter(new AppDataAdapter(context, Helpers.installedAppsList, Helpers.AppAdapterType.Mutli, key, bwlist));
}
} else if (privacy) {
if (Helpers.installedAppsList == null) return;
listView.setAdapter(new PrivacyAppAdapter(context, Helpers.installedAppsList));
} else if (applock) {
if (Helpers.installedAppsList == null) return;
listView.setAdapter(new LockedAppAdapter(context, Helpers.installedAppsList));
} else if (customTitles) {
if (Helpers.launchableAppsList == null) return;
listView.setAdapter(new AppDataAdapter(context, Helpers.launchableAppsList, Helpers.AppAdapterType.CustomTitles, key));
} else if (standalone && key != null) {
if (Helpers.launchableAppsList == null) return;
listView.setAdapter(new AppDataAdapter(context, Helpers.launchableAppsList, Helpers.AppAdapterType.Standalone, key));
} else if (activity) {
if (Helpers.installedAppsList == null) return;
listView.setAdapter(new AppDataAdapter(context, Helpers.installedAppsList, Helpers.AppAdapterType.Default, key));
} else {
if (Helpers.launchableAppsList == null) return;
listView.setAdapter(new AppDataAdapter(context, Helpers.launchableAppsList));
}
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (multi && key != null) {
AppData app = (AppData)parent.getAdapter().getItem(position);
Set<String> selectedApps = new LinkedHashSet<String>(Helpers.prefs.getStringSet(key, new LinkedHashSet<String>()));
if (bwlist) {
Set<String> selectedAppsBlack = new LinkedHashSet<String>(Helpers.prefs.getStringSet(key + "_black", new LinkedHashSet<String>()));
if (selectedApps.contains(app.pkgName)) {
selectedApps.remove(app.pkgName);
selectedAppsBlack.add(app.pkgName);
} else if (selectedAppsBlack.contains(app.pkgName)) {
selectedApps.remove(app.pkgName);
selectedAppsBlack.remove(app.pkgName);
} else {
selectedApps.add(app.pkgName);
selectedAppsBlack.remove(app.pkgName);
}
Helpers.prefs.edit().putStringSet(key + "_black", selectedAppsBlack).apply();
} else if (selectedApps.contains(share || openwith ? app.pkgName + "|" + app.user : app.pkgName)) {
selectedApps.remove(share || openwith ? app.pkgName + "|" + app.user : app.pkgName);
} else {
selectedApps.add(share || openwith ? app.pkgName + "|" + app.user : app.pkgName);
if (openwith) {
String mimeKey = key + "_" + app.pkgName + "|" + app.user;
int mimeFlags = Helpers.prefs.getInt(mimeKey, MimeType.ALL);
final boolean[] checkedTypes = new boolean[] {
(mimeFlags & MimeType.IMAGE) == MimeType.IMAGE,
(mimeFlags & MimeType.AUDIO) == MimeType.AUDIO,
(mimeFlags & MimeType.VIDEO) == MimeType.VIDEO,
(mimeFlags & MimeType.DOCUMENT) == MimeType.DOCUMENT,
(mimeFlags & MimeType.ARCHIVE) == MimeType.ARCHIVE,
(mimeFlags & MimeType.LINK) == MimeType.LINK,
(mimeFlags & MimeType.OTHERS) == MimeType.OTHERS,
};
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.system_cleanopenwith_datatype);
builder.setMultiChoiceItems(R.array.mimetypes, checkedTypes, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
checkedTypes[which] = isChecked;
}
});
builder.setCancelable(true);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int sum = 0;
int order = 0;
for (boolean checkedType: checkedTypes) {
if (checkedType) sum += Math.pow(2, order);
order++;
}
Helpers.prefs.edit().putInt(mimeKey, sum).apply();
}
});
builder.show();
}
}
Helpers.prefs.edit().putStringSet(key, selectedApps).apply();
((AppDataAdapter)parent.getAdapter()).updateSelectedApps();
} else if (activity) {
AppData app = (AppData)parent.getAdapter().getItem(position);
final Bundle args = new Bundle();
args.putString("key", key);
args.putString("package", app.pkgName);
args.putInt("user", app.user);
ActivitySelector activitySelect = new ActivitySelector();
activitySelect.setTargetFragment(AppSelector.this, getTargetRequestCode());
openSubFragment(activitySelect, args, Helpers.SettingsType.Edit, Helpers.ActionBarType.HomeUp, R.string.select_activity, R.layout.prefs_app_selector);
} else if (privacy) {
AppData app = (AppData)parent.getAdapter().getItem(position);
try {
@SuppressLint("WrongConstant") Object mSecurityManager = getActivity().getSystemService("security");
Method isPrivacyApp = mSecurityManager.getClass().getDeclaredMethod("isPrivacyApp", String.class, int.class);
isPrivacyApp.setAccessible(true);
Method setPrivacyApp = mSecurityManager.getClass().getDeclaredMethod("setPrivacyApp", String.class, int.class, boolean.class);
setPrivacyApp.setAccessible(true);
setPrivacyApp.invoke(mSecurityManager, app.pkgName, app.user, !(boolean)isPrivacyApp.invoke(mSecurityManager, app.pkgName, app.user));
PrivacyAppAdapter adapter = (PrivacyAppAdapter)parent.getAdapter();
adapter.notifyDataSetChanged();
getActivity().getContentResolver().notifyChange(Uri.parse("content://com.miui.securitycenter.provider/update_privacyapps_icon"), null);
} catch (Throwable t) {
t.printStackTrace();
}
} else if (applock) {
AppData app = (AppData)parent.getAdapter().getItem(position);
try {
@SuppressLint("WrongConstant") Object mSecurityManager = getActivity().getSystemService("security");
Method getApplicationAccessControlEnabledAsUser = mSecurityManager.getClass().getDeclaredMethod("getApplicationAccessControlEnabledAsUser", String.class, int.class);
getApplicationAccessControlEnabledAsUser.setAccessible(true);
Method setApplicationAccessControlEnabledForUser = mSecurityManager.getClass().getDeclaredMethod("setApplicationAccessControlEnabledForUser", String.class, boolean.class, int.class);
setApplicationAccessControlEnabledForUser.setAccessible(true);
setApplicationAccessControlEnabledForUser.invoke(mSecurityManager, app.pkgName, !(boolean)getApplicationAccessControlEnabledAsUser.invoke(mSecurityManager, app.pkgName, app.user), app.user);
LockedAppAdapter adapter = (LockedAppAdapter)parent.getAdapter();
adapter.notifyDataSetChanged();
} catch (Throwable t) {
t.printStackTrace();
}
} else if (customTitles) {
AppData app = (AppData)parent.getAdapter().getItem(position);
Helpers.showInputDialog(getActivity(), key + ":" + app.pkgName + "|" + app.actName + "|" + app.user, R.string.launcher_renameapps_modified, new Helpers.InputCallback() {
@Override
public void onInputFinished(String key, String text){
if (TextUtils.isEmpty(text))
Helpers.prefs.edit().remove(key).apply();
else
Helpers.prefs.edit().putString(key, text).apply();
((AppDataAdapter)parent.getAdapter()).notifyDataSetChanged();
getActivity().getContentResolver().notifyChange(Uri.parse("content://" + SharedPrefsProvider.AUTHORITY + "/pref/string/" + key), null);
}
});
} else {
final Intent intent = new Intent(getActivity(), this.getClass());
AppData app = (AppData)parent.getAdapter().getItem(position);
if (app.pkgName.equals("") && app.actName.equals(""))
intent.putExtra("app", "");
else
intent.putExtra("app", app.pkgName + "|" + app.actName);
intent.putExtra("user", app.user);
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, intent);
finish();
}
}
});
if (getView() != null) getView().findViewById(R.id.am_progressBar).setVisibility(View.GONE);
}
};
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final Activity act = getActivity();
if (initialized) process.run(); else
new Thread() {
@Override
public void run() {
try { sleep(animDur); } catch (Throwable e) {}
if (act != null) try {
if (activity || privacy || applock || (multi && key != null)) {
if (openwith) {
if (Helpers.openWithAppsList == null) Helpers.getOpenWithApps(act);
} else if (share) {
if (Helpers.shareAppsList == null) Helpers.getShareApps(act);
} else {
if (Helpers.installedAppsList == null) Helpers.getInstalledApps(act);
}
} else {
if (Helpers.launchableAppsList == null) Helpers.getLaunchableApps(act);
}
initialized = true;
act.runOnUiThread(process);
} catch (Throwable e) {
e.printStackTrace();
}
}
}.start();
}
@Override
public void onActivityResult(int requestCode, int resultCode, final Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode == getTargetRequestCode()) {
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, data);
finish();
}
super.onActivityResult(requestCode, resultCode, data);
}
}