From 59b6c9db765a7df542d8e8c4a08565dea76d1a94 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Fri, 31 Oct 2025 10:09:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=B9=E6=B3=95=E5=90=8D?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E6=8E=89=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../dialer/activity/app/AppListViewModel.java | 16 ++-- .../dialer/activity/main/MainActivity.java | 2 +- .../dialer/activity/main/MainViewModel.java | 91 ------------------- .../java/com/ttstd/dialer/db/app/AppDao.java | 2 +- .../ttstd/dialer/db/app/AppRepository.java | 22 ++--- .../com/ttstd/dialer/manager/AppManager.java | 29 ++++-- 7 files changed, 41 insertions(+), 123 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 98d686f..42772af 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,7 +23,7 @@ android { ndk { //根据需要 自行选择添加的对应cpu类型的.so库。 abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' - // 还可以添加 'x86', 'x86_64', 'mips', 'mips64' + // 还可以添加 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64' } lintOptions { diff --git a/app/src/main/java/com/ttstd/dialer/activity/app/AppListViewModel.java b/app/src/main/java/com/ttstd/dialer/activity/app/AppListViewModel.java index dfd27ac..9b591d5 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/app/AppListViewModel.java +++ b/app/src/main/java/com/ttstd/dialer/activity/app/AppListViewModel.java @@ -10,9 +10,9 @@ import androidx.lifecycle.MutableLiveData; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; import com.ttstd.dialer.base.mvvm.BaseViewModel; +import com.ttstd.dialer.databinding.ActivityAppListBinding; import com.ttstd.dialer.db.app.AppRepository; import com.ttstd.dialer.db.app.DesktopSortApp; -import com.ttstd.dialer.databinding.ActivityAppListBinding; import com.ttstd.dialer.utils.ApkUtils; import java.text.Collator; @@ -43,35 +43,35 @@ public class AppListViewModel extends BaseViewModel> mDesktopSortAppData = new MutableLiveData<>(); - public void getDbAppList(){ + public void getDbAppList() { Observable.fromCallable(new Callable>() { @Override public List call() throws Exception { - return mAppRepository.getAllContacts(); + return mAppRepository.getAllApp(); } - }) .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + }).compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer>() { @Override public void onSubscribe(@NonNull Disposable d) { - Log.e("getDbAppList", "onSubscribe: " ); + Log.e("getDbAppList", "onSubscribe: "); } @Override public void onNext(@NonNull List desktopSortApps) { - Log.e("getDbAppList", "onNext: "+desktopSortApps ); + Log.e("getDbAppList", "onNext: " + desktopSortApps); mDesktopSortAppData.setValue(desktopSortApps); } @Override public void onError(@NonNull Throwable e) { - Log.e("getDbAppList", "onError: " +e.getMessage()); + Log.e("getDbAppList", "onError: " + e.getMessage()); } @Override public void onComplete() { - Log.e("getDbAppList", "onComplete: " ); + Log.e("getDbAppList", "onComplete: "); } }); diff --git a/app/src/main/java/com/ttstd/dialer/activity/main/MainActivity.java b/app/src/main/java/com/ttstd/dialer/activity/main/MainActivity.java index 3bac6dd..16bcece 100644 --- a/app/src/main/java/com/ttstd/dialer/activity/main/MainActivity.java +++ b/app/src/main/java/com/ttstd/dialer/activity/main/MainActivity.java @@ -102,7 +102,7 @@ public class MainActivity extends BaseMvvmActivity { private static final String TAG = "MainViewModel"; - private AppRepository mAppRepository; @Override @@ -40,73 +18,4 @@ public class MainViewModel extends BaseViewModel>() { - @Override - public List call() throws Exception { - return ApkUtils.getAllLauncherResolveInfo(getSafeContext()); - } - }) - .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) - .subscribeOn(Schedulers.io()) - .map(new Function, List>() { - @Override - public List apply(List resolveInfos) throws Throwable { - List componentNames = resolveInfos.stream().map(new java.util.function.Function() { - @Override - public ComponentName apply(ResolveInfo resolveInfo) { - String packageName = resolveInfo.activityInfo.packageName; - String className = resolveInfo.activityInfo.name; - ComponentName componentName = new ComponentName(packageName, className); - return componentName; - } - }).collect(Collectors.toList()); - return componentNames; - } - }) - .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) - .subscribeOn(Schedulers.io()) - .map(new Function, List>() { - @Override - public List apply(List componentNames) throws Throwable { - List desktopSortApps = componentNames.stream().map(new java.util.function.Function() { - @Override - public DesktopSortApp apply(ComponentName componentName) { - DesktopSortApp desktopSortApp = new DesktopSortApp(getSafeContext(), componentName); - return desktopSortApp; - } - }).sorted(new Comparator() { - @Override - public int compare(DesktopSortApp o1, DesktopSortApp o2) { - return Collator.getInstance(Locale.CHINESE).compare(o1.getLabel(), o2.getLabel()); - } - }).collect(Collectors.toList()); - return desktopSortApps; - } - }) - .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - - } - - @Override - public void onNext(@NonNull List desktopSortApps) { - Log.e(TAG, "getLauncherAppList" + "onNext: " + desktopSortApps); - } - - @Override - public void onError(@NonNull Throwable e) { - - } - - @Override - public void onComplete() { - - } - }); - } } diff --git a/app/src/main/java/com/ttstd/dialer/db/app/AppDao.java b/app/src/main/java/com/ttstd/dialer/db/app/AppDao.java index 049ff76..24b1601 100644 --- a/app/src/main/java/com/ttstd/dialer/db/app/AppDao.java +++ b/app/src/main/java/com/ttstd/dialer/db/app/AppDao.java @@ -32,7 +32,7 @@ public interface AppDao { long insert(DesktopSortApp desktopSortApp); @Insert - long[] insert(List contacts); + long[] insert(List desktopSortApps); @Update Integer update(DesktopSortApp desktopSortApp); diff --git a/app/src/main/java/com/ttstd/dialer/db/app/AppRepository.java b/app/src/main/java/com/ttstd/dialer/db/app/AppRepository.java index 699d22f..517ab89 100644 --- a/app/src/main/java/com/ttstd/dialer/db/app/AppRepository.java +++ b/app/src/main/java/com/ttstd/dialer/db/app/AppRepository.java @@ -33,37 +33,37 @@ public class AppRepository { } // 获取所有APP - public List getAllContacts() { + public List getAllApp() { return mAppDao.getAllApp(); } // 根据ID获取APP - public DesktopSortApp getContactById(int id) { + public DesktopSortApp getAppById(int id) { return mAppDao.getAppById(id); } // 搜索APP - public List searchContacts(String query) { + public List searchApp(String query) { return mAppDao.searchApp("%" + query + "%"); } // 添加APP - public long insert(DesktopSortApp contact) { - return mAppDao.insert(contact); + public long insert(DesktopSortApp desktopSortApp) { + return mAppDao.insert(desktopSortApp); } - public long[] insert(List contacts) { - return mAppDao.insert(contacts); + public long[] insert(List desktopSortApps) { + return mAppDao.insert(desktopSortApps); } // 更新APP - public int update(DesktopSortApp contact) { - return mAppDao.update(contact); + public int update(DesktopSortApp desktopSortApp) { + return mAppDao.update(desktopSortApp); } // 删除APP - public int delete(DesktopSortApp contact) { - return mAppDao.delete(contact); + public int delete(DesktopSortApp desktopSortApp) { + return mAppDao.delete(desktopSortApp); } // 根据ID删除APP diff --git a/app/src/main/java/com/ttstd/dialer/manager/AppManager.java b/app/src/main/java/com/ttstd/dialer/manager/AppManager.java index fee2faa..d25cbe1 100644 --- a/app/src/main/java/com/ttstd/dialer/manager/AppManager.java +++ b/app/src/main/java/com/ttstd/dialer/manager/AppManager.java @@ -23,7 +23,9 @@ import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Consumer; @@ -32,19 +34,31 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.IntStream; - public class AppManager { + private static final String TAG = "AppManager"; + + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + @SuppressLint("StaticFieldLeak") private static AppManager INSTANCE; private Context mContext; private AppRepository mAppRepository; - private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + private Set mProgressCallbacks = new CopyOnWriteArraySet<>(); private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4)); private static final ExecutorService ASYNC_EXECUTOR = Executors.newFixedThreadPool(CORE_POOL_SIZE); + public interface ProgressCallback { + void onProgress(String step, int current, int total); + + void onCompleted(boolean success, String message); + } + + public void addProgressCallback(ProgressCallback progressCallback) { + mProgressCallbacks.add(progressCallback); + } public static final List DEFAULT_APP_PACKAGES = new ArrayList() {{ this.add("com.android.settings"); @@ -74,11 +88,6 @@ public class AppManager { executeAppListProcessing(); } - public interface ProgressCallback { - void onProgress(String step, int current, int total); - - void onCompleted(boolean success, String message); - } // 异步执行方法 public void executeAppListProcessing() { @@ -107,7 +116,7 @@ public class AppManager { // 第一步:获取所有桌面应用(增加空值安全处理) private List getAllDesktopSortApps() { try { - List result = mAppRepository.getAllContacts(); + List result = mAppRepository.getAllApp(); return result != null ? result : Collections.emptyList(); } catch (Exception e) { Log.e("AppListProcessor", "获取桌面应用列表失败", e); @@ -117,7 +126,7 @@ public class AppManager { private Optional> getAllDesktopSortAppsSafe() { try { - return Optional.ofNullable(mAppRepository.getAllContacts()) + return Optional.ofNullable(mAppRepository.getAllApp()) .filter(list -> !list.isEmpty()); } catch (Exception e) { Log.e("AppListProcessor", "获取应用列表失败", e); @@ -286,7 +295,7 @@ public class AppManager { } public void getAllApp() { - List desktopSortApps = mAppRepository.getAllContacts(); + List desktopSortApps = mAppRepository.getAllApp(); List ids = desktopSortApps.stream().filter(new Predicate() { @Override public boolean test(DesktopSortApp desktopSortApp) {