Skip to content

Commit a3e5c4f

Browse files
committed
[Refactor] Fix filtering apps with options that take no value
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
1 parent 6cfe6b9 commit a3e5c4f

9 files changed

Lines changed: 32 additions & 30 deletions

File tree

app/src/main/java/io/github/muntashirakon/AppManager/filters/FilterItem.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import androidx.annotation.NonNull;
1010
import androidx.annotation.Nullable;
1111
import androidx.collection.ArrayMap;
12+
import androidx.core.os.ParcelCompat;
1213

1314
import org.json.JSONArray;
1415
import org.json.JSONException;
@@ -176,16 +177,16 @@ public FilterOption getFilterOptionForId(int id) {
176177
return mFilterOptions.get(id);
177178
}
178179

179-
public List<FilteredItemInfo> getFilteredList(@NonNull List<IFilterableAppInfo> allFilterableAppInfo) {
180-
List<FilteredItemInfo> filteredFilterableAppInfo = new ArrayList<>();
180+
public <T extends IFilterableAppInfo> List<FilteredItemInfo<T>> getFilteredList(@NonNull List<T> allFilterableAppInfo) {
181+
List<FilteredItemInfo<T>> filteredFilterableAppInfo = new ArrayList<>();
181182
ExprEvaluator evaluator = new ExprEvaluator(mFilterOptions);
182183
String expr = TextUtils.isEmpty(mExpr) ? "true" : mExpr;
183-
for (IFilterableAppInfo info : allFilterableAppInfo) {
184+
for (T info : allFilterableAppInfo) {
184185
evaluator.setInfo(info);
185186
boolean eval = evaluator.evaluate(expr);
186187
FilterOption.TestResult result = Objects.requireNonNull(evaluator.getResult());
187188
if (eval) {
188-
filteredFilterableAppInfo.add(new FilteredItemInfo(info, result));
189+
filteredFilterableAppInfo.add(new FilteredItemInfo<>(info, result));
189190
}
190191
}
191192
return filteredFilterableAppInfo;
@@ -194,15 +195,15 @@ public List<FilteredItemInfo> getFilteredList(@NonNull List<IFilterableAppInfo>
194195
public FilterItem(@NonNull Parcel in) {
195196
mName = Objects.requireNonNull(in.readString());
196197
mExpr = Objects.requireNonNull(in.readString());
197-
mCustomExpr = in.readBoolean();
198+
mCustomExpr = ParcelCompat.readBoolean(in);
198199
mFilterOptions = ParcelUtils.readArrayMap(in, Integer.class.getClassLoader(), FilterOption.class.getClassLoader());
199200
}
200201

201202
@Override
202203
public void writeToParcel(@NonNull Parcel dest, int flags) {
203204
dest.writeString(mName);
204205
dest.writeString(mExpr);
205-
dest.writeBoolean(mCustomExpr);
206+
ParcelCompat.writeBoolean(dest, mCustomExpr);
206207
ParcelUtils.writeMap(mFilterOptions, dest);
207208
}
208209

@@ -262,11 +263,11 @@ private int getNextId() {
262263
return mNextId;
263264
}
264265

265-
public static class FilteredItemInfo {
266-
public final IFilterableAppInfo info;
266+
public static class FilteredItemInfo<T extends IFilterableAppInfo> {
267+
public final T info;
267268
public final FilterOption.TestResult result;
268269

269-
FilteredItemInfo(IFilterableAppInfo info, FilterOption.TestResult result) {
270+
FilteredItemInfo(T info, FilterOption.TestResult result) {
270271
this.info = info;
271272
this.result = result;
272273
}

app/src/main/java/io/github/muntashirakon/AppManager/filters/FilterableAppInfo.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.LinkedHashMap;
3333
import java.util.List;
3434
import java.util.Map;
35+
import java.util.Objects;
3536
import java.util.Set;
3637

3738
import aosp.libcore.util.EmptyArray;
@@ -82,15 +83,17 @@ public class FilterableAppInfo implements IFilterableAppInfo {
8283
private List<AppOpsManagerCompat.OpEntry> mAppOpEntries;
8384
@Nullable
8485
private PackageSizeInfo mPackageSizeInfo;
86+
@Nullable
8587
private AppUsageStatsManager.DataUsage mDataUsage;
88+
@Nullable
8689
private DebloatObject mBloatwareInfo;
8790
private Integer mFreezeFlags = null;
8891
private Integer mAppTypeFlags = null;
8992

9093
public FilterableAppInfo(@NonNull PackageInfo packageInfo, @Nullable PackageUsageInfo packageUsageInfo) {
9194
mPackageInfo = packageInfo;
9295
mPackageUsageInfo = packageUsageInfo;
93-
mApplicationInfo = packageInfo.applicationInfo;
96+
mApplicationInfo = Objects.requireNonNull(packageInfo.applicationInfo);
9497
mUserId = UserHandleHidden.getUserId(mApplicationInfo.uid);
9598
mPm = ContextUtils.getContext().getPackageManager();
9699
}

app/src/main/java/io/github/muntashirakon/AppManager/filters/FilteringUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
public final class FilteringUtils {
3232
@NonNull
3333
@WorkerThread
34-
public static List<IFilterableAppInfo> loadFilterableAppInfo(@NonNull int[] userIds) {
35-
List<IFilterableAppInfo> filterableAppInfoList = new ArrayList<>();
34+
public static List<FilterableAppInfo> loadFilterableAppInfo(@NonNull int[] userIds) {
35+
List<FilterableAppInfo> filterableAppInfoList = new ArrayList<>();
3636
boolean hasUsageAccess = FeatureController.isUsageAccessEnabled() && SelfPermissions.checkUsageStatsPermission();
3737
for (int userId : userIds) {
3838
if (ThreadUtils.isInterrupted()) return Collections.emptyList();

app/src/main/java/io/github/muntashirakon/AppManager/filters/FinderAdapter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
import io.github.muntashirakon.util.AdapterUtils;
2525

2626
public class FinderAdapter extends RecyclerView.Adapter<FinderAdapter.ViewHolder> {
27-
private final List<FilterItem.FilteredItemInfo> mAdapterList = new ArrayList<>();
27+
private final List<FilterItem.FilteredItemInfo<FilterableAppInfo>> mAdapterList = new ArrayList<>();
2828

2929
@UiThread
30-
public void setDefaultList(List<FilterItem.FilteredItemInfo> list) {
30+
public void setDefaultList(List<FilterItem.FilteredItemInfo<FilterableAppInfo>> list) {
3131
synchronized (mAdapterList) {
3232
AdapterUtils.notifyDataSetChanged(this, mAdapterList, list);
3333
}
@@ -42,11 +42,11 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
4242

4343
@Override
4444
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
45-
FilterItem.FilteredItemInfo itemInfo;
45+
FilterItem.FilteredItemInfo<FilterableAppInfo> itemInfo;
4646
synchronized (mAdapterList) {
4747
itemInfo = mAdapterList.get(position);
4848
}
49-
FilterableAppInfo appInfo = (FilterableAppInfo) itemInfo.info;
49+
FilterableAppInfo appInfo = itemInfo.info;
5050
ImageLoader.getInstance().displayImage(appInfo.getPackageName(), appInfo.getApplicationInfo(), holder.icon);
5151
holder.label.setText(appInfo.getAppLabel());
5252
holder.pkg.setText(appInfo.getPackageName());

app/src/main/java/io/github/muntashirakon/AppManager/filters/FinderViewModel.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ public class FinderViewModel extends AndroidViewModel {
2121
public static final String TAG = FinderViewModel.class.getSimpleName();
2222

2323
private final MutableLiveData<Long> mLastUpdateTimeLiveData = new MutableLiveData<>();
24-
private final MutableLiveData<List<FilterItem.FilteredItemInfo>> mFilteredAppListLiveData = new MutableLiveData<>();
24+
private final MutableLiveData<List<FilterItem.FilteredItemInfo<FilterableAppInfo>>> mFilteredAppListLiveData = new MutableLiveData<>();
2525
private Future<?> mAppListLoaderFuture;
2626
@Nullable
27-
private List<IFilterableAppInfo> mFilterableAppInfoList;
27+
private List<FilterableAppInfo> mFilterableAppInfoList;
2828
@NotNull
2929
private final FilterItem mFilterItem = new FilterItem();
3030

@@ -41,7 +41,7 @@ public MutableLiveData<Long> getLastUpdateTimeLiveData() {
4141
return mLastUpdateTimeLiveData;
4242
}
4343

44-
public MutableLiveData<List<FilterItem.FilteredItemInfo>> getFilteredAppListLiveData() {
44+
public MutableLiveData<List<FilterItem.FilteredItemInfo<FilterableAppInfo>>> getFilteredAppListLiveData() {
4545
return mFilteredAppListLiveData;
4646
}
4747

app/src/main/java/io/github/muntashirakon/AppManager/filters/options/AppTypeOption.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public Map<Integer, CharSequence> getFlags(@NonNull String key) {
9494
@NonNull
9595
@Override
9696
public TestResult test(@NonNull IFilterableAppInfo info, @NonNull TestResult result) {
97+
// TODO: 7/28/25 Make it more efficient by doing this on demand
9798
int appTypeFlags = info.getAppTypeFlags();
9899
switch (key) {
99100
case KEY_ALL:

app/src/main/java/io/github/muntashirakon/AppManager/filters/options/FilterOption.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,6 @@ public FilterOption[] newArray(int size) {
195195

196196
@Nullable
197197
public JSONObject toJson() throws JSONException {
198-
if (value == null) {
199-
return null;
200-
}
201198
JSONObject object = new JSONObject();
202199
object.put("type", type);
203200
object.put("id", id);

app/src/main/java/io/github/muntashirakon/AppManager/profiles/AppsProfileViewModel.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
import io.github.muntashirakon.AppManager.compat.AppOpsManagerCompat;
4444
import io.github.muntashirakon.AppManager.compat.PackageManagerCompat;
4545
import io.github.muntashirakon.AppManager.filters.FilterItem;
46+
import io.github.muntashirakon.AppManager.filters.FilterableAppInfo;
4647
import io.github.muntashirakon.AppManager.filters.FilteringUtils;
47-
import io.github.muntashirakon.AppManager.filters.IFilterableAppInfo;
4848
import io.github.muntashirakon.AppManager.logs.Log;
4949
import io.github.muntashirakon.AppManager.profiles.struct.AppsBaseProfile;
5050
import io.github.muntashirakon.AppManager.profiles.struct.AppsFilterProfile;
@@ -457,17 +457,17 @@ private ArrayList<AppsFragment.AppsFragmentItem> loadAppsPackages(@NonNull AppsP
457457
return items;
458458
}
459459

460-
List<IFilterableAppInfo> mFilterableAppInfoList;
460+
List<FilterableAppInfo> mFilterableAppInfoList;
461461

462462
@NonNull
463463
private ArrayList<AppsFragment.AppsFragmentItem> loadAppsFilteredPackages(@NonNull AppsFilterProfile profile) {
464464
int[] users = profile.users != null ? profile.users : Users.getUsersIds();
465465
if (mFilterableAppInfoList == null) {
466466
mFilterableAppInfoList = FilteringUtils.loadFilterableAppInfo(users);
467467
}
468-
List<FilterItem.FilteredItemInfo> filteredItems = profile.getFilterItem().getFilteredList(mFilterableAppInfoList);
468+
List<FilterItem.FilteredItemInfo<FilterableAppInfo>> filteredItems = profile.getFilterItem().getFilteredList(mFilterableAppInfoList);
469469
ArrayList<AppsFragment.AppsFragmentItem> items = new ArrayList<>(filteredItems.size());
470-
for (FilterItem.FilteredItemInfo itemInfo : filteredItems) {
470+
for (FilterItem.FilteredItemInfo<FilterableAppInfo> itemInfo : filteredItems) {
471471
AppsFragment.AppsFragmentItem item = new AppsFragment.AppsFragmentItem(itemInfo.info.getPackageName());
472472
item.label = itemInfo.info.getAppLabel();
473473
item.filterableAppInfo = itemInfo.info;

app/src/main/java/io/github/muntashirakon/AppManager/profiles/struct/AppsFilterProfile.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import java.util.List;
1313

1414
import io.github.muntashirakon.AppManager.filters.FilterItem;
15+
import io.github.muntashirakon.AppManager.filters.FilterableAppInfo;
1516
import io.github.muntashirakon.AppManager.filters.FilteringUtils;
16-
import io.github.muntashirakon.AppManager.filters.IFilterableAppInfo;
1717
import io.github.muntashirakon.AppManager.history.JsonDeserializer;
1818
import io.github.muntashirakon.AppManager.profiles.ProfileLogger;
1919
import io.github.muntashirakon.AppManager.progress.ProgressHandler;
@@ -46,8 +46,8 @@ public FilterItem getFilterItem() {
4646
public ProfileApplierResult apply(@NonNull String state, @Nullable ProfileLogger logger, @Nullable ProgressHandler progressHandler) {
4747
// Filter results
4848
int[] users = this.users == null ? Users.getUsersIds() : this.users;
49-
List<IFilterableAppInfo> filterableAppInfoList = FilteringUtils.loadFilterableAppInfo(users);
50-
List<FilterItem.FilteredItemInfo> filteredList = mFilterItem.getFilteredList(filterableAppInfoList);
49+
List<FilterableAppInfo> filterableAppInfoList = FilteringUtils.loadFilterableAppInfo(users);
50+
List<FilterItem.FilteredItemInfo<FilterableAppInfo>> filteredList = mFilterItem.getFilteredList(filterableAppInfoList);
5151
if (filteredList.isEmpty()) {
5252
return ProfileApplierResult.EMPTY_RESULT;
5353
}
@@ -57,7 +57,7 @@ public ProfileApplierResult apply(@NonNull String state, @Nullable ProfileLogger
5757
logger.println("====> Filtered packages: " + filteredList.size());
5858
}
5959
StringBuilder sb = new StringBuilder();
60-
for (FilterItem.FilteredItemInfo info : filteredList) {
60+
for (FilterItem.FilteredItemInfo<FilterableAppInfo> info : filteredList) {
6161
packages.add(info.info.getPackageName());
6262
assocUsers.add(info.info.getUserId());
6363
sb.append("(").append(info.info.getPackageName()).append(", ")

0 commit comments

Comments
 (0)