From bf5f73e07a2e407e4a9f2bd64bf4752cf685db79 Mon Sep 17 00:00:00 2001 From: Mahdi Karzari <76250959+QM4RS@users.noreply.github.com> Date: Mon, 20 Jul 2026 03:13:43 +0330 Subject: [PATCH] refactor: remove legacy BlackBox app shell --- Bcore/src/main/cpp/Utils/AntiDetection.cpp | 2 +- .../top/niunaijun/blackbox/BlackBoxCore.java | 8 +- .../fake/frameworks/BPackageManager.java | 4 +- .../fake/service/IActivityManagerProxy.java | 4 +- .../service/IDevicePolicyManagerProxy.java | 4 +- .../fake/service/IUserManagerProxy.java | 4 +- .../fake/service/IWifiManagerProxy.java | 2 +- .../blackbox/fake/service/WebViewProxy.java | 4 +- .../blackbox/proxy/ProxyVpnService.java | 14 +- Docs.md | 522 ----------------- README.md | 11 +- RELEASE_NOTES.md | 106 ---- app/build.gradle | 34 +- app/libs/StateView-v3.0.6.aar | Bin 18333 -> 0 bytes app/libs/catloading-release.aar | Bin 27568 -> 0 bytes app/libs/floatingview-release.aar | Bin 59981 -> 0 bytes app/src/main/AndroidManifest.xml | 30 +- .../qm4rs}/fridabox/ApkInspector.java | 2 +- .../qm4rs}/fridabox/ApkIntegrity.java | 2 +- .../qm4rs}/fridabox/FridaBoxActivity.kt | 6 +- .../com/qm4rs/fridabox/FridaBoxApplication.kt | 36 ++ .../com/qm4rs/fridabox/FridaBoxRuntime.kt | 66 +++ .../InstrumentationPreferenceParser.java | 2 +- .../java/top/niunaijun/blackboxa/app/App.kt | 73 --- .../top/niunaijun/blackboxa/app/AppManager.kt | 71 --- .../rocker/BaseActivityLifecycleCallback.kt | 31 - .../blackboxa/app/rocker/RockerManager.kt | 226 ------- .../top/niunaijun/blackboxa/bean/AppInfo.kt | 6 - .../blackboxa/bean/FakeLocationBean.kt | 15 - .../top/niunaijun/blackboxa/bean/GmsBean.kt | 7 - .../blackboxa/bean/InstalledAppBean.kt | 6 - .../niunaijun/blackboxa/bean/XpModuleInfo.kt | 13 - .../biz/cache/AppSharedPreferenceDelegate.kt | 71 --- .../blackboxa/data/AppsRepository.kt | 509 ---------------- .../blackboxa/data/AppsSortCompon.kt | 17 - .../blackboxa/data/FakeLocationRepository.kt | 62 -- .../niunaijun/blackboxa/data/GmsRepository.kt | 65 --- .../niunaijun/blackboxa/util/ContextUtil.kt | 18 - .../niunaijun/blackboxa/util/InjectionUtil.kt | 40 -- .../niunaijun/blackboxa/util/MathUtil.java | 47 -- .../niunaijun/blackboxa/util/MemoryManager.kt | 128 ---- .../top/niunaijun/blackboxa/util/ResUtil.kt | 13 - .../niunaijun/blackboxa/util/Resolution.java | 237 -------- .../niunaijun/blackboxa/util/ShortcutUtil.kt | 77 --- .../top/niunaijun/blackboxa/util/ToastEx.kt | 23 - .../niunaijun/blackboxa/util/ViewBindingEx.kt | 36 -- .../blackboxa/view/apps/AppsAdapter.kt | 166 ------ .../blackboxa/view/apps/AppsFactory.kt | 14 - .../blackboxa/view/apps/AppsFragment.kt | 550 ------------------ .../blackboxa/view/apps/AppsTouchCallBack.kt | 105 ---- .../blackboxa/view/apps/AppsViewModel.kt | 81 --- .../blackboxa/view/base/BaseActivity.kt | 28 - .../blackboxa/view/base/BaseViewModel.kt | 29 - .../blackboxa/view/base/LoadingActivity.kt | 38 -- .../view/fake/FakeLocationAdapter.kt | 38 -- .../view/fake/FakeLocationFactory.kt | 14 - .../view/fake/FakeLocationViewModel.kt | 33 -- .../view/fake/FakeManagerActivity.kt | 184 ------ .../view/fake/FollowMyLocationOverlay.kt | 139 ----- .../blackboxa/view/gms/GmsAdapter.kt | 32 - .../blackboxa/view/gms/GmsFactory.kt | 13 - .../blackboxa/view/gms/GmsManagerActivity.kt | 128 ---- .../blackboxa/view/gms/GmsViewModel.kt | 33 -- .../blackboxa/view/list/ListActivity.kt | 157 ----- .../blackboxa/view/list/ListAdapter.kt | 33 -- .../blackboxa/view/list/ListFactory.kt | 14 - .../blackboxa/view/list/ListViewModel.kt | 22 - .../blackboxa/view/main/BlackBoxLoader.kt | 318 ---------- .../blackboxa/view/main/MainActivity.kt | 434 -------------- .../blackboxa/view/main/ShortcutActivity.kt | 23 - .../blackboxa/view/main/ViewPagerAdapter.kt | 27 - .../blackboxa/view/main/WelcomeActivity.kt | 34 -- .../blackboxa/view/setting/SettingActivity.kt | 32 - .../blackboxa/view/setting/SettingFragment.kt | 111 ---- .../niunaijun/blackboxa/widget/EnFloatView.kt | 52 -- .../blackboxa/widget/RockerView.java | 441 -------------- app/src/main/res/drawable-anydpi/ic_add.xml | 11 - .../drawable-anydpi/ic_location_change.xml | 11 - .../main/res/drawable-anydpi/ic_search.xml | 11 - app/src/main/res/drawable-hdpi/ic_add.png | Bin 148 -> 0 bytes .../res/drawable-hdpi/ic_location_change.png | Bin 500 -> 0 bytes app/src/main/res/drawable-hdpi/ic_search.png | Bin 347 -> 0 bytes app/src/main/res/drawable-mdpi/ic_add.png | Bin 101 -> 0 bytes .../res/drawable-mdpi/ic_location_change.png | Bin 325 -> 0 bytes app/src/main/res/drawable-mdpi/ic_search.png | Bin 201 -> 0 bytes .../drawable-v24/ic_launcher_foreground.xml | 30 - app/src/main/res/drawable-xhdpi/ic_add.png | Bin 127 -> 0 bytes .../res/drawable-xhdpi/ic_location_change.png | Bin 635 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_search.png | Bin 368 -> 0 bytes app/src/main/res/drawable-xxhdpi/ic_add.png | Bin 164 -> 0 bytes .../drawable-xxhdpi/ic_location_change.png | Bin 999 -> 0 bytes .../main/res/drawable-xxhdpi/ic_search.png | Bin 579 -> 0 bytes app/src/main/res/drawable/ic_empty.xml | 180 ------ .../res/drawable/ic_launcher_background.xml | 170 ------ app/src/main/res/drawable/splash.xml | 14 - app/src/main/res/layout/activity_gms.xml | 22 - app/src/main/res/layout/activity_list.xml | 44 -- app/src/main/res/layout/activity_main.xml | 60 -- app/src/main/res/layout/activity_osmdroid.xml | 11 - app/src/main/res/layout/activity_setting.xml | 22 - app/src/main/res/layout/activity_xp.xml | 38 -- app/src/main/res/layout/base_empty.xml | 18 - app/src/main/res/layout/fragment_apps.xml | 17 - app/src/main/res/layout/item_app.xml | 42 -- app/src/main/res/layout/item_fake.xml | 53 -- app/src/main/res/layout/item_gms.xml | 26 - app/src/main/res/layout/item_package.xml | 54 -- app/src/main/res/layout/item_viewpager.xml | 9 - app/src/main/res/layout/item_xp.xml | 56 -- app/src/main/res/layout/view_float_rocker.xml | 22 - app/src/main/res/layout/view_switch.xml | 8 - app/src/main/res/layout/view_toolbar.xml | 14 - app/src/main/res/menu/app_menu.xml | 10 - app/src/main/res/menu/menu_list.xml | 17 - app/src/main/res/menu/menu_main.xml | 25 - app/src/main/res/menu/menu_search.xml | 10 - app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3200 -> 0 bytes .../main/res/mipmap-hdpi/ic_launcher_beta.png | Bin 3847 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 3934 -> 0 bytes .../mipmap-hdpi/ic_launcher_round_beta.png | Bin 4731 -> 0 bytes app/src/main/res/mipmap-ldpi/ic_launcher.png | Bin 1882 -> 0 bytes .../main/res/mipmap-ldpi/ic_launcher_beta.png | Bin 2179 -> 0 bytes .../res/mipmap-ldpi/ic_launcher_round.png | Bin 2266 -> 0 bytes .../mipmap-ldpi/ic_launcher_round_beta.png | Bin 2545 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2720 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_beta.png | Bin 3167 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 3281 -> 0 bytes .../mipmap-mdpi/ic_launcher_round_beta.png | Bin 3706 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4551 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_beta.png | Bin 5408 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 5537 -> 0 bytes .../mipmap-xhdpi/ic_launcher_round_beta.png | Bin 6669 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7135 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_beta.png | Bin 8731 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 8656 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_round_beta.png | Bin 10597 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10000 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_beta.png | Bin 12530 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 12151 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_round_beta.png | Bin 15247 -> 0 bytes app/src/main/res/values-zh-rCN/strings.xml | 66 --- app/src/main/res/values-zh-rTW/strings.xml | 65 --- app/src/main/res/values/colors.xml | 10 - app/src/main/res/values/strings.xml | 70 --- app/src/main/res/values/themes.xml | 32 - .../main/res/xml/network_security_config.xml | 4 - app/src/main/res/xml/setting.xml | 41 -- .../qm4rs}/fridabox/ApkInspectorTest.java | 2 +- .../qm4rs}/fridabox/ApkIntegrityTest.java | 2 +- .../InstrumentationPreferenceParserTest.java | 2 +- docs/BASELINE.md | 4 +- docs/TEST_RESULTS.md | 29 +- docs/device-validation.log | 46 ++ settings.gradle | 2 +- 154 files changed, 217 insertions(+), 7140 deletions(-) delete mode 100644 Docs.md delete mode 100644 RELEASE_NOTES.md delete mode 100644 app/libs/StateView-v3.0.6.aar delete mode 100644 app/libs/catloading-release.aar delete mode 100644 app/libs/floatingview-release.aar rename app/src/main/java/{top/niunaijun/blackboxa => com/qm4rs}/fridabox/ApkInspector.java (97%) rename app/src/main/java/{top/niunaijun/blackboxa => com/qm4rs}/fridabox/ApkIntegrity.java (96%) rename app/src/main/java/{top/niunaijun/blackboxa => com/qm4rs}/fridabox/FridaBoxActivity.kt (99%) create mode 100644 app/src/main/java/com/qm4rs/fridabox/FridaBoxApplication.kt create mode 100644 app/src/main/java/com/qm4rs/fridabox/FridaBoxRuntime.kt rename app/src/main/java/{top/niunaijun/blackboxa => com/qm4rs}/fridabox/InstrumentationPreferenceParser.java (94%) delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/app/App.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/app/AppManager.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/app/rocker/BaseActivityLifecycleCallback.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/app/rocker/RockerManager.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/bean/AppInfo.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/bean/FakeLocationBean.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/bean/GmsBean.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/bean/InstalledAppBean.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/bean/XpModuleInfo.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/biz/cache/AppSharedPreferenceDelegate.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/data/AppsRepository.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/data/AppsSortCompon.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/data/FakeLocationRepository.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/data/GmsRepository.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/ContextUtil.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/InjectionUtil.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/MathUtil.java delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/MemoryManager.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/ResUtil.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/Resolution.java delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/ShortcutUtil.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/ToastEx.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/util/ViewBindingEx.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsAdapter.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsFactory.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsFragment.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsTouchCallBack.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsViewModel.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/base/BaseActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/base/BaseViewModel.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/base/LoadingActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationAdapter.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationFactory.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationViewModel.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeManagerActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/fake/FollowMyLocationOverlay.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsAdapter.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsFactory.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsManagerActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsViewModel.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/list/ListActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/list/ListAdapter.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/list/ListFactory.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/list/ListViewModel.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/main/BlackBoxLoader.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/main/MainActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/main/ShortcutActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/main/ViewPagerAdapter.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/main/WelcomeActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingActivity.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingFragment.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/widget/EnFloatView.kt delete mode 100644 app/src/main/java/top/niunaijun/blackboxa/widget/RockerView.java delete mode 100644 app/src/main/res/drawable-anydpi/ic_add.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_location_change.xml delete mode 100644 app/src/main/res/drawable-anydpi/ic_search.xml delete mode 100644 app/src/main/res/drawable-hdpi/ic_add.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_location_change.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_search.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_add.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_location_change.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_search.png delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 app/src/main/res/drawable-xhdpi/ic_add.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_location_change.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_search.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_add.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_location_change.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_search.png delete mode 100644 app/src/main/res/drawable/ic_empty.xml delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 app/src/main/res/drawable/splash.xml delete mode 100644 app/src/main/res/layout/activity_gms.xml delete mode 100644 app/src/main/res/layout/activity_list.xml delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_osmdroid.xml delete mode 100644 app/src/main/res/layout/activity_setting.xml delete mode 100644 app/src/main/res/layout/activity_xp.xml delete mode 100644 app/src/main/res/layout/base_empty.xml delete mode 100644 app/src/main/res/layout/fragment_apps.xml delete mode 100644 app/src/main/res/layout/item_app.xml delete mode 100644 app/src/main/res/layout/item_fake.xml delete mode 100644 app/src/main/res/layout/item_gms.xml delete mode 100644 app/src/main/res/layout/item_package.xml delete mode 100644 app/src/main/res/layout/item_viewpager.xml delete mode 100644 app/src/main/res/layout/item_xp.xml delete mode 100644 app/src/main/res/layout/view_float_rocker.xml delete mode 100644 app/src/main/res/layout/view_switch.xml delete mode 100644 app/src/main/res/layout/view_toolbar.xml delete mode 100644 app/src/main/res/menu/app_menu.xml delete mode 100644 app/src/main/res/menu/menu_list.xml delete mode 100644 app/src/main/res/menu/menu_main.xml delete mode 100644 app/src/main/res/menu/menu_search.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_beta.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round_beta.png delete mode 100644 app/src/main/res/mipmap-ldpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-ldpi/ic_launcher_beta.png delete mode 100644 app/src/main/res/mipmap-ldpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-ldpi/ic_launcher_round_beta.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_beta.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round_beta.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_beta.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round_beta.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_beta.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round_beta.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round_beta.png delete mode 100644 app/src/main/res/values-zh-rCN/strings.xml delete mode 100644 app/src/main/res/values-zh-rTW/strings.xml delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/themes.xml delete mode 100644 app/src/main/res/xml/network_security_config.xml delete mode 100644 app/src/main/res/xml/setting.xml rename app/src/test/java/{top/niunaijun/blackboxa => com/qm4rs}/fridabox/ApkInspectorTest.java (97%) rename app/src/test/java/{top/niunaijun/blackboxa => com/qm4rs}/fridabox/ApkIntegrityTest.java (90%) rename app/src/test/java/{top/niunaijun/blackboxa => com/qm4rs}/fridabox/InstrumentationPreferenceParserTest.java (94%) diff --git a/Bcore/src/main/cpp/Utils/AntiDetection.cpp b/Bcore/src/main/cpp/Utils/AntiDetection.cpp index 8065b2b..10b2bb7 100644 --- a/Bcore/src/main/cpp/Utils/AntiDetection.cpp +++ b/Bcore/src/main/cpp/Utils/AntiDetection.cpp @@ -53,7 +53,7 @@ static const char* blocked_files[] = { "/data/data/com.lbe.parallel", "/data/data/com.dual.dualspace", "/data/data/com.ludashi.superboost", - "/data/data/top.niunaijun.blackboxa", + "/data/data/com.qm4rs.fridabox", "/blackbox", "/virtual", diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/BlackBoxCore.java b/Bcore/src/main/java/top/niunaijun/blackbox/BlackBoxCore.java index 766bfae..8a5ec11 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/BlackBoxCore.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/BlackBoxCore.java @@ -1138,7 +1138,7 @@ public class BlackBoxCore extends ClientConfiguration { try { if (packageName.equals(getHostPkg())) { - return new InstallResult().installError("Cannot clone BlackBox app from within BlackBox. This would create infinite recursion and is not allowed for security reasons."); + return new InstallResult().installError("Cannot clone FridaBox from inside its own workspace. This would create infinite recursion and is not allowed for security reasons."); } PackageInfo packageInfo = getPackageManager().getPackageInfo(packageName, 0); @@ -1156,7 +1156,7 @@ public class BlackBoxCore extends ClientConfiguration { if (packageInfo != null) { String packageName = packageInfo.packageName; if (packageName.equals(getHostPkg())) { - return new InstallResult().installError("Cannot clone BlackBox app from within BlackBox. This would create infinite recursion and is not allowed for security reasons."); + return new InstallResult().installError("Cannot clone FridaBox from inside its own workspace. This would create infinite recursion and is not allowed for security reasons."); } } } catch (Exception e) { @@ -2126,7 +2126,7 @@ public class BlackBoxCore extends ClientConfiguration { } builder.setSmallIcon(android.R.drawable.stat_notify_error) - .setContentTitle("BlackBox Log Upload Failed") + .setContentTitle("FridaBox Log Upload Failed") .setContentText(error) .setAutoCancel(true); @@ -2157,7 +2157,7 @@ public class BlackBoxCore extends ClientConfiguration { } builder.setSmallIcon(android.R.drawable.stat_sys_upload_done) - .setContentTitle("BlackBox Log Upload") + .setContentTitle("FridaBox Log Upload") .setContentText("Logs sent successfully") .setAutoCancel(true); diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/fake/frameworks/BPackageManager.java b/Bcore/src/main/java/top/niunaijun/blackbox/fake/frameworks/BPackageManager.java index bfeaa90..e0c8782 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/fake/frameworks/BPackageManager.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/fake/frameworks/BPackageManager.java @@ -506,8 +506,8 @@ public class BPackageManager extends BlackManager { String packageName = packageInfo.packageName; String hostPackageName = BlackBoxCore.getHostPkg(); if (packageName.equals(hostPackageName)) { - Log.w(TAG, "Attempt to install BlackBox app detected and blocked: " + packageName); - return new InstallResult().installError("Cannot clone BlackBox app from within BlackBox. This would create infinite recursion and is not allowed for security reasons."); + Log.w(TAG, "Attempt to install the FridaBox host app was blocked: " + packageName); + return new InstallResult().installError("Cannot clone FridaBox from inside its own workspace. This would create infinite recursion and is not allowed for security reasons."); } } } catch (Exception e) { diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IActivityManagerProxy.java b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IActivityManagerProxy.java index 4f571d1..636fbc1 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IActivityManagerProxy.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IActivityManagerProxy.java @@ -768,8 +768,8 @@ public class IActivityManagerProxy extends ClassInvocationStub { public static class getCurrentUser extends MethodHook { @Override protected Object hook(Object who, Method method, Object[] args) throws Throwable { - Object blackBox = BRUserInfo.get()._new(BActivityThread.getUserId(), "BlackBox", BRUserInfo.get().FLAG_PRIMARY()); - return blackBox; + Object fridaBox = BRUserInfo.get()._new(BActivityThread.getUserId(), "FridaBox", BRUserInfo.get().FLAG_PRIMARY()); + return fridaBox; } } diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IDevicePolicyManagerProxy.java b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IDevicePolicyManagerProxy.java index 6489560..9d173a6 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IDevicePolicyManagerProxy.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IDevicePolicyManagerProxy.java @@ -57,7 +57,7 @@ public class IDevicePolicyManagerProxy extends BinderInvocationStub { @Override protected Object hook(Object who, Method method, Object[] args) throws Throwable { - return "BlackBox"; + return "FridaBox"; } } @@ -66,7 +66,7 @@ public class IDevicePolicyManagerProxy extends BinderInvocationStub { @Override protected Object hook(Object who, Method method, Object[] args) throws Throwable { - return "BlackBox"; + return "FridaBox"; } } diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IUserManagerProxy.java b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IUserManagerProxy.java index ccb30dd..55747c0 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IUserManagerProxy.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IUserManagerProxy.java @@ -48,8 +48,8 @@ public class IUserManagerProxy extends BinderInvocationStub { public static class GetProfileParent extends MethodHook { @Override protected Object hook(Object who, Method method, Object[] args) throws Throwable { - Object blackBox = BRUserInfo.get()._new(BActivityThread.getUserId(), "BlackBox", BRUserInfo.get().FLAG_PRIMARY()); - return blackBox; + Object fridaBox = BRUserInfo.get()._new(BActivityThread.getUserId(), "FridaBox", BRUserInfo.get().FLAG_PRIMARY()); + return fridaBox; } } diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IWifiManagerProxy.java b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IWifiManagerProxy.java index 2f1f81d..2b4ccbc 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IWifiManagerProxy.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/IWifiManagerProxy.java @@ -45,7 +45,7 @@ public class IWifiManagerProxy extends BinderInvocationStub { WifiInfo wifiInfo = (WifiInfo) method.invoke(who, args); BRWifiInfo.get(wifiInfo)._set_mBSSID("ac:62:5a:82:65:c4"); BRWifiInfo.get(wifiInfo)._set_mMacAddress("ac:62:5a:82:65:c4"); - BRWifiInfo.get(wifiInfo)._set_mWifiSsid(BRWifiSsid.get().createFromAsciiEncoded("BlackBox_Wifi")); + BRWifiInfo.get(wifiInfo)._set_mWifiSsid(BRWifiSsid.get().createFromAsciiEncoded("FridaBox_Wifi")); return wifiInfo; } diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/WebViewProxy.java b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/WebViewProxy.java index e356e0d..9dd88f0 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/WebViewProxy.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/fake/service/WebViewProxy.java @@ -139,9 +139,7 @@ public class WebViewProxy extends ClassInvocationStub { String userAgent = settings.getUserAgentString(); - if (userAgent != null && !userAgent.contains("BlackBox")) { - settings.setUserAgentString(userAgent + " BlackBox"); - } + // Keep the guest's original user-agent; host branding must not leak into it. try { diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/proxy/ProxyVpnService.java b/Bcore/src/main/java/top/niunaijun/blackbox/proxy/ProxyVpnService.java index 0a39e61..17f13b0 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/proxy/ProxyVpnService.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/proxy/ProxyVpnService.java @@ -15,7 +15,7 @@ import top.niunaijun.blackbox.utils.Slog; public class ProxyVpnService extends VpnService { private static final String TAG = "ProxyVpnService"; private static final int NOTIFICATION_ID = 1001; - private static final String CHANNEL_ID = "BlackBoxVPN"; + private static final String CHANNEL_ID = "FridaBoxVPN"; private ParcelFileDescriptor mVpnInterface = null; private boolean mIsEstablished = false; @@ -74,10 +74,10 @@ public class ProxyVpnService extends VpnService { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel( CHANNEL_ID, - "BlackBox VPN Service", + "FridaBox VPN Service", NotificationManager.IMPORTANCE_LOW ); - channel.setDescription("VPN service for BlackBox network access"); + channel.setDescription("VPN service for FridaBox network access"); channel.setShowBadge(false); NotificationManager notificationManager = getSystemService(NotificationManager.class); @@ -98,7 +98,7 @@ public class ProxyVpnService extends VpnService { } return builder - .setContentTitle("BlackBox VPN Active") + .setContentTitle("FridaBox VPN Active") .setContentText("Managing network access for sandboxed apps") .setSmallIcon(android.R.drawable.ic_dialog_info) .setOngoing(true) @@ -124,7 +124,7 @@ public class ProxyVpnService extends VpnService { Builder builder = new Builder(); - builder.setSession("BlackBox VPN"); + builder.setSession("FridaBox VPN"); builder.addAddress("10.0.0.2", 32); @@ -140,7 +140,7 @@ public class ProxyVpnService extends VpnService { builder.addAllowedApplication(getPackageName()); - builder.setSession("BlackBox Internet Access"); + builder.setSession("FridaBox Internet Access"); Slog.d(TAG, "VPN builder configured, establishing interface..."); @@ -210,7 +210,7 @@ public class ProxyVpnService extends VpnService { Slog.e(TAG, "Error in network monitoring: " + e.getMessage()); } } - }, "BlackBoxNetworkHandler"); + }, "FridaBoxNetworkHandler"); mNetworkThread.start(); Slog.d(TAG, "Network handling thread started"); diff --git a/Docs.md b/Docs.md deleted file mode 100644 index b7094b0..0000000 --- a/Docs.md +++ /dev/null @@ -1,522 +0,0 @@ -# BlackBox Virtual Environment - Complete User Guide - -## Table of Contents -1. [Overview](#overview) -2. [Installation & Setup](#installation--setup) -3. [App Management](#app-management) -4. [WebView & Browser Support](#webview--browser-support) -5. [Google Services Integration](#google-services-integration) -6. [Background Job Management](#background-job-management) -7. [Troubleshooting](#troubleshooting) -8. [Advanced Features](#advanced-features) -9. [API Reference](#api-reference) -10. [Frequently Asked Questions](#frequently-asked-questions) - ---- - -## Overview - -BlackBox is a comprehensive Android virtualization solution that creates isolated environments for running apps. The latest version includes significant improvements for: - -- **App Installation & Management**: Robust app installation with cloning prevention -- **WebView Support**: Complete WebView compatibility for browsers and web apps -- **Google Services**: Enhanced Google account and GMS integration -- **Background Jobs**: WorkManager and JobScheduler compatibility -- **UID Management**: Smart UID spoofing for system compatibility -- **Crash Prevention**: Comprehensive error handling and recovery - ---- - -## Installation & Setup - -### Prerequisites -- Android 8.0+ (API 26+) -- Root access (recommended for full functionality) -- At least 2GB free storage space -- Internet connection for initial setup - -### Basic Installation -1. **Download BlackBox APK** from the official source -2. **Install the APK** using your preferred method -3. **Grant Permissions** when prompted: - - Storage access - - System overlay (for floating features) - - Location (for GPS spoofing) - - Notification access (Android 12+) - -### Initial Configuration -```bash -# First launch will create virtual environment -# Wait for initialization to complete -# Check logs for any setup issues -``` - ---- - -## App Management - -### Installing Apps - -#### Method 1: APK File Installation -```java -// Using BlackBoxCore API -BlackBoxCore.get().installPackageAsUser(apkFile, userId); - -// Example with error handling -try { - InstallResult result = BlackBoxCore.get().installPackageAsUser(apkFile, 0); - if (result.isSuccess()) { - Log.d("BlackBox", "App installed successfully: " + result.getPackageName()); - } else { - Log.e("BlackBox", "Installation failed: " + result.getErrorMessage()); - } -} catch (Exception e) { - Log.e("BlackBox", "Installation error", e); -} -``` - -#### Method 2: Package Name Installation -```java -// Install from existing package -BlackBoxCore.get().installPackageAsUser("com.example.app", userId); - -// Check if package exists first -if (BlackBoxCore.getPackageManager().getPackageInfo("com.example.app", 0) != null) { - BlackBoxCore.get().installPackageAsUser("com.example.app", userId); -} -``` - -#### Method 3: URI Installation -```java -// Install from content URI -Uri apkUri = Uri.parse("content://com.example.provider/app.apk"); -BlackBoxCore.get().installPackageAsUser(apkUri, userId); -``` - -### App Removal - -#### Uninstall Virtual App -```java -// Remove app from virtual environment -BlackBoxCore.get().uninstallPackage(packageName, userId); - -// Force uninstall if needed -BlackBoxCore.get().uninstallPackage(packageName, userId, true); -``` - -#### Clean App Data -```java -// Clear app data without uninstalling -BlackBoxCore.get().clearAppData(packageName, userId); - -// Clear specific data types -BlackBoxCore.get().clearAppData(packageName, userId, "cache"); -BlackBoxCore.get().clearAppData(packageName, userId, "data"); -``` - -### App Management Utilities - -#### List Installed Apps -```java -// Get all virtual apps -List virtualApps = BlackBoxCore.get().getInstalledApps(userId); - -// Get specific app info -AppInfo appInfo = BlackBoxCore.get().getAppInfo(packageName, userId); - -// Check if app is installed -boolean isInstalled = BlackBoxCore.get().isAppInstalled(packageName, userId); -``` - -#### App Configuration -```java -// Enable/disable app -BlackBoxCore.get().setAppEnabled(packageName, userId, true); - -// Set app permissions -BlackBoxCore.get().setAppPermission(packageName, permission, userId, true); - -// Configure app settings -BlackBoxCore.get().setAppSetting(packageName, setting, value, userId); -``` - ---- - -## WebView & Browser Support - -### WebView Configuration - -#### Automatic WebView Setup -The new WebView system automatically handles: -- **Unique Data Directories**: Each virtual app gets isolated WebView storage -- **Process Isolation**: WebView conflicts between apps are prevented -- **Data Persistence**: WebView data is preserved per app - -#### Manual WebView Configuration -```java -// Set custom WebView data directory -WebView.setDataDirectorySuffix("custom_suffix"); - -// Configure WebView settings -WebView webView = new WebView(context); -WebSettings settings = webView.getSettings(); -settings.setJavaScriptEnabled(true); -settings.setDomStorageEnabled(true); -settings.setDatabaseEnabled(true); -``` - -### Browser App Support - -#### Chrome/Firefox Compatibility -```java -// Browser apps automatically get: -// - Isolated WebView instances -// - Separate cookie storage -// - Independent cache directories -// - Process isolation -``` - -#### Web App Support -```java -// Progressive Web Apps (PWAs) work with: -// - Service worker isolation -// - Cache storage separation -// - Background sync support -``` - ---- - -## Google Services Integration - -### Google Account Management - -#### Automatic Account Handling -```java -// Google accounts are automatically managed: -// - Mock Google accounts for virtual environment -// - Authentication token handling -// - Account synchronization -``` - -#### Custom Account Configuration -```java -// Add custom Google accounts -AccountManager accountManager = AccountManager.get(context); -Account account = new Account("user@gmail.com", "com.google"); -accountManager.addAccountExplicitly(account, "password", null); - -// Configure account sync -ContentResolver.setSyncAutomatically(account, "com.google", true); -``` - -### Google Play Services - -#### GMS Compatibility -```java -// Google Play Services automatically: -// - Returns mock package info -// - Handles authentication requests -// - Provides fallback implementations -``` - -#### Custom GMS Configuration -```java -// Override GMS behavior if needed -GmsProxy.setCustomGmsInfo("com.example.gms", customInfo); - -// Configure GMS permissions -GmsProxy.setGmsPermission("com.example.gms", permission, true); -``` - ---- - -## Background Job Management - -### WorkManager Integration - -#### Automatic WorkManager Handling -```java -// WorkManager automatically: -// - Handles UID validation issues -// - Provides fallback implementations -// - Prevents crashes on job scheduling -``` - -#### Custom Work Configuration -```java -// Configure custom work -WorkManager workManager = WorkManager.getInstance(context); - -// Create work request -OneTimeWorkRequest workRequest = new OneTimeWorkRequest.Builder(MyWorker.class) - .setInputData(inputData) - .build(); - -// Enqueue work -workManager.enqueue(workRequest); -``` - -### JobScheduler Compatibility - -#### Job Scheduling -```java -// Jobs are automatically handled with: -// - UID validation bypass -// - Fallback mechanisms -// - Error recovery -``` - -#### Custom Job Configuration -```java -// Create custom job -JobInfo.Builder builder = new JobInfo.Builder(jobId, componentName); -builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); -builder.setRequiresCharging(true); - -// Schedule job -JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); -scheduler.schedule(builder.build()); -``` - ---- - -## Advanced Features - -### UID Spoofing - -#### Automatic UID Management -```java -// UID spoofing automatically: -// - Detects UID validation issues -// - Selects appropriate UIDs for operations -// - Provides fallback UIDs when needed -``` - -#### Custom UID Configuration -```java -// Configure custom UID for specific operations -UIDSpoofingHelper.setCustomUID("operation", "package", customUID); - -// Override UID selection logic -UIDSpoofingHelper.setUIDStrategy("operation", customStrategy); -``` - -### Process Management - -#### Virtual Process Control -```java -// Control virtual processes -BlackBoxCore.get().startVirtualProcess(packageName, userId); -BlackBoxCore.get().stopVirtualProcess(packageName, userId); - -// Monitor process status -ProcessInfo processInfo = BlackBoxCore.get().getProcessInfo(packageName, userId); -``` - -#### Memory Management -```java -// Optimize memory usage -BlackBoxCore.get().optimizeMemory(userId); - -// Clear unused resources -BlackBoxCore.get().clearUnusedResources(userId); -``` - ---- - -## Troubleshooting - -### Common Issues - -#### App Installation Failures -```bash -# Check logs for installation errors -adb logcat | grep "BlackBox" - -# Common solutions: -# 1. Ensure sufficient storage space -# 2. Check APK file integrity -# 3. Verify package compatibility -# 4. Clear BlackBox cache -``` - -#### WebView Issues -```bash -# WebView troubleshooting: -# 1. Check WebView data directories -# 2. Verify WebView provider status -# 3. Clear WebView cache -# 4. Restart virtual environment -``` - -#### Google Services Problems -```bash -# GMS troubleshooting: -# 1. Check GMS proxy status -# 2. Verify account configuration -# 3. Clear GMS cache -# 4. Reinstall GMS components -``` - -### Debug Mode - -#### Enable Debug Logging -```java -// Enable comprehensive logging -BlackBoxCore.setDebugMode(true); - -// Set log level -Slog.setLogLevel(Slog.LEVEL_DEBUG); - -// Enable specific debug features -BlackBoxCore.enableDebugFeature("webview", true); -BlackBoxCore.enableDebugFeature("gms", true); -``` - -#### Log Analysis -```bash -# Filter BlackBox logs -adb logcat | grep "BlackBox\|WebView\|GmsProxy\|WorkManager" - -# Save logs to file -adb logcat > blackbox_logs.txt - -# Analyze specific components -adb logcat | grep "JobServiceStub\|WebViewProxy\|GoogleAccountManagerProxy" -``` - ---- - -## API Reference - -### Core Classes - -#### BlackBoxCore -```java -// Main entry point -BlackBoxCore core = BlackBoxCore.get(); - -// Core methods -core.installPackageAsUser(apkFile, userId); -core.uninstallPackage(packageName, userId); -core.getInstalledApps(userId); -core.isAppInstalled(packageName, userId); -``` - -#### BActivityThread -```java -// Activity thread management -int userId = BActivityThread.getUserId(); -String packageName = BActivityThread.getAppPackageName(); -String processName = BActivityThread.getAppProcessName(); -``` - -#### UIDSpoofingHelper -```java -// UID management utilities -int systemUID = UIDSpoofingHelper.getSystemUID(); -int packageUID = UIDSpoofingHelper.getPackageUID(packageName); -boolean needsSpoofing = UIDSpoofingHelper.needsUIDSpoofing(operation, packageName); -``` - -### Service Proxies - -#### WebViewProxy -```java -// WebView management -WebViewProxy.configureWebView(webView, context); -WebViewProxy.setDataDirectorySuffix(suffix); -String dataDir = WebViewProxy.getDataDirectory(); -``` - -#### WorkManagerProxy -```java -// WorkManager compatibility -WorkManagerProxy.enqueueWork(workRequest); -WorkManagerProxy.cancelWork(workId); -List workInfos = WorkManagerProxy.getWorkInfos(); -``` - -#### GoogleAccountManagerProxy -```java -// Google account management -Account[] accounts = GoogleAccountManagerProxy.getAccounts(); -String token = GoogleAccountManagerProxy.getAuthToken(account, authTokenType); -boolean success = GoogleAccountManagerProxy.addAccount(account, password, extras); -``` - ---- - -## Frequently Asked Questions - -### Q: Why do some apps show black screens? -**A**: This is usually caused by context or resource loading issues. The new BlackBox version includes comprehensive fixes for: -- Context management -- Resource loading -- Activity lifecycle -- Service initialization - -### Q: How do I fix WebView issues in browsers? -**A**: The new WebView system automatically handles: -- Data directory conflicts -- Process isolation -- Provider issues -- Cache management - -### Q: Why do background jobs fail? -**A**: Background job failures are now handled by: -- WorkManager compatibility layer -- JobScheduler UID validation bypass -- Smart UID spoofing -- Graceful fallback mechanisms - -### Q: How do I prevent app cloning issues? -**A**: BlackBox now includes: -- Automatic cloning prevention -- Package validation -- Security checks -- Error messages for blocked installations - -### Q: What if Google services don't work? -**A**: The new GMS system provides: -- Mock Google Play Services -- Account authentication fallbacks -- Token management -- Service compatibility layers - ---- - -## Support & Updates - -### Getting Help -- **Documentation**: Check this Docs.md file -- **Logs**: Enable debug mode and analyze logs -- **Community**: Join BlackBox user forums -- **Issues**: Report bugs with detailed logs - -### Version History -- **v2.0**: Complete rewrite with new architecture -- **v2.1**: WebView and browser compatibility -- **v2.2**: Google services integration -- **v2.3**: Background job management -- **Current**: UID spoofing and crash prevention - -### Future Features -- **Enhanced Security**: Additional anti-detection features -- **Performance**: Memory and CPU optimization -- **Compatibility**: Support for more Android versions -- **Integration**: Additional service proxies - ---- - -## Conclusion - -The new BlackBox virtual environment provides a robust, feature-rich solution for Android app virtualization. With comprehensive WebView support, Google services integration, and background job management, it offers enterprise-grade functionality for both developers and end users. - -For the best experience: -1. **Keep BlackBox updated** to the latest version -2. **Enable debug logging** when troubleshooting -3. **Monitor system resources** for optimal performance -4. **Report issues** with detailed logs for faster resolution - -Happy virtualizing! 🚀✨ diff --git a/README.md b/README.md index d4ac61d..aabfbbf 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,18 @@ # FridaBox -FridaBox is an authorized mobile-security research MVP that runs an original, -unmodified APK inside BlackBox virtual processes and loads Frida Gadget before +FridaBox is an authorized mobile-security research workspace that runs an original, +unmodified APK inside private virtual processes and loads Frida Gadget before the guest `Application` is created. It requires no root, frida-server, Magisk, Zygisk, system-image changes, real PackageManager installation, APK patching, repacking, or resigning. -The foundation is `ALEX5402/NewBlackbox` commit -`89b59836c66f173756a4ae258cf379a957649820`. The host application ID is -`com.qm4rs.fridabox`; existing engine namespaces remain unchanged. +The host application ID and Android namespace are both `com.qm4rs.fridabox`. +Third-party engine provenance is isolated in `THIRD_PARTY_NOTICES.md`. ## MVP capabilities - SAF import of one base APK into app-private, read-only storage. -- SHA-256 verification before and after BlackBox virtual installation. +- SHA-256 verification before and after private virtual installation. - ARM64 native-library inspection; pure Java/Kotlin guests are accepted and native guests without `arm64-v8a` are rejected. - Per-guest instrumented or non-instrumented launches with virtual process stop diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md deleted file mode 100644 index d37acde..0000000 --- a/RELEASE_NOTES.md +++ /dev/null @@ -1,106 +0,0 @@ -# Release Notes - NewBlackbox - -## Version: Latest Build (2026-01-31) - ---- - -### New Features - -#### VPN Network Mode Toggle -Added a new setting to choose between VPN and normal network mode for sandboxed apps. - -- **Location:** Settings → Others → Use VPN Network -- **Default:** OFF (normal network mode) -- When enabled, traffic is routed through BlackBox's VPN service -- Requires app restart to take effect - -**Files Changed:** -- `app/src/main/java/top/niunaijun/blackboxa/view/main/BlackBoxLoader.kt` -- `app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingFragment.kt` -- `app/src/main/res/xml/setting.xml` -- `app/src/main/res/values/strings.xml` -- `Bcore/src/main/java/top/niunaijun/blackbox/app/configuration/ClientConfiguration.java` -- `Bcore/src/main/java/top/niunaijun/blackbox/BlackBoxCore.java` - -#### Device Information Logging -Added comprehensive device info header in logcat for easier debugging: -- Android version, SDK level, security patch -- Device manufacturer, brand, model, hardware -- Supported CPU/ABIs (32-bit and 64-bit) -- Memory info (heap usage) -- App version and package info -- Build fingerprint and timestamps - ---- - -### Bug Fixes - -#### VPN Permission Fix -**Problem:** VPN service failed to establish interface (`builder.establish()` returned null). - -**Root Cause:** Android requires `VpnService.prepare()` to be called from an Activity before VPN can be established. - -**Solution:** Added VPN permission request to `MainActivity.kt` on app launch. - -**Files Changed:** -- `app/src/main/java/top/niunaijun/blackboxa/view/main/MainActivity.kt` - ---- - -#### Android 10 Black Screen Fix -**Problem:** Apps would show a black screen and timeout on Android 10 (API 29). - -**Root Cause:** -- `BRAttributionSource.getRealClass()` returns `null` on Android < 31 -- `SystemProviderStub.invoke()` crashed calling `.getName()` on null class -- `ClassInvocationStub.injectHook()` crashed when `getWho()` returned null - -**Solution:** -- Added null checks in `SystemProviderStub.java` for API version checks -- Added null check in `ClassInvocationStub.java` to skip hooks when services don't exist - -**Files Changed:** -- `Bcore/src/main/java/top/niunaijun/blackbox/fake/service/context/providers/SystemProviderStub.java` -- `Bcore/src/main/java/top/niunaijun/blackbox/fake/hook/ClassInvocationStub.java` - ---- - -### Removed Features - -#### Xposed Framework Support -- Removed `BXposedManagerService` and related AIDL interfaces -- Removed "Install Xposed Module" UI and Settings entries -- Cleaned up Xposed-related flags and package checks - ---- - -### Stability Improvements - -#### Anti-Detection Native Hook Stability -- Removed `LOGD` calls from critical native hooks to prevent infinite recursion -- Fixed syntax errors in hook implementations -- Hooks now silently return `ENOENT` for blocked paths - ---- - -### Known Issues - -#### Oppo/ColorOS Thermal Stats Error -On Oppo/ColorOS devices, you may see errors like: -``` -OppoThermalStats: PackageManager$NameNotFoundException: top.niunaijun.blackboxa:p0 -``` -**This is harmless** - it's an Oppo system bug where their thermal management incorrectly uses process names (with `:p0` suffix) instead of package names. The app works normally. - ---- - -### Compatibility - -| Android Version | Status | -|-----------------|--------| -| Android 10 (Q) | ✅ Fixed | -| Android 11 (R) | ✅ Supported | -| Android 12 (S) | ✅ Supported | -| Android 13 (T) | ✅ Supported | -| Android 14 (U) | ✅ Supported | -| Android 15+ | ✅ Supported | diff --git a/app/build.gradle b/app/build.gradle index 2736ba1..35c6e14 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ if (releaseSigningValues.any { it != null && !it.trim().isEmpty() } && !releaseS android { - namespace 'top.niunaijun.blackboxa' + namespace 'com.qm4rs.fridabox' compileSdk rootProject.ext.compileSdkVersion ndkVersion = "29.0.14206865" defaultConfig { @@ -170,7 +170,6 @@ tasks.named("check").configure { } dependencies { - implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"]) implementation project(':Bcore') implementation libs.appcompat @@ -180,35 +179,4 @@ dependencies { testImplementation libs.junit androidTestImplementation libs.ext.junit androidTestImplementation libs.espresso.core - - implementation "androidx.preference:preference-ktx:1.1.1" - - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.3.1" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.1" - - - implementation 'androidx.recyclerview:recyclerview:1.2.1' - implementation 'com.gitee.cbfg5210:RVAdapter:0.3.7' - - - implementation 'com.github.Othershe:CornerLabelView:1.0.0' - -// implementation 'com.github.nukc.stateview:kotlin:2.2.0' - - implementation 'com.github.Ferfalk:SimpleSearchView:0.2.0' - implementation 'com.tbuonomo:dotsindicator:4.2' - - implementation 'org.osmdroid:osmdroid-android:6.1.11' - - implementation 'com.afollestad.material-dialogs:core:3.3.0' - implementation 'com.afollestad.material-dialogs:input:3.3.0' - - - - - - - implementation 'androidx.work:work-runtime:2.7.1' - } diff --git a/app/libs/StateView-v3.0.6.aar b/app/libs/StateView-v3.0.6.aar deleted file mode 100644 index 658e6df9b5b48b6fbaeceee77ee2346d25606ad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18333 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 T*+9ndFz_(&Ff%YzyMTBA^CN4{nS0oDt({s#s3 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

xap&=s zX<|zk&JbsNnR!U|m7(4G_s93u)EpG8I`H&~kn)nhd-5MLyWV(^ySl2dHDby%^Z)zm zyn3pq<=qc=*tTU zdb0+tq_68wAKN~6DvfaUPpXX0mdexP!?a2{|a~}CWPfSY;_8lj8)y+$^5pBB>7jM&8lPUg#Kxtob*%ea zlEj(K*WbO*e^V}Hu5RnT_;0rSofUV!r@othY|T!aq7rG!9*=x2t!_hupg{@Aj$5#+jA}v>TSiIB6(uESsLDl-wqz z{%MNlvAIXAO&uP@W;een2wxKZ_=;41W;x8&ni{R9ScbL{5JfylyruUFk=eP7Y&*O=`PRm4oaz}dD#-yiI zz3gIDpOj{HjAM=3iVcgDpZ9&rZZQlyE6ib3VZJTXk>PH!&PCW z=Y3p%3}>*e?EJOQ<8$4;%bXkk7agDL^6yfQ(Mffq=RN<|{ObdGf~Ar8G@s{N zj_%!~`keXux4q*1c2nyr=E~HpJNWrbgP!x-#ccat)J6(>e$HTBKY{($vUy6G=Y(!W zf15Y$v54Os^`JE=pCVGySkzl@tIAdHR}XxC!Js~`c+Inp-R2&(g1`ErxVx`xJ)068 z+VAw*NciPZlPmKV)oosC^4L8{Kvcu}uUpx#-o^$m$30qtJ?1Y$U$W2Ja4+q(?vg2& zil*8AKKzG&)q?ypKO2K&*7;|=d6suVHtXvCKIQMTU+nlufxS zp1%AVSl4{$^SqktTMcU*E0Z#|#O}EN&%2;K+Nr@I;9o)-<5I<6g<>4Vy^2$6wSzZ& zxMi^5U`^thhYPr7`=4=(zmwJ@zi8*`3*YvNL`HHXdgbnNwD_Ut`=Tn3@Asr7n-@wc zyma{BtNFC5Os(=#aO&>d`Ijp~Cm)>s=gikzkDOdp3oqIp_kP;k;C#H?#{5)9@nms+ zC8b?;|GZ8o?W$U4`r`iqmg?qH#-Z1~$>~mye{L)@-QsV$*SA@p4o;c$sYj{dNkN|a zpZKm%XZ4oY+k5F)?6W7`Sgcdx7VLAWtUN3vC-y(=$byM4UtKo4}ZESwRY#3 zw+1_!Y%rKsh#px4fd|Q2d(Ua=OFMqFG{Fmk9?T(eN zXX>2rj{fml%1YXudBfN3G4u0P)IJA_HklS@r~YVg*tc!rx@94P50@-hWw|>=W81w_ z={C;G!n}(`)@=0JaKuyaYZ&|Q>A`keHJ``FZ>sJo&HO}}}qV5s6uC!xP7h|kH>#Cyt1@4s%sb3a3{w-VX^j}Nz>6NgmiEj^8 zPVQvuz5Gn!(<~=gNX+hC`}V^ErqT~nt+!nK_h&AndGUP3)*@rZ3+oTotyrUY z;L@|0zXda1cCK5P*C*LIJLr3V7t2wvbf#G21*bbsoc+S?`ci1pLEb(c`vo8K{G|=u zxnJfmnC@n3h_O)o;(7lxyI4;|`-bPUe``qmdU%56_t(p;-pNNFWLqyf&B^vhf0Ohp zU6;xEw|#VrCst%_SK6%0k{1+WwtT~vTfb(!uYP1&dgAEXmnVMZS|vPwz%kX`t7Kln zhTK24GECEyAG>}~joTD(Ng>=xu;RNF#qW9)aR+af8!4E zg>Lq&a-1fzfZ6u`3?>yNhV`#A(nb4@Xn#7l%;~#cEbqDu~?cCYxAyCU#Sj^kuW%B;xzh0|t?r*RD+J1hmZ=Lwf%|~yDd)@9< zdHU?rJB`|IbL-1}ntUPBWm9%PoFRW>%JxISi$nH#B=&j-zN%u<^7o%K_f0*+S%ZXy zA@9CU&7YHB_EYX%c~P}s*iXh*J?G91&Wmo{k-wvGOVzsiQ18o(CoeN><|jvRPCPyR zkI2D5o^Q9;^{iZx>vcapeebJ{4|W}ytfJ4CF!#A(-j@=qo0E^a8nR>wZVj@{T3YmH z>-~*4eDc1|TKZyj^9+-zXYVyF*}TZMf48mNYTvHWUpQ~d#IMZ}R(~XRC4X9)to^GzwXgB1UwT;g zjxZiZ8^7=FIUhE+nX|2rGFaeVJxTiOjWxXd6Z=dKxC#lb^gVKN&YnLHf;axWsWVlo z-&x6Dl=Y*^@zbl0w(kx){#*M&Y2%{!bHn-1=@eAGO@o>^k=H%~M$u{4wZJN|<#gpWq@2-=kEhX2K+x9x; z_m|kyt9EbicK^&3aI&<`tMzY8|LWF5fsXu>Pq>_9=Vgtd}J5i~RUxbMWD+s;`pjxpF%5>h=dF&SP&r^1b1>(jw0P z`!przbjw&uPPqJsBl7cBwKoklEh$!Wma^qL3BCT%?(zF9Q|*De-_H_WKTCLh*|YUb z^b*5^U)P%cTl@0K)3q-SoZor!*sn>GV`uVCE}wkWfB#YTcOUfRCh5&Tb~%yzLNfP- z_$ltcuV0Iiu@q9XU~6;pEZ4Z>Aey&e^4Eoa#|=y5PCYcAC}mOIchRrWzdFy})o^b5 zpH~lm)&%Ta-uQXpPsi?y(q^@yx$)PwU(LVreB0gY{Ij>3|NIbsBjwD(4-VTzR8_<> zwdQ}>URag7?MmGThB^OUU;BLi7{k^-?-m+y^@m3Z`){(?d-&_=eLCWuH?OsF>GSl8f;`d)=wP2OKMw^(yokg$<0r}X)@Pd~$hT!gLBT+BMx^@>`{K#cXhgATFu*gdo%9nX@1=HbK+FZ*AA1f z<($srwOaCf*@oY8ZAT1zUOm^kt6wp>tm@-e&o`R;T7nhzZ*s)tu3s|G+W+3d)@zHD z-fRBmJuBUqRpc(Z_34_Hb7xJjraWmfOS+Q2c%|nr*UG2+CYG1olUA+z|1>xtUa<7O zhb+sFO9kPYhYR){^FIFYr)R*v(_PQX%=K?}tgH;OT@;f2rMW1_Q!C+^isifCjmt#E zel9)rS)DZX&yL$W51+Z+tuys;DcknN{R}G~TkJah>S#M(Q&x8T z-sXGfT#_Aj{ms~w@3U+6y4|za$(vN!eX{sn$dfyJJ>Q!<%~J3Eyk?)j@czPz{+`%n z=_aK&-*m3B(C_&)x3m5Fd;6jr)7O3cRAS|RDN*a?TAhfhrM0yc@@^&yj%(N+cVsN` zn-{(_-)q@XSJj#~lP<3Qy5rr9OV-VM+gN%ue^lT9##i-Bx^}~-$t9V~%lA5cnalAy zWBcXz^M9zl`v0%joIm@I#~&wgt~*vuH@(-TyQqH1n7sC2_DA>1@7v;h-`AmF1-v{J+7;J@W5aaw&ak8$>bNf!9T4&QZ%viFSZ%_x zHLpd~Wgnl|Sbo`{IkmzktB0j{-<_kX(RC8PH(P~f-(#GyPJ4phf;}tc#nYveHY->i zQJN>A%u#3*=IHq~_4TIio;OwU>%zUK7@e7^6tKHnh4tKxY160Gwr}^^_9sPH^Vczt zwRf#9?vYp(y^Hg4f%BD4JFRKg-rfnb;m>QS4mzTqcz1V{oxW?O?r*#1gBH$NPru6j zKXP5uEaE)J)W>Lxa%^g~m%eg*I zIP`k@70v(r49X67_VX*3?d#b6TSB)s%!=vjmoM`dl|L}~H?f?f_it}wXE%>;Y+A-E zwzFG#LgaP@zBOs&7t zHyM`~l^p5cn{QZsE8dzbKktE_%|h7rwdrOsrX-LN;y&3tn&Hwm)64vUY>RN zGP~!x^@f*LE1n)ud-Hep&I{ou;%8r4S)RAx*1V>p6Wyjx@SQrL_H2~7^1gKiOVz~f zB(pzG3k%Uv?KE|A3tAZ;P!)9Y|2vbiYazRg468S7^w=4baW8q-gSrD>degb=1Ytls#j`6%zocj=R{9tPmZd;?Jz$l=6v*8%bI8UPqQ+(d;clP{QL9z@zeK$8RZY; zRNn8k*j0Av#y0Ng+kZLc_CI)8J?q+m&p*`q1!mOE{5Mm|?b-cwqhFH6ucoHFeir)3 z!b4%z+YfZCc0ZNDk^eAe zdgt~#Gp|@op6qaLjs6?WKXnc3CKzupd74l7LgztEVMXW?VzMZ0H)&po3iHKQjcrQlUElk)q^f)yUynPG{x9gw-`fQ& z-GvptJN{Ifuoo3n8}Bb)aND_lLH-Ym!<+Ms*4MQ)31_h0YTTB(K)7Yn-Xq;@R~Us} zF&K2M>Yvo1FBM?y>Xe;Ya?k1hgTRu#;#(9ixI4~g&3$OK!1R~r3tN|u6Am=@v1ceX z9$A#9evUP5%J&!ZH(e5}k_{_bN2Db z+~e&yDDvck+mjD$M;=r~IkA7N;8!fOZQA@-AnEw!Ex-DNBrMN<_~M?iWx>T}H-X+n zlVcaQL?%y)n(dw_(faV|U-hgz6PD>p&69X#v&$$w=lB&-g(EpnbeuQ$3(3?sO#E1^ z@@Ve?2Ct-+7l%x$VvK!GJzlVSK{l5Zx93^a)IU;b7bM-Ux_4;CrHRdwkoY~v?|){@ z-1SNMbz=J?)F+Sh1>F_&Z4vRKc+vI`9A&M-8=5Ny6xfdpJaS? zKd3qp^7CfcY1Zq1mvOKA?fd-cUf1VKY?t!NR$q^JvopjrE%53L*VJUIuxhD%)0sb( zXPK3(x`nC9SFF>_A!{DU)_Th!!I5`H)@ny9xx-d9#xZl-BN*yQ<*vl-?F z9P?apSmlbMh;4(DzTw`Pl~1)Uf9#i-v2J1ZgMN-!_KckSZ5P73)b~i1->}%|8t-Uy z&n))-YoRm8M9=Njys*h$y4*m#{KSmyTYhf;;Q3tbUfI*ct*L>^;sMIy2@{J}mZTLP z+Bs49+}Ds@*MjfP={g$Rax}Q*W~{?h?fW;F^-_z2&OBH$!*QwhbS}&G$w^}Bb1Y@b zQ;P58Srs3eS^jLv<`v)O?AiTA{*?T!i{I|#=bUX1pD!$@u~*~0e|E;b-OpsxA0D1x zmTT6@e0yU%mta#R$HJ+fCf%MtWqpC_&fh^Ei7HjSwwe~TnLC^+D}I?viZk0OR~D7z zyXMr+-F7dy#mzpU>Y|@dzUxtT9;V3|zosxQm-5~g^2$3$O1tywk||5pFHD-Dv?_{c zio}E^F|*mu`s;k-d~Ce_qW$LPe=}uS+Wn2TS8!&q{aJBJqe^Mto=+8-MJ~bnoC*(j z+6%V2_&A3?@|5r63~4&!YU|^^&cNhv_^w081#Zn>xbY__r)Pe$?>fDo`{wp35n{>} z+><;L@-}sSab56vowUaX7M~OMWK{CyidINe7HEezFRi&T%X@C};*GBkPxRfYEWTN{ ze=_gQDe-5QpNeYrI%qn`7n_ZrjRFN)dM&2|0KhA&ZZ`~KKlJd1Fis?D2StanXK zSbX>QB?s+iKKyxfUvB2P58H0D-IB05yEJnFL%GGwh2KS$e|vvqDL1tEYB!mCddDLM ztA;p*jz#Sq+RiV07QYrO(d}E8b*yvcnisPf)@sK+dw$-?!R*1OHR9)C36kh9cbz92keUmHyGS@6VUijUv z^}^xl(QoqNxw}lpA8( zerRvmViI@pdEg9(#2XyGTU?nlRCl(z%d=cP`6fn|IoV%G?*8EqXX=<1*QZo`GWq<` z|6-=;Jf2%RSx&p(HE-Uc^P)TG(W^}+uIASwRKg=)R2{j&yslR`xJjdmVXEA-B)vTk z`vqp}p4i*3@b#VZo4d_dwsVIcSdl8NyWKKA@N2|Qt$eN=BR;WwyQcjN=_@*p6(~+; z{#o-%`@!2~Jbv7f5xG0B-14$ee)G)tqvNafc0V4eet(?FyY}~WlP&M!ih{kC3@iHzh)Oa`4p_cRoXlt^F%sII=B|PfS?T_wnX_!SK7+8GEaW7hG*=n{|O_ zhUv7%YgZ&XkI1Yt^L3I`UD$e&li99h*UWCu9-n$Y?+=_Y_x^I&?iQ?i=lUtvH}0H> zWa*pP3~#@QKKdyB@RRtXFHbMOFuo{oX8Fc?;qdltpZtoS9p3h>I(+_AuhVt~Ik&6h z_N{;6^?9*o_$+)Of6w{fTfN|ed6GqIYHLvM#pMoyi`Mg84Bu8%D}BbV zY0ji8Y)cZ%`tI2*xmUZT{hv$58`)*gR3CL3GKb84qAA8|+qX`0g_lj`ElKqcTzjfM zeOF0lSmZEe2U8)dh?7Ri!V5_%lYa522(>MY5&2TV&;40kLeAQ&;6tR^vUrz^{l=2E zjul&){%thYIr7Fq;!9?TD%Y%ie^f4*u=@5(dcXd9!ZfrmGvSoRN7c!psvA8_j7}f= zqtne@oRM{?!#BV~pK|pUG+0cx89KWR~TI%%>A}BwDX7+;HNa zP)dI1#oK}giTr7oZ_IDbHIV-u@G-yYxBMURf04ZB_h)bInR2Iaw}baTr>MjI0<)|R z&iQ0{f&I*+j-xZ@&s7$i?HKs%;?^5pG8KK($;h57BtCt7k1 z=CA(Sn*Afa?8EcKFdBSAt~j_Am37TwY^h z_r{*r0)Nz0{+FrzFKaoF*5V-ObU|aK-c9=*e=2v>99{h{v*F#xeLwWmqvLdUU;35d zwfy@B{av-~_4lMJUd8XrSasvM{TJi-2c7f3{o?=Yz5M$H{av;GfA*~X-Wea4RcWzy z?faAQaknMEs$O5#cxBOSMqU1#Ba$)g5~q&b-7k4?_uSRF)rDW}+UwW!&HN$ysD#lu z!)J0pdf=2F_xUqSnL1g;lHLnQ)e7Ff@VH0+Ph-Ur`B+ItJwwyqdIt|ywH>!p6Pn&& zV0C!~=hJF-tA)J_jk?Zha60+u?)t#HzxU2(Cf>EX3o1SfHc3xpd*>z>(=KqQ9x;#kLkAOS2(d>_C2AY4*K(<4k=f#phJ|nQeSG$NRy;6C zp8UK)E`dkYEc?&QQ{oM7k&M60>i_L9YF*^N$e7uO$@$C?mn!zxg1hG(yt$dbI$to! zpncgwrDpmwLhfruw_pZn^lcZl4*~e5#en z*VxVG_c(9wvB)G3jU{dxCRzQL)LtDC%4!V)A(`7N3Udx;-S;{>HR+t$TiwlH@9&S2 zyZLqfxrcwQ_7$XUGoF&ROLW28dptJHtUC@zZz#Xt{KnR!Vp*4~o%6y@iMcCy78!cR z%v2Pc?;5!Hg~|obn*R>k#xBoodHnV?i86UeW$CyQ_UQSyDznc5G#d{?FI)&*;s=nwA8+qI$-61&n&}7eB4o_j*>~YE^B$ z^mxrl-|ddvV?JSf{*m-np@WTn@`0*noJu+>lK4WqCk7~~OsO=nZ92E-qHOtYhu55s zHt=jY*YNPX%yorDi_~|`m|5HZ;6@$O;_t?WU*$Nz8bA6KKeKmEV$wCP8jq&$oZn`@ z%WWscdz=u5H^YS5J-ZBf{KArfNQVWl;F5 z>$dU2v%U`@8>NCH?ipo>#@~uTocU*}XFJWUO6hxYY}u^u<}}W>?R>N!^fr^iK+N zkmA=O!LLPz%VSjcXg>R#`8-VO@a>JPUYQ@BKj4`m;H>6S|IW9ujCFhQ)>`&+?|yUo z%}tp2`G{cWtG7q4)FqvoA$Wa}ivLp$f#|q%|7w|Kqcak7{_y@${w*=1s-yM9@r;-x z!;fZ*gRk=R%u`vmxA_n|Pyf}&+|e^$Ti`XZ*x>LvL1=#6UbJgzO(8!D#S?0Fg=D{TG$Yfwh@t>||# zua4B*`;xQlT<9s!bU}5QR_#q|UsNPBrlo6!WlDctSG}_Qu6OT_x!t+!m#k{r>pre+ zC@XstothUD9+w&)n>X=#(B(N!zQtTu&#sJ^y?KS8@k&AC>AWsIODDJKoC`VA*E>U2 zdb;c#-9D35b6=jex<0Ynb_Z)=g>~P7G^yHFk47Pvdc!`w%cTbK{96*swM*n(-uw{W z>pWHGMR;SJP?i0}8x~!QRKBO`$C^o~3%OjFp|Y&!P94uGDTCEgZZmo1AGEr#Eb2aU zzV66{AMzYM_fFq9#H>*$Xkxy(b8*YDd1@9FEjvAQwek(+*QOU-IrHJgY#o>N40~Vj zEPTy<`o90w$x2OLPqsDssR(7vO1tvJ^zkh_x$qA4XC4{KM_wlT6$(hKcYRgKRsFoy zW8d5pjYc_pE6oj#Mc(q6(62n@d}_X!_%EX!HUTHnnOXN-tTLba=>L+SfBb&C-Ywaq zId}5BEvZv?2Tw1(v~}X+Lu{v>nw;^CjF`3AaJTWw370Hx@7nn$=k>Eq+?VPu>oV6m z-pHP`>)ZXnT>piq_DOBt!q)veZ`BjiIU?7C^zs(?or{ZW4^vJHQcjK8EN3w{%5rkl z%^%-QgN{wNW02pLa_NEYv3vVjckgGZP7t2=Z|#o5(E`=n`CMOIzsLP*TOIKvS;Qq| z*CfveOr0)Fss}$Q{iyJ94peqvnX4&M`=^?{s_GLnn_InqL5_OxM)wP$;u(3%7U@5f zu41bHKYzxo%?mz>asJJ9Q_tpT%a)vP#s8(|y~FBNU5hkS9$9t%2ztt1vgn1+f(Oov zTUQ=o-@;PgzcyKaQoj1S2W4++m(6B+E2sU`OQXMSp>K?&?!&$BLUh*MPb&LAZPl}_ z*ALd{UQmyfwtRVOhmq?$ujeg0CJLY9og-ov^z_t%U7E9(&0AiV`q^gVt-HUTtk37# zvNrkttECgCr|yo{RL{H~>asK<<;|9Tek-r9JhgA0Rrs+__Sa9XymD$~#GKbFit>%bB&PB{yD-C~WVVBL*TxG$>>;IWzTcVZ0)7XGS-+6~C;YF` znWx9zFQlH+gnuKeb@OEZi_&!*^)JqU;g?O-OLBdxtM**?3u|0*!WW++o7McjvSwoE z;wPWcsuFSSzgNezcZqcD+H9$fKh|u#)TEa-_4JqCDUV;&%sAFJ_e7)Yj^CfB-S%;< zUza$4!kgCxEZrMfy*7NEUT7F`%JRRO-6zrFRaZAGGuVB3y6)3`D@2tSy>8E(zV^tZ zRi)2@^R*xHCcaLLetmfLexZ!=>%#ljZG0;KcU{9eF*7~pSmoR$Q63Mcs5h@($n>U> zN#@|9)CIBoL|3G~SG)61Xjaow6V_7#f1?HV+@8>6{o%{~<1Y@i>twBaViPAZb?Jv|Wg2+lZJwAhbns)W|Y_p%wTu?~qGt$AXZDGA%AJ$n#r zQT!x5>v`eO>!2K96I|=GTp(V!yl8ie~9@{T>#J@Qod$lKG$pPD}86uB&N zqi=J$`nJBm6;1w+=5G*K&fja8z!W;)@R~-3)ULE6E!X!udM@~S!fWxLT&A^Zhk1Kh zFR1g>r#7hw%{MkrSF@?;__t7f#@v;Rc8t@wa_KG6&zre4JirSfD?jz3j8!Yq2xi za@L${(zncyoSrHonI+RU?Ty~P6_@AL95%Q=&ui@rPv_(BOyik;d0l4KJhzVdKIa87 z_gh96#Fh)@MI7b5azb;@?Wye-;yXli41AKO$(a83DyZb1_?xTX_os=!KNb8o*JaLq zZ{zU%1h>!1_X{5=FXW$mp}kXk@^!|)PlccVX0%%9;564a&c~-oE}`(F&Ev<%Ir-(1 zD&Ax!T{Lev-{ESXv|xYR!HwY^t4xnPdN05we^|bzGvklR2lHo2TU*$)Ioe)(uGm!Q zW!$vv?4pd~(+>6GrC(+<@@hL|w*+J)8U3@1WnTaAja|d#*}HABHQ2ceTDf{(et59# zbweIU&hwxG_34Mde~kNWrt?i^mF&;$yd`U=IM1EaeRG@OYGc{x>$R)TTfNiW&G*9l z?DwTty(+KwFZ5ovt0Ik|m$aNe#8$ymIQN6=i8jg((5gPc4e_SRCf} zJpZ23l7dU0%yyjQFx}(rFnhw@$Q^%gp19`|^Uvwdy}2E>?1kUu6ivR074GUW<@#8e z^s!Rt)FZF{rdbYw`<}7Y6RhWCSA;agv}^e(h@vyUOyh!i4jSM#knN>FpA;>$@5+x=Tn^HywRp*ipLh z+;$_&ui|a)|IYk*xIB$Vu#GvgPV)_ViX@MiOXlP7+-A9>`XS_|&EJ-u-nv+6O%scWh@8t=Sr zDC2qaXmVffp2YKi{Tl2t{g>XFn!JW(%YDza*~~%r?^(~0<(Jgfl$yo2Ze!`Y_*}6| z>!a@lzw=stXR2Ro^;*NGdw=q0*#6(fv}wk?Kg;5`>8%ju-f*LMgVpC1lQ(a)xU`}? z{d4AjKbCsMP322%o_`a2{7vlgoAXO8C$yg4FX(T;do$hX#U0P=5B)v5H9m9to`k*) zO4_{Tn0exzDox|-dpx;MZae+sl=RZIfA-zxwp?^%s-zH0L*17jN}m@W=Fxwbkg#dW z$CvFFh4K$RlIeE-%hNBPRP;?!s5@@~x4=aqd1JFM=Ng&^y_$|2 z)f^YA84m8|-}qkc$-bbJ_{NJ1rpRn5_`3Y@hkO@~CrW(NK2(O=#SE!`qymreXhse-|raeJ_)b<{6V(V z$uRWXmiH_#q!j;qJIsE&^2+YbKXVGq{o)xnU4OAUmg&}G?S(hzdwUy5-`w7~EWm1# zIe+@`y(N5mjx^Ot&W#i5S@3#-$BNU-H!gDPIQA@H%g!gPr@nJ)ECZLGo4Sa;=x zjj=N`&$;P_7F%0S-fUj5pM7Fwnp54cc7CJXKbTaa9N)9BJTOj6JNJNpbD3Qg`Q z9<1i+zkccQ>g2R_hMZr1lsc?_b?Clq##FM;)?XoYo^Ood#3$8cISrD_Yd)KtxmM?$EhgklT zU0Hr#*6zNs{a?@M>%#kORHpfVVaJ)QS7N1sW zn`SxH>*udqi*8Q6)320L;B{_6*bRrdwY=}Qr(L`eU)9SSey?;{!)Y^?y_F_k^N-%! zDZB8m=CNnz77D3|&35#am@d_|?^6Bxm&aJ!m#HZTI`*G;P7>Q9dEuC%Aya3aM~efe zw6Ic3FJtJhhIiRlrv9nkw9QB1XL)^*>@4vs3>gQP{Op;V@h0||+9^p1+fx^Qtah1d z-tgHa={ZN+Jq3}f{)j7_Cc@q)j))(3n612Sp1Mhd>w^C(pD&hQ_|ft6=yu6D6^$ob zr*~-QOBrszl-#k}LHR|K;v7%UlfO!{FU6hdUiNiDfOUuV+Z85@FSoR{^zocnVC`7g zcx&bzVLQfOGDjvKGykPzW&EON(Zzl*`NCZt7f(I7^PFSuQ;TZ(1-UzTH1~*|{BJ$$ zu%t)r%pEmHchnr^s1yFSfHS&YaJsW=&4nPRt#7}D2Sv!J9=rEJzeOi4-7t4=d;QPJ z+t#VqMZPzg)-^lU^8ZVR?tM&m76!@0T4#LQcf#jQv5C`>$D3cgI@{>h>rlhCC|N+- zNQB?{NW0m6?yma*i^O&B`6<0plq(eO-x2<=a^uV&N!lA*#TI=&t8=bu#{4ovb5&#W zcZp?ZR_LDhnVVX&W>&!ez@}z*38{L~spWxRH~XC5=Wp7We)$`jma~Q0cdweiwEm4{n_B((BO#)}!taf3UzwQvWHb)0PtN*e6Fm9( z%sIbqTzFEcrf#2{^GGTAF|UvR=`&|`%$PZO=FG`6=VT_-{3>=!vr9{Pmh8rUFFEg% z%tlu0iIFo`28vI1&eid0y}0?)iBG+TH(h|DLb57q_p$Iaiu3~r#zj+n!kC<#voC_@M-^N#Qr>Xs9Lc- zILK_PlUC_A-aYqcxhKDvCmmfBn=J8|E6?r4-LA#O`nAqaj}$I6cC%U4#HaN*!zbqR z3K`dQhF*aShwm(EUb)g=LbAGh<3_7xX*xdV=cd&B5^X#7@5qlcoN8(QMs~lAl#S0{ zw*RQ{@MANNkKM5kXN14>+aEpf<1z5o9k#VyDAg{1b+e{h74>G5sJS#=W{KdMVe z)XqCNadFGxr!39t5;7~3ijHyZIqkHlZQ)0*Lx1xP?9?Vl%xPl{NM}rC`KXllgm;{~x($;q#Z=_Wt=VEUOOtKbEfHyMMyCqJ93d@(%`ko7+G3**O<{V%_tw`AffC zTFEC>wst=Oj=*S|0Qb8tH6 zxBn9#9Qe%gYre9w5&e>z*lJG?Fm%3bP#WT)B$?Y%YtNR*1J_qIR zg)g0X&fA^&@F%YA`S&>XFCT8K=HZq+rV)K)0{<$7|{_o6`V z!;|-oExxO}iNz-+y>n$dHt&#l6iE_loD!oW@{wO4~f*^f%Q7 zn=MqI2EF!Kes0>S-?~3d+RE--nQ=#UM|<0|xfQ?WrCWW|eBd6qtkb>cW8Kt=OL!X@ zw|tC{aa3*b;}3LAF|6u4xzmbGJx4cx}@#u)GrZ?{vgnA<#|LpP>6TMD^-)XMzhKUeRp@9o4sO=<7GRxy@Ii#fx>dZQ=v*5 z{XxTnTA$e4md#T$`D3$qvgna1{S4a+tyl6ajOQ--ROA&psZ6;rU`CQn+0<(nyl+@- zfAl4HiRB#EU<2{(hHX<>tfZ?Aq;EUuO+Q>&b77kIR^6}G5qoCl%~%tk{3%m#^9C!g z4O?yZ-FngZuKLgOt3hT{z5OQs?{ql5@2$zUcgw0jq%Ja9@K9B5zDuWS`rACFEf0lm zbsSblcI>7(VxAIpy<&0p}5t*cHd^e@Mj)frt5I+r|BJ{B+9$Un0)$bwTM?`PjGSeonQ0J5MbC(H?)u{u9UI&*u#+gU>(lvAz8H>X~D4se$#g zIL>dFVR7uwAx*L6`kO3jC${eFkBq6A@9`wo`Qm05CGi>a{>=F)sqVGM)biHVyd4_4 z^OAFJc_sWXbW59;s#wT0cR$m7W~ELS>x~{SmN^`snIPAB?_%2F(PB&@J(uRnVx|>YizIJTWDBR6We+@edc0suO*GAkpoae3DJkgq=4GL+lt_F37ql%{MUpEB1KvdZT?GOdd~c zmyE9In7H$}#H^}m2R|zF^vEdNR5UsKDE;$LxrHrW(c}l$y$ADOeBAG}{<_nO|M@IT z;*xSXYTFF*ByMDAMcpx2cyUUmN$M?zS(S?n#SaVT3rkozW-O7J|6io>f#jiwR=?QK zwzU6usrcdlg+J85Am-$Q1KB)$a)||R9NCs{Gqjj}@qH*!VK_zR=vGOP*br z;hNaQ@>nO!`G|y)MQHzpz5L-C{n!36-T7xTtNG}4hPkb_Q(AKs+D|`}vCBBU?AErA z))9L$MO3Dp{d%+{ONRBvE%}(YIkj0=yY?qwBR>|U%&cBOyThzZB8h+>Ee7oLFlDjkGOR$>SeFcjz zN(V2tbNaq9H2KGHaH2W~&p)~PAEL*Wui@zrHMIC8r7V10a;C+(2QRX}^iMIi_@j1r zZ~mk2_2-U6uxI7m+Hv+u2=lWFp4hpL!OJdQmAsJVsp0E$_J42VM=dAir#$_CrcS*0 zT~fMw_QZ`*Y;OG*>_4Tqxt;Cty=Gul)O7LU;vOHnLnq$wwLRY~IqP&%!nTfoCvDHD z$GJaeUcmUHXJxBbQ*!$U|2$Qj-OVmBZsFFG=hY=1-sCgeBWjUr9@m$cMe?nIY|rnz zyt>$NV#ziQ9RsLtqJTm3(4^&ID^TPAWTwoZ293SH;3#+UWV z*1RaYSJS6Wtlub*m+QGWD8hT`U%jl>uUELFSClXLaD7^g6w~eXnip#mU-s|kSeY+= z?i~9B>;DcS?1o#}=XwemvQBbq^FF*d>yec8ZHbJFOQ!XFF6B8ct`-;~KQTl6v*5%B z9}=4mw{!OIIdJ1ld_+fdU?qEne8v2ktlEbkt8?(}@%jHDe#V@&Dw9^IFPo<}X@z^I zwa1Y+F3Hn7kFK8(ux?S7*`qEOlUr@GI2ImNzbMq*raNQOpM_gH7FK*ZHgBQm%f$=& z7HKQLC|P)!b(Xk@ebt`(6W%e&yy)y+5YJ?nmiN!(;lXf@Z~KotStB`>pV9h((k2Zf zqd$^%@7Y4|VM(D}1&;xAU++dp3khSZ8p)fA~Uxfx{T5;9wL)mfvdKUl)w zC*RmroWUoi{7u5ayVljDeVamSQ9;XQK{u`)5@#OjhD(K2-+HUw>MOm`BzK8ZM0@Co zM?KZTTX~~*KC1e1?DT8>(l@@FJ0c@uGOuh+3BEtiJ$H4dmuCBQ>EL{>lBLMrkMeu^7@7fE>|949GJ&MvdXcY?IZ+YRC(1lOxLexe(~7S7#8h+tkhXd+7<$gYF!sD?YZD^Yzn9i*x6;=kKZ5y!rXf z_#3z6<6^Z%q=WBn;#@tY-Sv$5l$gU`Qx{BLJ=u2UjLF7rrA}sH(PCS9E%!XvTY7N& zeS_Yed9hC4HnmQ_vRyj-y|BsGKdmfsLQw)U+&zy>lUWxq(_qQ@1+PA@h$^`$ndv!; zZPz;Wzju=kFj*D9@M#oM+Le)BvWGAKhvcrq-vuQ0_IDml?^yBlfa(HX-Fqj`w48Ww zAYM{xqrv zo7NZFOV-wNC-n@r^_uR-C z(wA25oOCwcHag?O+j!-l+wLj;?5kg_n93wewU*sP5zW^63fZ zX6?P4vo_sXz3{d7rS&s^#d#d-xIBSl(Q3V<&i#g#|F!;3X8+LtM%Cbxz{82+5fL@= zx)05g3bwZY+<9J7ay#S)`9ZnlGoY^b3iQiMu+~c;W(`#dc)XFKBKk=R8u->>;HYPXQYR9d+Kd-F+U9l*S-F_Lojzmx2JxI=wYA0eiinl z=NG54ZaHG(Rl^i2>HF&eFO%XUPJZLf^9_vZ+U9+bmzYu0%lcKfL~p^x12KPOm>=g~ zl3t}|^G{8AbA4*q&K{@oqD5+sN^BEbm+)?|>tCcFw|uGk-A@k}tZOOrs&Oq871G(z zFn8O9;uDQRw|<`%sP-{o?JE3fc3I?3m&A$Vl6nX1Hgxt|6Hg9^c3JqG);N=d-)J z^-S)k@48Z=u=f1_FX!_zet#8p*j+t;;m+?CT5C0`{+Bu|R-d%+@YY$Lr+#cL6gt27 z<5P3ri%G{4Wslx)Xyy0aedf-e>YkqP%l09S=hGEss=7a3^zYQUalusmf`iRR&d(Fg zIeO)j3VvxGd!8N96YCaSyTHGBSI4v&=EpXD;Ve;G&m0xI$8^EPv>tnBY3JZ(7cuLZ zb9SBjaN>6h+nSzpb5k5wJ3n?7nv=LH4t24B zN1pC#Vw1XJmQPi`d!2di1&73mm3Q5;KSZk38|FUD?XXpw)vUVX@6yu_+<#kdu$z5M zj28RaTRCT1SDyWo30y16@|Pb9JM+75Z*~6d+Am4B|7MEce&=s&-EC;yy;8(0?8zOk z)@14Fx8(M|^y5)}v*XwXo1GDH@9Kp7uNw+&QMUo<6jQBtAudQwJWLR*b?b+>(Qddb*tN=1%unZL@u6d zx^uJZb@2-lF3XP_%uc+g@%(7@%-A126L*G7&Z%picr)4O%ynVkA028nXR@D5#M!vr zf8zYb&*p@~lk+~S-!FXVe7$$CffvuCz>edJ2Tim#w{4xVEh!;6LgmP$g!8fAzZid- zA}Nw9Wva<4$~x6@?ZmYImo0vCW%A~_zBp&x@GbY~7_#Tr-(_p| znuhz#5i_r6H!R^4x0d(*?Qn1V_oml@m&=ouzvhA?dl|ow@6Ump_eWT>Ikl3Y`Ul?(Wg|ZY+4w*5U7% zBP1ruoDpi=r?{8h_kT-g>wRN`z4GrpH2-Z}+jGX|e9e}5E+J06yDwOt_xYmRba?8I zU#lf%*7SRvnYhMJrCPB^^Hx6l7PD@l`6+qZrXHO5{bT>1#t%mXpH0bnAfuHiwrDTU z`F+0kU&z0dvv#O>DDXLiK|JtC|L`}yn*BmI z`m)Uy;qVwJynUnXWelVwWQe;|MN{DUWleO%|IDSiyvRK95Dk26Y-A13Y* z-u=PvO;X823B$8H=eQhwq3EaInKD(+X#(pX4IZiKA}5!-O)&^O?Zc1xo{2Xfxw0~4pTKUvS#sWK zWhYymuk+c~96Xe8^wUGB4b$0FC&i2Ro?U2s?njRDyl?i(+wQxs&KEx0D01iC?w3;M zmZ{G0b}qhneb)Tjv*co8>r2^}x5QrIu(rIpqc>b%ELipJf;&5VAAfW5v*KPciEE?R z&zKiC@^)R=boR=%KhNX;IZMqmuPR?7#vEN(@ma9?b0$~b(Z_e4gU>s*EKBb^vYvra zsoQb!jx~vEB7VC6xEJvd_P-wHD z+LhxR=kB;yd`eY&Zf7pz{8(V=Y>m4|Ogdg`JGgTSCYRi7)I7&v_^UHRFsaiuEh(4B z=lUh*jCS6ajA1vztHt%ooZ?O%NIQE zWGy)+IXCZz&;_~sRyl9?FV)S7di?S3@7J>#YaMT;uiCX|>7HAK{8umOt@)G}w?FET z=kYL|cWbYhahW9LLmoZruR;Z#tOh_~LqnTiYj*U!1|s>W#Jm&GrX zjJflTZGz4nxbT{%Z;wyKABE)4{u3i4m}=WN!kix0AG80Uwm6xoOG<$i;s0xv zL+g!gqRzf~q@Gcgz3G&Zx6^E8q4~~NAGht}D7h5yzx`HNQYq#tNmUN3x>c_~Ni>B6GE)}xnwd_pC;8{Fj6GJXkk zUsmksH(nj`Nd71D!iVKE;xl5mt?GTK(AK;o>&QFrh3-o8at`|#Oz-@zSBWUj5U9y*HY7dMF-_i2jnM^i52u^sc}E4~_0l?G-E@D$jbJEw+e{+gz|Z zL0|KyM`$UpYjB{+)Rt8fE-0yN;V?{Xj40`=$T|3fL2+2Od-I>kP~H zux03OtMM-SJmIbO8~I61a$;ZnUrJi!eYyK3_u$j>?w^)E=1je85^?Hk-zHQ0A4?r` zW83RE{~WnlmT+~qli>7UWeVTkKUk&Dz1y5Sd_SkZ2LHzG0z0eieedp1&-xc!;&dd* z`1I=L{rL+@g;XAKyC@fDY;;YKxsvy6xxTSUk<9xWWyg~E1^Rb(9FOTaBd2Uo)UxrV z|HUnikIe#lB@Hfb{8RgQRpN*Bx?dNnoQ)A;>FtfW&R{G5Qpw_{*1w0-XT)t;@Y(G1 z#UiG^`UYl!-ZuXtH*H@$y+zC{Oj+3dqR@To3tDr1-0YWJ{m#|b$GoHVcEQijg1>@3 zwrnc=^-1to+1g)@%(`FgO4>JksDqxVEbxeZdM-wf7hV%1!v?2}klTR!vHmwVOoZ*Knm{`cd%#tSYU`8;z@ zhF#j)?1N2>tkwU&eZF`8^PTUdrjHAiSohQiE1cWTI-BoK$%9=Q_ij9N(6YAKJL&TN zY=+%ed(&A8cph$>cKLSklw;4zSL9SQ)&^PWo4cB~{R?k&ws?DU zi;3*gb$U||9t^&x`Ce-M`T4x&a&B+T-UrV4o!u~P*2&{>)7RJj-IuiZS?Qns2_Ba_ zdyBX5oH7V~;}l$^zwB3N$Jf9oVLy{II9x9a^sf7N@2BWi>+}>UIj%q3nWDmfe5r|j z+4u9+q_f;^=|cQc(-)rMdDx*D)U`AtwsV^zPwrg#Td$VB$aXTgy6$Pry}c&o%O5?o zaX#EDbm3jS-37m21v}XaZtmrE-^Tcc`DjV0+_H^7WwWB=5|2#gnX|b5gYc@`d&`8qE-VFSnP#V22Hf9ShntEXaAS-5)Mrx%I* zQ`cH&ys8tdkhhVtx@EU)o!->O#>qQuDtE+)-k7UGS94K3}@CZ%*d)WG;f=Hy@22K>-kI9{!hFvf4J*z;X#d~Pvt(I zGE-ZgopNT~>(#NTdecv5&rymk=;;-?xu@uRLh<&;iC*u&H$5HFG!4`)(k2;Ms=$seyjyPp~eq{dTeH?db(^GH+hmo;s|&SB}s6 zp8m+e<`_T^-L=YL{-W!IcT?1HQ14_w&6lv``D)7NoMHjm0`!xsP3O%?awxX(H^ z-z4|LY4$G@&;L(oT(_>W?2xO&=gVQSd$XDW1g%JNYNCL2vupY^GiNe_iGO@_*{zb=`F_CH;(VOTIOw z3-oX9+BZ+wq}~7?-ZP-2gSVP_mzk@M5g?&$^ z9eKqbaQ%o!?jl{qj3}oQD?UDV*=XPHyKhN0v&Z$;56!H~r4U)9eF9O}GeQ8fG7!tBVlU3whJ(Hcq43bR%Pl!$&0 zxc5!1_T2fxfHNJNIonsuw+9>L$h7`W5_Xy%{cGp($G;}s$=klgtAFRzDsR5&;qwG# z=EcR7JT5SQu!v9N_)|;g@_41*x%`)}eC5c!>)sF(GiTvG)7D#U{4ZadKPU-#RCxV? zn)Hc-XP=kw@AFUn8hA>J@A9RoT~|wG`k%`*H!sh8SvPstweXBL7B24_*mf^>`Skij z$fJeR64T{$W#xl!e^a~5%y}dCriJYDj7;Cf8$Dg`KagDCUt-MXKL5#w_hm5`%o%N? zf_iT9#FsQaDoftpYv$j0IP>VUtRsG$Wj#F~SX)E&6LfC(Y<#82V=8@O9f$gIJDJ#O z6U()NH6hztzH^ID&Wh^r+9N#mrC!h(?()@V%HN#S>E$&E&)Z|_93#%S#x(fU*Jg&O z*rNMPQ+EhV-7z6$@sjmSy5>J7=WtDGYP<4pPd=aG<}%e?(^4~}oeZ|HB(LCi2o~*H zmLvOftNx`MpBbIc+1x2fDF2pN&eQ8yYj{CU#v)ePB3696Q{Oa&du?U!-&@PvyLI#B z)Z12UTP|OI@%5+1;b%X3zOAb@Dal#7^LJnsTR-D-iK016HpRKsUOwJ)uu(7kI5XvWE1!kOe%;1d&q7vZ^&pl=h&aB)X=J!3jKI(-$n!99% z_@tybk4-Q2HICR%UiV#n{hN#PYu-1WGq9KVS{HbRuk~Y|UdGClS1Y<*mPYn@ZJtx{ zQEw9WUyqaA?&~;}T&2%_Tx2?Db$s)_Ox9O!^(9~by?EWUwCCljc8$!sxp}+GGp^n1 zziX(l)Xb87KhxG+oyjS0)?JUT>REdwS@qb2?VTrY&wajCw77E4B~Dh+hIxv=6=&U! zU%K$E=dJ4agd;P1*=1u77imewFW>umOS!~$fz@XluC86O_IqyDtb2==I=9|k$N1^P zgo77O82;L2e>gRqIkREXxqZo3Ok@`A`Y6DgD}TYVLTdGMnY@ySx$`ey_-u0Z?Clrt z{z+W8U|-U4tF6{#tL)LYnp65r-@d&ur}k3n#M`U88~1&fzfWV`;g@&c^nRP{J#E)w z-+z9~h1*w)^P4uzlzYxTW$WISjei__L|+?TUwb@Ydsne(;EP*flP+(Xv)Hw9MbADJ zX{IHACrLB~@wjDvaZiltIkTaIEU_-uGlrz6$7*NdCD35C)sIcr*dgcqy<9`1n&WJPD z7RK5}mG!JUvUv94i=x$EmYsVyXE6x1Xg#OraIuiVqmoxIWG%dkqq)xV%3r!z zHOKMz?i~{!Ka){Dmt*zIFX;9kyHMZu%$JsZQ*&&dTzGxQ*ZH`fm6hFrx91K$`_s|( zj72KyUiy)=NqY0<%(b|~d~eg^-Hf(b74Hfx3Mzj!M!8)GxW3k9O-0k6S-KM1*OJ#n zb}!5mo%JhX%UbOdD|%IqZV*_S$mzBB|MZ5ij=B>^ckhjAIkib-s$vVz=VL40t6q?N zG&wNor}5`+X)c~iTmL07zb**c61XHI$>ZXY2^l+^T~5nt_%tr*n5dGy$n*NKqCE+c zH%+xKn6@ui`PDsMykn)N$i_6=U!QbE%=fzdez4qPPV@Z*7k5>$>`s<=eS+cewYs); z_Ki{P8*Z!aXlJ*LXivBid49uYxz(FFS8tvwsNEB>_d9=CK~U@2+G*$hxnxO~UB2^6 zuG#tJj=NJM);`aatm!+pZ~4pOcZ<*KEnjRtv+rKYEbIHp2bMAUD^_@IcWKJg)N*E7`O6~c>cyIb9+ky9QpwdUv!d#+gzl4&b~dJNGE}MSY>Tp}u`JSHvyWV!**|i+6PcVeN7BHJFI{kFx@yCbKSZ9m6-RZqy<9p+d z?hRYn{y~;SUO!UbW*Uyoz9PZss z6EmkRy5PR(%6bXrsAaL8KD&8Z_4t-5O3hU5_{$bQ=}V(Z_Tv))9RO67<41fP4;tFK82xHjJY0KSxbor6yK`(l zN*;DDvvJ7p?|$gGvVGBV{yBLP%UbQ+ZDS9Y@}Pcm4L2a$C3D zvszd^P*tl6^l@ zZ&}4H+WoyWMoxI|-^dVC)u8+9j+~QJ;NQJjaCRxn^s~E58Q!Z!zWP^OxmMOq#hv5U zuHQ>GXYY2;ij>Up0p~qdtDOitXWqxq~AT> zyef3b>_Z+`SSO@(CG6My;o8*v zne&%?Rlh0mX>Q}c6&h2Fub#eWw$?d(J6r5kFQ3rW8?UTW+n*)cs+xb{s-o%t@8x05 z++1I#{&^AL8D4J_+Piy2Zsn|R_wIg) zo?NhFAHx|QzIjXc{$(*e%Xww{$ro~VJ-xyfHflL~7k6{Xryuwz_xA7l%U3=c^}bzy z@lsLCw`au(*(}k@db1}U{5N?^`P;=CzlKKLid(SwwJ2MA@yCS310M~)zV+J0X8%oU zX1T}e4;nM%`pfMNm6r1Lcs!11Hd9yDd+E+^V3D$Xd9g#*EGfqCCpZi`?uNN~|MuiM zb>E@B&N%6-RF7%)#qf1UVz%=+AFet#ZT+LghdeI%CZ0H&AarEIe(sVzmN`5bGjGbb zDt7ez`5Jg%dckJh*)^AW9_lZj`DbFcw@R>k?Ue|XIWh9ek@NdzEvY{H?bs96XvJR( zjebm2`&GEfgst>()R*4Z7p|^x2;a!#e3eV*>gp5PwLOFX?>Bd#t5fA2_t z6jU?%yeaZWkNAw@qdYBzOo4_Ex0G(Vd_8~Z^5bsq(F=u{N>~x`z z6C7f%Zw}eI$EVa;YwldBJL|&UKPeRs%WmCXAGzuNCSLQ4H&-s+_tU`itbXv_Uo3mK zJ(qZB`at1>rr&GHU%UG*Uo4t%?U>1X);^EzroEefZO?cUl2kf3@kr#s0}jVondQza z$hGZVob8-!DD0PT;$6~-hZEc`-_esPI~lQL|8g;#w-z$bB{w|}i1}-FbDHmrYMR$3Dzpm|eO`f$Lr*3I_?eyPq-wSLC^t&pqMqWWmSy{qiX=egAa z-*?Bzdwl!JUZcHg-mH&%8LZUvFE0wIm1zIeJW*1tK7GN|S-XEK=(iY8EetwQdw11F z8)xsYT3xHlC#}BUw)BPUf}ZA=)iV@0?i76WJu|D!GW^`muKRbtNw3?JC3eW7@ul&y z57%y2e_&8ne(>pl(0z#(Po~GqIBou(YIYExo9p-H@4b&s>C(;TnoY|0IhB4co3(rX zQL7p;g9{g@x@GU~TDLBFN6bwJJvqBY$G>Uu#`*`{{U@SZn{S-)n`ioJmj2zola@2~ zFK67o`(C#H1@3uyIom#$e4oE$YdU}LUH`zln_8#cdmABJ^nS;5zB!gW-|L;qfB)u* zI&YM7deK&Y$K2a?yW033D%_UdoOn3%dk^E=68;Az-yfEIe^}`4u)XwqV)5Yxcl+)> zOgdpzb8y1(tGp!_Z_RSfz0Ce(`dhc)FC4ADvkgskjt5A0N9>o%y&GlZm29EJHgU~Y z=Tr{IJifoz9NrtZE!5#qbyTmsytLDBj_Lnov-bZDY)g(mU;d)0T>i{=cRjsHhhmQ? zto(A}c+7!-n?W=_JwS-l%zNy!p zQ^Z>mb#A)VMr-Y!$M^WtO{T{zjneDpcVC>*ecSd-)9$>-w_c|k6@PPix99cwFT5p> zOC0Ohcl%0jH~y`~n7HV`?f1FNQ7bewr^?;rXgS z`FVC8KH1|hO&G*v&J~w@m0P&$sp+X#@k_EjPImlmG2g#be*4|V+8bTRU-JI@xUGNJ z+qlz4;ydQ*@>u#`POopCweIVc(lyIB{to=bexL2R`h#l+J2;;=^zA$7qad#BzT*8I zcjt5=+r#q>QuGhJdogK|rH$U5FUCplm*j6~e77&^7yGV_eAX{s$Q@$kiIy$-{_Vo8 ziye0_y2j3x+r61ZW62J)&N+MDzBsilX;r;|bFGZ!)qfdLhc0ZrbNJ*X2|lSm9;O~Y zCmT5nd~9>bpX2#t#*!TzFB2S=a=R|&Ry`=;x=3@@lO_+LE&o>VB+3}+Dqr4X`Jp=4 zdA0Yu_z6idJ*PH(v1XpTCceq5*!<y_?Rw`f8dhxL;w#Osj@m!|D$-R>++HN>L z|B#k-%Pjc%2cFnmuQ$x;2}fAWjLnvdT`)Qns5Sfhg&V4eJ=M(04d2R!-f(Lxw946G zQ+s3XU7p@81{t|&H*WRceU^5E?QLwcikfC*#doD;=jWW^H9x0h^r_5e+V_>#Pg2yA@WawWjQ;$WvU|=5R@O;RzncH-PrfoP|a6t$GczJGYpHh-tYO$$520`Ui@*Z_KtU}{wtYUGQK!&72}@n zZdk!qcyrfBi!4dWlS>z?&-*p)dS=%Bvj;qsCRuUvS;CL?#}oSx0QvP_2ty$?53*YlWL?Afcl*gacrJ8%DOy{{84HPyO!r{Axe zHS6Ajl`l)JtnVl8c&{wOY{?VtI%i!C+uY-sZ*4t_uRBKVwqKU-@k@c9m&e#9<7n3F zV=v_n99GCAd9mXx&0PUO zB?p(hXqq^4`o?(q)-w{0i>xH3+I5-S^*SfDy{5lG@3vL`|C_ff|JU3oXNyYZb6FYP z<+QiM`ZI_N;e74`I@M(KX%iTT$zl4*QTHoCG zX)*omj6-K4Ckr0qyz_6m{eu##%9l&SXV`u9O7q#-DH)u1$X#GZ^}~G2>SqFbZJ+k= zYpLAl5e#ghf}9n zy_sVsbGWRaVoz-CU5mSGZ^-ysym79Wld!e%E@$47o%Xx4BYxR_Uoo-miOH)c3eC+% zR#x|xEq%&sHS6+=Ov|GiLXSK=!@NndXzqi_=j9SVCx5Pd{8o3%)~ku~g$6bmsRcWj zXFKm=l-XE*@yeA$KM!TuoxbqM_+t@EqE_+xeT^G77_8fw$5y;vbcRLj1NHr40pd2z z3!iar@(N#^8+H77>cJPc9tC99yVqQs?`g<3Ax@&_&V%!HbLT%XP485?C-7@+L!G~{ zUz1(PC!Z^>i-Po(o$rWz-OIRZ&7+f+yDsT|7QK}a@+?6liNR>Eyiu$ISFMGYvx!!% zj#uuNh$nAbI~oH$9bJr^A4Hf{>@u8TV%WjF%fU{kLuql6>8?}l0rT&>7CH;PHvc;@ z{Cm#Q6-Umr@qXV}``a(={Jh@&e*VX`EO~ogO46MRm5>gUVS#b!I}Tej_5xc#h}@1a|X1q;|W7#dyDwEPvgq_3w#ZuO1cf2_C z?8PA~4b@eaZ41^*ez+m=;vBO}+uGwAnsSX@fnlekCS4Xot@7?!R(;w&j``gH_b5VSg{t<>L zNgOAWRJ4+HGLJo7B02qk>;h4@e6O{N4I$17T666+ckWyAn)&Amp@TP@N>e)cKhM*e zHoIO=!AGbf7bMpHRiW*5wT5{CD)W#rDMA}qXf#+l7tZ}enCecw+A|0T2cFjrOElP`QSOSiud zW@9tT%(Zn4|F3?-cGB0p@^r=8xqBb596zw)|7PLs)iV|@G&_0jy6#uW?Ik5i#nFWq z+q%u(Z1LX4srP}$yZ+ieWyZG>daON@TqC`OdVM*+luX-LbTeq(ZqElFWxaR)Uugf( z*fZf$N~3anf0OjCTkR*#oI23loIGE~RYJYss;GU^XJ_k*2M2XI4!P*fFO}7|`>)ph z{+qi1%e|YwnOakiYv$L=7r)K>Vrp%$&Gy*I&xSH)te-tSMSdIQ|3ByO{yMv&`SA%0 z_}!OvD&O7EH)qdr@!I#ZCLd{<`?)J?-oChb(!EaFQw6*VMf^0~B2zh>m-0J3?Oo$x z#?sq3Cxz!*+<}&A+Xm;QlU&5xY|JHgs4_f6q;QCu&}B^UBR1dVEig z+wW>Ee9Us}C&!z6pA}-A;{(E``>lU#vcO&EmUrb{!Ckv~Z@9lYkh*mLYSs;x?q5FB zk-KI7PO06S1>5f){&1jmnf-L;sOZ}t6QriLhk98&n3(kj<)A1 zYuqZn%W4%P^V_}ZH~yVS{_|p&^p31`4k=gO|9J7(d}sP$rFoUlII~vIny4Qa&U{yEu|bqBw1l8@54ZRo$S@8)VFmjy_rxp%L!qg9GE4P(LSk8}Lmtivd!N{!BfS6D;h1G-gk~7{GF4p)X_Wu} zrpU}rrdjj9$o#pU54(2Sota}hQTy4MXV0YnG3T!1yz}Aq|IhAe=VzS0;%PkNiE-~q zVfBZPl?8U^D1Nu!GNt3G{j=wvS@M2&AGo|;=U~X5`H9n~&65jcx|O_m{btGSi|0RV zEL$Kpd#{Lj>5aL)4;mjbO1x`to0XUo_R{LsQ31I%arbSvPsu*Spxl>M#lC89^W?b6 z#p|-Ikr%iHrUOpRl+gnitD zF75Q9!@c2!SMSX15nuNC+&qj`*nN%b@xik#~)k&ze0HbpT9C;ckJh1 z|K^&o?uK_^tXsh( z@-lem`+dAqt}H2f^``jG({<7k&y@}CtAmKTvW{N&s=lpG-fw*2)S{&tXSzK$9+?>Y<%d!oNAUgBQ2(D*w4BK3sWjr5w36-9u<vdwnw*6?}OF6(y9S+=cgj>*F%opt`QvD?_#-V}T|yxHgb z%)>5;O2vBO5u3h*z1#U+udn6<*Y!B_-jkD;N?+c7uZCBAt%}zCr?+Oas>Q0Uy%sGW z>t1_)cgND*8>Xl!1lt~5+<)JF(jQ&dQ;mD8W4`U#A7x;~^}hesY-zV!KY!m?4jOJe zxVuyS?wxwp7cR*LoyQV{&M>OXV7`(6F?s({{--}%Pxx$KtapElgHCnUJ^oYEm2V1c zP`AC`-`wi$c|Q8b+J-)H=ly65Y$%@OUdCFRz!+$ylHzL4_z z$I<@368d)zsXSEYIOO~1%X0h25077aB>qdgW|^n4&|&F=ZI#=N z9cP@jcqpdEW$!Am?!muyv%s5+j(O?sT_?5cZSReSMO}P(J3iUZQ1E&1>1L4Z-~0P# zdBq-%tovJEcjU=QCS$$XP5bXBomzeM$=v@_z6;HNaO}TC`vc_4JzG$}gaZIhqPE$dV zX}0HA>YIJIWxfAVPnB-3?E1$~7(`1w?-VRPFy|(dv6_GS`PH0rESEm)v)4(v_C*sk ztZEYYU~lbu2EH6K?TQ7jx% zXXdn=XKB3u@7s10^R2~t?x%ar?;M(P(s+hRq1E-cV&Tncah(c2Dd(PsZ%+GaYq7Vo zJ5T(}cm793l^s11{R(GNzO9j-Y5bgxCDAA{GScSv9laVgt}`=K3m)q-ZJOeK@wsYH zjArtFqptbqg)5$2y(XpzELEFhV#qXAvBf0V!ks(GGICRwzE=2z;N6q%uxTDS zHeq}7o=52?4DWa+9u@9j<)0kCOE~zUv`+NDY_%To8FqzQ`^sA- zjUG)*_5PVV1q&`*xzdn(#JBo1$NoP@=L@#X6vDC+cksL6*!pO4Ex>X?zJiSB>dWP^UtsF?GxAdJfFEd{>iQEyrfS{PXG9*`@hpK z`$*z+vvy`?=NoVR%HCDdQl963 z4}JbNDnYO2*|q;4eUk6h26{%-hb#+7vC>pGjFk7cGG+AY-{_|V2S(o`t%?g}f__(vLD`7!=7vH-VdMOtY5Bf^} zRX*xqesyc>or1%>KYHe$Su-5!W>UwNB@1Y$RjY}K(?JD~P%Pp1XIkC-E z3OKZo|C_Rpz=xSi2D#H5_Pk={ah*RQylzr-{_G=XUbD8mWb$6D|GcG2I$g*5r0z}6 zy9qWkU1xh5w-;=&Xge}T^+@`ivxCI)VUa>dsExDs0 zR5WeUjNLO-z6zzxI(ovS`{wkm4M*-Qy%c<1z<1V;NhXD7PX|ruOmX^>&-~@O-K8V# zkN16^kaw>(u&8!{iIF~=_w#wT5~jRT2-^BjMv&PeOyI=I&x|j!7X^f~EnLs-7A)Ja zQE}F#b-quo=RKeElC^CA=6TZjvrbw#Cfu5`GN$yY%#%%jOG>W?U0<<$-&>x&VS?&g zE$-x|Je`wrtVh!4!^}fVIxk13dkxwFd zyFMQ85mqxQJQT9ccHiU|FCyOU`OIgQU)f;(-RAhYvN%_j{2v^7S}gST5~Hk<@(WunQ^XV zSF3c^o=;d;Ked08eDd+t-5tB0r(Mh0H}m|LXw95Et=metpS_BeI32%aSFB_4d&9nY z74x*$iO#TePx$4-*!$1q;zmZFnQDxCYi?$l?EL8?Q!hHX=2_9#t;UvxuQ(nGGIBg- zS>_{q{B8YDS<%o+3ElaN1^XF9r~r8kRFcbwYhAFP|a=0Cp6f9Qn9y<;mE>8hl=6-UGzWQ;Z0+2{12yna{TVfpoVa@|Nvf_}-Gg{Bv97 zZ7w8T6#jgv=XAWEE=S_}hx#f{b(8iN8h$*c@aU+=B%Z(%yc2`E7un57i4`b%Yjn?6 z_|(5M415ubEMp|jxgWhaXIVT+Ma4ykTa~r_zj9@1Of*TKv4b`r>xBqCE+A zKi5hdT+LP7{>0Jes{h8nQ*ZBhb)3m~o#>CF?^!O{-8xo(UcTSJHQ`Q3<68eCpB`oR z8zpv?{I2+Xp4D$oZEw$=y)Nti@IGF~6;rpi!NB!_yS=!;GR~Y^Kczptj#FKq$o}h9 z^~No0oML4gR$4OU-d#LLv$CQ2xsu`5w=UPW^d>*Mx@48I=gHm&6EY>w%m0%7Z8W`L zhe99AR{2h;`YFo zYWVzn6ZoGo^gh6&@6nb#-fM05s8A6)n+;#>Ot zlhu;-&oUBO*h>yB$#y!a5qmy;Y4!y(n*%QoDQxKtoMGiGc)R)J+K!`_J{Y8bx>mgJ zr>fn#J16cFWBL`Zk$TOxI{1i3 z$|Iqa*6thm`U-Gl4(e;r%f;cIPRzQ1AV)6`E< z@s81-O>WIvelf(})$e9-P2i5nk9WP5Ia$-xEZP5QVxH`B9sUWSyO?9oc1vX4cL?4% z`^+NopLag-ENioUkrnqK=Be2xZF!aDRkAm?UQ7x3QMl?y9-pL>WeUgB1$HgWyAncf zIZQHT)G+xsY0tK!LEh;rOvF-o)DLPza=kJ3yp{h^`Qn}#F5M~m6LUC}RLk$a^LF^p zz4S!Pe)Fpmu9FfCJz2Rsx9j|9XPmo+Pu*Acpkt{;yNRI8wbr5t`6C}|>itAm3RWr1 zy4N7F5H@15i<e-5k@krzMmvG8A(-KprKFS{cArnwca z(dgpW36wEBR&-@Y6TeUP&l8*GHQ#!=622Te41|dvjksgEv#C6MaTG7g5LFe%`wIISu@`|u8VDs*?z~m%>I>rk#*7K zw;E^a_bFVKUD2~|1&`vrm$NlOer0&Fy}V_6RKlSvQ&a15lBZjIP>AmJN4dYwpCI|a#kbFV_=a z%M~x*?ey90v1#U2kKTxt%N&Ay8<$8h2Xy{h;Zpz7Ie|y&@(XsgNb$}f=|aXdUy+kZ zJYLQwUd~4(E)>-Y6xAvi#U3bUvWncCcV2bD|EsC)2bH;lN*2nT;7{8BOmF4HI}$c* zC6ivn9(A!7Id)WK_PYsBa^v@II8+(D%SSP;b&-JbgwBnVUM~42CuI8C^AfwqrBH+dc%iT5 zlU4Mb()LKVR&sis4w~{zVal=#+-$3rblB=&{@46f z$*!Syrns+;VRA{fisYgtLD^dbANGod-{R5j;_HG1);~GRec} zNJaSF4~E}Ya$o-T|Gb0tIk6o6JuF|oKl=5%lU1uwwEF756FQEQd=9F-X!Zs0E`a!foU;krn%NhR5&s91-yE#qEr`^I?j&Q%FlZy4TOQFv;_(WzeI zeO}^rVc-8vUD)^V^wRz>??2qKe4%_iD|x0_(~n}s6Q+twW-jtHcVBRYRq=Y&X73~G zGuGts{p;FiGsj9RGEU<+&n1CPLHm15{zhFYl5?2;|H&V3^Va*qbItNPz0dRpp74FB zGHc1nq@9*5OI0U{eC7&q<4lWuw`)K5mP8Mefc#k*9z-#aRDY2hq8~e=JKz05_0k@<)k&~~c&Nw}9*VYwpTD|wm z++Uqt@YnfuiD>`1@D9OC9@7gsjW+9_`lBFH*?7Vw{*mdvWN|+6HjDi>XJ)4GD8=bt z-NqHH;8iSOba6h*-6WxsZhf15$5mzudIh+}m2iFhI;sCu!ND^Dc^vZ1(OkDU9oO-z z1U@$3W~BY~pUTSVf3_z634hzU|KPfc5Y9(RDbG}cb|!Z`&bjyOfXwG_uK)F9{@iBZ z<&bpccUyVpqQ+TAm6_9o@^{RxI4mS|Wa$Z)_{?2@-ZSite}24fu6$=ze9EH#uAf{J zKmA|My!Zc|peacln$HYY?vH-2Kewi%@x<1B_2MrsO8sB|XS;8shEJo4)O$6@7?&tV zm7iPv|2&yL(WR90Mg0}QxPy~F7jwzSPl?@h)cmGM>!mmDi(cvpovn8aEMV6>%I#^; zIw^r`s@j>}g~^BKB)gd>33vscnBhL(X}ieMd(%yV71%#J?R)0*Oq)$RE?__Bhd|{Y zD$ZwGSFjmY@Yu|}*DvDD@$%=y6+VJNFBkT@ERA+sm3Z`ejlljjE`}LCi}$M;xAtgy z#<*q=IhUP@jupk|Nk#@=)Zd9C;t)6BOQCaHp?5GR+^+!u5fy{Y~{cBe|i_V zk_}Ei3z+2VsPeK#)adLZme#zN_fq!0ms^_m@?O2!g_V^HHF_IU=EO^vZmV#9aB~rF z&sfn%IL*LU1n~Yyn!cp8dYBX@ib`jUc2)w26EBudpzC z%dKlZoz(X&oHF(Otk0Pr_pWx+&r#{EQ*h&rP^rC~mixxp;FpU;_mc@z(zw*^v^AFQ zO1nP&+51hO=Y2jaFu&`RMwN!v;ui~7=*x<~NmS<%-&d4qe@_w5`+H3Lfq(b=*smZ* z{EKv0E_L`ux!HpU_wQ-{v1i=-UFgDpw_hRuzpUc9yl#c?wBOg~>fMl7er28e(*5#N z-yO7F`D*R%&7bFg34Lz+du`UKO}Au=r#zdgBDqNAvSTreS1;lf)go;uy4w6|{;KKDMfHa?Y;cPCq8Is?wnmVf9o3# zo7vwF?>E`W^2L0`j;iB#gqN{jug$3_cx-ss`Tt|9O`HCmTzT_pbggiS;G46YDf@55 z8)ccZd+fd0cJu^Kx96q%zLWmtrL-MA@x^$t4&n1D4 z;o-ktY~OcBz@S5?ksaA>o?nK(VO4jO`W?} z|KXO87kB)hfA98x{ly*&3eZ}PySH$*s@u(dY=nWF~PP=!waptt##_4g_y&e9)?&tE}e%?N3 z*Z-9vhqAj2P zi~X}12IA+WEeWf=~@@RWpS{tO2dR)`! z%xpc!Kj)dE1oRyL^4l}(S3V2d_~c}z`kDSUzi;eFeQbF7TJLck{`@m~b%(xRdj0wQ z)&H^#x9`eGAO7yXhk=2C!PC{xWt~$(Q-C)!iwFY)2L}TKgCj_SfeB19FmN+4FchU0 z>*pj^=9iY}Gc%wnm22+xJ;lJlP|3)^AdjjvH7`CbCqJi5`u3k7-`*GVP9{I)p8G-BH&pN7@k>ctEH_?#kR=fBk-*{_-5r*&_Sf^Sy1}ys4P{Q*a00)EpC;++&jQwwipGjS^W_Rw-J2{oedn z9W@w0frTDoWr;bZsl^x}CefCACWV24p^$-rK@=KdP^AzG6i%Bru0L@$P{UhS>)e_1 zn?sGR7zYG-ob^8EfAWm?_E0Td&&yi_Hf?{rNz+UBoW8D?pYFEDK>+~)8#MJaPo41& zKjD4GcWbDZjz$Oj#wl;^6nzr*Hu`+&uu<^o+%JkVr+}mzxV17#QX- zFfdp$FfjPKhB)ea`nl;R=jZAt=A{(nXQt>Um1gFo=%*JYrsSmRCngr@=BAb;rX-dm z>J=2_7o--IWTqB}_8jCoWFWx${^yKKbq;)su68#mRMfv+muPr%sxQ~C@2&G*6}BZZ z*v}T67#LVV@dCw5 z8bOR8y^@L&bS;;Zb}%euU|?WmWMB{msei(&)m-z>u7iSX`W1te2Hogsu^!5SDIuKpZGu(wMBnz)(<>pI(|+ zl!DF8AcZiUEFcaT3oyKO?AL+hSbTQzf>nbEkdDnz9VtbL<%vl-sru+z|HNF~o4lQY zA?FPPg9Jzy6fbFffUY$&x3r=(F;A}`FCERu z2BMLHVM*f>RE^k*9CX7#nz6fL^;3u|AlVQj5YRI&$RH42(s&J3BSb&8bb_AAK-xig dNn`Fa3bI^)H!B;+7#;>524-dk29xI?9srX3)T;mh diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fc594fb..5ad0e7c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,13 +13,12 @@ @@ -35,28 +34,5 @@ - - - - - - - - - - - - - diff --git a/app/src/main/java/top/niunaijun/blackboxa/fridabox/ApkInspector.java b/app/src/main/java/com/qm4rs/fridabox/ApkInspector.java similarity index 97% rename from app/src/main/java/top/niunaijun/blackboxa/fridabox/ApkInspector.java rename to app/src/main/java/com/qm4rs/fridabox/ApkInspector.java index 472afb2..255e3f2 100644 --- a/app/src/main/java/top/niunaijun/blackboxa/fridabox/ApkInspector.java +++ b/app/src/main/java/com/qm4rs/fridabox/ApkInspector.java @@ -1,4 +1,4 @@ -package top.niunaijun.blackboxa.fridabox; +package com.qm4rs.fridabox; import java.io.File; import java.io.IOException; diff --git a/app/src/main/java/top/niunaijun/blackboxa/fridabox/ApkIntegrity.java b/app/src/main/java/com/qm4rs/fridabox/ApkIntegrity.java similarity index 96% rename from app/src/main/java/top/niunaijun/blackboxa/fridabox/ApkIntegrity.java rename to app/src/main/java/com/qm4rs/fridabox/ApkIntegrity.java index 7152c57..766445f 100644 --- a/app/src/main/java/top/niunaijun/blackboxa/fridabox/ApkIntegrity.java +++ b/app/src/main/java/com/qm4rs/fridabox/ApkIntegrity.java @@ -1,4 +1,4 @@ -package top.niunaijun.blackboxa.fridabox; +package com.qm4rs.fridabox; import java.io.File; import java.io.FileInputStream; diff --git a/app/src/main/java/top/niunaijun/blackboxa/fridabox/FridaBoxActivity.kt b/app/src/main/java/com/qm4rs/fridabox/FridaBoxActivity.kt similarity index 99% rename from app/src/main/java/top/niunaijun/blackboxa/fridabox/FridaBoxActivity.kt rename to app/src/main/java/com/qm4rs/fridabox/FridaBoxActivity.kt index 2909a81..896f64a 100644 --- a/app/src/main/java/top/niunaijun/blackboxa/fridabox/FridaBoxActivity.kt +++ b/app/src/main/java/com/qm4rs/fridabox/FridaBoxActivity.kt @@ -1,4 +1,4 @@ -package top.niunaijun.blackboxa.fridabox +package com.qm4rs.fridabox import android.content.ClipData import android.content.ClipboardManager @@ -38,9 +38,7 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import top.niunaijun.blackbox.BlackBoxCore import top.niunaijun.blackbox.instrumentation.InstrumentationSettings -import top.niunaijun.blackboxa.BuildConfig -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.databinding.ActivityFridaboxBinding +import com.qm4rs.fridabox.databinding.ActivityFridaboxBinding import java.io.File import java.io.FileOutputStream import java.security.MessageDigest diff --git a/app/src/main/java/com/qm4rs/fridabox/FridaBoxApplication.kt b/app/src/main/java/com/qm4rs/fridabox/FridaBoxApplication.kt new file mode 100644 index 0000000..adedbf2 --- /dev/null +++ b/app/src/main/java/com/qm4rs/fridabox/FridaBoxApplication.kt @@ -0,0 +1,36 @@ +package com.qm4rs.fridabox + +import android.app.Application +import android.content.Context +import android.util.Log +import top.niunaijun.blackbox.BlackBoxCore + +class FridaBoxApplication : Application() { + override fun attachBaseContext(base: Context) { + super.attachBaseContext(base) + appContext = base + + runCatching { BlackBoxCore.get().closeCodeInit() } + .onFailure { Log.e(TAG, "Native bootstrap failed", it) } + runCatching { BlackBoxCore.get().onBeforeMainApplicationAttach(this, base) } + .onFailure { Log.e(TAG, "Pre-attach hook failed", it) } + + FridaBoxRuntime.attach(base) + + runCatching { BlackBoxCore.get().onAfterMainApplicationAttach(this, base) } + .onFailure { Log.e(TAG, "Post-attach hook failed", it) } + } + + override fun onCreate() { + super.onCreate() + FridaBoxRuntime.create() + } + + companion object { + private const val TAG = "FridaBox.Application" + + @Volatile + lateinit var appContext: Context + private set + } +} diff --git a/app/src/main/java/com/qm4rs/fridabox/FridaBoxRuntime.kt b/app/src/main/java/com/qm4rs/fridabox/FridaBoxRuntime.kt new file mode 100644 index 0000000..5b0c081 --- /dev/null +++ b/app/src/main/java/com/qm4rs/fridabox/FridaBoxRuntime.kt @@ -0,0 +1,66 @@ +package com.qm4rs.fridabox + +import android.app.Application +import android.content.Context +import android.util.Log +import java.io.File +import top.niunaijun.blackbox.BlackBoxCore +import top.niunaijun.blackbox.app.BActivityThread +import top.niunaijun.blackbox.app.configuration.AppLifecycleCallback +import top.niunaijun.blackbox.app.configuration.ClientConfiguration + +object FridaBoxRuntime { + private const val TAG = "FridaBox.Runtime" + + fun attach(context: Context) { + BlackBoxCore.get().doAttachBaseContext(context, object : ClientConfiguration() { + override fun getHostPackageName(): String = context.packageName + override fun isHideRoot(): Boolean = false + override fun isEnableDaemonService(): Boolean = true + override fun isUseVpnNetwork(): Boolean = false + override fun isDisableFlagSecure(): Boolean = false + override fun requestInstallPackage(file: File?, userId: Int): Boolean = false + }) + + BlackBoxCore.get().addAppLifecycleCallback(object : AppLifecycleCallback() { + override fun beforeCreateApplication( + packageName: String?, + processName: String?, + context: Context?, + userId: Int + ) { + Log.d(TAG, "beforeCreateApplication: package=$packageName process=$processName user=${BActivityThread.getUserId()}") + } + + override fun beforeApplicationOnCreate( + packageName: String?, + processName: String?, + application: Application?, + userId: Int + ) { + Log.d(TAG, "beforeApplicationOnCreate: package=$packageName process=$processName") + } + + override fun afterApplicationOnCreate( + packageName: String?, + processName: String?, + application: Application?, + userId: Int + ) { + Log.d(TAG, "afterApplicationOnCreate: package=$packageName process=$processName") + } + + override fun onStoragePermissionNeeded(packageName: String?, userId: Int): Boolean { + Log.w(TAG, "Storage permission required by guest: package=$packageName user=$userId") + return false + } + }) + } + + fun create() { + BlackBoxCore.get().doCreate() + BlackBoxCore.get().addServiceAvailableCallback { + Log.d(TAG, "Virtual runtime services are ready") + } + } +} diff --git a/app/src/main/java/top/niunaijun/blackboxa/fridabox/InstrumentationPreferenceParser.java b/app/src/main/java/com/qm4rs/fridabox/InstrumentationPreferenceParser.java similarity index 94% rename from app/src/main/java/top/niunaijun/blackboxa/fridabox/InstrumentationPreferenceParser.java rename to app/src/main/java/com/qm4rs/fridabox/InstrumentationPreferenceParser.java index 526ff44..984cc5b 100644 --- a/app/src/main/java/top/niunaijun/blackboxa/fridabox/InstrumentationPreferenceParser.java +++ b/app/src/main/java/com/qm4rs/fridabox/InstrumentationPreferenceParser.java @@ -1,4 +1,4 @@ -package top.niunaijun.blackboxa.fridabox; +package com.qm4rs.fridabox; public final class InstrumentationPreferenceParser { private InstrumentationPreferenceParser() { diff --git a/app/src/main/java/top/niunaijun/blackboxa/app/App.kt b/app/src/main/java/top/niunaijun/blackboxa/app/App.kt deleted file mode 100644 index 5158f30..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/app/App.kt +++ /dev/null @@ -1,73 +0,0 @@ -package top.niunaijun.blackboxa.app - -import android.annotation.SuppressLint -import android.app.Application -import android.content.Context -import android.util.Log -import top.niunaijun.blackbox.BlackBoxCore - - -class App : Application() { - - companion object { - - @SuppressLint("StaticFieldLeak") - @Volatile - private lateinit var mContext: Context - - @JvmStatic - fun getContext(): Context { - return mContext - } - } - - override fun attachBaseContext(base: Context?) { - try { - super.attachBaseContext(base) - - try { - BlackBoxCore.get().closeCodeInit() - } catch (e: Exception) { - Log.e("App", "Error in closeCodeInit: ${e.message}") - } - - try { - BlackBoxCore.get().onBeforeMainApplicationAttach(this, base) - } catch (e: Exception) { - Log.e("App", "Error in onBeforeMainApplicationAttach: ${e.message}") - } - - mContext = base!! - - try { - AppManager.doAttachBaseContext(base) - } catch (e: Exception) { - Log.e("App", "Error in doAttachBaseContext: ${e.message}") - } - - try { - - BlackBoxCore.get().onAfterMainApplicationAttach(this, base) - - } catch (e: Exception) { - - Log.e("App", "Error in onAfterMainApplicationAttach: ${e.message}") - - } - } catch (e: Exception) { - Log.e("App", "Critical error in attachBaseContext: ${e.message}") - if (base != null) { - mContext = base - } - } - } - - override fun onCreate() { - try { - super.onCreate() - AppManager.doOnCreate(mContext) - } catch (e: Exception) { - Log.e("App", "Error in onCreate: ${e.message}") - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/app/AppManager.kt b/app/src/main/java/top/niunaijun/blackboxa/app/AppManager.kt deleted file mode 100644 index 243cc52..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/app/AppManager.kt +++ /dev/null @@ -1,71 +0,0 @@ -package top.niunaijun.blackboxa.app - -import android.content.Context -import android.content.SharedPreferences -import android.util.Log -import top.niunaijun.blackboxa.view.main.BlackBoxLoader - - -object AppManager { - private const val TAG = "AppManager" - - @JvmStatic - val mBlackBoxLoader by lazy { - try { - BlackBoxLoader() - } catch (e: Exception) { - Log.e(TAG, "Error creating BlackBoxLoader: ${e.message}") - - BlackBoxLoader() - } - } - - @JvmStatic - val mBlackBoxCore by lazy { - try { - mBlackBoxLoader.getBlackBoxCore() - } catch (e: Exception) { - Log.e(TAG, "Error getting BlackBoxCore: ${e.message}") - throw e - } - } - - @JvmStatic - val mRemarkSharedPreferences: SharedPreferences by lazy { - try { - App.getContext().getSharedPreferences("UserRemark", Context.MODE_PRIVATE) - } catch (e: Exception) { - Log.e(TAG, "Error creating SharedPreferences: ${e.message}") - throw e - } - } - - fun doAttachBaseContext(context: Context) { - try { - mBlackBoxLoader.attachBaseContext(context) - mBlackBoxLoader.addLifecycleCallback() - } catch (e: Exception) { - Log.e(TAG, "Error in doAttachBaseContext: ${e.message}") - - } - } - - fun doOnCreate(context: Context) { - try { - mBlackBoxLoader.doOnCreate(context) - initThirdService(context) - } catch (e: Exception) { - Log.e(TAG, "Error in doOnCreate: ${e.message}") - - } - } - - private fun initThirdService(context: Context) { - try { - - - } catch (e: Exception) { - Log.e(TAG, "Error in initThirdService: ${e.message}") - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/app/rocker/BaseActivityLifecycleCallback.kt b/app/src/main/java/top/niunaijun/blackboxa/app/rocker/BaseActivityLifecycleCallback.kt deleted file mode 100644 index 6a5cf2b..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/app/rocker/BaseActivityLifecycleCallback.kt +++ /dev/null @@ -1,31 +0,0 @@ -package top.niunaijun.blackboxa.app.rocker - -import android.app.Activity -import android.app.Application -import android.os.Bundle - - -interface BaseActivityLifecycleCallback : Application.ActivityLifecycleCallbacks { - - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { - - } - override fun onActivityStarted(activity: Activity) { - - } - override fun onActivityResumed(activity: Activity) { - - } - override fun onActivityPaused(activity: Activity) { - - } - override fun onActivityStopped(activity: Activity) { - - } - override fun onActivitySaveInstanceState(activity: Activity, p1: Bundle) { - - } - override fun onActivityDestroyed(activity: Activity) { - - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/app/rocker/RockerManager.kt b/app/src/main/java/top/niunaijun/blackboxa/app/rocker/RockerManager.kt deleted file mode 100644 index 4a32d27..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/app/rocker/RockerManager.kt +++ /dev/null @@ -1,226 +0,0 @@ -package top.niunaijun.blackboxa.app.rocker - -import android.app.Activity -import android.app.Application -import android.content.Context -import android.util.Log -import android.view.Gravity -import android.widget.FrameLayout -import android.widget.RelativeLayout -import com.imuxuan.floatingview.FloatingMagnetView -import com.imuxuan.floatingview.FloatingView -import kotlin.math.cos -import kotlin.math.sin -import top.niunaijun.blackbox.entity.location.BLocation -import top.niunaijun.blackbox.fake.frameworks.BLocationManager -import top.niunaijun.blackboxa.app.App -import top.niunaijun.blackboxa.widget.EnFloatView - - - -object RockerManager { - - private const val TAG = "RockerManager" - private var isInitialized = false - - - private const val Ea = 6378137.0 - private const val Eb = 6356725.0 - - fun init(application: Application?, userId: Int) { - try { - if (isInitialized) { - Log.d(TAG, "RockerManager already initialized, skipping...") - return - } - - if (application == null) { - Log.w(TAG, "Application is null, cannot initialize RockerManager") - return - } - - - if (!checkPermissions(application)) { - Log.w(TAG, "Required permissions not granted, RockerManager cannot initialize") - Log.w(TAG, "Please grant: ${getRequiredPermissions().joinToString(", ")}") - return - } - - if (!BLocationManager.isFakeLocationEnable()) { - Log.d(TAG, "Fake location is not enabled, RockerManager will not initialize") - return - } - - Log.d(TAG, "Initializing RockerManager for userId: $userId") - - val enFloatView = initFloatView() - if (enFloatView is EnFloatView) { - enFloatView.setListener { angle: Float, distance: Float -> - changeLocation(distance, angle, application.packageName, userId) - } - Log.d(TAG, "Floating view initialized successfully") - } else { - Log.w(TAG, "Failed to initialize floating view") - return - } - - - application.registerActivityLifecycleCallbacks( - object : BaseActivityLifecycleCallback { - override fun onActivityStarted(activity: Activity) { - super.onActivityStarted(activity) - try { - FloatingView.get().attach(activity) - Log.d( - TAG, - "Floating view attached to activity: ${activity.javaClass.simpleName}" - ) - } catch (e: Exception) { - Log.e( - TAG, - "Error attaching floating view to activity: ${e.message}" - ) - } - } - - override fun onActivityStopped(activity: Activity) { - super.onActivityStopped(activity) - try { - FloatingView.get().detach(activity) - Log.d( - TAG, - "Floating view detached from activity: ${activity.javaClass.simpleName}" - ) - } catch (e: Exception) { - Log.e( - TAG, - "Error detaching floating view from activity: ${e.message}" - ) - } - } - } - ) - - isInitialized = true - Log.d( - TAG, - "RockerManager initialized successfully - Floating GPS joystick is now active!" - ) - } catch (e: Exception) { - Log.e(TAG, "Error initializing RockerManager: ${e.message}") - Log.e(TAG, "Stack trace: ", e) - } - } - - private fun initFloatView(): FloatingMagnetView? { - return try { - val params = - FrameLayout.LayoutParams( - RelativeLayout.LayoutParams.WRAP_CONTENT, - RelativeLayout.LayoutParams.WRAP_CONTENT - ) - - params.gravity = Gravity.START or Gravity.CENTER - val view = EnFloatView(App.getContext()) - view.layoutParams = params - - FloatingView.get().customView(view) - Log.d(TAG, "Floating view created successfully") - - FloatingView.get().view - } catch (e: Exception) { - Log.e(TAG, "Error creating floating view: ${e.message}") - null - } - } - - private fun changeLocation(distance: Float, angle: Float, packageName: String, userId: Int) { - try { - val location = BLocationManager.get().getLocation(userId, packageName) - if (location == null) { - Log.w(TAG, "No current location found for package: $packageName, userId: $userId") - return - } - - Log.d( - TAG, - "Changing location - Distance: ${distance}m, Angle: ${angle}°, Current: ${location.latitude}, ${location.longitude}" - ) - - - val dx = distance * sin(angle * Math.PI / 180.0) - val dy = distance * cos(angle * Math.PI / 180.0) - - - val ec = Eb + (Ea - Eb) * (90.0 - location.latitude) / 90.0 - val ed = ec * cos(location.latitude * Math.PI / 180) - - val newLng = (dx / ed + location.longitude * Math.PI / 180.0) * 180.0 / Math.PI - val newLat = (dy / ec + location.latitude * Math.PI / 180.0) * 180.0 / Math.PI - - val newLocation = BLocation(newLat, newLng) - - - BLocationManager.get().setLocation(userId, packageName, newLocation) - - Log.d(TAG, "Location updated - New: ${newLat}, ${newLng}") - } catch (e: Exception) { - Log.e(TAG, "Error changing location: ${e.message}") - Log.e(TAG, "Stack trace: ", e) - } - } - - - fun isActive(): Boolean { - return isInitialized - } - - - fun checkPermissions(context: Context): Boolean { - return try { - - val hasOverlayPermission = android.provider.Settings.canDrawOverlays(context) - if (!hasOverlayPermission) { - Log.w( - TAG, - "Overlay permission not granted - RockerManager cannot show floating view" - ) - return false - } - - - val hasLocationPermission = - context.checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == - android.content.pm.PackageManager.PERMISSION_GRANTED - if (!hasLocationPermission) { - Log.w(TAG, "Location permission not granted - RockerManager cannot access location") - return false - } - - Log.d(TAG, "All required permissions are granted") - true - } catch (e: Exception) { - Log.e(TAG, "Error checking permissions: ${e.message}") - false - } - } - - - fun getRequiredPermissions(): List { - return listOf( - android.Manifest.permission.SYSTEM_ALERT_WINDOW, - android.Manifest.permission.ACCESS_FINE_LOCATION, - android.Manifest.permission.ACCESS_COARSE_LOCATION - ) - } - - - fun cleanup() { - try { - isInitialized = false - Log.d(TAG, "RockerManager cleaned up") - } catch (e: Exception) { - Log.e(TAG, "Error during cleanup: ${e.message}") - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/bean/AppInfo.kt b/app/src/main/java/top/niunaijun/blackboxa/bean/AppInfo.kt deleted file mode 100644 index 38f719d..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/bean/AppInfo.kt +++ /dev/null @@ -1,6 +0,0 @@ -package top.niunaijun.blackboxa.bean - -import android.graphics.drawable.Drawable - - -data class AppInfo(val name:String,val icon:Drawable?,val packageName:String,val sourceDir:String,val isXpModule:Boolean) \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/bean/FakeLocationBean.kt b/app/src/main/java/top/niunaijun/blackboxa/bean/FakeLocationBean.kt deleted file mode 100644 index 1aa4b1c..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/bean/FakeLocationBean.kt +++ /dev/null @@ -1,15 +0,0 @@ -package top.niunaijun.blackboxa.bean - -import android.graphics.drawable.Drawable -import top.niunaijun.blackbox.entity.location.BLocation - -data class FakeLocationBean( - val userID: Int, - val name: String, - val icon: Drawable, - val packageName: String, - var fakeLocationPattern: Int, - var fakeLocation: BLocation? -) - -data class FakeLocationBeanInstallBean(val userID: Int, val success: Boolean, val msg: String) \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/bean/GmsBean.kt b/app/src/main/java/top/niunaijun/blackboxa/bean/GmsBean.kt deleted file mode 100644 index c1bc3fa..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/bean/GmsBean.kt +++ /dev/null @@ -1,7 +0,0 @@ -package top.niunaijun.blackboxa.bean - - -data class GmsBean(val userID:Int,val userName:String,var isInstalledGms:Boolean) - - -data class GmsInstallBean(val userID: Int,val success:Boolean,val msg:String) \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/bean/InstalledAppBean.kt b/app/src/main/java/top/niunaijun/blackboxa/bean/InstalledAppBean.kt deleted file mode 100644 index 4731075..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/bean/InstalledAppBean.kt +++ /dev/null @@ -1,6 +0,0 @@ -package top.niunaijun.blackboxa.bean - -import android.graphics.drawable.Drawable - - -data class InstalledAppBean(val name:String, val icon: Drawable?, val packageName:String, val sourceDir:String, val isInstall:Boolean) diff --git a/app/src/main/java/top/niunaijun/blackboxa/bean/XpModuleInfo.kt b/app/src/main/java/top/niunaijun/blackboxa/bean/XpModuleInfo.kt deleted file mode 100644 index 6dabeca..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/bean/XpModuleInfo.kt +++ /dev/null @@ -1,13 +0,0 @@ -package top.niunaijun.blackboxa.bean - -import android.graphics.drawable.Drawable - - -data class XpModuleInfo( - val name: String, - val desc: String, - val packageName: String, - val version: String, - var enable:Boolean, - val icon: Drawable -) diff --git a/app/src/main/java/top/niunaijun/blackboxa/biz/cache/AppSharedPreferenceDelegate.kt b/app/src/main/java/top/niunaijun/blackboxa/biz/cache/AppSharedPreferenceDelegate.kt deleted file mode 100644 index 425b62b..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/biz/cache/AppSharedPreferenceDelegate.kt +++ /dev/null @@ -1,71 +0,0 @@ -package top.niunaijun.blackboxa.biz.cache - -import android.content.Context -import android.text.TextUtils -import androidx.core.content.edit -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - - -open class AppSharedPreferenceDelegate( - context: Context, - private val default: Data, - spName: String? = null -) : ReadWriteProperty { - - private val mSharedPreferences by lazy { - val tmpCacheName = - if (TextUtils.isEmpty(spName)) { - AppSharedPreferenceDelegate::class.java.simpleName - } else { - spName - } - return@lazy context.getSharedPreferences(tmpCacheName, Context.MODE_PRIVATE) - } - - override fun getValue(thisRef: Any, property: KProperty<*>): Data { - return findData(property.name, default) - } - - override fun setValue(thisRef: Any, property: KProperty<*>, value: Data?) { - putData(property.name, value) - } - - protected fun findData(key: String, default: Data): Data { - with(mSharedPreferences) { - val result: Any = - when (default) { - is Int -> getInt(key, default) - is Long -> getLong(key, default) - is Float -> getFloat(key, default) - is String -> getString(key, default)!! - is Boolean -> getBoolean(key, default) - else -> - throw IllegalArgumentException( - "This type $default can not be saved into sharedPreferences" - ) - } - return result as? Data ?: default - } - } - - protected fun putData(key: String, value: Data?) { - mSharedPreferences.edit { - if (value == null) { - remove(key) - } else { - when (value) { - is Int -> putInt(key, value) - is Long -> putLong(key, value) - is Float -> putFloat(key, value) - is String -> putString(key, value) - is Boolean -> putBoolean(key, value) - else -> - throw IllegalArgumentException( - "This type $default can not be saved into Preferences" - ) - } - } - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/data/AppsRepository.kt b/app/src/main/java/top/niunaijun/blackboxa/data/AppsRepository.kt deleted file mode 100644 index 29df428..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/data/AppsRepository.kt +++ /dev/null @@ -1,509 +0,0 @@ -package top.niunaijun.blackboxa.data - -import android.content.pm.ApplicationInfo -import android.net.Uri -import android.util.Log -import android.webkit.URLUtil -import androidx.lifecycle.MutableLiveData -import java.io.File -import top.niunaijun.blackbox.BlackBoxCore -import top.niunaijun.blackbox.utils.AbiUtils -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.app.AppManager -import top.niunaijun.blackboxa.bean.AppInfo -import top.niunaijun.blackboxa.bean.InstalledAppBean -import top.niunaijun.blackboxa.util.MemoryManager -import top.niunaijun.blackboxa.util.getString - - -class AppsRepository { - val TAG: String = "AppsRepository" - private var mInstalledList = mutableListOf() - - - private fun safeLoadAppLabel(applicationInfo: ApplicationInfo): String { - return try { - BlackBoxCore.getPackageManager().getApplicationLabel(applicationInfo).toString() - } catch (e: Exception) { - Log.w(TAG, "Failed to load label for ${applicationInfo.packageName}: ${e.message}") - applicationInfo.packageName - } - } - - - private fun safeLoadAppIcon( - applicationInfo: ApplicationInfo - ): android.graphics.drawable.Drawable? { - return try { - - if (MemoryManager.shouldSkipIconLoading()) { - Log.w( - TAG, - "Memory usage high (${MemoryManager.getMemoryUsagePercentage()}%), skipping icon for ${applicationInfo.packageName}" - ) - return null - } - - val icon = BlackBoxCore.getPackageManager().getApplicationIcon(applicationInfo) - - - if (icon is android.graphics.drawable.BitmapDrawable) { - val bitmap = icon.bitmap - - if (bitmap.width > 96 || bitmap.height > 96) { - try { - val scaledBitmap = - android.graphics.Bitmap.createScaledBitmap(bitmap, 96, 96, true) - android.graphics.drawable.BitmapDrawable( - BlackBoxCore.getPackageManager() - .getResourcesForApplication(applicationInfo.packageName), - scaledBitmap - ) - } catch (e: Exception) { - Log.w( - TAG, - "Failed to scale icon for ${applicationInfo.packageName}: ${e.message}" - ) - icon - } - } else { - icon - } - } else { - icon - } - } catch (e: Exception) { - Log.w(TAG, "Failed to load icon for ${applicationInfo.packageName}: ${e.message}") - null - } - } - - fun previewInstallList() { - try { - synchronized(mInstalledList) { - val installedApplications: List = - BlackBoxCore.getPackageManager().getInstalledApplications(0) - val installedList = mutableListOf() - - for (installedApplication in installedApplications) { - try { - val file = File(installedApplication.sourceDir) - - if ((installedApplication.flags and ApplicationInfo.FLAG_SYSTEM) != 0) - continue - - if (!AbiUtils.isSupport(file)) continue - - - if (BlackBoxCore.get().isBlackBoxApp(installedApplication.packageName)) { - Log.d( - TAG, - "Filtering out BlackBox app: ${installedApplication.packageName}" - ) - continue - } - - val isXpModule = false - - val info = - AppInfo( - safeLoadAppLabel(installedApplication), - safeLoadAppIcon( - installedApplication - ), - installedApplication.packageName, - installedApplication.sourceDir, - isXpModule - ) - installedList.add(info) - } catch (e: Exception) { - Log.e( - TAG, - "Error processing app ${installedApplication.packageName}: ${e.message}" - ) - } - } - this.mInstalledList.clear() - this.mInstalledList.addAll(installedList) - } - } catch (e: Exception) { - Log.e(TAG, "Error in previewInstallList: ${e.message}") - } - } - - fun getInstalledAppList( - userID: Int, - loadingLiveData: MutableLiveData, - appsLiveData: MutableLiveData> - ) { - try { - loadingLiveData.postValue(true) - synchronized(mInstalledList) { - val blackBoxCore = BlackBoxCore.get() - Log.d(TAG, mInstalledList.joinToString(",")) - val newInstalledList = - mInstalledList.map { - InstalledAppBean( - it.name, - it.icon, - it.packageName, - it.sourceDir, - blackBoxCore.isInstalled(it.packageName, userID) - ) - } - appsLiveData.postValue(newInstalledList) - loadingLiveData.postValue(false) - } - } catch (e: Exception) { - Log.e(TAG, "Error in getInstalledAppList: ${e.message}") - loadingLiveData.postValue(false) - appsLiveData.postValue(emptyList()) - } - } - - fun getVmInstallList(userId: Int, appsLiveData: MutableLiveData>) { - try { - - if (MemoryManager.isMemoryCritical()) { - Log.w( - TAG, - "Memory critical (${MemoryManager.getMemoryUsagePercentage()}%), forcing garbage collection" - ) - MemoryManager.forceGarbageCollectionIfNeeded() - } - - val blackBoxCore = BlackBoxCore.get() - - - val users = blackBoxCore.users - Log.d(TAG, "getVmInstallList: userId=$userId, total users=${users.size}") - users.forEach { user -> Log.d(TAG, "User: id=${user.id}, name=${user.name}") } - - val sortListData = AppManager.mRemarkSharedPreferences.getString("AppList$userId", "") - val sortList = sortListData?.split(",") - - - var applicationList: List? = null - var retryCount = 0 - val maxRetries = 3 - - while (applicationList == null && retryCount < maxRetries) { - try { - applicationList = blackBoxCore.getInstalledApplications(0, userId) - if (applicationList == null) { - Log.w( - TAG, - "getVmInstallList: Attempt ${retryCount + 1} returned null, retrying..." - ) - retryCount++ - Thread.sleep(100) - } - } catch (e: Exception) { - Log.e( - TAG, - "getVmInstallList: Error getting applications on attempt ${retryCount + 1}: ${e.message}" - ) - retryCount++ - if (retryCount < maxRetries) { - Thread.sleep(200) - } - } - } - - - if (applicationList == null) { - Log.e( - TAG, - "getVmInstallList: applicationList is null for userId=$userId after $maxRetries attempts" - ) - appsLiveData.postValue(emptyList()) - return - } - - - Log.d( - TAG, - "getVmInstallList: userId=$userId, applicationList.size=${applicationList.size}" - ) - if (applicationList.isNotEmpty()) { - Log.d(TAG, "First app: ${applicationList.first().packageName}") - } else { - Log.w(TAG, "getVmInstallList: No applications found for userId=$userId") - } - - val appInfoList = mutableListOf() - - - val sortedApplicationList = - if (!sortList.isNullOrEmpty()) { - try { - applicationList.sortedWith(AppsSortComparator(sortList)) - } catch (e: Exception) { - Log.e(TAG, "getVmInstallList: Error sorting applications: ${e.message}") - applicationList - } - } else { - applicationList - } - - - sortedApplicationList.forEachIndexed { index, applicationInfo -> - try { - - if (index > 0 && index % 25 == 0) { - if (MemoryManager.isMemoryCritical()) { - Log.w(TAG, "Memory critical during processing, forcing GC") - MemoryManager.forceGarbageCollectionIfNeeded() - } - } - - - if (applicationInfo == null) { - Log.w( - TAG, - "getVmInstallList: Skipping null applicationInfo at index $index" - ) - return@forEachIndexed - } - - - if (applicationInfo.packageName.isNullOrBlank()) { - Log.w( - TAG, - "getVmInstallList: Skipping app with null/blank package name at index $index" - ) - return@forEachIndexed - } - - val info = - AppInfo( - safeLoadAppLabel(applicationInfo), - safeLoadAppIcon( - applicationInfo - ), - applicationInfo.packageName, - applicationInfo.sourceDir ?: "", - false - ) - - appInfoList.add(info) - - - if (index > 0 && index % 50 == 0) { - Log.d( - TAG, - "getVmInstallList: Processed $index/${sortedApplicationList.size} apps - ${MemoryManager.getMemoryInfo()}" - ) - } - } catch (e: Exception) { - Log.e( - TAG, - "getVmInstallList: Error processing app at index $index (${applicationInfo?.packageName}): ${e.message}" - ) - - } - } - - Log.d( - TAG, - "getVmInstallList: processed ${appInfoList.size} apps - ${MemoryManager.getMemoryInfo()}" - ) - - - - if (appInfoList.isEmpty()) { - Log.d( - TAG, - "getVmInstallList: No virtual apps found for userId=$userId, showing empty list (correct for new users)" - ) - } else { - Log.d( - TAG, - "getVmInstallList: Showing ${appInfoList.size} virtual apps for userId=$userId" - ) - } - - - try { - appsLiveData.postValue(appInfoList) - } catch (e: Exception) { - Log.e(TAG, "getVmInstallList: Error posting to LiveData: ${e.message}") - - try { - android.os.Handler(android.os.Looper.getMainLooper()).post { - try { - appsLiveData.postValue(appInfoList) - } catch (e2: Exception) { - Log.e( - TAG, - "getVmInstallList: Fallback posting also failed: ${e2.message}" - ) - } - } - } catch (e3: Exception) { - Log.e( - TAG, - "getVmInstallList: Could not schedule fallback posting: ${e3.message}" - ) - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in getVmInstallList: ${e.message}") - try { - appsLiveData.postValue(emptyList()) - } catch (e2: Exception) { - Log.e(TAG, "getVmInstallList: Error posting empty list: ${e2.message}") - } - } - } - - fun installApk(source: String, userId: Int, resultLiveData: MutableLiveData) { - try { - - if (source.contains("blackbox") || - source.contains("niunaijun") || - source.contains("vspace") || - source.contains("virtual") - ) { - - try { - val blackBoxCore = BlackBoxCore.get() - val hostPackageName = BlackBoxCore.getHostPkg() - - - if (!URLUtil.isValidUrl(source)) { - val file = File(source) - if (file.exists()) { - val packageInfo = - BlackBoxCore.getPackageManager() - .getPackageArchiveInfo(source, 0) - if (packageInfo != null && packageInfo.packageName == hostPackageName) { - resultLiveData.postValue( - "Cannot install BlackBox app from within BlackBox. This would create infinite recursion and is not allowed for security reasons." - ) - return - } - } - } - } catch (e: Exception) { - Log.w(TAG, "Could not verify if this is BlackBox app: ${e.message}") - } - } - - val blackBoxCore = BlackBoxCore.get() - val installResult = - if (URLUtil.isValidUrl(source)) { - val uri = Uri.parse(source) - blackBoxCore.installPackageAsUser(uri, userId) - } else { - blackBoxCore.installPackageAsUser(source, userId) - } - - if (installResult.success) { - updateAppSortList(userId, installResult.packageName, true) - resultLiveData.postValue(getString(R.string.install_success)) - } else { - resultLiveData.postValue(getString(R.string.install_fail, installResult.msg)) - } - scanUser() - } catch (e: Exception) { - Log.e(TAG, "Error installing APK: ${e.message}") - resultLiveData.postValue("Installation failed: ${e.message}") - } - } - - fun unInstall(packageName: String, userID: Int, resultLiveData: MutableLiveData) { - try { - BlackBoxCore.get().uninstallPackageAsUser(packageName, userID) - updateAppSortList(userID, packageName, false) - scanUser() - resultLiveData.postValue(getString(R.string.uninstall_success)) - } catch (e: Exception) { - Log.e(TAG, "Error uninstalling APK: ${e.message}") - resultLiveData.postValue("Uninstallation failed: ${e.message}") - } - } - - fun launchApk(packageName: String, userId: Int, launchLiveData: MutableLiveData) { - try { - val result = BlackBoxCore.get().launchApk(packageName, userId) - launchLiveData.postValue(result) - } catch (e: Exception) { - Log.e(TAG, "Error launching APK: ${e.message}") - launchLiveData.postValue(false) - } - } - - fun clearApkData(packageName: String, userID: Int, resultLiveData: MutableLiveData) { - try { - BlackBoxCore.get().clearPackage(packageName, userID) - resultLiveData.postValue(getString(R.string.clear_success)) - } catch (e: Exception) { - Log.e(TAG, "Error clearing APK data: ${e.message}") - resultLiveData.postValue("Clear failed: ${e.message}") - } - } - - - private fun scanUser() { - try { - val blackBoxCore = BlackBoxCore.get() - val userList = blackBoxCore.users - - if (userList.isEmpty()) { - return - } - - val id = userList.last().id - - if (blackBoxCore.getInstalledApplications(0, id).isEmpty()) { - blackBoxCore.deleteUser(id) - AppManager.mRemarkSharedPreferences.edit().apply { - remove("Remark$id") - remove("AppList$id") - apply() - } - scanUser() - } - } catch (e: Exception) { - Log.e(TAG, "Error in scanUser: ${e.message}") - } - } - - - private fun updateAppSortList(userID: Int, pkg: String, isAdd: Boolean) { - try { - val savedSortList = AppManager.mRemarkSharedPreferences.getString("AppList$userID", "") - - val sortList = linkedSetOf() - if (savedSortList != null) { - sortList.addAll(savedSortList.split(",")) - } - - if (isAdd) { - sortList.add(pkg) - } else { - sortList.remove(pkg) - } - - AppManager.mRemarkSharedPreferences.edit().apply { - putString("AppList$userID", sortList.joinToString(",")) - apply() - } - } catch (e: Exception) { - Log.e(TAG, "Error updating app sort list: ${e.message}") - } - } - - - fun updateApkOrder(userID: Int, dataList: List) { - try { - AppManager.mRemarkSharedPreferences.edit().apply { - putString("AppList$userID", dataList.joinToString(",") { it.packageName }) - apply() - } - } catch (e: Exception) { - Log.e(TAG, "Error updating APK order: ${e.message}") - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/data/AppsSortCompon.kt b/app/src/main/java/top/niunaijun/blackboxa/data/AppsSortCompon.kt deleted file mode 100644 index c792e36..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/data/AppsSortCompon.kt +++ /dev/null @@ -1,17 +0,0 @@ -package top.niunaijun.blackboxa.data - -import android.content.pm.ApplicationInfo - - -class AppsSortComparator(private val sortedList: List) : Comparator { - override fun compare(o1: ApplicationInfo?, o2: ApplicationInfo?): Int { - if (o1 == null || o2 == null) { - return 0 - } - - val first = sortedList.indexOf(o1.packageName) - val second = sortedList.indexOf(o2.packageName) - return first - second - - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/data/FakeLocationRepository.kt b/app/src/main/java/top/niunaijun/blackboxa/data/FakeLocationRepository.kt deleted file mode 100644 index a7e8f29..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/data/FakeLocationRepository.kt +++ /dev/null @@ -1,62 +0,0 @@ -package top.niunaijun.blackboxa.data - -import android.content.pm.ApplicationInfo -import android.util.Log -import androidx.lifecycle.MutableLiveData -import top.niunaijun.blackbox.BlackBoxCore -import top.niunaijun.blackbox.entity.location.BLocation -import top.niunaijun.blackbox.fake.frameworks.BLocationManager -import top.niunaijun.blackboxa.bean.FakeLocationBean - - -class FakeLocationRepository { - val TAG: String = "FakeLocationRepository" - - fun setPattern(userId: Int, pkg: String, pattern: Int) { - BLocationManager.get().setPattern(userId, pkg, pattern) - } - - private fun getPattern(userId: Int, pkg: String): Int { - return BLocationManager.get().getPattern(userId, pkg) - } - - private fun getLocation(userId: Int, pkg: String): BLocation? { - return BLocationManager.get().getLocation(userId, pkg) - } - - fun setLocation(userId: Int, pkg: String, location: BLocation) { - BLocationManager.get().setLocation(userId, pkg, location) - } - - fun getInstalledAppList( - userID: Int, - appsFakeLiveData: MutableLiveData> - ) { - val installedList = mutableListOf() - val installedApplications: List = - BlackBoxCore.get().getInstalledApplications(0, userID) - - for (installedApplication in installedApplications) { - - - - - - - - - val info = FakeLocationBean( - userID, - installedApplication.loadLabel(BlackBoxCore.getPackageManager()).toString(), - installedApplication.loadIcon(BlackBoxCore.getPackageManager()), - installedApplication.packageName, - getPattern(userID, installedApplication.packageName), - getLocation(userID, installedApplication.packageName) - ) - installedList.add(info) - } - - Log.d(TAG, installedList.joinToString(",")) - appsFakeLiveData.postValue(installedList) - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/data/GmsRepository.kt b/app/src/main/java/top/niunaijun/blackboxa/data/GmsRepository.kt deleted file mode 100644 index d5b06fe..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/data/GmsRepository.kt +++ /dev/null @@ -1,65 +0,0 @@ -package top.niunaijun.blackboxa.data - -import androidx.lifecycle.MutableLiveData -import top.niunaijun.blackbox.BlackBoxCore -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.app.AppManager -import top.niunaijun.blackboxa.bean.GmsBean -import top.niunaijun.blackboxa.bean.GmsInstallBean -import top.niunaijun.blackboxa.util.getString - - -class GmsRepository { - - - fun getGmsInstalledList(mInstalledLiveData: MutableLiveData>) { - val userList = arrayListOf() - - BlackBoxCore.get().users.forEach { - val userId = it.id - val userName = - AppManager.mRemarkSharedPreferences.getString("Remark$userId", "User $userId") ?: "" - val isInstalled = BlackBoxCore.get().isInstallGms(userId) - val bean = GmsBean(userId, userName, isInstalled) - userList.add(bean) - } - - mInstalledLiveData.postValue(userList) - } - - fun installGms( - userID: Int, - mUpdateInstalledLiveData: MutableLiveData - ) { - val installResult = BlackBoxCore.get().installGms(userID) - - val result = if (installResult.success) { - getString(R.string.install_success) - } else { - getString(R.string.install_fail, installResult.msg) - } - - val bean = GmsInstallBean(userID,installResult.success,result) - mUpdateInstalledLiveData.postValue(bean) - } - - fun uninstallGms( - userID: Int, - mUpdateInstalledLiveData: MutableLiveData - ) { - var isSuccess = false - if (BlackBoxCore.get().isInstallGms(userID)) { - isSuccess = BlackBoxCore.get().uninstallGms(userID) - } - - val result = if (isSuccess) { - getString(R.string.uninstall_success) - } else { - getString(R.string.uninstall_fail) - } - - val bean = GmsInstallBean(userID,isSuccess,result) - - mUpdateInstalledLiveData.postValue(bean) - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/ContextUtil.kt b/app/src/main/java/top/niunaijun/blackboxa/util/ContextUtil.kt deleted file mode 100644 index 885f4f1..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/ContextUtil.kt +++ /dev/null @@ -1,18 +0,0 @@ -package top.niunaijun.blackboxa.util - -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.provider.Settings - - -object ContextUtil { - - fun Context.openAppSystemSettings() { - startActivity(Intent().apply { - action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - data = Uri.fromParts("package", packageName, null) - }) - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/InjectionUtil.kt b/app/src/main/java/top/niunaijun/blackboxa/util/InjectionUtil.kt deleted file mode 100644 index 8ecc02d..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/InjectionUtil.kt +++ /dev/null @@ -1,40 +0,0 @@ -package top.niunaijun.blackboxa.util - -import top.niunaijun.blackboxa.data.AppsRepository -import top.niunaijun.blackboxa.data.FakeLocationRepository -import top.niunaijun.blackboxa.data.GmsRepository - -import top.niunaijun.blackboxa.view.apps.AppsFactory -import top.niunaijun.blackboxa.view.fake.FakeLocationFactory -import top.niunaijun.blackboxa.view.gms.GmsFactory -import top.niunaijun.blackboxa.view.list.ListFactory - - - -object InjectionUtil { - - private val appsRepository = AppsRepository() - - - - private val gmsRepository = GmsRepository() - - private val fakeLocationRepository = FakeLocationRepository() - - fun getAppsFactory() : AppsFactory { - return AppsFactory(appsRepository) - } - - fun getListFactory(): ListFactory { - return ListFactory(appsRepository) - } - - - fun getGmsFactory():GmsFactory{ - return GmsFactory(gmsRepository) - } - - fun getFakeLocationFactory():FakeLocationFactory{ - return FakeLocationFactory(fakeLocationRepository) - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/MathUtil.java b/app/src/main/java/top/niunaijun/blackboxa/util/MathUtil.java deleted file mode 100644 index 76df8fb..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/MathUtil.java +++ /dev/null @@ -1,47 +0,0 @@ -package top.niunaijun.blackboxa.util; - -import android.graphics.Point; -import android.graphics.PointF; - -public class MathUtil { - - public MathUtil() { - } - - - public static int getDistance(PointF A, PointF B) { - return (int) Math.sqrt(Math.pow(A.x - B.x, 2) + Math.pow(A.y - B.y, 2)); - } - - - public static int getDistance(float x1, float y1, float x2, float y2) { - return (int) Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); - } - - - public static Point getPointByCutLength(Point A, Point B, int cutLength) { - float radian = getRadian(A, B); - return new Point(A.x + (int) (cutLength * Math.cos(radian)), A.y + (int) (cutLength * Math.sin(radian))); - } - - - public static float getRadian(Point A, Point B) { - float lenA = B.x - A.x; - float lenB = B.y - A.y; - float lenC = (float) Math.sqrt(lenA * lenA + lenB * lenB); - float radian = (float) Math.acos(lenA / lenC); - radian = radian * (B.y < A.y ? -1 : 1); - return radian; - } - - - - public static double angle2Radian(double angle) { - return angle / 180 * Math.PI; - } - - - public static double radian2Angle(double radian) { - return radian / Math.PI * 180; - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/MemoryManager.kt b/app/src/main/java/top/niunaijun/blackboxa/util/MemoryManager.kt deleted file mode 100644 index 46e0fd1..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/MemoryManager.kt +++ /dev/null @@ -1,128 +0,0 @@ -package top.niunaijun.blackboxa.util - -import android.util.Log -import java.lang.Runtime - - - -object MemoryManager { - - private const val TAG = "MemoryManager" - private const val MEMORY_THRESHOLD = 0.8 - private const val CRITICAL_MEMORY_THRESHOLD = 0.9 - - - fun isMemorySafe(): Boolean { - return try { - val runtime = Runtime.getRuntime() - val usedMemory = runtime.totalMemory() - runtime.freeMemory() - val maxMemory = runtime.maxMemory() - val memoryUsage = usedMemory.toDouble() / maxMemory.toDouble() - - memoryUsage < MEMORY_THRESHOLD - } catch (e: Exception) { - Log.e(TAG, "Error checking memory: ${e.message}") - true - } - } - - - fun isMemoryCritical(): Boolean { - return try { - val runtime = Runtime.getRuntime() - val usedMemory = runtime.totalMemory() - runtime.freeMemory() - val maxMemory = runtime.maxMemory() - val memoryUsage = usedMemory.toDouble() / maxMemory.toDouble() - - memoryUsage > CRITICAL_MEMORY_THRESHOLD - } catch (e: Exception) { - Log.e(TAG, "Error checking critical memory: ${e.message}") - false - } - } - - - fun getMemoryUsagePercentage(): Int { - return try { - val runtime = Runtime.getRuntime() - val usedMemory = runtime.totalMemory() - runtime.freeMemory() - val maxMemory = runtime.maxMemory() - val memoryUsage = usedMemory.toDouble() / maxMemory.toDouble() - - (memoryUsage * 100).toInt() - } catch (e: Exception) { - Log.e(TAG, "Error getting memory usage: ${e.message}") - 0 - } - } - - - fun forceGarbageCollectionIfNeeded(): Boolean { - return try { - if (isMemoryCritical()) { - Log.w( - TAG, - "Memory usage critical (${getMemoryUsagePercentage()}%), forcing garbage collection" - ) - System.gc() - Thread.sleep(100) - true - } else { - false - } - } catch (e: Exception) { - Log.e(TAG, "Error during garbage collection: ${e.message}") - false - } - } - - - fun optimizeMemoryForRecyclerView() { - try { - val memoryUsage = getMemoryUsagePercentage() - - if (memoryUsage > 70) { - Log.d(TAG, "Memory usage high (${memoryUsage}%), optimizing for RecyclerView") - - - System.gc() - - - try { - val runtime = Runtime.getRuntime() - runtime.gc() - } catch (e: Exception) { - Log.w(TAG, "Could not force runtime GC: ${e.message}") - } - } - } catch (e: Exception) { - Log.e(TAG, "Error optimizing memory: ${e.message}") - } - } - - - fun shouldSkipIconLoading(): Boolean { - return try { - val memoryUsage = getMemoryUsagePercentage() - memoryUsage > 75 - } catch (e: Exception) { - Log.e(TAG, "Error checking if should skip icon loading: ${e.message}") - false - } - } - - - fun getMemoryInfo(): String { - return try { - val runtime = Runtime.getRuntime() - val totalMemory = runtime.totalMemory() - val freeMemory = runtime.freeMemory() - val usedMemory = totalMemory - freeMemory - val maxMemory = runtime.maxMemory() - - "Memory: ${usedMemory / 1024 / 1024}MB used / ${maxMemory / 1024 / 1024}MB max (${getMemoryUsagePercentage()}%)" - } catch (e: Exception) { - "Memory: Unknown (${e.message})" - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/ResUtil.kt b/app/src/main/java/top/niunaijun/blackboxa/util/ResUtil.kt deleted file mode 100644 index 3eddbef..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/ResUtil.kt +++ /dev/null @@ -1,13 +0,0 @@ -package top.niunaijun.blackboxa.util - -import androidx.annotation.StringRes -import top.niunaijun.blackboxa.app.App - - -fun getString(@StringRes id:Int,vararg arg:String):String{ - if(arg.isEmpty()){ - return App.getContext().getString(id) - } - return App.getContext().getString(id,*arg) -} - diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/Resolution.java b/app/src/main/java/top/niunaijun/blackboxa/util/Resolution.java deleted file mode 100644 index 1e7f2c6..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/Resolution.java +++ /dev/null @@ -1,237 +0,0 @@ -package top.niunaijun.blackboxa.util; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.app.KeyguardManager; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Point; -import android.os.Build; -import android.os.Handler; -import android.util.DisplayMetrics; -import android.view.Display; -import android.view.View; -import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; - -import java.lang.reflect.Field; - -public class Resolution { - private static final String TAG = "UtilsScreen"; - - - public static int getScreenWidth(Context context) { - return getScreenSize(context, null).x; - } - - - public static int getScreenHeight(Context context) { - return getScreenSize(context, null).y; - } - - - @SuppressLint("NewApi") - public static Point getScreenSize(Context context, Point outSize) { - WindowManager wm = (WindowManager) context - .getSystemService(Context.WINDOW_SERVICE); - Point ret = outSize == null ? new Point() : outSize; - - if (Build.VERSION.SDK_INT >= 30) { - - android.view.WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); - android.graphics.Rect bounds = windowMetrics.getBounds(); - ret.x = bounds.width(); - ret.y = bounds.height(); - } else if (Build.VERSION.SDK_INT >= 13) { - - @SuppressWarnings("deprecation") - final Display defaultDisplay = wm.getDefaultDisplay(); - defaultDisplay.getSize(ret); - } else { - - @SuppressWarnings("deprecation") - final Display defaultDisplay = wm.getDefaultDisplay(); - ret.x = defaultDisplay.getWidth(); - ret.y = defaultDisplay.getHeight(); - } - return ret; - } - - - public static float convertDpToPixel(float dp, Context context) { - Resources resources = context.getResources(); - DisplayMetrics metrics = resources.getDisplayMetrics(); - float px = dp * (metrics.densityDpi / 160f); - return px; - } - - - public static float convertPixelsToDp(float px, Context context) { - Resources resources = context.getResources(); - DisplayMetrics metrics = resources.getDisplayMetrics(); - float dp = px / (metrics.densityDpi / 160f); - return dp; - } - - - - - public static float getDensity(Context context) { - float density = 0f; - if (context== null) { - return density; - } - try { - density = context.getResources().getDisplayMetrics().density; - } catch (Exception e) { - - } - return density; - } - - - public static boolean checkPix(Activity context, int width, int height) { - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { - DisplayMetrics metrics = new DisplayMetrics(); - context.getWindowManager().getDefaultDisplay().getRealMetrics(metrics); - return metrics.widthPixels == width && metrics.heightPixels == height; - } else { - return getScreenPixWidth(context) == width && getScreenPixHeight(context) == height; - } - } - - - public static int getScreenPixWidth(Context context) { - return context.getResources().getDisplayMetrics().widthPixels; - } - - - public static int getScreenPixHeight(Context context) { - return context.getResources().getDisplayMetrics().heightPixels; - } - - - public static int dipToPx(Context context, int dip) { - return (int) (dip * context.getResources().getDisplayMetrics().density + 0.5f); - } - - - public static int pxToDip(Context context, float pxValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (int) (pxValue / scale + 0.5f); - } - - - public static int sp2px(Context context, float spValue) { - final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; - return (int) (spValue * fontScale + 0.5f); - } - - - public static void hideInputMethod(View view) { - InputMethodManager imm = (InputMethodManager) view.getContext() - .getSystemService(Context.INPUT_METHOD_SERVICE); - if (imm != null) { - imm.hideSoftInputFromWindow(view.getWindowToken(), 0); - } - } - - - public static void showInputMethod(View view) { - InputMethodManager imm = (InputMethodManager) view.getContext() - .getSystemService(Context.INPUT_METHOD_SERVICE); - if (imm != null) { - imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); - } - } - - - public static void showInputMethod(final View view, long delayMillis) { - - new Handler().postDelayed(new Runnable() { - - @Override - public void run() { - Resolution.showInputMethod(view); - - } - }, delayMillis); - } - - - public static boolean isScreenLocked(Context c) { - KeyguardManager mKeyguardManager = (KeyguardManager) c - .getSystemService(Context.KEYGUARD_SERVICE); - boolean bResult = !mKeyguardManager.inKeyguardRestrictedInputMode(); - - return bResult; - } - - public static int getBarHeight(Context context) { - Class c = null; - Object obj = null; - Field field = null; - int x = 0, sbar = 38; - - try { - c = Class.forName("com.android.internal.R$dimen"); - obj = c.newInstance(); - field = c.getField("status_bar_height"); - x = Integer.parseInt(field.get(obj).toString()); - sbar = context.getResources().getDimensionPixelSize(x); - } catch (Exception e1) { - e1.printStackTrace(); - } - return sbar; - } - - - - public static Point getNavigationBarSize(Context context) { - Point appUsableSize = getScreenSize(context, null); - Point realScreenSize = getRealScreenSize(context); - - - - - - - - if (appUsableSize.y < realScreenSize.y) { - return new Point(appUsableSize.x, realScreenSize.y - appUsableSize.y); - } - - - return new Point(); - } - - - public static Point getRealScreenSize(Context context) { - WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); - Point size = new Point(); - - if (Build.VERSION.SDK_INT >= 30) { - - android.view.WindowMetrics windowMetrics = windowManager.getCurrentWindowMetrics(); - android.graphics.Rect bounds = windowMetrics.getBounds(); - size.x = bounds.width(); - size.y = bounds.height(); - } else if (Build.VERSION.SDK_INT >= 17) { - - @SuppressWarnings("deprecation") - Display display = windowManager.getDefaultDisplay(); - display.getRealSize(size); - } else if (Build.VERSION.SDK_INT >= 14) { - - @SuppressWarnings("deprecation") - Display display = windowManager.getDefaultDisplay(); - try { - size.x = (Integer) Display.class.getMethod("getRawWidth").invoke(display); - size.y = (Integer) Display.class.getMethod("getRawHeight").invoke(display); - } catch (Exception e) { - } - } - - return size; - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/ShortcutUtil.kt b/app/src/main/java/top/niunaijun/blackboxa/util/ShortcutUtil.kt deleted file mode 100644 index 51fe650..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/ShortcutUtil.kt +++ /dev/null @@ -1,77 +0,0 @@ -package top.niunaijun.blackboxa.util - -import android.content.Context -import android.content.Intent -import androidx.core.content.pm.ShortcutInfoCompat -import androidx.core.content.pm.ShortcutManagerCompat -import androidx.core.graphics.drawable.IconCompat -import androidx.core.graphics.drawable.toBitmap -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.input.input -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.app.App -import top.niunaijun.blackboxa.app.AppManager -import top.niunaijun.blackboxa.bean.AppInfo -import top.niunaijun.blackboxa.util.ContextUtil.openAppSystemSettings -import top.niunaijun.blackboxa.view.main.ShortcutActivity - - -object ShortcutUtil { - - - - fun createShortcut(context: Context,userID: Int, info: AppInfo) { - - if (ShortcutManagerCompat.isRequestPinShortcutSupported(context)) { - val labelName = info.name + userID - val intent = Intent(context, ShortcutActivity::class.java) - .setAction(Intent.ACTION_MAIN) - .putExtra("pkg", info.packageName) - .putExtra("userId", userID) - MaterialDialog(context).show { - title(res = R.string.app_shortcut) - input( - hintRes = R.string.shortcut_name, - prefill = labelName - ) { _, input -> - - val shortcutInfo: ShortcutInfoCompat = - ShortcutInfoCompat.Builder(context, info.packageName + userID) - .setIntent(intent) - .setShortLabel(input) - .setLongLabel(input) - .setIcon(IconCompat.createWithBitmap(info.icon!!.toBitmap())) - .build() - - ShortcutManagerCompat.requestPinShortcut(context, shortcutInfo, null) - showAllowPermissionDialog(context) - } - positiveButton(R.string.done) - negativeButton(R.string.cancel) - } - - } else { - toast(R.string.cannot_create_shortcut) - } - } - - private fun showAllowPermissionDialog(context: Context){ - if (!AppManager.mBlackBoxLoader.showShortcutPermissionDialog()){ - return - } - - MaterialDialog(context).show { - title(R.string.try_add_shortcut) - message(R.string.add_shortcut_fail_msg) - positiveButton(R.string.done) - negativeButton(R.string.permission_setting){ - App.getContext().openAppSystemSettings() - } - - neutralButton(R.string.no_reminders){ - AppManager.mBlackBoxLoader.invalidShortcutPermissionDialog(false) - } - } - - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/ToastEx.kt b/app/src/main/java/top/niunaijun/blackboxa/util/ToastEx.kt deleted file mode 100644 index 419f868..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/ToastEx.kt +++ /dev/null @@ -1,23 +0,0 @@ -package top.niunaijun.blackboxa.util - -import android.content.Context -import android.widget.Toast -import androidx.annotation.StringRes -import top.niunaijun.blackboxa.app.App - - -var toastImpl:Toast? = null - -fun Context.toast(msg:String){ - toastImpl?.cancel() - toastImpl = Toast.makeText(this,msg,Toast.LENGTH_SHORT) - toastImpl?.show() -} - -fun toast(msg: String){ - App.getContext().toast(msg) -} - -fun toast(@StringRes msgID:Int){ - toast(getString(msgID)) -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/util/ViewBindingEx.kt b/app/src/main/java/top/niunaijun/blackboxa/util/ViewBindingEx.kt deleted file mode 100644 index 9ffe5b7..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/util/ViewBindingEx.kt +++ /dev/null @@ -1,36 +0,0 @@ -package top.niunaijun.blackboxa.util - -import android.app.Activity -import android.app.Dialog -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.fragment.app.Fragment -import androidx.viewbinding.ViewBinding - - - -inline fun Activity.inflate(): Lazy = lazy { - inflateBinding(layoutInflater) -} - -inline fun Fragment.inflate(): Lazy = lazy { - inflateBinding(layoutInflater) -} - -inline fun Dialog.inflate(): Lazy = lazy { - inflateBinding(layoutInflater) -} - - -inline fun inflateBinding(layoutInflater: LayoutInflater): T { - val method = T::class.java.getMethod("inflate", LayoutInflater::class.java) - return method.invoke(null, layoutInflater) as T -} - -inline fun newBindingViewHolder(viewGroup: ViewGroup, attachToParent:Boolean = false): T { - val method = T::class.java.getMethod("inflate", - LayoutInflater::class.java, - ViewGroup::class.java, - Boolean::class.java) - return method.invoke(null,LayoutInflater.from(viewGroup.context),viewGroup,attachToParent) as T -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsAdapter.kt b/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsAdapter.kt deleted file mode 100644 index 4c1f0f0..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsAdapter.kt +++ /dev/null @@ -1,166 +0,0 @@ -package top.niunaijun.blackboxa.view.apps - -import android.graphics.drawable.Drawable -import android.view.View -import android.view.ViewGroup -import android.widget.ImageView -import cbfg.rvadapter.RVHolder -import cbfg.rvadapter.RVHolderFactory -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.bean.AppInfo -import top.niunaijun.blackboxa.databinding.ItemAppBinding -import android.util.Log -import android.graphics.Bitmap -import android.graphics.Canvas -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.ColorDrawable -import android.graphics.Color -import android.view.ViewTreeObserver -import androidx.recyclerview.widget.RecyclerView - - - -class AppsAdapter : RVHolderFactory() { - - companion object { - private const val TAG = "AppsAdapter" - private const val MAX_ICON_SIZE = 96 - private val DEFAULT_ICON_COLOR = Color.parseColor("#CCCCCC") - } - - override fun createViewHolder(parent: ViewGroup?, viewType: Int, item: Any): RVHolder { - return try { - AppsVH(inflate(R.layout.item_app, parent)) - } catch (e: Exception) { - Log.e(TAG, "Error creating ViewHolder: ${e.message}") - - FallbackAppsVH(inflate(R.layout.item_app, parent)) - } - } - - class AppsVH(itemView: View) : RVHolder(itemView) { - val binding = ItemAppBinding.bind(itemView) - private var currentIcon: Drawable? = null - private var isAttached = false - - init { - try { - - binding.icon.scaleType = ImageView.ScaleType.CENTER_CROP - - - itemView.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { - override fun onPreDraw(): Boolean { - if (isAttached) { - itemView.viewTreeObserver.removeOnPreDrawListener(this) - } - return true - } - }) - } catch (e: Exception) { - Log.e(TAG, "Error initializing ViewHolder: ${e.message}") - } - } - - override fun setContent(item: AppInfo, isSelected: Boolean, payload: Any?) { - try { - - setIconSafely(item.icon, item.packageName) - - - binding.name.text = item.name ?: "Unknown App" - - - if (item.isXpModule) { - binding.cornerLabel.visibility = View.VISIBLE - } else { - binding.cornerLabel.visibility = View.INVISIBLE - } - - - isAttached = true - - } catch (e: Exception) { - Log.e(TAG, "Error setting content for ${item.packageName}: ${e.message}") - setSafeDefaults() - } - } - - private fun setIconSafely(icon: Drawable?, packageName: String) { - try { - if (icon != null) { - - val optimizedIcon = optimizeIcon(icon) - binding.icon.setImageDrawable(optimizedIcon) - currentIcon = optimizedIcon - } else { - - binding.icon.setImageDrawable(createDefaultIcon()) - currentIcon = null - } - } catch (e: Exception) { - Log.w(TAG, "Failed to set icon for $packageName: ${e.message}") - binding.icon.setImageDrawable(createDefaultIcon()) - currentIcon = null - } - } - - private fun optimizeIcon(icon: Drawable): Drawable { - return try { - - if (icon is BitmapDrawable) { - val bitmap = icon.bitmap - if (bitmap.width > MAX_ICON_SIZE || bitmap.height > MAX_ICON_SIZE) { - - val scaledBitmap = Bitmap.createScaledBitmap( - bitmap, MAX_ICON_SIZE, MAX_ICON_SIZE, true - ) - BitmapDrawable(itemView.resources, scaledBitmap) - } else { - icon - } - } else { - icon - } - } catch (e: Exception) { - Log.w(TAG, "Error optimizing icon: ${e.message}") - icon - } - } - - private fun createDefaultIcon(): Drawable { - return try { - ColorDrawable(DEFAULT_ICON_COLOR) - } catch (e: Exception) { - Log.w(TAG, "Error creating default icon: ${e.message}") - ColorDrawable(Color.GRAY) - } - } - - private fun setSafeDefaults() { - try { - binding.icon.setImageDrawable(createDefaultIcon()) - binding.name.text = "Unknown App" - binding.cornerLabel.visibility = View.INVISIBLE - } catch (e: Exception) { - Log.e(TAG, "Error setting safe defaults: ${e.message}") - } - } - } - - - class FallbackAppsVH(itemView: View) : RVHolder(itemView) { - val binding = ItemAppBinding.bind(itemView) - - override fun setContent(item: AppInfo, isSelected: Boolean, payload: Any?) { - try { - - binding.icon.setImageDrawable(ColorDrawable(DEFAULT_ICON_COLOR)) - binding.name.text = item.name ?: "Unknown App" - binding.cornerLabel.visibility = View.INVISIBLE - } catch (e: Exception) { - Log.e(TAG, "Error in fallback ViewHolder: ${e.message}") - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsFactory.kt b/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsFactory.kt deleted file mode 100644 index 037ddd3..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsFactory.kt +++ /dev/null @@ -1,14 +0,0 @@ -package top.niunaijun.blackboxa.view.apps - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import top.niunaijun.blackboxa.data.AppsRepository - - -@Suppress("UNCHECKED_CAST") -class AppsFactory(private val appsRepository: AppsRepository) : ViewModelProvider.NewInstanceFactory() { - - override fun create(modelClass: Class): T { - return AppsViewModel(appsRepository) as T - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsFragment.kt b/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsFragment.kt deleted file mode 100644 index e4e5cd3..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsFragment.kt +++ /dev/null @@ -1,550 +0,0 @@ -package top.niunaijun.blackboxa.view.apps - -import android.graphics.Point -import android.os.Bundle -import android.text.TextUtils -import android.util.Log -import android.view.LayoutInflater -import android.view.MotionEvent -import android.view.View -import android.view.ViewGroup -import androidx.appcompat.widget.PopupMenu -import androidx.core.os.bundleOf -import androidx.fragment.app.Fragment -import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.ItemTouchHelper -import androidx.recyclerview.widget.RecyclerView -import cbfg.rvadapter.RVAdapter -import com.afollestad.materialdialogs.MaterialDialog -import top.niunaijun.blackbox.BlackBoxCore -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.bean.AppInfo -import top.niunaijun.blackboxa.databinding.FragmentAppsBinding -import top.niunaijun.blackboxa.util.InjectionUtil -import top.niunaijun.blackboxa.util.ShortcutUtil -import top.niunaijun.blackboxa.util.inflate -import top.niunaijun.blackboxa.util.MemoryManager -import top.niunaijun.blackboxa.util.toast -import top.niunaijun.blackboxa.view.base.LoadingActivity -import top.niunaijun.blackboxa.view.main.MainActivity -import java.util.* -import kotlin.math.abs - - - -class AppsFragment : Fragment() { - - var userID: Int = 0 - - private lateinit var viewModel: AppsViewModel - - private lateinit var mAdapter: RVAdapter - - private val viewBinding: FragmentAppsBinding by inflate() - - private var popupMenu: PopupMenu? = null - - companion object { - private const val TAG = "AppsFragment" - - fun newInstance(userID:Int): AppsFragment { - val fragment = AppsFragment() - val bundle = bundleOf("userID" to userID) - fragment.arguments = bundle - return fragment - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - try { - super.onCreate(savedInstanceState) - viewModel = - ViewModelProvider(this, InjectionUtil.getAppsFactory()).get(AppsViewModel::class.java) - userID = requireArguments().getInt("userID", 0) - } catch (e: Exception) { - Log.e(TAG, "Error in onCreate: ${e.message}") - } - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - try { - viewBinding.stateView.showEmpty() - - mAdapter = - RVAdapter(requireContext(), AppsAdapter()).bind(viewBinding.recyclerView) - - viewBinding.recyclerView.adapter = mAdapter - - - val layoutManager = GridLayoutManager(requireContext(), 4) - layoutManager.isItemPrefetchEnabled = true - layoutManager.initialPrefetchItemCount = 8 - viewBinding.recyclerView.layoutManager = layoutManager - - - viewBinding.recyclerView.setItemViewCacheSize(20) - viewBinding.recyclerView.setHasFixedSize(true) - - - viewBinding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { - try { - super.onScrollStateChanged(recyclerView, newState) - when (newState) { - RecyclerView.SCROLL_STATE_IDLE -> { - - MemoryManager.optimizeMemoryForRecyclerView() - } - RecyclerView.SCROLL_STATE_DRAGGING -> { - - - } - RecyclerView.SCROLL_STATE_SETTLING -> { - - - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in scroll state change: ${e.message}") - } - } - - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - try { - super.onScrolled(recyclerView, dx, dy) - - if (Math.abs(dy) > 100) { - - - - if (MemoryManager.isMemoryCritical()) { - Log.w(TAG, "Memory critical during fast scrolling, forcing GC") - MemoryManager.forceGarbageCollectionIfNeeded() - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in scroll: ${e.message}") - } - } - }) - - val touchCallBack = AppsTouchCallBack { from, to -> - try { - onItemMove(from, to) - viewModel.updateSortLiveData.postValue(true) - } catch (e: Exception) { - Log.e(TAG, "Error in touch callback: ${e.message}") - } - } - - val itemTouchHelper = ItemTouchHelper(touchCallBack) - itemTouchHelper.attachToRecyclerView(viewBinding.recyclerView) - - mAdapter.setItemClickListener { _, data, _ -> - try { - showLoading() - viewModel.launchApk(data.packageName, userID) - } catch (e: Exception) { - Log.e(TAG, "Error launching app: ${e.message}") - hideLoading() - } - } - - interceptTouch() - setOnLongClick() - return viewBinding.root - } catch (e: Exception) { - Log.e(TAG, "Error in onCreateView: ${e.message}") - - return View(requireContext()) - } - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - try { - super.onViewCreated(view, savedInstanceState) - initData() - } catch (e: Exception) { - Log.e(TAG, "Error in onViewCreated: ${e.message}") - } - } - - override fun onStart() { - try { - super.onStart() - - - try { - BlackBoxCore.get().addServiceAvailableCallback { - Log.d(TAG, "Services became available, refreshing app list") - - viewModel.getInstalledAppsWithRetry(userID) - } - } catch (e: Exception) { - Log.e(TAG, "Error registering service available callback: ${e.message}") - } - - viewModel.getInstalledAppsWithRetry(userID) - } catch (e: Exception) { - Log.e(TAG, "Error in onStart: ${e.message}") - } - } - - - private fun interceptTouch() { - try { - val point = Point() - var isScrolling = false - var scrollStartTime = 0L - - viewBinding.recyclerView.setOnTouchListener { _, e -> - try { - when (e.action) { - MotionEvent.ACTION_DOWN -> { - - isScrolling = false - scrollStartTime = System.currentTimeMillis() - point.set(0, 0) - } - - MotionEvent.ACTION_UP -> { - val scrollDuration = System.currentTimeMillis() - scrollStartTime - - - if (!isScrolling && !isMove(point, e) && scrollDuration < 500) { - try { - popupMenu?.show() - } catch (e: Exception) { - Log.e(TAG, "Error showing popup menu: ${e.message}") - } - } - - popupMenu = null - point.set(0, 0) - isScrolling = false - } - - MotionEvent.ACTION_MOVE -> { - if (point.x == 0 && point.y == 0) { - point.x = e.rawX.toInt() - point.y = e.rawY.toInt() - } - - - if (isMove(point, e)) { - isScrolling = true - popupMenu?.dismiss() - } - - - isDownAndUp(point, e) - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in touch listener: ${e.message}") - } - return@setOnTouchListener false - } - } catch (e: Exception) { - Log.e(TAG, "Error in interceptTouch: ${e.message}") - } - } - - private fun isMove(point: Point, e: MotionEvent): Boolean { - return try { - val max = 40 - - val x = point.x - val y = point.y - - val xU = abs(x - e.rawX) - val yU = abs(y - e.rawY) - xU > max || yU > max - } catch (e: Exception) { - Log.e(TAG, "Error in isMove: ${e.message}") - false - } - } - - private fun isDownAndUp(point: Point, e: MotionEvent) { - try { - val min = 10 - val y = point.y - val yU = y - e.rawY - - if (abs(yU) > min) { - try { - (requireActivity() as? MainActivity)?.showFloatButton(yU < 0) - } catch (e: Exception) { - Log.e(TAG, "Error showing/hiding float button: ${e.message}") - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in isDownAndUp: ${e.message}") - } - } - - private fun onItemMove(fromPosition: Int, toPosition: Int) { - try { - - val items = mAdapter.getItems() - if (fromPosition < 0 || toPosition < 0 || - fromPosition >= items.size || toPosition >= items.size) { - Log.w(TAG, "Invalid positions for move: from=$fromPosition, to=$toPosition, size=${items.size}") - return - } - - if (fromPosition < toPosition) { - for (i in fromPosition until toPosition) { - try { - Collections.swap(items, i, i + 1) - } catch (e: Exception) { - Log.e(TAG, "Error swapping items at position $i: ${e.message}") - return - } - } - } else { - for (i in fromPosition downTo toPosition + 1) { - try { - Collections.swap(items, i, i - 1) - } catch (e: Exception) { - Log.e(TAG, "Error swapping items at position $i: ${e.message}") - return - } - } - } - - try { - mAdapter.notifyItemMoved(fromPosition, toPosition) - } catch (e: Exception) { - Log.e(TAG, "Error notifying item moved: ${e.message}") - - mAdapter.notifyDataSetChanged() - } - } catch (e: Exception) { - Log.e(TAG, "Error in onItemMove: ${e.message}") - } - } - - private fun setOnLongClick() { - try { - mAdapter.setItemLongClickListener { view, data, _ -> - try { - popupMenu = PopupMenu(requireContext(),view).also { - it.inflate(R.menu.app_menu) - it.setOnMenuItemClickListener { item -> - try { - when (item.itemId) { - R.id.app_remove -> { - if (data.isXpModule) { - toast(R.string.uninstall_module_toast) - } else { - unInstallApk(data) - } - } - - R.id.app_clear -> { - clearApk(data) - } - - R.id.app_stop -> { - stopApk(data) - } - - R.id.app_shortcut -> { - ShortcutUtil.createShortcut(requireContext(), userID, data) - } - } - return@setOnMenuItemClickListener true - } catch (e: Exception) { - Log.e(TAG, "Error in menu item click: ${e.message}") - return@setOnMenuItemClickListener false - } - } - it.show() - } - } catch (e: Exception) { - Log.e(TAG, "Error in long click: ${e.message}") - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in setOnLongClick: ${e.message}") - } - } - - private fun initData() { - try { - viewBinding.stateView.showLoading() - viewModel.getInstalledApps(userID) - viewModel.appsLiveData.observe(viewLifecycleOwner) { - try { - if (it != null) { - mAdapter.setItems(it) - if (it.isEmpty()) { - viewBinding.stateView.showEmpty() - } else { - viewBinding.stateView.showContent() - } - } - } catch (e: Exception) { - Log.e(TAG, "Error observing apps data: ${e.message}") - } - } - - viewModel.resultLiveData.observe(viewLifecycleOwner) { - try { - if (!TextUtils.isEmpty(it)) { - hideLoading() - requireContext().toast(it) - viewModel.getInstalledApps(userID) - scanUser() - } - } catch (e: Exception) { - Log.e(TAG, "Error observing result data: ${e.message}") - } - } - - viewModel.launchLiveData.observe(viewLifecycleOwner) { - try { - it?.run { - hideLoading() - if (!it) { - toast(R.string.start_fail) - } - } - } catch (e: Exception) { - Log.e(TAG, "Error observing launch data: ${e.message}") - } - } - - viewModel.updateSortLiveData.observe(viewLifecycleOwner) { - try { - if (this::mAdapter.isInitialized) { - viewModel.updateApkOrder(userID, mAdapter.getItems()) - } - } catch (e: Exception) { - Log.e(TAG, "Error observing sort data: ${e.message}") - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in initData: ${e.message}") - } - } - - override fun onStop() { - try { - super.onStop() - viewModel.resultLiveData.value = null - viewModel.launchLiveData.value = null - } catch (e: Exception) { - Log.e(TAG, "Error in onStop: ${e.message}") - } - } - - private fun unInstallApk(info: AppInfo) { - try { - MaterialDialog(requireContext()).show { - title(R.string.uninstall_app) - message(text = getString(R.string.uninstall_app_hint, info.name)) - positiveButton(R.string.done) { - try { - showLoading() - viewModel.unInstall(info.packageName, userID) - } catch (e: Exception) { - Log.e(TAG, "Error uninstalling app: ${e.message}") - hideLoading() - } - } - negativeButton(R.string.cancel) - } - } catch (e: Exception) { - Log.e(TAG, "Error showing uninstall dialog: ${e.message}") - } - } - - - private fun stopApk(info: AppInfo) { - try { - MaterialDialog(requireContext()).show { - title(R.string.app_stop) - message(text = getString(R.string.app_stop_hint,info.name)) - positiveButton(R.string.done) { - try { - BlackBoxCore.get().stopPackage(info.packageName, userID) - toast(getString(R.string.is_stop,info.name)) - } catch (e: Exception) { - Log.e(TAG, "Error stopping app: ${e.message}") - } - } - negativeButton(R.string.cancel) - } - } catch (e: Exception) { - Log.e(TAG, "Error showing stop dialog: ${e.message}") - } - } - - - private fun clearApk(info: AppInfo) { - try { - MaterialDialog(requireContext()).show { - title(R.string.app_clear) - message(text = getString(R.string.app_clear_hint,info.name)) - positiveButton(R.string.done) { - try { - showLoading() - viewModel.clearApkData(info.packageName, userID) - } catch (e: Exception) { - Log.e(TAG, "Error clearing app data: ${e.message}") - hideLoading() - } - } - negativeButton(R.string.cancel) - } - } catch (e: Exception) { - Log.e(TAG, "Error showing clear dialog: ${e.message}") - } - } - - fun installApk(source: String) { - try { - showLoading() - viewModel.install(source, userID) - } catch (e: Exception) { - Log.e(TAG, "Error installing APK: ${e.message}") - hideLoading() - } - } - - private fun scanUser() { - try { - (requireActivity() as? MainActivity)?.scanUser() - } catch (e: Exception) { - Log.e(TAG, "Error scanning user: ${e.message}") - } - } - - private fun showLoading() { - try { - if(requireActivity() is LoadingActivity){ - (requireActivity() as LoadingActivity).showLoading() - } - } catch (e: Exception) { - Log.e(TAG, "Error showing loading: ${e.message}") - } - } - - private fun hideLoading() { - try { - if(requireActivity() is LoadingActivity){ - (requireActivity() as LoadingActivity).hideLoading() - } - } catch (e: Exception) { - Log.e(TAG, "Error hiding loading: ${e.message}") - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsTouchCallBack.kt b/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsTouchCallBack.kt deleted file mode 100644 index 5a72342..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsTouchCallBack.kt +++ /dev/null @@ -1,105 +0,0 @@ -package top.niunaijun.blackboxa.view.apps - -import androidx.recyclerview.widget.ItemTouchHelper -import androidx.recyclerview.widget.RecyclerView -import android.util.Log - -class AppsTouchCallBack(private val onMoveBlock: (from: Int, to: Int) -> Unit) : - ItemTouchHelper.Callback() { - - companion object { - private const val TAG = "AppsTouchCallBack" - } - - override fun getMovementFlags( - recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder - ): Int { - return try { - makeMovementFlags( - ItemTouchHelper.UP or ItemTouchHelper.DOWN or - ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT, - 0 - ) - } catch (e: Exception) { - Log.e(TAG, "Error getting movement flags: ${e.message}") - - makeMovementFlags(0, 0) - } - } - - override fun onMove( - recyclerView: RecyclerView, - viewHolder: RecyclerView.ViewHolder, - target: RecyclerView.ViewHolder - ): Boolean { - return try { - val fromPosition = viewHolder.bindingAdapterPosition - val toPosition = target.bindingAdapterPosition - - - if (fromPosition == RecyclerView.NO_POSITION || toPosition == RecyclerView.NO_POSITION) { - Log.w(TAG, "Invalid positions: from=$fromPosition, to=$toPosition") - false - } else if (fromPosition == toPosition) { - - false - } else { - - onMoveBlock(fromPosition, toPosition) - true - } - } catch (e: Exception) { - Log.e(TAG, "Error in onMove: ${e.message}") - false - } - } - - override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { - - } - - override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { - try { - super.onSelectedChanged(viewHolder, actionState) - - when (actionState) { - ItemTouchHelper.ACTION_STATE_DRAG -> { - - viewHolder?.itemView?.alpha = 0.8f - } - ItemTouchHelper.ACTION_STATE_IDLE -> { - - viewHolder?.itemView?.alpha = 1.0f - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in onSelectedChanged: ${e.message}") - } - } - - override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { - try { - super.clearView(recyclerView, viewHolder) - - viewHolder.itemView.alpha = 1.0f - } catch (e: Exception) { - Log.e(TAG, "Error in clearView: ${e.message}") - } - } - - override fun canDropOver( - recyclerView: RecyclerView, - current: RecyclerView.ViewHolder, - target: RecyclerView.ViewHolder - ): Boolean { - return try { - - val targetPosition = target.bindingAdapterPosition - targetPosition != RecyclerView.NO_POSITION - } catch (e: Exception) { - Log.e(TAG, "Error in canDropOver: ${e.message}") - false - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsViewModel.kt b/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsViewModel.kt deleted file mode 100644 index 14d2c99..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/apps/AppsViewModel.kt +++ /dev/null @@ -1,81 +0,0 @@ -package top.niunaijun.blackboxa.view.apps - -import androidx.lifecycle.MutableLiveData -import top.niunaijun.blackboxa.bean.AppInfo -import top.niunaijun.blackboxa.data.AppsRepository -import top.niunaijun.blackboxa.view.base.BaseViewModel -import android.util.Log - - -class AppsViewModel(private val repo: AppsRepository) : BaseViewModel() { - - val appsLiveData = MutableLiveData>() - - val resultLiveData = MutableLiveData() - - val launchLiveData = MutableLiveData() - - - val updateSortLiveData = MutableLiveData() - - fun getInstalledApps(userId: Int) { - launchOnUI { - repo.getVmInstallList(userId, appsLiveData) - } - } - - - fun getInstalledAppsWithRetry(userId: Int, maxRetries: Int = 3) { - var retryCount = 0 - - fun attemptLoad() { - launchOnUI { - repo.getVmInstallList(userId, appsLiveData) - - - val currentApps = appsLiveData.value - if ((currentApps == null || currentApps.isEmpty()) && retryCount < maxRetries) { - retryCount++ - Log.d("AppsViewModel", "No apps loaded, retrying... (${retryCount}/${maxRetries})") - - - android.os.Handler(android.os.Looper.getMainLooper()).postDelayed({ - attemptLoad() - }, 1000) - } - } - } - - attemptLoad() - } - - fun install(source: String, userID: Int) { - launchOnUI { - repo.installApk(source, userID, resultLiveData) - } - } - - fun unInstall(packageName: String, userID: Int) { - launchOnUI { - repo.unInstall(packageName, userID, resultLiveData) - } - } - - fun clearApkData(packageName: String,userID: Int){ - launchOnUI { - repo.clearApkData(packageName,userID,resultLiveData) - } - } - - fun launchApk(packageName: String, userID: Int) { - launchOnUI { - repo.launchApk(packageName, userID, launchLiveData) - } - } - - fun updateApkOrder(userID: Int,dataList:List){ - launchOnUI { - repo.updateApkOrder(userID,dataList) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/base/BaseActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/base/BaseActivity.kt deleted file mode 100644 index d27d14f..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/base/BaseActivity.kt +++ /dev/null @@ -1,28 +0,0 @@ -package top.niunaijun.blackboxa.view.base - -import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar - - -open class BaseActivity : AppCompatActivity() { - - protected fun initToolbar(toolbar: Toolbar,title:Int, showBack: Boolean = false, onBack: (() -> Unit)? = null) { - setSupportActionBar(toolbar) - toolbar.setTitle(title) - if (showBack) { - supportActionBar?.let { - it.setDisplayHomeAsUpEnabled(true) - toolbar.setNavigationOnClickListener { - if (onBack != null) { - onBack() - } - finish() - } - } - } - } - - protected fun currentUserID():Int{ - return intent.getIntExtra("userID", 0) - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/base/BaseViewModel.kt b/app/src/main/java/top/niunaijun/blackboxa/view/base/BaseViewModel.kt deleted file mode 100644 index a31a005..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/base/BaseViewModel.kt +++ /dev/null @@ -1,29 +0,0 @@ -package top.niunaijun.blackboxa.view.base - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.* - - -open class BaseViewModel : ViewModel() { - - fun launchOnUI(block: suspend CoroutineScope.() -> Unit) { - viewModelScope.launch { - withContext(Dispatchers.IO) { - try { - block() - } catch (e: Throwable) { - e.printStackTrace() - } - - } - } - } - - - override fun onCleared() { - super.onCleared() - viewModelScope.cancel() - } - -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/base/LoadingActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/base/LoadingActivity.kt deleted file mode 100644 index 9ea43fc..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/base/LoadingActivity.kt +++ /dev/null @@ -1,38 +0,0 @@ -package top.niunaijun.blackboxa.view.base - -import android.view.KeyEvent -import com.roger.catloadinglibrary.CatLoadingView -import top.niunaijun.blackboxa.R - - -abstract class LoadingActivity : BaseActivity() { - - private lateinit var loadingView: CatLoadingView - - - fun showLoading() { - if (!this::loadingView.isInitialized) { - loadingView = CatLoadingView() - } - - if (!loadingView.isAdded) { - loadingView.setBackgroundColor(R.color.primary) - loadingView.show(supportFragmentManager, "") - supportFragmentManager.executePendingTransactions() - loadingView.setClickCancelAble(false) - loadingView.dialog?.setOnKeyListener { _, keyCode, _ -> - if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ESCAPE) { - return@setOnKeyListener true - } - false - } - } - } - - - fun hideLoading() { - if (this::loadingView.isInitialized) { - loadingView.dismiss() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationAdapter.kt b/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationAdapter.kt deleted file mode 100644 index 8e4bc24..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationAdapter.kt +++ /dev/null @@ -1,38 +0,0 @@ -package top.niunaijun.blackboxa.view.fake - -import android.view.View -import android.view.ViewGroup -import cbfg.rvadapter.RVHolder -import cbfg.rvadapter.RVHolderFactory -import top.niunaijun.blackbox.fake.frameworks.BLocationManager -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.bean.FakeLocationBean -import top.niunaijun.blackboxa.databinding.ItemFakeBinding -import top.niunaijun.blackboxa.util.getString - - - -class FakeLocationAdapter : RVHolderFactory() { - - override fun createViewHolder(parent: ViewGroup?, viewType: Int, item: Any): RVHolder { - return FakeLocationVH(inflate(R.layout.item_fake,parent)) - } - - class FakeLocationVH(itemView:View):RVHolder(itemView){ - - private val binding = ItemFakeBinding.bind(itemView) - - override fun setContent(item: FakeLocationBean, isSelected: Boolean, payload: Any?) { - binding.icon.setImageDrawable(item.icon) - binding.name.text = item.name - if (item.fakeLocation == null || item.fakeLocationPattern == BLocationManager.CLOSE_MODE) { - binding.fakeLocation.text = getString(R.string.real_location) - } else { - binding.fakeLocation.text = - String.format("%f, %f", item.fakeLocation!!.latitude, item.fakeLocation!!.longitude) - } - binding.cornerLabel.visibility = View.VISIBLE - - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationFactory.kt b/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationFactory.kt deleted file mode 100644 index a9e0211..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationFactory.kt +++ /dev/null @@ -1,14 +0,0 @@ -package top.niunaijun.blackboxa.view.fake - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import top.niunaijun.blackboxa.data.FakeLocationRepository - - -class FakeLocationFactory(private val repo: FakeLocationRepository) : - ViewModelProvider.NewInstanceFactory() { - - override fun create(modelClass: Class): T { - return FakeLocationViewModel(repo) as T - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationViewModel.kt b/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationViewModel.kt deleted file mode 100644 index f35534e..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeLocationViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package top.niunaijun.blackboxa.view.fake - -import androidx.lifecycle.MutableLiveData -import top.niunaijun.blackbox.entity.location.BLocation -import top.niunaijun.blackboxa.bean.FakeLocationBean -import top.niunaijun.blackboxa.data.FakeLocationRepository -import top.niunaijun.blackboxa.view.base.BaseViewModel - - -class FakeLocationViewModel(private val mRepo: FakeLocationRepository) : BaseViewModel() { - - val appsLiveData = MutableLiveData>() - - - fun getInstallAppList(userID: Int) { - launchOnUI { - mRepo.getInstalledAppList(userID, appsLiveData) - } - } - - fun setPattern(userId: Int, pkg: String, pattern: Int) { - launchOnUI { - mRepo.setPattern(userId, pkg, pattern) - } - } - - fun setLocation(userId: Int, pkg: String, location: BLocation) { - launchOnUI { - mRepo.setLocation(userId, pkg, location) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeManagerActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeManagerActivity.kt deleted file mode 100644 index 377ea30..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FakeManagerActivity.kt +++ /dev/null @@ -1,184 +0,0 @@ -package top.niunaijun.blackboxa.view.fake - -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.view.Menu -import android.view.inputmethod.InputMethodManager -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.LinearLayoutManager -import cbfg.rvadapter.RVAdapter -import com.afollestad.materialdialogs.MaterialDialog -import com.ferfalk.simplesearchview.SimpleSearchView -import top.niunaijun.blackbox.entity.location.BLocation -import top.niunaijun.blackbox.fake.frameworks.BLocationManager -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.bean.FakeLocationBean -import top.niunaijun.blackboxa.databinding.ActivityListBinding -import top.niunaijun.blackboxa.util.InjectionUtil -import top.niunaijun.blackboxa.util.inflate -import top.niunaijun.blackboxa.util.toast -import top.niunaijun.blackboxa.view.base.BaseActivity - - -class FakeManagerActivity : BaseActivity() { - val TAG: String = "FakeManagerActivity" - - private val viewBinding: ActivityListBinding by inflate() - - - private lateinit var mAdapter: RVAdapter - - private lateinit var viewModel: FakeLocationViewModel - - private var appList: List = ArrayList() - - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(viewBinding.root) - - initToolbar(viewBinding.toolbarLayout.toolbar, R.string.fake_location, true) - - mAdapter = RVAdapter(this,FakeLocationAdapter()).bind(viewBinding.recyclerView) - .setItemClickListener { _, data, _ -> - - val intent = Intent(this, FollowMyLocationOverlay::class.java) - intent.putExtra("location", data.fakeLocation) - intent.putExtra("pkg", data.packageName) - - locationResult.launch(intent) - }.setItemLongClickListener { _, item, position -> - disableFakeLocation(item,position) - } - - viewBinding.recyclerView.layoutManager = LinearLayoutManager(this) - - - initSearchView() - initViewModel() - } - - private fun disableFakeLocation(item: FakeLocationBean,position:Int) { - MaterialDialog(this).show { - title(R.string.close_fake_location) - message(text = getString(R.string.close_app_fake_location,item.name)) - negativeButton(R.string.cancel) - positiveButton(R.string.done){ - BLocationManager.disableFakeLocation(currentUserID(),item.packageName) - toast(getString(R.string.close_fake_location_success,item.name)) - item.fakeLocationPattern = BLocationManager.CLOSE_MODE - mAdapter.replaceAt(position,item) - } - } - } - - private fun initSearchView() { - viewBinding.searchView.setOnQueryTextListener(object : - SimpleSearchView.OnQueryTextListener { - override fun onQueryTextChange(newText: String): Boolean { - filterApp(newText) - return true - } - - override fun onQueryTextCleared(): Boolean { - return true - } - - override fun onQueryTextSubmit(query: String): Boolean { - return true - } - - }) - } - - private fun initViewModel() { - viewModel = ViewModelProvider(this, InjectionUtil.getFakeLocationFactory()).get( - FakeLocationViewModel::class.java - ) - loadAppList() - viewBinding.toolbarLayout.toolbar.setTitle(R.string.fake_location) - - viewModel.appsLiveData.observe(this) { - if (it != null) { - this.appList = it - viewBinding.searchView.setQuery("", false) - filterApp("") - if (it.isNotEmpty()) { - viewBinding.stateView.showContent() - } else { - viewBinding.stateView.showEmpty() - } - } - } - } - - private fun loadAppList() { - viewBinding.stateView.showLoading() - viewModel.getInstallAppList(currentUserID()) - } - - private val locationResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (it.resultCode == RESULT_OK) { - - it.data?.let { data -> - val latitude = data.getDoubleExtra("latitude", 0.0) - val longitude = data.getDoubleExtra("longitude", 0.0) - val pkg = data.getStringExtra("pkg") - - viewModel.setPattern(currentUserID(), pkg.toString(), BLocationManager.OWN_MODE) - viewModel.setLocation(currentUserID(), pkg.toString(), BLocation(latitude, longitude)) - - toast(getString(R.string.set_location,latitude.toString(), longitude.toString())) - - loadAppList() - } - - } - } - - - private fun filterApp(newText: String) { - val newList = this.appList.filter { - it.name.contains(newText, true) or it.packageName.contains(newText, true) - } - mAdapter.setItems(newList) - } - - private fun finishWithResult(source: String) { - intent.putExtra("source", source) - setResult(Activity.RESULT_OK, intent) - val imm: InputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager - window.peekDecorView()?.run { - imm.hideSoftInputFromWindow(windowToken, 0) - } - finish() - } - - - override fun onBackPressed() { - if (viewBinding.searchView.isSearchOpen) { - viewBinding.searchView.closeSearch() - } else { - super.onBackPressed() - } - } - - override fun onCreateOptionsMenu(menu: Menu?): Boolean { - menuInflater.inflate(R.menu.menu_search, menu) - val item = menu!!.findItem(R.id.list_search) - viewBinding.searchView.setMenuItem(item) - return true - } - - - companion object { - fun start(context: Context) { - val intent = Intent(context, FakeManagerActivity::class.java) - context.startActivity(intent) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FollowMyLocationOverlay.kt b/app/src/main/java/top/niunaijun/blackboxa/view/fake/FollowMyLocationOverlay.kt deleted file mode 100644 index d532b3f..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/fake/FollowMyLocationOverlay.kt +++ /dev/null @@ -1,139 +0,0 @@ -package top.niunaijun.blackboxa.view.fake - - -import android.app.Activity -import android.os.Bundle -import android.view.inputmethod.InputMethodManager -import androidx.appcompat.app.AppCompatActivity -import androidx.core.app.ActivityCompat -import androidx.preference.PreferenceManager -import org.osmdroid.config.Configuration -import org.osmdroid.events.MapEventsReceiver -import org.osmdroid.tileprovider.tilesource.TileSourceFactory -import org.osmdroid.util.GeoPoint -import org.osmdroid.views.overlay.MapEventsOverlay -import org.osmdroid.views.overlay.Marker -import top.niunaijun.blackbox.entity.location.BLocation -import top.niunaijun.blackboxa.databinding.ActivityOsmdroidBinding -import top.niunaijun.blackboxa.util.inflate -import top.niunaijun.blackboxa.util.toast - - - -class FollowMyLocationOverlay : AppCompatActivity() { - val TAG: String = "FollowMyLocationOverlay" - - private val REQUEST_PERMISSIONS_REQUEST_CODE = 1 - - private val binding: ActivityOsmdroidBinding by inflate() - - lateinit var startPoint: GeoPoint - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - - - - - Configuration.getInstance().load(this, PreferenceManager.getDefaultSharedPreferences(this)) - - - - - - - - - setContentView(binding.root) - - val location: BLocation? = intent.getParcelableExtra("location") - - startPoint = if (location == null) { - GeoPoint(30.2736, 120.1563) - } else { - GeoPoint(location.latitude, location.longitude) - } - - - val startMarker = Marker(binding.map) - startMarker.position = startPoint - startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) - - binding.map.overlays.add(startMarker) - val mReceive: MapEventsReceiver = object : MapEventsReceiver { - override fun singleTapConfirmedHelper(p: GeoPoint): Boolean { - startPoint = p - startMarker.position = p - startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) - binding.map.overlays.add(startMarker) - toast(p.latitude.toString() + " - " + p.longitude) - return false - } - - override fun longPressHelper(p: GeoPoint): Boolean { - return false - } - } - binding.map.overlays.add(MapEventsOverlay(mReceive)) - val mapController = binding.map.controller - mapController.setZoom(12.5) - - mapController.setCenter(startPoint) - binding.map.setTileSource(TileSourceFactory.MAPNIK) - } - - override fun onBackPressed() { - finishWithResult(startPoint) - } - - override fun onResume() { - super.onResume() - - - - - binding.map.onResume() - } - - override fun onPause() { - super.onPause() - - - - - binding.map.onPause() - } - - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - val permissionsToRequest = ArrayList() - var i = 0 - while (i < grantResults.size) { - permissionsToRequest.add(permissions[i]) - i++ - } - if (permissionsToRequest.size > 0) { - ActivityCompat.requestPermissions( - this, - permissionsToRequest.toTypedArray(), - REQUEST_PERMISSIONS_REQUEST_CODE - ) - } - } - - private fun finishWithResult(geoPoint: GeoPoint) { - intent.putExtra("latitude", geoPoint.latitude) - intent.putExtra("longitude", geoPoint.longitude) - setResult(Activity.RESULT_OK, intent) - val imm: InputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager - window.peekDecorView()?.run { - imm.hideSoftInputFromWindow(windowToken, 0) - } - finish() - } - -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsAdapter.kt b/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsAdapter.kt deleted file mode 100644 index 28bbcab..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsAdapter.kt +++ /dev/null @@ -1,32 +0,0 @@ -package top.niunaijun.blackboxa.view.gms - -import android.view.View -import android.view.ViewGroup -import cbfg.rvadapter.RVHolder -import cbfg.rvadapter.RVHolderFactory -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.bean.GmsBean -import top.niunaijun.blackboxa.databinding.ItemGmsBinding - - -class GmsAdapter : RVHolderFactory() { - - override fun createViewHolder(parent: ViewGroup?, viewType: Int, item: Any): RVHolder { - return GmsVH(inflate(R.layout.item_gms,parent)) - } - - - class GmsVH(itemView:View):RVHolder(itemView){ - - private val binding = ItemGmsBinding.bind(itemView) - override fun setContent(item: GmsBean, isSelected: Boolean, payload: Any?) { - binding.tvTitle.text = item.userName - binding.checkbox.isChecked = item.isInstalledGms - binding.checkbox.setOnCheckedChangeListener { buttonView, _ -> - if(buttonView.isPressed){ - binding.root.performClick() - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsFactory.kt b/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsFactory.kt deleted file mode 100644 index 24c27d2..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsFactory.kt +++ /dev/null @@ -1,13 +0,0 @@ -package top.niunaijun.blackboxa.view.gms - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import top.niunaijun.blackboxa.data.GmsRepository - - -class GmsFactory(private val repo:GmsRepository): ViewModelProvider.NewInstanceFactory() { - - override fun create(modelClass: Class): T { - return GmsViewModel(repo) as T - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsManagerActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsManagerActivity.kt deleted file mode 100644 index b7d1255..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsManagerActivity.kt +++ /dev/null @@ -1,128 +0,0 @@ -package top.niunaijun.blackboxa.view.gms - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.widget.Switch -import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.LinearLayoutManager -import cbfg.rvadapter.RVAdapter -import com.afollestad.materialdialogs.MaterialDialog -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.bean.GmsBean -import top.niunaijun.blackboxa.databinding.ActivityGmsBinding -import top.niunaijun.blackboxa.util.InjectionUtil -import top.niunaijun.blackboxa.util.inflate -import top.niunaijun.blackboxa.util.toast -import top.niunaijun.blackboxa.view.base.LoadingActivity - - -class GmsManagerActivity : LoadingActivity() { - - private lateinit var viewModel: GmsViewModel - - private lateinit var mAdapter: RVAdapter - - private val viewBinding: ActivityGmsBinding by inflate() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(viewBinding.root) - initToolbar(viewBinding.toolbarLayout.toolbar, R.string.gms_manager, true) - initViewModel() - - initRecyclerView() - } - - private fun initViewModel() { - viewModel = ViewModelProvider(this, InjectionUtil.getGmsFactory())[GmsViewModel::class.java] - showLoading() - - viewModel.mInstalledLiveData.observe(this) { - hideLoading() - mAdapter.setItems(it) - } - - viewModel.mUpdateInstalledLiveData.observe(this) { result -> - if (result == null) { - return@observe - } - - val items = mAdapter.getItems() - for (index in items.indices) { - val bean = items[index] - if (bean.userID == result.userID) { - if (result.success) { - bean.isInstalledGms = !bean.isInstalledGms - } - mAdapter.replaceAt( index,bean) - break - } - } - - hideLoading() - - if (result.success) { - toast(result.msg) - } else { - MaterialDialog(this).show { - title(R.string.gms_manager) - message(text = result.msg) - positiveButton(R.string.done) - } - } - } - - viewModel.getInstalledUser() - } - - private fun initRecyclerView() { - mAdapter = RVAdapter(this, GmsAdapter()).bind(viewBinding.recyclerView) - .setItemClickListener { view, item, _ -> - val checkbox = view.findViewById(R.id.checkbox) - if (item.isInstalledGms) { - uninstallGms(item.userID, checkbox) - } else { - installGms(item.userID, checkbox) - } - } - viewBinding.recyclerView.layoutManager = LinearLayoutManager(this) - - } - - private fun installGms(userID: Int, checkbox: Switch){ - MaterialDialog(this).show { - title(R.string.enable_gms) - message(R.string.enable_gms_hint) - positiveButton(R.string.done){ - showLoading() - viewModel.installGms(userID) - } - negativeButton(R.string.cancel){ - checkbox.isChecked = !checkbox.isChecked - } - } - } - - private fun uninstallGms(userID: Int, checkbox: Switch){ - MaterialDialog(this).show { - title(R.string.disable_gms) - message(R.string.disable_gms_hint) - positiveButton(R.string.done){ - showLoading() - viewModel.uninstallGms(userID) - } - negativeButton(R.string.cancel){ - checkbox.isChecked = !checkbox.isChecked - } - } - } - - - companion object{ - fun start(context: Context){ - val intent = Intent(context,GmsManagerActivity::class.java) - context.startActivity(intent) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsViewModel.kt b/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsViewModel.kt deleted file mode 100644 index 28289e7..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/gms/GmsViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package top.niunaijun.blackboxa.view.gms - -import androidx.lifecycle.MutableLiveData -import top.niunaijun.blackboxa.bean.GmsBean -import top.niunaijun.blackboxa.bean.GmsInstallBean -import top.niunaijun.blackboxa.data.GmsRepository -import top.niunaijun.blackboxa.view.base.BaseViewModel - - -class GmsViewModel(private val mRepo: GmsRepository) : BaseViewModel() { - - val mInstalledLiveData = MutableLiveData>() - - val mUpdateInstalledLiveData = MutableLiveData() - - fun getInstalledUser() { - launchOnUI { - mRepo.getGmsInstalledList(mInstalledLiveData) - } - } - - fun installGms(userID: Int) { - launchOnUI { - mRepo.installGms(userID,mUpdateInstalledLiveData) - } - } - - fun uninstallGms(userID: Int) { - launchOnUI { - mRepo.uninstallGms(userID,mUpdateInstalledLiveData) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/list/ListActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/list/ListActivity.kt deleted file mode 100644 index 36ff22a..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/list/ListActivity.kt +++ /dev/null @@ -1,157 +0,0 @@ -package top.niunaijun.blackboxa.view.list - -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.view.inputmethod.InputMethodManager -import androidx.activity.result.contract.ActivityResultContracts -import androidx.lifecycle.ViewModelProvider -import androidx.recyclerview.widget.LinearLayoutManager -import cbfg.rvadapter.RVAdapter -import com.ferfalk.simplesearchview.SimpleSearchView -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.bean.InstalledAppBean -import top.niunaijun.blackboxa.databinding.ActivityListBinding -import top.niunaijun.blackboxa.util.InjectionUtil -import top.niunaijun.blackboxa.util.inflate -import top.niunaijun.blackboxa.view.base.BaseActivity - -class ListActivity : BaseActivity() { - - private val viewBinding: ActivityListBinding by inflate() - - private lateinit var mAdapter: RVAdapter - - private lateinit var viewModel: ListViewModel - - private var appList: List = ArrayList() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(viewBinding.root) - - initToolbar(viewBinding.toolbarLayout.toolbar, R.string.installed_app, true) - - mAdapter = - RVAdapter(this, ListAdapter()) - .bind(viewBinding.recyclerView) - .setItemClickListener { _, item, _ -> finishWithResult(item.packageName) } - - viewBinding.recyclerView.layoutManager = LinearLayoutManager(this) - - initSearchView() - initViewModel() - } - - private fun initSearchView() { - viewBinding.searchView.setOnQueryTextListener( - object : SimpleSearchView.OnQueryTextListener { - override fun onQueryTextChange(newText: String): Boolean { - filterApp(newText) - return true - } - - override fun onQueryTextCleared(): Boolean { - return true - } - - override fun onQueryTextSubmit(query: String): Boolean { - return true - } - } - ) - } - - private fun initViewModel() { - viewModel = - ViewModelProvider(this, InjectionUtil.getListFactory()) - .get(ListViewModel::class.java) - val userID = intent.getIntExtra("userID", 0) - viewModel.getInstallAppList(userID) - viewBinding.toolbarLayout.toolbar.setTitle(R.string.installed_app) - - viewModel.loadingLiveData.observe(this) { - if (it) { - viewBinding.stateView.showLoading() - } else { - viewBinding.stateView.showContent() - } - } - - viewModel.appsLiveData.observe(this) { - if (it != null) { - this.appList = it - viewBinding.searchView.setQuery("", false) - filterApp("") - if (it.isNotEmpty()) { - viewBinding.stateView.showContent() - viewModel.previewInstalledList() - } else { - viewBinding.stateView.showEmpty() - } - } - } - } - - private fun filterApp(newText: String) { - val newList = - this.appList.filter { - it.name.contains(newText, true) or it.packageName.contains(newText, true) - } - mAdapter.setItems(newList) - } - - private val openDocumentedResult = - registerForActivityResult(ActivityResultContracts.GetContent()) { - it?.run { finishWithResult(it.toString()) } - } - - private fun finishWithResult(source: String) { - intent.putExtra("source", source) - setResult(Activity.RESULT_OK, intent) - val imm: InputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager - window.peekDecorView()?.run { imm.hideSoftInputFromWindow(windowToken, 0) } - finish() - } - - override fun onBackPressed() { - if (viewBinding.searchView.isSearchOpen) { - viewBinding.searchView.closeSearch() - } else { - super.onBackPressed() - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == R.id.list_choose) { - openDocumentedResult.launch("application/vnd.android.package-archive") - } - return true - } - - override fun onCreateOptionsMenu(menu: Menu?): Boolean { - menuInflater.inflate(R.menu.menu_list, menu) - val item = menu!!.findItem(R.id.list_search) - viewBinding.searchView.setMenuItem(item) - - return true - } - - override fun onStop() { - super.onStop() - viewModel.loadingLiveData.postValue(true) - viewModel.loadingLiveData.removeObservers(this) - viewModel.appsLiveData.postValue(null) - viewModel.appsLiveData.removeObservers(this) - } - - companion object { - fun start(context: Context) { - val intent = Intent(context, ListActivity::class.java) - context.startActivity(intent) - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/list/ListAdapter.kt b/app/src/main/java/top/niunaijun/blackboxa/view/list/ListAdapter.kt deleted file mode 100644 index df3aabb..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/list/ListAdapter.kt +++ /dev/null @@ -1,33 +0,0 @@ -package top.niunaijun.blackboxa.view.list - -import android.view.View -import android.view.ViewGroup -import cbfg.rvadapter.RVHolder -import cbfg.rvadapter.RVHolderFactory -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.bean.InstalledAppBean -import top.niunaijun.blackboxa.databinding.ItemPackageBinding - - - -class ListAdapter : RVHolderFactory() { - - override fun createViewHolder(parent: ViewGroup?, viewType: Int, item: Any): RVHolder { - return ListVH(inflate(R.layout.item_package,parent)) - } - - class ListVH(itemView:View) :RVHolder(itemView){ - - val binding = ItemPackageBinding.bind(itemView) - override fun setContent(item: InstalledAppBean, isSelected: Boolean, payload: Any?) { - binding.icon.setImageDrawable(item.icon) - binding.name.text = item.name - binding.packageName.text = item.packageName - binding.cornerLabel.visibility = if (item.isInstall) { - View.VISIBLE - } else { - View.GONE - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/list/ListFactory.kt b/app/src/main/java/top/niunaijun/blackboxa/view/list/ListFactory.kt deleted file mode 100644 index 6138b9f..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/list/ListFactory.kt +++ /dev/null @@ -1,14 +0,0 @@ -package top.niunaijun.blackboxa.view.list - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import top.niunaijun.blackboxa.data.AppsRepository - - -@Suppress("UNCHECKED_CAST") -class ListFactory(private val appsRepository: AppsRepository) : ViewModelProvider.NewInstanceFactory() { - - override fun create(modelClass: Class): T { - return ListViewModel(appsRepository) as T - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/list/ListViewModel.kt b/app/src/main/java/top/niunaijun/blackboxa/view/list/ListViewModel.kt deleted file mode 100644 index 7e049d6..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/list/ListViewModel.kt +++ /dev/null @@ -1,22 +0,0 @@ -package top.niunaijun.blackboxa.view.list - -import androidx.lifecycle.MutableLiveData -import top.niunaijun.blackboxa.bean.InstalledAppBean -import top.niunaijun.blackboxa.data.AppsRepository -import top.niunaijun.blackboxa.view.base.BaseViewModel - - -class ListViewModel(private val repo: AppsRepository) : BaseViewModel() { - - val appsLiveData = MutableLiveData>() - - val loadingLiveData = MutableLiveData() - - fun previewInstalledList() { - launchOnUI { repo.previewInstallList() } - } - - fun getInstallAppList(userID: Int) { - launchOnUI { repo.getInstalledAppList(userID, loadingLiveData, appsLiveData) } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/main/BlackBoxLoader.kt b/app/src/main/java/top/niunaijun/blackboxa/view/main/BlackBoxLoader.kt deleted file mode 100644 index 31a0fa2..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/main/BlackBoxLoader.kt +++ /dev/null @@ -1,318 +0,0 @@ -package top.niunaijun.blackboxa.view.main - -import android.app.Application -import android.content.Context -import android.util.Log -import java.io.File -import top.niunaijun.blackbox.BlackBoxCore -import top.niunaijun.blackbox.app.BActivityThread -import top.niunaijun.blackbox.app.configuration.AppLifecycleCallback -import top.niunaijun.blackbox.app.configuration.ClientConfiguration -import top.niunaijun.blackboxa.app.App -import top.niunaijun.blackboxa.app.rocker.RockerManager -import top.niunaijun.blackboxa.biz.cache.AppSharedPreferenceDelegate - - -class BlackBoxLoader { - - private var mHideRoot by AppSharedPreferenceDelegate(App.getContext(), false) - - private var mDaemonEnable by AppSharedPreferenceDelegate(App.getContext(), true) - private var mShowShortcutPermissionDialog by AppSharedPreferenceDelegate(App.getContext(), true) - - - private var mUseVpnNetwork by AppSharedPreferenceDelegate(App.getContext(), false) - - private var mDisableFlagSecure by AppSharedPreferenceDelegate(App.getContext(), false) - - fun hideRoot(): Boolean { - return try { - mHideRoot - } catch (e: Exception) { - Log.e(TAG, "Error getting hideRoot: ${e.message}") - false - } - } - - fun invalidHideRoot(hideRoot: Boolean) { - try { - this.mHideRoot = hideRoot - } catch (e: Exception) { - Log.e(TAG, "Error setting hideRoot: ${e.message}") - } - } - - fun disableFlagSecure(): Boolean { - return try { - mDisableFlagSecure - } catch (e: Exception) { - Log.e(TAG, "Error getting disableFlagSecure: ${e.message}") - false - } - } - - fun invalidDisableFlagSecure(disable: Boolean) { - try { - this.mDisableFlagSecure = disable - } catch (e: Exception) { - Log.e(TAG, "Error setting disableFlagSecure: ${e.message}") - } - } - - fun daemonEnable(): Boolean { - return try { - mDaemonEnable - } catch (e: Exception) { - Log.e(TAG, "Error getting daemonEnable: ${e.message}") - false - } - } - - fun invalidDaemonEnable(enable: Boolean) { - try { - this.mDaemonEnable = enable - } catch (e: Exception) { - Log.e(TAG, "Error setting daemonEnable: ${e.message}") - } - } - - fun showShortcutPermissionDialog(): Boolean { - return try { - mShowShortcutPermissionDialog - } catch (e: Exception) { - Log.e(TAG, "Error getting showShortcutPermissionDialog: ${e.message}") - true - } - } - - fun invalidShortcutPermissionDialog(show: Boolean) { - try { - this.mShowShortcutPermissionDialog = show - } catch (e: Exception) { - Log.e(TAG, "Error setting showShortcutPermissionDialog: ${e.message}") - } - } - - fun useVpnNetwork(): Boolean { - return try { - mUseVpnNetwork - } catch (e: Exception) { - Log.e(TAG, "Error getting useVpnNetwork: ${e.message}") - false - } - } - - fun invalidUseVpnNetwork(enable: Boolean) { - try { - this.mUseVpnNetwork = enable - } catch (e: Exception) { - Log.e(TAG, "Error setting useVpnNetwork: ${e.message}") - } - } - - fun getBlackBoxCore(): BlackBoxCore { - return try { - BlackBoxCore.get() - } catch (e: Exception) { - Log.e(TAG, "Error getting BlackBoxCore: ${e.message}") - throw e - } - } - - fun addLifecycleCallback() { - try { - BlackBoxCore.get() - .addAppLifecycleCallback( - object : AppLifecycleCallback() { - override fun beforeCreateApplication( - packageName: String?, - processName: String?, - context: Context?, - userId: Int - ) { - try { - Log.d( - TAG, - "beforeCreateApplication: pkg $packageName, processName $processName,userID:${BActivityThread.getUserId()}" - ) - } catch (e: Exception) { - Log.e(TAG, "Error in beforeCreateApplication: ${e.message}") - } - } - - override fun beforeApplicationOnCreate( - packageName: String?, - processName: String?, - application: Application?, - userId: Int - ) { - try { - Log.d( - TAG, - "beforeApplicationOnCreate: pkg $packageName, processName $processName" - ) - } catch (e: Exception) { - Log.e( - TAG, - "Error in beforeApplicationOnCreate: ${e.message}" - ) - } - } - - override fun afterApplicationOnCreate( - packageName: String?, - processName: String?, - application: Application?, - userId: Int - ) { - try { - Log.d( - TAG, - "afterApplicationOnCreate: pkg $packageName, processName $processName" - ) - RockerManager.init(application, userId) - } catch (e: Exception) { - Log.e( - TAG, - "Error in afterApplicationOnCreate: ${e.message}" - ) - } - } - - override fun onStoragePermissionNeeded( - packageName: String?, - userId: Int - ): Boolean { - try { - Log.w( - TAG, - "Storage permission needed for launching: $packageName" - ) - - - - val intent = - android.content.Intent( - "top.niunaijun.blackboxa.REQUEST_STORAGE_PERMISSION" - ) - intent.putExtra("package_name", packageName) - intent.putExtra("user_id", userId) - intent.setPackage(App.getContext().packageName) - App.getContext().sendBroadcast(intent) - - - - - - return false - } catch (e: Exception) { - Log.e( - TAG, - "Error in onStoragePermissionNeeded: ${e.message}" - ) - return false - } - } - } - ) - } catch (e: Exception) { - Log.e(TAG, "Error adding lifecycle callback: ${e.message}") - } - } - - fun attachBaseContext(context: Context) { - try { - BlackBoxCore.get() - .doAttachBaseContext( - context, - object : ClientConfiguration() { - override fun getHostPackageName(): String { - return try { - context.packageName - } catch (e: Exception) { - Log.e(TAG, "Error getting package name: ${e.message}") - "unknown" - } - } - - override fun isHideRoot(): Boolean { - return try { - mHideRoot - } catch (e: Exception) { - Log.e(TAG, "Error checking hideRoot: ${e.message}") - false - } - } - - override fun isEnableDaemonService(): Boolean { - return true - } - - override fun isUseVpnNetwork(): Boolean { - return try { - mUseVpnNetwork - } catch (e: Exception) { - Log.e(TAG, "Error checking useVpnNetwork: ${e.message}") - false - } - } - - override fun isDisableFlagSecure(): Boolean { - return try { - mDisableFlagSecure - } catch (e: Exception) { - Log.e(TAG, "Error checking disableFlagSecure: ${e.message}") - false - } - } - - override fun requestInstallPackage( - file: File?, - userId: Int - ): Boolean { - return try { - if (file == null) { - Log.w(TAG, "requestInstallPackage: file is null") - return false - } - val packageInfo = - context.packageManager.getPackageArchiveInfo( - file.absolutePath, - 0 - ) - false - } catch (e: Exception) { - Log.e(TAG, "Error in requestInstallPackage: ${e.message}") - false - } - } - } - ) - } catch (e: Exception) { - Log.e(TAG, "Error in attachBaseContext: ${e.message}") - } - } - - fun doOnCreate(context: Context) { - try { - BlackBoxCore.get().doCreate() - - - try { - BlackBoxCore.get().addServiceAvailableCallback { - Log.d(TAG, "Services became available, triggering app list refresh") - - - } - } catch (e: Exception) { - Log.e(TAG, "Error registering service available callback: ${e.message}") - } - } catch (e: Exception) { - Log.e(TAG, "Error in doOnCreate: ${e.message}") - } - } - - companion object { - val TAG: String = BlackBoxLoader::class.java.simpleName - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/main/MainActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/main/MainActivity.kt deleted file mode 100644 index 3844faa..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/main/MainActivity.kt +++ /dev/null @@ -1,434 +0,0 @@ -package top.niunaijun.blackboxa.view.main - -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.net.VpnService -import android.os.Bundle -import android.util.Log -import android.view.Menu -import android.view.MenuItem -import androidx.activity.result.contract.ActivityResultContracts -import androidx.core.content.edit -import androidx.viewpager2.widget.ViewPager2 -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.input.input -import top.niunaijun.blackbox.BlackBoxCore -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.app.App -import top.niunaijun.blackboxa.app.AppManager -import top.niunaijun.blackboxa.databinding.ActivityMainBinding -import top.niunaijun.blackboxa.util.Resolution -import top.niunaijun.blackboxa.util.inflate -import top.niunaijun.blackboxa.view.apps.AppsFragment -import top.niunaijun.blackboxa.view.base.LoadingActivity -import top.niunaijun.blackboxa.view.fake.FakeManagerActivity -import top.niunaijun.blackboxa.view.list.ListActivity -import top.niunaijun.blackboxa.view.setting.SettingActivity - -class MainActivity : LoadingActivity() { - - private val viewBinding: ActivityMainBinding by inflate() - - private lateinit var mViewPagerAdapter: ViewPagerAdapter - - private val fragmentList = mutableListOf() - - private var currentUser = 0 - - companion object { - private const val TAG = "MainActivity" - private const val STORAGE_PERMISSION_REQUEST_CODE = 1001 - private const val VPN_PERMISSION_REQUEST_CODE = 1002 - - fun start(context: Context) { - val intent = Intent(context, MainActivity::class.java) - context.startActivity(intent) - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - try { - super.onCreate(savedInstanceState) - - try { - BlackBoxCore.get().onBeforeMainActivityOnCreate(this) - } catch (e: Exception) { - Log.e(TAG, "Error in onBeforeMainActivityOnCreate: ${e.message}") - } - - setContentView(viewBinding.root) - initToolbar(viewBinding.toolbarLayout.toolbar, R.string.app_name) - initViewPager() - initFab() - initToolbarSubTitle() - - - checkStoragePermission() - - - checkVpnPermission() - - try { - BlackBoxCore.get().onAfterMainActivityOnCreate(this) - } catch (e: Exception) { - Log.e(TAG, "Error in onAfterMainActivityOnCreate: ${e.message}") - } - } catch (e: Exception) { - Log.e(TAG, "Critical error in onCreate: ${e.message}") - - showErrorDialog("Failed to initialize app: ${e.message}") - } - } - - private fun checkStoragePermission() { - try { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { - - if (!android.os.Environment.isExternalStorageManager()) { - Log.w(TAG, "MANAGE_EXTERNAL_STORAGE permission not granted") - showStoragePermissionDialog() - } - } else { - - if (androidx.core.content.ContextCompat.checkSelfPermission( - this, - android.Manifest.permission.WRITE_EXTERNAL_STORAGE - ) != android.content.pm.PackageManager.PERMISSION_GRANTED || - androidx.core.content.ContextCompat.checkSelfPermission( - this, - android.Manifest.permission.READ_EXTERNAL_STORAGE - ) != android.content.pm.PackageManager.PERMISSION_GRANTED - ) { - Log.w( - TAG, - "Storage permissions not granted on Android ${android.os.Build.VERSION.SDK_INT}" - ) - requestLegacyStoragePermission() - } - } - } catch (e: Exception) { - Log.e(TAG, "Error checking storage permission: ${e.message}") - } - } - - private fun requestLegacyStoragePermission() { - try { - androidx.core.app.ActivityCompat.requestPermissions( - this, - arrayOf( - android.Manifest.permission.READ_EXTERNAL_STORAGE, - android.Manifest.permission.WRITE_EXTERNAL_STORAGE - ), - STORAGE_PERMISSION_REQUEST_CODE - ) - } catch (e: Exception) { - Log.e(TAG, "Error requesting storage permission: ${e.message}") - } - } - - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == STORAGE_PERMISSION_REQUEST_CODE) { - if (grantResults.isNotEmpty() && - grantResults.all { - it == android.content.pm.PackageManager.PERMISSION_GRANTED - } - ) { - Log.d(TAG, "Storage permissions granted") - } else { - Log.w(TAG, "Storage permissions denied") - } - } - } - - private fun showStoragePermissionDialog() { - try { - MaterialDialog(this).show { - title(text = "Storage Permission Required") - message( - text = - "This app needs 'All Files Access' permission to properly run sandboxed apps. Without this permission, some apps may not work correctly.\n\nPlease grant permission in the next screen." - ) - positiveButton(text = "Grant Permission") { openAllFilesAccessSettings() } - negativeButton(text = "Later") { Log.w(TAG, "User postponed storage permission") } - cancelable(false) - } - } catch (e: Exception) { - Log.e(TAG, "Error showing storage permission dialog: ${e.message}") - } - } - - private fun openAllFilesAccessSettings() { - try { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { - val intent = - Intent( - android.provider.Settings - .ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION - ) - intent.data = Uri.parse("package:$packageName") - storagePermissionResult.launch(intent) - } - } catch (e: Exception) { - Log.e(TAG, "Error opening storage settings: ${e.message}") - - try { - val intent = - Intent(android.provider.Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) - storagePermissionResult.launch(intent) - } catch (e2: Exception) { - Log.e(TAG, "Error opening fallback storage settings: ${e2.message}") - } - } - } - - private val storagePermissionResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - try { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { - if (android.os.Environment.isExternalStorageManager()) { - Log.d(TAG, "Storage permission granted!") - } else { - Log.w(TAG, "Storage permission still not granted") - } - } - } catch (e: Exception) { - Log.e(TAG, "Error handling storage permission result: ${e.message}") - } - } - - - private fun checkVpnPermission() { - try { - val vpnIntent = VpnService.prepare(this) - if (vpnIntent != null) { - - Log.d(TAG, "VPN permission not granted, requesting...") - vpnPermissionResult.launch(vpnIntent) - } else { - - Log.d(TAG, "VPN permission already granted") - } - } catch (e: Exception) { - Log.e(TAG, "Error checking VPN permission: ${e.message}") - } - } - - private val vpnPermissionResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - try { - if (result.resultCode == RESULT_OK) { - Log.d(TAG, "VPN permission granted!") - - } else { - Log.w(TAG, "VPN permission denied by user") - } - } catch (e: Exception) { - Log.e(TAG, "Error handling VPN permission result: ${e.message}") - } - } - - private fun showErrorDialog(message: String) { - try { - MaterialDialog(this).show { - title(text = "Error") - message(text = message) - positiveButton(text = "OK") { finish() } - } - } catch (e: Exception) { - Log.e(TAG, "Error showing error dialog: ${e.message}") - finish() - } - } - - private fun initToolbarSubTitle() { - try { - updateUserRemark(0) - - viewBinding.toolbarLayout.toolbar.getChildAt(1)?.setOnClickListener { - try { - MaterialDialog(this).show { - title(res = R.string.userRemark) - input( - hintRes = R.string.userRemark, - prefill = viewBinding.toolbarLayout.toolbar.subtitle - ) { _, input -> - try { - AppManager.mRemarkSharedPreferences.edit { - putString("Remark$currentUser", input.toString()) - viewBinding.toolbarLayout.toolbar.subtitle = input - } - } catch (e: Exception) { - Log.e(TAG, "Error saving user remark: ${e.message}") - } - } - positiveButton(res = R.string.done) - negativeButton(res = R.string.cancel) - } - } catch (e: Exception) { - Log.e(TAG, "Error showing remark dialog: ${e.message}") - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in initToolbarSubTitle: ${e.message}") - } - } - - private fun initViewPager() { - try { - val userList = BlackBoxCore.get().users - userList.forEach { fragmentList.add(AppsFragment.newInstance(it.id)) } - - currentUser = userList.firstOrNull()?.id ?: 0 - fragmentList.add(AppsFragment.newInstance(userList.size)) - - mViewPagerAdapter = ViewPagerAdapter(this) - mViewPagerAdapter.replaceData(fragmentList) - viewBinding.viewPager.adapter = mViewPagerAdapter - viewBinding.dotsIndicator.setViewPager2(viewBinding.viewPager) - viewBinding.viewPager.registerOnPageChangeCallback( - object : ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - try { - super.onPageSelected(position) - currentUser = fragmentList[position].userID - updateUserRemark(currentUser) - showFloatButton(true) - } catch (e: Exception) { - Log.e(TAG, "Error in onPageSelected: ${e.message}") - } - } - } - ) - } catch (e: Exception) { - Log.e(TAG, "Error in initViewPager: ${e.message}") - } - } - - private fun initFab() { - try { - viewBinding.fab.setOnClickListener { - try { - val userId = viewBinding.viewPager.currentItem - val intent = Intent(this, ListActivity::class.java) - intent.putExtra("userID", userId) - apkPathResult.launch(intent) - } catch (e: Exception) { - Log.e(TAG, "Error launching ListActivity: ${e.message}") - } - } - } catch (e: Exception) { - Log.e(TAG, "Error in initFab: ${e.message}") - } - } - - fun showFloatButton(show: Boolean) { - try { - val tranY: Float = Resolution.convertDpToPixel(120F, App.getContext()) - val time = 200L - if (show) { - viewBinding.fab.animate().translationY(0f).alpha(1f).setDuration(time).start() - } else { - viewBinding.fab.animate().translationY(tranY).alpha(0f).setDuration(time).start() - } - } catch (e: Exception) { - Log.e(TAG, "Error in showFloatButton: ${e.message}") - } - } - - fun scanUser() { - try { - val userList = BlackBoxCore.get().users - - if (fragmentList.size == userList.size) { - fragmentList.add(AppsFragment.newInstance(fragmentList.size)) - } else if (fragmentList.size > userList.size + 1) { - fragmentList.removeLast() - } - - mViewPagerAdapter.notifyDataSetChanged() - } catch (e: Exception) { - Log.e(TAG, "Error in scanUser: ${e.message}") - } - } - - private fun updateUserRemark(userId: Int) { - try { - var remark = - AppManager.mRemarkSharedPreferences.getString("Remark$userId", "User $userId") - if (remark.isNullOrEmpty()) { - remark = "User $userId" - } - - viewBinding.toolbarLayout.toolbar.subtitle = remark - } catch (e: Exception) { - Log.e(TAG, "Error updating user remark: ${e.message}") - viewBinding.toolbarLayout.toolbar.subtitle = "User $userId" - } - } - - private val apkPathResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - try { - if (it.resultCode == RESULT_OK) { - it.data?.let { data -> - val userId = data.getIntExtra("userID", 0) - val source = data.getStringExtra("source") - if (source != null) { - fragmentList[userId].installApk(source) - } - } - } - } catch (e: Exception) { - Log.e(TAG, "Error handling APK path result: ${e.message}") - } - } - - override fun onCreateOptionsMenu(menu: Menu?): Boolean { - try { - menuInflater.inflate(R.menu.menu_main, menu) - return true - } catch (e: Exception) { - Log.e(TAG, "Error creating options menu: ${e.message}") - return false - } - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - try { - when (item.itemId) { - R.id.main_git -> { - val intent = - Intent( - Intent.ACTION_VIEW, - Uri.parse("https://github.com/ALEX5402/NewBlackbox") - ) - startActivity(intent) - } - R.id.main_setting -> { - SettingActivity.start(this) - } - R.id.main_tg -> { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://t.me/newblackboxa")) - startActivity(intent) - } - R.id.fake_location -> { - - val intent = Intent(this, FakeManagerActivity::class.java) - intent.putExtra("userID", 0) - startActivity(intent) - } - } - - return true - } catch (e: Exception) { - Log.e(TAG, "Error handling menu item selection: ${e.message}") - return false - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/main/ShortcutActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/main/ShortcutActivity.kt deleted file mode 100644 index f72655a..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/main/ShortcutActivity.kt +++ /dev/null @@ -1,23 +0,0 @@ -package top.niunaijun.blackboxa.view.main - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.lifecycleScope -import kotlinx.coroutines.launch -import top.niunaijun.blackbox.BlackBoxCore - - -class ShortcutActivity:AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - val pkg = intent.getStringExtra("pkg") - val userID = intent.getIntExtra("userId",0) - - lifecycleScope.launch { - BlackBoxCore.get().launchApk(pkg,userID) - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/main/ViewPagerAdapter.kt b/app/src/main/java/top/niunaijun/blackboxa/view/main/ViewPagerAdapter.kt deleted file mode 100644 index 1c27627..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/main/ViewPagerAdapter.kt +++ /dev/null @@ -1,27 +0,0 @@ -package top.niunaijun.blackboxa.view.main - -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment -import androidx.viewpager2.adapter.FragmentStateAdapter -import top.niunaijun.blackboxa.view.apps.AppsFragment - - - -class ViewPagerAdapter(appCompatActivity: AppCompatActivity) : FragmentStateAdapter(appCompatActivity) { - - private var fragmentList = mutableListOf() - - fun replaceData(list: MutableList){ - this.fragmentList = list - notifyDataSetChanged() - } - - override fun getItemCount(): Int { - return fragmentList.size - } - - override fun createFragment(position: Int): Fragment { - return fragmentList[position] - } - -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/main/WelcomeActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/main/WelcomeActivity.kt deleted file mode 100644 index 3f3586d..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/main/WelcomeActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package top.niunaijun.blackboxa.view.main - -import android.content.Intent -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.ViewModelProvider -import top.niunaijun.blackbox.BlackBoxCore -import top.niunaijun.blackboxa.util.InjectionUtil -import top.niunaijun.blackboxa.view.list.ListViewModel -import top.niunaijun.blackboxa.fridabox.FridaBoxActivity - -class WelcomeActivity : AppCompatActivity() { - - override fun onNewIntent(intent: Intent?) { - super.onNewIntent(intent) - jump() - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - previewInstalledAppList() - jump() - } - - private fun jump() { - startActivity(Intent(this, FridaBoxActivity::class.java)) - finish() - } - - private fun previewInstalledAppList(){ - val viewModel = ViewModelProvider(this,InjectionUtil.getListFactory()).get(ListViewModel::class.java) - viewModel.previewInstalledList() - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingActivity.kt b/app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingActivity.kt deleted file mode 100644 index 88ee833..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingActivity.kt +++ /dev/null @@ -1,32 +0,0 @@ -package top.niunaijun.blackboxa.view.setting - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.databinding.ActivitySettingBinding -import top.niunaijun.blackboxa.util.inflate -import top.niunaijun.blackboxa.view.base.BaseActivity - -class SettingActivity : BaseActivity() { - - private val viewBinding: ActivitySettingBinding by inflate() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(viewBinding.root) - initToolbar(viewBinding.toolbarLayout.toolbar, R.string.setting, true) - supportFragmentManager.beginTransaction() - .replace(R.id.fragment, SettingFragment()) - .commit() - } - - companion object{ - fun start(context: Context){ - val intent = Intent(context,SettingActivity::class.java) - intent.action = Intent.ACTION_OPEN_DOCUMENT - context.startActivity(intent) - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingFragment.kt b/app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingFragment.kt deleted file mode 100644 index c0a2dc0..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/view/setting/SettingFragment.kt +++ /dev/null @@ -1,111 +0,0 @@ -package top.niunaijun.blackboxa.view.setting - -import android.os.Bundle -import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat -import top.niunaijun.blackbox.BlackBoxCore -import top.niunaijun.blackboxa.R -import top.niunaijun.blackboxa.app.AppManager -import top.niunaijun.blackboxa.util.toast -import top.niunaijun.blackboxa.view.gms.GmsManagerActivity - -class SettingFragment : PreferenceFragmentCompat() { - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.setting, rootKey) - - initGms() - - invalidHideState { - val rootHidePreference: Preference = (findPreference("root_hide")!!) - val hideRoot = AppManager.mBlackBoxLoader.hideRoot() - rootHidePreference.setDefaultValue(hideRoot) - rootHidePreference - } - - invalidHideState { - val daemonPreference: Preference = (findPreference("daemon_enable")!!) - val mDaemonEnable = AppManager.mBlackBoxLoader.daemonEnable() - daemonPreference.setDefaultValue(mDaemonEnable) - daemonPreference - } - - invalidHideState { - val vpnPreference: Preference = (findPreference("use_vpn_network")!!) - val mUseVpnNetwork = AppManager.mBlackBoxLoader.useVpnNetwork() - vpnPreference.setDefaultValue(mUseVpnNetwork) - vpnPreference - } - - invalidHideState { - val disableFlagSecurePreference: Preference = (findPreference("disable_flag_secure")!!) - val mDisableFlagSecure = AppManager.mBlackBoxLoader.disableFlagSecure() - disableFlagSecurePreference.setDefaultValue(mDisableFlagSecure) - disableFlagSecurePreference - } - - initSendLogs() - } - - private fun initGms() { - val gmsManagerPreference: Preference = (findPreference("gms_manager")!!) - - if (BlackBoxCore.get().isSupportGms) { - - gmsManagerPreference.setOnPreferenceClickListener { - GmsManagerActivity.start(requireContext()) - true - } - } else { - gmsManagerPreference.summary = getString(R.string.no_gms) - gmsManagerPreference.isEnabled = false - } - } - - private fun invalidHideState(block: () -> Preference) { - val pref = block() - pref.setOnPreferenceChangeListener { preference, newValue -> - val tmpHide = (newValue == true) - when (preference.key) { - "root_hide" -> { - - AppManager.mBlackBoxLoader.invalidHideRoot(tmpHide) - } - "daemon_enable" -> { - AppManager.mBlackBoxLoader.invalidDaemonEnable(tmpHide) - } - "use_vpn_network" -> { - AppManager.mBlackBoxLoader.invalidUseVpnNetwork(tmpHide) - } - "disable_flag_secure" -> { - AppManager.mBlackBoxLoader.invalidDisableFlagSecure(tmpHide) - } - } - - toast(R.string.restart_module) - return@setOnPreferenceChangeListener true - } - } - private fun initSendLogs() { - val sendLogsPreference: Preference? = findPreference("send_logs") - sendLogsPreference?.setOnPreferenceClickListener { - it.isEnabled = false - BlackBoxCore.get() - .sendLogs( - "Manual Log Upload from Settings", - true, - object : BlackBoxCore.LogSendListener { - override fun onSuccess() { - activity?.runOnUiThread { sendLogsPreference.isEnabled = true } - } - - override fun onFailure(error: String?) { - activity?.runOnUiThread { sendLogsPreference.isEnabled = true } - } - } - ) - toast("Sending logs... (Check notifications for status)") - true - } - } -} diff --git a/app/src/main/java/top/niunaijun/blackboxa/widget/EnFloatView.kt b/app/src/main/java/top/niunaijun/blackboxa/widget/EnFloatView.kt deleted file mode 100644 index 60849d3..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/widget/EnFloatView.kt +++ /dev/null @@ -1,52 +0,0 @@ -package top.niunaijun.blackboxa.widget - -import android.content.Context -import android.view.MotionEvent -import com.imuxuan.floatingview.FloatingMagnetView -import top.niunaijun.blackboxa.R - - -class EnFloatView(mContext: Context) : FloatingMagnetView(mContext) { - - private val TAG = "RockerManager" - - private var rockerView: RockerView? = null - - private var mListener: LocationListener? = null - - init { - inflate(mContext, R.layout.view_float_rocker, this) - initRockerView() - } - - private fun initRockerView() { - - rockerView = findViewById(R.id.rocker) - rockerView?.setListener { type, currentAngle, currentDistance -> - if (type == RockerView.EVENT_CLOCK && currentAngle != -1F) { - val realAngle = currentAngle - val realDistance = currentDistance * 0.001F - - - mListener?.invoke(realAngle, realDistance) - - } - } - } - - override fun onTouchEvent(event: MotionEvent?): Boolean { - if (event?.action == MotionEvent.ACTION_DOWN) { - rockerView?.setCanMove(false) - } else if (event?.action == MotionEvent.ACTION_UP) { - rockerView?.setCanMove(true) - } - return super.onTouchEvent(event) - } - - fun setListener(listener: LocationListener) { - this.mListener = listener - } - -} - -typealias LocationListener = (angle: Float, distance: Float) -> Unit \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackboxa/widget/RockerView.java b/app/src/main/java/top/niunaijun/blackboxa/widget/RockerView.java deleted file mode 100644 index 1c37131..0000000 --- a/app/src/main/java/top/niunaijun/blackboxa/widget/RockerView.java +++ /dev/null @@ -1,441 +0,0 @@ -package top.niunaijun.blackboxa.widget; - -import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.PixelFormat; -import android.graphics.Point; -import android.graphics.PorterDuff; -import android.graphics.Rect; -import android.util.AttributeSet; -import android.util.Log; -import android.view.MotionEvent; -import android.view.SurfaceHolder; -import android.view.SurfaceView; -import android.view.View; - -import androidx.annotation.NonNull; - -import top.niunaijun.blackboxa.util.MathUtil; - - - -public class RockerView extends SurfaceView implements Runnable, SurfaceHolder.Callback { - - private static final int DEFAULT_AREA_RADIUS = 100; - private static final int DEFAULT_ROCKER_RADIUS = 35; - - private static final int DEFAULT_AREA_COLOR = Color.argb(128,0,0,0); - private static final int DEFAULT_ROCKER_COLOR = Color.argb(128,0,0,0); - - private static final int DEFAULT_REFRESH_CYCLE = 30; - private static final int DEFAULT_CALLBACK_CYCLE = 300; - - private SurfaceHolder mHolder; - private static Thread mDrawThread; - private static Thread mCallbackThread; - private static boolean mDrawOk = true; - private static boolean mCallbackOk = true; - - private Paint mPaint; - - - private Point mAreaPosition; - - - private Point mRockerPosition; - - - private int mAreaRadius = -1; - private int mRockerRadius = -1; - - private int mAreaColor; - private int mRockerColor; - private Bitmap mAreaBitmap; - private Bitmap mRockerBitmap; - - private boolean canMove = true; - - - private RockerListener mListener; - public static final int EVENT_ACTION = 1; - public static final int EVENT_CLOCK = 2; - - private int mRefreshCycle = DEFAULT_REFRESH_CYCLE; - private int mCallbackCycle = DEFAULT_CALLBACK_CYCLE; - - - - - public RockerView(Context context) { - this(context, null); - } - - public RockerView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public RockerView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - - initAttrs(context, attrs); - - - setPaint(); - - if (isInEditMode()) { - return; - } - - - configSurfaceView(); - - - configSurfaceHolder(); - } - - private void initAttrs(Context context, AttributeSet attrs) { - mAreaColor = DEFAULT_AREA_COLOR; - mRockerColor = DEFAULT_ROCKER_COLOR; - mAreaRadius = DEFAULT_AREA_RADIUS; - mRockerRadius = DEFAULT_ROCKER_RADIUS; - - } - - private void setPaint() { - mPaint = new Paint(); - mPaint.setAntiAlias(true); - } - - private void configSurfaceView() { - setKeepScreenOn(true); - setFocusable(true); - setFocusableInTouchMode(true); - setZOrderOnTop(true); - } - - private void configSurfaceHolder() { - mHolder = getHolder(); - mHolder.addCallback(this); - mHolder.setFormat(PixelFormat.TRANSPARENT); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - int measureWidth = 0, measureHeight = 0; - int defaultWidth = (mAreaRadius + mRockerRadius) * 2; - int defalutHeight = defaultWidth; - - int widthsize = MeasureSpec.getSize(widthMeasureSpec); - int widthmode = MeasureSpec.getMode(widthMeasureSpec); - - int heightsize = MeasureSpec.getSize(heightMeasureSpec); - int heightmode = MeasureSpec.getMode(heightMeasureSpec); - - if (widthmode == MeasureSpec.AT_MOST || widthmode == MeasureSpec.UNSPECIFIED || widthsize < 0) { - measureWidth = defaultWidth; - } else { - measureWidth = widthsize; - } - - - if (heightmode == MeasureSpec.AT_MOST || heightmode == MeasureSpec.UNSPECIFIED || heightsize < 0) { - measureHeight = defalutHeight; - } else { - measureHeight = heightsize; - } - - setMeasuredDimension(measureWidth, measureHeight); - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - mAreaPosition = new Point(w / 2, h / 2); - mRockerPosition = new Point(mAreaPosition); - - - int tempRadius = Math.min(w - getPaddingLeft() - getPaddingRight(), h - getPaddingTop() - getPaddingBottom()); - tempRadius /= 2; - if (mAreaRadius == -1) - mAreaRadius = (int) (tempRadius * 0.75); - if (mRockerRadius == -1) - mRockerRadius = (int) (tempRadius * 0.25); - } - - @Override - public void surfaceCreated(SurfaceHolder holder) { - try { - mDrawThread = new Thread(this); - mDrawThread.start(); - - mCallbackThread = new Thread(() -> { - while (mCallbackOk) { - - - listenerCallback(); - - try { - Thread.sleep(mCallbackCycle); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - mCallbackThread.start(); - - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - } - - @Override - public void surfaceDestroyed(SurfaceHolder holder) { - mDrawOk = false; - mCallbackOk = false; - } - - @Override - protected void onVisibilityChanged(@NonNull View changedView, int visibility) { - super.onVisibilityChanged(changedView, visibility); - if (visibility == VISIBLE) { - mDrawOk = true; - mCallbackOk = true; - } else { - mDrawOk = false; - mCallbackOk = false; - } - } - - - - @Override - public boolean onTouchEvent(MotionEvent event) { - try { - int len = MathUtil.getDistance(mAreaPosition.x, mAreaPosition.y, event.getX(), event.getY()); - - if (event.getAction() == MotionEvent.ACTION_DOWN) { - - if (len > mAreaRadius) { - return true; - } - } - - if (event.getAction() == MotionEvent.ACTION_MOVE) { - if (len <= mAreaRadius) { - - mRockerPosition.set((int) event.getX(), (int) event.getY()); - - } else { - - mRockerPosition = MathUtil.getPointByCutLength(mAreaPosition, - new Point((int) event.getX(), (int) event.getY()), mAreaRadius); - } - if (mListener != null) { - float radian = MathUtil.getRadian(mAreaPosition, new Point((int) event.getX(), (int) event.getY())); - float angle = RockerView.this.getAngleConvert(radian); - float distance = MathUtil.getDistance(mAreaPosition.x, mAreaPosition.y, event.getX(), event.getY()); - mListener.callback(EVENT_ACTION, angle, distance); - } - } - - if (event.getAction() == MotionEvent.ACTION_UP) { - mRockerPosition = new Point(mAreaPosition); - if (mListener != null) { - mListener.callback(EVENT_ACTION, -1, 0); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - - - - @Override - public void run() { - if (isInEditMode()) { - return; - } - - Canvas canvas = null; - - while (mDrawOk) { - boolean canMove = this.canMove; - try { - if (canMove) { - canvas = mHolder.lockCanvas(); - canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); - - drawArea(canvas); - drawRocker(canvas); - } - Thread.sleep(mRefreshCycle); - - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (canvas != null && canMove) { - mHolder.unlockCanvasAndPost(canvas); - } - } - } - } - - private void drawArea(Canvas canvas) { - - if (null != mAreaBitmap) { - mPaint.setColor(Color.BLACK); - Rect src = new Rect(0, 0, mAreaBitmap.getWidth(), mAreaBitmap.getHeight()); - Rect dst = new Rect( - mAreaPosition.x - mAreaRadius, - mAreaPosition.y - mAreaRadius, - mAreaPosition.x + mAreaRadius, - mAreaPosition.y + mAreaRadius); - canvas.drawBitmap(mAreaBitmap, src, dst, mPaint); - } else { - mPaint.setColor(mAreaColor); - canvas.drawCircle(mAreaPosition.x, mAreaPosition.y, mAreaRadius, mPaint); - } - } - - private void drawRocker(Canvas canvas) { - if (null != mRockerBitmap) { - mPaint.setColor(Color.BLACK); - Rect src = new Rect(0, 0, mRockerBitmap.getWidth(), mRockerBitmap.getHeight()); - Rect dst = new Rect( - mRockerPosition.x - mRockerRadius, - mRockerPosition.y - mRockerRadius, - mRockerPosition.x + mRockerRadius, - mRockerPosition.y + mRockerRadius); - canvas.drawBitmap(mRockerBitmap, src, dst, mPaint); - } else { - mPaint.setColor(mRockerColor); - canvas.drawCircle(mRockerPosition.x, mRockerPosition.y, mRockerRadius, mPaint); - } - } - - private void listenerCallback() { - if (mListener != null) { - if (mRockerPosition.x == mAreaPosition.x && mRockerPosition.y == mAreaPosition.y) { - mListener.callback(EVENT_CLOCK, -1, 0); - } else { - float radian = MathUtil.getRadian(mAreaPosition, new Point(mRockerPosition.x, mRockerPosition.y)); - float angle = RockerView.this.getAngleConvert(radian); - float distance = MathUtil.getDistance(mAreaPosition.x, mAreaPosition.y, mRockerPosition.x, mRockerPosition.y); - mListener.callback(EVENT_CLOCK, angle, distance); - } - } - } - - - private float getAngleConvert(float radian) { - return 90 + Math.round(radian / Math.PI * 180); - } - - - @Override - protected void onDraw(Canvas canvas) { - if (isInEditMode()) { - canvas.drawColor(Color.WHITE); - drawArea(canvas); - drawRocker(canvas); - } - } - - - - public void setCanMove(boolean isMove) { - this.canMove = isMove; - } - - public int getAreaRadius() { - return mAreaRadius; - } - - public void setAreaRadius(int areaRadius) { - mAreaRadius = areaRadius; - } - - public int getRockerRadius() { - return mRockerRadius; - } - - public void setRockerRadius(int rockerRadius) { - mRockerRadius = rockerRadius; - } - - public Bitmap getAreaBitmap() { - return mAreaBitmap; - } - - public void setAreaBitmap(Bitmap areaBitmap) { - mAreaBitmap = areaBitmap; - } - - public Bitmap getRockerBitmap() { - return mRockerBitmap; - } - - public void setRockerBitmap(Bitmap rockerBitmap) { - mRockerBitmap = rockerBitmap; - } - - public int getRefreshCycle() { - return mRefreshCycle; - } - - public void setRefreshCycle(int refreshCycle) { - mRefreshCycle = refreshCycle; - } - - public int getCallbackCycle() { - return mCallbackCycle; - } - - public void setCallbackCycle(int callbackCycle) { - mCallbackCycle = callbackCycle; - } - - public int getAreaColor() { - return mAreaColor; - } - - public void setAreaColor(int areaColor) { - mAreaColor = areaColor; - mAreaBitmap = null; - } - - public int getRockerColor() { - return mRockerColor; - } - - public void setRockerColor(int rockerColor) { - mRockerColor = rockerColor; - mRockerBitmap = null; - } - - public void setListener(@NonNull RockerListener listener) { - mListener = listener; - } - - - - - public interface RockerListener { - - - void callback(int eventType, float currentAngle, float currentDistance); - } - -} \ No newline at end of file diff --git a/app/src/main/res/drawable-anydpi/ic_add.xml b/app/src/main/res/drawable-anydpi/ic_add.xml deleted file mode 100644 index 672478e..0000000 --- a/app/src/main/res/drawable-anydpi/ic_add.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_location_change.xml b/app/src/main/res/drawable-anydpi/ic_location_change.xml deleted file mode 100644 index f9217b9..0000000 --- a/app/src/main/res/drawable-anydpi/ic_location_change.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-anydpi/ic_search.xml b/app/src/main/res/drawable-anydpi/ic_search.xml deleted file mode 100644 index 44dcb4a..0000000 --- a/app/src/main/res/drawable-anydpi/ic_search.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/drawable-hdpi/ic_add.png b/app/src/main/res/drawable-hdpi/ic_add.png deleted file mode 100644 index f8c47ab9a70e53f197e211519caa3ea5801d6972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?M0>h8hE&{od+i`6gCY-W zV6~V3%ailoXlhk_P}0y)F=GC|t$q86Q_EajN~X>9oZZ*S9?(9;kd=i)U_txzds&rC zPkWy~y>|QltUA_Dr71P34GfH2OrO3^_IJ6s>dy!3YQ8uBT^JY`7(8A5T-G@yGywpu Ca5oJA diff --git a/app/src/main/res/drawable-hdpi/ic_location_change.png b/app/src/main/res/drawable-hdpi/ic_location_change.png deleted file mode 100644 index 096c1d9fcb86084d7f0b59dbe712eeb77f8c3e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 500 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@??)G$X45^5_JIy!fumMkN zHOID`m)ndxH$UL{!gu$Q?(HIhyl%S72@}JGO|C(>f-Ti*o zJJ!TCzpe^8Swtzxb0l9~-{-5El3JBD>zS$Qkr|d-cWd{wHv1>}Y&aNpJ-penev3lB z)Q@Q!+P1!0&++U-B=gaP_sgs=TL+#yvr@K+|Lbm!XD>`1{K;sPzhcHXH@|HAyCvH; zFF3Q|_evL$8(PWTGZ($vTDDwA|CQ$b18;)97C)SMX!|SmL~9F=m77kRu+?yQ{|skZ zepGi&+3#O&>TR#w182`=N%j2NY;bt5_p%-3B1Ny->e)3ei7zTVe@G|F_~Grwi01g| z3%zyJLe|y`ZAwa&40Q_AnSH}p@aX&vyQlROc6sw<{bm)(Y`pqo(XXHfmko{Qv>Xcl z`TDpV$J(pEPJH*D@!70xt*vYW`vujIJKp=sKdk*VncN$K7W%<+l~B@<_YM zuIpIdendUZ#IWR}<%_l2i96X-y(E5D_Dg6h>&-Mu6S;ENylUNsw8HaG8XimCu{Bkj zlK$J4mJh`hKCF@W-u@?DtWp%hE&{oJ1tkR*?_0b zu%S_EMT6vw2E_!90|!_d8Wb0pIULYp@L#j{blFas_}t5Vw@u4`vU2k0Pcn0zs2lAx z`}t0jI>UPn_j^vqH$-$S|Co7{ok1t~K#8=1cY=|c&;AdAtzKz~?w|goiux|>X%*If zA9l>NQRt3sbK)#!!=@EWlcugJ@0k3=UFCYl<0VQ9uJFGr((M1CoqaQ*itqb5ufFw% z>N!Iew#;?kAOi9^#3ywX%vNgHyk;&~;?(~UeJ54xw z=36b9Zt~NkTi-9^fi;7_;@;;)9$D>Qla*|*9BUBTQ1qtph5yVIt2SPlbV0pq#l^!b zrc1B(mRWJ2R?9h6BX7kkpMcmxG3!>No12zyF)ygjd>zid=rIEW1B0ilpUXO@geCwV C0+ne1 diff --git a/app/src/main/res/drawable-mdpi/ic_add.png b/app/src/main/res/drawable-mdpi/ic_add.png deleted file mode 100644 index 3b9883f334dcde636a982816f80de379a19b2307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJobUa-gLn>}1CrGd^W{~{z z|Nnm;j{YcvEXI#)6T8^^Sr<>V$zpt~Bf;t{%)sEteB|oO#`fh53=9mOu6{1-oD!M< D_M;r| diff --git a/app/src/main/res/drawable-mdpi/ic_location_change.png b/app/src/main/res/drawable-mdpi/ic_location_change.png deleted file mode 100644 index 4cf546ac00483db3423e98a5e313f8445cd7e5f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoc|2VlLn`9VhI;ZHGT?bL z(>VNGt;6MgO#cqZ@3>?>MSK6z;G0K#PP9pNPE=~`vGr5)d%3ILiQ{4C!PmPNdNK;W zIbOJj?{L9(rWwh+GRMW8S^Shrj4$4B;7PKy=T!0dw1|oSXYEI&8OgkJ#G<;oD+;$h zJ7CCGkQG`fxS6%{%+Unb38(L{tE@1O4zf;HxOP)?f5mOiKdE}`Pg4B#cF!=?c(3aC zJ})=%**5l+=AS_>rHfotH(6Onniy|i_*0cVH(1g;ceavy@#9=BliCc1JzLzHk6iIQ zU|DE$PWgCEtA5jB|H~!c#QQC;oe?_{X5J>2`FZCzj`#L+wzh_rgk@h6kK)!o@Ot;c e%EtH)Oz*pwJ=fuq`N_b*z~JfX=d#Wzp$P!Z4Td}b diff --git a/app/src/main/res/drawable-mdpi/ic_search.png b/app/src/main/res/drawable-mdpi/ic_search.png deleted file mode 100644 index aa59a7d9076171c2f03967d9beb15a4e24d91545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoCV09yhE&{2PLN=I()9oT ze`)4ITY>lNkBkGPj+ifNd&nE$T==jmOL87tvEdc>Op!K4PA3T6iWgWK#Xt}VaHz`(%Z>FVdQ&MBb@ E01zxoRsaA1 diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 912980c..0000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/ic_add.png b/app/src/main/res/drawable-xhdpi/ic_add.png deleted file mode 100644 index a8e615a3892c5b235cabf19536c0fb2c48437889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F#^L{e{;s8sXSkIDDb&9aire6X7{?~-_$ji9rwysPENR4#VvVqqGtHb z$xlwGRjNBiF8cIFGOATu=k}9sw%>88=O0A( znpgN=!zSCxqUOtoTm5gE;C8#{^mJFlBeO%QpevapN?~ju)Upp!d}DR zx0sUH_Rh|u{TB~7PAl8k)sUmu@S|Dh_C&ePHD$B4W1eZ%ESkvwM3Q&g#KlRoBX?!4 z_uT2ny(c1c`d>$3``V6xuuU3lI|^l=t~7Jcl6UFz+Hq#Sg?(npKUPa0<#kUcZ&r!i z<~v{JliJ}_tskMjmsfU4ls;N}u0~*5ugp~5L#%~CoacWm%)OnynEn5|CFyHl#;%C9 z`MGY!XFI2ArKy{~{}FgK{~zzR5FSg}$=?HwN-lgjBIi8G({4$TlXS59_9(?I{#%xn qKN8e`n$FI402<>T8SfYf-QO3S@$%kL{}cuW1_n=8KbLh*2~7aID=m2d diff --git a/app/src/main/res/drawable-xhdpi/ic_search.png b/app/src/main/res/drawable-xhdpi/ic_search.png deleted file mode 100644 index 9c758db710285a61270eb3f4b0eee42a9400bcab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F{H^Q_I?q04KahgOY9dtStqjNRw)l#^F@_yxvz6;ax|n9 z4)0+2o+JM{TgA?zNzLe6d3)3eea<6)BfNyfJ0tC*c>|pqtQ1XdPG~P*S}pdcZPuTz z2^S1Y-+t?M+ZV5CuHzP`GEH7BNh8qemlrR)i$+(mUGz1k)i>=m6VA;wOmR&=^=YQj z8Ow=NC#LhC`M6?_;qoufTGUzpT*-d>d0$Y2nug-p*+0%6*Es5`wp+b1g(ok9Q=xom z+NuH{eF z3VT%Gf2ME2w_RpWkEI;Rjq!7F^FF8)!P1=|__Zs;ok3}l?x%SjW+#m$c-*3YFfG)+ W_cbRtdo=?C1B0ilpUXO@geCw`ikABT diff --git a/app/src/main/res/drawable-xxhdpi/ic_add.png b/app/src/main/res/drawable-xxhdpi/ic_add.png deleted file mode 100644 index bd150a3fed7c4664d369a511e2f1e43c59297805..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D4dvOQfKLn>~)y}FT?!GMF= z@!R~~xpP=OrYkvppTzz^YL$xTBo)s|Uv{b3_VOq=G%zqSv2X|=F=jX9wf{APNSv6> kjw%UJJ^^gTrFDFMCtjbwo_EBVfq{X+)78&qol`;+0Ou1ega7~l diff --git a/app/src/main/res/drawable-xxhdpi/ic_location_change.png b/app/src/main/res/drawable-xxhdpi/ic_location_change.png deleted file mode 100644 index 052953fd228e96706653018c1c8a290cb731343f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 999 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D5|*Lk`)hE&A8jke9dZ6I>y z&d%&>RlEup9X6+}y=?wl_QJUGAS1%Mp^y@!)G@?o&A)4+2nnWkAF?OL}%@@LOann zP5fmO#eaW4=H~Oj_n5_pAG42stoV~xeklKVlDJ@UQqH`5V~2+m=__a`$3%N2)pv(MW1?!*g+9;ddJOk-c@ zWBByyzrTl)TN-3e?)|hw&q=s{B5U%QiLS2MXC<6JniGp+RCm>daGppqfuSj;FfQK&YE@CHOkMdE^U{*P$qco(8lhI zTHkFw&wp{M$a>bBEY3Lhpy5gTXF0DG9i(5smE8I`D|X?N$5)x9BDYJ3tbZ-_bm5h{ zx<@xIG4!s9-g3OUk3pCrl)5<2F@YekfI z%&BK*Z#(gGX;W$YiJy3ccWYmg+IHvJ!ix*5<7QtE$QNN=(J#gL<6L2Fgs91>>bT7Z zuggYoAJ=QU7(e6hqZ>gCxog7pUbQBRFAm++xM4@$v&+(dE52rYnf~qQTczCZ3A{4W zytigfTP?I+Tc_n(scZVJSu5Wz+V=bXI+N&frX`Q9?$1}hYinDxo8z`s`t9R)Ze3)W z{C=KXZ_($emzPYiyl}?y(%=YXNy=AJfr7%yd$B^^Lq9^KH zlV1xLshDT*MD$qNy2)(+pCSG$PyEl}PqSBtJv6RqmpD?ium5KMR5lUk5+1QVVut10 znry@}mItq|;7Rg3bGE9h^<|ye0^4aW%FhnO*!)kMaB9U_>BAYj~)o%OJ=*?^}t z@&I>9BhLYb)P@vZeg@_TjHejn8rCo}m#DwGvvRLYcyfD!^1GRKJrC+=G;LY!oY`fwvKfe-rV9L3DX$DDeKkof>BH@jfLGk8xM%RTQ z`7CL9TVGr#ZvJ0zO}*)J_FfN;s>r-z}}l{7|KAZ}njL6Rs1>+Jrez zdd;>~o9M5cCKkB$qiV|36U(DK?#OOGHC1&>9FOTy)_|w8ZD;=Zofdd>@0Qtf5AS}+ zbRv9j-poJuBf>Ygrn=5Nxqp2VUktqozjU9!B6!v#+9M!geFfjE!X-~%y<8LbvMz^vx9*aTs?W*G z?(Mmum+iA7w=nF4NBb3(rp3zJVyZOTr6$cYus$QH#B_BnOLEP73&DjtuNR26#<@OB zPv@*%l0EI+bm^zN|CuaLW#pW|fP{*icg>dyU=Vts1bpQYW diff --git a/app/src/main/res/drawable/ic_empty.xml b/app/src/main/res/drawable/ic_empty.xml deleted file mode 100644 index fbfea1c..0000000 --- a/app/src/main/res/drawable/ic_empty.xml +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 6ae213e..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/splash.xml b/app/src/main/res/drawable/splash.xml deleted file mode 100644 index 3dd706a..0000000 --- a/app/src/main/res/drawable/splash.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_gms.xml b/app/src/main/res/layout/activity_gms.xml deleted file mode 100644 index 01de618..0000000 --- a/app/src/main/res/layout/activity_gms.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_list.xml b/app/src/main/res/layout/activity_list.xml deleted file mode 100644 index 85d8c5d..0000000 --- a/app/src/main/res/layout/activity_list.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index becefba..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_osmdroid.xml b/app/src/main/res/layout/activity_osmdroid.xml deleted file mode 100644 index 38a580f..0000000 --- a/app/src/main/res/layout/activity_osmdroid.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml deleted file mode 100644 index cc62e10..0000000 --- a/app/src/main/res/layout/activity_setting.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_xp.xml b/app/src/main/res/layout/activity_xp.xml deleted file mode 100644 index 4dc107e..0000000 --- a/app/src/main/res/layout/activity_xp.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/base_empty.xml b/app/src/main/res/layout/base_empty.xml deleted file mode 100644 index 43b6d67..0000000 --- a/app/src/main/res/layout/base_empty.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_apps.xml b/app/src/main/res/layout/fragment_apps.xml deleted file mode 100644 index efbd9c9..0000000 --- a/app/src/main/res/layout/fragment_apps.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_app.xml b/app/src/main/res/layout/item_app.xml deleted file mode 100644 index ce8133c..0000000 --- a/app/src/main/res/layout/item_app.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_fake.xml b/app/src/main/res/layout/item_fake.xml deleted file mode 100644 index d275319..0000000 --- a/app/src/main/res/layout/item_fake.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_gms.xml b/app/src/main/res/layout/item_gms.xml deleted file mode 100644 index 8cfbbce..0000000 --- a/app/src/main/res/layout/item_gms.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_package.xml b/app/src/main/res/layout/item_package.xml deleted file mode 100644 index 4588328..0000000 --- a/app/src/main/res/layout/item_package.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_viewpager.xml b/app/src/main/res/layout/item_viewpager.xml deleted file mode 100644 index 5787446..0000000 --- a/app/src/main/res/layout/item_viewpager.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_xp.xml b/app/src/main/res/layout/item_xp.xml deleted file mode 100644 index 83b901e..0000000 --- a/app/src/main/res/layout/item_xp.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_float_rocker.xml b/app/src/main/res/layout/view_float_rocker.xml deleted file mode 100644 index 87b0e4c..0000000 --- a/app/src/main/res/layout/view_float_rocker.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_switch.xml b/app/src/main/res/layout/view_switch.xml deleted file mode 100644 index 13ee034..0000000 --- a/app/src/main/res/layout/view_switch.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_toolbar.xml b/app/src/main/res/layout/view_toolbar.xml deleted file mode 100644 index e4461fa..0000000 --- a/app/src/main/res/layout/view_toolbar.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - diff --git a/app/src/main/res/menu/app_menu.xml b/app/src/main/res/menu/app_menu.xml deleted file mode 100644 index 72c1c2f..0000000 --- a/app/src/main/res/menu/app_menu.xml +++ /dev/null @@ -1,10 +0,0 @@ - -

- - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_list.xml b/app/src/main/res/menu/menu_list.xml deleted file mode 100644 index 8943922..0000000 --- a/app/src/main/res/menu/menu_list.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml deleted file mode 100644 index ffcfeff..0000000 --- a/app/src/main/res/menu/menu_main.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_search.xml b/app/src/main/res/menu/menu_search.xml deleted file mode 100644 index fe3a141..0000000 --- a/app/src/main/res/menu/menu_search.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index e07b09b5172be5d8de765c647c117dd97280969f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3200 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 BL!1Br diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_beta.png b/app/src/main/res/mipmap-hdpi/ic_launcher_beta.png deleted file mode 100644 index 322e2d189e955aec6f34f98f6d05ac1e78714186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3847 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 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index b18fecfa4d8ce767df9a14951ab3ba9a838b0d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3934 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 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round_beta.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round_beta.png deleted file mode 100644 index eda9ed5547ed92f910de973b3257966628a71240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4731 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D4dSkfJR9T^xl_H+M9WMyDr zP)PO&@?~JCQe$9fXklRZ#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7}%1$-CY>| zgW!U_%O^812!8Q&aSW-rb$3p6h4A&M2kMo*H>paVW;@QeaEki|+s?WAd;&L0=1yR_ z-4ebki0R=(HCCP(w9VJEK#D6w zUV!O{!+~QH9&i*r$Qam|H=d@Ag_dluU@9ZpozP$LH?e{yz$_4C4lQte<{LZM{ zkfXpX!LfuXZ2`Xm!*xdK3p_QPHGFdz>{#t4tGv86S8DTx(+&)m8crT?N#MD#z5VVs z=F$Up4ov5~Cw=K>J(0BWg-yUS#-9!ArXPFH#>Xsrz|V8iy8p4vn<8}77H~u`^1M>j zShz$`gY}xnq!Qh*xyM*098J2&RNNTeQ2owehQmh2e1`v;oWJBX@P2T-;oIzGf=($9bQ5N(c&@!zA|R^Jee_dqg1W)4 z*=hm{=ddmFob+Y-ySNoE-?55ytMdPtQ7>b$;7D|-Sa)hxxqeSXvyI`|?+v;Q4`6ezWRo3(!vETNLWinHsh=26jYmXmFwSIM+ck@;9l&@F*yYFP|nW*yeaR9Fq z)2Abr>^qw`PYqigvElN|J;falYz&mHd{SA`*}3S4)Q2~7B^D}hJbCtPQ_a!t9@*Lc zkFUC|i`!eYoI#b@*(LCf?3qmVs|x2oE$p*?FonJ5b@Z7zmfh@f6%396ZOW&O>i@nr z+?IFq)X{F7;gl*NSN=jXn*-F(Tg_iEPN)p8%QCaC*X&5}rC;$>r=tY&|9N8#g+{{GxKncHvQ z+@CN1e*b?t^Za`~sn@SJDo#={ZR%(1T$I81?D!)-sou8wbElJkeiD81>{(mMp#>I? z0_rsGSgsB8o~AKr`gHf|Xlq_x-i@F9s}`Kh+A8;n>64CIefK1>7ZX!bQZ}TV4C3NG zo@me#_homCURHK?O?e-6fcJ3;b zH?`5wnsq+5{I2M>x4qKl7612szp=kwp08aw%3-yNXI13imFjNX&$nKWdpwbJI~Y41w=)8)&9MxC%amKgGb)3>CvO4cd}+@-p{%H)=hxr zy^w0an=)(Td2{>X*7tMdJowPKd#gtEQ`@_I?^M#y%~`l*OUt!sVqN08X+J(ZyjT34 zPx@H?y^7{tyR5EFom%wq(a{C9JQ4;CtlZrvPoI9xvT)zNd6y=c8_u2_84+`414G3= zf!VWXzr4LYzg&^?K=~t=KpFmsMU4xtzm~L5bW%56cXM<5{Qs}d@2Ciz8OnF%+NYm4 z&!0STLPb;4bLVaagNzFbYJRg?4rV;KvNAZXe&UVg{O9+7VA9|FC%BDI_7(f`g$o zZ@J>hO>-8yt~}qlG9@i7$!Mn2x~Wpq>o-+h)%vz)e|ziEql%AbgOX`j)TvJ4?U#=o zd@#dD&B%DOQ`5)2Zmm-$O}eCch~FrY=gJ}x{i7lCDjs=m+FZOsL;ra*KVM5vrQaNj zb6rnQSA06T@r<^XlCH03ZT#MA0D><`xvA!XU7hUPoKGeJe*^BFMGF;qrikz z$=PSyZsxcxzuY?8^K8_VQ|o4UM@32L@BL#mS>1oxmMty9ia{c)IAyIuj&I4l%y?sG zF}tknzgEe{f=!!?BO+pa%F3STg}ilcy>jc8S5Q#UjjfBsR0FSMPntXV@T{%-A2;*c zB|L89jk6chkd>9qxfLS$?I6QDFYn}gdz6m#$=-fCNlhj}L1T$S?xhRdp=n>gel;;Q zy}Pf|%{ehqacb!78J5{)+k@m^H6J~G+&KGNj+VB0U_ihF_UE^@X8(DrKfml|`+ECN zXY03b-TJV^%KD(BeVvWelt1o1Pftv=|NMu4Uh?N>XK%bMdtW&DqDx?)py<@u62{Ly z>X|wSu$V~kCLgo$t8`T@etzz7#-6<)g%&b7_xJVgEUr5-QQ3W0i*SX{R0oeuI-jou z`v(RDG>9!#(teh9?cznppT~IL-2Ptu?0o!z#r<}#WN+AhzjJu?{y(bj_CH%Tm8Q>gqmz7`WKV_QK)CZh=8Tw>Zz; z+?-zdQvLs-)$9Kq;&vBkxlpmIV`9z1lbd|%>g-rqSzlRh7hB5r^WeP}7Nf6U-8JKO zG;~f@`}pUx{)9=Bm^5Y{ESawvC0h^`HS7MHq|G;1tgGwZYie2-SQQ?n*pew+aVKe` zLE<5n7(H>RUbek)?=LJ8$-FOEXf=0_wx`Uh)yc27y`8)0W&nTD>ub7Q;(7}L*=*~B6H|AdF1=m8|M%Sm1q@%R{_^U6ko2moPts9TRaf8q=&1P4|Nnmf z{JQ?X?xO5JZ2Bd4pDmpp_iUqK@}Gtu|JMFn?{;otR-YDI^TS=oJ|}s^>OA~$D)w%K zGAnE8?}X)#%fG*um+L#f@!g?|FH6ei`aKU&-dektRfC1sp7rBj{Ux2Pj8Z&(>)BYn z!V4ILgoJKADC=F+62w@=exs!?^3N8HrUUD>E#4_KC^a%qm@(tVBkmVAr=pDwr>|L~ zv&^qnEhWibLq^d?W^dg2@B8hiHZtcg-^BEg5qB1TNOp)LoqMujYMNuz|s= zdwX|@^@#8_oJ`3QV{v5r&$Vgpfh>hT>*n-Z%=O!rfB)D#+xN!l=VIJ?`C`vmRD4JX zTN`)QUB1@kYjkKLyF}0V2a3)!Y=2wI)%{4^|9I}1Q*W33dl9Imt-Z%vFy5kU_uN&h zw2F$0CGBc4s6_wGgZzwY;26hGUty;p%FB_-v9f4>cr#>~Tq4i(m^iSnGA z9$$CzmTC5ljmg$)*RGxWU`6fQySt~iw6NT(`<)vV73JaY|NR=PM6cWIn>l%9J7eNQ z!o$~doH1YH7#UcPnf)Wz=oN*ql6_WwYBJaWWk(&WiEcNQ<7b!%#HP|&&^G3)fT zw6()UL`6-1_g=}`dQZSLklRL*SEc#jfnI5Ii?TNoTeto;lof9#=a{iVrCQ?#T zJBnOa=G1;T7?XB(p6~sA+rJw(A1vG%^XC5k{;R9&&Zf_=ZM$7tt;E+792Iry#l^*j zv(J8ce}Dej+2)&Teipd|raU<@F~da4NA2=;waG6hcXf4%c8lp|u{}v}o#Xbv!eGg5 z`_1VeuCI&zY<0Znj89j$_{7<>Z$B+9E%n+XwPUgr&$*4s$2IitpSXG6di_@Bhf}6b zP27Harcr8_dHdgc)$cFvudjEj4APbAJvMdLtf<|UpP#jQPuI(JFeW*ii#?*nyaF& zzPapel#Uqp&6_v3Y~QYY+Nk!I#!e?kfxfr5x4(axdU{&y=K~WN%LCFCx*lbU@N)g% z+%9nSPTt*JPw#HqS@6)N`unwn@*5{lo$4xieC~I-yF2^sZMjeF>wZV?v#2)9`0a33 zQ&ThX$%%=ep!)HnqNuod<+^ohwzhYxc@Cs)Hobc7+Oz*J-0ibIHB1ckco^sE!DP3P z-Fp2doy&Lbyy=}Bvf0z$KmFXCoi_iD2rK@b%ys-}QQ?RF`X#GYX+7!lFtA8XO+7Qi zka_v#&a-Kc7q-he39!6>vM}r1RPAt?-R1A=iq6h5o&U3ebG;)&*y^i#U61BBJP&yF zZI|x8Sx;U&SX)`GSiO4jzspr@{8Bzy4vtf}j%RKC^nP{t$9KDfme+0yC~&wr(YE}Z zjB`8R)4ApM67TFNG%+<5l$Y?*N874}njeLE5*Jx`e|J`M@E^e<> z*~^FA#~&6HJUqnuZufgThEu0cNA4_AHJjZlYh7lLbcEymr018GdasGzo_BScZuGUE z4Ii7GErhuxju<`Izld>3*RH$LJ9IvBzMp9pdo%Lx*5c*i$x5w@XN49O88Nf*Bs@CO zDPvbN<8V8_@@b=^M~}vB-c|BaXz9|Wv+vdYew(T{U0X#)=_;4M=$rF__pWqHE;;aa z#=DT*ABQHU&b%I9KUXt&nF0q>XlUq?B}+D>oD}k#YvtYmdetvFa(Nix_8r*%C zN8awv>*A2JD_5?Jl;M==_^>oibkfzVzbAy5d=ySiN{si|r+G2s;fhJqrnzNhX{r0o zQLwe0tL)xqka3a2-j zcf8h=iMOo$r1E~>Z$0nndS7RsI(_(;AQ5ueFdQmS{{ZFktQkF#p_*=t);Pm7(NWt!brD$eKf@hNMl&HD;J_sZPQMJBZw zCQ_3oO}g;1#8I})q~OYaQ>k8WftF-;emR-9oJ_lU*^|Ck&PjQYejsVr&rr7eQ(QNA zZFzTyG3ETKKj*Jry?S)s*3b(I8?-G9nV&FcDSQxqzL738L%PzHbU?eNwi2Z-G9Z_t^UWIH<(DmE^sb9Pefm^eOh0bTGM$t~Etj(!Y8)~H_Eng(s+v?Ne3;kx zl4twvvo|&-&ooGMTK-u}Vr^KqzlTSLw~tSbp#;y{tfttrEMnr~$65T=Gjlbto)VYY z_qcJI?&(dxW;$%bP0l+XkKT8|-5 diff --git a/app/src/main/res/mipmap-ldpi/ic_launcher.png b/app/src/main/res/mipmap-ldpi/ic_launcher.png deleted file mode 100644 index 36f32f780bab071c1e4a8914c04e170ee8ce2df2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1882 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 Hr-UW|7^*AY diff --git a/app/src/main/res/mipmap-ldpi/ic_launcher_round.png b/app/src/main/res/mipmap-ldpi/ic_launcher_round.png deleted file mode 100644 index 95f1bdbbd758fd505bb9c4a83dbf7ce9718d91d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2266 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 T@GWFuU|{fc^>bP0l+XkKz4f~J diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 2af2773d664f25d467309d74ec925452ad9f5409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2720 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 I=akR{00I^q+5i9m diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 7a5529b28d4e4ed2c83c9b5eac15c9e42346721e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3281 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 Jmvv4FO#lkFFm3<< diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index d89940be8a50510e9e404cda23a5d504e0ed5ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4551 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 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_beta.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_beta.png deleted file mode 100644 index d3033d82c4fdc33b4c142f611307e16878004465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5408 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 f^tczj`&obOcBaszFFdXc3=9mOu6{1-oD!M| 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 Nc)I$ztaD0e0stX7wU7V+ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round_beta.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round_beta.png deleted file mode 100644 index b0f25c3d52973bf00741ca98dc6bd87bd9a4b97b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6669 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 AH2?qr diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index bededcfc4c30c90ed3d984bf8749c8ad67b8828f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7135 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ඪ#Xy=_J+?lmEZN43Q{_*3-h57gQ zrKF@3yt<;<)YNoiW3v0%6Ps7I_6GbvJMG}}5J!P&+zehzH^~+V7u0;6$L+B;EI1}6 zr|fI%LYdCIXFWe`_~mR8US3)%A|j$N`J~jI)p=}k4JS1t^M7VR+Z_e zKYspf{PJGHD)S`IXS1BrS<5foc6obiYqr;iJ1mn9C^*al&Ew8_%(=34!L4N)nwl#g zPf;^{wenxY;r9>roJeS^G^mMQu<=dn@k_Q*4eSYZUS6lB2Us7ud;Wk_`}e8i4#o{}( zpSI?nYjR&Dwc{q!1*XNpK|y>k%q5a*`6C!+^eJERQJsD|^X8_dSJ&+|v}w!AspxT^ zeD>-6pv$TYr~L{NXo+&1mesq)_T8m;#wg}<_068b(|ptpA3nVJnzkWt+Z)|OS8sff zcA7*fsTwwU{g!%EL$&>31 zOZP?kA6c_TXR6b}8>~DGR-ais)g~)WKI!v|;iY`X(xv7>soFMemxZ6j_`GdAey6ZM zd)|#FPo8{EJAEo>+2&1~v_!a$mOap1z<)#J#g(P1T}iSXUs~6cJ8vzYa?3zh(}>mI z`G!r1d9;1>soA0NFV?Kl+3K{=gDsC)pQ-QogIuLeVzSO^lNGy?dXLLn$Q_A3wPfwW zGp5nUURnyutySPS-DvJ})28&4$0^^G)YO+ETt_VvtgoJp6rXjn+H8#{|3tUN8&5ym zn96WIqN?KD9LwO>HQs&kd}h(pSsZ8Z)g<1zZ8Uq{TGmw|TCNEyAM6BDU;p&=oR+2V zxOTByuhC1VL``1zSr*O}XBv~TW`|Vtln6)gtnu~qG?c%3Ib_zidk>N)urcK`Co>$s zAAI4!B(4iH43j(h`rMXZp82JJTdM3V5zofsVfAXp|7?~wTy+TY^6H9JESQ@lqCM5i zK7r$^*`)vlrh+(@GgXsB8oqpx$TNSQ^8Uo7w7ojIzl{InxSw6jX2j}fvHtSQK1O#| k#~pJgO?ng{`LF)U&$WMcIhhnOFfcH9y85}Sb4q9e05yCtqyPW_ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 1ccec249cd4c75fbc4b24b3901d6bee3735af32a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8656 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round_beta.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round_beta.png deleted file mode 100644 index 4b589c2b69ee6ddddc770ba1ef75b372b59373c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10597 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Bd2>4A0#j?Ot~c6VX; z4}uH!E}zW6pmERB#WAGf*4w$2H6d4T9^YU7?M-8gfYPKBRys{hn>rO(x;C9)UDL2& z(^jP|rEhQF`n9k2zF3xP?%FWd6kaARre=lTSq&SUZ^#5_Mn*7kwoJ%1nmO}(|IE(G zCw0ozHmh8@|9mq4nYlBI&+q+ieZKOX<@w6K1N9SJ0!11s9_T5EzF<&c%57A0*z)#% zg@RZBGgAQT6sGMBvmH9$e&s(Psvv)XIlPf+u3tLW_pNPSPCK*(bZ#bevQ%08Rb}*T zF1cm2K;Q(MA5(i{?E&Ape(8MQZ8_WCX*9S5UP)+Gk(J=FVQ^{L8I|_HWCQyRwm0lu zC04OBR*OoQW;M73vSe@m%<+NcgR#QS#`ti~u+>|{BKo(U+}yG|=-(>E`x)DXTm$)R zSZug^SZ1~E_N!aPbc0ie{o3o2U6%^NPlTIlHMj)ku=y}8V~%nVduPQOaD7A57KR_& zHbyLUW1OJTmD?!ZxO~I6N$*lZ8KWEbGw+tR^57Lym|cHa@`rwc%>u6SxlTI96Ijo% zZF^m^>s3MciK$X54vRFFG1VX9^4n1z_;8x!4emXBDP~*lMK?2fh#XZrkl#3+!FR{& z%Lh^z_c7J6&&k$MFy&})37o>{&s2Zd%IVMKJF7)1_-8D>{PNV{*qIxcQ;H|tXO`nG zkCmEvj#-~!_TkLlLu?Z?y13Td{kWg8FmX3?Z?szi=ZEOIe&yOSq8!`~i!`<|JY(!{ zfBdI>!8yj@hBX1vizhIp%zhxllER>=xc8EEeCPrBhVLa-a}7h(r?$UxF{`L+FI{44 z7xMfs|0J2$F$wBx!*;u_zb@@mcxgg}LZC=;V}E1eLaXQXJI*mBmss81nJ{1D1^?w| z?_V^`J7{;^f7R0L0~T}rwp-6o=hSjoq)~Q6YSRU^8P9)u=7lz1-TBWZ;#_F}!=|&z zUyn$A{xo^BOq^uH^v3=sLqq8`1s(1i-0uHn@&B=u?H}u&wAUwCLKxq+b}s4&TV2Z% z(Qc~oSKX9{^MJ#GsMS~BU48wPQQP8z*a~&~gO>wT4@*gXlAhfyxWS28Y4+hg)8;?O zd@+mLMs~#^rb}wKcD*ny5O58Ao6q=lqeFAU z|HsRBu06JH;er1@ZX18*R+xQx&OzCIK}vRZ^M3sJQ4p>y@=Mm>%zXV{Ikq_yTUPIE zZax^ICF)YFIx5bWYuU%N`ExxP#{kdLg^BrY>t;D>W<6b{spVW9Q zYV9}gy>a?KnQAvVY-9MLd?(THOq0TdS+h<}ethim&SLcxqwD*%C!ahr(>VRdqtEA0 zoISf&*l`oXjGl=N;M-_15CS_lNs-Ie0D&GAy{DFt5H&ZLW2>o8t6)v$RFH zZf(hQo^MxcAk`al>iqGPUCEOsxiWS}t^KC0IeFbAoe3IU9}jT8o8Vd>ySps)%#4j& z@-DMEuDGw!ay02-`}_UrXJ?ttu_`sXGhIwWvhkqR+;`IX@>94j#5Z0)R2%v=bamKT z3EL{3yVYMD)VOmLnr`MiJ26rD#kF;+`ugT~rb}_iGFDZe{{G@>-fbaS9d?n2`;_WM zB_%sG`qEBaS-E7{vTL_r?U(z6# zKUb*dE}q=I;n-C(E6u51Ro`D8zOm7N!h{I|mx{&3#5SdUoi1Zhu)whSi|mEF!Ou+k z#XMGDEjzX=FIMuM_D9zyg#}m3p8R}1KmEf5MHe@>wmp0kCr&JRf3f-8T&v=(3mT+d zT_5h#{ingWW6AZ`{JVcQm~(FtsZhHU{;)f0OUA(ug32$hzfXK(_hn6!=H!zuY0u1S z_9ilium5Fo;kLjO?u=5a*w)qNckdXCy73OtquU0fNQ{%-$%>(r&GG5d;^ZtO|helcq+_t&c0xpFg4tDTv~ z`&EY5V&PH+jwMT%8rB^O&e(d3EwymTi5#=fZ?~ua%z5fnR8%Cz?4ew0b(igVv!3pR zu+_DE0*7Oh%e(sf(+>sv8@_y*?&0Uh=e6DDh7e2Rk|ip?zE;mr^POGr@sX>Rw)Wvz zU4O4DufNW}wv+EU^EQ=x>WzL6*KORaq@?uXemz6-{EDWIjss8bZHdsCGG&T@`19L; zKCF%2-qG93E3xP4)2D0xeeyOk-oJ3sqDB8$+2TSYo}b84%~_G$xFzcC;RCBp7I-+% z^l{sscXx*6>+mnHuk$Z8GFZ&T%F24?|Bqz5dEW&?LqoUZ-DaD5X)}LlSlqektM@&a zyZyeBzIp$(+*<;&va#=XX-xInRrdB&?f1L>fr*OOrQ>dN$Y@;4+PYij`H3vYBx#En z4j z^$E!Z84s9v6W({;*kR#jYuCld%(mbfi`wJ$7c-tbIM}Qcv!P+moNhh&o|ttDqPOS$ z`Ly$S#{GS^4A0NcPycsZesZmmba3h2n)}x(7MU#bo$t3kZZA`sqPDj7&CTiN@oS^q zJv}`I-f#1ldSG$#70(5ZH7_F$sVxmUsoc+#a^%EBlU%7CxqJ8herG*RC-P9^n!hv7 z-rN4JtD|E<`1*ScGByn{U#>d9sBk+iSG+-N z;krOCFRtWcJxh->^DhWsNxO7E#b|Th+`jYn(I>ZNUw5kYWKdC6HO%|N;?^rP@ig<} z{h{IE#ZNvYURx7;co z^(3#UI9sa&cf|VZ(Yh0IXMTDRa7`hk ztFJHZ(UHz2%a?D~QEryC-p2k`e0A7rPk;F{m(NGIpKxAy>XcXBy*-|j)qI^e1O3-b zUUT%DnvT$GwynKhZpo%@$x~Ihr_GsjX7&EssmI%RlRqwUO-Y~65uvarMsIoa_TMv% zO10)%mpch8`Dy+1=~IoVT2oH_`dQ1?tawF0bA#WO{7u*Qu=i%f>vbPJv@&>k#GVX6 z*6Um|EDD93+ju@&3F~th?J9YBXm;`QNi%1jJj6P`;OD2*{eP7m1w1@G6K{Qq|M1~3 zzxO+akkHVLxwp-x>HnYd%=7F_qf)K!_o~;==fD4Ju7Sf9{u?Un7qYe{Z_wMszjD!{ zMG_Vn6Z{n=!q>+=JxCXT7ym=?f(C5XJmJ8@6+f0eUGn(|L^XTUFymlp(Exu=ftzO+n;Un+dl2Ks;Y>H z$cFUud3v$CTyB@Wt&uuwCc#tl_v`g3)1und&!ib&y?QmnWLAJf$ik~x_FI|1XfMd# zaQ=l(JcE(Ms)(;gpYJg(*IVvCchRjxmm5hN0|E-B&b2Nt`1wgRYHOBiW>LuEix>7* zmxId0+uQRe>nGMu_gb3t;DFrRbkdF>2*n#4-8gm&SzR1?Q9QvRW?5y0%8L{@>{w z&;7fyudn-f=JI5f$gUYPB;5KXPv6*>+}S&I+NO&+X2p+=a2gp+D|+?hq!n|i(afIe z-DOW_rq6r2@As1Pr>9PtvZ3m0*0pt!XW!o5p53>*dWY83uBDQvGw$u#xnxti-G3Wa z*3!c%SF=n%e*Ac_WyP%=v+}Tnvmv4DbwYW4x98tai#!%o_V&)nDJz3jf2teJ?0I*0 z_vNMD;@k4?AA5APTXRpHY{QYXvonlRxtiIlzi)oCYTY_DW8=w3yTvBXpC5ku{HHGg zwY3l4*~Nv19tD;E-QC<`E?kZR?*bXh85?JpWGQTl(0TIosZsj3_!qajUV1_zrQKrp!%FM=hj_TVH1+ePnFh(-(;P#bCdNtovb`;Saev`>Dt#BH}lh^;>A5S@X(^IS8tA1^pK5g2k ztGh~THooG{6BYj*6ShEZ&F&%|Hs+&8kAD5u8N*Y)C7hv?ab@iWRe=c&o1%{%)rt7P zX9aw^R^IXUg_-uV3d z{OA7qKXaeXuk)JN{>!7)U4X@^?9~x&{XHJPzr9txdNjdcL*`?*Q>RYtsS6We@lg|2 zo6Na2>g~oFdA6{{q9zZPTAwpt5WYUHL%C+OP0C1xO_Ok%zt5Zc|I3+_l~NkUV9gRId%H9WyuSL zc79nkRn^vKXD4rr(2=pP>#^LNzB%)<+bLBu@p<=xHAKF=x!HYx|2OtF9?3`Fg;bjl z9yr!(@0VJ!y8Ur>b@8&Gm9L&g+-4V&UdrOQAoupRKR?gcKReLKtP{CshJ4+ReQ~K# ze`go(`S$z%#i#eG87*pGO<59=lF#oX!16Bh?kvsVWtUcmuWxXT_gdM$I@xXU#M|5R zg@uJ5o4atmYj`_Tgp2j>udj>U`{mX|Z|^hB4lCX}FL90A;)#!s_j&%?vz>jyl|7cp zZvBZ*9{0271g6x!O0y3O4Sg!8lz(<1^{2q+N~0 z%a<=T8iJ&pjng)=P2T(WTlAXv|DuzZ`#e3!F8{@0|y?z5N6z} zGqG6Z;D*G*9{&F9YkY6$uG#rPs#QmfyK3*e|8;-+c_cn?ocEjOb9$QY-a36Nt684@ z_GcG-DVe4hdFb8U-G9FI&yjENTAFk~nR%v7rIBuwM|@cM(^I0;bfb^GySv-qSFHH? z($B1N?(w zFRuN+|7P>lehC!QjX801b9#-GNAbM67gtsq2QTw``tSEU_X(c!Yhrho>Av0{b^NT= zwG02#uEkfpx&Ho*@YJbO1tldTi|;zy5?rs&?l>`NGyjoO|j$eNWR9i@y_!uE*M#CMq>wV)u*_$uyDr`D}K6 z#J`uz^CnOH{d!qt)A6g>zYW7bSX|q_XV07yCp_GGBm&vx793;Gy0a8z_+ria^j7w6yK_vdx||D@w(-)Bo$Pczl1HQ1bXcG4cnxwa>A zPEI;H$D;1e`p9a3t|dY_m;8N4@gyXcR?HTmJaolRpkirznfcHC$Zm{`p37|J6CCbIh)PsbY0>(3>tT z>aZ_W!ulMfS`SJNdDIT_ae{SEu zvA;fkZE5zw7WV~pA9nou^Wx%SNwYIw<@WRmXo_$(^X%ZdqQ797;E9mfvo9}yogXUB za`5eMx5X2Km;1Hx$Z0mf;-Z4L+T?{nto7%oA6R#@ z=N#TOy>Zj}T_Z-|;`#WM+3FrTP1&S&&k2i7lD{ySdyWEyOukzU2{=-*ItD;^? z>K#AKOJ#fykdohn(wS5?D91p zv$y3o7xg*lo0f(A{w7=T{_l55^Sn9nAO2J{?Rvh+`uM>nc8A3mryT5OxXa>q{dZog zqo$_jmu*jr`IazUtp4=nrlP&{qr%Ru<`p_(-Cws(URr2g`f$y!1Iipsf`Woe6PP`g zU!K`$TQ~I@g9>*5SM2U4Uj7Fgl@(a!!k=@o+AwgnE(%&15_Y&>j3Z(8{HJ#Vxma!H zsffz${>o`;!ywhWOk_6qGmZ;&Qk5C)=AMydkI#S4stqf$U9z^JfSdoCdd5?Yk`D|n zZf@67P8G4N;8<<^SAJzfuf%W8mFGX)s8w*{?gs_nU-<$CkL8yc*R1_6DYan97mqu& z{--wnn!^6I;dqi`*I8~6n}pnbPl_tf3W=w`FSfm)u>JIBm6`2(&ircm#(pmmOFlV>hkv?$M7ZawP+zvY`5PBRxB6IkWk&bR0HJNwFqN5wt8vf`2* zrNTC=Uf5GG9>%BSF)32?KzW#H~`40~y<>HsC?}=@8TdXqv7qPCxVo@#xt$$f2@v6sx*7Z(?2 z-rADspwoXe>EWfN-g=ki*qP-TX3Ur&eeV7BLb(#FSWU%EPO7S^XJ*>Y?zj78kWgJ^ zntiQjrg8emd%yobIylcZyL~=eLeQ1z@3lm@etoI!DF6Rc?(#BUZV4MuxA@^9)<5s( z|2v}FZX5sB@XWym_mv@GZfq7;QnA+*xzq7`|O*WduQi=d*dkLuG}Xl zJ7MqPTif%`&#|me{lBkP=WK-6xue~7Yj>>j-yWwn`Qon9Y&F}zJhrk5>-25doK>aG z^HL7~`g&(a;Bg6su0_!meR8&43LGV`ubs`d=vkfJ)7Pgb#B%T_lg~SbUt%}7dOkdy z_gi;qQ0K*rl!HzFH}=&^U#|b??Rk3IUeARA7wQi%$i2Ba`RnWJn{#JxIr#0@fy+7@ zC56>&j&4Xiob^}W6?6Z|lt({4KCao7BPp)`?{?~5n}d_5Pe1x$Jt-rVT=TrUp zi$hn3F}{uk)n9^w4~5PYKR;)f{p|CkKMTJ9|H>$9b>-{rGik-T<>GMd@5WQoeTxz_DY3m3Te%kjuqY?$W!{?)JK zP=sKF=NGw6$!wVdTKMBb;C1HCM;3}pgFKy_n2L7J>FVOLi{3dY z-e>-~U+edAeZ9BfoAitC<$oKGCm3v~{G1k7_tN#+y4c5sy9@n4h*+!IyuZKSUTbRC z+UV^?-|v<$4$xS0d&>8BXTQF_e)7bL2VbwpuivW36HzO_G$=E^GvUz9c*}325C)IQBwUTFAbLGT0RFoY5TD3QF_0@k2 zK59p1o_TY2=D~y&C-+soy=7YV=7wWkon2;T=A^j}nn4;OB60dpK0Q4><80dW4=X~l zetnleaKN$I#%$%jLzCxEKi=g3Z1Tj32TM6MTlOB@oN`jgs`S;735w2HUw2HJH0j39 zVs%zlR?`nRX5YQGHhS`;NkOaE+_-V$wV|Qmc81`%xO;Ozg-;WEJ_BRM)>|JDv~ zKO;uZeQj89WMt%P#+V%ijdQKb1H$6m+WBPvcnQDJ>2*8o{8w&~_w?$WHBXIPTU$+^ zPdS-V^6Jja>G5@~8_ zIyuUVuL^c#_kL2*%*)2S+;3jW_jR#Hjvl?dDfM)f{&ztZ$&)8f@<`gucy{vSlP6CE zgr!gG*Zq_^Z)@H>Wr~PR?h0+ud8<}w85!??xOQiL(TfX;CzYQCJ=pmDO4XMa4~?!_ z+1brIbH>L+iudj9?d8?$mif+(>+0yxC~R7OZvGPMbyu^xH>7Q;-x243!hh#xmjvHy zTk`M6ZQ8uq)7M+s&~W3uyLB^tK$%L?B*UQJ)~x5;TQOm(hyM*C~WujO6b3UctygSO)Hmr@_Uhwx^X8rU z|9?$=*VQ&z>gn;V4SQ{5xV`|!e>_%^o zo3g8`>kJ>Y?bFoE%%*V)&r51){~Fdf$-Ls!>C-p1WC~}8tzT!Fuj=}3r*8R&Ikwf) zuC0w;9JYF6gwEDAPbMn6N9-t2^qp&^rjGvp<*BE4GjF;+W3$b{WTTlk z_Seh5-}9Moclp~-l{}}VZ6YHhYyNyZe&T7-^o;?Unwl!=>YMBT*KI#Lb90JOq-$W{ z#r3;OUT%^Uzjmyyv+sB<(}`B4P26AA?Ook}qom&Q%I!XHoOp<3`&@Qwm&nM-IaZ~hvG5&hyKm;0 z&9|%lRe$O7<>|rVGTWz}(9aJRIcj$x@6ZM9;wcw1o*e6y&YNv~JXxx@?V+-pLEfDo zRrzb5@XdSlC~05J)-K=KX4l@#e8q1wPt8sC;Y`D1Hm{|VPMz}l^yyO;8}Hop|8Hze zj?fXS`ciPWV1|#{w%ps>9vu~rpOd*U;>?bWRRx!OeqMclHEZk7h~(wc9GLC&%^G-}R>WZYwmeVOlAD>Q-m#corCeG{zvxTnos&P8-P=<+d9HQYhrj&yFaMfX zy(cZUv`t-Iz5V;YpL+B4qQkT!ckC~`G4BCmwu)m`mX>?J+|wT)AD6ti(CFGNR`~D` z>oVWj$C$VMbZkC&;L*|U%zJxw9zXJ0ZE|N%PtU2?-DSPDWp8HGemdL4|Dj>N*a^M8 zarqarwpur+GiJ_qX7RknlcqI&udzSBsl9&x-QDGZVNq_k%ihNH{kE7^{`*@lsAt+P zUvr?9TU=%S@wrP5B!>qD31wzxzPY`<-?sW&Kuk;w`#gTT9}ULo=Ps-aR-ZI^a_qEZ zv)PfmN>*BGYiD2ESNnV04SiwxhYRh%*2kx0pF1Xa?4x4AUF*r80(#w))6dOGJ3sI4 ziYr-{E?vs1GV8m{AH6;2;oI%^i!A>N@Kmge+3A#)rpC(3x+UWx)6SSU=8GGXk9YL+ zq}n^}y%9-|rijz6$B*`+RAsw`IkL2h!Ew-~GK&R$F(FnQ=~{xND)zhAC_t zKKqxJnwsa|o3f>S)#v8vCsRNpeJ?LBzr531oWXCt-PuL0+&|v!es8mE@@Ln3yI!&L z$t1kIwA7TZ^7ps5m0z!hXP+zm_9oKq&j;s4ixDm-LIG`;mD*8=sdi)0m+t~*0nOkoeAK*=pNW6FCTyXI-jq;TbySln=Y|R$mX=(Z9 z_U`_krQUbiB3YQ_s`FQa8sT3qdAqo|O`1B@wO`IQ>(8vTv$G~nn|AEq-`_Vkr}Kl{ z&vO3Z;r7z>^YdyK?%1(oR@EVAg;@r>WvbHL5)=~KJWh3NU4A`n^UOPUVv353??i1% zI0PCwPCGZp)5nKLs<-XT8J}}=t&iW^TRrh)%93TvCQX^*l9i=(^X5&P-)}a@J+v%( za^lmDPm&bXOU1?!FthmjR32<`g)g}vyH7?9yYP>VLxy>#b{UQYqzp8v&hJ6 zm3#E}{b)KpUH|i+&*wk?c-((^bGm=o`+L17Q&tsDxy##OWfuMX{QUVs85Ig1-eozA zKmW5VW1f1@qFp~oL*&TOqgQ7dXL)?MF?GU(1KR8NI89dbJ#pfMg1!Cxna1gtwq}PP z;F_tx5qH=pC$^MN)@sX#Gc%3%pE!Shy~2SH4g%L}UY1yuSlu;R!`yrHpjCf}=2Wjo zj~->cHG8a~x%l|Meebiorna=O#MOQc6%rQCzBa3|R3q`;p2`RvvFWq--%K@{8L=s) z^XG$u&GojRbi&HY%GSid-&nHfuIKve@fWhT&TcF@w8wmPjGp_-kX<~AywlD<&aazy z;)KV$-S6%C`}^C|!z1DAtE;BU=humu9qLy;6B!w~`P;j@zY9Y{r>YmcV&!ky zuw11pNoWEi5ARjWyC*YDf`Wn`m3?hp{AzP|g2JcIcXkvum*1;wKXl0HNzu;h>wa~K zYOi~HW8>qMYu2oB-gelrnceBdgI8aF8LbW5&6U0R=5ztQnPt<=y`StbUuC{Cn~Qns zos)T;pe*y_<73-Ho2$OQO3uE%PPXvNi@^QQw|!ug<2W4AtI?Gpn=^<1j_9k;)~i;n z>bku>|N6^E-e;>`?f5YDf@cqUz`;7r;gxuTv^?`?LBe_LwjApLcs+M4uEw;U`R%L7IpLQ6TW%>%S`~0WdGbjgLqo$>-&rO* z)h3@@6{BO`W^jO+S3qI6OJEP%JjObAfypsDXRTbnYSp4OXFl5<`IfLD;gB*%lckl_ zE)6@of4hQKu3_@YySB<%;z1)D&xF`T8g2~!%=!W?40YunokBxHr%a!|o421=4dgm2 zE302_F)?>ak3aF_<(11|VYsQ`55}fhg1M#_xL>cDFww!g zW`@#4CV>dWRcqFi+{~$DK2dn!Vq({kB^NWi7B5=VwHP#RkuU#1A-JyYUk-c40>*>P zy%GxPor_j5?Mj}j=E+|5NR@p_NCQI~pX@867N@K;Tb&lJxRPPAbmGK`+m)4+vT|oW zar>6DVqR6WfLp}_KBg0a+YFalEa1Pu|9VG|_?qAKR~%GD7d$-NK6&1}zN1NnlJak3 z`eO9fhiQm}YE4}gv-si^R~MHlx4ubC{k0+MlfiBOMw0|5F8(_U87#d;Tz%9gM+vlq zI10RDe8+mJ;ai0Jf!j=5je>42+;I4D#T_xWq(BW3ww*C~Q%*m1TN;!Zpf#0ks#oaB z5UpOLnP+CV7OG#KsvZ9C(yCDH@Uzoa|F5=c>;7MD^=$J$`O-oWyN?Uc?PFkIVDNPH Kb6Mw<&;$U7>a0ls diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index ecc0dac4c3cb422fe725344b6f04364ba8644a38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10000 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 Y%K;Y~m-8NR3=9kmp00i_>zopr0KV3Z9{>OV diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_beta.png deleted file mode 100644 index c322b8bdc1278da2ae7e2a09e1608c3a7a456ca8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12530 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round_beta.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round_beta.png deleted file mode 100644 index 05dbd617500dbb87d5a8d3bbb424dfa24516f3ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15247 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 O1_n=8KbLh*2~7a-vG9Zd diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml deleted file mode 100644 index dfa3218..0000000 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - BlackBox - 手动选择 - 选择应用 - 已安装应用 - 已安装模块 - 空空如也 - 过滤 - 开源地址 - XP管理 - 交流群 - 软件设置 - 权限设置 - 虚拟定位(预览版) - 真实位置 - 虚拟定位设置成功:%s-%s - 关闭虚拟定位 - 是否关闭 %s 的虚拟定位 - %s 已关闭虚拟定位 - 点击跳转到模块管理界面 - 模块管理 - 启用Xposed框架 - 伪装 - 隐藏Root - 隐藏Xposed框架 - 用户备注 - 确定 - 取消 - 停止运行 - 是否强行停止运行%s - %s已停止运行 - 清除数据 - 是否清除%s的数据? - 卸载应用 - 创建快捷方式 - 快捷方式名称 - 已尝试添加到桌面 - 若添加失败,请前往系统设置,为BlackBox打开"创建桌面快捷方式"的权限 - 不再提醒 - 安装成功 - 安装失败 : %s - 安装失败 - 卸载成功 - 卸载失败 - 卸载软件 - 是否卸载%s,卸载后相关数据将被清除? - 卸载模块 - 是否卸载该模块,卸载后将无法再发挥作用? - 移除成功 - 清除成功 - 启动失败 - 请在外部启动模块 - 重新启动软件修改才能生效 - 该桌面不支持创建快捷方式 - Xposed模块请在管理界面卸载 - 其它 - 开启守护进程 - GMS管理 - 跳转到GMS管理界面 - 开启服务 - 开启Google服务,可以让Youtube等强依赖Google Play Services的软件能正常运行。 - 关闭服务 - 是否清除当前Google服务环境?Google服务数据将被清空。 - 当前手机没有Google服务环境。 - \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml deleted file mode 100644 index 4df62cd..0000000 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,65 +0,0 @@ - - BlackBox - 手動選擇 - 選擇應用程序 - 已安裝的應用程序 - 已安裝模塊 - 空的 - 篩檢 - 開源地址 - Xposed設定 - 電報組 - 虛擬定位(預覽) - 真實位置 - 成功設定虛擬定位:%s-%s - 禁用虛擬位置 - 是否關閉%s的虛擬定位 - 成功禁用%s的虛擬定位 - 軟件設定 - 轉到模塊管理器 - 模塊管理器 - 啟用Xposed框架 - 偽裝 - 隱藏Root - 隱藏Xposed - 用戶備註 - 確定 - 取消 - 許可權設定 - 不再提醒 - 停止運行 - 是否要強制停止%s? - %s已停止運行 - 清除數據 - 是否清除%s的數據? - 卸載應用程序 - 創建快捷方式 - 快捷方式名稱 - 嘗試添加到案頭 - 如果添加失敗,請轉到系統設置並打開BlackBox的“創建案頭快捷方式”許可權 - 安裝成功 - 安裝失敗:%s - 安裝失敗 - 已成功卸載 - 卸載失敗 - 卸載應用程序 - 是否卸載%s,卸載後相關資料將被清除? - 卸載模塊 - 是否要卸載此模塊? 卸載後它將不再工作? - 成功删除 - 成功清除 - 發射失敗 - 在外部啟動模塊 - 重新啟動應用程序以應用更改 - 此案頭不支持創建快捷方式 - 請在模塊管理器中卸載xposed模塊 - 其他 - 守護進程 - GMS管理 - 去找GMS管理 - 啟用服務 - 開放穀歌服務可以讓Youtube和其他高度依賴穀歌播放服務的軟件正常運行。 - 禁用服務 - 清除當前的穀歌服務環境? 穀歌服務數據將被清除。 - 現時,手機上沒有穀歌服務環境。 - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index 9facc85..0000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #3F3F3F - #3F3F3F - #3F3F3F - #ffffff - #212121 - #757575 - #FFFFFFFF - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml deleted file mode 100644 index d4aa8b6..0000000 --- a/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - FridaBox - Choose - Choose App - Installed App - Installed Module - Empty - Filter - Open Source - Xposed Setting - Telegram Group - Fake Location(Preview) - Real Location - Set Fake Location Successfully:%s-%s - Disable FakeLocation - Disable FakeLocation for %s - Disable FakeLocation for %s Successfully - Setting - Go to Module Manager - Module Manager - Enable Xposed Framework - Hide - Hide Root - Hide Xposed - User Remark - Done - Cancel - Setting - No Reminders - Stop Running - Do you want to stop %s forcibly? - %s is Stopped - Clear Data - Clear Data for %s? - Uninstall App - Create Shortcut - Shortcut Name - Try Added To Desktop - If the addition fails, please go to system settings and open the permission of "create desktop shortcut" for BlackBox - Installed Successfully - Installed Failed: %s - Installed Failed - Uninstalled Successfully - Uninstalled Failed - Uninstall App - Uninstall %s, and relevant data will be cleared after uninstallation? - Uninstall Module - Do you want to uninstall this module? It will no longer work after uninstallation? - Removed Successfully - Cleared Successfully - Launched Failed - Start module in outside - Restart app to apply change - This desktop does not support creating shortcuts - Please uninstall the xposed module in the Module Manager - Others - Daemon - Use VPN Network - Route traffic through VPN for sandboxed apps (may improve network access) - Disable Flag Secure - Allow screenshots and screen recording in apps - GMS Manager - Go to Gms Manager - Enable Service - Opening Google services can make youtube and other software that strongly rely on Google play services run normally. - Disable Service - Clear the current Google service environment? Google service data will be cleared. - Currently, there is no Google service environment on mobile phones. - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml deleted file mode 100644 index 4a7335f..0000000 --- a/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml deleted file mode 100644 index dca93c0..0000000 --- a/app/src/main/res/xml/network_security_config.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/setting.xml b/app/src/main/res/xml/setting.xml deleted file mode 100644 index 1d262a4..0000000 --- a/app/src/main/res/xml/setting.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/test/java/top/niunaijun/blackboxa/fridabox/ApkInspectorTest.java b/app/src/test/java/com/qm4rs/fridabox/ApkInspectorTest.java similarity index 97% rename from app/src/test/java/top/niunaijun/blackboxa/fridabox/ApkInspectorTest.java rename to app/src/test/java/com/qm4rs/fridabox/ApkInspectorTest.java index 9fbcb2c..30a4a45 100644 --- a/app/src/test/java/top/niunaijun/blackboxa/fridabox/ApkInspectorTest.java +++ b/app/src/test/java/com/qm4rs/fridabox/ApkInspectorTest.java @@ -1,4 +1,4 @@ -package top.niunaijun.blackboxa.fridabox; +package com.qm4rs.fridabox; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; diff --git a/app/src/test/java/top/niunaijun/blackboxa/fridabox/ApkIntegrityTest.java b/app/src/test/java/com/qm4rs/fridabox/ApkIntegrityTest.java similarity index 90% rename from app/src/test/java/top/niunaijun/blackboxa/fridabox/ApkIntegrityTest.java rename to app/src/test/java/com/qm4rs/fridabox/ApkIntegrityTest.java index 5119993..c7bfbd5 100644 --- a/app/src/test/java/top/niunaijun/blackboxa/fridabox/ApkIntegrityTest.java +++ b/app/src/test/java/com/qm4rs/fridabox/ApkIntegrityTest.java @@ -1,4 +1,4 @@ -package top.niunaijun.blackboxa.fridabox; +package com.qm4rs.fridabox; import static org.junit.Assert.assertEquals; diff --git a/app/src/test/java/top/niunaijun/blackboxa/fridabox/InstrumentationPreferenceParserTest.java b/app/src/test/java/com/qm4rs/fridabox/InstrumentationPreferenceParserTest.java similarity index 94% rename from app/src/test/java/top/niunaijun/blackboxa/fridabox/InstrumentationPreferenceParserTest.java rename to app/src/test/java/com/qm4rs/fridabox/InstrumentationPreferenceParserTest.java index bf0bce5..223f8eb 100644 --- a/app/src/test/java/top/niunaijun/blackboxa/fridabox/InstrumentationPreferenceParserTest.java +++ b/app/src/test/java/com/qm4rs/fridabox/InstrumentationPreferenceParserTest.java @@ -1,4 +1,4 @@ -package top.niunaijun.blackboxa.fridabox; +package com.qm4rs.fridabox; import static org.junit.Assert.assertEquals; diff --git a/docs/BASELINE.md b/docs/BASELINE.md index 397d060..166b669 100644 --- a/docs/BASELINE.md +++ b/docs/BASELINE.md @@ -1,6 +1,6 @@ -# NewBlackbox baseline +# FridaBox build baseline -- Foundation: `ALEX5402/NewBlackbox`, branch `main` +- Virtual runtime foundation revision: `89b59836c66f173756a4ae258cf379a957649820` - Required commit: `89b59836c66f173756a4ae258cf379a957649820` - Working branch: `feature/fridabox-mvp` - Baseline date: 2026-07-19 diff --git a/docs/TEST_RESULTS.md b/docs/TEST_RESULTS.md index 40e119a..defad76 100644 --- a/docs/TEST_RESULTS.md +++ b/docs/TEST_RESULTS.md @@ -55,8 +55,8 @@ baseline build investigation are recorded in `docs/BASELINE.md`. Runtime validation passed on a Samsung SM-S928B running ARM64 Android 16/API 36: - latest host APK installed successfully; -- the sample installed only in BlackBox and was absent from Android user 0's - real PackageManager; +- the sample installed only in the FridaBox private workspace and was absent + from Android user 0's real PackageManager; - Gadget paused startup before `SampleApplication.attachBaseContext` and `onCreate`; - the controller mapped port 27042 to the sample package/process and reported @@ -119,3 +119,28 @@ Artifacts: The release artifact was intentionally unsigned because no production keystore was supplied. `apksigner` confirmed the debug APK verifies and the release APK does not contain a debug signature. + +## Legacy shell removal validation + +Validation date: 2026-07-20 + +The obsolete launcher, GMS/Xposed/fake-location screens, legacy resources, +Chinese launcher translations, bundled UI AARs, and old product documentation +were removed. The application namespace and all host-owned source moved to +`com.qm4rs.fridabox`; only the runtime engine's compatibility API remains under +its upstream package namespace, with attribution retained in +`THIRD_PARTY_NOTICES.md`. + +The cleanup passed app/Bcore unit tests, debug and release assembly, and the +complete app lint/check task. On the connected Samsung SM-S928B (ARM64, +Android 16/API 36), the new APK installed successfully, resumed +`com.qm4rs.fridabox/.FridaBoxActivity`, restored both private guests, and launched +`com.paeezanstudio.pesarkhande` in Clean mode through `ProxyActivity$P0` without +a fatal exception. + +Final cleanup artifacts: + +- debug: 19,795,788 bytes, SHA-256 + `3fabf2887b3bf1aa1a83475b18803755168b33b2111e89f15d3d1434d89994a5`; +- release: 12,454,018 bytes, SHA-256 + `b7e9033def3fbe25f92686ceb3a3e2f623951e8d7fdd450b172d30df25e08e8e`. diff --git a/docs/device-validation.log b/docs/device-validation.log index ec982da..462aa91 100644 --- a/docs/device-validation.log +++ b/docs/device-validation.log @@ -265,3 +265,49 @@ BUILD SUCCESSFUL - release APK: 13266764 bytes, SHA-256 caa2218194fcbe91c10d0d29a74b7401aaed53f340b8a0d6668321ddae48ddfb - debug signature verification: passed - release signature verification: intentionally unsigned; no debug key fallback + +=== FridaBox-only application shell cleanup (2026-07-20) === + +> adb devices -l +R5CY149SZEX device product:e3qxxx model:SM_S928B device:e3q transport_id:1 + +> adb shell getprop ro.product.cpu.abi +arm64-v8a + +> adb shell getprop ro.build.version.release +16 + +> adb shell getprop ro.build.version.sdk +36 + +> $env:FRIDABOX_NDK_PROJECT_DIR='D:\FridaBoxBuild\Bcore'; .\gradlew.bat :app:assembleDebug :Bcore:testDebugUnitTest :app:testDebugUnitTest --console=plain '-Dkotlin.compiler.execution.strategy=in-process' +BUILD SUCCESSFUL in 46s + +> $env:FRIDABOX_NDK_PROJECT_DIR='D:\FridaBoxBuild\Bcore'; .\gradlew.bat :app:assembleRelease :app:check --console=plain '-Dkotlin.compiler.execution.strategy=in-process' +BUILD SUCCESSFUL in 2m 13s + +> adb install -r -t D:\Android Codes\FridaBox\app\build\outputs\apk\debug\FridaBox_4.0.0_arm64-v8a-debug.apk +Performing Streamed Install +Success + +> adb shell monkey -p com.qm4rs.fridabox -c android.intent.category.LAUNCHER 1 +Events injected: 1 + +> adb shell dumpsys activity activities +topResumedActivity=ActivityRecord{61631798 u0 com.qm4rs.fridabox/.FridaBoxActivity t2830} + +The UI hierarchy identified the host package as `com.qm4rs.fridabox`, displayed +the FridaBox product identity, and restored two private guests. The imported game +was switched to Clean mode and launched from its card. + +> adb shell dumpsys activity activities +topResumedActivity=ActivityRecord{234428585 u0 com.qm4rs.fridabox/top.niunaijun.blackbox.proxy.ProxyActivity$P0 t2831} + +No `FATAL EXCEPTION` or `AndroidRuntime` crash was emitted. The compatibility +activity class above belongs to the retained runtime engine; the host launcher, +application, namespace, source tree, and resources are FridaBox-owned. + +Final cleanup artifacts: + +- debug APK: 19795788 bytes, SHA-256 3fabf2887b3bf1aa1a83475b18803755168b33b2111e89f15d3d1434d89994a5 +- release APK: 12454018 bytes, SHA-256 b7e9033def3fbe25f92686ceb3a3e2f623951e8d7fdd450b172d30df25e08e8e diff --git a/settings.gradle b/settings.gradle index 794d96e..ef13195 100644 --- a/settings.gradle +++ b/settings.gradle @@ -33,7 +33,7 @@ dependencyResolutionManagement { } } -rootProject.name = "NewBlackbox" +rootProject.name = "FridaBox" include ':app' include(":black-reflection")