Skip to content

Commit

Permalink
v1 over
Browse files Browse the repository at this point in the history
  • Loading branch information
happycbbboy committed Feb 6, 2024
1 parent 0eeb5ce commit 75a12c2
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 62 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.happycbbboy.ui.route;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Spinner;
Expand Down Expand Up @@ -56,6 +58,8 @@ public class RouteConfManagerFragment extends Fragment {
private RecyclerView appListOptions;
private Spinner routeAppItrmSelectorConf;

private List<AppUtils.AppInfo> allInstalledApps;

static List<SpinnerImageTextAdapter.SelectorImageTextIterm> selectorImageTextIterms = new ArrayList<>();

static {
Expand Down Expand Up @@ -99,6 +103,11 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
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);

EditText searcher = getView().findViewById(R.id.app_list_options_searcher);
Button searcherBtn = (Button) getView().findViewById(R.id.app_list_options_searcher_submit);


addRouteItermConf.setOnClickListener(v -> {
RecyclerView.Adapter routeConfigAdapter = routeConfigManagerItems.getAdapter();
if (routeConfigAdapter != null) {
Expand All @@ -117,7 +126,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
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());
layoutManager.setInitialPrefetchItemCount(256); // 设置预加载的Item数量
appListOptions.setLayoutManager(layoutManager);
Expand All @@ -132,47 +141,39 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
name.setText(routeConfig.getName());
StringItermAdapter stringItermAdapter = new StringItermAdapter(routeConfig.getRoute());
routeConfigManagerItems.setAdapter(stringItermAdapter);
List<AppUtils.AppInfo> allInstalledApps = AppUtils.getAllInstalledApps(getContext(), "", routeConfig.getCheckPackages());

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 {
routeAppItrmSelectorConf.setSelection(RouteConfig.CURRENT_ROUTE_POLICY_NORMAL);

List<AppUtils.AppInfo> allInstalledApps = AppUtils.getAllInstalledApps(requireContext(), "", new ArrayList<>(0));
allInstalledApps = AppUtils.getAllInstalledApps(requireContext(), "", new ArrayList<>(0));
// AppItermAdapter adapter = new AppItermAdapter(requireContext(), new ArrayList<>(allInstalledApps.subList(0, Math.min(AppItermAdapter.INITIAL_SIZE, allInstalledApps.size()))));
AppItermAdapter adapter = new AppItermAdapter(requireContext(),allInstalledApps);
AppItermAdapter adapter = new AppItermAdapter(requireContext(), allInstalledApps);
appListOptions.setAdapter(adapter);

}
// 设置自定义的缓存逻辑
// 在Fragment或Activity中

searcherBtn.setOnClickListener(v -> {
hideKeyboard(requireActivity());
searcher.clearFocus();
String text = searcher.getText().toString();
appListOptions.setAdapter(new AppItermAdapter(requireContext(), AppUtils.searchKeyWord(allInstalledApps,text) ));
});
Log.i("RouteConfManagerFragment", "start onViewCreated end");
}
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
View view = activity.getCurrentFocus();
if (view == null) {
view = new View(activity);
}
if (imm != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}

@Override
public void onPause() {
Expand All @@ -185,7 +186,6 @@ public void onDestroy() {
mDisposable.dispose();
EventBus.getDefault().unregister(this);
}
// EventBus.getDefault().post(EventBusMsg.ROUTE_SETTING_SUBMIT);

@Subscribe(threadMode = ThreadMode.MAIN)
public void FragmentButtonClicked(EventBusMsg event) {
Expand Down Expand Up @@ -220,26 +220,15 @@ public void FragmentButtonClicked(EventBusMsg event) {
}
}
routeConfig.setRoute(routes);
AppItermAdapter adapter = (AppItermAdapter) appListOptions.getAdapter();
List<AppUtils.AppInfo> allApps = adapter.getAllApps();
// ArrayList<String> tunnelList = new ArrayList<>();
// ArrayList<String> freeList = new ArrayList<>();
ArrayList<String> appPackageCheckList = new ArrayList<>();
for (AppUtils.AppInfo allApp : allApps) {
for (AppUtils.AppInfo allApp : allInstalledApps) {
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.setCheckPackages(appPackageCheckList);
int selectedItemPosition = routeAppItrmSelectorConf.getSelectedItemPosition();
routeConfig.setCurrentRoutePolicy(selectedItemPosition);
// routeConfig.setIncludePackage(tunnelList);
// routeConfig.setExcludePackage(freeList);

mDisposable.add(routeConfigDao.insertAll(routeConfig)
.subscribeOn(Schedulers.io())
Expand Down
36 changes: 20 additions & 16 deletions app/src/main/java/com/happycbbboy/utils/AppUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,40 +11,45 @@

public class AppUtils {
static PackageManager packageManager;
// static List<PackageInfo> packagesCache;
// static List<PackageInfo> packagesCache;
static List<ApplicationInfo> packagesCache;
// static List<ResolveInfo> packagesCache;
// static List<ResolveInfo> packagesCache;
static List<AppInfo> appInfoList;

public static synchronized List<AppInfo> searchKeyWord(List<AppInfo> appInfoList, String keyWord) {
ArrayList<AppInfo> resAppInfoList = new ArrayList<>();
for (AppInfo appInfo : appInfoList) {
if (keyWord != null && !"".equals(keyWord) && !appInfo.getPackageName().contains(keyWord) && !appInfo.getAppName().contains(keyWord)) {
continue;
}
resAppInfoList.add(appInfo);
}
return resAppInfoList;
}

public static synchronized List<AppInfo> getAllInstalledApps(Context context, String keyWord, List<String> includePackage) {
if (packageManager == null) {
packageManager = context.getPackageManager();
}

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<AppInfo> resAppInfoList = new ArrayList<>();

// 获取所有已安装应用的信息
if (appInfoList == null || appInfoList.size() == 0) {
appInfoList = new ArrayList<>(packagesCache.size());
// for (ResolveInfo packageInfo : packagesCache) {
for (ApplicationInfo 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)) {
if (keyWord != null && !"".equals(keyWord) && !packageName.contains(keyWord) && !appName.contains(keyWord)) {
continue;
}*/
}
if (includePackage.contains(packageName)) {
appInfo.setCheck(true);
// appInfoList.add(0, appInfo);
Expand All @@ -56,21 +61,20 @@ public static synchronized List<AppInfo> getAllInstalledApps(Context context, St
}
} else {
for (AppInfo appInfo : appInfoList) {
/* if (keyWord != null && !"".equals(keyWord) && !appInfo.getPackageName().contains(keyWord) && !appInfo.getAppName().contains(keyWord)) {
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);
resAppInfoList.add(0, appInfo);
continue;
}
appInfo.setCheck(false);
resAppInfoList.add(appInfo);
}
}


Log.i("RouteConfManagerFragment", "appInfoList len:" + appInfoList.size());
Log.i("RouteConfManagerFragment", "appInfoList len:" + resAppInfoList.size());
return resAppInfoList;
}

Expand Down
14 changes: 14 additions & 0 deletions app/src/main/res/drawable/search_buttom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<!-- button_background.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" /> <!-- 设置圆角半径 -->
<solid android:color="@android:color/transparent" /> <!-- 设置背景颜色为透明 -->
<!-- 在shape中添加一个图标 -->
<item
android:width="24dp"
android:height="24dp"
android:drawable="@android:drawable/ic_menu_search"
android:gravity="center"
android:left="16dp"
android:right="16dp" />
</shape>
29 changes: 26 additions & 3 deletions app/src/main/res/layout/fragment_route_conf_manager.xml
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,34 @@
/>

</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="10dp"
tools:context=".MainActivity"
tools:ignore="MissingConstraints">

<EditText
android:id="@+id/app_list_options_searcher"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_marginLeft="15dp"
android:layout_marginTop="10dp"
android:layout_marginRight="15dp"
android:hint="searcher"
android:inputType="text"
android:textSize="15sp" />
<Button
android:id="@+id/app_list_options_searcher_submit"
android:layout_width="wrap_content"
android:layout_height="25dp"
android:drawableLeft="@android:drawable/ic_menu_search"
android:background="@drawable/search_buttom"/>
</LinearLayout>

<!-- android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"
-->

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/app_list_options"
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,16 @@

<color name="default_background">#3DDCA4</color>


<!-- <color name="md_blue_grey_50">#59a5f5</color>
<color name="md_blue_grey_100">#59a5f5;</color>
<color name="md_blue_grey_200">#c8ffff;</color>
<color name="md_blue_grey_300">#00BFFF</color>
<color name="md_blue_grey_400">#00619a</color>
<color name="md_blue_grey_500">#333333</color>
<color name="md_blue_grey_600">#5c5c5c</color>
<color name="md_blue_grey_700">#FFFFFF</color>
<color name="md_blue_grey_800">#f5f5f5</color>
<color name="md_blue_grey_900">#cccccc</color>-->

</resources>

0 comments on commit 75a12c2

Please sign in to comment.