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/utils/LockedAppAdapter.java

179 lines
5.9 KiB
Java

package name.mikanoshi.customiuizer.utils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import name.mikanoshi.customiuizer.R;
public class LockedAppAdapter extends BaseAdapter implements Filterable {
private final Context ctx;
private final LayoutInflater mInflater;
private final ThreadPoolExecutor pool;
private final ItemFilter mFilter = new ItemFilter();
private final ArrayList<AppData> originalAppList;
private final CopyOnWriteArrayList<AppData> filteredAppList = new CopyOnWriteArrayList<AppData>();
private Object mSecurityManager;
private Method getApplicationAccessControlEnabledAsUser;
@SuppressLint("WrongConstant")
public LockedAppAdapter(Context context, ArrayList<AppData> arr) {
ctx = context;
mInflater = LayoutInflater.from(context);
originalAppList = arr;
filteredAppList.addAll(arr);
int cpuCount = Runtime.getRuntime().availableProcessors();
pool = new ThreadPoolExecutor(cpuCount + 1, cpuCount * 2 + 1, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
try {
mSecurityManager = context.getSystemService("security");
getApplicationAccessControlEnabledAsUser = mSecurityManager.getClass().getDeclaredMethod("getApplicationAccessControlEnabledAsUser", String.class, int.class);
getApplicationAccessControlEnabledAsUser.setAccessible(true);
} catch (Throwable t) {
t.printStackTrace();
}
sortList();
}
private void sortList() {
filteredAppList.sort(new Comparator<AppData>() {
public int compare(AppData app1, AppData app2) {
try {
boolean app1checked = (boolean)getApplicationAccessControlEnabledAsUser.invoke(mSecurityManager, app1.pkgName, app1.user);
boolean app2checked = (boolean)getApplicationAccessControlEnabledAsUser.invoke(mSecurityManager, app2.pkgName, app2.user);
if (app1checked && app2checked)
return 0;
else if (app1checked)
return -1;
else if (app2checked)
return 1;
return 0;
} catch (Throwable t) {
return 0;
}
}
});
}
public boolean isEnabled(int position) {
AppData ad = getItem(position);
return ad == null || !"com.miui.securitycenter".equals(ad.pkgName);
}
public int getCount() {
return filteredAppList.size();
}
public AppData getItem(int position) {
return filteredAppList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
View row;
if (convertView != null)
row = convertView;
else
row = mInflater.inflate(Helpers.is11() ? R.layout.applist_item11 : R.layout.applist_item, parent, false);
ImageView itemIsDis = row.findViewById(R.id.icon_disable);
ImageView itemIsDual = row.findViewById(R.id.icon_dual);
CheckBox itemChecked = row.findViewById(android.R.id.checkbox);
Helpers.setMiuiCheckbox(itemChecked);
TextView itemTitle = row.findViewById(android.R.id.title);
ImageView itemIcon = row.findViewById(android.R.id.icon);
AppData ad = getItem(position);
itemIcon.setTag(position);
itemTitle.setText(ad.label);
itemIsDis.setVisibility(ad.enabled ? View.GONE : View.VISIBLE);
itemIsDual.setVisibility(ad.user != 0 ? View.VISIBLE : View.GONE);
Bitmap icon = Helpers.memoryCache.get(ad.pkgName + "|" + ad.actName);
//int iconSize = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size);
if (icon == null) {
Drawable[] dualIcon = new Drawable[1];
dualIcon[0] = ctx.getResources().getDrawable(R.drawable.card_icon_default, ctx.getTheme());
TransitionDrawable crossfader = new TransitionDrawable(dualIcon);
crossfader.setCrossFadeEnabled(true);
itemIcon.setImageDrawable(crossfader);
(new BitmapCachedLoader(itemIcon, ad, ctx)).executeOnExecutor(pool);
} else {
itemIcon.setImageBitmap(icon);
}
try {
itemChecked.setVisibility(View.VISIBLE);
itemChecked.setChecked((boolean)getApplicationAccessControlEnabledAsUser.invoke(mSecurityManager, ad.pkgName, ad.user));
} catch (Throwable t) {
itemChecked.setVisibility(View.GONE);
}
boolean enabled = !"com.miui.securitycenter".equals(ad.pkgName);
itemIcon.setAlpha(enabled ? 1.0f : 0.5f);
itemTitle.setAlpha(enabled ? 1.0f : 0.5f);
itemChecked.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE);
row.setEnabled(enabled);
return row;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
int count = originalAppList.size();
final ArrayList<AppData> nlist = new ArrayList<AppData>();
AppData filterableData;
for (int i = 0; i < count; i++) {
filterableData = originalAppList.get(i);
if (filterableData.label.toLowerCase().contains(filterString)) nlist.add(filterableData);
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@Override
@SuppressWarnings("unchecked")
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredAppList.clear();
if (results.count > 0 && results.values != null)
filteredAppList.addAll((ArrayList<AppData>)results.values);
sortList();
notifyDataSetChanged();
}
}
@Override
public Filter getFilter() {
return mFilter;
}
}