From c3765d4266fd45e5a283999bf64a94ce88ed1828 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 20 May 2021 14:22:37 +0800 Subject: [PATCH] [app] Fix race condition (#636) --- .../org/lsposed/manager/adapters/ScopeAdapter.java | 12 +++++++----- .../lsposed/manager/ui/activity/ModulesActivity.java | 10 ++++++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java index e0f46ffe..2b5ce3a9 100644 --- a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java @@ -86,6 +86,7 @@ import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.concurrent.ConcurrentLinkedQueue; import rikka.core.res.ResourcesKt; import rikka.widget.switchbar.SwitchBar; @@ -104,7 +105,7 @@ public class ScopeAdapter extends RecyclerView.Adapter private final HashSet recommendedList = new HashSet<>(); private final HashSet checkedList = new HashSet<>(); - private final List searchList = new ArrayList<>(); + private final ConcurrentLinkedQueue searchList = new ConcurrentLinkedQueue<>(); private final List showList = new ArrayList<>(); private final SwitchBar.OnCheckedChangeListener switchBarOnCheckedChangeListener = new SwitchBar.OnCheckedChangeListener() { @@ -504,8 +505,7 @@ public class ScopeAdapter extends RecyclerView.Adapter List appList = AppHelper.getAppList((Boolean) msg.obj); checkedList.clear(); recommendedList.clear(); - searchList.clear(); - + var tmpList = new ArrayList(); checkedList.addAll(ConfigManager.getModuleScope(module.packageName)); HashSet installedList = new HashSet<>(); List scopeList = module.getScopeList(); @@ -537,13 +537,15 @@ public class ScopeAdapter extends RecyclerView.Adapter appInfo.application = application; appInfo.packageName = info.packageName; appInfo.applicationInfo = info.applicationInfo; - searchList.add(appInfo); + tmpList.add(appInfo); } checkedList.retainAll(installedList); if (emptyCheckedList) { ConfigManager.setModuleScope(module.packageName, checkedList); } - sortApps(searchList); + sortApps(tmpList); + searchList.clear(); + searchList.addAll(tmpList); synchronized (dataReadyRunnable) { synchronized (this) { refreshing = false; diff --git a/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java b/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java index 8bcd2410..9652cac8 100644 --- a/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java +++ b/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java @@ -87,6 +87,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -403,7 +404,7 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi } private class ModuleAdapter extends EmptyStateRecyclerView.EmptyStateAdapter implements Filterable { - private final List searchList = new ArrayList<>(); + private final ConcurrentLinkedQueue searchList = new ConcurrentLinkedQueue<>(); private final List showList = new ArrayList<>(); private final int userId; private final UserHandle userHandle; @@ -578,10 +579,9 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi private final Runnable reloadModules = new Runnable() { public void run() { - searchList.clear(); - searchList.addAll(moduleUtil.getModules().values().stream().filter(module -> module.userId == userId).filter(customFilter).collect(Collectors.toList())); + var tmpList = moduleUtil.getModules().values().stream().filter(module -> module.userId == userId).filter(customFilter).collect(Collectors.toCollection(ArrayList::new)); Comparator cmp = AppHelper.getAppListComparator(0, pm); - searchList.sort((a, b) -> { + tmpList.sort((a, b) -> { boolean aChecked = moduleUtil.isModuleEnabled(a.packageName); boolean bChecked = moduleUtil.isModuleEnabled(b.packageName); if (aChecked == bChecked) { @@ -592,6 +592,8 @@ public class ModulesActivity extends BaseActivity implements ModuleUtil.ModuleLi return 1; } }); + searchList.clear(); + searchList.addAll(tmpList); String queryStr = searchView != null ? searchView.getQuery().toString() : ""; runOnUiThread(() -> getFilter().filter(queryStr)); }