From 542de3f092d143fdb819ade45b7b864e3549de0e Mon Sep 17 00:00:00 2001 From: happycbbboy Date: Mon, 5 Feb 2024 18:43:19 +0800 Subject: [PATCH] routeconf success! todo: route conf page faster --- .../java/com/happycbbboy/MainActivity.java | 1 - .../com/happycbbboy/domain/RouteConfig.java | 29 +++-- .../happycbbboy/ui/base/AppItermAdapter.java | 89 +++++++------- .../ui/home/ProxyConfListFrame.java | 17 ++- .../home/ProxyConfListItermManagerFrame.java | 1 + .../ui/home/ProxyConfigListViewAdapter.java | 1 + .../ui/route/RouteConfListFragment.java | 30 ++++- .../ui/route/RouteConfManagerFragment.java | 84 +++++++++++-- .../RouteConfigItermRecyclerViewAdapter.java | 1 - .../java/com/happycbbboy/utils/AppUtils.java | 116 +++++++++++++----- app/src/main/res/layout/app_iterm.xml | 11 +- .../layout/fragment_route_conf_manager.xml | 40 ++++-- .../res/layout/selector_image_text_iterm.xml | 8 +- 13 files changed, 306 insertions(+), 122 deletions(-) diff --git a/app/src/main/java/com/happycbbboy/MainActivity.java b/app/src/main/java/com/happycbbboy/MainActivity.java index afece3d..e1a33b4 100644 --- a/app/src/main/java/com/happycbbboy/MainActivity.java +++ b/app/src/main/java/com/happycbbboy/MainActivity.java @@ -46,7 +46,6 @@ public void onReceive(Context context, Intent intent) { } };*/ - @RequiresApi(api = Build.VERSION_CODES.TIRAMISU) @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/java/com/happycbbboy/domain/RouteConfig.java b/app/src/main/java/com/happycbbboy/domain/RouteConfig.java index d9e7b8f..a761a7f 100644 --- a/app/src/main/java/com/happycbbboy/domain/RouteConfig.java +++ b/app/src/main/java/com/happycbbboy/domain/RouteConfig.java @@ -18,13 +18,20 @@ public class RouteConfig { Integer id; @ColumnInfo(name = "name") String name; + + public final static int CURRENT_ROUTE_POLICY_NORMAL = 0; + public final static int CURRENT_ROUTE_POLICY_FREEE = 1; + public final static int CURRENT_ROUTE_POLICY_TUNNEL = 2; + + @ColumnInfo(name = "current_route_policy") + Integer currentRoutePolicy; + @ColumnInfo(name = "route") List route; @ColumnInfo(name = "include_package") - List includePackage; - @ColumnInfo(name = "exclude_package") - List excludePackage; + List checkPackages; + public Integer getId() { @@ -51,20 +58,20 @@ public void setRoute(List route) { this.route = route; } - public List getIncludePackage() { - return includePackage; + public Integer getCurrentRoutePolicy() { + return currentRoutePolicy; } - public void setIncludePackage(List includePackage) { - this.includePackage = includePackage; + public void setCurrentRoutePolicy(Integer currentRoutePolicy) { + this.currentRoutePolicy = currentRoutePolicy; } - public List getExcludePackage() { - return excludePackage; + public List getCheckPackages() { + return checkPackages; } - public void setExcludePackage(List excludePackage) { - this.excludePackage = excludePackage; + public void setCheckPackages(List checkPackages) { + this.checkPackages = checkPackages; } @NonNull diff --git a/app/src/main/java/com/happycbbboy/ui/base/AppItermAdapter.java b/app/src/main/java/com/happycbbboy/ui/base/AppItermAdapter.java index 256cd05..50440fd 100644 --- a/app/src/main/java/com/happycbbboy/ui/base/AppItermAdapter.java +++ b/app/src/main/java/com/happycbbboy/ui/base/AppItermAdapter.java @@ -1,41 +1,31 @@ package com.happycbbboy.ui.base; -import android.util.Log; +import android.content.Context; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; +import android.widget.CompoundButton; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.happycbbboy.R; import com.happycbbboy.databinding.AppItermBinding; -import com.happycbbboy.ui.selector.SpinnerImageTextAdapter; import com.happycbbboy.utils.AppUtils; -import java.util.ArrayList; import java.util.List; public class AppItermAdapter extends RecyclerView.Adapter { List allApps; + private static LayoutInflater inflater; - /* List includePackageName; - List excludePackageName; - - public List getIncludePackageName() { - return includePackageName; - } - - public List getExcludePackageName() { - return excludePackageName; - }*/ public List getAllApps() { return allApps; } - public AppItermAdapter(List allApps) { + public AppItermAdapter(Context context,List allApps) { + if (inflater==null) { + inflater = LayoutInflater.from(context); + } this.allApps = allApps; // this.includePackageName = includePackageName; // this.excludePackageName = excludePackageName; @@ -44,34 +34,29 @@ public AppItermAdapter(List allApps) { @NonNull @Override public AppItermAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new AppItermAdapter.ViewHolder(AppItermBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + return new ViewHolder(AppItermBinding.inflate(inflater, parent, false)); } @Override public void onBindViewHolder(@NonNull AppItermAdapter.ViewHolder holder, int position) { - Log.i("AppItermAdapter","onBindViewHolder accept"); - +// Log.i("AppItermAdapter", "onBindViewHolder accept:"+holder); AppUtils.AppInfo appInfo = allApps.get(position); - holder.binding.appItermIcon.setImageDrawable(appInfo.getAppIcon()); + holder.bind(appInfo); + /* holder.binding.appItermIcon.setImageDrawable(appInfo.getAppIcon()); holder.binding.appNameTextView.setText(appInfo.getAppName()); holder.binding.packageNameTextView.setText(appInfo.getPackageName()); - // 使用 ArrayAdapter 设置 Spinner 的选项 - SpinnerImageTextAdapter spinnerImageTextAdapter = new SpinnerImageTextAdapter(holder.itemView.getContext(), R.layout.selector_image_text_iterm, selectorImageTextIterms); - spinnerImageTextAdapter.setDropDownViewResource(R.layout.selector_image_text_iterm); - holder.binding.routeAppItermSpinner.setAdapter(spinnerImageTextAdapter); - holder.binding.routeAppItermSpinner.setSelection(appInfo.getPolicy()); - holder.binding.routeAppItermSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { - // Get the selected item from the spinner - SpinnerImageTextAdapter.SelectorImageTextIterm selectedIterm = selectorImageTextIterms.get(position); - appInfo.setPolicy(selectedIterm.getPolicy()); - } - + holder.binding.appItermCheckbox.setChecked(appInfo.getCheck()); + // 设置CheckBox状态变化的监听器 + holder.binding.appItermCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override - public void onNothingSelected(AdapterView parentView) { + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + appInfo.setCheck(true); + } else { + appInfo.setCheck(false); + } } - }); + });*/ } @@ -87,13 +72,31 @@ public ViewHolder(AppItermBinding binding) { super(binding.getRoot()); this.binding = binding; } - } - static List selectorImageTextIterms = new ArrayList<>(); - - static { - selectorImageTextIterms.add(new SpinnerImageTextAdapter.SelectorImageTextIterm("默认", R.drawable.grey_dot, AppUtils.AppInfo.NORMAL)); - selectorImageTextIterms.add(new SpinnerImageTextAdapter.SelectorImageTextIterm("放行", R.drawable.red_dot, AppUtils.AppInfo.FREEE)); - selectorImageTextIterms.add(new SpinnerImageTextAdapter.SelectorImageTextIterm("拦截", R.drawable.gree_dot, AppUtils.AppInfo.TUNNEL)); + public void bind(@NonNull AppUtils.AppInfo appInfo) { +// if (appInfo.getIniTial()) { +// binding.appItermCheckbox.setChecked(appInfo.getCheck()); +// return; +// } + // 在这里将数据绑定到视图上 + binding.appItermIcon.setImageDrawable(appInfo.getAppIcon()); + binding.appNameTextView.setText(appInfo.getAppName()); + binding.packageNameTextView.setText(appInfo.getPackageName()); + binding.appItermCheckbox.setChecked(appInfo.getCheck()); + + // 设置CheckBox状态变化的监听器 + binding.appItermCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + appInfo.setCheck(true); + } else { + appInfo.setCheck(false); + } + } + }); +// appInfo.setIniTial(true); + } } + } diff --git a/app/src/main/java/com/happycbbboy/ui/home/ProxyConfListFrame.java b/app/src/main/java/com/happycbbboy/ui/home/ProxyConfListFrame.java index 2853137..23b21e2 100644 --- a/app/src/main/java/com/happycbbboy/ui/home/ProxyConfListFrame.java +++ b/app/src/main/java/com/happycbbboy/ui/home/ProxyConfListFrame.java @@ -105,8 +105,15 @@ public void onClick(View view) { } vpnOptionsImp.setRoute(routeConfig.getRoute()); - vpnOptionsImp.setExcludePackage(routeConfig.getExcludePackage()); - vpnOptionsImp.setIncludePackage(routeConfig.getIncludePackage()); + if (routeConfig.getCurrentRoutePolicy() == RouteConfig.CURRENT_ROUTE_POLICY_NORMAL) { + + }else if (routeConfig.getCurrentRoutePolicy() == RouteConfig.CURRENT_ROUTE_POLICY_FREEE) { + vpnOptionsImp.setIncludePackage(routeConfig.getCheckPackages()); + }else if (routeConfig.getCurrentRoutePolicy() == RouteConfig.CURRENT_ROUTE_POLICY_TUNNEL) { + vpnOptionsImp.setExcludePackage(routeConfig.getCheckPackages()); + } +// vpnOptionsImp.setExcludePackage(routeConfig.getExcludePackage()); +// vpnOptionsImp.setIncludePackage(routeConfig.getIncludePackage()); VPNInterface.Start(getActivity().getApplication(), vpnOptionsImp); // ((FloatingActionButton) binding.fab).setImageDrawable(AppCompatResources.getDrawable(requireContext(), android.R.drawable.ic_media_pause)); }, @@ -129,4 +136,10 @@ public void onDestroyView() { super.onDestroyView(); binding = null; } + + @Override + public void onDestroy() { + super.onDestroy(); + mDisposable.dispose(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/happycbbboy/ui/home/ProxyConfListItermManagerFrame.java b/app/src/main/java/com/happycbbboy/ui/home/ProxyConfListItermManagerFrame.java index ca29ee7..af2d25c 100644 --- a/app/src/main/java/com/happycbbboy/ui/home/ProxyConfListItermManagerFrame.java +++ b/app/src/main/java/com/happycbbboy/ui/home/ProxyConfListItermManagerFrame.java @@ -155,6 +155,7 @@ public void onPause() { public void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); + mDisposable.dispose(); } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/com/happycbbboy/ui/home/ProxyConfigListViewAdapter.java b/app/src/main/java/com/happycbbboy/ui/home/ProxyConfigListViewAdapter.java index 23b40c0..c7e705e 100644 --- a/app/src/main/java/com/happycbbboy/ui/home/ProxyConfigListViewAdapter.java +++ b/app/src/main/java/com/happycbbboy/ui/home/ProxyConfigListViewAdapter.java @@ -103,4 +103,5 @@ static class ItermView { public Button edit; public Button delete; } + } diff --git a/app/src/main/java/com/happycbbboy/ui/route/RouteConfListFragment.java b/app/src/main/java/com/happycbbboy/ui/route/RouteConfListFragment.java index 9c48c83..b7a4818 100644 --- a/app/src/main/java/com/happycbbboy/ui/route/RouteConfListFragment.java +++ b/app/src/main/java/com/happycbbboy/ui/route/RouteConfListFragment.java @@ -12,6 +12,11 @@ import com.happycbbboy.databases.RouteConfigDatabase; import com.happycbbboy.databases.dao.RouteConfigDao; import com.happycbbboy.databinding.FragmentRouteConfListBinding; +import com.happycbbboy.utils.AppUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Executors; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; @@ -30,13 +35,30 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RouteConfigDatabase instance = RouteConfigDatabase.getInstance(getActivity().getApplication()); routeConfigDao = instance.proxyConfigDao(); + Executors.newSingleThreadExecutor().execute(new Runnable() { + @Override + public void run() { + Log.i("async AppUtils", "start load all app"); + for (int i = 0; i < 10; i++) { + List allInstalledApps = AppUtils.getAllInstalledApps(requireContext(), "", new ArrayList<>(0)); + if (allInstalledApps != null && allInstalledApps.size() > 0) { + break; + } + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + Log.e("getAllInstalledApps", "getAllInstalledApps sleep err:" + e.getMessage()); + } + } + } + }); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentRouteConfListBinding.inflate(inflater, container, false); - RecyclerView root = (RecyclerView)binding.getRoot(); + RecyclerView root = (RecyclerView) binding.getRoot(); mDisposable.add(routeConfigDao.getAll() .subscribeOn(Schedulers.io()) @@ -48,4 +70,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, return root; } + + @Override + public void onDestroy() { + super.onDestroy(); + mDisposable.dispose(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/happycbbboy/ui/route/RouteConfManagerFragment.java b/app/src/main/java/com/happycbbboy/ui/route/RouteConfManagerFragment.java index 57cefc1..61a4a82 100644 --- a/app/src/main/java/com/happycbbboy/ui/route/RouteConfManagerFragment.java +++ b/app/src/main/java/com/happycbbboy/ui/route/RouteConfManagerFragment.java @@ -5,8 +5,10 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.EditText; import android.widget.ImageButton; +import android.widget.Spinner; import android.widget.Toast; import androidx.annotation.NonNull; @@ -25,6 +27,7 @@ import com.happycbbboy.domain.RouteConfig; import com.happycbbboy.ui.base.AppItermAdapter; import com.happycbbboy.ui.base.StringItermAdapter; +import com.happycbbboy.ui.selector.SpinnerImageTextAdapter; import com.happycbbboy.utils.AppUtils; import org.greenrobot.eventbus.EventBus; @@ -51,6 +54,15 @@ public class RouteConfManagerFragment extends Fragment { private RecyclerView routeConfigManagerItems; private ImageButton addRouteItermConf; private RecyclerView appListOptions; + private Spinner routeAppItrmSelectorConf; + + static List selectorImageTextIterms = new ArrayList<>(); + + static { + selectorImageTextIterms.add(new SpinnerImageTextAdapter.SelectorImageTextIterm("默认", R.drawable.grey_dot, RouteConfig.CURRENT_ROUTE_POLICY_NORMAL)); + selectorImageTextIterms.add(new SpinnerImageTextAdapter.SelectorImageTextIterm("放行", R.drawable.red_dot, RouteConfig.CURRENT_ROUTE_POLICY_TUNNEL)); + selectorImageTextIterms.add(new SpinnerImageTextAdapter.SelectorImageTextIterm("拦截", R.drawable.gree_dot, RouteConfig.CURRENT_ROUTE_POLICY_FREEE)); + } @Override public void onCreate(Bundle savedInstanceState) { @@ -86,7 +98,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat routeConfigManagerItems = (RecyclerView) getView().findViewById(R.id.route_config_manager_iterms); addRouteItermConf = (ImageButton) getView().findViewById(R.id.add_route_iterm_conf); appListOptions = (RecyclerView) getView().findViewById(R.id.app_list_options); - + routeAppItrmSelectorConf = (Spinner) getView().findViewById(R.id.route_app_iterm_selector_conf); addRouteItermConf.setOnClickListener(v -> { RecyclerView.Adapter routeConfigAdapter = routeConfigManagerItems.getAdapter(); if (routeConfigAdapter != null) { @@ -101,6 +113,14 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat }); Log.i("RouteConfManagerFragment", "routeConfigManagerItems end accept"); + // 使用 ArrayAdapter 设置 Spinner 的选项 + SpinnerImageTextAdapter spinnerImageTextAdapter = new SpinnerImageTextAdapter(requireContext(), R.layout.selector_image_text_iterm, selectorImageTextIterms); + spinnerImageTextAdapter.setDropDownViewResource(R.layout.selector_image_text_iterm); + routeAppItrmSelectorConf.setAdapter(spinnerImageTextAdapter); + // 添加滚动监听器实现预加载 + LinearLayoutManager layoutManager = new LinearLayoutManager(requireContext()); + appListOptions.setLayoutManager(layoutManager); + layoutManager.setInitialPrefetchItemCount(10); // 设置预加载的Item数量 Log.i("RouteConfManagerFragment", "start get app info"); if (id != null) { @@ -111,14 +131,48 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat name.setText(routeConfig.getName()); StringItermAdapter stringItermAdapter = new StringItermAdapter(routeConfig.getRoute()); routeConfigManagerItems.setAdapter(stringItermAdapter); - List allInstalledApps = AppUtils.getAllInstalledApps(getContext(),routeConfig.getIncludePackage(),routeConfig.getExcludePackage()); - appListOptions.setAdapter(new AppItermAdapter(allInstalledApps)); + List allInstalledApps = AppUtils.getAllInstalledApps(getContext(),"", routeConfig.getCheckPackages()); + AppItermAdapter adapter = new AppItermAdapter(requireContext(),allInstalledApps); + appListOptions.setAdapter(adapter); +/* // 高速缓存 不再每次调用on create + ViewCacheExtension extension = new ViewCacheExtension(allInstalledApps, adapter, position -> { + AppUtils.AppInfo appInfo = allInstalledApps.get(position); + return appInfo.toString(); + }); + appListOptions.setViewCacheExtension(extension);*/ + + // 设置路由策略 + routeAppItrmSelectorConf.setSelection(routeConfig.getCurrentRoutePolicy()); + routeAppItrmSelectorConf.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parentView, View selectedItemView, int position, long id) { + // Get the selected item from the spinner + SpinnerImageTextAdapter.SelectorImageTextIterm selectedIterm = selectorImageTextIterms.get(position); + routeConfig.setCurrentRoutePolicy(selectedIterm.getPolicy()); + } + + @Override + public void onNothingSelected(AdapterView parentView) { + } + }); + }, throwable -> Log.e("onViewCreated", "proxyConfigDao get all:", throwable))); } else { - List allInstalledApps = AppUtils.getAllInstalledApps(requireContext(), new ArrayList<>(0), new ArrayList<>(0)); - appListOptions.setAdapter(new AppItermAdapter(allInstalledApps)); + routeAppItrmSelectorConf.setSelection(RouteConfig.CURRENT_ROUTE_POLICY_NORMAL); + + List allInstalledApps = AppUtils.getAllInstalledApps(requireContext(),"", new ArrayList<>(0)); + AppItermAdapter adapter = new AppItermAdapter(requireContext(),allInstalledApps); + appListOptions.setAdapter(adapter); + // 高速缓存 不再每次调用on create +/* ViewCacheExtension extension = new ViewCacheExtension(allInstalledApps, adapter, position -> { + AppUtils.AppInfo appInfo = allInstalledApps.get(position); + return appInfo.toString(); + }); + appListOptions.setViewCacheExtension(extension);*/ } + // 设置自定义的缓存逻辑 + // 在Fragment或Activity中 Log.i("RouteConfManagerFragment", "start onViewCreated end"); } @@ -131,6 +185,7 @@ public void onPause() { @Override public void onDestroy() { super.onDestroy(); + mDisposable.dispose(); EventBus.getDefault().unregister(this); } // EventBus.getDefault().post(EventBusMsg.ROUTE_SETTING_SUBMIT); @@ -170,17 +225,24 @@ public void FragmentButtonClicked(EventBusMsg event) { routeConfig.setRoute(routes); AppItermAdapter adapter = (AppItermAdapter) appListOptions.getAdapter(); List allApps = adapter.getAllApps(); - ArrayList tunnelList = new ArrayList<>(); - ArrayList freeList = new ArrayList<>(); +// ArrayList tunnelList = new ArrayList<>(); +// ArrayList freeList = new ArrayList<>(); + ArrayList appPackageCheckList = new ArrayList<>(); for (AppUtils.AppInfo allApp : allApps) { - if (allApp.getPolicy() == AppUtils.AppInfo.FREEE) { + if (allApp.getCheck()) { + appPackageCheckList.add(allApp.getPackageName()); + } + /*if (allApp.getPolicy() == AppUtils.AppInfo.FREEE) { freeList.add(allApp.getPackageName()); } else if (allApp.getPolicy() == AppUtils.AppInfo.TUNNEL) { tunnelList.add(allApp.getPackageName()); - } + }*/ } - routeConfig.setIncludePackage(tunnelList); - routeConfig.setExcludePackage(freeList); + routeConfig.setCheckPackages(appPackageCheckList); + int selectedItemPosition = routeAppItrmSelectorConf.getSelectedItemPosition(); + routeConfig.setCurrentRoutePolicy(selectedItemPosition); +// routeConfig.setIncludePackage(tunnelList); +// routeConfig.setExcludePackage(freeList); mDisposable.add(routeConfigDao.insertAll(routeConfig) .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/com/happycbbboy/ui/route/RouteConfigItermRecyclerViewAdapter.java b/app/src/main/java/com/happycbbboy/ui/route/RouteConfigItermRecyclerViewAdapter.java index 43967b8..04f2025 100644 --- a/app/src/main/java/com/happycbbboy/ui/route/RouteConfigItermRecyclerViewAdapter.java +++ b/app/src/main/java/com/happycbbboy/ui/route/RouteConfigItermRecyclerViewAdapter.java @@ -77,6 +77,5 @@ public ViewHolder(FragmentRouteConfItermBinding binding) { routeItermEdit = binding.routeItermEdit; routeItermDelete = binding.routeItermDelete; } - } } \ No newline at end of file diff --git a/app/src/main/java/com/happycbbboy/utils/AppUtils.java b/app/src/main/java/com/happycbbboy/utils/AppUtils.java index c6befcc..79f9898 100644 --- a/app/src/main/java/com/happycbbboy/utils/AppUtils.java +++ b/app/src/main/java/com/happycbbboy/utils/AppUtils.java @@ -2,7 +2,6 @@ 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.util.Log; @@ -12,53 +11,76 @@ public class AppUtils { static PackageManager packageManager; - static List packagesCache; +// static List packagesCache; + static List packagesCache; +// static List packagesCache; + static List appInfoList; - public static List getAllInstalledApps(Context context, List includePackage, List excludePackage) { - if ( packageManager == null) { + public static synchronized List getAllInstalledApps(Context context, String keyWord, List includePackage) { + if (packageManager == null) { packageManager = context.getPackageManager(); } - if ( packagesCache == null) { - packagesCache = packageManager.getInstalledPackages(PackageManager.GET_SERVICES); + if (packagesCache == null || packagesCache.size() != 0) { +// Intent intent = new Intent(Intent.ACTION_MAIN, null); +// intent.addCategory(Intent.CATEGORY_LAUNCHER); + packagesCache = packageManager.getInstalledApplications(0); +// packagesCache = packageManager.queryIntentActivities(intent,0); } + ArrayList resAppInfoList = new ArrayList<>(); + // 获取所有已安装应用的信息 - List appInfoList = new ArrayList<>(packagesCache.size()); - - for (PackageInfo packageInfo : packagesCache) { - String appName = packageInfo.applicationInfo.loadLabel(packageManager).toString(); - String packageName = packageInfo.packageName; - Drawable appIcon = packageInfo.applicationInfo.loadIcon(packageManager); - if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - continue; - } - AppInfo appInfo = new AppInfo(appName, packageName, appIcon); - if (includePackage.contains(packageName)) { - appInfo.setPolicy(AppInfo.TUNNEL); - appInfoList.add(0, appInfo); - continue; + if (appInfoList == null || appInfoList.size() == 0) { + appInfoList = new ArrayList<>(packagesCache.size()); +// for (ResolveInfo packageInfo : packagesCache) { + for (ApplicationInfo packageInfo : packagesCache) { + Drawable appIcon = packageInfo.loadIcon(packageManager); + String appName = packageInfo.loadLabel(packageManager).toString(); + String packageName = packageInfo.packageName; +// String packageName = packageInfo.activityInfo.packageName; + + AppInfo appInfo = new AppInfo(appName, packageName, appIcon); + appInfoList.add(appInfoList.size(), appInfo); + +/* if (keyWord != null && !"".equals(keyWord) && !packageName.contains(keyWord) && !appName.contains(keyWord)) { + continue; + }*/ + if (includePackage.contains(packageName)) { + appInfo.setCheck(true); +// appInfoList.add(0, appInfo); + resAppInfoList.add(0, appInfo); + continue; + } + appInfo.setCheck(false); + resAppInfoList.add(appInfo); } - if (excludePackage.contains(packageName)) { - appInfo.setPolicy(AppInfo.FREEE); - appInfoList.add(Math.min(appInfoList.size(), includePackage.size()), appInfo); - continue; + } else { + for (AppInfo appInfo : appInfoList) { +/* if (keyWord != null && !"".equals(keyWord) && !appInfo.getPackageName().contains(keyWord) && !appInfo.getAppName().contains(keyWord)) { + continue; + }*/ + if (includePackage.contains(appInfo.getPackageName())) { + appInfo.setCheck(true); + resAppInfoList.add(0,appInfo); + continue; + } + appInfo.setCheck(false); + resAppInfoList.add(appInfo); } - appInfoList.add(appInfoList.size(), appInfo); } Log.i("RouteConfManagerFragment", "appInfoList len:" + appInfoList.size()); - return appInfoList; + return resAppInfoList; } public static class AppInfo { - public final static int NORMAL = 0; - public final static int FREEE = 1; - public final static int TUNNEL = 2; private String appName; private String packageName; private Drawable appIcon; - private int policy = NORMAL; + private boolean check; +// private boolean iniTial = false; +// private AppItermAdapter.ViewHolder appItermViewHolder; public AppInfo(String appName, String packageName, Drawable appIcon) { this.appName = appName; @@ -78,12 +100,38 @@ public Drawable getAppIcon() { return appIcon; } - public int getPolicy() { - return policy; + public Boolean getCheck() { + return check; + } + + /* public AppItermAdapter.ViewHolder getAppItermViewHolder() { + return appItermViewHolder; + } + + public void setAppItermViewHolder(AppItermAdapter.ViewHolder appItermViewHolder) { + this.appItermViewHolder = appItermViewHolder; + } + + public Boolean getIniTial() { + return iniTial; + } + + public void setIniTial(boolean iniTial) { + this.iniTial = iniTial; + }*/ + + public void setCheck(Boolean check) { + this.check = check; } - public void setPolicy(int policy) { - this.policy = policy; + @Override + public String toString() { + return "AppInfo{" + + "appName='" + appName + '\'' + + ", packageName='" + packageName + '\'' + + ", appIcon=" + appIcon + + ", check=" + check + + '}'; } } } diff --git a/app/src/main/res/layout/app_iterm.xml b/app/src/main/res/layout/app_iterm.xml index 25ea489..b4aa0d1 100644 --- a/app/src/main/res/layout/app_iterm.xml +++ b/app/src/main/res/layout/app_iterm.xml @@ -53,7 +53,7 @@ android:textSize="14sp" /> - - + />--> +