mirror of
https://github.com/schwabe/ics-openvpn.git
synced 2024-09-20 12:02:28 +02:00
Autoconvert file to kotlin
This commit is contained in:
parent
683b2e9210
commit
9be4d661d3
@ -1,355 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2016 Arne Schwabe
|
||||
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
|
||||
*/
|
||||
|
||||
package de.blinkt.openvpn.fragments;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.app.Fragment;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.BaseAdapter;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.Filter;
|
||||
import android.widget.Filterable;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ListView;
|
||||
import android.widget.SearchView;
|
||||
import android.widget.Switch;
|
||||
import android.widget.TextView;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Vector;
|
||||
|
||||
import de.blinkt.openvpn.R;
|
||||
import de.blinkt.openvpn.VpnProfile;
|
||||
import de.blinkt.openvpn.core.ProfileManager;
|
||||
|
||||
/**
|
||||
* Created by arne on 16.11.14.
|
||||
*/
|
||||
public class Settings_Allowed_Apps extends Fragment implements AdapterView.OnItemClickListener, CompoundButton.OnCheckedChangeListener, View.OnClickListener {
|
||||
private ListView mListView;
|
||||
private VpnProfile mProfile;
|
||||
private TextView mDefaultAllowTextView;
|
||||
private TextView mAllowBypassTextView;
|
||||
private PackageAdapter mListAdapter;
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
AppViewHolder avh = (AppViewHolder) view.getTag();
|
||||
avh.checkBox.toggle();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
String packageName = (String) buttonView.getTag();
|
||||
if (isChecked) {
|
||||
Log.d("openvpn", "adding to allowed apps" + packageName);
|
||||
mProfile.mAllowedAppsVpn.add(packageName);
|
||||
} else {
|
||||
Log.d("openvpn", "removing from allowed apps" + packageName);
|
||||
mProfile.mAllowedAppsVpn.remove(packageName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
changeDisallowText(mProfile.mAllowedAppsVpnAreDisallowed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
String profileUuid = getArguments().getString(getActivity().getPackageName() + ".profileUUID");
|
||||
mProfile = ProfileManager.get(getActivity(), profileUuid);
|
||||
getActivity().setTitle(getString(R.string.edit_profile_title, mProfile.getName()));
|
||||
setHasOptionsMenu(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
inflater.inflate(R.menu.allowed_apps, menu);
|
||||
|
||||
SearchView searchView = (SearchView) menu.findItem(R.id.app_search_widget).getActionView();
|
||||
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
|
||||
@Override
|
||||
public boolean onQueryTextSubmit(String query) {
|
||||
mListView.setFilterText(query);
|
||||
mListView.setTextFilterEnabled(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onQueryTextChange(String newText) {
|
||||
mListView.setFilterText(newText);
|
||||
if (TextUtils.isEmpty(newText))
|
||||
mListView.setTextFilterEnabled(false);
|
||||
else
|
||||
mListView.setTextFilterEnabled(true);
|
||||
|
||||
return true;
|
||||
}
|
||||
});
|
||||
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
|
||||
@Override
|
||||
public boolean onClose() {
|
||||
mListView.clearTextFilter();
|
||||
mListAdapter.getFilter().filter("");
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
}
|
||||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
View v = inflater.inflate(R.layout.allowed_vpn_apps, container, false);
|
||||
|
||||
mDefaultAllowTextView = (TextView) v.findViewById(R.id.default_allow_text);
|
||||
|
||||
Switch vpnOnDefaultSwitch = (Switch) v.findViewById(R.id.default_allow);
|
||||
|
||||
vpnOnDefaultSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
|
||||
changeDisallowText(isChecked);
|
||||
mProfile.mAllowedAppsVpnAreDisallowed = isChecked;
|
||||
}
|
||||
});
|
||||
|
||||
vpnOnDefaultSwitch.setChecked(mProfile.mAllowedAppsVpnAreDisallowed);
|
||||
|
||||
Switch vpnAllowBypassSwitch = (Switch) v.findViewById(R.id.allow_bypass);
|
||||
|
||||
vpnAllowBypassSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
mProfile.mAllowAppVpnBypass = isChecked;
|
||||
}
|
||||
});
|
||||
|
||||
vpnAllowBypassSwitch.setChecked(mProfile.mAllowAppVpnBypass);
|
||||
|
||||
mListView = (ListView) v.findViewById(android.R.id.list);
|
||||
|
||||
mListAdapter = new PackageAdapter(getActivity(), mProfile);
|
||||
mListView.setAdapter(mListAdapter);
|
||||
mListView.setOnItemClickListener(this);
|
||||
|
||||
mListView.setEmptyView(v.findViewById(R.id.loading_container));
|
||||
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mListAdapter.populateList(getActivity());
|
||||
}
|
||||
}).start();
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
private void changeDisallowText(boolean selectedAreDisallowed) {
|
||||
if (selectedAreDisallowed)
|
||||
mDefaultAllowTextView.setText(R.string.vpn_disallow_radio);
|
||||
else
|
||||
mDefaultAllowTextView.setText(R.string.vpn_allow_radio);
|
||||
}
|
||||
|
||||
static class AppViewHolder {
|
||||
public ApplicationInfo mInfo;
|
||||
public View rootView;
|
||||
public TextView appName;
|
||||
public ImageView appIcon;
|
||||
//public TextView appSize;
|
||||
//public TextView disabled;
|
||||
public CompoundButton checkBox;
|
||||
|
||||
static public AppViewHolder createOrRecycle(LayoutInflater inflater, View convertView, ViewGroup parent) {
|
||||
if (convertView == null) {
|
||||
convertView = inflater.inflate(R.layout.allowed_application_layout, parent, false);
|
||||
|
||||
// Creates a ViewHolder and store references to the two children views
|
||||
// we want to bind data to.
|
||||
AppViewHolder holder = new AppViewHolder();
|
||||
holder.rootView = convertView;
|
||||
holder.appName = (TextView) convertView.findViewById(R.id.app_name);
|
||||
holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
|
||||
//holder.appSize = (TextView) convertView.findViewById(R.id.app_size);
|
||||
//holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled);
|
||||
holder.checkBox = (CompoundButton) convertView.findViewById(R.id.app_selected);
|
||||
convertView.setTag(holder);
|
||||
|
||||
|
||||
return holder;
|
||||
} else {
|
||||
// Get the ViewHolder back to get fast access to the TextView
|
||||
// and the ImageView.
|
||||
return (AppViewHolder) convertView.getTag();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class PackageAdapter extends BaseAdapter implements Filterable {
|
||||
private final LayoutInflater mInflater;
|
||||
private final PackageManager mPm;
|
||||
private Vector<ApplicationInfo> mPackages;
|
||||
private ItemFilter mFilter = new ItemFilter();
|
||||
private Vector<ApplicationInfo> mFilteredData;
|
||||
|
||||
|
||||
PackageAdapter(Context c, VpnProfile vp) {
|
||||
mPm = c.getPackageManager();
|
||||
mProfile = vp;
|
||||
mInflater = LayoutInflater.from(c);
|
||||
|
||||
mPackages = new Vector<>();
|
||||
mFilteredData = mPackages;
|
||||
}
|
||||
|
||||
private void populateList(Activity c) {
|
||||
List<ApplicationInfo> installedPackages = mPm.getInstalledApplications(PackageManager.GET_META_DATA);
|
||||
|
||||
// Remove apps not using Internet
|
||||
|
||||
int androidSystemUid = 0;
|
||||
ApplicationInfo system = null;
|
||||
Vector<ApplicationInfo> apps = new Vector<ApplicationInfo>();
|
||||
|
||||
try {
|
||||
system = mPm.getApplicationInfo("android", PackageManager.GET_META_DATA);
|
||||
androidSystemUid = system.uid;
|
||||
apps.add(system);
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
}
|
||||
|
||||
|
||||
for (ApplicationInfo app : installedPackages) {
|
||||
|
||||
if (mPm.checkPermission(Manifest.permission.INTERNET, app.packageName) == PackageManager.PERMISSION_GRANTED &&
|
||||
app.uid != androidSystemUid) {
|
||||
|
||||
apps.add(app);
|
||||
}
|
||||
}
|
||||
|
||||
Collections.sort(apps, new ApplicationInfo.DisplayNameComparator(mPm));
|
||||
mPackages = apps;
|
||||
mFilteredData = apps;
|
||||
c.runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return mFilteredData.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getItem(int position) {
|
||||
return mFilteredData.get(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return mFilteredData.get(position).packageName.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public View getView(int position, View convertView, ViewGroup parent) {
|
||||
AppViewHolder viewHolder = AppViewHolder.createOrRecycle(mInflater, convertView, parent);
|
||||
convertView = viewHolder.rootView;
|
||||
viewHolder.mInfo = mFilteredData.get(position);
|
||||
final ApplicationInfo mInfo = mFilteredData.get(position);
|
||||
|
||||
|
||||
CharSequence appName = mInfo.loadLabel(mPm);
|
||||
|
||||
if (TextUtils.isEmpty(appName))
|
||||
appName = mInfo.packageName;
|
||||
viewHolder.appName.setText(appName);
|
||||
viewHolder.appIcon.setImageDrawable(mInfo.loadIcon(mPm));
|
||||
viewHolder.checkBox.setTag(mInfo.packageName);
|
||||
viewHolder.checkBox.setOnCheckedChangeListener(Settings_Allowed_Apps.this);
|
||||
|
||||
|
||||
viewHolder.checkBox.setChecked(mProfile.mAllowedAppsVpn.contains(mInfo.packageName));
|
||||
return viewHolder.rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Filter getFilter() {
|
||||
return mFilter;
|
||||
}
|
||||
|
||||
private class ItemFilter extends Filter {
|
||||
@Override
|
||||
protected FilterResults performFiltering(CharSequence constraint) {
|
||||
|
||||
String filterString = constraint.toString().toLowerCase(Locale.getDefault());
|
||||
|
||||
FilterResults results = new FilterResults();
|
||||
|
||||
|
||||
int count = mPackages.size();
|
||||
final Vector<ApplicationInfo> nlist = new Vector<>(count);
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
ApplicationInfo pInfo = mPackages.get(i);
|
||||
CharSequence appName = pInfo.loadLabel(mPm);
|
||||
|
||||
if (TextUtils.isEmpty(appName))
|
||||
appName = pInfo.packageName;
|
||||
|
||||
if (appName instanceof String) {
|
||||
if (((String) appName).toLowerCase(Locale.getDefault()).contains(filterString))
|
||||
nlist.add(pInfo);
|
||||
} else {
|
||||
if (appName.toString().toLowerCase(Locale.getDefault()).contains(filterString))
|
||||
nlist.add(pInfo);
|
||||
}
|
||||
}
|
||||
results.values = nlist;
|
||||
results.count = nlist.size();
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void publishResults(CharSequence constraint, FilterResults results) {
|
||||
mFilteredData = (Vector<ApplicationInfo>) results.values;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,317 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2016 Arne Schwabe
|
||||
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
|
||||
*/
|
||||
|
||||
package de.blinkt.openvpn.fragments
|
||||
|
||||
import android.Manifest
|
||||
import android.app.Activity
|
||||
import android.app.Fragment
|
||||
import android.content.Context
|
||||
import android.content.pm.ApplicationInfo
|
||||
import android.content.pm.PackageManager
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.Menu
|
||||
import android.view.MenuInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.AdapterView
|
||||
import android.widget.BaseAdapter
|
||||
import android.widget.CompoundButton
|
||||
import android.widget.Filter
|
||||
import android.widget.Filterable
|
||||
import android.widget.ImageView
|
||||
import android.widget.ListView
|
||||
import android.widget.SearchView
|
||||
import android.widget.Switch
|
||||
import android.widget.TextView
|
||||
|
||||
import java.util.Collections
|
||||
import java.util.Locale
|
||||
import java.util.Vector
|
||||
|
||||
import de.blinkt.openvpn.R
|
||||
import de.blinkt.openvpn.VpnProfile
|
||||
import de.blinkt.openvpn.core.ProfileManager
|
||||
|
||||
/**
|
||||
* Created by arne on 16.11.14.
|
||||
*/
|
||||
class Settings_Allowed_Apps : Fragment(), AdapterView.OnItemClickListener, CompoundButton.OnCheckedChangeListener, View.OnClickListener {
|
||||
private var mListView: ListView? = null
|
||||
private var mProfile: VpnProfile? = null
|
||||
private var mDefaultAllowTextView: TextView? = null
|
||||
private val mAllowBypassTextView: TextView? = null
|
||||
private var mListAdapter: PackageAdapter? = null
|
||||
|
||||
override fun onItemClick(parent: AdapterView<*>, view: View, position: Int, id: Long) {
|
||||
val avh = view.tag as AppViewHolder
|
||||
avh.checkBox.toggle()
|
||||
}
|
||||
|
||||
override fun onClick(v: View) {
|
||||
|
||||
}
|
||||
|
||||
override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) {
|
||||
val packageName = buttonView.tag as String
|
||||
if (isChecked) {
|
||||
mProfile!!.mAllowedAppsVpn.add(packageName)
|
||||
} else {
|
||||
mProfile!!.mAllowedAppsVpn.remove(packageName)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
changeDisallowText(mProfile!!.mAllowedAppsVpnAreDisallowed)
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
val profileUuid = arguments.getString(activity.packageName + ".profileUUID")
|
||||
mProfile = ProfileManager.get(activity, profileUuid)
|
||||
activity.title = getString(R.string.edit_profile_title, mProfile!!.name)
|
||||
setHasOptionsMenu(true)
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||
inflater.inflate(R.menu.allowed_apps, menu)
|
||||
|
||||
val searchView = menu.findItem(R.id.app_search_widget).actionView as SearchView
|
||||
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
|
||||
override fun onQueryTextSubmit(query: String): Boolean {
|
||||
mListView!!.setFilterText(query)
|
||||
mListView!!.isTextFilterEnabled = true
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onQueryTextChange(newText: String): Boolean {
|
||||
mListView!!.setFilterText(newText)
|
||||
if (TextUtils.isEmpty(newText))
|
||||
mListView!!.isTextFilterEnabled = false
|
||||
else
|
||||
mListView!!.isTextFilterEnabled = true
|
||||
|
||||
return true
|
||||
}
|
||||
})
|
||||
searchView.setOnCloseListener {
|
||||
mListView!!.clearTextFilter()
|
||||
mListAdapter!!.filter.filter("")
|
||||
false
|
||||
}
|
||||
|
||||
super.onCreateOptionsMenu(menu, inflater)
|
||||
}
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle): View? {
|
||||
val v = inflater.inflate(R.layout.allowed_vpn_apps, container, false)
|
||||
|
||||
mDefaultAllowTextView = v.findViewById<View>(R.id.default_allow_text) as TextView
|
||||
|
||||
val vpnOnDefaultSwitch = v.findViewById<View>(R.id.default_allow) as Switch
|
||||
|
||||
vpnOnDefaultSwitch.setOnCheckedChangeListener { buttonView, isChecked ->
|
||||
changeDisallowText(isChecked)
|
||||
mProfile!!.mAllowedAppsVpnAreDisallowed = isChecked
|
||||
}
|
||||
|
||||
vpnOnDefaultSwitch.isChecked = mProfile!!.mAllowedAppsVpnAreDisallowed
|
||||
|
||||
val vpnAllowBypassSwitch = v.findViewById<View>(R.id.allow_bypass) as Switch
|
||||
|
||||
vpnAllowBypassSwitch.setOnCheckedChangeListener { buttonView, isChecked -> mProfile!!.mAllowAppVpnBypass = isChecked }
|
||||
|
||||
vpnAllowBypassSwitch.isChecked = mProfile!!.mAllowAppVpnBypass
|
||||
|
||||
mListView = v.findViewById<View>(android.R.id.list) as ListView
|
||||
|
||||
mListAdapter = PackageAdapter(activity, mProfile)
|
||||
mListView!!.adapter = mListAdapter
|
||||
mListView!!.onItemClickListener = this
|
||||
|
||||
mListView!!.emptyView = v.findViewById(R.id.loading_container)
|
||||
|
||||
Thread(Runnable { mListAdapter!!.populateList(activity) }).start()
|
||||
|
||||
return v
|
||||
}
|
||||
|
||||
private fun changeDisallowText(selectedAreDisallowed: Boolean) {
|
||||
if (selectedAreDisallowed)
|
||||
mDefaultAllowTextView!!.setText(R.string.vpn_disallow_radio)
|
||||
else
|
||||
mDefaultAllowTextView!!.setText(R.string.vpn_allow_radio)
|
||||
}
|
||||
|
||||
internal class AppViewHolder {
|
||||
var mInfo: ApplicationInfo? = null
|
||||
var rootView: View? = null
|
||||
var appName: TextView
|
||||
var appIcon: ImageView
|
||||
//public TextView appSize;
|
||||
//public TextView disabled;
|
||||
var checkBox: CompoundButton
|
||||
|
||||
companion object {
|
||||
|
||||
fun createOrRecycle(inflater: LayoutInflater, convertView: View?, parent: ViewGroup): AppViewHolder {
|
||||
var convertView = convertView
|
||||
if (convertView == null) {
|
||||
convertView = inflater.inflate(R.layout.allowed_application_layout, parent, false)
|
||||
|
||||
// Creates a ViewHolder and store references to the two children views
|
||||
// we want to bind data to.
|
||||
val holder = AppViewHolder()
|
||||
holder.rootView = convertView
|
||||
holder.appName = convertView!!.findViewById<View>(R.id.app_name) as TextView
|
||||
holder.appIcon = convertView.findViewById<View>(R.id.app_icon) as ImageView
|
||||
//holder.appSize = (TextView) convertView.findViewById(R.id.app_size);
|
||||
//holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled);
|
||||
holder.checkBox = convertView.findViewById<View>(R.id.app_selected) as CompoundButton
|
||||
convertView.tag = holder
|
||||
|
||||
|
||||
return holder
|
||||
} else {
|
||||
// Get the ViewHolder back to get fast access to the TextView
|
||||
// and the ImageView.
|
||||
return convertView.tag as AppViewHolder
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
internal inner class PackageAdapter(c: Context, vp: VpnProfile) : BaseAdapter(), Filterable {
|
||||
private val mInflater: LayoutInflater
|
||||
private val mPm: PackageManager
|
||||
private var mPackages: Vector<ApplicationInfo>? = null
|
||||
private val mFilter = ItemFilter()
|
||||
private var mFilteredData: Vector<ApplicationInfo>? = null
|
||||
|
||||
|
||||
init {
|
||||
mPm = c.packageManager
|
||||
mProfile = vp
|
||||
mInflater = LayoutInflater.from(c)
|
||||
|
||||
mPackages = Vector()
|
||||
mFilteredData = mPackages
|
||||
}
|
||||
|
||||
private fun populateList(c: Activity) {
|
||||
val installedPackages = mPm.getInstalledApplications(PackageManager.GET_META_DATA)
|
||||
|
||||
// Remove apps not using Internet
|
||||
|
||||
var androidSystemUid = 0
|
||||
var system: ApplicationInfo? = null
|
||||
val apps = Vector<ApplicationInfo>()
|
||||
|
||||
try {
|
||||
system = mPm.getApplicationInfo("android", PackageManager.GET_META_DATA)
|
||||
androidSystemUid = system!!.uid
|
||||
apps.add(system)
|
||||
} catch (e: PackageManager.NameNotFoundException) {
|
||||
}
|
||||
|
||||
|
||||
for (app in installedPackages) {
|
||||
|
||||
if (mPm.checkPermission(Manifest.permission.INTERNET, app.packageName) == PackageManager.PERMISSION_GRANTED && app.uid != androidSystemUid) {
|
||||
|
||||
apps.add(app)
|
||||
}
|
||||
}
|
||||
|
||||
Collections.sort(apps, ApplicationInfo.DisplayNameComparator(mPm))
|
||||
mPackages = apps
|
||||
mFilteredData = apps
|
||||
c.runOnUiThread { notifyDataSetChanged() }
|
||||
}
|
||||
|
||||
override fun getCount(): Int {
|
||||
return mFilteredData!!.size
|
||||
}
|
||||
|
||||
override fun getItem(position: Int): Any {
|
||||
return mFilteredData!![position]
|
||||
}
|
||||
|
||||
override fun getItemId(position: Int): Long {
|
||||
return mFilteredData!![position].packageName.hashCode().toLong()
|
||||
}
|
||||
|
||||
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
|
||||
var convertView = convertView
|
||||
val viewHolder = AppViewHolder.createOrRecycle(mInflater, convertView, parent)
|
||||
convertView = viewHolder.rootView
|
||||
viewHolder.mInfo = mFilteredData!![position]
|
||||
val mInfo = mFilteredData!![position]
|
||||
|
||||
|
||||
var appName = mInfo.loadLabel(mPm)
|
||||
|
||||
if (TextUtils.isEmpty(appName))
|
||||
appName = mInfo.packageName
|
||||
viewHolder.appName.text = appName
|
||||
viewHolder.appIcon.setImageDrawable(mInfo.loadIcon(mPm))
|
||||
viewHolder.checkBox.tag = mInfo.packageName
|
||||
viewHolder.checkBox.setOnCheckedChangeListener(this@Settings_Allowed_Apps)
|
||||
|
||||
|
||||
viewHolder.checkBox.isChecked = mProfile!!.mAllowedAppsVpn.contains(mInfo.packageName)
|
||||
return viewHolder.rootView
|
||||
}
|
||||
|
||||
override fun getFilter(): Filter {
|
||||
return mFilter
|
||||
}
|
||||
|
||||
private inner class ItemFilter : Filter() {
|
||||
override fun performFiltering(constraint: CharSequence): Filter.FilterResults {
|
||||
|
||||
val filterString = constraint.toString().toLowerCase(Locale.getDefault())
|
||||
|
||||
val results = Filter.FilterResults()
|
||||
|
||||
|
||||
val count = mPackages!!.size
|
||||
val nlist = Vector<ApplicationInfo>(count)
|
||||
|
||||
for (i in 0 until count) {
|
||||
val pInfo = mPackages!![i]
|
||||
var appName = pInfo.loadLabel(mPm)
|
||||
|
||||
if (TextUtils.isEmpty(appName))
|
||||
appName = pInfo.packageName
|
||||
|
||||
if (appName is String) {
|
||||
if (appName.toLowerCase(Locale.getDefault()).contains(filterString))
|
||||
nlist.add(pInfo)
|
||||
} else {
|
||||
if (appName.toString().toLowerCase(Locale.getDefault()).contains(filterString))
|
||||
nlist.add(pInfo)
|
||||
}
|
||||
}
|
||||
results.values = nlist
|
||||
results.count = nlist.size
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
override fun publishResults(constraint: CharSequence, results: Filter.FilterResults) {
|
||||
mFilteredData = results.values as Vector<ApplicationInfo>
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user