Full Code of JingMatrix/LSPosed for AI

master 8db19217d300 cached
560 files
2.5 MB
697.8k tokens
2384 symbols
1 requests
Download .txt
Showing preview only (2,788K chars total). Download the full file or copy to clipboard to get everything.
Repository: JingMatrix/LSPosed
Branch: master
Commit: 8db19217d300
Files: 560
Total size: 2.5 MB

Directory structure:
gitextract_f3szflt5/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── core.yml
│       └── crowdin.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── assets/
│           │   └── webview/
│           │       ├── colors_dark.css
│           │       ├── colors_light.css
│           │       ├── markdown.css
│           │       ├── syntax.css
│           │       ├── syntax_dark.css
│           │       ├── template.html
│           │       └── template_dark.html
│           ├── java/
│           │   ├── com/
│           │   │   └── google/
│           │   │       └── android/
│           │   │           └── material/
│           │   │               ├── appbar/
│           │   │               │   └── SubtitleCollapsingToolbarLayout.java
│           │   │               └── internal/
│           │   │                   └── SubtitleCollapsingTextHelper.java
│           │   └── org/
│           │       └── lsposed/
│           │           └── manager/
│           │               ├── App.java
│           │               ├── ConfigManager.java
│           │               ├── Constants.java
│           │               ├── adapters/
│           │               │   ├── AppHelper.java
│           │               │   └── ScopeAdapter.java
│           │               ├── receivers/
│           │               │   └── LSPManagerServiceHolder.java
│           │               ├── repo/
│           │               │   ├── RepoLoader.java
│           │               │   └── model/
│           │               │       ├── Collaborator.java
│           │               │       ├── OnlineModule.java
│           │               │       ├── Release.java
│           │               │       └── ReleaseAsset.java
│           │               ├── ui/
│           │               │   ├── activity/
│           │               │   │   ├── MainActivity.java
│           │               │   │   └── base/
│           │               │   │       └── BaseActivity.java
│           │               │   ├── dialog/
│           │               │   │   ├── BlurBehindDialogBuilder.java
│           │               │   │   ├── FlashDialogBuilder.java
│           │               │   │   └── WelcomeDialog.java
│           │               │   ├── fragment/
│           │               │   │   ├── AppListFragment.java
│           │               │   │   ├── BaseFragment.java
│           │               │   │   ├── CompileDialogFragment.java
│           │               │   │   ├── HomeFragment.java
│           │               │   │   ├── LogsFragment.java
│           │               │   │   ├── ModulesFragment.java
│           │               │   │   ├── RecyclerViewDialogFragment.java
│           │               │   │   ├── RepoFragment.java
│           │               │   │   ├── RepoItemFragment.java
│           │               │   │   └── SettingsFragment.java
│           │               │   └── widget/
│           │               │       ├── EmptyStateRecyclerView.java
│           │               │       ├── ExpandableTextView.java
│           │               │       ├── LinkifyTextView.java
│           │               │       ├── ScrollWebView.java
│           │               │       └── StatefulRecyclerView.java
│           │               └── util/
│           │                   ├── AccessibilityUtils.java
│           │                   ├── AppIconModelLoader.java
│           │                   ├── AppModule.java
│           │                   ├── BackupUtils.java
│           │                   ├── CloudflareDNS.java
│           │                   ├── EmptyAccessibilityDelegate.java
│           │                   ├── ModuleUtil.java
│           │                   ├── NavUtil.java
│           │                   ├── NoSniFactory.java
│           │                   ├── ShortcutUtil.java
│           │                   ├── SimpleStatefulAdaptor.java
│           │                   ├── ThemeUtil.java
│           │                   ├── UpdateUtil.java
│           │                   └── chrome/
│           │                       ├── CustomTabsURLSpan.java
│           │                       └── LinkTransformationMethod.java
│           └── res/
│               ├── anim/
│               │   ├── fragment_enter.xml
│               │   ├── fragment_enter_pop.xml
│               │   ├── fragment_exit.xml
│               │   └── fragment_exit_pop.xml
│               ├── drawable/
│               │   ├── ic_assignment_checkable.xml
│               │   ├── ic_attach_file.xml
│               │   ├── ic_baseline_add_24.xml
│               │   ├── ic_baseline_arrow_back_24.xml
│               │   ├── ic_baseline_assignment_24.xml
│               │   ├── ic_baseline_chat_24.xml
│               │   ├── ic_baseline_extension_24.xml
│               │   ├── ic_baseline_get_app_24.xml
│               │   ├── ic_baseline_home_24.xml
│               │   ├── ic_baseline_info_24.xml
│               │   ├── ic_baseline_search_24.xml
│               │   ├── ic_baseline_settings_24.xml
│               │   ├── ic_baseline_settings_backup_restore_24.xml
│               │   ├── ic_extension_checkable.xml
│               │   ├── ic_get_app_checkable.xml
│               │   ├── ic_home_checkable.xml
│               │   ├── ic_keyboard_arrow_down.xml
│               │   ├── ic_launcher.xml
│               │   ├── ic_launcher_foreground.xml
│               │   ├── ic_launcher_round.xml
│               │   ├── ic_open_in_browser.xml
│               │   ├── ic_outline_android_24.xml
│               │   ├── ic_outline_app_shortcut_24.xml
│               │   ├── ic_outline_assignment_24.xml
│               │   ├── ic_outline_dark_mode_24.xml
│               │   ├── ic_outline_dns_24.xml
│               │   ├── ic_outline_extension_24.xml
│               │   ├── ic_outline_format_color_fill_24.xml
│               │   ├── ic_outline_get_app_24.xml
│               │   ├── ic_outline_groups_24.xml
│               │   ├── ic_outline_home_24.xml
│               │   ├── ic_outline_invert_colors_24.xml
│               │   ├── ic_outline_language_24.xml
│               │   ├── ic_outline_merge_type_24.xml
│               │   ├── ic_outline_palette_24.xml
│               │   ├── ic_outline_restore_24.xml
│               │   ├── ic_outline_settings_24.xml
│               │   ├── ic_outline_shield_24.xml
│               │   ├── ic_outline_speaker_notes_24.xml
│               │   ├── ic_outline_translate_24.xml
│               │   ├── ic_round_bug_report_24.xml
│               │   ├── ic_round_check_circle_24.xml
│               │   ├── ic_round_error_outline_24.xml
│               │   ├── ic_round_settings_24.xml
│               │   ├── ic_round_update_24.xml
│               │   ├── ic_round_warning_24.xml
│               │   ├── ic_save.xml
│               │   ├── ic_settings_checkable.xml
│               │   ├── shortcut_ic_logs.xml
│               │   ├── shortcut_ic_modules.xml
│               │   ├── shortcut_ic_repo.xml
│               │   ├── shortcut_ic_settings.xml
│               │   └── simple_menu_background.xml
│               ├── layout/
│               │   ├── activity_main.xml
│               │   ├── dialog_about.xml
│               │   ├── dialog_item.xml
│               │   ├── dialog_title.xml
│               │   ├── fragment_app_list.xml
│               │   ├── fragment_compile_dialog.xml
│               │   ├── fragment_home.xml
│               │   ├── fragment_pager.xml
│               │   ├── fragment_repo.xml
│               │   ├── fragment_settings.xml
│               │   ├── item_log_textview.xml
│               │   ├── item_master_switch.xml
│               │   ├── item_module.xml
│               │   ├── item_onlinemodule.xml
│               │   ├── item_repo_loadmore.xml
│               │   ├── item_repo_readme.xml
│               │   ├── item_repo_recyclerview.xml
│               │   ├── item_repo_release.xml
│               │   ├── item_repo_title_description.xml
│               │   ├── preference_recyclerview.xml
│               │   ├── scrollable_dialog.xml
│               │   └── swiperefresh_recyclerview.xml
│               ├── layout-sw600dp/
│               │   └── activity_main.xml
│               ├── menu/
│               │   ├── context_menu_modules.xml
│               │   ├── menu_app_item.xml
│               │   ├── menu_app_list.xml
│               │   ├── menu_home.xml
│               │   ├── menu_logs.xml
│               │   ├── menu_modules.xml
│               │   ├── menu_repo.xml
│               │   ├── menu_repo_item.xml
│               │   └── navigation_menu.xml
│               ├── menu-sw600dp/
│               │   └── navigation_menu.xml
│               ├── navigation/
│               │   ├── main_nav.xml
│               │   ├── modules_nav.xml
│               │   └── repo_nav.xml
│               ├── values/
│               │   ├── arrays.xml
│               │   ├── attrs.xml
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── integer.xml
│               │   ├── settings.xml
│               │   ├── strings.xml
│               │   ├── strings_untranslatable.xml
│               │   ├── styles.xml
│               │   ├── themes.xml
│               │   ├── themes_custom.xml
│               │   ├── themes_overlay.xml
│               │   └── themes_override.xml
│               ├── values-af/
│               │   └── strings.xml
│               ├── values-ar/
│               │   └── strings.xml
│               ├── values-bg/
│               │   └── strings.xml
│               ├── values-bn/
│               │   └── strings.xml
│               ├── values-ca/
│               │   └── strings.xml
│               ├── values-cs/
│               │   └── strings.xml
│               ├── values-da/
│               │   └── strings.xml
│               ├── values-de/
│               │   └── strings.xml
│               ├── values-el/
│               │   └── strings.xml
│               ├── values-es/
│               │   └── strings.xml
│               ├── values-et/
│               │   └── strings.xml
│               ├── values-fa/
│               │   └── strings.xml
│               ├── values-fi/
│               │   └── strings.xml
│               ├── values-fr/
│               │   └── strings.xml
│               ├── values-hi/
│               │   └── strings.xml
│               ├── values-hr/
│               │   └── strings.xml
│               ├── values-hu/
│               │   └── strings.xml
│               ├── values-in/
│               │   └── strings.xml
│               ├── values-it/
│               │   └── strings.xml
│               ├── values-iw/
│               │   └── strings.xml
│               ├── values-ja/
│               │   └── strings.xml
│               ├── values-ko/
│               │   └── strings.xml
│               ├── values-ku/
│               │   └── strings.xml
│               ├── values-lt/
│               │   └── strings.xml
│               ├── values-night/
│               │   ├── colors.xml
│               │   └── styles.xml
│               ├── values-night-v31/
│               │   └── colors.xml
│               ├── values-nl/
│               │   └── strings.xml
│               ├── values-no/
│               │   └── strings.xml
│               ├── values-pl/
│               │   └── strings.xml
│               ├── values-pt/
│               │   └── strings.xml
│               ├── values-pt-rBR/
│               │   └── strings.xml
│               ├── values-ro/
│               │   └── strings.xml
│               ├── values-ru/
│               │   └── strings.xml
│               ├── values-si/
│               │   └── strings.xml
│               ├── values-sk/
│               │   └── strings.xml
│               ├── values-sv/
│               │   └── strings.xml
│               ├── values-sw600dp/
│               │   └── integer.xml
│               ├── values-th/
│               │   └── strings.xml
│               ├── values-tr/
│               │   └── strings.xml
│               ├── values-uk/
│               │   └── strings.xml
│               ├── values-ur/
│               │   └── strings.xml
│               ├── values-v28/
│               │   ├── dimens.xml
│               │   └── themes.xml
│               ├── values-v29/
│               │   └── settings.xml
│               ├── values-v30/
│               │   └── themes.xml
│               ├── values-v31/
│               │   └── colors.xml
│               ├── values-vi/
│               │   └── strings.xml
│               ├── values-zh-rCN/
│               │   └── strings.xml
│               ├── values-zh-rHK/
│               │   └── strings.xml
│               ├── values-zh-rTW/
│               │   └── strings.xml
│               └── xml/
│                   ├── prefs.xml
│                   └── shortcuts.xml
├── build.gradle.kts
├── core/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           └── java/
│               ├── android/
│               │   ├── app/
│               │   │   └── AndroidAppHelper.java
│               │   └── content/
│               │       └── res/
│               │           ├── XModuleResources.java
│               │           ├── XResForwarder.java
│               │           └── XResources.java
│               ├── de/
│               │   └── robv/
│               │       └── android/
│               │           └── xposed/
│               │               ├── IXposedHookCmdInit.java
│               │               ├── IXposedHookInitPackageResources.java
│               │               ├── IXposedHookLoadPackage.java
│               │               ├── IXposedHookZygoteInit.java
│               │               ├── IXposedMod.java
│               │               ├── SELinuxHelper.java
│               │               ├── XC_MethodHook.java
│               │               ├── XC_MethodReplacement.java
│               │               ├── XSharedPreferences.java
│               │               ├── XposedBridge.java
│               │               ├── XposedHelpers.java
│               │               ├── XposedInit.java
│               │               ├── callbacks/
│               │               │   ├── IXUnhook.java
│               │               │   ├── XC_InitPackageResources.java
│               │               │   ├── XC_LayoutInflated.java
│               │               │   ├── XC_LoadPackage.java
│               │               │   └── XCallback.java
│               │               └── services/
│               │                   ├── BaseService.java
│               │                   ├── DirectAccessService.java
│               │                   └── FileResult.java
│               └── org/
│                   └── lsposed/
│                       └── lspd/
│                           ├── core/
│                           │   ├── ApplicationServiceClient.java
│                           │   └── Startup.java
│                           ├── deopt/
│                           │   ├── InlinedMethodCallers.java
│                           │   └── PrebuiltMethodsDeopter.java
│                           ├── hooker/
│                           │   ├── AttachHooker.java
│                           │   ├── CrashDumpHooker.java
│                           │   ├── HandleSystemServerProcessHooker.java
│                           │   ├── LoadedApkCreateCLHooker.java
│                           │   ├── LoadedApkCtorHooker.java
│                           │   ├── OpenDexFileHooker.java
│                           │   └── StartBootstrapServicesHooker.java
│                           ├── impl/
│                           │   ├── LSPosedBridge.java
│                           │   ├── LSPosedContext.java
│                           │   ├── LSPosedHelper.java
│                           │   ├── LSPosedHookCallback.java
│                           │   └── LSPosedRemotePreferences.java
│                           └── util/
│                               ├── ClassPathURLStreamHandler.java
│                               ├── Hookers.java
│                               ├── LspModuleClassLoader.java
│                               └── MetaDataReader.java
├── crowdin.yml
├── daemon/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── org/
│           │       └── lsposed/
│           │           └── lspd/
│           │               ├── Main.java
│           │               ├── service/
│           │               │   ├── ActivityManagerService.java
│           │               │   ├── BridgeService.java
│           │               │   ├── ConfigFileManager.java
│           │               │   ├── ConfigManager.java
│           │               │   ├── Dex2OatService.java
│           │               │   ├── LSPApplicationService.java
│           │               │   ├── LSPInjectedModuleService.java
│           │               │   ├── LSPManagerService.java
│           │               │   ├── LSPModuleService.java
│           │               │   ├── LSPNotificationManager.java
│           │               │   ├── LSPSystemServerService.java
│           │               │   ├── LSPosedService.java
│           │               │   ├── LogcatService.java
│           │               │   ├── ObfuscationManager.java
│           │               │   ├── PackageService.java
│           │               │   ├── PowerService.java
│           │               │   ├── ServiceManager.java
│           │               │   └── UserService.java
│           │               └── util/
│           │                   ├── FakeContext.java
│           │                   └── InstallerVerifier.java
│           ├── jni/
│           │   ├── CMakeLists.txt
│           │   ├── dex2oat.cpp
│           │   ├── logcat.cpp
│           │   ├── logcat.h
│           │   ├── logging.h
│           │   ├── obfuscation.cpp
│           │   └── obfuscation.h
│           └── res/
│               ├── drawable/
│               │   ├── ic_baseline_block_24.xml
│               │   ├── ic_baseline_check_24.xml
│               │   ├── ic_baseline_close_24.xml
│               │   └── ic_notification.xml
│               ├── values/
│               │   └── strings.xml
│               ├── values-af/
│               │   └── strings.xml
│               ├── values-ar/
│               │   └── strings.xml
│               ├── values-bg/
│               │   └── strings.xml
│               ├── values-bn/
│               │   └── strings.xml
│               ├── values-ca/
│               │   └── strings.xml
│               ├── values-cs/
│               │   └── strings.xml
│               ├── values-da/
│               │   └── strings.xml
│               ├── values-de/
│               │   └── strings.xml
│               ├── values-el/
│               │   └── strings.xml
│               ├── values-es/
│               │   └── strings.xml
│               ├── values-et/
│               │   └── strings.xml
│               ├── values-fa/
│               │   └── strings.xml
│               ├── values-fi/
│               │   └── strings.xml
│               ├── values-fr/
│               │   └── strings.xml
│               ├── values-hi/
│               │   └── strings.xml
│               ├── values-hr/
│               │   └── strings.xml
│               ├── values-hu/
│               │   └── strings.xml
│               ├── values-in/
│               │   └── strings.xml
│               ├── values-it/
│               │   └── strings.xml
│               ├── values-iw/
│               │   └── strings.xml
│               ├── values-ja/
│               │   └── strings.xml
│               ├── values-ko/
│               │   └── strings.xml
│               ├── values-ku/
│               │   └── strings.xml
│               ├── values-lt/
│               │   └── strings.xml
│               ├── values-nl/
│               │   └── strings.xml
│               ├── values-no/
│               │   └── strings.xml
│               ├── values-pl/
│               │   └── strings.xml
│               ├── values-pt/
│               │   └── strings.xml
│               ├── values-pt-rBR/
│               │   └── strings.xml
│               ├── values-ro/
│               │   └── strings.xml
│               ├── values-ru/
│               │   └── strings.xml
│               ├── values-si/
│               │   └── strings.xml
│               ├── values-sk/
│               │   └── strings.xml
│               ├── values-sv/
│               │   └── strings.xml
│               ├── values-th/
│               │   └── strings.xml
│               ├── values-tr/
│               │   └── strings.xml
│               ├── values-uk/
│               │   └── strings.xml
│               ├── values-ur/
│               │   └── strings.xml
│               ├── values-vi/
│               │   └── strings.xml
│               ├── values-zh-rCN/
│               │   └── strings.xml
│               ├── values-zh-rHK/
│               │   └── strings.xml
│               └── values-zh-rTW/
│                   └── strings.xml
├── dex2oat/
│   ├── .gitignore
│   ├── README.md
│   ├── build.gradle.kts
│   └── src/
│       └── main/
│           └── cpp/
│               ├── CMakeLists.txt
│               ├── dex2oat.cpp
│               ├── include/
│               │   ├── base_macros.h
│               │   ├── logging.h
│               │   ├── macros.h
│               │   └── oat.h
│               └── oat_hook.cpp
├── external/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── apache/
│   │   ├── .gitignore
│   │   ├── build.gradle.kts
│   │   └── local/
│   │       └── MemberUtilsX.java
│   └── axml/
│       └── build.gradle.kts
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── hiddenapi/
│   ├── bridge/
│   │   ├── .gitignore
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── hidden/
│   │                   ├── ByteBufferDexClassLoader.java
│   │                   └── HiddenApiBridge.java
│   └── stubs/
│       ├── .gitignore
│       ├── build.gradle.kts
│       └── src/
│           └── main/
│               └── java/
│                   ├── android/
│                   │   ├── annotation/
│                   │   │   ├── NonNull.java
│                   │   │   └── Nullable.java
│                   │   ├── app/
│                   │   │   ├── ActivityManager.java
│                   │   │   ├── ActivityThread.java
│                   │   │   ├── Application.java
│                   │   │   ├── ContentProviderHolder.java
│                   │   │   ├── ContextImpl.java
│                   │   │   ├── IActivityController.java
│                   │   │   ├── IActivityManager.java
│                   │   │   ├── IApplicationThread.java
│                   │   │   ├── INotificationManager.java
│                   │   │   ├── IServiceConnection.java
│                   │   │   ├── IUidObserver.java
│                   │   │   ├── LoadedApk.java
│                   │   │   ├── Notification.java
│                   │   │   ├── NotificationChannel.java
│                   │   │   ├── ProfilerInfo.java
│                   │   │   └── ResourcesManager.java
│                   │   ├── content/
│                   │   │   ├── AttributionSource.java
│                   │   │   ├── BroadcastReceiver.java
│                   │   │   ├── ComponentName.java
│                   │   │   ├── Context.java
│                   │   │   ├── IContentProvider.java
│                   │   │   ├── IIntentReceiver.java
│                   │   │   ├── IIntentSender.java
│                   │   │   ├── Intent.java
│                   │   │   ├── IntentFilter.java
│                   │   │   ├── IntentSender.java
│                   │   │   ├── pm/
│                   │   │   │   ├── ApplicationInfo.java
│                   │   │   │   ├── BaseParceledListSlice.java
│                   │   │   │   ├── IPackageInstaller.java
│                   │   │   │   ├── IPackageManager.java
│                   │   │   │   ├── PackageInfo.java
│                   │   │   │   ├── PackageInstaller.java
│                   │   │   │   ├── PackageManager.java
│                   │   │   │   ├── PackageParser.java
│                   │   │   │   ├── ParceledListSlice.java
│                   │   │   │   ├── ResolveInfo.java
│                   │   │   │   ├── UserInfo.java
│                   │   │   │   └── VersionedPackage.java
│                   │   │   └── res/
│                   │   │       ├── AssetManager.java
│                   │   │       ├── CompatibilityInfo.java
│                   │   │       ├── Configuration.java
│                   │   │       ├── Resources.java
│                   │   │       ├── ResourcesImpl.java
│                   │   │       ├── ResourcesKey.java
│                   │   │       └── TypedArray.java
│                   │   ├── ddm/
│                   │   │   └── DdmHandleAppName.java
│                   │   ├── graphics/
│                   │   │   ├── Movie.java
│                   │   │   └── drawable/
│                   │   │       └── Drawable.java
│                   │   ├── os/
│                   │   │   ├── Binder.java
│                   │   │   ├── Build.java
│                   │   │   ├── Bundle.java
│                   │   │   ├── Environment.java
│                   │   │   ├── Handler.java
│                   │   │   ├── IBinder.java
│                   │   │   ├── IInterface.java
│                   │   │   ├── IPowerManager.java
│                   │   │   ├── IServiceCallback.java
│                   │   │   ├── IServiceManager.java
│                   │   │   ├── IUserManager.java
│                   │   │   ├── Parcel.java
│                   │   │   ├── Parcelable.java
│                   │   │   ├── PersistableBundle.java
│                   │   │   ├── RemoteException.java
│                   │   │   ├── ResultReceiver.java
│                   │   │   ├── SELinux.java
│                   │   │   ├── ServiceManager.java
│                   │   │   ├── ShellCallback.java
│                   │   │   ├── ShellCommand.java
│                   │   │   ├── SystemProperties.java
│                   │   │   ├── UserHandle.java
│                   │   │   └── UserManager.java
│                   │   ├── permission/
│                   │   │   └── IPermissionManager.java
│                   │   ├── system/
│                   │   │   ├── ErrnoException.java
│                   │   │   ├── Int32Ref.java
│                   │   │   └── Os.java
│                   │   ├── util/
│                   │   │   ├── DisplayMetrics.java
│                   │   │   ├── MutableInt.java
│                   │   │   └── TypedValue.java
│                   │   ├── view/
│                   │   │   └── IWindowManager.java
│                   │   └── webkit/
│                   │       ├── WebViewDelegate.java
│                   │       ├── WebViewFactory.java
│                   │       └── WebViewFactoryProvider.java
│                   ├── androidx/
│                   │   └── annotation/
│                   │       ├── IntRange.java
│                   │       └── RequiresApi.java
│                   ├── com/
│                   │   └── android/
│                   │       ├── internal/
│                   │       │   ├── os/
│                   │       │   │   ├── BinderInternal.java
│                   │       │   │   └── ZygoteInit.java
│                   │       │   └── util/
│                   │       │       └── XmlUtils.java
│                   │       └── server/
│                   │           ├── LocalServices.java
│                   │           ├── SystemService.java
│                   │           ├── SystemServiceManager.java
│                   │           └── am/
│                   │               ├── ActivityManagerService.java
│                   │               └── ProcessRecord.java
│                   ├── dalvik/
│                   │   └── system/
│                   │       ├── BaseDexClassLoader.java
│                   │       └── VMRuntime.java
│                   ├── org/
│                   │   └── xmlpull/
│                   │       └── v1/
│                   │           └── XmlPullParserException.java
│                   ├── sun/
│                   │   ├── misc/
│                   │   │   └── CompoundEnumeration.java
│                   │   └── net/
│                   │       └── www/
│                   │           ├── ParseUtil.java
│                   │           └── protocol/
│                   │               └── jar/
│                   │                   └── Handler.java
│                   └── xposed/
│                       └── dummy/
│                           ├── XResourcesSuperClass.java
│                           └── XTypedArraySuperClass.java
├── magisk-loader/
│   └── update/
│       ├── changelog.md
│       └── zygisk.json
├── native/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── include/
│   │   ├── common/
│   │   │   ├── config.h
│   │   │   └── logging.h
│   │   ├── core/
│   │   │   ├── config_bridge.h
│   │   │   ├── context.h
│   │   │   └── native_api.h
│   │   ├── elf/
│   │   │   ├── elf_image.h
│   │   │   └── symbol_cache.h
│   │   ├── framework/
│   │   │   └── android_types.h
│   │   └── jni/
│   │       ├── jni_bridge.h
│   │       └── jni_hooks.h
│   └── src/
│       ├── core/
│       │   ├── context.cpp
│       │   └── native_api.cpp
│       ├── elf/
│       │   ├── elf_image.cpp
│       │   └── symbol_cache.cpp
│       └── jni/
│           ├── dex_parser_bridge.cpp
│           ├── hook_bridge.cpp
│           ├── native_api_bridge.cpp
│           └── resources_hook.cpp
├── services/
│   ├── daemon-service/
│   │   ├── .gitignore
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── aidl/
│   │           │   └── org/
│   │           │       └── lsposed/
│   │           │           └── lspd/
│   │           │               ├── models/
│   │           │               │   ├── Module.aidl
│   │           │               │   └── PreLoadedApk.aidl
│   │           │               └── service/
│   │           │                   ├── ILSPApplicationService.aidl
│   │           │                   ├── ILSPInjectedModuleService.aidl
│   │           │                   ├── ILSPSystemServerService.aidl
│   │           │                   ├── ILSPosedService.aidl
│   │           │                   └── IRemotePreferenceCallback.aidl
│   │           └── java/
│   │               └── org/
│   │                   └── lsposed/
│   │                       └── lspd/
│   │                           └── util/
│   │                               └── Utils.java
│   └── manager-service/
│       ├── .gitignore
│       ├── build.gradle.kts
│       └── src/
│           └── main/
│               ├── AndroidManifest.xml
│               └── aidl/
│                   └── org/
│                       └── lsposed/
│                           └── lspd/
│                               ├── ILSPManagerService.aidl
│                               └── models/
│                                   ├── Application.aidl
│                                   └── UserInfo.aidl
├── settings.gradle.kts
├── xposed/
│   ├── README.md
│   ├── build.gradle.kts
│   └── src/
│       └── main/
│           └── kotlin/
│               └── org/
│                   └── matrix/
│                       └── vector/
│                           ├── impl/
│                           │   └── utils/
│                           │       └── VectorDexParser.kt
│                           └── nativebridge/
│                               ├── DexParserBridge.kt
│                               ├── HookBridge.kt
│                               ├── NativeAPI.kt
│                               └── ResourcesHook.kt
└── zygisk/
    ├── .gitignore
    ├── README.md
    ├── build.gradle.kts
    ├── module/
    │   ├── META-INF/
    │   │   └── com/
    │   │       └── google/
    │   │           └── android/
    │   │               ├── update-binary
    │   │               └── updater-script
    │   ├── action.sh
    │   ├── customize.sh
    │   ├── daemon
    │   ├── module.prop
    │   ├── sepolicy.rule
    │   ├── service.sh
    │   ├── system.prop
    │   └── uninstall.sh
    ├── proguard-rules.pro
    ├── src/
    │   └── main/
    │       ├── AndroidManifest.xml
    │       ├── cpp/
    │       │   ├── CMakeLists.txt
    │       │   ├── include/
    │       │   │   ├── ipc_bridge.h
    │       │   │   └── zygisk.hpp
    │       │   ├── ipc_bridge.cpp
    │       │   └── module.cpp
    │       └── kotlin/
    │           └── org/
    │               └── matrix/
    │                   └── vector/
    │                       ├── ParasiticManagerHooker.kt
    │                       ├── ParasiticManagerSystemHooker.kt
    │                       ├── core/
    │                       │   └── Main.kt
    │                       └── service/
    │                           ├── BridgeService.kt
    │                           └── ParcelUtils.kt
    └── zygisk.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto eol=lf

# Declare files that will always have CRLF line endings on checkout.
*.cmd text eol=crlf
*.bat text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.so binary
*.dex binary
*.jar binary
*.png binary


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug report/反馈 Bug
description: Report errors or unexpected behavior./反馈错误或异常行为。
labels: [bug]
body:
  - type: markdown
    attributes:
      value: |
        Thanks for reporting issues of LSPosed!

        To make it easier for us to help you, please read all pinned issues and provide the following details.

        感谢给 LSPosed 汇报问题!
        为了使我们更好地帮助你,请务必阅读所有已置顶的 Issues 并提供以下细节。
        为了防止重复汇报,标题请务必使用英文。
  - type: textarea
    attributes:
      label: Steps to reproduce/复现步骤
      placeholder: |
        1.
        2.
        3.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Expected behaviour/预期行为
      placeholder: Tell us what should happen/正常情况下应该发生什么
    validations:
      required: true
  - type: textarea
    attributes:
      label: Actual behaviour/实际行为
      placeholder: Tell us what happens instead/实际上发生了什么
    validations:
      required: true
  - type: textarea
    attributes:
      label: Xposed Module List/Xposed 模块列表
      render: shell
    validations:
      required: true
  - type: input
    attributes:
      label: Root implementation/Root 方案
      description: Common root implementations include Magisk, KernelSU or APatch. Please specify your current implementation with exact version./常见的 Root 方案有 Magisk,KernelSU 以及 APatch。请注明您当前的方案以及详细版本。
    validations:
      required: true
  - type: textarea
    attributes:
      label: System Module List/系统模块列表
      description: Modules installed through your root implementation manager/通过您 Root 方案的管理器所安装的模块
      render: shell
    validations:
      required: true
  - type: input
    attributes:
      label: LSPosed version/LSPosed 版本
      description: Don't use 'latest'. Specify actual version with 4 digits, otherwise your issue will be closed./不要填用“最新版”。给出四位版本号,不然 issue 会被关闭。
    validations:
      required: true
  - type: input
    attributes:
      label: Android version/Android 版本
      description: If you are running a custom OS, please also note it./如果使用了非官方的操作系统,请一并注明。
    validations:
      required: true
  - type: checkboxes
    id: latest
    attributes:
      label: Version requirement/版本要求
      options:
        - label: I am using the latest debug build from [GitHub Actions](https://github.com/JingMatrix/LSPosed/actions?query=branch%3Amaster)./我正在使用 [GitHub Actions](https://github.com/JingMatrix/LSPosed/actions?query=branch%3Amaster) 中最新的调试版本。
          required: true
  - type: textarea
    attributes:
      label: Logs/日志
      description: For usage issues, please provide the log zip saved from manager; for activation issues, please provide [bugreport](https://developer.android.com/studio/debug/bug-report). Without logs zip, the issue will be closed. /使用问题请提供从管理器保存的日志压缩包;激活问题请提供 [bugreport](https://developer.android.google.cn/studio/debug/bug-report?hl=zh-cn) 日志。没有日志附件的问题会被关闭。
      placeholder: Upload logs zip by clicking the bar on the bottom. Uploading logs to other websites or using external links is prohibited. /点击文本框底栏上传日志压缩包,禁止上传到其它网站或使用外链提供日志。
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Ask a question/提问
    url: https://github.com/JingMatrix/LSPosed/discussions/new?category=Q-A
    about: Please ask and answer questions here./如果有任何疑问请在这里提问


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
---
name: Feature request/新特性请求
description: Suggest an idea./提出建议
labels: [enhancement]
body:
  - type: textarea
    attributes:
      label: Is your feature request related to a problem?/你的请求是否与某个问题相关?
      placeholder: A clear and concise description of what the problem is./请清晰准确表述该问题。
    validations:
      required: true
  - type: textarea
    attributes:
      label: Describe the solution you'd like/描述你想要的解决方案
      placeholder: A clear and concise description of what you want to happen./请清晰准确描述新特性的预期行为
    validations:
      required: true
  - type: textarea
    attributes:
      label: Additional context/其他信息
      placeholder: Add any other context or screenshots about the feature request here./其他关于新特性的信息或者截图
    validations:
      required: false


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: monthly
    groups:
      actions:
        patterns:
          - "*"
  - package-ecosystem: gitsubmodule
    directory: /
    schedule:
      interval: monthly
    groups:
      submodule:
        patterns:
          - "*"
  - package-ecosystem: gradle
    directory: /
    schedule:
      interval: daily
    groups:
      maven:
        patterns:
          - "*"


================================================
FILE: .github/workflows/core.yml
================================================
name: Core

on:
  workflow_dispatch:
  push:
    branches: [ master ]
    tags: [ v* ]
  pull_request:
  merge_group:

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      CCACHE_COMPILERCHECK: "%compiler% -dumpmachine; %compiler% -dumpversion"
      CCACHE_NOHASHDIR: "true"
      CCACHE_HARDLINK: "true"
      CCACHE_BASEDIR: "${{ github.workspace }}"

    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          submodules: recursive
          fetch-depth: 0

      - name: Write key
        if: ${{ ( github.event_name != 'pull_request' && github.ref == 'refs/heads/master' ) || github.ref_type == 'tag' }}
        run: |
          if [ ! -z "${{ secrets.KEY_STORE }}" ]; then
            echo androidStorePassword='${{ secrets.KEY_STORE_PASSWORD }}' >> gradle.properties
            echo androidKeyAlias='${{ secrets.ALIAS }}' >> gradle.properties
            echo androidKeyPassword='${{ secrets.KEY_PASSWORD }}' >> gradle.properties
            echo androidStoreFile='key.jks' >> gradle.properties
            echo ${{ secrets.KEY_STORE }} | base64 --decode > key.jks
          fi

      - name: Setup Java
        uses: actions/setup-java@v5
        with:
          distribution: temurin
          java-version: 21

      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v5

      - name: Configure Gradle properties
        run: |
          echo 'android.native.buildOutput=verbose' >> ~/.gradle/gradle.properties
          echo 'org.gradle.parallel=true' >> ~/.gradle/gradle.properties
          echo 'org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -XX:+UseParallelGC' >> ~/.gradle/gradle.properties
          echo 'android.native.buildOutput=verbose' >> ~/.gradle/gradle.properties

      - name: Setup ninja
        uses: seanmiddleditch/gha-setup-ninja@v6
        with:
          version: 1.12.1

      - name: Setup ccache
        uses: actions/cache@v5
        with:
          path: |
            ~/.ccache
            ${{ github.workspace }}/.ccache
          key: ${{ runner.os }}-ccache-${{ hashFiles('**/build.gradle') }}-${{ hashFiles('**/CMakeLists.txt') }}
          restore-keys: |
            ${{ runner.os }}-ccache-

      - name: Setup Android SDK
        uses: android-actions/setup-android@v3

      - name: Remove Android's cmake
        shell: bash
        run: rm -rf $ANDROID_HOME/cmake

      - name: Build with Gradle
        run: |
          ./gradlew zipAll

      - name: Prepare artifact
        if: success()
        id: prepareArtifact
        run: |
          zygiskReleaseName=`ls zygisk/release/Vector-v*-Release.zip | awk -F '(/|.zip)' '{print $3}'` && echo "zygiskReleaseName=$zygiskReleaseName" >> $GITHUB_OUTPUT
          zygiskDebugName=`ls zygisk/release/Vector-v*-Debug.zip | awk -F '(/|.zip)' '{print $3}'` && echo "zygiskDebugName=$zygiskDebugName" >> $GITHUB_OUTPUT
          unzip zygisk/release/Vector-v*-Release.zip -d Vector-Release
          unzip zygisk/release/Vector-v*-Debug.zip -d Vector-Debug

      - name: Upload zygisk release
        uses: actions/upload-artifact@v6
        with:
          name: ${{ steps.prepareArtifact.outputs.zygiskReleaseName }}
          path: "./Vector-Release/*"

      - name: Upload zygisk debug
        uses: actions/upload-artifact@v6
        with:
          name: ${{ steps.prepareArtifact.outputs.zygiskDebugName }}
          path: "./Vector-Debug/*"

      - name: Upload mappings
        uses: actions/upload-artifact@v6
        with:
          name: mappings
          path: |
            zygisk/build/outputs/mapping
            app/build/outputs/mapping

      - name: Upload symbols
        uses: actions/upload-artifact@v6
        with:
          name: symbols
          path: build/symbols



================================================
FILE: .github/workflows/crowdin.yml
================================================
name: Crowdin Action

on:
  workflow_dispatch:
  push:
    branches: [ master ]
    paths:
      - app/src/main/res/values/strings.xml
      - daemon/src/main/res/values/strings.xml

jobs:
  synchronize-with-crowdin:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@main

    - name: crowdin action
      uses: crowdin/github-action@master
      with:
        upload_translations: true
        download_translations: false
        upload_sources: true
        config: 'crowdin.yml'
        crowdin_branch_name: master
      env:
        CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
        CROWDIN_API_TOKEN: ${{ secrets.CROWDIN_API_TOKEN }}


================================================
FILE: .gitignore
================================================
.project
.settings
.cache
*.iml
.gradle
/local.properties
/.idea
.DS_Store
build
/captures
bin/


================================================
FILE: .gitmodules
================================================
[submodule "external/lsplant"]
	path = external/lsplant
	url = https://github.com/JingMatrix/LSPlant.git
[submodule "external/dobby"]
	path = external/dobby
	url = https://github.com/JingMatrix/Dobby.git
[submodule "external/fmt"]
	path = external/fmt
	url = https://github.com/fmtlib/fmt.git
[submodule "external/xz-embedded"]
	path = external/xz-embedded
	url = https://github.com/tukaani-project/xz-embedded.git
[submodule "external/lsplt"]
	path = external/lsplt
	url = https://github.com/JingMatrix/LSPlt
[submodule "services/libxposed"]
	path = services/libxposed
	url = https://github.com/libxposed/service.git
[submodule "xposed/libxposed"]
	path = xposed/libxposed
	url = https://github.com/libxposed/api.git
[submodule "external/apache/commons-lang"]
	path = external/apache/commons-lang
	url = https://github.com/apache/commons-lang.git
[submodule "external/axml/manifest-editor"]
	path = external/axml/manifest-editor
	url = https://github.com/JingMatrix/ManifestEditor.git


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README.md
================================================
# LSPosed Framework

[![Build](https://img.shields.io/github/actions/workflow/status/JingMatrix/LSPosed/core.yml?branch=master&event=push&logo=github&label=Build)](https://github.com/JingMatrix/LSPosed/actions/workflows/core.yml?query=event%3Apush+branch%3Amaster+is%3Acompleted) [![Crowdin](https://img.shields.io/badge/Localization-Crowdin-blueviolet?logo=Crowdin)](https://crowdin.com/project/lsposed_jingmatrix) [![Download](https://img.shields.io/github/v/release/JingMatrix/LSPosed?color=orange&logoColor=orange&label=Download&logo=DocuSign)](https://github.com/JingMatrix/LSPosed/releases/latest) [![Total](https://shields.io/github/downloads/JingMatrix/LSPosed/total?logo=Bookmeter&label=Counts&logoColor=yellow&color=yellow)](https://github.com/JingMatrix/LSPosed/releases)

## Introduction 

A Zygisk module trying to provide an ART hooking framework which delivers consistent APIs with the OG Xposed, leveraging LSPlant hooking framework.

> Xposed is a framework for modules that can change the behavior of the system and apps without touching any APKs. That's great because it means that modules can work for different versions and even ROMs without any changes (as long as the original code was not changed too much). It's also easy to undo. As all changes are done in the memory, you just need to deactivate the module and reboot to get your original system back. There are many other advantages, but here is just one more: multiple modules can do changes to the same part of the system or app. With modified APKs, you have to choose one. No way to combine them, unless the author builds multiple APKs with different combinations.

## Supported Versions

Android 8.1 ~ 16

## Install

1. Install Magisk v26+
2. [Download](#download) and install LSPosed in Magisk app
3. Reboot
4. Open LSPosed manager from notification
5. Have fun :)

## Download

- For stable releases, please go to [Github Releases page](https://github.com/JingMatrix/LSPosed/releases)
- For canary build, please check [Github Actions](https://github.com/JingMatrix/LSPosed/actions/workflows/core.yml?query=branch%3Amaster)

Note: debug builds are only available in Github Actions.

## Get Help
**Only bug reports from **THE LATEST DEBUG BUILD** will be accepted.**
- GitHub issues: [Issues](https://github.com/JingMatrix/LSPosed/issues/)
- (For Chinese speakers) 本项目只接受英语**标题**的issue。如果您不懂英语,请使用[翻译工具](https://www.deepl.com/zh/translator)

## For Developers

Developers are welcome to write Xposed modules with hooks based on LSPosed Framework. A module based on LSPosed framework is fully compatible with the original Xposed Framework, and vice versa, a Xposed Framework-based module will work well with LSPosed framework too.

- [Xposed Framework API](https://api.xposed.info/)

We use our own module repository. We welcome developers to submit modules to our repository, and then modules can be downloaded in LSPosed.

- [LSPosed Module Repository](https://github.com/Xposed-Modules-Repo)

## Community Discussion

[Troubleshooting guide](https://github.com/JingMatrix/LSPosed/issues/123) and [Disscusions](https://github.com/JingMatrix/LSPosed/discussions).

## Translation Contributing

You can contribute translation [here](https://crowdin.com/project/lsposed_jingmatrix).

## Credits 

- [Magisk](https://github.com/topjohnwu/Magisk/): makes all these possible
- [XposedBridge](https://github.com/rovo89/XposedBridge): the OG Xposed framework APIs
- [LSPlant](https://github.com/JingMatrix/LSPlant): the core ART hooking framework
- [Dobby](https://github.com/JingMatrix/Dobby): inline hooker for `LSPlant` and `native_api` implement
- [EdXposed](https://github.com/ElderDrivers/EdXposed): fork source
- [xz-embedded](https://github.com/tukaani-project/xz-embedded): decompress `.gnu_debugdata` header section of stripped `libart.so`
- ~~[Riru](https://github.com/RikkaApps/Riru): provides a way to inject code into zygote process~~
- ~[SandHook](https://github.com/ganyao114/SandHook/): ART hooking framework for SandHook variant~
- ~[YAHFA](https://github.com/rk700/YAHFA): previous ART hooking framework~
- ~[dexmaker](https://github.com/linkedin/dexmaker) and [dalvikdx](https://github.com/JakeWharton/dalvik-dx): to dynamically generate YAHFA hooker classes~
- ~[DexBuilder](https://github.com/LSPosed/DexBuilder): to dynamically generate YAHFA hooker classes~

## License

LSPosed is licensed under the **GNU General Public License v3 (GPL-3)** (http://www.gnu.org/copyleft/gpl.html).


================================================
FILE: app/.gitignore
================================================
/build


================================================
FILE: app/build.gradle.kts
================================================
/*
 * This file is part of LSPosed.
 *
 * LSPosed is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * LSPosed is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with LSPosed.  If not, see <https://www.gnu.org/licenses/>.
 *
 * Copyright (C) 2021 LSPosed Contributors
 */

import java.time.Instant

plugins {
    alias(libs.plugins.agp.app)
    alias(libs.plugins.nav.safeargs)
    alias(libs.plugins.autoresconfig)
    alias(libs.plugins.materialthemebuilder)
    alias(libs.plugins.lsplugin.resopt)
    alias(libs.plugins.lsplugin.apksign)
}

apksign {
    storeFileProperty = "androidStoreFile"
    storePasswordProperty = "androidStorePassword"
    keyAliasProperty = "androidKeyAlias"
    keyPasswordProperty = "androidKeyPassword"
}

val defaultManagerPackageName: String by rootProject.extra

android {
    buildFeatures {
        viewBinding = true
        buildConfig = true
    }

    defaultConfig {
        applicationId = defaultManagerPackageName
        buildConfigField("long", "BUILD_TIME", Instant.now().epochSecond.toString())
    }

    packaging {
        resources {
            excludes += "META-INF/**"
            excludes += "okhttp3/**"
            excludes += "kotlin/**"
            excludes += "org/**"
            excludes += "**.properties"
            excludes += "**.bin"
        }
    }

    dependenciesInfo.includeInApk = false

    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles("proguard-rules.pro")
        }
    }

    sourceSets { named("main") { res { srcDirs("src/common/res") } } }
    namespace = defaultManagerPackageName
}

autoResConfig {
    generateClass = true
    generateRes = false
    generatedClassFullName = "org.lsposed.manager.util.LangList"
    generatedArrayFirstItem = "SYSTEM"
}

materialThemeBuilder {
    themes {
        for ((name, color) in
            listOf(
                "Red" to "F44336",
                "Pink" to "E91E63",
                "Purple" to "9C27B0",
                "DeepPurple" to "673AB7",
                "Indigo" to "3F51B5",
                "Blue" to "2196F3",
                "LightBlue" to "03A9F4",
                "Cyan" to "00BCD4",
                "Teal" to "009688",
                "Green" to "4FAF50",
                "LightGreen" to "8BC3A4",
                "Lime" to "CDDC39",
                "Yellow" to "FFEB3B",
                "Amber" to "FFC107",
                "Orange" to "FF9800",
                "DeepOrange" to "FF5722",
                "Brown" to "795548",
                "BlueGrey" to "607D8F",
                "Sakura" to "FF9CA8",
            )) {
            create("Material$name") {
                lightThemeFormat = "ThemeOverlay.Light.%s"
                darkThemeFormat = "ThemeOverlay.Dark.%s"
                primaryColor = "#$color"
            }
        }
    }
    // Add Material Design 3 color tokens (such as palettePrimary100) in generated theme
    // rikka.material:material >= 2.0.0 provides such attributes
    // Enable this if your are using rikka.material:material
    generatePalette = true
}

dependencies {
    annotationProcessor(libs.glide.compiler)
    implementation(libs.androidx.activity)
    implementation(libs.androidx.browser)
    implementation(libs.androidx.constraintlayout)
    implementation(libs.androidx.core)
    implementation(libs.androidx.fragment)
    implementation(libs.androidx.navigation.fragment)
    implementation(libs.androidx.navigation.ui)
    implementation(libs.androidx.preference)
    implementation(libs.androidx.recyclerview)
    implementation(libs.androidx.swiperefreshlayout)
    implementation(libs.glide)
    implementation(libs.material)
    implementation(libs.gson)
    implementation(libs.okhttp)
    implementation(libs.okhttp.dnsoverhttps)
    implementation(libs.okhttp.logging.interceptor)
    implementation(libs.rikkax.appcompat)
    implementation(libs.rikkax.core)
    implementation(libs.rikkax.insets)
    implementation(libs.rikkax.material)
    implementation(libs.rikkax.material.preference)
    implementation(libs.rikkax.recyclerview)
    implementation(libs.rikkax.widget.borderview)
    implementation(libs.rikkax.widget.mainswitchbar)
    implementation(libs.rikkax.layoutinflater)
    implementation(libs.appiconloader)
    implementation(libs.hiddenapibypass)
    implementation(libs.kotlin.stdlib)
    implementation(libs.kotlinx.coroutines.core)
    implementation(projects.services.managerService)
}

configurations.all {
    exclude("org.jetbrains", "annotations")
    exclude("androidx.appcompat", "appcompat")
    exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk7")
    exclude("org.jetbrains.kotlin", "kotlin-stdlib-jdk8")
}


================================================
FILE: app/proguard-rules.pro
================================================
-keep class org.lsposed.manager.Constants {
    public static boolean setBinder(android.os.IBinder);
}
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
    public static void check*(...);
    public static void throw*(...);
}
-assumenosideeffects class android.util.Log {
    public static *** v(...);
    public static *** d(...);
}

-keepclasseswithmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

-repackageclasses
-allowaccessmodification
-overloadaggressively

# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature,InnerClasses,EnclosingMethod

-dontwarn org.jetbrains.annotations.NotNull
-dontwarn org.jetbrains.annotations.Nullable
-dontwarn org.bouncycastle.jsse.BCSSLParameters
-dontwarn org.bouncycastle.jsse.BCSSLSocket
-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider
-dontwarn org.conscrypt.Conscrypt*
-dontwarn org.conscrypt.ConscryptHostnameVerifier
-dontwarn org.openjsse.javax.net.ssl.SSLParameters
-dontwarn org.openjsse.javax.net.ssl.SSLSocket
-dontwarn org.openjsse.net.ssl.OpenJSSE

-keepclassmembers class * implements android.os.Parcelable {
    public static final ** CREATOR;
}


================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
  <!--
  ~ This file is part of LSPosed.
  ~
  ~ LSPosed is free software: you can redistribute it and/or modify
  ~ it under the terms of the GNU General Public License as published by
  ~ the Free Software Foundation, either version 3 of the License, or
  ~ (at your option) any later version.
  ~
  ~ LSPosed is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  ~ GNU General Public License for more details.
  ~
  ~ You should have received a copy of the GNU General Public License
  ~ along with LSPosed.  If not, see <https://www.gnu.org/licenses/>.
  ~
  ~ Copyright (C) 2020 EdXposed Contributors
  ~ Copyright (C) 2021 LSPosed Contributors
  -->

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.INTERNET" />

    <permission
        android:name="${applicationId}.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
        android:protectionLevel="signature"
        tools:node="remove" />

    <uses-permission
        android:name="${applicationId}.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION"
        tools:node="remove" />

    <application
        android:name=".App"
        android:allowBackup="true"
        android:hasFragileUserData="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        tools:ignore="AllowBackup,GoogleAppIndexingWarning"
        tools:targetApi="q">
        <activity
            android:name=".ui.activity.MainActivity"
            android:exported="true"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.APPLICATION_PREFERENCES" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data
                android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts" />
        </activity>

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="remove" />
    </application>

</manifest>


================================================
FILE: app/src/main/assets/webview/colors_dark.css
================================================
/* Primer Colors */
/* Please also update colors_light.css with light mode appropriate colors when modifying this file. */

:root {
    --blue-900: #082a52;
    --blue-800: #063366;
    --blue-700: #0b498f;
    --blue-600: #0c65c9;
    --blue-500: #0d6edb;
    --blue-400: #2e8fff;
    --blue-300: #85beff;
    --blue-200: #d1e6ff;
    --blue-100: #e5f2ff;
    --blue-000: #f5faff;
    --gray-1000: #050505;
    --gray-950: #0b0b0d;
    --gray-900: #17181a;
    --gray-850: #242528;
    --gray-800: #2e2f37;
    --gray-750: #383a42;
    --gray-700: #41434e;
    --gray-650: #4b4d58;
    --gray-600: #525560;
    --gray-550: #5e616e;
    --gray-500: #6c6f7e;
    --gray-450: #787c8c;
    --gray-400: #9194a1;
    --gray-350: #a9abb6;
    --gray-300: #bfc1c9;
    --gray-250: #d6d7dc;
    --gray-200: #e3e4e8;
    --gray-150: #eff0f5;
    --gray-100: #f7f7f9;
    --gray-050: #fbfbfc;
    --gray-000: #ffffff;
    --green-900: #184d25;
    --green-800: #1b612b;
    --green-700: #1e7533;
    --green-600: #2b8f43;
    --green-500: #32b24f;
    --green-400: #40d663;
    --green-300: #95f0ab;
    --green-200: #cbf7d5;
    --green-100: #e5ffeb;
    --green-000: #f5fff8;
    --yellow-900: #755f13;
    --yellow-800: #b89007;
    --yellow-700: #e0b112;
    --yellow-600: #ffcb1a;
    --yellow-500: #ffd74d;
    --yellow-400: #ffe166;
    --yellow-300: #ffec8a;
    --yellow-200: #fff6b8;
    --yellow-100: #fffce5;
    --yellow-000: #fffef5;
    --orange-900: #a84603;
    --orange-800: #c75204;
    --orange-700: #d65c09;
    --orange-600: #eb680e;
    --orange-500: #fa6f0f;
    --orange-400: #ff8a38;
    --orange-300: #ffae75;
    --orange-200: #ffd5b2;
    --orange-100: #ffeee0;
    --orange-000: #fffaf5;
    --red-900: #8f1d22;
    --red-800: #a82229;
    --red-700: #bd222d;
    --red-600: #d62b38;
    --red-500: #e04352;
    --red-400: #f55363;
    --red-300: #ff808d;
    --red-200: #ffb2bb;
    --red-100: #ffe0e4;
    --red-000: #fff0f2;
    --pink-900: #702653;
    --pink-800: #9e3674;
    --pink-700: #c2428e;
    --pink-600: #d63c99;
    --pink-500: #f051b0;
    --pink-400: #f576c2;
    --pink-300: #fa9bd4;
    --pink-200: #ffbde4;
    --pink-100: #fee0f2;
    --pink-000: #fff0f9;
    --purple-900: #2e1757;
    --purple-800: #3f2175;
    --purple-700: #522e8f;
    --purple-600: #6139a8;
    --purple-500: #7548c7;
    --purple-400: #916bd6;
    --purple-300: #b899f0;
    --purple-200: #dac7ff;
    --purple-100: #eae0ff;
    --purple-000: #f6f2ff;
    --textPrimary: var(--gray-050);
    --textSecondary: var(--gray-300);
    --textTertiary: var(--gray-400);
    --textPlaceholder: rgba(145, 148, 161, 0.5);
    --link: var(--blue-400);
    --appBackground: var(--gray-1000);
    --backgroundSecondary: var(--gray-900);
    --backgroundTertiary: var(--gray-850);
    --border: rgba(191, 193, 201, 0.16);
    --borderOpaque: var(--gray-700);
    --iconPrimary: var(--gray-300);
    --iconSecondary: var(--gray-500);
    --inputBackground: rgba(191, 193, 201, 0.12);
    --backgroundPrimary: var(--gray-1000);
    --backgroundElevatedPrimary: var(--gray-900);
    --backgroundElevatedSecondary: rgba(191, 193, 201, 0.04);
    --backgroundElevatedTertiary: rgba(191, 193, 201, 0.08);
    --backgroundInset: var(--gray-900);
    --link-hover: var(--gray-800);
    --color-icon-success: var(--green-600);
    --color-text-danger: var(--red-600);
    --diffLineNumberAdditionBackground: #08260f;
    --diffLineNumberAdditionText: #95f0ab;
    --diffLineAdditionBackground: #061c0b;
    --diffLineNumberDeletionBackground: #3b0507;
    --diffLineNumberDeletionText: #ff808d;
    --diffLineDeletionBackground: #300406;
    --suggestedChangeDeletionText: #ffffff;
    --suggestedChangeAdditionText: #ffffff;
    --suggestedChangeDeletionBackground: rgba(218,54,51,0.6);
    --suggestedChangeAdditionBackground: rgba(46,160,67,0.6);
    --videoBackground: #000000;
}

/* Custom Base Styles */

:root {
    --link-highlight: rgba(46, 143, 255, 0.08);
    --pre-background: var(--backgroundElevatedTertiary);
    --code-background: var(--pre-background);
    --hr-background: var(--borderOpaque);
    --thead-background: var(--pre-background);
    --thead-border: var(--hr-background);
    --tr-border: var(--gray-300);
    --tr-alt-background: var(--pre-background);
    --kbd-background: var(--pre-background);
    --kbd-color: var(--gray-350);
    --kbd-border: var(--gray-750);
    --blockquote-color: var(--gray-400);
    --blockquote-border: var(--hr-background);
    --heading-color: var(--gray-100);
    --h6-color: var(--gray-500);
    --frame-border: var(--hr-background);
    --frame-color: var(--gray-200);
    --mention-color: var(--textPrimary);
    --email-toggle-color: var(--kbd-color);
    --email-toggle-background: var(--blockquote-border);
    --email-quoted-color: var(--blockquote-color);
    --keyword-color: var(--gray-600);
    --code-font: ui-monospace, Menlo, monospace;
}


================================================
FILE: app/src/main/assets/webview/colors_light.css
================================================
/* Primer Colors */
/* Please also update colors_dark.css with dark mode appropriate colors when modifying this file. */

:root {
    --blue-900: #05264c;
    --blue-800: #032f62;
    --blue-700: #044289;
    --blue-600: #005cc5;
    --blue-500: #0366d6;
    --blue-400: #2188ff;
    --blue-300: #79b8ff;
    --blue-200: #c8e1ff;
    --blue-100: #dbedff;
    --blue-000: #f1f8ff;
    --gray-1000: #050505;
    --gray-950: #0b0b0d;
    --gray-900: #17181a;
    --gray-850: #242528;
    --gray-800: #2f3037;
    --gray-750: #383a42;
    --gray-700: #41434e;
    --gray-650: #4b4d58;
    --gray-600: #525560;
    --gray-550: #5e616e;
    --gray-500: #6a6d7c;
    --gray-450: #787c8c;
    --gray-400: #9194a1;
    --gray-350: #a9abb6;
    --gray-300: #bfc1c9;
    --gray-250: #d6d7dc;
    --gray-200: #e3e4e8;
    --gray-150: #eff0f5;
    --gray-100: #f7f7f9;
    --gray-050: #fbfbfc;
    --gray-000: #ffffff;
    --green-900: #144620;
    --green-800: #165c26;
    --green-700: #176f2c;
    --green-600: #22863a;
    --green-500: #28a745;
    --green-400: #34d058;
    --green-300: #85e89d;
    --green-200: #bef5cb;
    --green-100: #dcffe4;
    --green-000: #f0fff4;
    --yellow-900: #735c0f;
    --yellow-800: #b08800;
    --yellow-700: #dbab09;
    --yellow-600: #f9c513;
    --yellow-500: #ffd33d;
    --yellow-400: #ffdf5d;
    --yellow-300: #ffea7f;
    --yellow-200: #fff5b1;
    --yellow-100: #fffbdd;
    --yellow-000: #fffdef;
    --orange-900: #a04100;
    --orange-800: #c24e00;
    --orange-700: #d15704;
    --orange-600: #e36209;
    --orange-500: #f66a0a;
    --orange-400: #fb8532;
    --orange-300: #ffab70;
    --orange-200: #ffd1ac;
    --orange-100: #ffebda;
    --orange-000: #fff8f2;
    --red-900: #86181d;
    --red-800: #9e1c23;
    --red-700: #b31d28;
    --red-600: #cb2431;
    --red-500: #d73a49;
    --red-400: #ea4a5a;
    --red-300: #f97583;
    --red-200: #fdaeb7;
    --red-100: #ffdce0;
    --red-000: #ffeef0;
    --pink-900: #6d224f;
    --pink-800: #99306f;
    --pink-700: #b93a86;
    --pink-600: #d03592;
    --pink-500: #ea4aaa;
    --pink-400: #ec6cb9;
    --pink-300: #f692ce;
    --pink-200: #f9b3dd;
    --pink-100: #fedbf0;
    --pink-000: #ffeef8;
    --purple-900: #29134e;
    --purple-800: #3a1d6e;
    --purple-700: #4c2888;
    --purple-600: #5a32a3;
    --purple-500: #6f42c1;
    --purple-400: #8a63d2;
    --purple-300: #b392f0;
    --purple-200: #d1bcf9;
    --purple-100: #e6dcfd;
    --purple-000: #f5f0ff;
    --textPrimary: var(--gray-1000);
    --textSecondary: var(--gray-700);
    --textTertiary: var(--gray-500);
    --textPlaceholder: rgba(82, 85, 96, 0.5);
    --link: var(--blue-500);
    --appBackground: var(--gray-000);
    --backgroundSecondary: var(--gray-000);
    --backgroundTertiary: var(--gray-000);
    --border: rgba(65, 67, 78, 0.25);
    --borderOpaque: var(--gray-300);
    --iconPrimary: var(--gray-600);
    --iconSecondary: var(--gray-400);
    --inputBackground: rgba(65, 67, 78, 0.12);
    --backgroundPrimary: var(--gray-150);
    --backgroundElevatedPrimary: var(--gray-150);
    --backgroundElevatedSecondary: var(--gray-000);
    --backgroundElevatedTertiary: var(--gray-000);
    --backgroundInset: var(--gray-200);
    --link-hover: var(--gray-200);
    --color-icon-success: var(--green-600);
    --color-text-danger: var(--red-600);
    --diffLineNumberAdditionBackground: #dcffe4;
    --diffLineNumberAdditionText: #22863a;
    --diffLineAdditionBackground: #f0fff4;
    --diffLineNumberDeletionBackground: #ffdce0;
    --diffLineNumberDeletionText: #cb2431;
    --diffLineDeletionBackground: #ffeef0;
    --suggestedChangeDeletionText: #ffffff;
    --suggestedChangeAdditionText: #ffffff;
    --suggestedChangeDeletionBackground: rgba(218,54,51,0.6);
    --suggestedChangeAdditionBackground: rgba(46,160,67,0.6);
    --videoBackground: #000000;
}

/* Custom Base Styles */

:root {
    --link-highlight: rgba(3, 102, 214, 0.08);
    --pre-background: var(--gray-100);
    --code-background: var(--pre-background);
    --hr-background: var(--gray-200);
    --thead-background: var(--pre-background);
    --thead-border: var(--hr-background);
    --tr-border: var(--gray-300);
    --tr-alt-background: var(--pre-background);
    --kbd-background: var(--pre-background);
    --kbd-color: var(--gray-650);
    --kbd-border: var(--gray-250);
    --blockquote-color: var(--gray-500);
    --blockquote-border: var(--hr-background);
    --heading-color: var(--gray-900);
    --h6-color: var(--gray-500);
    --frame-border: var(--hr-background);
    --frame-color: var(--gray-850);
    --mention-color: var(--gray-850);
    --email-toggle-color: var(--kbd-color);
    --email-toggle-background: var(--blockquote-border);
    --email-quoted-color: var(--blockquote-color);
    --keyword-color: var(--gray-400);
    --code-font: ui-monospace, Menlo, monospace;
}


================================================
FILE: app/src/main/assets/webview/markdown.css
================================================
/* Shared styles between light & dark mode so all colors should be variables */

* {
  box-sizing: border-box;
}

input:disabled {
  touch-action: none;
}

html {
  -webkit-text-size-adjust: none;
  text-size-adjust: none;
  font: -apple-system-body;
}

body {
  color: var(--textPrimary);
  background-color: var(--background);
}

a {
  color: var(--link);
  text-decoration: none;
  -webkit-tap-highlight-color: var(--link-highlight);
  word-break: break-word;
}

a:not([target]):hover {
  border-radius: 5px;
  background-color: var(--link-hover);
  transition-duration: 0.2s;
  transform: scale(1.015);
}

/*
Web views hold on to their hover event if the app is backgrounded. We need to disable custom hover effects by setting a
class on body and overriding them in CSS when we apply this workaround. When the mouse enters the web view again, we
can disable our override.
*/
body.hover-override a:not([target]) {
  background-color: transparent;
  transform: scale(1);
}

details summary {
  outline: 0;
}

table {
  border-spacing: 0;
  border-collapse: collapse;
}

blockquote {
  margin: 0;
}

table, table *, pre {
  touch-action: pan-x;
}

.markdown-body ul.contains-task-list {
  list-style: none;
  padding-left: 0;
}

.task-list-item {
  padding-left: 40px;
  margin-left: -16px;
}

.task-list-item-checkbox {
  margin-left: -24px
}

pre, code, kbd {
  font-size: 1em;
  font-family: var(--code-font);
}

.issue-keyword {
  border-bottom: 1px dotted var(--keyword-color);
}

.team-mention, .user-mention {
  font-weight: 600;
  color: var(--mention-color);
  white-space: nowrap;
}

.email-hidden-toggle, .email-hidden-reply {
  display: none;
}

/* Fix checkboxes looking cut off when they render larger than the default size */
input[type="checkbox"] {
  transform: translate(0px);
}

/* --- */

.markdown-body {
  font-size: inherit;
  line-height: 1.5;
  word-wrap: break-word;
}

.markdown-body kbd {
  display: inline-block;
  padding: 0.18em 0.31em;
  font-size: 0.7em;
  line-height: 1.2em;
  color: var(--kbd-color);
  vertical-align: middle;
  background-color: var(--kbd-background);
  border: 1px solid var(--kbd-border);
  border-radius: 0.25em;
  box-shadow: inset 0 -1px 0 var(--kbd-border);
  margin-right: 2px;
}

.markdown-body:after, .markdown-body:before {
  display: table;
  content: ""
}

.markdown-body:after {
  clear: both;
}

.markdown-body > :first-child {
  margin-top: 0 !important;
}

.markdown-body > :last-child {
  margin-bottom: 0 !important;
}

.markdown-body a:not([href]) {
  color: inherit;
  text-decoration: none;
}

.markdown-body .absent {
  color: var(--red-600);
}

.markdown-body .anchor {
  float: left;
  padding-right: 4px;
  margin-left: -20px;
  line-height: 1;
}

.markdown-body .anchor:focus {
  outline: none;
}

.markdown-body blockquote, .markdown-body details, .markdown-body dl, .markdown-body ol, .markdown-body p, .markdown-body pre, .markdown-body table, .markdown-body ul {
  margin-top: 0;
  margin-bottom: 16px;
}

.markdown-body hr {
  height: .25em;
  padding: 0;
  margin: 24px 0;
  background-color: var(--hr-background);
  border: 0;
}

.markdown-body blockquote {
  padding-left: 1em;
  color: var(--blockquote-color);
  position: relative;
}

.markdown-body blockquote::before {
  content: '';
  width: 2px;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  background-color: var(--blockquote-border);
  border-radius: 2px;
}

.markdown-body blockquote > :first-child {
  margin-top: 0;
}

.markdown-body blockquote > :last-child {
  margin-bottom: 0;
}

.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 {
  margin-top: 24px;
  margin-bottom: 16px;
  font-weight: 600;
  line-height: 1.25;
}

.markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link {
  color: var(--heading-color);
  vertical-align: middle;
  visibility: hidden;
}

.markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor {
  text-decoration: none;
}

.markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link {
  visibility: visible;
}

.markdown-body h1 code, .markdown-body h1 tt, .markdown-body h2 code, .markdown-body h2 tt, .markdown-body h3 code, .markdown-body h3 tt, .markdown-body h4 code, .markdown-body h4 tt, .markdown-body h5 code, .markdown-body h5 tt, .markdown-body h6 code, .markdown-body h6 tt {
  font-size: inherit;
}

.markdown-body h1 {
  font-size: 2em;
}

.markdown-body h1, .markdown-body h2 {
  padding-bottom: .3em;
  border-bottom: 1px solid var(--border);
}

.markdown-body h2 {
  font-size: 1.5em;
}

.markdown-body h3 {
  font-size: 1.25em;
}

.markdown-body h4 {
  font-size: 1em;
}

.markdown-body h5 {
  font-size: .875em;
}

.markdown-body h6 {
  font-size: .85em;
  color: var(--h6-color);
}

.markdown-body ul {
  padding-left: 1.5em;
}

.markdown-body ol.no-list, .markdown-body ul.no-list {
  padding: 0;
  list-style-type: none;
}

.markdown-body ol ol, .markdown-body ol ul, .markdown-body ul ol, .markdown-body ul ul {
  margin-top: 0;
  margin-bottom: 0;
}

.markdown-body li {
  word-wrap: break-all;
}

.markdown-body li > p {
  margin-top: 16px;
}

.markdown-body li + li {
  margin-top: .25em;
}

.markdown-body dl {
  padding: 0;
}

.markdown-body dl dt {
  padding: 0;
  margin-top: 16px;
  font-size: 1em;
  font-style: italic;
  font-weight: 600;
}

.markdown-body dl dd {
  padding: 0 16px;
  margin-bottom: 16px;
}

.markdown-body table {
  display: block;
  width: 100%;
  overflow: auto;
}

.markdown-body table th {
  font-weight: 600;
}

.markdown-body table td, .markdown-body table th {
  padding: 6px 13px;
  border: 1px solid var(--thead-border);
}

.markdown-body table tr {
  background-color: var(--background);
  border-top: 1px solid var(--tr-border);
}

.markdown-body table tr:nth-child(2n) {
  background-color: var(--tr-alt-background);
}

.markdown-body table img {
  background-color: initial;
}

.markdown-body img {
  max-width: 100%;
  box-sizing: initial;
  background-color: var(--background);
}

.markdown-body img[align=right] {
  padding-left: 20px;
}

.markdown-body img[align=left] {
  padding-right: 20px;
}

.markdown-body video {
  max-width: 100%;
  box-sizing: initial;
  background-color: var(--videoBackground);
}

.markdown-body .emoji {
  max-width: none;
  vertical-align: text-top;
  background-color: initial;
}

.markdown-body span.frame {
  display: block;
  overflow: hidden;
}

.markdown-body span.frame > span {
  display: block;
  float: left;
  width: auto;
  padding: 7px;
  margin: 13px 0 0;
  overflow: hidden;
  border: 1px solid var(--frame-border);
}

.markdown-body span.frame span img {
  display: block;
  float: left;
}

.markdown-body span.frame span span {
  display: block;
  padding: 5px 0 0;
  clear: both;
  color: var(--frame-color);
}

.markdown-body span.align-center {
  display: block;
  overflow: hidden;
  clear: both;
}

.markdown-body span.align-center > span {
  display: block;
  margin: 13px auto 0;
  overflow: hidden;
  text-align: center;
}

.markdown-body span.align-center span img {
  margin: 0 auto;
  text-align: center;
}

.markdown-body span.align-right {
  display: block;
  overflow: hidden;
  clear: both;
}

.markdown-body span.align-right > span {
  display: block;
  margin: 13px 0 0;
  overflow: hidden;
  text-align: right;
}

.markdown-body span.align-right span img {
  margin: 0;
  text-align: right;
}

.markdown-body span.float-left {
  display: block;
  float: left;
  margin-right: 13px;
  overflow: hidden;
}

.markdown-body span.float-left span {
  margin: 13px 0 0;
}

.markdown-body span.float-right {
  display: block;
  float: right;
  margin-left: 13px;
  overflow: hidden;
}

.markdown-body span.float-right > span {
  display: block;
  margin: 13px auto 0;
  overflow: hidden;
  text-align: right;
}

.markdown-body code, .markdown-body tt {
  padding: .2em .4em;
  margin: 0;
  font-size: 85%;
  background-color: var(--code-background);
  border-radius: 6px;
}

.markdown-body code br, .markdown-body tt br {
  display: none;
}

.markdown-body del code {
  text-decoration: inherit;
}

.markdown-body pre {
  word-wrap: normal;
}

.markdown-body pre > code {
  padding: 0;
  margin: 0;
  font-size: 100%;
  word-break: normal;
  white-space: pre;
  background: transparent;
  border: 0;
}

.markdown-body .highlight {
  margin-bottom: 16px;
}

.markdown-body .highlight pre {
  margin-bottom: 0;
  word-break: normal;
}

.markdown-body .highlight pre, .markdown-body pre {
  padding: 16px;
  overflow: auto;
  font-size: 85%;
  line-height: 1.45;
  background-color: var(--pre-background);
  border-radius: 6px;
}

.markdown-body pre code, .markdown-body pre tt {
  display: inline;
  max-width: auto;
  padding: 0;
  margin: 0;
  overflow: visible;
  line-height: inherit;
  word-wrap: normal;
  background-color: initial;
  border: 0;
}

.markdown-body .csv-data td, .markdown-body .csv-data th {
  padding: 5px;
  overflow: hidden;
  font-size: 12px;
  line-height: 1;
  text-align: left;
  white-space: nowrap;
}

.markdown-body .csv-data .blob-num {
  padding: 10px 8px 9px;
  text-align: right;
  background: var(--background);
  border: 0;
}

.markdown-body .csv-data tr {
  border-top: 0;
}

.markdown-body .csv-data th {
  font-weight: 600;
  background: var(--thead-background);
  border-top: 0;
}

.open.octicon, .draft.octicon, .closed.octicon, .merged.octicon, .color-text-secondary.octicon {
  display: inline-block;
  margin-top: 0.15em;
  vertical-align: text-top;
  fill: currentColor;
  width: 1em;
  height: 1em;
  font: -apple-system-body;
}

.open.octicon {
  color: var(--color-icon-success);
}

.draft.octicon {
  color: var(--textTertiary);
}

.closed.octicon {
  color: var(--color-text-danger);
}

.merged.octicon {
  color: var(--purple-500);
}

.color-text-secondary.octicon {
  color: var(--textSecondary);
}

.reference {
  white-space: nowrap;
}

.issue-link {
  font-weight: 600;
  color: var(--mention-color);
  white-space: normal;
}

.issue-shorthand {
  font-weight: 400;
  color: var(--textTertiary);
}

.mr-1 {
  margin-right: 4px;
}

.ml-1 {
  margin-left: 4px;
}

.d-inline-block {
  display: inline-block;
}

.v-align-middle {
  vertical-align: middle;
}

.Box {
  border-radius: 6px;
}


================================================
FILE: app/src/main/assets/webview/syntax.css
================================================
/* From https://github.com/primer/github-syntax-light/blob/master/lib/github-light.css */
.pl-c /* comment, punctuation.definition.comment, string.comment */ {
  color: #6a737d;
}

.pl-c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header, meta.output */,
.pl-s .pl-v /* string variable */ {
  color: #005cc5;
}

.pl-e /* entity */,
.pl-en /* entity.name */ {
  color: #6f42c1;
}

.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
.pl-s .pl-s1 /* string source */ {
  color: #24292e;
}

.pl-ent /* entity.name.tag, markup.quote */ {
  color: #22863a;
}

.pl-k /* keyword, storage, storage.type */ {
  color: #d73a49;
}

.pl-s /* string */,
.pl-pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */,
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
.pl-sr /* string.regexp */,
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */,
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ {
  color: #032f62;
}

.pl-v /* variable */,
.pl-smw /* sublimelinter.mark.warning */ {
  color: #e36209;
}

.pl-bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ {
  color: #b31d28;
}

.pl-ii /* invalid.illegal */ {
  color: #fafbfc;
  background-color: #b31d28;
}

.pl-c2 /* carriage-return */ {
  color: #fafbfc;
  background-color: #d73a49;
}

.pl-c2::before /* carriage-return */ {
  content: "^M";
}

.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
  font-weight: bold;
  color: #22863a;
}

.pl-ml /* markup.list */ {
  color: #735c0f;
}

.pl-mh /* markup.heading */,
.pl-mh .pl-en /* markup.heading entity.name */,
.pl-ms /* meta.separator */ {
  font-weight: bold;
  color: #005cc5;
}

.pl-mi /* markup.italic */ {
  font-style: italic;
  color: #24292e;
}

.pl-mb /* markup.bold */ {
  font-weight: bold;
  color: #24292e;
}

.pl-md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ {
  color: #b31d28;
  background-color: #ffeef0;
}

.pl-mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ {
  color: #22863a;
  background-color: #f0fff4;
}

.pl-mc /* markup.changed, punctuation.definition.changed */ {
  color: #e36209;
  background-color: #ffebda;
}

.pl-mi2 /* markup.ignored, markup.untracked */ {
  color: #f6f8fa;
  background-color: #005cc5;
}

.pl-mdr /* meta.diff.range */ {
  font-weight: bold;
  color: #6f42c1;
}

.pl-ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ {
  color: #586069;
}

.pl-sg /* sublimelinter.gutter-mark */ {
  color: #959da5;
}

.pl-corl /* constant.other.reference.link, string.other.link */ {
  text-decoration: underline;
  color: #032f62;
}


================================================
FILE: app/src/main/assets/webview/syntax_dark.css
================================================
/* From https://github.com/primer/github-syntax-dark/blob/master/lib/github-dark.css */
.pl-c /* comment, punctuation.definition.comment, string.comment */ {
  color: #959da5;
}

.pl-c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.quote, markup.raw, meta.diff.header */,
.pl-s .pl-v /* string variable */ {
  color: #c8e1ff;
}

.pl-e /* entity */,
.pl-en /* entity.name */ {
  color: #b392f0;
}

.pl-smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
.pl-s .pl-s1 /* string source */ {
  color: #f6f8fa;
}

.pl-ent /* entity.name.tag */ {
  color: #7bcc72;
}

.pl-k /* keyword, storage, storage.type */ {
  color: #ea4a5a;
}

.pl-s /* string */,
.pl-pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */,
.pl-s .pl-pse .pl-s1 /* string punctuation.section.embedded source */,
.pl-sr /* string.regexp */,
.pl-sr .pl-cce /* string.regexp constant.character.escape */,
.pl-sr .pl-sre /* string.regexp source.ruby.embedded */,
.pl-sr .pl-sra /* string.regexp string.regexp.arbitrary-repitition */ {
  color: #79b8ff;
}

.pl-v /* variable */,
.pl-ml /* markup.list, sublimelinter.mark.warning */ {
  color: #fb8532;
}

.pl-bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ {
  color: #d73a49;
}

.pl-ii /* invalid.illegal */ {
  color: #fafbfc;
  background-color: #d73a49;
}

.pl-c2 /* carriage-return */ {
  color: #fafbfc;
  background-color: #d73a49;
}

.pl-c2::before /* carriage-return */ {
  content: "^M";
}

.pl-sr .pl-cce /* string.regexp constant.character.escape */ {
  font-weight: bold;
  color: #7bcc72;
}

.pl-mh /* markup.heading */,
.pl-mh .pl-en /* markup.heading entity.name */,
.pl-ms /* meta.separator */ {
  font-weight: bold;
  color: #0366d6;
}

.pl-mi /* markup.italic */ {
  font-style: italic;
  color: #f6f8fa;
}

.pl-mb /* markup.bold */ {
  font-weight: bold;
  color: #f6f8fa;
}

.pl-md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ {
  color: #ffdcd7;
  background-color: #67060c;
}

.pl-mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ {
  color: #aff5b4;
  background-color: #033a16;
}

.pl-mc /* markup.changed, punctuation.definition.changed */ {
  color: #b08800;
  background-color: #fffdef;
}

.pl-mi2 /* markup.ignored, markup.untracked */ {
  color: #2f363d;
  background-color: #959da5;
}

.pl-mdr /* meta.diff.range */ {
  font-weight: bold;
  color: #b392f0;
}

.pl-mo /* meta.output */ {
  color: #0366d6;
}

.pl-ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ {
  color: #ffeef0;
}

.pl-sg /* sublimelinter.gutter-mark */ {
  color: #6a737d;
}

.pl-corl /* constant.other.reference.link, string.other.link */ {
  text-decoration: underline;
  color: #79b8ff;
}


================================================
FILE: app/src/main/assets/webview/template.html
================================================
<!DOCTYPE html>
<html dir="@dir@">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta name="HandheldFriendly" content="true">
    <link rel="stylesheet" type="text/css" href="file:///android_asset/webview/colors_light.css"/>
    <link rel="stylesheet" type="text/css" href="file:///android_asset/webview/markdown.css"/>
    <link rel="stylesheet" type="text/css" href="file:///android_asset/webview/syntax.css"/>
</head>
<body>
    <main id="content" class="markdown-body">@body@</main>
</body>
</html>


================================================
FILE: app/src/main/assets/webview/template_dark.html
================================================
<!DOCTYPE html>
<html dir="@dir@">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta name="HandheldFriendly" content="true">
    <link rel="stylesheet" type="text/css" href="file:///android_asset/webview/colors_dark.css"/>
    <link rel="stylesheet" type="text/css" href="file:///android_asset/webview/markdown.css"/>
    <link rel="stylesheet" type="text/css" href="file:///android_asset/webview/syntax_dark.css"/>
</head>
<body>
    <main id="content" class="markdown-body">@body@</main>
</body>
</html>


================================================
FILE: app/src/main/java/com/google/android/material/appbar/SubtitleCollapsingToolbarLayout.java
================================================
package com.google.android.material.appbar;

import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.FrameLayout;

import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.StyleRes;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.core.math.MathUtils;
import androidx.core.view.GravityCompat;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.google.android.material.animation.AnimationUtils;
import com.google.android.material.internal.DescendantOffsetUtils;
import com.google.android.material.internal.SubtitleCollapsingTextHelper;
import com.google.android.material.internal.ThemeEnforcement;

import org.lsposed.manager.R;

/**
 * @see CollapsingToolbarLayout
 */
public class SubtitleCollapsingToolbarLayout extends FrameLayout {

    private static final int DEFAULT_SCRIM_ANIMATION_DURATION = 600;

    private boolean refreshToolbar = true;
    private int toolbarId;
    @Nullable
    private Toolbar toolbar;
    @Nullable
    private View toolbarDirectChild;
    private View dummyView;

    private int expandedMarginStart;
    private int expandedMarginTop;
    private int expandedMarginEnd;
    private int expandedMarginBottom;

    private final Rect tmpRect = new Rect();
    @NonNull
    final SubtitleCollapsingTextHelper collapsingTextHelper;
    private boolean collapsingTitleEnabled;
    private boolean drawCollapsingTitle;

    @Nullable
    private Drawable contentScrim;
    @Nullable
    Drawable statusBarScrim;
    private int scrimAlpha;
    private boolean scrimsAreShown;
    private ValueAnimator scrimAnimator;
    private long scrimAnimationDuration;
    private int scrimVisibleHeightTrigger = -1;

    private AppBarLayout.OnOffsetChangedListener onOffsetChangedListener;

    int currentOffset;

    @Nullable
    WindowInsetsCompat lastInsets;

    public SubtitleCollapsingToolbarLayout(@NonNull Context context) {
        this(context, null);
    }

    public SubtitleCollapsingToolbarLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SubtitleCollapsingToolbarLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        collapsingTextHelper = new SubtitleCollapsingTextHelper(this);
        collapsingTextHelper.setTextSizeInterpolator(AnimationUtils.DECELERATE_INTERPOLATOR);
        collapsingTextHelper.setRtlTextDirectionHeuristicsEnabled(false);

        TypedArray a = ThemeEnforcement.obtainStyledAttributes(
                context,
                attrs,
                R.styleable.SubtitleCollapsingToolbarLayout,
                defStyleAttr,
                R.style.Widget_Design_SubtitleCollapsingToolbar);

        collapsingTextHelper.setExpandedTextGravity(a.getInt(
                R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleGravity,
                GravityCompat.START | Gravity.BOTTOM));
        collapsingTextHelper.setCollapsedTextGravity(a.getInt(
                R.styleable.SubtitleCollapsingToolbarLayout_collapsedTitleGravity,
                GravityCompat.START | Gravity.CENTER_VERTICAL));

        expandedMarginStart = expandedMarginTop = expandedMarginEnd = expandedMarginBottom =
                a.getDimensionPixelSize(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMargin, 0);

        if (a.hasValue(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMarginStart)) {
            expandedMarginStart =
                    a.getDimensionPixelSize(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMarginStart, 0);
        }
        if (a.hasValue(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMarginEnd)) {
            expandedMarginEnd =
                    a.getDimensionPixelSize(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMarginEnd, 0);
        }
        if (a.hasValue(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMarginTop)) {
            expandedMarginTop =
                    a.getDimensionPixelSize(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMarginTop, 0);
        }
        if (a.hasValue(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMarginBottom)) {
            expandedMarginBottom =
                    a.getDimensionPixelSize(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleMarginBottom, 0);
        }

        collapsingTitleEnabled = a.getBoolean(R.styleable.SubtitleCollapsingToolbarLayout_titleEnabled, true);
        setTitle(a.getText(R.styleable.SubtitleCollapsingToolbarLayout_title));
        setSubtitle(a.getText(R.styleable.SubtitleCollapsingToolbarLayout_subtitle));

        // First load the default text appearances
        collapsingTextHelper.setExpandedTitleTextAppearance(
                R.style.TextAppearance_Design_SubtitleCollapsingToolbar_ExpandedTitle);
        collapsingTextHelper.setCollapsedTitleTextAppearance(
                androidx.appcompat.R.style.TextAppearance_AppCompat_Widget_ActionBar_Title);
        collapsingTextHelper.setExpandedSubtitleTextAppearance(
                R.style.TextAppearance_Design_SubtitleCollapsingToolbar_ExpandedSubtitle);
        collapsingTextHelper.setCollapsedSubtitleTextAppearance(
                androidx.appcompat.R.style.TextAppearance_AppCompat_Widget_ActionBar_Subtitle);

        // Now overlay any custom text appearances
        if (a.hasValue(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleTextAppearance)) {
            collapsingTextHelper.setExpandedTitleTextAppearance(
                    a.getResourceId(R.styleable.SubtitleCollapsingToolbarLayout_expandedTitleTextAppearance, 0));
        }
        if (a.hasValue(R.styleable.SubtitleCollapsingToolbarLayout_collapsedTitleTextAppearance)) {
            collapsingTextHelper.setCollapsedTitleTextAppearance(
                    a.getResourceId(R.styleable.SubtitleCollapsingToolbarLayout_collapsedTitleTextAppearance, 0));
        }
        if (a.hasValue(R.styleable.SubtitleCollapsingToolbarLayout_expandedSubtitleTextAppearance)) {
            collapsingTextHelper.setExpandedSubtitleTextAppearance(
                    a.getResourceId(R.styleable.SubtitleCollapsingToolbarLayout_expandedSubtitleTextAppearance, 0));
        }
        if (a.hasValue(R.styleable.SubtitleCollapsingToolbarLayout_collapsedSubtitleTextAppearance)) {
            collapsingTextHelper.setCollapsedSubtitleTextAppearance(
                    a.getResourceId(R.styleable.SubtitleCollapsingToolbarLayout_collapsedSubtitleTextAppearance, 0));
        }

        scrimVisibleHeightTrigger = a
                .getDimensionPixelSize(R.styleable.SubtitleCollapsingToolbarLayout_scrimVisibleHeightTrigger, -1);

        scrimAnimationDuration = a.getInt(
                R.styleable.SubtitleCollapsingToolbarLayout_scrimAnimationDuration,
                DEFAULT_SCRIM_ANIMATION_DURATION);

        setContentScrim(a.getDrawable(R.styleable.SubtitleCollapsingToolbarLayout_contentScrim));
        setStatusBarScrim(a.getDrawable(R.styleable.SubtitleCollapsingToolbarLayout_statusBarScrim));

        toolbarId = a.getResourceId(R.styleable.SubtitleCollapsingToolbarLayout_toolbarId, -1);

        a.recycle();

        setWillNotDraw(false);
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();

        // Add an OnOffsetChangedListener if possible
        final ViewParent parent = getParent();
        if (parent instanceof AppBarLayout) {
            // Copy over from the ABL whether we should fit system windows
            ViewCompat.setFitsSystemWindows(this, ViewCompat.getFitsSystemWindows((View) parent));

            if (onOffsetChangedListener == null) {
                onOffsetChangedListener = new OffsetUpdateListener();
            }
            ((AppBarLayout) parent).addOnOffsetChangedListener(onOffsetChangedListener);

            // We're attached, so lets request an inset dispatch
            ViewCompat.requestApplyInsets(this);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        // Remove our OnOffsetChangedListener if possible and it exists
        final ViewParent parent = getParent();
        if (onOffsetChangedListener != null && parent instanceof AppBarLayout) {
            ((AppBarLayout) parent).removeOnOffsetChangedListener(onOffsetChangedListener);
        }

        super.onDetachedFromWindow();
    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        super.draw(canvas);

        // If we don't have a toolbar, the scrim will be not be drawn in drawChild() below.
        // Instead, we draw it here, before our collapsing text.
        ensureToolbar();
        if (toolbar == null && contentScrim != null && scrimAlpha > 0) {
            contentScrim.mutate().setAlpha(scrimAlpha);
            contentScrim.draw(canvas);
        }

        // Let the collapsing text helper draw its text
        if (collapsingTitleEnabled && drawCollapsingTitle) {
            collapsingTextHelper.draw(canvas);
        }

        // Now draw the status bar scrim
        if (statusBarScrim != null && scrimAlpha > 0) {
            final int topInset = lastInsets != null ? lastInsets.getSystemWindowInsetTop() : 0;
            if (topInset > 0) {
                statusBarScrim.setBounds(0, -currentOffset, getWidth(), topInset - currentOffset);
                statusBarScrim.mutate().setAlpha(scrimAlpha);
                statusBarScrim.draw(canvas);
            }
        }
    }

    @Override
    protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
        // This is a little weird. Our scrim needs to be behind the Toolbar (if it is present),
        // but in front of any other children which are behind it. To do this we intercept the
        // drawChild() call, and draw our scrim just before the Toolbar is drawn
        boolean invalidated = false;
        if (contentScrim != null && scrimAlpha > 0 && isToolbarChild(child)) {
            contentScrim.mutate().setAlpha(scrimAlpha);
            contentScrim.draw(canvas);
            invalidated = true;
        }
        return super.drawChild(canvas, child, drawingTime) || invalidated;
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        if (contentScrim != null) {
            contentScrim.setBounds(0, 0, w, h);
        }
    }

    private void ensureToolbar() {
        if (!refreshToolbar) {
            return;
        }

        // First clear out the current Toolbar
        this.toolbar = null;
        toolbarDirectChild = null;

        if (toolbarId != -1) {
            // If we have an ID set, try and find it and it's direct parent to us
            this.toolbar = findViewById(toolbarId);
            if (this.toolbar != null) {
                toolbarDirectChild = findDirectChild(this.toolbar);
            }
        }

        if (this.toolbar == null) {
            // If we don't have an ID, or couldn't find a Toolbar with the correct ID, try and find
            // one from our direct children
            Toolbar toolbar = null;
            for (int i = 0, count = getChildCount(); i < count; i++) {
                final View child = getChildAt(i);
                if (child instanceof Toolbar) {
                    toolbar = (Toolbar) child;
                    break;
                }
            }
            this.toolbar = toolbar;
        }

        updateDummyView();
        refreshToolbar = false;
    }

    private boolean isToolbarChild(View child) {
        return (toolbarDirectChild == null || toolbarDirectChild == this)
                ? child == toolbar
                : child == toolbarDirectChild;
    }

    /**
     * Returns the direct child of this layout, which itself is the ancestor of the given view.
     */
    @NonNull
    private View findDirectChild(@NonNull final View descendant) {
        View directChild = descendant;
        for (ViewParent p = descendant.getParent(); p != this && p != null; p = p.getParent()) {
            if (p instanceof View) {
                directChild = (View) p;
            }
        }
        return directChild;
    }

    private void updateDummyView() {
        if (!collapsingTitleEnabled && dummyView != null) {
            // If we have a dummy view and we have our title disabled, remove it from its parent
            final ViewParent parent = dummyView.getParent();
            if (parent instanceof ViewGroup) {
                ((ViewGroup) parent).removeView(dummyView);
            }
        }
        if (collapsingTitleEnabled && toolbar != null) {
            if (dummyView == null) {
                dummyView = new View(getContext());
            }
            if (dummyView.getParent() == null) {
                toolbar.addView(dummyView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            }
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        ensureToolbar();
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        final int mode = MeasureSpec.getMode(heightMeasureSpec);
        final int topInset = lastInsets != null ? lastInsets.getSystemWindowInsetTop() : 0;
        if (mode == MeasureSpec.UNSPECIFIED && topInset > 0) {
            // If we have a top inset and we're set to wrap_content height we need to make sure
            // we add the top inset to our height, therefore we re-measure
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredHeight() + topInset, MeasureSpec.EXACTLY);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }

        // Set our minimum height to enable proper AppBarLayout collapsing
        if (toolbar != null) {
            if (toolbarDirectChild == null || toolbarDirectChild == this) {
                setMinimumHeight(getHeightWithMargins(toolbar));
            } else {
                setMinimumHeight(getHeightWithMargins(toolbarDirectChild));
            }
        }
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        if (lastInsets != null) {
            // Shift down any views which are not set to fit system windows
            final int insetTop = lastInsets.getSystemWindowInsetTop();
            for (int i = 0, z = getChildCount(); i < z; i++) {
                final View child = getChildAt(i);
                if (!ViewCompat.getFitsSystemWindows(child)) {
                    if (child.getTop() < insetTop) {
                        // If the child isn't set to fit system windows but is drawing within
                        // the inset offset it down
                        ViewCompat.offsetTopAndBottom(child, insetTop);
                    }
                }
            }
        }

        // Update our child view offset helpers so that they track the correct layout coordinates
        for (int i = 0, z = getChildCount(); i < z; i++) {
            getViewOffsetHelper(getChildAt(i)).onViewLayout();
        }

        // Update the collapsed bounds by getting its transformed bounds
        if (collapsingTitleEnabled && dummyView != null) {
            // We only draw the title if the dummy view is being displayed (Toolbar removes
            // views if there is no space)
            drawCollapsingTitle = ViewCompat.isAttachedToWindow(dummyView) && dummyView.getVisibility() == VISIBLE;

            if (drawCollapsingTitle) {
                final boolean isRtl = ViewCompat.getLayoutDirection(this) == ViewCompat.LAYOUT_DIRECTION_RTL;

                // Update the collapsed bounds
                final int maxOffset =
                        getMaxOffsetForPinChild(toolbarDirectChild != null ? toolbarDirectChild : toolbar);
                DescendantOffsetUtils.getDescendantRect(this, dummyView, tmpRect);
                collapsingTextHelper.setCollapsedBounds(
                        tmpRect.left + (isRtl ? toolbar.getTitleMarginEnd() : toolbar.getTitleMarginStart()),
                        tmpRect.top + maxOffset + toolbar.getTitleMarginTop(),
                        tmpRect.right - (isRtl ? toolbar.getTitleMarginStart() : toolbar.getTitleMarginEnd()),
                        tmpRect.bottom + maxOffset - toolbar.getTitleMarginBottom());

                // Update the expanded bounds
                collapsingTextHelper.setExpandedBounds(
                        isRtl ? expandedMarginEnd : expandedMarginStart,
                        tmpRect.top + expandedMarginTop,
                        right - left - (isRtl ? expandedMarginStart : expandedMarginEnd),
                        bottom - top - expandedMarginBottom);
                // Now recalculate using the new bounds
                collapsingTextHelper.recalculate();
            }
        }

        if (toolbar != null) {
            if (collapsingTitleEnabled && TextUtils.isEmpty(collapsingTextHelper.getTitle())) {
                // If we do not currently have a title, try and grab it from the Toolbar
                setTitle(toolbar.getTitle());
                setSubtitle(toolbar.getSubtitle());
            }
        }

        updateScrimVisibility();

        // Apply any view offsets, this should be done at the very end of layout
        for (int i = 0, z = getChildCount(); i < z; i++) {
            getViewOffsetHelper(getChildAt(i)).applyOffsets();
        }
    }

    private static int getHeightWithMargins(@NonNull final View view) {
        final ViewGroup.LayoutParams lp = view.getLayoutParams();
        if (lp instanceof MarginLayoutParams) {
            final MarginLayoutParams mlp = (MarginLayoutParams) lp;
            return view.getMeasuredHeight() + mlp.topMargin + mlp.bottomMargin;
        }
        return view.getMeasuredHeight();
    }

    static ViewOffsetHelper getViewOffsetHelper(View view) {
        ViewOffsetHelper offsetHelper = (ViewOffsetHelper) view.getTag(com.google.android.material.R.id.view_offset_helper);
        if (offsetHelper == null) {
            offsetHelper = new ViewOffsetHelper(view);
            view.setTag(com.google.android.material.R.id.view_offset_helper, offsetHelper);
        }
        return offsetHelper;
    }

    /**
     * Sets the title to be displayed by this view, if enabled.
     *
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_title
     * @see #setTitleEnabled(boolean)
     * @see #getTitle()
     */
    public void setTitle(@Nullable CharSequence title) {
        collapsingTextHelper.setTitle(title);
        updateContentDescriptionFromTitle();
    }

    /**
     * Returns the title currently being displayed by this view. If the title is not enabled, then
     * this will return {@code null}.
     *
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_title
     */
    @Nullable
    public CharSequence getTitle() {
        return collapsingTitleEnabled ? collapsingTextHelper.getTitle() : null;
    }

    /**
     * Sets the subtitle to be displayed by this view, if enabled.
     *
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_subtitle
     * @see #setTitleEnabled(boolean)
     * @see #getSubtitle()
     */
    public void setSubtitle(@Nullable CharSequence subtitle) {
        collapsingTextHelper.setSubtitle(subtitle);
        updateContentDescriptionFromTitle();
    }

    /**
     * Returns the subtitle currently being displayed by this view. If the title is not enabled, then
     * this will return {@code null}.
     *
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_subtitle
     */
    @Nullable
    public CharSequence getSubtitle() {
        return collapsingTitleEnabled ? collapsingTextHelper.getSubtitle() : null;
    }

    /**
     * Sets whether this view should display its own title and subtitle.
     * <p>
     * <p>The title and subtitle displayed by this view will shrink and grow based on the scroll offset.
     *
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_titleEnabled
     * @see #setTitle(CharSequence)
     * @see #setSubtitle(CharSequence)
     * @see #isTitleEnabled()
     */
    public void setTitleEnabled(boolean enabled) {
        if (enabled != collapsingTitleEnabled) {
            collapsingTitleEnabled = enabled;
            updateContentDescriptionFromTitle();
            updateDummyView();
            requestLayout();
        }
    }

    /**
     * Returns whether this view is currently displaying its own title and subtitle.
     *
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_titleEnabled
     * @see #setTitleEnabled(boolean)
     */
    public boolean isTitleEnabled() {
        return collapsingTitleEnabled;
    }

    /**
     * Set whether the content scrim and/or status bar scrim should be shown or not. Any change in the
     * vertical scroll may overwrite this value. Any visibility change will be animated if this view
     * has already been laid out.
     *
     * @param shown whether the scrims should be shown
     * @see #getStatusBarScrim()
     * @see #getContentScrim()
     */
    public void setScrimsShown(boolean shown) {
        setScrimsShown(shown, ViewCompat.isLaidOut(this) && !isInEditMode());
    }

    /**
     * Set whether the content scrim and/or status bar scrim should be shown or not. Any change in the
     * vertical scroll may overwrite this value.
     *
     * @param shown   whether the scrims should be shown
     * @param animate whether to animate the visibility change
     * @see #getStatusBarScrim()
     * @see #getContentScrim()
     */
    public void setScrimsShown(boolean shown, boolean animate) {
        if (scrimsAreShown != shown) {
            if (animate) {
                animateScrim(shown ? 0xFF : 0x0);
            } else {
                setScrimAlpha(shown ? 0xFF : 0x0);
            }
            scrimsAreShown = shown;
        }
    }

    private void animateScrim(int targetAlpha) {
        ensureToolbar();
        if (scrimAnimator == null) {
            scrimAnimator = new ValueAnimator();
            scrimAnimator.setDuration(scrimAnimationDuration);
            scrimAnimator.setInterpolator(targetAlpha > scrimAlpha
                    ? AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR
                    : AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR);
            scrimAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animator) {
                    setScrimAlpha((int) animator.getAnimatedValue());
                }
            });
        } else if (scrimAnimator.isRunning()) {
            scrimAnimator.cancel();
        }

        scrimAnimator.setIntValues(scrimAlpha, targetAlpha);
        scrimAnimator.start();
    }

    void setScrimAlpha(int alpha) {
        if (alpha != scrimAlpha) {
            final Drawable contentScrim = this.contentScrim;
            if (contentScrim != null && toolbar != null) {
                ViewCompat.postInvalidateOnAnimation(toolbar);
            }
            scrimAlpha = alpha;
            ViewCompat.postInvalidateOnAnimation(SubtitleCollapsingToolbarLayout.this);
        }
    }

    int getScrimAlpha() {
        return scrimAlpha;
    }

    /**
     * Set the drawable to use for the content scrim from resources. Providing null will disable the
     * scrim functionality.
     *
     * @param drawable the drawable to display
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_contentScrim
     * @see #getContentScrim()
     */
    public void setContentScrim(@Nullable Drawable drawable) {
        if (contentScrim != drawable) {
            if (contentScrim != null) {
                contentScrim.setCallback(null);
            }
            contentScrim = drawable != null ? drawable.mutate() : null;
            if (contentScrim != null) {
                contentScrim.setBounds(0, 0, getWidth(), getHeight());
                contentScrim.setCallback(this);
                contentScrim.setAlpha(scrimAlpha);
            }
            ViewCompat.postInvalidateOnAnimation(this);
        }
    }

    /**
     * Set the color to use for the content scrim.
     *
     * @param color the color to display
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_contentScrim
     * @see #getContentScrim()
     */
    public void setContentScrimColor(@ColorInt int color) {
        setContentScrim(new ColorDrawable(color));
    }

    /**
     * Set the drawable to use for the content scrim from resources.
     *
     * @param resId drawable resource id
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_contentScrim
     * @see #getContentScrim()
     */
    public void setContentScrimResource(@DrawableRes int resId) {
        setContentScrim(ContextCompat.getDrawable(getContext(), resId));
    }

    /**
     * Returns the drawable which is used for the foreground scrim.
     *
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_contentScrim
     * @see #setContentScrim(Drawable)
     */
    @Nullable
    public Drawable getContentScrim() {
        return contentScrim;
    }

    /**
     * Set the drawable to use for the status bar scrim from resources. Providing null will disable
     * the scrim functionality.
     * <p>
     * <p>This scrim is only shown when we have been given a top system inset.
     *
     * @param drawable the drawable to display
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_statusBarScrim
     * @see #getStatusBarScrim()
     */
    public void setStatusBarScrim(@Nullable Drawable drawable) {
        if (statusBarScrim != drawable) {
            if (statusBarScrim != null) {
                statusBarScrim.setCallback(null);
            }
            statusBarScrim = drawable != null ? drawable.mutate() : null;
            if (statusBarScrim != null) {
                if (statusBarScrim.isStateful()) {
                    statusBarScrim.setState(getDrawableState());
                }
                DrawableCompat.setLayoutDirection(statusBarScrim, ViewCompat.getLayoutDirection(this));
                statusBarScrim.setVisible(getVisibility() == VISIBLE, false);
                statusBarScrim.setCallback(this);
                statusBarScrim.setAlpha(scrimAlpha);
            }
            ViewCompat.postInvalidateOnAnimation(this);
        }
    }

    @Override
    protected void drawableStateChanged() {
        super.drawableStateChanged();

        final int[] state = getDrawableState();
        boolean changed = false;

        Drawable d = statusBarScrim;
        if (d != null && d.isStateful()) {
            changed |= d.setState(state);
        }
        d = contentScrim;
        if (d != null && d.isStateful()) {
            changed |= d.setState(state);
        }
        if (collapsingTextHelper != null) {
            changed |= collapsingTextHelper.setState(state);
        }

        if (changed) {
            invalidate();
        }
    }

    @Override
    protected boolean verifyDrawable(Drawable who) {
        return super.verifyDrawable(who) || who == contentScrim || who == statusBarScrim;
    }

    @Override
    public void setVisibility(int visibility) {
        super.setVisibility(visibility);

        final boolean visible = visibility == VISIBLE;
        if (statusBarScrim != null && statusBarScrim.isVisible() != visible) {
            statusBarScrim.setVisible(visible, false);
        }
        if (contentScrim != null && contentScrim.isVisible() != visible) {
            contentScrim.setVisible(visible, false);
        }
    }

    /**
     * Set the color to use for the status bar scrim.
     * <p>
     * <p>This scrim is only shown when we have been given a top system inset.
     *
     * @param color the color to display
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_statusBarScrim
     * @see #getStatusBarScrim()
     */
    public void setStatusBarScrimColor(@ColorInt int color) {
        setStatusBarScrim(new ColorDrawable(color));
    }

    /**
     * Set the drawable to use for the content scrim from resources.
     *
     * @param resId drawable resource id
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_statusBarScrim
     * @see #getStatusBarScrim()
     */
    public void setStatusBarScrimResource(@DrawableRes int resId) {
        setStatusBarScrim(ContextCompat.getDrawable(getContext(), resId));
    }

    /**
     * Returns the drawable which is used for the status bar scrim.
     *
     * @attr ref R.styleable#SubtitleCollapsingToolbarLayout_statusBarScrim
     * @see #setStatusBarScrim(Drawable)
     */
    @Nullable
    public Drawable getStatusBarScrim() {
        return statusBarScrim;
    }

    /**
     * Sets the text color and size for the collapsed title from the specified TextAppearance
     * resource.
     *
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_collapsedTitleTextAppearance
     */
    public void setCollapsedTitleTextAppearance(@StyleRes int resId) {
        collapsingTextHelper.setCollapsedTitleTextAppearance(resId);
    }

    /**
     * Sets the text color of the collapsed title.
     *
     * @param color The new text color in ARGB format
     */
    public void setCollapsedTitleTextColor(@ColorInt int color) {
        setCollapsedTitleTextColor(ColorStateList.valueOf(color));
    }

    /**
     * Sets the text colors of the collapsed title.
     *
     * @param colors ColorStateList containing the new text colors
     */
    public void setCollapsedTitleTextColor(@NonNull ColorStateList colors) {
        collapsingTextHelper.setCollapsedTitleTextColor(colors);
    }

    /**
     * Sets the text color and size for the collapsed subtitle from the specified TextAppearance
     * resource.
     *
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_collapsedSubtitleTextAppearance
     */
    public void setCollapsedSubtitleTextAppearance(@StyleRes int resId) {
        collapsingTextHelper.setCollapsedSubtitleTextAppearance(resId);
    }

    /**
     * Sets the text color of the collapsed subtitle.
     *
     * @param color The new text color in ARGB format
     */
    public void setCollapsedSubtitleTextColor(@ColorInt int color) {
        setCollapsedSubtitleTextColor(ColorStateList.valueOf(color));
    }

    /**
     * Sets the text colors of the collapsed subtitle.
     *
     * @param colors ColorStateList containing the new text colors
     */
    public void setCollapsedSubtitleTextColor(@NonNull ColorStateList colors) {
        collapsingTextHelper.setCollapsedSubtitleTextColor(colors);
    }

    /**
     * Sets the horizontal alignment of the collapsed title and the vertical gravity that will be used
     * when there is extra space in the collapsed bounds beyond what is required for the title itself.
     *
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_collapsedTitleGravity
     */
    public void setCollapsedTitleGravity(int gravity) {
        collapsingTextHelper.setCollapsedTextGravity(gravity);
    }

    /**
     * Returns the horizontal and vertical alignment for title when collapsed.
     *
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_collapsedTitleGravity
     */
    public int getCollapsedTitleGravity() {
        return collapsingTextHelper.getCollapsedTextGravity();
    }

    /**
     * Sets the text color and size for the expanded title from the specified TextAppearance resource.
     *
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleTextAppearance
     */
    public void setExpandedTitleTextAppearance(@StyleRes int resId) {
        collapsingTextHelper.setExpandedTitleTextAppearance(resId);
    }

    /**
     * Sets the text color of the expanded title.
     *
     * @param color The new text color in ARGB format
     */
    public void setExpandedTitleTextColor(@ColorInt int color) {
        setExpandedTitleTextColor(ColorStateList.valueOf(color));
    }

    /**
     * Sets the text colors of the expanded title.
     *
     * @param colors ColorStateList containing the new text colors
     */
    public void setExpandedTitleTextColor(@NonNull ColorStateList colors) {
        collapsingTextHelper.setExpandedTitleTextColor(colors);
    }

    /**
     * Sets the text color and size for the expanded subtitle from the specified TextAppearance resource.
     *
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedSubtitleTextAppearance
     */
    public void setExpandedSubtitleTextAppearance(@StyleRes int resId) {
        collapsingTextHelper.setExpandedSubtitleTextAppearance(resId);
    }

    /**
     * Sets the text color of the expanded subtitle.
     *
     * @param color The new text color in ARGB format
     */
    public void setExpandedSubtitleTextColor(@ColorInt int color) {
        setExpandedSubtitleTextColor(ColorStateList.valueOf(color));
    }

    /**
     * Sets the text colors of the expanded subtitle.
     *
     * @param colors ColorStateList containing the new text colors
     */
    public void setExpandedSubtitleTextColor(@NonNull ColorStateList colors) {
        collapsingTextHelper.setExpandedSubtitleTextColor(colors);
    }

    /**
     * Sets the horizontal alignment of the expanded title and the vertical gravity that will be used
     * when there is extra space in the expanded bounds beyond what is required for the title itself.
     *
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleGravity
     */
    public void setExpandedTitleGravity(int gravity) {
        collapsingTextHelper.setExpandedTextGravity(gravity);
    }

    /**
     * Returns the horizontal and vertical alignment for title when expanded.
     *
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleGravity
     */
    public int getExpandedTitleGravity() {
        return collapsingTextHelper.getExpandedTextGravity();
    }

    /**
     * Set the typeface to use for the collapsed title.
     *
     * @param typeface typeface to use, or {@code null} to use the default.
     */
    public void setCollapsedTitleTypeface(@Nullable Typeface typeface) {
        collapsingTextHelper.setCollapsedTitleTypeface(typeface);
    }

    /**
     * Returns the typeface used for the collapsed title.
     */
    @NonNull
    public Typeface getCollapsedTitleTypeface() {
        return collapsingTextHelper.getCollapsedTitleTypeface();
    }

    /**
     * Set the typeface to use for the expanded title.
     *
     * @param typeface typeface to use, or {@code null} to use the default.
     */
    public void setExpandedTitleTypeface(@Nullable Typeface typeface) {
        collapsingTextHelper.setExpandedTitleTypeface(typeface);
    }

    /**
     * Returns the typeface used for the expanded title.
     */
    @NonNull
    public Typeface getExpandedTitleTypeface() {
        return collapsingTextHelper.getExpandedTitleTypeface();
    }

    /**
     * Set the typeface to use for the collapsed title.
     *
     * @param typeface typeface to use, or {@code null} to use the default.
     */
    public void setCollapsedSubtitleTypeface(@Nullable Typeface typeface) {
        collapsingTextHelper.setCollapsedSubtitleTypeface(typeface);
    }

    /**
     * Returns the typeface used for the collapsed title.
     */
    @NonNull
    public Typeface getCollapsedSubtitleTypeface() {
        return collapsingTextHelper.getCollapsedSubtitleTypeface();
    }

    /**
     * Set the typeface to use for the expanded title.
     *
     * @param typeface typeface to use, or {@code null} to use the default.
     */
    public void setExpandedSubtitleTypeface(@Nullable Typeface typeface) {
        collapsingTextHelper.setExpandedSubtitleTypeface(typeface);
    }

    /**
     * Returns the typeface used for the expanded title.
     */
    @NonNull
    public Typeface getExpandedSubtitleTypeface() {
        return collapsingTextHelper.getExpandedSubtitleTypeface();
    }

    /**
     * Sets the expanded title margins.
     *
     * @param start  the starting title margin in pixels
     * @param top    the top title margin in pixels
     * @param end    the ending title margin in pixels
     * @param bottom the bottom title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMargin
     * @see #getExpandedTitleMarginStart()
     * @see #getExpandedTitleMarginTop()
     * @see #getExpandedTitleMarginEnd()
     * @see #getExpandedTitleMarginBottom()
     */
    public void setExpandedTitleMargin(int start, int top, int end, int bottom) {
        expandedMarginStart = start;
        expandedMarginTop = top;
        expandedMarginEnd = end;
        expandedMarginBottom = bottom;
        requestLayout();
    }

    /**
     * @return the starting expanded title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginStart
     * @see #setExpandedTitleMarginStart(int)
     */
    public int getExpandedTitleMarginStart() {
        return expandedMarginStart;
    }

    /**
     * Sets the starting expanded title margin in pixels.
     *
     * @param margin the starting title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginStart
     * @see #getExpandedTitleMarginStart()
     */
    public void setExpandedTitleMarginStart(int margin) {
        expandedMarginStart = margin;
        requestLayout();
    }

    /**
     * @return the top expanded title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginTop
     * @see #setExpandedTitleMarginTop(int)
     */
    public int getExpandedTitleMarginTop() {
        return expandedMarginTop;
    }

    /**
     * Sets the top expanded title margin in pixels.
     *
     * @param margin the top title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginTop
     * @see #getExpandedTitleMarginTop()
     */
    public void setExpandedTitleMarginTop(int margin) {
        expandedMarginTop = margin;
        requestLayout();
    }

    /**
     * @return the ending expanded title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginEnd
     * @see #setExpandedTitleMarginEnd(int)
     */
    public int getExpandedTitleMarginEnd() {
        return expandedMarginEnd;
    }

    /**
     * Sets the ending expanded title margin in pixels.
     *
     * @param margin the ending title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginEnd
     * @see #getExpandedTitleMarginEnd()
     */
    public void setExpandedTitleMarginEnd(int margin) {
        expandedMarginEnd = margin;
        requestLayout();
    }

    /**
     * @return the bottom expanded title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginBottom
     * @see #setExpandedTitleMarginBottom(int)
     */
    public int getExpandedTitleMarginBottom() {
        return expandedMarginBottom;
    }

    /**
     * Sets the bottom expanded title margin in pixels.
     *
     * @param margin the bottom title margin in pixels
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginBottom
     * @see #getExpandedTitleMarginBottom()
     */
    public void setExpandedTitleMarginBottom(int margin) {
        expandedMarginBottom = margin;
        requestLayout();
    }

    /**
     * Sets whether {@code TextDirectionHeuristics} should be used to determine whether the title text
     * is RTL. Experimental Feature.
     */
    public void setRtlTextDirectionHeuristicsEnabled(boolean rtlTextDirectionHeuristicsEnabled) {
        collapsingTextHelper.setRtlTextDirectionHeuristicsEnabled(rtlTextDirectionHeuristicsEnabled);
    }

    /**
     * Gets whether {@code TextDirectionHeuristics} should be used to determine whether the title text
     * is RTL. Experimental Feature.
     */
    public boolean isRtlTextDirectionHeuristicsEnabled() {
        return collapsingTextHelper.isRtlTextDirectionHeuristicsEnabled();
    }

    /**
     * Set the amount of visible height in pixels used to define when to trigger a scrim visibility
     * change.
     * <p>
     * <p>If the visible height of this view is less than the given value, the scrims will be made
     * visible, otherwise they are hidden.
     *
     * @param height value in pixels used to define when to trigger a scrim visibility change
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_expandedTitleMarginEnd
     */
    public void setScrimVisibleHeightTrigger(@IntRange(from = 0) final int height) {
        if (scrimVisibleHeightTrigger != height) {
            scrimVisibleHeightTrigger = height;
            // Update the scrim visibility
            updateScrimVisibility();
        }
    }

    /**
     * Returns the amount of visible height in pixels used to define when to trigger a scrim
     * visibility change.
     *
     * @see #setScrimVisibleHeightTrigger(int)
     */
    public int getScrimVisibleHeightTrigger() {
        if (scrimVisibleHeightTrigger >= 0) {
            // If we have one explicitly set, return it
            return scrimVisibleHeightTrigger;
        }

        // Otherwise we'll use the default computed value
        final int insetTop = lastInsets != null ? lastInsets.getSystemWindowInsetTop() : 0;

        final int minHeight = ViewCompat.getMinimumHeight(this);
        if (minHeight > 0) {
            // If we have a minHeight set, lets use 2 * minHeight (capped at our height)
            return Math.min((minHeight * 2) + insetTop, getHeight());
        }

        // If we reach here then we don't have a min height set. Instead we'll take a
        // guess at 1/3 of our height being visible
        return getHeight() / 3;
    }

    /**
     * Set the duration used for scrim visibility animations.
     *
     * @param duration the duration to use in milliseconds
     * @attr ref com.google.android.material.R.styleable#SubtitleCollapsingToolbarLayout_scrimAnimationDuration
     */
    public void setScrimAnimationDuration(@IntRange(from = 0) final long duration) {
        scrimAnimationDuration = duration;
    }

    /**
     * Returns the duration in milliseconds used for scrim visibility animations.
     */
    public long getScrimAnimationDuration() {
        return scrimAnimationDuration;
    }

    @Override
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
        return p instanceof LayoutParams;
    }

    @Override
    protected LayoutParams generateDefaultLayoutParams() {
        return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }

    @Override
    public FrameLayout.LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new LayoutParams(getContext(), attrs);
    }

    @Override
    protected FrameLayout.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
        return new LayoutParams(p);
    }

    public static class LayoutParams extends CollapsingToolbarLayout.LayoutParams {
        public LayoutParams(Context c, AttributeSet attrs) {
            super(c, attrs);
        }

        public LayoutParams(int width, int height) {
            super(width, height);
        }

        public LayoutParams(int width, int height, int gravity) {
            super(width, height, gravity);
        }

        public LayoutParams(ViewGroup.LayoutParams p) {
            super(p);
        }

        public LayoutParams(MarginLayoutParams source) {
            super(source);
        }

        @RequiresApi(19)
        public LayoutParams(FrameLayout.LayoutParams source) {
            super(source);
        }
    }

    /**
     * Show or hide the scrims if needed
     */
    final void updateScrimVisibility() {
        if (contentScrim != null || statusBarScrim != null) {
            setScrimsShown(getHeight() + currentOffset < getScrimVisibleHeightTrigger());
        }
    }

    final int getMaxOffsetForPinChild(View child) {
        final ViewOffsetHelper offsetHelper = getViewOffsetHelper(child);
        final LayoutParams lp = (LayoutParams) child.getLayoutParams();
        return getHeight() - offsetHelper.getLayoutTop() - child.getHeight() - lp.bottomMargin;
    }

    private void updateContentDescriptionFromTitle() {
        // Set this layout's contentDescription to match the title if it's shown by CollapsingTextHelper
        setContentDescription(getTitle());
    }

    private class OffsetUpdateListener implements AppBarLayout.OnOffsetChangedListener {
        OffsetUpdateListener() {
        }

        @Override
        public void onOffsetChanged(AppBarLayout layout, int verticalOffset) {
            currentOffset = verticalOffset;

            final int insetTop = lastInsets != null ? lastInsets.getSystemWindowInsetTop() : 0;

            for (int i = 0, z = getChildCount(); i < z; i++) {
                final View child = getChildAt(i);
                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
                final ViewOffsetHelper offsetHelper = getViewOffsetHelper(child);

                switch (lp.collapseMode) {
                    case LayoutParams.COLLAPSE_MODE_PIN:
                        offsetHelper.setTopAndBottomOffset(
                                MathUtils.clamp(-verticalOffset, 0, getMaxOffsetForPinChild(child)));
                        break;
                    case LayoutParams.COLLAPSE_MODE_PARALLAX:
                        offsetHelper.setTopAndBottomOffset(Math.round(-verticalOffset * lp.parallaxMult));
                        break;
                    default:
                        break;
                }
            }

            // Show or hide the scrims if needed
            updateScrimVisibility();

            if (statusBarScrim != null && insetTop > 0) {
                ViewCompat.postInvalidateOnAnimation(SubtitleCollapsingToolbarLayout.this);
            }

            // Update the collapsing text's fraction
            final int expandRange = getHeight()
                    - ViewCompat.getMinimumHeight(SubtitleCollapsingToolbarLayout.this)
                    - insetTop;
            collapsingTextHelper.setExpansionFraction(Math.abs(verticalOffset) / (float) expandRange);
        }
    }
}


================================================
FILE: app/src/main/java/com/google/android/material/internal/SubtitleCollapsingTextHelper.java
================================================
package com.google.android.material.internal;

import android.animation.TimeInterpolator;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.os.Build;
import android.text.TextPaint;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;

import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.math.MathUtils;
import androidx.core.text.TextDirectionHeuristicsCompat;
import androidx.core.view.GravityCompat;
import androidx.core.view.ViewCompat;

import com.google.android.material.animation.AnimationUtils;
import com.google.android.material.resources.CancelableFontCallback;
import com.google.android.material.resources.TextAppearance;

/**
 * Helper class for {@link com.google.android.material.appbar.SubtitleCollapsingToolbarLayout}.
 *
 * @see CollapsingTextHelper
 */
public final class SubtitleCollapsingTextHelper {

    // Pre-JB-MR2 doesn't support HW accelerated canvas scaled title so we will workaround it
    // by using our own texture
    private static final boolean USE_SCALING_TEXTURE = Build.VERSION.SDK_INT < 18;

    private static final boolean DEBUG_DRAW = false;
    @NonNull
    private static final Paint DEBUG_DRAW_PAINT;

    static {
        DEBUG_DRAW_PAINT = DEBUG_DRAW ? new Paint() : null;
        if (DEBUG_DRAW_PAINT != null) {
            DEBUG_DRAW_PAINT.setAntiAlias(true);
            DEBUG_DRAW_PAINT.setColor(Color.MAGENTA);
        }
    }

    private final View view;

    private boolean drawTitle;
    private float expandedFraction;

    @NonNull
    private final Rect expandedBounds;
    @NonNull
    private final Rect collapsedBounds;
    @NonNull
    private final RectF currentBounds;
    private int expandedTextGravity = Gravity.CENTER_VERTICAL;
    private int collapsedTextGravity = Gravity.CENTER_VERTICAL;
    private float expandedTitleTextSize, expandedSubtitleTextSize = 15;
    private float collapsedTitleTextSize, collapsedSubtitleTextSize = 15;
    private ColorStateList expandedTitleTextColor, expandedSubtitleTextColor;
    private ColorStateList collapsedTitleTextColor, collapsedSubtitleTextColor;

    private float expandedTitleDrawY, expandedSubtitleDrawY;
    private float collapsedTitleDrawY, collapsedSubtitleDrawY;
    private float expandedTitleDrawX, expandedSubtitleDrawX;
    private float collapsedTitleDrawX, collapsedSubtitleDrawX;
    private float currentTitleDrawX, currentSubtitleDrawX;
    private float currentTitleDrawY, currentSubtitleDrawY;
    private Typeface collapsedTitleTypeface, collapsedSubtitleTypeface;
    private Typeface expandedTitleTypeface, expandedSubtitleTypeface;
    private Typeface currentTitleTypeface, currentSubtitleTypeface;
    private CancelableFontCallback expandedTitleFontCallback, expandedSubtitleFontCallback;
    private CancelableFontCallback collapsedTitleFontCallback, collapsedSubtitleFontCallback;

    @Nullable
    private CharSequence title, subtitle;
    @Nullable
    private CharSequence titleToDraw, subtitleToDraw;
    private boolean isRtl;
    private boolean isRtlTextDirectionHeuristicsEnabled = true;

    private boolean useTexture;
    @Nullable
    private Bitmap expandedTitleTexture, expandedSubtitleTexture;
    private Paint titleTexturePaint, subtitleTexturePaint;
    private float titleTextureAscent, subtitleTextureAscent;
    private float titleTextureDescent, subtitleTextureDescent;

    private float titleScale, subtitleScale;
    private float currentTitleTextSize, currentSubtitleTextSize;

    private int[] state;

    private boolean boundsChanged;

    @NonNull
    private final TextPaint titleTextPaint, subtitleTextPaint;
    @NonNull
    private final TextPaint titleTmpPaint, subtitleTmpPaint;

    private TimeInterpolator positionInterpolator;
    private TimeInterpolator textSizeInterpolator;

    private float collapsedTitleShadowRadius, collapsedSubtitleShadowRadius;
    private float collapsedTitleShadowDx, collapsedSubtitleShadowDx;
    private float collapsedTitleShadowDy, collapsedSubtitleShadowDy;
    private ColorStateList collapsedTitleShadowColor, collapsedSubtitleShadowColor;

    private float expandedTitleShadowRadius, expandedSubtitleShadowRadius;
    private float expandedTitleShadowDx, expandedSubtitleShadowDx;
    private float expandedTitleShadowDy, expandedSubtitleShadowDy;
    private ColorStateList expandedTitleShadowColor, expandedSubtitleShadowColor;

    public SubtitleCollapsingTextHelper(View view) {
        this.view = view;

        titleTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        titleTmpPaint = new TextPaint(titleTextPaint);
        subtitleTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
        subtitleTmpPaint = new TextPaint(subtitleTextPaint);

        collapsedBounds = new Rect();
        expandedBounds = new Rect();
        currentBounds = new RectF();
    }


    public void setTextSizeInterpolator(TimeInterpolator interpolator) {
        textSizeInterpolator = interpolator;
        recalculate();
    }

    public void setPositionInterpolator(TimeInterpolator interpolator) {
        positionInterpolator = interpolator;
        recalculate();
    }

    public void setExpandedTitleTextSize(float textSize) {
        if (expandedTitleTextSize != textSize) {
            expandedTitleTextSize = textSize;
            recalculate();
        }
    }

    public void setCollapsedTitleTextSize(float textSize) {
        if (collapsedTitleTextSize != textSize) {
            collapsedTitleTextSize = textSize;
            recalculate();
        }
    }

    public void setExpandedSubtitleTextSize(float textSize) {
        if (expandedSubtitleTextSize != textSize) {
            expandedSubtitleTextSize = textSize;
            recalculate();
        }
    }

    public void setCollapsedSubtitleTextSize(float textSize) {
        if (collapsedSubtitleTextSize != textSize) {
            collapsedSubtitleTextSize = textSize;
            recalculate();
        }
    }

    public void setCollapsedTitleTextColor(ColorStateList textColor) {
        if (collapsedTitleTextColor != textColor) {
            collapsedTitleTextColor = textColor;
            recalculate();
        }
    }

    public void setExpandedTitleTextColor(ColorStateList textColor) {
        if (expandedTitleTextColor != textColor) {
            expandedTitleTextColor = textColor;
            recalculate();
        }
    }

    public void setCollapsedSubtitleTextColor(ColorStateList textColor) {
        if (collapsedSubtitleTextColor != textColor) {
            collapsedSubtitleTextColor = textColor;
            recalculate();
        }
    }

    public void setExpandedSubtitleTextColor(ColorStateList textColor) {
        if (expandedSubtitleTextColor != textColor) {
            expandedSubtitleTextColor = textColor;
            recalculate();
        }
    }

    public void setExpandedBounds(int left, int top, int right, int bottom) {
        if (!rectEquals(expandedBounds, left, top, right, bottom)) {
            expandedBounds.set(left, top, right, bottom);
            boundsChanged = true;
            onBoundsChanged();
        }
    }

    public void setExpandedBounds(@NonNull Rect bounds) {
        setExpandedBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
    }

    public void setCollapsedBounds(int left, int top, int right, int bottom) {
        if (!rectEquals(collapsedBounds, left, top, right, bottom)) {
            collapsedBounds.set(left, top, right, bottom);
            boundsChanged = true;
            onBoundsChanged();
        }
    }

    public void setCollapsedBounds(@NonNull Rect bounds) {
        setCollapsedBounds(bounds.left, bounds.top, bounds.right, bounds.bottom);
    }

    public void getCollapsedTitleTextActualBounds(@NonNull RectF bounds) {
        boolean isRtl = calculateIsRtl(title);

        bounds.left = !isRtl ? collapsedBounds.left : collapsedBounds.right - calculateCollapsedTitleTextWidth();
        bounds.top = collapsedBounds.top;
        bounds.right = !isRtl ? bounds.left + calculateCollapsedTitleTextWidth() : collapsedBounds.right;
        bounds.bottom = collapsedBounds.top + getCollapsedTitleTextHeight();
    }

    public float calculateCollapsedTitleTextWidth() {
        if (title == null) {
            return 0;
        }
        getTitleTextPaintCollapsed(titleTmpPaint);
        return titleTmpPaint.measureText(title, 0, title.length());
    }

    public void getCollapsedSubtitleTextActualBounds(@NonNull RectF bounds) {
        boolean isRtl = calculateIsRtl(subtitle);

        bounds.left = !isRtl ? collapsedBounds.left : collapsedBounds.right - calculateCollapsedSubtitleTextWidth();
        bounds.top = collapsedBounds.top;
        bounds.right = !isRtl ? bounds.left + calculateCollapsedSubtitleTextWidth() : collapsedBounds.right;
        bounds.bottom = collapsedBounds.top + getCollapsedSubtitleTextHeight();
    }

    public float calculateCollapsedSubtitleTextWidth() {
        if (subtitle == null) {
            return 0;
        }
        getSubtitleTextPaintCollapsed(subtitleTmpPaint);
        return subtitleTmpPaint.measureText(subtitle, 0, subtitle.length());
    }

    public float getExpandedTitleTextHeight() {
        getTitleTextPaintExpanded(titleTmpPaint);
        // Return expanded height measured from the baseline.
        return -titleTmpPaint.ascent();
    }

    public float getCollapsedTitleTextHeight() {
        getTitleTextPaintCollapsed(titleTmpPaint);
        // Return collapsed height measured from the baseline.
        return -titleTmpPaint.ascent();
    }

    public float getExpandedSubtitleTextHeight() {
        getSubtitleTextPaintExpanded(subtitleTmpPaint);
        // Return expanded height measured from the baseline.
        return -subtitleTmpPaint.ascent();
    }

    public float getCollapsedSubtitleTextHeight() {
        getSubtitleTextPaintCollapsed(subtitleTmpPaint);
        // Return collapsed height measured from the baseline.
        return -subtitleTmpPaint.ascent();
    }

    private void getTitleTextPaintExpanded(@NonNull TextPaint textPaint) {
        textPaint.setTextSize(expandedTitleTextSize);
        textPaint.setTypeface(expandedTitleTypeface);
    }

    private void getTitleTextPaintCollapsed(@NonNull TextPaint textPaint) {
        textPaint.setTextSize(collapsedTitleTextSize);
        textPaint.setTypeface(collapsedTitleTypeface);
    }

    private void getSubtitleTextPaintExpanded(@NonNull TextPaint textPaint) {
        textPaint.setTextSize(expandedSubtitleTextSize);
        textPaint.setTypeface(expandedSubtitleTypeface);
    }

    private void getSubtitleTextPaintCollapsed(@NonNull TextPaint textPaint) {
        textPaint.setTextSize(collapsedSubtitleTextSize);
        textPaint.setTypeface(collapsedSubtitleTypeface);
    }

    void onBoundsChanged() {
        drawTitle = collapsedBounds.width() > 0
                && collapsedBounds.height() > 0
                && expandedBounds.width() > 0
                && expandedBounds.height() > 0;
    }

    public void setExpandedTextGravity(int gravity) {
        if (expandedTextGravity != gravity) {
            expandedTextGravity = gravity;
            recalculate();
        }
    }

    public int getExpandedTextGravity() {
        return expandedTextGravity;
    }

    public void setCollapsedTextGravity(int gravity) {
        if (collapsedTextGravity != gravity) {
            collapsedTextGravity = gravity;
            recalculate();
        }
    }

    public int getCollapsedTextGravity() {
        return collapsedTextGravity;
    }

    public void setCollapsedTitleTextAppearance(int resId) {
        TextAppearance textAppearance = new TextAppearance(view.getContext(), resId);

        if (textAppearance.getTextColor() != null) {
            collapsedTitleTextColor = textAppearance.getTextColor();
        }
        if (textAppearance.getTextSize() != 0) {
            collapsedTitleTextSize = textAppearance.getTextSize();
        }
        if (textAppearance.shadowColor != null) {
            collapsedTitleShadowColor = textAppearance.shadowColor;
        }
        collapsedTitleShadowDx = textAppearance.shadowDx;
        collapsedTitleShadowDy = textAppearance.shadowDy;
        collapsedTitleShadowRadius = textAppearance.shadowRadius;

        // Cancel pending async fetch, if any, and replace with a new one.
        if (collapsedTitleFontCallback != null) {
            collapsedTitleFontCallback.cancel();
        }
        collapsedTitleFontCallback = new CancelableFontCallback(new CancelableFontCallback.ApplyFont() {
            @Override
            public void apply(Typeface font) {
                setCollapsedTitleTypeface(font);
            }
        }, textAppearance.getFallbackFont());
        textAppearance.getFontAsync(view.getContext(), collapsedTitleFontCallback);

        recalculate();
    }

    public void setExpandedTitleTextAppearance(int resId) {
        TextAppearance textAppearance = new TextAppearance(view.getContext(), resId);
        if (textAppearance.getTextColor() != null) {
            expandedTitleTextColor = textAppearance.getTextColor();
        }
        if (textAppearance.getTextSize() != 0) {
            expandedTitleTextSize = textAppearance.getTextSize();
        }
        if (textAppearance.shadowColor != null) {
            expandedTitleShadowColor = textAppearance.shadowColor;
        }
        expandedTitleShadowDx = textAppearance.shadowDx;
        expandedTitleShadowDy = textAppearance.shadowDy;
        expandedTitleShadowRadius = textAppearance.shadowRadius;

        // Cancel pending async fetch, if any, and replace with a new one.
        if (expandedTitleFontCallback != null) {
            expandedTitleFontCallback.cancel();
        }
        expandedTitleFontCallback = new CancelableFontCallback(new CancelableFontCallback.ApplyFont() {
            @Override
            public void apply(Typeface font) {
                setExpandedTitleTypeface(font);
            }
        }, textAppearance.getFallbackFont());
        textAppearance.getFontAsync(view.getContext(), expandedTitleFontCallback);

        recalculate();
    }

    public void setCollapsedSubtitleTextAppearance(int resId) {
        TextAppearance textAppearance = new TextAppearance(view.getContext(), resId);

        if (textAppearance.getTextColor() != null) {
            collapsedSubtitleTextColor = textAppearance.getTextColor();
        }
        if (textAppearance.getTextSize() != 0) {
            collapsedSubtitleTextSize = textAppearance.getTextSize();
        }
        if (textAppearance.shadowColor != null) {
            collapsedSubtitleShadowColor = textAppearance.shadowColor;
        }
        collapsedSubtitleShadowDx = textAppearance.shadowDx;
        collapsedSubtitleShadowDy = textAppearance.shadowDy;
        collapsedSubtitleShadowRadius = textAppearance.shadowRadius;

        // Cancel pending async fetch, if any, and replace with a new one.
        if (collapsedSubtitleFontCallback != null) {
            collapsedSubtitleFontCallback.cancel();
        }
        collapsedSubtitleFontCallback = new CancelableFontCallback(new CancelableFontCallback.ApplyFont() {
            @Override
            public void apply(Typeface font) {
                setCollapsedSubtitleTypeface(font);
            }
        }, textAppearance.getFallbackFont());
        textAppearance.getFontAsync(view.getContext(), collapsedSubtitleFontCallback);

        recalculate();
    }

    public void setExpandedSubtitleTextAppearance(int resId) {
        TextAppearance textAppearance = new TextAppearance(view.getContext(), resId);
        if (textAppearance.getTextColor() != null) {
            expandedSubtitleTextColor = textAppearance.getTextColor();
        }
        if (textAppearance.getTextSize() != 0) {
            expandedSubtitleTextSize = textAppearance.getTextSize();
        }
        if (textAppearance.shadowColor != null) {
            expandedSubtitleShadowColor = textAppearance.shadowColor;
        }
        expandedSubtitleShadowDx = textAppearance.shadowDx;
        expandedSubtitleShadowDy = textAppearance.shadowDy;
        expandedSubtitleShadowRadius = textAppearance.shadowRadius;

        // Cancel pending async fetch, if any, and replace with a new one.
        if (expandedSubtitleFontCallback != null) {
            expandedSubtitleFontCallback.cancel();
        }
        expandedSubtitleFontCallback = new CancelableFontCallback(new CancelableFontCallback.ApplyFont() {
            @Override
            public void apply(Typeface font) {
                if (font != null) setExpandedSubtitleTypeface(font);
            }
        }, null);
        textAppearance.getFontAsync(view.getContext(), expandedSubtitleFontCallback);

        recalculate();
    }

    public void setCollapsedTitleTypeface(Typeface typeface) {
        if (setCollapsedTitleTypefaceInternal(typeface)) {
            recalculate();
        }
    }

    public void setExpandedTitleTypeface(Typeface typeface) {
        if (setExpandedTitleTypefaceInternal(typeface)) {
            recalculate();
        }
    }

    public void setCollapsedSubtitleTypeface(Typeface typeface) {
        if (setCollapsedSubtitleTypefaceInternal(typeface)) {
            recalculate();
        }
    }

    public void setExpandedSubtitleTypeface(Typeface typeface) {
        if (setExpandedSubtitleTypefaceInternal(typeface)) {
            recalculate();
        }
    }

    public void setTitleTypefaces(Typeface typeface) {
        boolean collapsedFontChanged = setCollapsedTitleTypefaceInternal(typeface);
        boolean expandedFontChanged = setExpandedTitleTypefaceInternal(typeface);
        if (collapsedFontChanged || expandedFontChanged) {
            recalculate();
        }
    }

    public void setSubtitleTypefaces(Typeface typeface) {
        boolean collapsedFontChanged = setCollapsedSubtitleTypefaceInternal(typeface);
        boolean expandedFontChanged = setExpandedSubtitleTypefaceInternal(typeface);
        if (collapsedFontChanged || expandedFontChanged) {
            recalculate();
        }
    }

    @SuppressWarnings("ReferenceEquality") // Matches the Typeface comparison in TextView
    private boolean setCollapsedTitleTypefaceInternal(Typeface typeface) {
        // Explicit Typeface setting cancels pending async fetch, if any, to avoid old font overriding
        // already updated one when async op comes back after a while.
        if (collapsedTitleFontCallback != null) {
            collapsedTitleFontCallback.cancel();
        }
        if (collapsedTitleTypeface != typeface) {
            collapsedTitleTypeface = typeface;
            return true;
        }
        return false;
    }

    @SuppressWarnings("ReferenceEquality") // Matches the Typeface comparison in TextView
    private boolean setExpandedTitleTypefaceInternal(Typeface typeface) {
        // Explicit Typeface setting cancels pending async fetch, if any, to avoid old font overriding
        // already updated one when async op comes back after a while.
        if (expandedTitleFontCallback != null) {
            expandedTitleFontCallback.cancel();
        }
        if (expandedTitleTypeface != typeface) {
            expandedTitleTypeface = typeface;
            return true;
        }
        return false;
    }

    @SuppressWarnings("ReferenceEquality") // Matches the Typeface comparison in TextView
    private boolean setCollapsedSubtitleTypefaceInternal(Typeface typeface) {
        // Explicit Typeface setting cancels pending async fetch, if any, to avoid old font overriding
        // already updated one when async op comes back after a while.
        if (collapsedSubtitleFontCallback != null) {
            collapsedSubtitleFontCallback.cancel();
        }
        if (collapsedSubtitleTypeface != typeface) {
            collapsedSubtitleTypeface = typeface;
            return true;
        }
        return false;
    }

    @SuppressWarnings("ReferenceEquality") // Matches the Typeface comparison in TextView
    private boolean setExpandedSubtitleTypefaceInternal(Typeface typeface) {
        // Explicit Typeface setting cancels pending async fetch, if any, to avoid old font overriding
        // already updated one when async op comes back after a while.
        if (expandedSubtitleFontCallback != null) {
            expandedSubtitleFontCallback.cancel();
        }
        if (expandedSubtitleTypeface != typeface) {
            expandedSubtitleTypeface = typeface;
            return true;
        }
        return false;
    }

    public Typeface getCollapsedTitleTypeface() {
        return collapsedTitleTypeface != null ? collapsedTitleTypeface : Typeface.DEFAULT;
    }

    public Typeface getExpandedTitleTypeface() {
        return expandedTitleTypeface != null ? expandedTitleTypeface : Typeface.DEFAULT;
    }

    public Typeface getCollapsedSubtitleTypeface() {
        return collapsedSubtitleTypeface != null ? collapsedSubtitleTypeface : Typeface.DEFAULT;
    }

    public Typeface getExpandedSubtitleTypeface() {
        return expandedSubtitleTypeface != null ? expandedSubtitleTypeface : Typeface.DEFAULT;
    }

    /**
     * Set the value indicating the current scroll value. This decides how much of the background will
     * be displayed, as well as the title metrics/positioning.
     *
     * <p>A value of {@code 0.0} indicates that the layout is fully expanded. A value of {@code 1.0}
     * indicates that the layout is fully collapsed.
     */
    public void setExpansionFraction(float fraction) {
        fraction = MathUtils.clamp(fraction, 0f, 1f);

        if (fraction != expandedFraction) {
            expandedFraction = fraction;
            calculateCurrentOffsets();
        }
    }

    public final boolean setState(final int[] state) {
        this.state = state;

        if (isStateful()) {
            recalculate();
            return true;
        }

        return false;
    }

    public final boolean isStateful() {
        return (collapsedTitleTextColor != null && collapsedTitleTextColor.isStateful())
                || (expandedTitleTextColor != null && expandedTitleTextColor.isStateful());
    }

    public float getExpansionFraction() {
        return expandedFraction;
    }

    public float getCollapsedTitleTextSize() {
        return collapsedTitleTextSize;
    }

    public float getExpandedTitleTextSize() {
        return expandedTitleTextSize;
    }

    public float getCollapsedSubtitleTextSize() {
        return collapsedSubtitleTextSize;
    }

    public float getExpandedSubtitleTextSize() {
        return expandedSubtitleTextSize;
    }

    public void setRtlTextDirectionHeuristicsEnabled(boolean rtlTextDirectionHeuristicsEnabled) {
        isRtlTextDirectionHeuristicsEnabled = rtlTextDirectionHeuristicsEnabled;
    }

    public boolean isRtlTextDirectionHeuristicsEnabled() {
        return isRtlTextDirectionHeuristicsEnabled;
    }

    private void calculateCurrentOffsets() {
        calculateOffsets(expandedFraction);
    }

    private void calculateOffsets(final float fraction) {
        interpolateBounds(fraction);
        currentTitleDrawX = lerp(expandedTitleDrawX, collapsedTitleDrawX, fraction, positionInterpolator);
        currentTitleDrawY = lerp(expandedTitleDrawY, collapsedTitleDrawY, fraction, positionInterpolator);
        currentSubtitleDrawX = lerp(expandedSubtitleDrawX, collapsedSubtitleDrawX, fraction, positionInterpolator);
        currentSubtitleDrawY = lerp(expandedSubtitleDrawY, collapsedSubtitleDrawY, fraction, positionInterpolator);

        setInterpolatedTitleTextSize(lerp(expandedTitleTextSize, collapsedTitleTextSize, fraction, textSizeInterpolator));
        setInterpolatedSubtitleTextSize(lerp(expandedSubtitleTextSize, collapsedSubtitleTextSize, fraction, textSizeInterpolator));

        if (collapsedTitleTextColor != expandedTitleTextColor) {
            // If the collapsed and expanded title colors are different, blend them based on the
            // fraction
            titleTextPaint.setColor(blendColors(getCurrentExpandedTitleTextColor(), getCurrentCollapsedTitleTextColor(), fraction));
        } else {
            titleTextPaint.setColor(getCurrentCollapsedTitleTextColor());
        }

        titleTextPaint.setShadowLayer(
                lerp(expandedTitleShadowRadius, collapsedTitleShadowRadius, fraction, null),
                lerp(expandedTitleShadowDx, collapsedTitleShadowDx, fraction, null),
                lerp(expandedTitleShadowDy, collapsedTitleShadowDy, fraction, null),
                blendColors(getCurrentColor(expandedTitleShadowColor), getCurrentColor(collapsedTitleShadowColor), fraction));

        if (collapsedSubtitleTextColor != expandedSubtitleTextColor) {
            // If the collapsed and expanded title colors are different, blend them based on the
            // fraction
            subtitleTextPaint.setColor(blendColors(getCurrentExpandedSubtitleTextColor(), getCurrentCollapsedSubtitleTextColor(), fraction));
        } else {
            subtitleTextPaint.setColor(getCurrentCollapsedSubtitleTextColor());
        }

        subtitleTextPaint.setShadowLayer(
                lerp(expandedSubtitleShadowRadius, collapsedSubtitleShadowRadius, fraction, null),
                lerp(expandedSubtitleShadowDx, collapsedSubtitleShadowDx, fraction, null),
                lerp(expandedSubtitleShadowDy, collapsedSubtitleShadowDy, fraction, null),
                blendColors(getCurrentColor(expandedSubtitleShadowColor), getCurrentColor(collapsedSubtitleShadowColor), fraction));

        ViewCompat.postInvalidateOnAnimation(view);
    }

    @ColorInt
    private int getCurrentExpandedTitleTextColor() {
        return getCurrentColor(expandedTitleTextColor);
    }

    @ColorInt
    private int getCurrentExpandedSubtitleTextColor() {
        return getCurrentColor(expandedSubtitleTextColor);
    }

    @ColorInt
    public int getCurrentCollapsedTitleTextColor() {
        return getCurrentColor(collapsedTitleTextColor);
    }

    @ColorInt
    public int getCurrentCollapsedSubtitleTextColor() {
        return getCurrentColor(collapsedSubtitleTextColor);
    }

    @ColorInt
    private int getCurrentColor(@Nullable ColorStateList colorStateList) {
        if (colorStateList == null) {
            return 0;
        }
        if (state != null) {
            return colorStateList.getColorForState(state, 0);
        }
        return colorStateList.getDefaultColor();
    }

    private void calculateBaseOffsets() {
        final float currentTitleSize = this.currentTitleTextSize;
        final float currentSubtitleSize = this.currentSubtitleTextSize;
        final boolean isTitleOnly = TextUtils.isEmpty(subtitle);

        // We then calculate the collapsed title size, using the same logic
        calculateUsingTitleTextSize(collapsedTitleTextSize);
        calculateUsingSubtitleTextSize(collapsedSubtitleTextSize);
        float titleWidth = titleToDraw != null ? titleTextPaint.measureText(titleToDraw, 0, titleToDraw.length()) : 0;
        float subtitleWidth = subtitleToDraw != null ? subtitleTextPaint.measureText(subtitleToDraw, 0, subtitleToDraw.length()) : 0;
        final int collapsedAbsGravity =
                GravityCompat.getAbsoluteGravity(
                        collapsedTextGravity,
                        isRtl ? ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR);

        // reusable dimension
        float titleHeight = titleTextPaint.descent() - titleTextPaint.ascent();
        float titleOffset = titleHeight / 2 - titleTextPaint.descent();
        float subtitleHeight = subtitleTextPaint.descent() - subtitleTextPaint.ascent();
        float subtitleOffset = subtitleHeight / 2 - subtitleTextPaint.descent();

        if (isTitleOnly) {
            switch (collapsedAbsGravity & Gravity.VERTICAL_GRAVITY_MASK) {
                case Gravity.BOTTOM:
                    collapsedTitleDrawY = collapsedBounds.bottom;
                    break;
                case Gravity.TOP:
                    collapsedTitleDrawY = collapsedBounds.top - titleTextPaint.ascent();
                    break;
                case Gravity.CENTER_VERTICAL:
                default:
                    float textHeight = titleTextPaint.descent() - titleTextPaint.ascent();
                    float textOffset = (textHeight / 2) - titleTextPaint.descent();
                    collapsedTitleDrawY = collapsedBounds.centerY() + textOffset;
                    break;
            }
        } else {
            final float offset = (collapsedBounds.height() - (titleHeight + subtitleHeight)) / 3;
            collapsedTitleDrawY = collapsedBounds.top + offset - titleTextPaint.ascent();
            collapsedSubtitleDrawY = collapsedBounds.top + offset * 2 + titleHeight - subtitleTextPaint.ascent();
        }
        switch (collapsedAbsGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) {
            case Gravity.CENTER_HORIZONTAL:
                collapsedTitleDrawX = collapsedBounds.centerX() - (titleWidth / 2);
                collapsedSubtitleDrawX = collapsedBounds.centerX() - (subtitleWidth / 2);
                break;
            case Gravity.RIGHT:
                collapsedTitleDrawX = collapsedBounds.right - titleWidth;
                collapsedSubtitleDrawX = collapsedBounds.right - subtitleWidth;
                break;
            case Gravity.LEFT:
            default:
                collapsedTitleDrawX = collapsedBounds.left;
                collapsedSubtitleDrawX = collapsedBounds.left;
                break;
        }

        calculateUsingTitleTextSize(expandedTitleTextSize);
        calculateUsingSubtitleTextSize(expandedSubtitleTextSize);
        titleWidth = titleToDraw != null ? titleTextPaint.measureText(titleToDraw, 0, titleToDraw.length()) : 0;
        subtitleWidth = subtitleToDraw != null ? subtitleTextPaint.measureText(subtitleToDraw, 0, subtitleToDraw.length()) : 0;

        // dimension modification
        titleHeight = titleTextPaint.descent() - titleTextPaint.ascent();
        titleOffset = titleHeight / 2 - titleTextPaint.descent();
        subtitleHeight = subtitleTextPaint.descent() - subtitleTextPaint.ascent();
        subtitleOffset = subtitleHeight / 2 - subtitleTextPaint.descent();

        final int expandedAbsGravity = GravityCompat.getAbsoluteGravity(
                expandedTextGravity,
                isRtl ? ViewCompat.LAYOUT_DIRECTION_RTL : ViewCompat.LAYOUT_DIRECTION_LTR
        );
        if (isTitleOnly) {
            switch (expandedAbsGravity & Gravity.VERTICAL_GRAVITY_MASK) {
                case Gravity.BOTTOM:
                    expandedTitleDrawY = expandedBounds.bottom;
                    break;
                case Gravity.TOP:
                    expandedTitleDrawY = expandedBounds.top - titleTextPaint.ascent();
                    break;
                case Gravity.CENTER_VERTICAL:
                default:
                    float textHeight = titleTextPaint.descent() - titleTextPaint.ascent();
                    float textOffset = (textHeight / 2) - titleTextPaint.descent();
                    expandedTitleDrawY = expandedBounds.centerY() + textOffset;
                    break;
            }
        } else {
            switch (expandedAbsGravity & Gravity.VERTICAL_GRAVITY_MASK) {
                case Gravity.BOTTOM:
                    expandedTitleDrawY = expandedBounds.bottom - subtitleHeight - titleOffset;
                    expandedSubtitleDrawY = expandedBounds.bottom;
                    break;
                case Gravity.TOP:
                    expandedTitleDrawY = expandedBounds.top - titleTextPaint.ascent();
                    expandedSubtitleDrawY = expandedTitleDrawY + subtitleHeight + titleOffset;
                    break;
                case Gravity.CENTER_VERTICAL:
                default:
                    expandedTitleDrawY = expandedBounds.centerY() + titleOffset;
                    expandedSubtitleDrawY = expandedTitleDrawY + subtitleHeight + titleOffset;
                    break;
            }
        }
        switch (expandedAbsGravity & GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK) {
            case Gravity.CENTER_HORIZONTAL:
                expandedTitleDrawX = expandedBounds.centerX() - (titleWidth / 2);
                expandedSubtitleDrawX = expandedBounds.centerX() - (subtitleWidth / 2);
                break;
            case Gravity.RIGHT:
                expandedTitleDrawX = expandedBounds.right - titleWidth;
                expandedSubtitleDrawX = expandedBounds.right - subtitleWidth;
                break;
            case Gravity.LEFT:
            default:
                expandedTitleDrawX = expandedBounds.left;
                expandedSubtitleDrawX = expandedBounds.left;
                break;
        }

        // The bounds have changed so we need to clear the texture
        clearTexture();
        // Now reset the title size back to the original
        setInterpolatedTitleTextSize(currentTitleSize);
        setInterpolatedSubtitleTextSize(currentSubtitleSize);
    }

    private void interpolateBounds(float fraction) {
        currentBounds.left = lerp(expandedBounds.left, collapsedBounds.left, fraction, positionInterpolator);
        currentBounds.top = lerp(expandedTitleDrawY, collapsedTitleDrawY, fraction, positionInterpolator);
        currentBounds.right = lerp(expandedBounds.right, collapsedBounds.right, fraction, positionInterpolator);
        currentBounds.bottom = lerp(expandedBounds.bottom, collapsedBounds.bottom, fraction, positionInterpolator);
    }

    public void draw(@NonNull Canvas canvas) {
        final int saveCount = canvas.save();

        if (drawTitle && titleToDraw != null) {
            float titleX = currentTitleDrawX;
            float titleY = currentTitleDrawY;
            float subtitleX = currentSubtitleDrawX;
            float subtitleY = currentSubtitleDrawY;

            final boolean drawTitleTexture = useTexture && expandedTitleTexture != null;
            final boolean drawSubtitleTexture = useTexture && expandedSubtitleTexture != null;

            final float titleAscent;
            final float titleDescent;
            if (drawTitleTexture) {
                titleAscent = titleTextureAscent * titleScale;
                titleDescent = titleTextureDescent * titleScale;
            } else {
                titleAscent = titleTextPaint.ascent() * titleScale;
                titleDescent = titleTextPaint.descent() * titleScale;
            }

            if (DEBUG_DRAW) {
                // Just a debug tool, which drawn a magenta rect in the text bounds
                canvas.drawRect(currentBounds.left, titleY + titleAscent, currentBounds.right, titleY + titleDescent, DEBUG_DRAW_PAINT);
            }

            if (drawTitleTexture) {
                titleY += titleAscent;
            }

            // additional canvas save for subtitle
            if (subtitleToDraw != null) {
                final int subtitleSaveCount = canvas.save();

                if (subtitleScale != 1f) {
                    canvas.scale(subtitleScale, subtitleScale, subtitleX, subtitleY);
                }

                if (drawSubtitleTexture) {
                    // If we should use a texture, draw it instead of title
                    canvas.drawBitmap(expandedSubtitleTexture, subtitleX, subtitleY, subtitleTexturePaint);
                } else {
                    canvas.drawText(subtitleToDraw, 0, subtitleToDraw.length(), subtitleX, subtitleY, subtitleTextPaint);
                }
                canvas.restoreToCount(subtitleSaveCount);
            }

            if (titleScale != 1f) {
                canvas.scale(titleScale, titleScale, titleX, titleY);
            }

            if (drawTitleTexture) {
                // If we should use a texture, draw it instead of text
                canvas.drawBitmap(expandedTitleTexture, titleX, titleY, titleTexturePaint);
            } else {
                canvas.drawText(titleToDraw, 0, titleToDraw.length(), titleX, titleY, titleTextPaint);
            }
        }

        canvas.restoreToCount(saveCount);
    }

    private boolean calculateIsRtl(@NonNull CharSequence text) {
        final boolean defaultIsRtl = isDefaultIsRtl();
        return isRtlTextDirectionHeuristicsEnabled
                ? isTextDirectionHeuristicsIsRtl(text, defaultIsRtl)
                : defaultIsRtl;
    }

    private boolean isDefaultIsRtl() {
        return ViewCompat.getLayoutDirection(view) == ViewCompat.LAYOUT_DIRECTION_RTL;
    }

    private boolean isTextDirectionHeuristicsIsRtl(@NonNull CharSequence text, boolean defaultIsRtl) {
        return (defaultIsRtl
                ? TextDirectionHeuristicsCompat.FIRSTSTRONG_RTL
                : TextDirectionHeuristicsCompat.FIRSTSTRONG_LTR)
                .isRtl(text, 0, text.length());
    }

    private void setInterpolatedTitleTextSize(float textSize) {
        calculateUsingTitleTextSize(textSize);

        // Use our texture if the scale isn't 1.0
        useTexture = USE_SCALING_TEXTURE && titleScale != 1f;

        if (useTexture) {
            // Make sure we have an expanded texture if needed
            ensureExpandedTitleTexture();
        }

        ViewCompat.postInvalidateOnAnimation(view);
    }

    private void setInterpolatedSubtitleTextSize(float textSize) {
        calculateUsingSubtitleTextSize(textSize);

        // Use our texture if the scale isn't 1.0
        useTexture = USE_SCALING_TEXTURE && subtitleScale != 1f;

        if (useTexture) {
            // Make sure we have an expanded texture if needed
            ensureExpandedSubtitleTexture();
        }

        ViewCompat.postInvalidateOnAnimation(view);
    }

    @SuppressWarnings("ReferenceEquality") // Matches the Typeface comparison in TextView
    private void calculateUsingTitleTextSize(final float size) {
        if (title == null) {
            return;
        }

        final float collapsedWidth = collapsedBounds.width();
        final float expandedWidth = expandedBounds.width();

        final float availableWidth;
        final float newTextSize;
        boolean updateDrawText = false;

        if (isClose(size, collapsedTitleTextSize)) {
            newTextSize = collapsedTitleTextSize;
            titleScale = 1f;
            if (currentTitleTypeface != collapsedTitleTypeface) {
                currentTitleTypeface = collapsedTitleTypeface;
                updateDrawText = true;
            }
            availableWidth = collapsedWidth;
        } else {
            newTextSize = expandedTitleTextSize;
            if (currentTitleTypeface != expandedTitleTypeface) {
                currentTitleTypeface = expandedTitleTypeface;
                updateDrawText = true;
            }
            if (isClose(size, expandedTitleTextSize)) {
                // If we're close to the expanded title size, snap to it and use a scale of 1
                titleScale = 1f;
            } else {
                // Else, we'll scale down from the expanded title size
                titleScale = size / expandedTitleTextSize;
            }

            final float textSizeRatio = collapsedTitleTextSize / expandedTitleTextSize;
            // This is the size of the expanded bounds when it is scaled to match the
            // collapsed title size
            final float scaledDownWidth = expandedWidth * textSizeRatio;

            if (scaledDownWidth > collapsedWidth) {
                // If the scaled down size is larger than the actual collapsed width, we need to
                // cap the available width so that when the expanded title scales down, it matches
                // the collapsed width
                availableWidth = Math.min(collapsedWidth / textSizeRatio, expandedWidth);
            } else {
                // Otherwise we'll just use the expanded width
                availableWidth = expandedWidth;
            }
        }

        if (availableWidth > 0) {
            updateDrawText = (currentTitleTextSize != newTextSize) || boundsChanged || updateDrawText;
            currentTitleTextSize = newTextSize;
            boundsChanged = false;
        }

        if (titleToDraw == null || updateDrawText) {
            titleTextPaint.setTextSize(currentTitleTextSize);
            titleTextPaint.setTypeface(currentTitleTypeface);
            // Use linear title scaling if we're scaling the canvas
            titleTextPaint.setLinearText(titleScale != 1f);

            // If we don't currently have title to draw, or the title size has changed, ellipsize...
            final CharSequence text =
                    TextUtils
                            .ellipsize(this.title, titleTextPaint, availableWidth, TextUtils.TruncateAt.END);
            if (!TextUtils.equals(text, titleToDraw)) {
                titleToDraw = text;
                isRtl = calculateIsRtl(titleToDraw);
            }
        }
    }

    @SuppressWarnings("ReferenceEquality") // Matches the Typeface comparison in TextView
    private void calculateUsingSubtitleTextSize(final float size) {
        if (subtitle == null) {
            return;
        }

        final float collapsedWidth = collapsedBounds.width();
        final float expandedWidth = expandedBounds.width();

        final float availableWidth;
        final float newTextSize;
        boolean updateDrawText = false;

        if (isClose(size, collapsedSubtitleTextSize)) {
            newTextSize = collapsedSubtitleTextSize;
            subtitleScale = 1f;
            if (currentSubtitleTypeface != collapsedSubtitleTypeface) {
                currentSubtitleTypeface = collapsedSubtitleTypeface;
                updateDrawText = true;
            }
            availableWidth = collapsedWidth;
        } else {
            newTextSize = expandedSubtitleTextSize;
            if (currentSubtitleTypeface != expandedSubtitleTypeface) {
                currentSubtitleTypeface = expandedSubtitleTypeface;
                updateDrawText = true;
            }
            if (isClose(size, expandedSubtitleTextSize)) {
                // If we're close to the expanded title size, snap to it and use a scale of 1
                subtitleScale = 1f;
            } else {
                // Else, we'll scale down from the expanded title size
                subtitleScale = size / expandedSubtitleTextSize;
            }

            final float textSizeRatio = collapsedSubtitleTextSize / expandedSubtitleTextSize;
            // This is the size of the expanded bounds when it is scaled to match the
            // collapsed title size
            final float scaledDownWidth = expandedWidth * textSizeRatio;

            if (scaledDownWidth > collapsedWidth) {
                // If the scaled down size is larger than the actual collapsed width, we need to
                // cap the available width so that when the expanded title scales down, it matches
                // the collapsed width
                availableWidth = Math.min(collapsedWidth / textSizeRatio, expandedWidth);
            } else {
                // Otherwise we'll just use the expanded width
                availableWidth = expandedWidth;
            }
        }

        if (availableWidth > 0) {
            updateDrawText = (currentSubtitleTextSize != newTextSize) || boundsChanged || updateDrawText;
            currentSubtitleTextSize = newTextSize;
            boundsChanged = false;
        }

        if (subtitleToDraw == null || updateDrawText) {
            subtitleTextPaint.setTextSize(currentSubtitleTextSize);
            subtitleTextPaint.setTypeface(currentSubtitleTypeface);
            // Use linear title scaling if we're scaling the canvas
            subtitleTextPaint.setLinearText(subtitleScale != 1f);

            // If we don't currently have title to draw, or the title size has changed, ellipsize...
            final CharSequence text =
                    TextUtils.ellipsize(this.subtitle, subtitleTextPaint, availableWidth, TextUtils.TruncateAt.END);
            if (!TextUtils.equals(text, subtitleToDraw)) {
                subtitleToDraw = text;
                isRtl = calculateIsRtl(subtitleToDraw);
            }
        }
    }

    private void ensureExpandedTitleTexture() {
        if (expandedTitleTexture != null || expandedBounds.isEmpty() || TextUtils.isEmpty(titleToDraw)) {
            return;
        }

        calculateOffsets(0f);
        titleTextureAscent = titleTextPaint.ascent();
        titleTextureDescent = titleTextPaint.descent();

        final int w = Math.round(titleTextPaint.measureText(titleToDraw, 0, titleToDraw.length()));
        final int h = Math.round(titleTextureDescent - titleTextureAscent);

        if (w <= 0 || h <= 0) {
            return; // If the width or height are 0, return
        }

        expandedTitleTexture = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        Canvas c = new Canvas(expandedTitleTexture);
        c.drawText(titleToDraw, 0, titleToDraw.length(), 0, h - titleTextPaint.descent(), titleTextPaint);

        if (titleTexturePaint == null) {
            // Make sure we have a paint
            titleTexturePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
        }
    }

    private void ensureExpandedSubtitleTexture() {
        if (expandedSubtitleTexture != null || expandedBounds.isEmpty() || TextUtils.isEmpty(subtitleToDraw)) {
            return;
        }

        calculateOffsets(0f);
        subtitleTextureAscent = subtitleTextPaint.ascent();
        subtitleTextureDescent = subtitleTextPaint.descent();

        final int w = Math.round(subtitleTextPaint.measureText(subtitleToDraw, 0, subtitleToDraw.length()));
        final int h = Math.round(subtitleTextureDescent - subtitleTextureAscent);

        if (w <= 0 || h <= 0) {
            return; // If the width or height are 0, return
        }

        expandedSubtitleTexture = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        Canvas c = new Canvas(expandedSubtitleTexture);
        c.drawText(subtitleToDraw, 0, subtitleToDraw.length(), 0, h - subtitleTextPaint.descent(), subtitleTextPaint);

        if (subtitleTexturePaint == null) {
            // Make sure we have a paint
            subtitleTexturePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
        }
    }

    public void recalculate() {
        if (view.getHeight() > 0 && view.getWidth() > 0) {
            // If we've already been laid out, calculate everything now otherwise we'll wait
            // until a layout
            calculateBaseOffsets();
            calculateCurrentOffsets();
        }
    }

    /**
     * Set the title to display
     *
     * @param title
     */
    public void setTitle(@Nullable CharSequence title) {
        if (title == null || !title.equals(this.title)) {
            this.title = title;
            titleToDraw = null;
            clearTexture();
            recalculate();
        }
    }

    @Nullable
    public CharSequence getTitle() {
        return title;
    }

    /**
     * Set the subtitle to display
     *
     * @param subtitle
     */
    public void setSubtitle(@Nullable CharSequence subtitle) {
        if (subtitle == null || !subtitle.equals(this.subtitle)) {
            this.subtitle = subtitle;
            subtitleToDraw = null;
            clearTexture();
            recalculate();
        }
    }

    @Nullable
    public CharSequence getSubtitle() {
        return subtitle;
    }

    private void clearTexture() {
        if (expandedTitleTexture != null) {
            expandedTitleTexture.recycle();
            expandedTitleTexture = null;
        }
        if (expandedSubtitleTexture != null) {
            expandedSubtitleTexture.recycle();
            expandedSubtitleTexture = null;
        }
    }

    /**
     * Returns true if {@code value} is 'close' to it's closest decimal value. Close is currently
     * defined as it's difference being < 0.001.
     */
    private static boolean isClose(float value, float targetValue) {
        return Math.abs(value - targetValue) < 0.001f;
    }

    public ColorStateList getExpandedTitleTextColor() {
        return expandedTitleTextColor;
    }

    public ColorStateList getExpandedSubtitleTextColor() {
        return expandedSubtitleTextColor;
    }

    public ColorStateList getCollapsedTitleTextColor() {
        return collapsedTitleTextColor;
    }

    public ColorStateList getCollapsedSubtitleTextColor() {
        return collapsedSubtitleTextColor;
    }

    /**
     * Blend {@code color1} and {@code color2} using the given ratio.
     *
     * @param ratio of which to blend. 0.0 will return {@code color1}, 0.5 will give an even blend,
     *              1.0 will return {@code color2}.
     */
    private static int blendColors(int color1, int color2, float ratio) {
        final float inverseRatio = 1f - ratio;
        float a = (Color.alpha(color1) * inverseRatio) + (Color.alpha(color2) * ratio);
        float r = (Color.red(color1) * inverseRatio) + (Color.red(color2) * ratio);
        float g = (Color.green(color1) * inverseRatio) + (Color.green(color2) * ratio);
        float b = (Color.blue(color1) * inverseRatio) + (Color.blue(color2) * ratio);
        return Color.argb((int) a, (int) r, (int) g, (int) b);
    }

    private static float lerp(
            float startValue, float endValue, float fraction, @Nullable TimeInterpolator interpolator) {
        if (interpolator != null) {
            fraction = interpolator.getInterpolation(fraction);
        }
        return AnimationUtils.lerp(startValue, endValue, fraction);
    }

    private static boolean rectEquals(@NonNull Rect r, int left, int top, int right, int bottom) {
        return !(r.left != left || r.top != top || r.right != right || r.bottom != bottom);
    }
}


================================================
FILE: app/src/main/java/org/lsposed/manager/App.java
================================================
/*
 * This file is part of LSPosed.
 *
 * LSPosed is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * LSPosed is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with LSPosed.  If not, see <https://www.gnu.org/licenses/>.
 *
 * Copyright (C) 2020 EdXposed Contributors
 * Copyright (C) 2021 LSPosed Contributors
 */

package org.lsposed.manager;

import android.app.ActivityManager;
import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Process;
import android.provider.MediaStore;
import android.provider.Settings;
import android.system.Os;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.preference.PreferenceManager;

import org.lsposed.hiddenapibypass.HiddenApiBypass;
import org.lsposed.manager.adapters.AppHelper;
import org.lsposed.manager.receivers.LSPManagerServiceHolder;
import org.lsposed.manager.repo.RepoLoader;
import org.lsposed.manager.util.CloudflareDNS;
import org.lsposed.manager.util.ModuleUtil;
import org.lsposed.manager.util.ThemeUtil;
import org.lsposed.manager.util.UpdateUtil;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.time.OffsetDateTime;
import java.util.HashMap;
import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

import okhttp3.Cache;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import rikka.core.os.FileUtils;
import rikka.material.app.LocaleDelegate;

public class App extends Application {
    public static final int PER_USER_RANGE = 100000;
    public static final FutureTask<String> HTML_TEMPLATE = new FutureTask<>(() -> readWebviewHTML("template.html"));
    public static final FutureTask<String> HTML_TEMPLATE_DARK = new FutureTask<>(() -> readWebviewHTML("template_dark.html"));

    private static String readWebviewHTML(String name) {
        try {
            var input = App.getInstance().getAssets().open("webview/" + name);
            var result = new ByteArrayOutputStream(1024);
            FileUtils.copy(input, result);
            return result.toString(StandardCharsets.UTF_8.name());
        } catch (IOException e) {
            Log.e(App.TAG, "read webview HTML", e);
            return "<html dir\"@dir@\"><body>@body@</body></html>";
        }
    }

    static {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            HiddenApiBypass.addHiddenApiExemptions("");
        }
        Looper.myQueue().addIdleHandler(() -> {
            if (App.getInstance() == null || App.getExecutorService() == null) return true;
            App.getExecutorService().submit(() -> {
                var list = AppHelper.getAppList(false);
                var pm = App.getInstance().getPackageManager();
                list.parallelStream().forEach(i -> AppHelper.getAppLabel(i, pm));
                AppHelper.getDenyList(false);
                ModuleUtil.getInstance();
                RepoLoader.getInstance();
            });
            App.getExecutorService().submit(HTML_TEMPLATE);
            App.getExecutorService().submit(HTML_TEMPLATE_DARK);
            return false;
        });
    }

    public static final String TAG = "LSPosedManager";
    private static final String ACTION_USER_ADDED = "android.intent.action.USER_ADDED";
    private static final String ACTION_USER_REMOVED = "android.intent.action.USER_REMOVED";
    private static final String ACTION_USER_INFO_CHANGED = "android.intent.action.USER_INFO_CHANGED";
    private static final String EXTRA_REMOVED_FOR_ALL_USERS = "android.intent.extra.REMOVED_FOR_ALL_USERS";
    private static App instance = null;
    private static OkHttpClient okHttpClient;
    private static Cache okHttpCache;
    private SharedPreferences pref;
    private static final ExecutorService executorService = Executors.newCachedThreadPool();
    private static final Handler MainHandler = new Handler(Looper.getMainLooper());

    public static App getInstance() {
        return instance;
    }

    public static SharedPreferences getPreferences() {
        return instance.pref;
    }

    public static ExecutorService getExecutorService() {
        return executorService;
    }

    public static final boolean isParasitic = !Process.isApplicationUid(Process.myUid());

    public static Handler getMainHandler() {
        return MainHandler;
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        var map = new HashMap<String, String>(1);
        map.put("isParasitic", String.valueOf(isParasitic));
        var am = getSystemService(ActivityManager.class);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            map.clear();
            var reasons = am.getHistoricalProcessExitReasons(null, 0, 1);
            if (reasons.size() == 1) {
                map.put("description", reasons.get(0).getDescription());
                map.put("importance", String.valueOf(reasons.get(0).getImportance()));
                map.put("process", reasons.get(0).getProcessName());
                map.put("reason", String.valueOf(reasons.get(0).getReason()));
                map.put("status", String.valueOf(reasons.get(0).getStatus()));
            }
        }
    }

    private void setCrashReport() {
        var handler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
            var time = OffsetDateTime.now();
            var dir = new File(getCacheDir(), "crash");
            //noinspection ResultOfMethodCallIgnored
            dir.mkdir();
            var file = new File(dir, time.toEpochSecond() + ".log");
            try (var pw = new PrintWriter(file)) {
                pw.println(BuildConfig.VERSION_NAME + " (" + BuildConfig.VERSION_CODE + ")");
                pw.println(time);
                pw.println("pid: " + Os.getpid() + " uid: " + Os.getuid());
                throwable.printStackTrace(pw);
            } catch (IOException ignored) {
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                var table = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
                var values = new ContentValues();
                values.put(MediaStore.Downloads.DISPLAY_NAME, "LSPosed_crash_report" + time.toEpochSecond() + ".zip");
                values.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOCUMENTS);
                var cr = getContentResolver();
                var uri = cr.insert(table, values);
                if (uri == null) return;
                try (var zipFd = cr.openFileDescriptor(uri, "wt")) {
                    LSPManagerServiceHolder.getService().getLogs(zipFd);
                } catch (Exception ignored) {
                    cr.delete(uri, null, null);
                }
            }
            if (handler != null) {
                handler.uncaughtException(thread, throwable);
            }
        });
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;

        setCrashReport();
        pref = PreferenceManager.getDefaultSharedPreferences(this);
        if (!pref.contains("doh")) {
            var name = "private_dns_mode";
            if ("hostname".equals(Settings.Global.getString(getContentResolver(), name))) {
                pref.edit().putBoolean("doh", false).apply();
            } else {
                pref.edit().putBoolean("doh", true).apply();
            }
        }
        AppCompatDelegate.setDefaultNightMode(ThemeUtil.getDarkTheme());
        LocaleDelegate.setDefaultLocale(getLocale());
        var res = getResources();
        var config = res.getConfiguration();
        config.setLocale(LocaleDelegate.getDefaultLocale());
        //noinspection deprecation
        res.updateConfiguration(config, res.getDisplayMetrics());

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("org.lsposed.manager.NOTIFICATION");
        registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent inIntent) {
                var intent = (Intent) inIntent.getParcelableExtra(Intent.EXTRA_INTENT);
                Log.d(TAG, "onReceive: " + intent);
                switch (intent.getAction()) {
                    case Intent.ACTION_PACKAGE_ADDED, Intent.ACTION_PACKAGE_CHANGED, Intent.ACTION_PACKAGE_FULLY_REMOVED, Intent.ACTION_UID_REMOVED -> {
                        var userId = intent.getIntExtra(Intent.EXTRA_USER, 0);
                        var packageName = intent.getStringExtra("android.intent.extra.PACKAGES");
                        var packageRemovedForAllUsers = intent.getBooleanExtra(EXTRA_REMOVED_FOR_ALL_USERS, false);
                        var isXposedModule = intent.getBooleanExtra("isXposedModule", false);
                        if (packageName != null) {
                            if (isXposedModule)
                                ModuleUtil.getInstance().reloadSingleModule(packageName, userId, packageRemovedForAllUsers);
                            else
                                App.getExecutorService().submit(() -> AppHelper.getAppList(true));
                        }
                    }
                    case ACTION_USER_ADDED, ACTION_USER_REMOVED, ACTION_USER_INFO_CHANGED -> App.getExecutorService().submit(() -> ModuleUtil.getInstance().reloadInstalledModules());
                }
            }
        }, intentFilter, Context.RECEIVER_NOT_EXPORTED);

        UpdateUtil.loadRemoteVersion();
    }

    @NonNull
    public static OkHttpClient getOkHttpClient() {
        if (okHttpClient != null) return okHttpClient;
        var builder = new OkHttpClient.Builder()
            .cache(getOkHttpCache())
            .dns(new CloudflareDNS());
        if (BuildConfig.DEBUG) {
            var log = new HttpLoggingInterceptor();
            log.setLevel(HttpLoggingInterceptor.Level.HEADERS);
            builder.addInterceptor(log);
        }
        okHttpClient = builder.build();
        return okHttpClient;
    }

    @NonNull
    public static Cache getOkHttpCache() {
        if (okHttpCache != null) return okHttpCache;
        long size50MiB = 50 * 1024 * 1024;
        okHttpCache = new Cache(new File(instance.getCacheDir(), 
Download .txt
gitextract_f3szflt5/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── core.yml
│       └── crowdin.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── app/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── assets/
│           │   └── webview/
│           │       ├── colors_dark.css
│           │       ├── colors_light.css
│           │       ├── markdown.css
│           │       ├── syntax.css
│           │       ├── syntax_dark.css
│           │       ├── template.html
│           │       └── template_dark.html
│           ├── java/
│           │   ├── com/
│           │   │   └── google/
│           │   │       └── android/
│           │   │           └── material/
│           │   │               ├── appbar/
│           │   │               │   └── SubtitleCollapsingToolbarLayout.java
│           │   │               └── internal/
│           │   │                   └── SubtitleCollapsingTextHelper.java
│           │   └── org/
│           │       └── lsposed/
│           │           └── manager/
│           │               ├── App.java
│           │               ├── ConfigManager.java
│           │               ├── Constants.java
│           │               ├── adapters/
│           │               │   ├── AppHelper.java
│           │               │   └── ScopeAdapter.java
│           │               ├── receivers/
│           │               │   └── LSPManagerServiceHolder.java
│           │               ├── repo/
│           │               │   ├── RepoLoader.java
│           │               │   └── model/
│           │               │       ├── Collaborator.java
│           │               │       ├── OnlineModule.java
│           │               │       ├── Release.java
│           │               │       └── ReleaseAsset.java
│           │               ├── ui/
│           │               │   ├── activity/
│           │               │   │   ├── MainActivity.java
│           │               │   │   └── base/
│           │               │   │       └── BaseActivity.java
│           │               │   ├── dialog/
│           │               │   │   ├── BlurBehindDialogBuilder.java
│           │               │   │   ├── FlashDialogBuilder.java
│           │               │   │   └── WelcomeDialog.java
│           │               │   ├── fragment/
│           │               │   │   ├── AppListFragment.java
│           │               │   │   ├── BaseFragment.java
│           │               │   │   ├── CompileDialogFragment.java
│           │               │   │   ├── HomeFragment.java
│           │               │   │   ├── LogsFragment.java
│           │               │   │   ├── ModulesFragment.java
│           │               │   │   ├── RecyclerViewDialogFragment.java
│           │               │   │   ├── RepoFragment.java
│           │               │   │   ├── RepoItemFragment.java
│           │               │   │   └── SettingsFragment.java
│           │               │   └── widget/
│           │               │       ├── EmptyStateRecyclerView.java
│           │               │       ├── ExpandableTextView.java
│           │               │       ├── LinkifyTextView.java
│           │               │       ├── ScrollWebView.java
│           │               │       └── StatefulRecyclerView.java
│           │               └── util/
│           │                   ├── AccessibilityUtils.java
│           │                   ├── AppIconModelLoader.java
│           │                   ├── AppModule.java
│           │                   ├── BackupUtils.java
│           │                   ├── CloudflareDNS.java
│           │                   ├── EmptyAccessibilityDelegate.java
│           │                   ├── ModuleUtil.java
│           │                   ├── NavUtil.java
│           │                   ├── NoSniFactory.java
│           │                   ├── ShortcutUtil.java
│           │                   ├── SimpleStatefulAdaptor.java
│           │                   ├── ThemeUtil.java
│           │                   ├── UpdateUtil.java
│           │                   └── chrome/
│           │                       ├── CustomTabsURLSpan.java
│           │                       └── LinkTransformationMethod.java
│           └── res/
│               ├── anim/
│               │   ├── fragment_enter.xml
│               │   ├── fragment_enter_pop.xml
│               │   ├── fragment_exit.xml
│               │   └── fragment_exit_pop.xml
│               ├── drawable/
│               │   ├── ic_assignment_checkable.xml
│               │   ├── ic_attach_file.xml
│               │   ├── ic_baseline_add_24.xml
│               │   ├── ic_baseline_arrow_back_24.xml
│               │   ├── ic_baseline_assignment_24.xml
│               │   ├── ic_baseline_chat_24.xml
│               │   ├── ic_baseline_extension_24.xml
│               │   ├── ic_baseline_get_app_24.xml
│               │   ├── ic_baseline_home_24.xml
│               │   ├── ic_baseline_info_24.xml
│               │   ├── ic_baseline_search_24.xml
│               │   ├── ic_baseline_settings_24.xml
│               │   ├── ic_baseline_settings_backup_restore_24.xml
│               │   ├── ic_extension_checkable.xml
│               │   ├── ic_get_app_checkable.xml
│               │   ├── ic_home_checkable.xml
│               │   ├── ic_keyboard_arrow_down.xml
│               │   ├── ic_launcher.xml
│               │   ├── ic_launcher_foreground.xml
│               │   ├── ic_launcher_round.xml
│               │   ├── ic_open_in_browser.xml
│               │   ├── ic_outline_android_24.xml
│               │   ├── ic_outline_app_shortcut_24.xml
│               │   ├── ic_outline_assignment_24.xml
│               │   ├── ic_outline_dark_mode_24.xml
│               │   ├── ic_outline_dns_24.xml
│               │   ├── ic_outline_extension_24.xml
│               │   ├── ic_outline_format_color_fill_24.xml
│               │   ├── ic_outline_get_app_24.xml
│               │   ├── ic_outline_groups_24.xml
│               │   ├── ic_outline_home_24.xml
│               │   ├── ic_outline_invert_colors_24.xml
│               │   ├── ic_outline_language_24.xml
│               │   ├── ic_outline_merge_type_24.xml
│               │   ├── ic_outline_palette_24.xml
│               │   ├── ic_outline_restore_24.xml
│               │   ├── ic_outline_settings_24.xml
│               │   ├── ic_outline_shield_24.xml
│               │   ├── ic_outline_speaker_notes_24.xml
│               │   ├── ic_outline_translate_24.xml
│               │   ├── ic_round_bug_report_24.xml
│               │   ├── ic_round_check_circle_24.xml
│               │   ├── ic_round_error_outline_24.xml
│               │   ├── ic_round_settings_24.xml
│               │   ├── ic_round_update_24.xml
│               │   ├── ic_round_warning_24.xml
│               │   ├── ic_save.xml
│               │   ├── ic_settings_checkable.xml
│               │   ├── shortcut_ic_logs.xml
│               │   ├── shortcut_ic_modules.xml
│               │   ├── shortcut_ic_repo.xml
│               │   ├── shortcut_ic_settings.xml
│               │   └── simple_menu_background.xml
│               ├── layout/
│               │   ├── activity_main.xml
│               │   ├── dialog_about.xml
│               │   ├── dialog_item.xml
│               │   ├── dialog_title.xml
│               │   ├── fragment_app_list.xml
│               │   ├── fragment_compile_dialog.xml
│               │   ├── fragment_home.xml
│               │   ├── fragment_pager.xml
│               │   ├── fragment_repo.xml
│               │   ├── fragment_settings.xml
│               │   ├── item_log_textview.xml
│               │   ├── item_master_switch.xml
│               │   ├── item_module.xml
│               │   ├── item_onlinemodule.xml
│               │   ├── item_repo_loadmore.xml
│               │   ├── item_repo_readme.xml
│               │   ├── item_repo_recyclerview.xml
│               │   ├── item_repo_release.xml
│               │   ├── item_repo_title_description.xml
│               │   ├── preference_recyclerview.xml
│               │   ├── scrollable_dialog.xml
│               │   └── swiperefresh_recyclerview.xml
│               ├── layout-sw600dp/
│               │   └── activity_main.xml
│               ├── menu/
│               │   ├── context_menu_modules.xml
│               │   ├── menu_app_item.xml
│               │   ├── menu_app_list.xml
│               │   ├── menu_home.xml
│               │   ├── menu_logs.xml
│               │   ├── menu_modules.xml
│               │   ├── menu_repo.xml
│               │   ├── menu_repo_item.xml
│               │   └── navigation_menu.xml
│               ├── menu-sw600dp/
│               │   └── navigation_menu.xml
│               ├── navigation/
│               │   ├── main_nav.xml
│               │   ├── modules_nav.xml
│               │   └── repo_nav.xml
│               ├── values/
│               │   ├── arrays.xml
│               │   ├── attrs.xml
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── integer.xml
│               │   ├── settings.xml
│               │   ├── strings.xml
│               │   ├── strings_untranslatable.xml
│               │   ├── styles.xml
│               │   ├── themes.xml
│               │   ├── themes_custom.xml
│               │   ├── themes_overlay.xml
│               │   └── themes_override.xml
│               ├── values-af/
│               │   └── strings.xml
│               ├── values-ar/
│               │   └── strings.xml
│               ├── values-bg/
│               │   └── strings.xml
│               ├── values-bn/
│               │   └── strings.xml
│               ├── values-ca/
│               │   └── strings.xml
│               ├── values-cs/
│               │   └── strings.xml
│               ├── values-da/
│               │   └── strings.xml
│               ├── values-de/
│               │   └── strings.xml
│               ├── values-el/
│               │   └── strings.xml
│               ├── values-es/
│               │   └── strings.xml
│               ├── values-et/
│               │   └── strings.xml
│               ├── values-fa/
│               │   └── strings.xml
│               ├── values-fi/
│               │   └── strings.xml
│               ├── values-fr/
│               │   └── strings.xml
│               ├── values-hi/
│               │   └── strings.xml
│               ├── values-hr/
│               │   └── strings.xml
│               ├── values-hu/
│               │   └── strings.xml
│               ├── values-in/
│               │   └── strings.xml
│               ├── values-it/
│               │   └── strings.xml
│               ├── values-iw/
│               │   └── strings.xml
│               ├── values-ja/
│               │   └── strings.xml
│               ├── values-ko/
│               │   └── strings.xml
│               ├── values-ku/
│               │   └── strings.xml
│               ├── values-lt/
│               │   └── strings.xml
│               ├── values-night/
│               │   ├── colors.xml
│               │   └── styles.xml
│               ├── values-night-v31/
│               │   └── colors.xml
│               ├── values-nl/
│               │   └── strings.xml
│               ├── values-no/
│               │   └── strings.xml
│               ├── values-pl/
│               │   └── strings.xml
│               ├── values-pt/
│               │   └── strings.xml
│               ├── values-pt-rBR/
│               │   └── strings.xml
│               ├── values-ro/
│               │   └── strings.xml
│               ├── values-ru/
│               │   └── strings.xml
│               ├── values-si/
│               │   └── strings.xml
│               ├── values-sk/
│               │   └── strings.xml
│               ├── values-sv/
│               │   └── strings.xml
│               ├── values-sw600dp/
│               │   └── integer.xml
│               ├── values-th/
│               │   └── strings.xml
│               ├── values-tr/
│               │   └── strings.xml
│               ├── values-uk/
│               │   └── strings.xml
│               ├── values-ur/
│               │   └── strings.xml
│               ├── values-v28/
│               │   ├── dimens.xml
│               │   └── themes.xml
│               ├── values-v29/
│               │   └── settings.xml
│               ├── values-v30/
│               │   └── themes.xml
│               ├── values-v31/
│               │   └── colors.xml
│               ├── values-vi/
│               │   └── strings.xml
│               ├── values-zh-rCN/
│               │   └── strings.xml
│               ├── values-zh-rHK/
│               │   └── strings.xml
│               ├── values-zh-rTW/
│               │   └── strings.xml
│               └── xml/
│                   ├── prefs.xml
│                   └── shortcuts.xml
├── build.gradle.kts
├── core/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           └── java/
│               ├── android/
│               │   ├── app/
│               │   │   └── AndroidAppHelper.java
│               │   └── content/
│               │       └── res/
│               │           ├── XModuleResources.java
│               │           ├── XResForwarder.java
│               │           └── XResources.java
│               ├── de/
│               │   └── robv/
│               │       └── android/
│               │           └── xposed/
│               │               ├── IXposedHookCmdInit.java
│               │               ├── IXposedHookInitPackageResources.java
│               │               ├── IXposedHookLoadPackage.java
│               │               ├── IXposedHookZygoteInit.java
│               │               ├── IXposedMod.java
│               │               ├── SELinuxHelper.java
│               │               ├── XC_MethodHook.java
│               │               ├── XC_MethodReplacement.java
│               │               ├── XSharedPreferences.java
│               │               ├── XposedBridge.java
│               │               ├── XposedHelpers.java
│               │               ├── XposedInit.java
│               │               ├── callbacks/
│               │               │   ├── IXUnhook.java
│               │               │   ├── XC_InitPackageResources.java
│               │               │   ├── XC_LayoutInflated.java
│               │               │   ├── XC_LoadPackage.java
│               │               │   └── XCallback.java
│               │               └── services/
│               │                   ├── BaseService.java
│               │                   ├── DirectAccessService.java
│               │                   └── FileResult.java
│               └── org/
│                   └── lsposed/
│                       └── lspd/
│                           ├── core/
│                           │   ├── ApplicationServiceClient.java
│                           │   └── Startup.java
│                           ├── deopt/
│                           │   ├── InlinedMethodCallers.java
│                           │   └── PrebuiltMethodsDeopter.java
│                           ├── hooker/
│                           │   ├── AttachHooker.java
│                           │   ├── CrashDumpHooker.java
│                           │   ├── HandleSystemServerProcessHooker.java
│                           │   ├── LoadedApkCreateCLHooker.java
│                           │   ├── LoadedApkCtorHooker.java
│                           │   ├── OpenDexFileHooker.java
│                           │   └── StartBootstrapServicesHooker.java
│                           ├── impl/
│                           │   ├── LSPosedBridge.java
│                           │   ├── LSPosedContext.java
│                           │   ├── LSPosedHelper.java
│                           │   ├── LSPosedHookCallback.java
│                           │   └── LSPosedRemotePreferences.java
│                           └── util/
│                               ├── ClassPathURLStreamHandler.java
│                               ├── Hookers.java
│                               ├── LspModuleClassLoader.java
│                               └── MetaDataReader.java
├── crowdin.yml
├── daemon/
│   ├── .gitignore
│   ├── build.gradle.kts
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           ├── java/
│           │   └── org/
│           │       └── lsposed/
│           │           └── lspd/
│           │               ├── Main.java
│           │               ├── service/
│           │               │   ├── ActivityManagerService.java
│           │               │   ├── BridgeService.java
│           │               │   ├── ConfigFileManager.java
│           │               │   ├── ConfigManager.java
│           │               │   ├── Dex2OatService.java
│           │               │   ├── LSPApplicationService.java
│           │               │   ├── LSPInjectedModuleService.java
│           │               │   ├── LSPManagerService.java
│           │               │   ├── LSPModuleService.java
│           │               │   ├── LSPNotificationManager.java
│           │               │   ├── LSPSystemServerService.java
│           │               │   ├── LSPosedService.java
│           │               │   ├── LogcatService.java
│           │               │   ├── ObfuscationManager.java
│           │               │   ├── PackageService.java
│           │               │   ├── PowerService.java
│           │               │   ├── ServiceManager.java
│           │               │   └── UserService.java
│           │               └── util/
│           │                   ├── FakeContext.java
│           │                   └── InstallerVerifier.java
│           ├── jni/
│           │   ├── CMakeLists.txt
│           │   ├── dex2oat.cpp
│           │   ├── logcat.cpp
│           │   ├── logcat.h
│           │   ├── logging.h
│           │   ├── obfuscation.cpp
│           │   └── obfuscation.h
│           └── res/
│               ├── drawable/
│               │   ├── ic_baseline_block_24.xml
│               │   ├── ic_baseline_check_24.xml
│               │   ├── ic_baseline_close_24.xml
│               │   └── ic_notification.xml
│               ├── values/
│               │   └── strings.xml
│               ├── values-af/
│               │   └── strings.xml
│               ├── values-ar/
│               │   └── strings.xml
│               ├── values-bg/
│               │   └── strings.xml
│               ├── values-bn/
│               │   └── strings.xml
│               ├── values-ca/
│               │   └── strings.xml
│               ├── values-cs/
│               │   └── strings.xml
│               ├── values-da/
│               │   └── strings.xml
│               ├── values-de/
│               │   └── strings.xml
│               ├── values-el/
│               │   └── strings.xml
│               ├── values-es/
│               │   └── strings.xml
│               ├── values-et/
│               │   └── strings.xml
│               ├── values-fa/
│               │   └── strings.xml
│               ├── values-fi/
│               │   └── strings.xml
│               ├── values-fr/
│               │   └── strings.xml
│               ├── values-hi/
│               │   └── strings.xml
│               ├── values-hr/
│               │   └── strings.xml
│               ├── values-hu/
│               │   └── strings.xml
│               ├── values-in/
│               │   └── strings.xml
│               ├── values-it/
│               │   └── strings.xml
│               ├── values-iw/
│               │   └── strings.xml
│               ├── values-ja/
│               │   └── strings.xml
│               ├── values-ko/
│               │   └── strings.xml
│               ├── values-ku/
│               │   └── strings.xml
│               ├── values-lt/
│               │   └── strings.xml
│               ├── values-nl/
│               │   └── strings.xml
│               ├── values-no/
│               │   └── strings.xml
│               ├── values-pl/
│               │   └── strings.xml
│               ├── values-pt/
│               │   └── strings.xml
│               ├── values-pt-rBR/
│               │   └── strings.xml
│               ├── values-ro/
│               │   └── strings.xml
│               ├── values-ru/
│               │   └── strings.xml
│               ├── values-si/
│               │   └── strings.xml
│               ├── values-sk/
│               │   └── strings.xml
│               ├── values-sv/
│               │   └── strings.xml
│               ├── values-th/
│               │   └── strings.xml
│               ├── values-tr/
│               │   └── strings.xml
│               ├── values-uk/
│               │   └── strings.xml
│               ├── values-ur/
│               │   └── strings.xml
│               ├── values-vi/
│               │   └── strings.xml
│               ├── values-zh-rCN/
│               │   └── strings.xml
│               ├── values-zh-rHK/
│               │   └── strings.xml
│               └── values-zh-rTW/
│                   └── strings.xml
├── dex2oat/
│   ├── .gitignore
│   ├── README.md
│   ├── build.gradle.kts
│   └── src/
│       └── main/
│           └── cpp/
│               ├── CMakeLists.txt
│               ├── dex2oat.cpp
│               ├── include/
│               │   ├── base_macros.h
│               │   ├── logging.h
│               │   ├── macros.h
│               │   └── oat.h
│               └── oat_hook.cpp
├── external/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── apache/
│   │   ├── .gitignore
│   │   ├── build.gradle.kts
│   │   └── local/
│   │       └── MemberUtilsX.java
│   └── axml/
│       └── build.gradle.kts
├── gradle/
│   ├── libs.versions.toml
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── hiddenapi/
│   ├── bridge/
│   │   ├── .gitignore
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── hidden/
│   │                   ├── ByteBufferDexClassLoader.java
│   │                   └── HiddenApiBridge.java
│   └── stubs/
│       ├── .gitignore
│       ├── build.gradle.kts
│       └── src/
│           └── main/
│               └── java/
│                   ├── android/
│                   │   ├── annotation/
│                   │   │   ├── NonNull.java
│                   │   │   └── Nullable.java
│                   │   ├── app/
│                   │   │   ├── ActivityManager.java
│                   │   │   ├── ActivityThread.java
│                   │   │   ├── Application.java
│                   │   │   ├── ContentProviderHolder.java
│                   │   │   ├── ContextImpl.java
│                   │   │   ├── IActivityController.java
│                   │   │   ├── IActivityManager.java
│                   │   │   ├── IApplicationThread.java
│                   │   │   ├── INotificationManager.java
│                   │   │   ├── IServiceConnection.java
│                   │   │   ├── IUidObserver.java
│                   │   │   ├── LoadedApk.java
│                   │   │   ├── Notification.java
│                   │   │   ├── NotificationChannel.java
│                   │   │   ├── ProfilerInfo.java
│                   │   │   └── ResourcesManager.java
│                   │   ├── content/
│                   │   │   ├── AttributionSource.java
│                   │   │   ├── BroadcastReceiver.java
│                   │   │   ├── ComponentName.java
│                   │   │   ├── Context.java
│                   │   │   ├── IContentProvider.java
│                   │   │   ├── IIntentReceiver.java
│                   │   │   ├── IIntentSender.java
│                   │   │   ├── Intent.java
│                   │   │   ├── IntentFilter.java
│                   │   │   ├── IntentSender.java
│                   │   │   ├── pm/
│                   │   │   │   ├── ApplicationInfo.java
│                   │   │   │   ├── BaseParceledListSlice.java
│                   │   │   │   ├── IPackageInstaller.java
│                   │   │   │   ├── IPackageManager.java
│                   │   │   │   ├── PackageInfo.java
│                   │   │   │   ├── PackageInstaller.java
│                   │   │   │   ├── PackageManager.java
│                   │   │   │   ├── PackageParser.java
│                   │   │   │   ├── ParceledListSlice.java
│                   │   │   │   ├── ResolveInfo.java
│                   │   │   │   ├── UserInfo.java
│                   │   │   │   └── VersionedPackage.java
│                   │   │   └── res/
│                   │   │       ├── AssetManager.java
│                   │   │       ├── CompatibilityInfo.java
│                   │   │       ├── Configuration.java
│                   │   │       ├── Resources.java
│                   │   │       ├── ResourcesImpl.java
│                   │   │       ├── ResourcesKey.java
│                   │   │       └── TypedArray.java
│                   │   ├── ddm/
│                   │   │   └── DdmHandleAppName.java
│                   │   ├── graphics/
│                   │   │   ├── Movie.java
│                   │   │   └── drawable/
│                   │   │       └── Drawable.java
│                   │   ├── os/
│                   │   │   ├── Binder.java
│                   │   │   ├── Build.java
│                   │   │   ├── Bundle.java
│                   │   │   ├── Environment.java
│                   │   │   ├── Handler.java
│                   │   │   ├── IBinder.java
│                   │   │   ├── IInterface.java
│                   │   │   ├── IPowerManager.java
│                   │   │   ├── IServiceCallback.java
│                   │   │   ├── IServiceManager.java
│                   │   │   ├── IUserManager.java
│                   │   │   ├── Parcel.java
│                   │   │   ├── Parcelable.java
│                   │   │   ├── PersistableBundle.java
│                   │   │   ├── RemoteException.java
│                   │   │   ├── ResultReceiver.java
│                   │   │   ├── SELinux.java
│                   │   │   ├── ServiceManager.java
│                   │   │   ├── ShellCallback.java
│                   │   │   ├── ShellCommand.java
│                   │   │   ├── SystemProperties.java
│                   │   │   ├── UserHandle.java
│                   │   │   └── UserManager.java
│                   │   ├── permission/
│                   │   │   └── IPermissionManager.java
│                   │   ├── system/
│                   │   │   ├── ErrnoException.java
│                   │   │   ├── Int32Ref.java
│                   │   │   └── Os.java
│                   │   ├── util/
│                   │   │   ├── DisplayMetrics.java
│                   │   │   ├── MutableInt.java
│                   │   │   └── TypedValue.java
│                   │   ├── view/
│                   │   │   └── IWindowManager.java
│                   │   └── webkit/
│                   │       ├── WebViewDelegate.java
│                   │       ├── WebViewFactory.java
│                   │       └── WebViewFactoryProvider.java
│                   ├── androidx/
│                   │   └── annotation/
│                   │       ├── IntRange.java
│                   │       └── RequiresApi.java
│                   ├── com/
│                   │   └── android/
│                   │       ├── internal/
│                   │       │   ├── os/
│                   │       │   │   ├── BinderInternal.java
│                   │       │   │   └── ZygoteInit.java
│                   │       │   └── util/
│                   │       │       └── XmlUtils.java
│                   │       └── server/
│                   │           ├── LocalServices.java
│                   │           ├── SystemService.java
│                   │           ├── SystemServiceManager.java
│                   │           └── am/
│                   │               ├── ActivityManagerService.java
│                   │               └── ProcessRecord.java
│                   ├── dalvik/
│                   │   └── system/
│                   │       ├── BaseDexClassLoader.java
│                   │       └── VMRuntime.java
│                   ├── org/
│                   │   └── xmlpull/
│                   │       └── v1/
│                   │           └── XmlPullParserException.java
│                   ├── sun/
│                   │   ├── misc/
│                   │   │   └── CompoundEnumeration.java
│                   │   └── net/
│                   │       └── www/
│                   │           ├── ParseUtil.java
│                   │           └── protocol/
│                   │               └── jar/
│                   │                   └── Handler.java
│                   └── xposed/
│                       └── dummy/
│                           ├── XResourcesSuperClass.java
│                           └── XTypedArraySuperClass.java
├── magisk-loader/
│   └── update/
│       ├── changelog.md
│       └── zygisk.json
├── native/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── include/
│   │   ├── common/
│   │   │   ├── config.h
│   │   │   └── logging.h
│   │   ├── core/
│   │   │   ├── config_bridge.h
│   │   │   ├── context.h
│   │   │   └── native_api.h
│   │   ├── elf/
│   │   │   ├── elf_image.h
│   │   │   └── symbol_cache.h
│   │   ├── framework/
│   │   │   └── android_types.h
│   │   └── jni/
│   │       ├── jni_bridge.h
│   │       └── jni_hooks.h
│   └── src/
│       ├── core/
│       │   ├── context.cpp
│       │   └── native_api.cpp
│       ├── elf/
│       │   ├── elf_image.cpp
│       │   └── symbol_cache.cpp
│       └── jni/
│           ├── dex_parser_bridge.cpp
│           ├── hook_bridge.cpp
│           ├── native_api_bridge.cpp
│           └── resources_hook.cpp
├── services/
│   ├── daemon-service/
│   │   ├── .gitignore
│   │   ├── build.gradle.kts
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── aidl/
│   │           │   └── org/
│   │           │       └── lsposed/
│   │           │           └── lspd/
│   │           │               ├── models/
│   │           │               │   ├── Module.aidl
│   │           │               │   └── PreLoadedApk.aidl
│   │           │               └── service/
│   │           │                   ├── ILSPApplicationService.aidl
│   │           │                   ├── ILSPInjectedModuleService.aidl
│   │           │                   ├── ILSPSystemServerService.aidl
│   │           │                   ├── ILSPosedService.aidl
│   │           │                   └── IRemotePreferenceCallback.aidl
│   │           └── java/
│   │               └── org/
│   │                   └── lsposed/
│   │                       └── lspd/
│   │                           └── util/
│   │                               └── Utils.java
│   └── manager-service/
│       ├── .gitignore
│       ├── build.gradle.kts
│       └── src/
│           └── main/
│               ├── AndroidManifest.xml
│               └── aidl/
│                   └── org/
│                       └── lsposed/
│                           └── lspd/
│                               ├── ILSPManagerService.aidl
│                               └── models/
│                                   ├── Application.aidl
│                                   └── UserInfo.aidl
├── settings.gradle.kts
├── xposed/
│   ├── README.md
│   ├── build.gradle.kts
│   └── src/
│       └── main/
│           └── kotlin/
│               └── org/
│                   └── matrix/
│                       └── vector/
│                           ├── impl/
│                           │   └── utils/
│                           │       └── VectorDexParser.kt
│                           └── nativebridge/
│                               ├── DexParserBridge.kt
│                               ├── HookBridge.kt
│                               ├── NativeAPI.kt
│                               └── ResourcesHook.kt
└── zygisk/
    ├── .gitignore
    ├── README.md
    ├── build.gradle.kts
    ├── module/
    │   ├── META-INF/
    │   │   └── com/
    │   │       └── google/
    │   │           └── android/
    │   │               ├── update-binary
    │   │               └── updater-script
    │   ├── action.sh
    │   ├── customize.sh
    │   ├── daemon
    │   ├── module.prop
    │   ├── sepolicy.rule
    │   ├── service.sh
    │   ├── system.prop
    │   └── uninstall.sh
    ├── proguard-rules.pro
    ├── src/
    │   └── main/
    │       ├── AndroidManifest.xml
    │       ├── cpp/
    │       │   ├── CMakeLists.txt
    │       │   ├── include/
    │       │   │   ├── ipc_bridge.h
    │       │   │   └── zygisk.hpp
    │       │   ├── ipc_bridge.cpp
    │       │   └── module.cpp
    │       └── kotlin/
    │           └── org/
    │               └── matrix/
    │                   └── vector/
    │                       ├── ParasiticManagerHooker.kt
    │                       ├── ParasiticManagerSystemHooker.kt
    │                       ├── core/
    │                       │   └── Main.kt
    │                       └── service/
    │                           ├── BridgeService.kt
    │                           └── ParcelUtils.kt
    └── zygisk.json
Download .txt
Showing preview only (209K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2384 symbols across 245 files)

FILE: app/src/main/java/com/google/android/material/appbar/SubtitleCollapsingToolbarLayout.java
  class SubtitleCollapsingToolbarLayout (line 45) | public class SubtitleCollapsingToolbarLayout extends FrameLayout {
    method SubtitleCollapsingToolbarLayout (line 85) | public SubtitleCollapsingToolbarLayout(@NonNull Context context) {
    method SubtitleCollapsingToolbarLayout (line 89) | public SubtitleCollapsingToolbarLayout(@NonNull Context context, @Null...
    method SubtitleCollapsingToolbarLayout (line 93) | public SubtitleCollapsingToolbarLayout(@NonNull Context context, @Null...
    method onAttachedToWindow (line 183) | @Override
    method onDetachedFromWindow (line 203) | @Override
    method draw (line 214) | @Override
    method drawChild (line 242) | @Override
    method onSizeChanged (line 256) | @Override
    method ensureToolbar (line 264) | private void ensureToolbar() {
    method isToolbarChild (line 299) | private boolean isToolbarChild(View child) {
    method findDirectChild (line 308) | @NonNull
    method updateDummyView (line 319) | private void updateDummyView() {
    method onMeasure (line 337) | @Override
    method onLayout (line 361) | @Override
    method getHeightWithMargins (line 431) | private static int getHeightWithMargins(@NonNull final View view) {
    method getViewOffsetHelper (line 440) | static ViewOffsetHelper getViewOffsetHelper(View view) {
    method setTitle (line 456) | public void setTitle(@Nullable CharSequence title) {
    method getTitle (line 467) | @Nullable
    method setSubtitle (line 479) | public void setSubtitle(@Nullable CharSequence subtitle) {
    method getSubtitle (line 490) | @Nullable
    method setTitleEnabled (line 505) | public void setTitleEnabled(boolean enabled) {
    method isTitleEnabled (line 520) | public boolean isTitleEnabled() {
    method setScrimsShown (line 533) | public void setScrimsShown(boolean shown) {
    method setScrimsShown (line 546) | public void setScrimsShown(boolean shown, boolean animate) {
    method animateScrim (line 557) | private void animateScrim(int targetAlpha) {
    method setScrimAlpha (line 579) | void setScrimAlpha(int alpha) {
    method getScrimAlpha (line 590) | int getScrimAlpha() {
    method setContentScrim (line 602) | public void setContentScrim(@Nullable Drawable drawable) {
    method setContentScrimColor (line 624) | public void setContentScrimColor(@ColorInt int color) {
    method setContentScrimResource (line 635) | public void setContentScrimResource(@DrawableRes int resId) {
    method getContentScrim (line 645) | @Nullable
    method setStatusBarScrim (line 660) | public void setStatusBarScrim(@Nullable Drawable drawable) {
    method drawableStateChanged (line 679) | @Override
    method verifyDrawable (line 703) | @Override
    method setVisibility (line 708) | @Override
    method setStatusBarScrimColor (line 730) | public void setStatusBarScrimColor(@ColorInt int color) {
    method setStatusBarScrimResource (line 741) | public void setStatusBarScrimResource(@DrawableRes int resId) {
    method getStatusBarScrim (line 751) | @Nullable
    method setCollapsedTitleTextAppearance (line 762) | public void setCollapsedTitleTextAppearance(@StyleRes int resId) {
    method setCollapsedTitleTextColor (line 771) | public void setCollapsedTitleTextColor(@ColorInt int color) {
    method setCollapsedTitleTextColor (line 780) | public void setCollapsedTitleTextColor(@NonNull ColorStateList colors) {
    method setCollapsedSubtitleTextAppearance (line 790) | public void setCollapsedSubtitleTextAppearance(@StyleRes int resId) {
    method setCollapsedSubtitleTextColor (line 799) | public void setCollapsedSubtitleTextColor(@ColorInt int color) {
    method setCollapsedSubtitleTextColor (line 808) | public void setCollapsedSubtitleTextColor(@NonNull ColorStateList colo...
    method setCollapsedTitleGravity (line 818) | public void setCollapsedTitleGravity(int gravity) {
    method getCollapsedTitleGravity (line 827) | public int getCollapsedTitleGravity() {
    method setExpandedTitleTextAppearance (line 836) | public void setExpandedTitleTextAppearance(@StyleRes int resId) {
    method setExpandedTitleTextColor (line 845) | public void setExpandedTitleTextColor(@ColorInt int color) {
    method setExpandedTitleTextColor (line 854) | public void setExpandedTitleTextColor(@NonNull ColorStateList colors) {
    method setExpandedSubtitleTextAppearance (line 863) | public void setExpandedSubtitleTextAppearance(@StyleRes int resId) {
    method setExpandedSubtitleTextColor (line 872) | public void setExpandedSubtitleTextColor(@ColorInt int color) {
    method setExpandedSubtitleTextColor (line 881) | public void setExpandedSubtitleTextColor(@NonNull ColorStateList color...
    method setExpandedTitleGravity (line 891) | public void setExpandedTitleGravity(int gravity) {
    method getExpandedTitleGravity (line 900) | public int getExpandedTitleGravity() {
    method setCollapsedTitleTypeface (line 909) | public void setCollapsedTitleTypeface(@Nullable Typeface typeface) {
    method getCollapsedTitleTypeface (line 916) | @NonNull
    method setExpandedTitleTypeface (line 926) | public void setExpandedTitleTypeface(@Nullable Typeface typeface) {
    method getExpandedTitleTypeface (line 933) | @NonNull
    method setCollapsedSubtitleTypeface (line 943) | public void setCollapsedSubtitleTypeface(@Nullable Typeface typeface) {
    method getCollapsedSubtitleTypeface (line 950) | @NonNull
    method setExpandedSubtitleTypeface (line 960) | public void setExpandedSubtitleTypeface(@Nullable Typeface typeface) {
    method getExpandedSubtitleTypeface (line 967) | @NonNull
    method setExpandedTitleMargin (line 985) | public void setExpandedTitleMargin(int start, int top, int end, int bo...
    method getExpandedTitleMarginStart (line 998) | public int getExpandedTitleMarginStart() {
    method setExpandedTitleMarginStart (line 1009) | public void setExpandedTitleMarginStart(int margin) {
    method getExpandedTitleMarginTop (line 1019) | public int getExpandedTitleMarginTop() {
    method setExpandedTitleMarginTop (line 1030) | public void setExpandedTitleMarginTop(int margin) {
    method getExpandedTitleMarginEnd (line 1040) | public int getExpandedTitleMarginEnd() {
    method setExpandedTitleMarginEnd (line 1051) | public void setExpandedTitleMarginEnd(int margin) {
    method getExpandedTitleMarginBottom (line 1061) | public int getExpandedTitleMarginBottom() {
    method setExpandedTitleMarginBottom (line 1072) | public void setExpandedTitleMarginBottom(int margin) {
    method setRtlTextDirectionHeuristicsEnabled (line 1081) | public void setRtlTextDirectionHeuristicsEnabled(boolean rtlTextDirect...
    method isRtlTextDirectionHeuristicsEnabled (line 1089) | public boolean isRtlTextDirectionHeuristicsEnabled() {
    method setScrimVisibleHeightTrigger (line 1103) | public void setScrimVisibleHeightTrigger(@IntRange(from = 0) final int...
    method getScrimVisibleHeightTrigger (line 1117) | public int getScrimVisibleHeightTrigger() {
    method setScrimAnimationDuration (line 1143) | public void setScrimAnimationDuration(@IntRange(from = 0) final long d...
    method getScrimAnimationDuration (line 1150) | public long getScrimAnimationDuration() {
    method checkLayoutParams (line 1154) | @Override
    method generateDefaultLayoutParams (line 1159) | @Override
    method generateLayoutParams (line 1164) | @Override
    method generateLayoutParams (line 1169) | @Override
    class LayoutParams (line 1174) | public static class LayoutParams extends CollapsingToolbarLayout.Layou...
      method LayoutParams (line 1175) | public LayoutParams(Context c, AttributeSet attrs) {
      method LayoutParams (line 1179) | public LayoutParams(int width, int height) {
      method LayoutParams (line 1183) | public LayoutParams(int width, int height, int gravity) {
      method LayoutParams (line 1187) | public LayoutParams(ViewGroup.LayoutParams p) {
      method LayoutParams (line 1191) | public LayoutParams(MarginLayoutParams source) {
      method LayoutParams (line 1195) | @RequiresApi(19)
    method updateScrimVisibility (line 1204) | final void updateScrimVisibility() {
    method getMaxOffsetForPinChild (line 1210) | final int getMaxOffsetForPinChild(View child) {
    method updateContentDescriptionFromTitle (line 1216) | private void updateContentDescriptionFromTitle() {
    class OffsetUpdateListener (line 1221) | private class OffsetUpdateListener implements AppBarLayout.OnOffsetCha...
      method OffsetUpdateListener (line 1222) | OffsetUpdateListener() {
      method onOffsetChanged (line 1225) | @Override

FILE: app/src/main/java/com/google/android/material/internal/SubtitleCollapsingTextHelper.java
  class SubtitleCollapsingTextHelper (line 35) | public final class SubtitleCollapsingTextHelper {
    method SubtitleCollapsingTextHelper (line 122) | public SubtitleCollapsingTextHelper(View view) {
    method setTextSizeInterpolator (line 136) | public void setTextSizeInterpolator(TimeInterpolator interpolator) {
    method setPositionInterpolator (line 141) | public void setPositionInterpolator(TimeInterpolator interpolator) {
    method setExpandedTitleTextSize (line 146) | public void setExpandedTitleTextSize(float textSize) {
    method setCollapsedTitleTextSize (line 153) | public void setCollapsedTitleTextSize(float textSize) {
    method setExpandedSubtitleTextSize (line 160) | public void setExpandedSubtitleTextSize(float textSize) {
    method setCollapsedSubtitleTextSize (line 167) | public void setCollapsedSubtitleTextSize(float textSize) {
    method setCollapsedTitleTextColor (line 174) | public void setCollapsedTitleTextColor(ColorStateList textColor) {
    method setExpandedTitleTextColor (line 181) | public void setExpandedTitleTextColor(ColorStateList textColor) {
    method setCollapsedSubtitleTextColor (line 188) | public void setCollapsedSubtitleTextColor(ColorStateList textColor) {
    method setExpandedSubtitleTextColor (line 195) | public void setExpandedSubtitleTextColor(ColorStateList textColor) {
    method setExpandedBounds (line 202) | public void setExpandedBounds(int left, int top, int right, int bottom) {
    method setExpandedBounds (line 210) | public void setExpandedBounds(@NonNull Rect bounds) {
    method setCollapsedBounds (line 214) | public void setCollapsedBounds(int left, int top, int right, int botto...
    method setCollapsedBounds (line 222) | public void setCollapsedBounds(@NonNull Rect bounds) {
    method getCollapsedTitleTextActualBounds (line 226) | public void getCollapsedTitleTextActualBounds(@NonNull RectF bounds) {
    method calculateCollapsedTitleTextWidth (line 235) | public float calculateCollapsedTitleTextWidth() {
    method getCollapsedSubtitleTextActualBounds (line 243) | public void getCollapsedSubtitleTextActualBounds(@NonNull RectF bounds) {
    method calculateCollapsedSubtitleTextWidth (line 252) | public float calculateCollapsedSubtitleTextWidth() {
    method getExpandedTitleTextHeight (line 260) | public float getExpandedTitleTextHeight() {
    method getCollapsedTitleTextHeight (line 266) | public float getCollapsedTitleTextHeight() {
    method getExpandedSubtitleTextHeight (line 272) | public float getExpandedSubtitleTextHeight() {
    method getCollapsedSubtitleTextHeight (line 278) | public float getCollapsedSubtitleTextHeight() {
    method getTitleTextPaintExpanded (line 284) | private void getTitleTextPaintExpanded(@NonNull TextPaint textPaint) {
    method getTitleTextPaintCollapsed (line 289) | private void getTitleTextPaintCollapsed(@NonNull TextPaint textPaint) {
    method getSubtitleTextPaintExpanded (line 294) | private void getSubtitleTextPaintExpanded(@NonNull TextPaint textPaint) {
    method getSubtitleTextPaintCollapsed (line 299) | private void getSubtitleTextPaintCollapsed(@NonNull TextPaint textPain...
    method onBoundsChanged (line 304) | void onBoundsChanged() {
    method setExpandedTextGravity (line 311) | public void setExpandedTextGravity(int gravity) {
    method getExpandedTextGravity (line 318) | public int getExpandedTextGravity() {
    method setCollapsedTextGravity (line 322) | public void setCollapsedTextGravity(int gravity) {
    method getCollapsedTextGravity (line 329) | public int getCollapsedTextGravity() {
    method setCollapsedTitleTextAppearance (line 333) | public void setCollapsedTitleTextAppearance(int resId) {
    method setExpandedTitleTextAppearance (line 364) | public void setExpandedTitleTextAppearance(int resId) {
    method setCollapsedSubtitleTextAppearance (line 394) | public void setCollapsedSubtitleTextAppearance(int resId) {
    method setExpandedSubtitleTextAppearance (line 425) | public void setExpandedSubtitleTextAppearance(int resId) {
    method setCollapsedTitleTypeface (line 455) | public void setCollapsedTitleTypeface(Typeface typeface) {
    method setExpandedTitleTypeface (line 461) | public void setExpandedTitleTypeface(Typeface typeface) {
    method setCollapsedSubtitleTypeface (line 467) | public void setCollapsedSubtitleTypeface(Typeface typeface) {
    method setExpandedSubtitleTypeface (line 473) | public void setExpandedSubtitleTypeface(Typeface typeface) {
    method setTitleTypefaces (line 479) | public void setTitleTypefaces(Typeface typeface) {
    method setSubtitleTypefaces (line 487) | public void setSubtitleTypefaces(Typeface typeface) {
    method setCollapsedTitleTypefaceInternal (line 495) | @SuppressWarnings("ReferenceEquality") // Matches the Typeface compari...
    method setExpandedTitleTypefaceInternal (line 509) | @SuppressWarnings("ReferenceEquality") // Matches the Typeface compari...
    method setCollapsedSubtitleTypefaceInternal (line 523) | @SuppressWarnings("ReferenceEquality") // Matches the Typeface compari...
    method setExpandedSubtitleTypefaceInternal (line 537) | @SuppressWarnings("ReferenceEquality") // Matches the Typeface compari...
    method getCollapsedTitleTypeface (line 551) | public Typeface getCollapsedTitleTypeface() {
    method getExpandedTitleTypeface (line 555) | public Typeface getExpandedTitleTypeface() {
    method getCollapsedSubtitleTypeface (line 559) | public Typeface getCollapsedSubtitleTypeface() {
    method getExpandedSubtitleTypeface (line 563) | public Typeface getExpandedSubtitleTypeface() {
    method setExpansionFraction (line 574) | public void setExpansionFraction(float fraction) {
    method setState (line 583) | public final boolean setState(final int[] state) {
    method isStateful (line 594) | public final boolean isStateful() {
    method getExpansionFraction (line 599) | public float getExpansionFraction() {
    method getCollapsedTitleTextSize (line 603) | public float getCollapsedTitleTextSize() {
    method getExpandedTitleTextSize (line 607) | public float getExpandedTitleTextSize() {
    method getCollapsedSubtitleTextSize (line 611) | public float getCollapsedSubtitleTextSize() {
    method getExpandedSubtitleTextSize (line 615) | public float getExpandedSubtitleTextSize() {
    method setRtlTextDirectionHeuristicsEnabled (line 619) | public void setRtlTextDirectionHeuristicsEnabled(boolean rtlTextDirect...
    method isRtlTextDirectionHeuristicsEnabled (line 623) | public boolean isRtlTextDirectionHeuristicsEnabled() {
    method calculateCurrentOffsets (line 627) | private void calculateCurrentOffsets() {
    method calculateOffsets (line 631) | private void calculateOffsets(final float fraction) {
    method getCurrentExpandedTitleTextColor (line 672) | @ColorInt
    method getCurrentExpandedSubtitleTextColor (line 677) | @ColorInt
    method getCurrentCollapsedTitleTextColor (line 682) | @ColorInt
    method getCurrentCollapsedSubtitleTextColor (line 687) | @ColorInt
    method getCurrentColor (line 692) | @ColorInt
    method calculateBaseOffsets (line 703) | private void calculateBaseOffsets() {
    method interpolateBounds (line 830) | private void interpolateBounds(float fraction) {
    method draw (line 837) | public void draw(@NonNull Canvas canvas) {
    method calculateIsRtl (line 900) | private boolean calculateIsRtl(@NonNull CharSequence text) {
    method isDefaultIsRtl (line 907) | private boolean isDefaultIsRtl() {
    method isTextDirectionHeuristicsIsRtl (line 911) | private boolean isTextDirectionHeuristicsIsRtl(@NonNull CharSequence t...
    method setInterpolatedTitleTextSize (line 918) | private void setInterpolatedTitleTextSize(float textSize) {
    method setInterpolatedSubtitleTextSize (line 932) | private void setInterpolatedSubtitleTextSize(float textSize) {
    method calculateUsingTitleTextSize (line 946) | @SuppressWarnings("ReferenceEquality") // Matches the Typeface compari...
    method calculateUsingSubtitleTextSize (line 1020) | @SuppressWarnings("ReferenceEquality") // Matches the Typeface compari...
    method ensureExpandedTitleTexture (line 1093) | private void ensureExpandedTitleTexture() {
    method ensureExpandedSubtitleTexture (line 1120) | private void ensureExpandedSubtitleTexture() {
    method recalculate (line 1147) | public void recalculate() {
    method setTitle (line 1161) | public void setTitle(@Nullable CharSequence title) {
    method getTitle (line 1170) | @Nullable
    method setSubtitle (line 1180) | public void setSubtitle(@Nullable CharSequence subtitle) {
    method getSubtitle (line 1189) | @Nullable
    method clearTexture (line 1194) | private void clearTexture() {
    method isClose (line 1209) | private static boolean isClose(float value, float targetValue) {
    method getExpandedTitleTextColor (line 1213) | public ColorStateList getExpandedTitleTextColor() {
    method getExpandedSubtitleTextColor (line 1217) | public ColorStateList getExpandedSubtitleTextColor() {
    method getCollapsedTitleTextColor (line 1221) | public ColorStateList getCollapsedTitleTextColor() {
    method getCollapsedSubtitleTextColor (line 1225) | public ColorStateList getCollapsedSubtitleTextColor() {
    method blendColors (line 1235) | private static int blendColors(int color1, int color2, float ratio) {
    method lerp (line 1244) | private static float lerp(
    method rectEquals (line 1252) | private static boolean rectEquals(@NonNull Rect r, int left, int top, ...

FILE: app/src/main/java/org/lsposed/manager/App.java
  class App (line 73) | public class App extends Application {
    method readWebviewHTML (line 78) | private static String readWebviewHTML(String name) {
    method getInstance (line 122) | public static App getInstance() {
    method getPreferences (line 126) | public static SharedPreferences getPreferences() {
    method getExecutorService (line 130) | public static ExecutorService getExecutorService() {
    method getMainHandler (line 136) | public static Handler getMainHandler() {
    method attachBaseContext (line 140) | @Override
    method setCrashReport (line 159) | private void setCrashReport() {
    method onCreate (line 194) | @Override
    method getOkHttpClient (line 245) | @NonNull
    method getOkHttpCache (line 260) | @NonNull
    method getLocale (line 268) | public static Locale getLocale(String tag) {
    method getLocale (line 275) | public static Locale getLocale() {

FILE: app/src/main/java/org/lsposed/manager/ConfigManager.java
  class ConfigManager (line 42) | public class ConfigManager {
    method isBinderAlive (line 44) | public static boolean isBinderAlive() {
    method getXposedApiVersion (line 48) | public static int getXposedApiVersion() {
    method getXposedVersionName (line 57) | public static String getXposedVersionName() {
    method getXposedVersionCode (line 66) | public static int getXposedVersionCode() {
    method getInstalledPackagesFromAllUsers (line 75) | public static List<PackageInfo> getInstalledPackagesFromAllUsers(int f...
    method getEnabledModules (line 85) | public static String[] getEnabledModules() {
    method setModuleEnabled (line 94) | public static boolean setModuleEnabled(String packageName, boolean ena...
    method setModuleScope (line 103) | public static boolean setModuleScope(String packageName, boolean legac...
    method getModuleScope (line 125) | public static List<ScopeAdapter.ApplicationWithEquals> getModuleScope(...
    method enableStatusNotification (line 143) | public static boolean enableStatusNotification() {
    method setEnableStatusNotification (line 152) | public static boolean setEnableStatusNotification(boolean enabled) {
    method isVerboseLogEnabled (line 162) | public static boolean isVerboseLogEnabled() {
    method setVerboseLogEnabled (line 171) | public static boolean setVerboseLogEnabled(boolean enabled) {
    method isLogWatchdogEnabled (line 181) | public static boolean isLogWatchdogEnabled() {
    method setLogWatchdog (line 190) | public static boolean setLogWatchdog(boolean enabled) {
    method getLog (line 200) | public static ParcelFileDescriptor getLog(boolean verbose) {
    method clearLogs (line 209) | public static boolean clearLogs(boolean verbose) {
    method getPackageInfo (line 218) | public static PackageInfo getPackageInfo(String packageName, int flags...
    method forceStopPackage (line 229) | public static boolean forceStopPackage(String packageName, int userId) {
    method reboot (line 239) | public static boolean reboot() {
    method uninstallPackage (line 249) | public static boolean uninstallPackage(String packageName, int userId) {
    method isSepolicyLoaded (line 258) | public static boolean isSepolicyLoaded() {
    method getUsers (line 267) | public static List<UserInfo> getUsers() {
    method installExistingPackageAsUser (line 276) | public static boolean installExistingPackageAsUser(String packageName,...
    method isMagiskInstalled (line 287) | public static boolean isMagiskInstalled() {
    method systemServerRequested (line 294) | public static boolean systemServerRequested() {
    method dex2oatFlagsLoaded (line 302) | public static boolean dex2oatFlagsLoaded() {
    method startActivityAsUserWithFeature (line 310) | public static int startActivityAsUserWithFeature(Intent intent, int us...
    method queryIntentActivitiesAsUser (line 319) | public static List<ResolveInfo> queryIntentActivitiesAsUser(Intent int...
    method setHiddenIcon (line 329) | public static boolean setHiddenIcon(boolean hide) {
    method getApi (line 339) | public static String getApi() {
    method getDenyListPackages (line 348) | public static List<String> getDenyListPackages() {
    method flashZip (line 358) | public static void flashZip(String zipPath, ParcelFileDescriptor outpu...
    method isDexObfuscateEnabled (line 366) | public static boolean isDexObfuscateEnabled() {
    method setDexObfuscateEnabled (line 375) | public static boolean setDexObfuscateEnabled(boolean enabled) {
    method getDex2OatWrapperCompatibility (line 385) | public static int getDex2OatWrapperCompatibility() {
    method getAutoInclude (line 394) | public static boolean getAutoInclude(String packageName) {
    method setAutoInclude (line 403) | public static boolean setAutoInclude(String packageName, boolean enabl...

FILE: app/src/main/java/org/lsposed/manager/Constants.java
  class Constants (line 27) | public class Constants {
    method setBinder (line 28) | public static boolean setBinder(IBinder binder) {

FILE: app/src/main/java/org/lsposed/manager/adapters/AppHelper.java
  class AppHelper (line 41) | public class AppHelper {
    method getSettingsIntent (line 49) | @SuppressLint("WrongConstant")
    method getLaunchIntentForPackage (line 69) | @SuppressLint("WrongConstant")
    method onOptionsItemSelected (line 95) | public static boolean onOptionsItemSelected(MenuItem item, SharedPrefe...
    method getAppListComparator (line 118) | public static Comparator<PackageInfo> getAppListComparator(int sort, P...
    method getAppList (line 136) | synchronized public static List<PackageInfo> getAppList(boolean force) {
    method getDenyList (line 158) | synchronized public static List<String> getDenyList(boolean force) {
    method getAppLabel (line 165) | public static CharSequence getAppLabel(PackageInfo info, PackageManage...

FILE: app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java
  class ScopeAdapter (line 93) | public class ScopeAdapter extends EmptyStateRecyclerView.EmptyStateAdapt...
    method onCreateViewHolder (line 110) | @NonNull
    method onBindViewHolder (line 117) | @Override
    method getItemCount (line 124) | @Override
    method onSwitchChanged (line 131) | @Override
    method ScopeAdapter (line 151) | public ScopeAdapter(AppListFragment fragment, ModuleUtil.InstalledModu...
    method onCreateViewHolder (line 160) | @NonNull
    method shouldHideApp (line 166) | private boolean shouldHideApp(PackageInfo info, ApplicationWithEquals ...
    method sortApps (line 195) | private int sortApps(AppInfo x, AppInfo y) {
    method checkRecommended (line 228) | private void checkRecommended() {
    method setLoaded (line 243) | @SuppressLint("NotifyDataSetChanged")
    method onOptionsItemSelected (line 252) | public boolean onOptionsItemSelected(MenuItem item) {
    method onContextItemSelected (line 322) | public boolean onContextItemSelected(@NonNull MenuItem item) {
    method onPrepareOptionsMenu (line 363) | public void onPrepareOptionsMenu(@NonNull Menu menu) {
    method onViewRecycled (line 397) | @Override
    method onBindViewHolder (line 405) | @Override
    method getItemId (line 505) | @Override
    method getFilter (line 511) | @Override
    method getItemCount (line 516) | @Override
    method refresh (line 521) | public void refresh() {
    method refresh (line 525) | public void refresh(boolean force) {
    method onCheckedChange (line 585) | protected void onCheckedChange(CompoundButton buttonView, boolean isCh...
    method isLoaded (line 608) | @Override
    class ViewHolder (line 613) | public static class ViewHolder extends RecyclerView.ViewHolder {
      method ViewHolder (line 622) | ViewHolder(ItemModuleBinding binding) {
    class ApplicationFilter (line 635) | private class ApplicationFilter extends Filter {
      method lowercaseContains (line 637) | private boolean lowercaseContains(String s, String filter) {
      method performFiltering (line 641) | @Override
      method publishResults (line 657) | @Override
    method getSearchListener (line 664) | public SearchView.OnQueryTextListener getSearchListener() {
    method onBackPressed (line 680) | public void onBackPressed() {
    class AppInfo (line 701) | public static class AppInfo {
    class ApplicationWithEquals (line 709) | public static class ApplicationWithEquals extends Application {
      method ApplicationWithEquals (line 710) | public ApplicationWithEquals(String packageName, int userId) {
      method ApplicationWithEquals (line 715) | public ApplicationWithEquals(Application application) {
      method equals (line 720) | @Override
      method hashCode (line 728) | @Override

FILE: app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceHolder.java
  class LSPManagerServiceHolder (line 29) | public class LSPManagerServiceHolder implements IBinder.DeathRecipient {
    method init (line 33) | public static void init(IBinder binder) {
    method getService (line 39) | public static ILSPManagerService getService() {
    method LSPManagerServiceHolder (line 43) | private LSPManagerServiceHolder(IBinder binder) {
    method linkToDeath (line 48) | private void linkToDeath(IBinder binder) {
    method binderDied (line 56) | @Override

FILE: app/src/main/java/org/lsposed/manager/repo/RepoLoader.java
  class RepoLoader (line 56) | public class RepoLoader {
    class ModuleVersion (line 61) | public static class ModuleVersion {
      method ModuleVersion (line 65) | private ModuleVersion(long versionCode, String versionName) {
      method upgradable (line 70) | public boolean upgradable(long versionCode, String versionName) {
    method isRepoLoaded (line 87) | public boolean isRepoLoaded() {
    method getInstance (line 91) | public static synchronized RepoLoader getInstance() {
    method loadRemoteData (line 99) | synchronized public void loadRemoteData() {
    method loadLocalData (line 135) | synchronized public void loadLocalData(boolean updateRemoteRepo) {
    method updateLatestVersion (line 165) | synchronized private void updateLatestVersion(OnlineModule[] onlineMod...
    method updateLatestVersion (line 199) | public void updateLatestVersion(String channel) {
    method getModuleLatestVersion (line 204) | @Nullable
    method getReleases (line 209) | @Nullable
    method getLatestReleaseTime (line 231) | @Nullable
    method loadRemoteReleases (line 250) | public void loadRemoteReleases(String packageName) {
    method addListener (line 294) | public void addListener(RepoListener listener) {
    method removeListener (line 298) | public void removeListener(RepoListener listener) {
    method getOnlineModule (line 302) | @Nullable
    method getOnlineModules (line 307) | @Nullable
    type RepoListener (line 312) | public interface RepoListener {
      method onRepoLoaded (line 313) | default void onRepoLoaded() {
      method onModuleReleasesLoaded (line 316) | default void onModuleReleasesLoaded(OnlineModule module) {
      method onThrowable (line 319) | default void onThrowable(Throwable t) {

FILE: app/src/main/java/org/lsposed/manager/repo/model/Collaborator.java
  class Collaborator (line 28) | public class Collaborator {
    method getLogin (line 37) | @Nullable
    method setLogin (line 42) | public void setLogin(String login) {
    method getName (line 46) | @Nullable
    method setName (line 51) | public void setName(String name) {

FILE: app/src/main/java/org/lsposed/manager/repo/model/OnlineModule.java
  class OnlineModule (line 31) | public class OnlineModule {
    method getName (line 107) | @Nullable
    method setName (line 112) | public void setName(String name) {
    method getDescription (line 116) | @Nullable
    method setDescription (line 121) | public void setDescription(String description) {
    method getUrl (line 125) | @Nullable
    method setUrl (line 130) | public void setUrl(String url) {
    method getHomepageUrl (line 134) | @Nullable
    method setHomepageUrl (line 139) | public void setHomepageUrl(String homepageUrl) {
    method getCollaborators (line 143) | @Nullable
    method setCollaborators (line 148) | public void setCollaborators(List<Collaborator> collaborators) {
    method getReleases (line 152) | @Nullable
    method getLatestReleaseTime (line 157) | @Nullable
    method setReleases (line 162) | public void setReleases(List<Release> releases) {
    method getReadme (line 166) | @Nullable
    method setReadme (line 171) | public void setReadme(String readme) {
    method getReadmeHTML (line 175) | @Nullable
    method setReadmeHTML (line 180) | public void setReadmeHTML(String readmeHTML) {
    method getSummary (line 184) | @Nullable
    method setSummary (line 189) | public void setSummary(String summary) {
    method getScope (line 193) | @Nullable
    method setScope (line 198) | public void setScope(List<String> scope) {
    method getSourceUrl (line 202) | @Nullable
    method setSourceUrl (line 207) | public void setSourceUrl(String sourceUrl) {
    method isHide (line 211) | public Boolean isHide() {
    method setHide (line 215) | public void setHide(Boolean hide) {
    method getAdditionalAuthors (line 219) | @Nullable
    method setAdditionalAuthors (line 224) | public void setAdditionalAuthors(List<Object> additionalAuthors) {
    method getUpdatedAt (line 228) | @Nullable
    method setUpdatedAt (line 233) | public void setUpdatedAt(String updatedAt) {
    method getCreatedAt (line 237) | @Nullable
    method setCreatedAt (line 242) | public void setCreatedAt(String createdAt) {
    method getStargazerCount (line 246) | @Nullable
    method setStargazerCount (line 251) | public void setStargazerCount(Integer stargazerCount) {
    method getLatestRelease (line 255) | @Nullable
    method setLatestRelease (line 260) | public void setLatestRelease(String latestRelease) {
    method getLatestBetaRelease (line 264) | @Nullable
    method getLatestBetaReleaseTime (line 269) | @Nullable
    method getLatestSnapshotRelease (line 274) | @Nullable
    method getLatestSnapshotReleaseTime (line 279) | @Nullable
    method getBetaReleases (line 284) | @Nullable
    method getSnapshotReleases (line 289) | @Nullable

FILE: app/src/main/java/org/lsposed/manager/repo/model/Release.java
  class Release (line 31) | public class Release {
    method getName (line 64) | @Nullable
    method setName (line 69) | public void setName(String name) {
    method getUrl (line 73) | @Nullable
    method setUrl (line 78) | public void setUrl(String url) {
    method getDescription (line 82) | @Nullable
    method setDescription (line 87) | public void setDescription(String description) {
    method getDescriptionHTML (line 91) | @Nullable
    method setDescriptionHTML (line 96) | public void setDescriptionHTML(String descriptionHTML) {
    method getCreatedAt (line 100) | @Nullable
    method setCreatedAt (line 105) | public void setCreatedAt(String createdAt) {
    method getPublishedAt (line 109) | @Nullable
    method setPublishedAt (line 114) | public void setPublishedAt(String publishedAt) {
    method getUpdatedAt (line 118) | @Nullable
    method setUpdatedAt (line 123) | public void setUpdatedAt(String updatedAt) {
    method getTagName (line 127) | @Nullable
    method setTagName (line 132) | public void setTagName(String tagName) {
    method getIsPrerelease (line 136) | @Nullable
    method setIsPrerelease (line 141) | public void setIsPrerelease(Boolean isPrerelease) {
    method getReleaseAssets (line 145) | @Nullable
    method setReleaseAssets (line 150) | public void setReleaseAssets(List<ReleaseAsset> releaseAssets) {

FILE: app/src/main/java/org/lsposed/manager/repo/model/ReleaseAsset.java
  class ReleaseAsset (line 28) | public class ReleaseAsset {
    method getName (line 46) | @Nullable
    method setName (line 51) | public void setName(String name) {
    method getContentType (line 55) | @Nullable
    method setContentType (line 60) | public void setContentType(String contentType) {
    method getDownloadUrl (line 64) | @Nullable
    method setDownloadUrl (line 69) | public void setDownloadUrl(String downloadUrl) {
    method getDownloadCount (line 73) | public int getDownloadCount() {
    method setDownloadCount (line 77) | public void setDownloadCount(int downloadCount) {
    method getSize (line 81) | public int getSize() {
    method setSize (line 85) | public void setSize(int size) {

FILE: app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java
  class MainActivity (line 57) | public class MainActivity extends BaseActivity implements RepoLoader.Rep...
    method newIntent (line 67) | @NonNull
    method newIntent (line 72) | @NonNull
    method onCreate (line 78) | @Override
    method onNewIntent (line 105) | @Override
    method handleIntent (line 111) | private void handleIntent(Intent intent) {
    method onSupportNavigateUp (line 147) | @Override
    method restart (line 153) | public void restart() {
    method dispatchKeyEvent (line 170) | @Override
    method dispatchKeyShortcutEvent (line 175) | @SuppressLint("RestrictedApi")
    method dispatchTouchEvent (line 181) | @Override
    method dispatchTrackballEvent (line 186) | @Override
    method dispatchGenericMotionEvent (line 191) | @Override
    method onRepoLoaded (line 197) | @Override
    method onThrowable (line 225) | @Override
    method onModulesReloaded (line 236) | @Override
    method onResume (line 242) | @Override
    method setModulesSummary (line 269) | private void setModulesSummary(int moduleCount) {
    method onDestroy (line 286) | @Override

FILE: app/src/main/java/org/lsposed/manager/ui/activity/base/BaseActivity.java
  class BaseActivity (line 42) | public class BaseActivity extends MaterialActivity {
    method onCreate (line 45) | @Override
    method onStart (line 51) | @Override
    method onApplyUserThemeResource (line 72) | @Override
    method computeUserThemeKey (line 81) | @Override
    method onApplyTranslucentSystemBars (line 86) | @Override

FILE: app/src/main/java/org/lsposed/manager/ui/dialog/BlurBehindDialogBuilder.java
  class BlurBehindDialogBuilder (line 43) | @SuppressWarnings({"JavaReflectionMemberAccess", "ConstantConditions"})
    method BlurBehindDialogBuilder (line 47) | public BlurBehindDialogBuilder(@NonNull Context context) {
    method BlurBehindDialogBuilder (line 51) | public BlurBehindDialogBuilder(@NonNull Context context, int overrideT...
    method create (line 55) | @NonNull
    method setupWindowBlurListener (line 63) | private void setupWindowBlurListener(AlertDialog dialog) {
    method updateWindowForBlurs (line 87) | private void updateWindowForBlurs(Window window, boolean blursEnabled) {
    method getSystemProperty (line 138) | public static boolean getSystemProperty(String key, boolean defaultVal...

FILE: app/src/main/java/org/lsposed/manager/ui/dialog/FlashDialogBuilder.java
  class FlashDialogBuilder (line 52) | public class FlashDialogBuilder extends BlurBehindDialogBuilder {
    method FlashDialogBuilder (line 57) | public FlashDialogBuilder(@NonNull Context context, DialogInterface.On...
    method show (line 85) | @Override
    method setFlashView (line 97) | private void setFlashView(View view, AlertDialog dialog) {
    method flash (line 110) | private void flash(View view, Button button) {

FILE: app/src/main/java/org/lsposed/manager/ui/dialog/WelcomeDialog.java
  class WelcomeDialog (line 36) | public class WelcomeDialog extends DialogFragment {
    method parasiticDialog (line 39) | private Dialog parasiticDialog(BlurBehindDialogBuilder builder) {
    method appDialog (line 64) | private Dialog appDialog(BlurBehindDialogBuilder builder) {
    method onCreateDialog (line 75) | @NonNull
    method showIfNeed (line 87) | public static void showIfNeed(FragmentManager fm) {

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/AppListFragment.java
  class AppListFragment (line 54) | public class AppListFragment extends BaseFragment implements MenuProvider {
    method onChanged (line 66) | @Override
    method onCreateView (line 74) | @Nullable
    method onViewCreated (line 125) | @Override
    method onCreate (line 135) | @Override
    method onResume (line 182) | @Override
    method onDestroyView (line 188) | @Override
    method onMenuItemSelected (line 195) | @Override
    method onPrepareMenu (line 200) | @Override
    method onCreateMenu (line 220) | @Override
    method onContextItemSelected (line 225) | @Override

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java
  class BaseFragment (line 46) | public abstract class BaseFragment extends Fragment {
    method navigateUp (line 48) | public void navigateUp() {
    method getNavController (line 52) | public NavController getNavController() {
    method safeNavigate (line 56) | public boolean safeNavigate(@IdRes int resId) {
    method safeNavigate (line 70) | public boolean safeNavigate(NavDirections direction) {
    method setupToolbar (line 84) | public void setupToolbar(Toolbar toolbar, View tipsView, int title) {
    method setupToolbar (line 88) | public void setupToolbar(Toolbar toolbar, View tipsView, int title, in...
    method setupToolbar (line 92) | public void setupToolbar(Toolbar toolbar, View tipsView, String title,...
    method setupToolbar (line 96) | public void setupToolbar(Toolbar toolbar, View tipsView, String title,...
    method runAsync (line 111) | public void runAsync(Runnable runnable) {
    method runAsync (line 115) | public <T> Future<T> runAsync(Callable<T> callable) {
    method runOnUiThread (line 119) | public void runOnUiThread(Runnable runnable) {
    method runOnUiThread (line 123) | public <T> Future<T> runOnUiThread(Callable<T> callable) {
    method showHint (line 129) | public void showHint(@StringRes int res, boolean lengthShort, @StringR...
    method showHint (line 133) | public void showHint(@StringRes int res, boolean lengthShort) {
    method showHint (line 137) | public void showHint(CharSequence str, boolean lengthShort) {
    method showHint (line 141) | public void showHint(CharSequence str, boolean lengthShort, CharSequen...

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/CompileDialogFragment.java
  class CompileDialogFragment (line 43) | @SuppressWarnings("deprecation")
    method speed (line 45) | public static void speed(FragmentManager fragmentManager, ApplicationI...
    method onCreateDialog (line 54) | @Override
    class CompileTask (line 75) | private static class CompileTask extends AsyncTask<String, Void, Throw...
      method CompileTask (line 79) | CompileTask(CompileDialogFragment fragment) {
      method doInBackground (line 83) | @Override
      method onPostExecute (line 97) | @Override

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java
  class HomeFragment (line 66) | public class HomeFragment extends BaseFragment implements MenuProvider {
    method onCreate (line 69) | @Override
    method onPrepareMenu (line 75) | @Override
    method onCreateMenu (line 87) | @Override
    method onMenuItemSelected (line 92) | @Override
    method onCreateView (line 97) | @Override
    method updateStates (line 112) | private void updateStates(Activity activity, boolean binderAlive, bool...
    method getDevice (line 254) | private String getDevice() {
    method isDeveloper (line 263) | private boolean isDeveloper() {
    class AboutDialog (line 289) | public static class AboutDialog extends DialogFragment {
      method onCreateDialog (line 290) | @NonNull
    method showAbout (line 307) | private void showAbout() {
    method onDestroyView (line 311) | @Override

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java
  class LogsFragment (line 71) | public class LogsFragment extends BaseFragment implements MenuProvider {
    type OptionsItemSelectListener (line 76) | interface OptionsItemSelectListener {
      method onOptionsItemSelected (line 77) | boolean onOptionsItemSelected(@NonNull MenuItem item);
    method onCreateView (line 103) | @Nullable
    method setOptionsItemSelectListener (line 137) | public void setOptionsItemSelectListener(OptionsItemSelectListener opt...
    method onMenuItemSelected (line 141) | @Override
    method onPrepareMenu (line 160) | @Override
    method onCreateMenu (line 167) | @Override
    method onDestroyView (line 172) | @Override
    method save (line 179) | private void save() {
    class LogFragment (line 189) | public static class LogFragment extends BaseFragment {
      class LogAdaptor (line 196) | class LogAdaptor extends EmptyStateRecyclerView.EmptyStateAdapter<Lo...
        method onCreateViewHolder (line 200) | @NonNull
        method onBindViewHolder (line 206) | @Override
        method getItemCount (line 211) | @Override
        method refresh (line 216) | @SuppressLint("NotifyDataSetChanged")
        method fullRefresh (line 225) | void fullRefresh() {
        method isLoaded (line 239) | @Override
        class ViewHolder (line 244) | class ViewHolder extends RecyclerView.ViewHolder {
          method ViewHolder (line 247) | public ViewHolder(ItemLogTextviewBinding binding) {
      method createAdaptor (line 254) | protected LogAdaptor createAdaptor() {
      method onCreateView (line 258) | @Nullable
      method scrollToTop (line 284) | public void scrollToTop(LogsFragment logsFragment) {
      method scrollToBottom (line 293) | public void scrollToBottom(LogsFragment logsFragment) {
      method attachListeners (line 303) | void attachListeners() {
      method detachListeners (line 332) | void detachListeners() {
      method onStart (line 336) | @Override
      method onResume (line 342) | @Override
      method onPause (line 349) | @Override
      method onStop (line 355) | @Override
    class UnwrapLogFragment (line 362) | public static class UnwrapLogFragment extends LogFragment {
      method onCreateView (line 364) | @Nullable
      method createAdaptor (line 382) | @Override
    class LogPageAdapter (line 401) | class LogPageAdapter extends FragmentStateAdapter {
      method LogPageAdapter (line 403) | public LogPageAdapter(@NonNull Fragment fragment) {
      method createFragment (line 407) | @NonNull
      method getItemCount (line 417) | @Override
      method getItemId (line 422) | @Override
      method containsItem (line 427) | @Override
      method verbose (line 432) | public boolean verbose(int position) {
      method getItemViewType (line 436) | @Override
      method refresh (line 441) | public void refresh() {

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java
  class ModulesFragment (line 97) | public class ModulesFragment extends BaseFragment implements ModuleUtil....
    method onCreate (line 110) | @Override
    method forEachAdaptor (line 128) | private void forEachAdaptor(Consumer<? super ModuleAdapter> action) {
    method showFab (line 135) | private void showFab() {
    method onCreateView (line 147) | @Nullable
    method onPrepareMenu (line 194) | @Override
    method onCreateMenu (line 213) | @Override
    method onMenuItemSelected (line 218) | @Override
    method onResume (line 223) | @Override
    method onSingleModuleReloaded (line 229) | @Override
    method onModulesReloaded (line 234) | @Override
    method onRepoLoaded (line 265) | @Override
    method updateModuleSummary (line 270) | private void updateModuleSummary() {
    method installModuleToUser (line 280) | void installModuleToUser(ModuleUtil.InstalledModule module, UserInfo u...
    method onContextItemSelected (line 298) | @SuppressLint("WrongConstant")
    method onDestroyView (line 352) | @Override
    class ModuleListFragment (line 360) | public static class ModuleListFragment extends Fragment {
      method onChanged (line 364) | @Override
      method onViewAttachedToWindow (line 371) | @Override
      method onViewDetachedFromWindow (line 376) | @Override
      method onCreateView (line 382) | @Nullable
      method attachListeners (line 402) | void attachListeners() {
      method detachListeners (line 420) | void detachListeners() {
      method onStart (line 429) | @Override
      method onResume (line 435) | @Override
      method onDestroyView (line 441) | @Override
      method onPause (line 447) | @Override
      method onStop (line 453) | @Override
    class PagerAdapter (line 460) | private class PagerAdapter extends FragmentStateAdapter {
      method PagerAdapter (line 462) | public PagerAdapter(@NonNull Fragment fragment) {
      method createFragment (line 466) | @NonNull
      method getItemCount (line 476) | @Override
      method getItemId (line 481) | @Override
      method containsItem (line 486) | @Override
    method createPickModuleAdapter (line 492) | ModuleAdapter createPickModuleAdapter(UserInfo userInfo) {
    class ModuleAdapter (line 496) | class ModuleAdapter extends EmptyStateRecyclerView.EmptyStateAdapter<M...
      method ModuleAdapter (line 504) | ModuleAdapter(UserInfo user) {
      method ModuleAdapter (line 508) | ModuleAdapter(UserInfo user, boolean isPick) {
      method getUser (line 513) | public UserInfo getUser() {
      method onCreateViewHolder (line 517) | @NonNull
      method isPick (line 523) | public boolean isPick() {
      method onBindViewHolder (line 527) | @Override
      method onViewRecycled (line 655) | @Override
      method getItemCount (line 661) | @Override
      method getItemId (line 666) | @Override
      method getFilter (line 672) | @Override
      method setOnPickListener (line 677) | public void setOnPickListener(View.OnClickListener onPickListener) {
      method refresh (line 681) | public void refresh() {
      method fullRefresh (line 685) | public void fullRefresh() {
      method accept (line 719) | @Override
      method setLoaded (line 737) | @SuppressLint("NotifyDataSetChanged")
      method isLoaded (line 746) | @Override
      class ViewHolder (line 751) | static class ViewHolder extends RecyclerView.ViewHolder {
        method ViewHolder (line 760) | ViewHolder(ItemModuleBinding binding) {
      class ApplicationFilter (line 772) | class ApplicationFilter extends Filter {
        method lowercaseContains (line 774) | private boolean lowercaseContains(String s, String filter) {
        method performFiltering (line 778) | @Override
        method publishResults (line 795) | @Override

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/RecyclerViewDialogFragment.java
  class RecyclerViewDialogFragment (line 40) | public class RecyclerViewDialogFragment extends AppCompatDialogFragment {
    method onCreateDialog (line 41) | @Override
    method onViewCreated (line 84) | public final void onViewCreated(@NonNull View view, @Nullable Bundle s...

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java
  class RepoFragment (line 79) | public class RepoFragment extends BaseFragment implements RepoLoader.Rep...
    method onChanged (line 90) | @Override
    method onCreate (line 96) | @Override
    method onCreateView (line 114) | @Nullable
    method updateRepoSummary (line 145) | private void updateRepoSummary() {
    method onPrepareMenu (line 177) | @Override
    method onCreateMenu (line 205) | @Override
    method onDestroyView (line 209) | @Override
    method onResume (line 220) | @Override
    method onRepoLoaded (line 230) | @Override
    method onThrowable (line 238) | @Override
    method onModulesReloaded (line 244) | @Override
    method onMenuItemSelected (line 249) | @Override
    class RepoAdapter (line 270) | private class RepoAdapter extends EmptyStateRecyclerView.EmptyStateAda...
      method RepoAdapter (line 279) | RepoAdapter() {
      method onCreateViewHolder (line 283) | @NonNull
      method getUpgradableVer (line 289) | RepoLoader.ModuleVersion getUpgradableVer(OnlineModule module) {
      method onBindViewHolder (line 299) | @Override
      method getItemCount (line 355) | @Override
      method setLoaded (line 360) | @SuppressLint("NotifyDataSetChanged")
      method setData (line 369) | public void setData(Collection<OnlineModule> modules) {
      method fullRefresh (line 394) | public void fullRefresh() {
      method refresh (line 402) | public void refresh() {
      method getItemId (line 406) | @Override
      method getFilter (line 411) | @Override
      method isLoaded (line 416) | @Override
      class ViewHolder (line 421) | static class ViewHolder extends RecyclerView.ViewHolder {
        method ViewHolder (line 429) | ViewHolder(ItemOnlinemoduleBinding binding) {
      class ModuleFilter (line 440) | class ModuleFilter extends Filter {
        method lowercaseContains (line 442) | private boolean lowercaseContains(String s, String filter) {
        method performFiltering (line 446) | @Override
        method publishResults (line 463) | @Override

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java
  class RepoItemFragment (line 107) | public class RepoItemFragment extends BaseFragment implements RepoLoader...
    method onCreateView (line 113) | @Nullable
    method onCreate (line 153) | @Override
    method renderGithubMarkdown (line 167) | private void renderGithubMarkdown(WebView view, @Nullable String text) {
    method onCreateMenu (line 241) | @Override
    method onMenuItemSelected (line 246) | @Override
    method onDestroyView (line 256) | @Override
    method onModuleReleasesLoaded (line 263) | @Override
    method onThrowable (line 275) | @Override
    class InformationAdapter (line 283) | private class InformationAdapter extends SimpleStatefulAdaptor<Informa...
      method InformationAdapter (line 290) | public InformationAdapter() {
      method onCreateViewHolder (line 302) | @NonNull
      method onBindViewHolder (line 308) | @Override
      method getItemCount (line 352) | @Override
      class ViewHolder (line 357) | class ViewHolder extends RecyclerView.ViewHolder {
        method ViewHolder (line 361) | public ViewHolder(ItemRepoTitleDescriptionBinding binding) {
    class DownloadDialog (line 369) | public static class DownloadDialog extends DialogFragment {
      method onCreateDialog (line 370) | @NonNull
      method create (line 383) | static void create(Activity activity, FragmentManager fm, List<Relea...
    class ReleaseAdapter (line 407) | private class ReleaseAdapter extends EmptyStateRecyclerView.EmptyState...
      method ReleaseAdapter (line 411) | public ReleaseAdapter() {
      method loadItems (line 415) | @SuppressLint("NotifyDataSetChanged")
      method onCreateViewHolder (line 440) | @NonNull
      method onBindViewHolder (line 450) | @Override
      method getItemCount (line 480) | @Override
      method getItemViewType (line 485) | @Override
      method isLoaded (line 490) | @Override
      class ViewHolder (line 495) | class ViewHolder extends RecyclerView.ViewHolder {
        method ViewHolder (line 503) | public ViewHolder(@NonNull View itemView) {
      class ReleaseViewHolder (line 508) | class ReleaseViewHolder extends ReleaseAdapter.ViewHolder {
        method ReleaseViewHolder (line 509) | public ReleaseViewHolder(ItemRepoReleaseBinding binding) {
      class LoadmoreViewHolder (line 519) | class LoadmoreViewHolder extends ReleaseAdapter.ViewHolder {
        method LoadmoreViewHolder (line 520) | public LoadmoreViewHolder(ItemRepoLoadmoreBinding binding) {
    class PagerAdapter (line 528) | private static class PagerAdapter extends FragmentStateAdapter {
      method PagerAdapter (line 530) | public PagerAdapter(@NonNull Fragment fragment) {
      method createFragment (line 534) | @NonNull
      method getItemCount (line 551) | @Override
      method getItemViewType (line 556) | @Override
      method getItemId (line 561) | @Override
    class BorderFragment (line 567) | public static abstract class BorderFragment extends BaseFragment {
      method attachListeners (line 570) | void attachListeners() {
      method scrollToTop (line 583) | abstract void scrollToTop();
      method detachListeners (line 585) | void detachListeners() {
      method onResume (line 589) | @Override
      method onStart (line 595) | @Override
      method onStop (line 601) | @Override
      method onPause (line 607) | @Override
    class ReadmeFragment (line 614) | public static class ReadmeFragment extends BorderFragment {
      method onCreateView (line 617) | @Nullable
      method scrollToTop (line 634) | @Override
    class RecyclerviewFragment (line 640) | public static class RecyclerviewFragment extends BorderFragment {
      method scrollToTop (line 644) | @Override
      method onCreateView (line 649) | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable...

FILE: app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java
  class SettingsFragment (line 69) | public class SettingsFragment extends BaseFragment {
    method onCreateView (line 72) | @Nullable
    method onDestroyView (line 90) | @Override
    class PreferenceFragment (line 97) | public static class PreferenceFragment extends PreferenceFragmentCompat {
      method onAttach (line 123) | @Override
      method onDetach (line 130) | @Override
      method setNotificationPreferenceEnabled (line 137) | private boolean setNotificationPreferenceEnabled(MaterialSwitchPrefe...
      method onCreatePreferences (line 149) | @Override
      method onCreateRecyclerView (line 384) | @NonNull

FILE: app/src/main/java/org/lsposed/manager/ui/widget/EmptyStateRecyclerView.java
  class EmptyStateRecyclerView (line 39) | public class EmptyStateRecyclerView extends StatefulRecyclerView {
    method EmptyStateRecyclerView (line 43) | public EmptyStateRecyclerView(Context context) {
    method EmptyStateRecyclerView (line 47) | public EmptyStateRecyclerView(Context context, @Nullable AttributeSet ...
    method EmptyStateRecyclerView (line 51) | public EmptyStateRecyclerView(Context context, @Nullable AttributeSet ...
    method dispatchDraw (line 61) | @Override
    class EmptyStateAdapter (line 88) | public abstract static class EmptyStateAdapter<T extends ViewHolder> e...
      method isLoaded (line 89) | abstract public boolean isLoaded();

FILE: app/src/main/java/org/lsposed/manager/ui/widget/ExpandableTextView.java
  class ExpandableTextView (line 46) | public class ExpandableTextView extends MaterialTextView {
    method ExpandableTextView (line 55) | public ExpandableTextView(Context context) {
    method ExpandableTextView (line 59) | public ExpandableTextView(Context context, AttributeSet attrs) {
    method ExpandableTextView (line 63) | public ExpandableTextView(Context context, AttributeSet attrs, int def...
    method setText (line 86) | @Override
    method onPreDraw (line 92) | @Override
    method setTextWithSpan (line 113) | private void setTextWithSpan(CharSequence text, int textOffsetEnd,
    method onLayout (line 123) | @Override
    method onTouchEvent (line 131) | @SuppressLint("ClickableViewAccessibility")
    method onSaveInstanceState (line 155) | @Override
    method onRestoreInstanceState (line 163) | @Override

FILE: app/src/main/java/org/lsposed/manager/ui/widget/LinkifyTextView.java
  class LinkifyTextView (line 33) | public class LinkifyTextView extends androidx.appcompat.widget.AppCompat...
    method LinkifyTextView (line 37) | public LinkifyTextView(Context context) {
    method LinkifyTextView (line 41) | public LinkifyTextView(Context context, AttributeSet attrs) {
    method LinkifyTextView (line 45) | public LinkifyTextView(Context context, AttributeSet attrs, int defSty...
    method getCurrentSpan (line 49) | public ClickableSpan getCurrentSpan() {
    method clearCurrentSpan (line 53) | public void clearCurrentSpan() {
    method onTouchEvent (line 57) | @SuppressLint("ClickableViewAccessibility")

FILE: app/src/main/java/org/lsposed/manager/ui/widget/ScrollWebView.java
  class ScrollWebView (line 36) | public class ScrollWebView extends WebView {
    method ScrollWebView (line 37) | public ScrollWebView(@NonNull Context context) {
    method ScrollWebView (line 41) | public ScrollWebView(@NonNull Context context, @Nullable AttributeSet ...
    method ScrollWebView (line 45) | public ScrollWebView(@NonNull Context context, @Nullable AttributeSet ...
    method ScrollWebView (line 49) | public ScrollWebView(@NonNull Context context, @Nullable AttributeSet ...
    method onTouchEvent (line 53) | @SuppressLint("ClickableViewAccessibility")
    method onOverScrolled (line 63) | @Override
    method findViewParentIfNeeds (line 72) | private static ViewParent findViewParentIfNeeds(View v) {

FILE: app/src/main/java/org/lsposed/manager/ui/widget/StatefulRecyclerView.java
  class StatefulRecyclerView (line 33) | public class StatefulRecyclerView extends BorderRecyclerView {
    method StatefulRecyclerView (line 34) | public StatefulRecyclerView(@NonNull Context context) {
    method StatefulRecyclerView (line 38) | public StatefulRecyclerView(@NonNull Context context, @Nullable Attrib...
    method StatefulRecyclerView (line 42) | public StatefulRecyclerView(@NonNull Context context, @Nullable Attrib...
    method onSaveInstanceState (line 47) | @Override
    method onRestoreInstanceState (line 58) | @Override

FILE: app/src/main/java/org/lsposed/manager/util/AccessibilityUtils.java
  class AccessibilityUtils (line 6) | public class AccessibilityUtils {
    method isAnimationEnabled (line 7) | public static boolean isAnimationEnabled(ContentResolver cr) {

FILE: app/src/main/java/org/lsposed/manager/util/AppIconModelLoader.java
  class AppIconModelLoader (line 42) | public class AppIconModelLoader implements ModelLoader<PackageInfo, Bitm...
    method AppIconModelLoader (line 48) | private AppIconModelLoader(@Px int iconSize, boolean shrinkNonAdaptive...
    method handles (line 54) | @Override
    method buildLoadData (line 59) | @Nullable
    class Fetcher (line 75) | private static class Fetcher implements DataFetcher<Bitmap> {
      method Fetcher (line 81) | public Fetcher(@NonNull AppIconLoader loader, @NonNull ApplicationIn...
      method loadData (line 86) | @Override
      method cleanup (line 97) | @Override
      method cancel (line 101) | @Override
      method getDataClass (line 105) | @NonNull
      method getDataSource (line 111) | @NonNull
    class Factory (line 118) | public static class Factory implements ModelLoaderFactory<PackageInfo,...
      method Factory (line 125) | public Factory(@Px int iconSize, boolean shrinkNonAdaptiveIcons, @No...
      method build (line 131) | @NonNull
      method teardown (line 138) | @Override

FILE: app/src/main/java/org/lsposed/manager/util/AppModule.java
  class AppModule (line 36) | @GlideModule
    method isManifestParsingEnabled (line 38) | @Override
    method registerComponents (line 43) | @Override

FILE: app/src/main/java/org/lsposed/manager/util/BackupUtils.java
  class BackupUtils (line 41) | public class BackupUtils {
    method backup (line 44) | public static void backup(Uri uri) throws JSONException, IOException {
    method backup (line 48) | public static void backup(Uri uri, String packageName) throws IOExcept...
    method restore (line 78) | public static void restore(Uri uri) throws JSONException, IOException {
    method restore (line 82) | public static void restore(Uri uri, String packageName) throws IOExcep...

FILE: app/src/main/java/org/lsposed/manager/util/CloudflareDNS.java
  class CloudflareDNS (line 22) | public final class CloudflareDNS implements Dns {
    method CloudflareDNS (line 29) | public CloudflareDNS() {
    method lookup (line 57) | @NonNull

FILE: app/src/main/java/org/lsposed/manager/util/EmptyAccessibilityDelegate.java
  class EmptyAccessibilityDelegate (line 29) | public class EmptyAccessibilityDelegate extends View.AccessibilityDelega...
    method sendAccessibilityEvent (line 31) | @Override
    method performAccessibilityAction (line 36) | @Override
    method sendAccessibilityEventUnchecked (line 41) | @Override
    method dispatchPopulateAccessibilityEvent (line 46) | @Override
    method onPopulateAccessibilityEvent (line 51) | @Override
    method onInitializeAccessibilityEvent (line 56) | @Override
    method onInitializeAccessibilityNodeInfo (line 61) | @Override
    method addExtraDataToAccessibilityNodeInfo (line 66) | @Override
    method onRequestSendAccessibilityEvent (line 71) | @Override
    method getAccessibilityNodeProvider (line 76) | @Override

FILE: app/src/main/java/org/lsposed/manager/util/ModuleUtil.java
  class ModuleUtil (line 57) | public final class ModuleUtil {
    method ModuleUtil (line 72) | private ModuleUtil() {
    method isModulesLoaded (line 76) | public boolean isModulesLoaded() {
    method getInstance (line 80) | public static synchronized ModuleUtil getInstance() {
    method extractIntPart (line 88) | public static int extractIntPart(String str) {
    method getModernModuleApk (line 100) | public static ZipFile getModernModuleApk(ApplicationInfo info) {
    method isLegacyModule (line 121) | public static boolean isLegacyModule(ApplicationInfo info) {
    method reloadInstalledModules (line 125) | synchronized public void reloadInstalledModules() {
    method getUsers (line 152) | @Nullable
    method reloadSingleModule (line 157) | public InstalledModule reloadSingleModule(String packageName, int user...
    method reloadSingleModule (line 161) | public InstalledModule reloadSingleModule(String packageName, int user...
    method getModule (line 190) | @Nullable
    method getModule (line 195) | @Nullable
    method getModules (line 200) | @Nullable
    method setModuleEnabled (line 205) | public boolean setModuleEnabled(String packageName, boolean enabled) {
    method isModuleEnabled (line 217) | public boolean isModuleEnabled(String packageName) {
    method getEnabledModulesCount (line 221) | public int getEnabledModulesCount() {
    method addListener (line 225) | public void addListener(ModuleListener listener) {
    method removeListener (line 229) | public void removeListener(ModuleListener listener) {
    type ModuleListener (line 233) | public interface ModuleListener {
      method onSingleModuleReloaded (line 238) | default void onSingleModuleReloaded(InstalledModule module) {
      method onModulesReloaded (line 242) | default void onModulesReloaded() {
    class InstalledModule (line 247) | public class InstalledModule {
      method InstalledModule (line 265) | private InstalledModule(PackageInfo pkg, ZipFile modernModuleApk) {
      method isInstalledOnExternalStorage (line 321) | public boolean isInstalledOnExternalStorage() {
      method getAppName (line 325) | public String getAppName() {
      method getDescription (line 331) | public String getDescription() {
      method getScopeList (line 354) | public List<String> getScopeList() {
      method getPackageInfo (line 389) | public PackageInfo getPackageInfo() {
      method toString (line 393) | @NonNull

FILE: app/src/main/java/org/lsposed/manager/util/NavUtil.java
  class NavUtil (line 33) | public final class NavUtil {
    method startURL (line 35) | public static void startURL(Activity activity, Uri uri) {
    method startURL (line 53) | public static void startURL(Activity activity, String url) {

FILE: app/src/main/java/org/lsposed/manager/util/NoSniFactory.java
  class NoSniFactory (line 9) | public final class NoSniFactory extends SSLSocketFactory {
    method getDefaultCipherSuites (line 16) | @Override
    method getSupportedCipherSuites (line 21) | @Override
    method createSocket (line 26) | @Override
    method createSocket (line 31) | @Override
    method createSocket (line 36) | @Override
    method createSocket (line 41) | @Override
    method createSocket (line 46) | @Override
    method config (line 51) | private Socket config(Socket socket) {

FILE: app/src/main/java/org/lsposed/manager/util/ShortcutUtil.java
  class ShortcutUtil (line 49) | public class ShortcutUtil {
    method getBitmap (line 52) | private static Bitmap getBitmap(Context context, int id) {
    method getLaunchIntent (line 72) | private static Intent getLaunchIntent(Context context) {
    method registerReceiver (line 103) | @SuppressLint("InlinedApi")
    method getShortcutBuilder (line 125) | private static ShortcutInfo.Builder getShortcutBuilder(Context context) {
    method isRequestPinShortcutSupported (line 139) | public static boolean isRequestPinShortcutSupported(Context context) t...
    method requestPinLaunchShortcut (line 144) | public static boolean requestPinLaunchShortcut(Runnable afterPinned) {
    method updateShortcut (line 153) | public static boolean updateShortcut() {
    method isLaunchShortcutPinned (line 162) | public static boolean isLaunchShortcutPinned() {

FILE: app/src/main/java/org/lsposed/manager/util/SimpleStatefulAdaptor.java
  class SimpleStatefulAdaptor (line 34) | public abstract class SimpleStatefulAdaptor<T extends RecyclerView.ViewH...
    method SimpleStatefulAdaptor (line 38) | public SimpleStatefulAdaptor() {
    method onAttachedToRecyclerView (line 42) | @Override
    method onViewRecycled (line 49) | @Override
    method onBindViewHolder (line 55) | @CallSuper
    method saveStateOf (line 65) | private void saveStateOf(@NonNull RecyclerView.ViewHolder holder) {
    method saveState (line 71) | @NonNull
    method restoreState (line 88) | @Override

FILE: app/src/main/java/org/lsposed/manager/util/ThemeUtil.java
  class ThemeUtil (line 38) | public class ThemeUtil {
    method isBlackNightTheme (line 72) | private static boolean isBlackNightTheme() {
    method isSystemAccent (line 76) | public static boolean isSystemAccent() {
    method getNightTheme (line 80) | public static String getNightTheme(Context context) {
    method getNightThemeStyleRes (line 88) | @StyleRes
    method getColorTheme (line 99) | public static String getColorTheme() {
    method getColorThemeStyleRes (line 106) | @StyleRes
    method getDarkTheme (line 115) | public static int getDarkTheme(String mode) {
    method getDarkTheme (line 127) | public static int getDarkTheme() {

FILE: app/src/main/java/org/lsposed/manager/util/UpdateUtil.java
  class UpdateUtil (line 46) | public class UpdateUtil {
    method loadRemoteVersion (line 47) | public static void loadRemoteVersion() {
    method checkAssets (line 82) | private static void checkAssets(JsonObject assets, String releaseNotes...
    method needUpdate (line 109) | public static boolean needUpdate() {
    method downloadNewZipSync (line 125) | @Nullable
    method canInstall (line 143) | public static boolean canInstall() {

FILE: app/src/main/java/org/lsposed/manager/util/chrome/CustomTabsURLSpan.java
  class CustomTabsURLSpan (line 29) | public class CustomTabsURLSpan extends URLSpan {
    method CustomTabsURLSpan (line 33) | public CustomTabsURLSpan(Activity activity, String url) {
    method onClick (line 38) | @Override

FILE: app/src/main/java/org/lsposed/manager/util/chrome/LinkTransformationMethod.java
  class LinkTransformationMethod (line 32) | public class LinkTransformationMethod implements TransformationMethod {
    method LinkTransformationMethod (line 36) | public LinkTransformationMethod(Activity activity) {
    method getTransformation (line 40) | @Override
    method onFocusChanged (line 62) | @Override

FILE: core/src/main/java/android/app/AndroidAppHelper.java
  class AndroidAppHelper (line 49) | public final class AndroidAppHelper {
    method AndroidAppHelper (line 50) | private AndroidAppHelper() {}
    method getResourcesMap (line 63) | @SuppressWarnings({ "unchecked", "rawtypes" })
    method createResourcesKey (line 70) | private static Object createResourcesKey(String resDir, String[] split...
    method addActiveResource (line 80) | public static void addActiveResource(String resDir, float scale, boole...
    method addActiveResource (line 85) | public static void addActiveResource(String resDir, Resources resource...
    method currentProcessName (line 105) | public static String currentProcessName() {
    method currentApplicationInfo (line 119) | public static ApplicationInfo currentApplicationInfo() {
    method currentPackageName (line 138) | public static String currentPackageName() {
    method currentApplication (line 150) | public static Application currentApplication() {
    method getSharedPreferencesForPackage (line 155) | @SuppressWarnings("UnusedParameters")
    method getDefaultSharedPreferencesForPackage (line 162) | @Deprecated
    method reloadSharedPreferencesIfNeeded (line 168) | @Deprecated

FILE: core/src/main/java/android/content/res/XModuleResources.java
  class XModuleResources (line 35) | public class XModuleResources extends Resources {
    method XModuleResources (line 36) | private XModuleResources(AssetManager assets, DisplayMetrics metrics, ...
    method createInstance (line 52) | public static XModuleResources createInstance(String path, XResources ...
    method fwd (line 72) | public XResForwarder fwd(int id) {

FILE: core/src/main/java/android/content/res/XResForwarder.java
  class XResForwarder (line 30) | public class XResForwarder {
    method XResForwarder (line 40) | public XResForwarder(Resources res, int id) {
    method getResources (line 46) | public Resources getResources() {
    method getId (line 51) | public int getId() {

FILE: core/src/main/java/android/content/res/XResources.java
  class XResources (line 80) | @SuppressWarnings("JniMissingFunction")
    method XResources (line 107) | public XResources(ClassLoader classLoader, String resDir) {
    method isFirstLoad (line 126) | public boolean isFirstLoad() {
    method setPackageNameForResDir (line 153) | public static void setPackageNameForResDir(String packageName, String ...
    method getPackageName (line 162) | @NonNull
    method getPackageName (line 167) | private static String getPackageName(String resDir) {
    method getPackageNameDuringConstruction (line 206) | public static String getPackageNameDuringConstruction() {
    method init (line 216) | public static void init(ThreadLocal<Object> latestResKey) throws Excep...
    class ResourceNames (line 273) | public static class ResourceNames {
      method ResourceNames (line 285) | private ResourceNames(int id, String pkg, String name, String type) {
      method equals (line 296) | public boolean equals(String pkg, String name, String type, int id) {
    method getResourceNames (line 304) | private ResourceNames getResourceNames(int id) {
    method getSystemResourceNames (line 312) | private static ResourceNames getSystemResourceNames(int id) {
    method putResourceNames (line 321) | private static void putResourceNames(String resDir, ResourceNames resN...
    method setReplacement (line 345) | public void setReplacement(int id, Object replacement) {
    method setReplacement (line 358) | @Deprecated
    method setReplacement (line 504) | public void setReplacement(String pkg, String type, String name, Objec...
    method setSystemWideReplacement (line 518) | public static void setSystemWideReplacement(int id, Object replacement) {
    method setSystemWideReplacement (line 532) | @Deprecated
    method setSystemWideReplacement (line 559) | public static void setSystemWideReplacement(String pkg, String type, S...
    method setReplacement (line 566) | private static void setReplacement(int id, Object replacement, XResour...
    method getReplacement (line 610) | private Object getReplacement(int id) {
    method getAnimation (line 642) | @Override
    method getBoolean (line 663) | @Override
    method getColor (line 677) | @Override
    method getColorStateList (line 691) | @Override
    method getDimension (line 715) | @Override
    method getDimensionPixelOffset (line 729) | @Override
    method getDimensionPixelSize (line 743) | @Override
    method getDrawable (line 757) | @Override
    method getDrawable (line 783) | @Override
    method getDrawableForDensity (line 809) | @Override
    method getDrawableForDensity (line 835) | @Override
    method getFloat (line 861) | @RequiresApi(Build.VERSION_CODES.Q)
    method getFont (line 876) | @Override
    method getFraction (line 890) | @Override
    method getInteger (line 902) | @Override
    method getIntArray (line 916) | @Override
    method getLayout (line 930) | @Override
    method getMovie (line 999) | @Override
    method getQuantityText (line 1011) | @Override
    method getStringArray (line 1026) | @Override
    method getText (line 1040) | @Override
    method getText (line 1057) | @Override
    method getTextArray (line 1071) | @Override
    method getValue (line 1085) | @Override
    method getValueForDensity (line 1101) | @Override
    method getXml (line 1117) | @Override
    method isXmlCached (line 1137) | private static boolean isXmlCached(Resources res, int id) {
    method translateResId (line 1156) | private static int translateResId(int id, XResources origRes, Resource...
    method getFakeResId (line 1206) | public static int getFakeResId(String resName) {
    method getFakeResId (line 1221) | public static int getFakeResId(Resources res, int id) {
    method addResource (line 1240) | public int addResource(Resources res, int id) {
    method translateAttrId (line 1252) | private static int translateAttrId(String attrName, XResources origRes) {
    class XTypedArray (line 1271) | public static class XTypedArray extends XTypedArraySuperClass {
      method XTypedArray (line 1273) | public XTypedArray(Resources resources) {
      method getBoolean (line 1283) | @Override
      method getColor (line 1296) | @Override
      method getColorStateList (line 1309) | @Override
      method getDimension (line 1332) | @Override
      method getDimensionPixelOffset (line 1343) | @Override
      method getDimensionPixelSize (line 1354) | @Override
      method getDrawable (line 1365) | @Override
      method getFloat (line 1386) | @Override
      method getFont (line 1398) | @Override
      method getFraction (line 1411) | @Override
      method getInt (line 1423) | @Override
      method getInteger (line 1436) | @Override
      method getLayoutDimension (line 1449) | @Override
      method getLayoutDimension (line 1460) | @Override
      method getString (line 1471) | @Override
      method getText (line 1484) | @Override
      method getTextArray (line 1497) | @Override
      method getValue (line 1510) | @Override
      method peekValue (line 1527) | @Override
    class DrawableLoader (line 1560) | @SuppressWarnings("UnusedParameters")
      method DrawableLoader (line 1565) | public DrawableLoader() {}
      method newDrawable (line 1575) | public abstract Drawable newDrawable(XResources res, int id) throws ...
      method newDrawableForDensity (line 1588) | public Drawable newDrawableForDensity(XResources res, int id, int de...
    class DimensionReplacement (line 1601) | public static class DimensionReplacement {
      method DimensionReplacement (line 1612) | public DimensionReplacement(float value, int unit) {
      method getDimension (line 1618) | public float getDimension(DisplayMetrics metrics) {
      method getDimensionPixelOffset (line 1623) | public int getDimensionPixelOffset(DisplayMetrics metrics) {
      method getDimensionPixelSize (line 1628) | public int getDimensionPixelSize(DisplayMetrics metrics) {
    class XMLInstanceDetails (line 1642) | private class XMLInstanceDetails {
      method XMLInstanceDetails (line 1648) | private XMLInstanceDetails(ResourceNames resNames, String variant, C...
    method hookLayout (line 1662) | public XC_LayoutInflated.Unhook hookLayout(int id, XC_LayoutInflated c...
    method hookLayout (line 1676) | @Deprecated
    method hookLayout (line 1696) | public XC_LayoutInflated.Unhook hookLayout(String pkg, String type, St...
    method hookSystemWideLayout (line 1711) | public static XC_LayoutInflated.Unhook hookSystemWideLayout(int id, XC...
    method hookSystemWideLayout (line 1728) | @Deprecated
    method hookSystemWideLayout (line 1755) | public static XC_LayoutInflated.Unhook hookSystemWideLayout(String pkg...
    method hookLayoutInternal (line 1762) | private static XC_LayoutInflated.Unhook hookLayoutInternal(String resD...
    method unhookLayout (line 1800) | public static void unhookLayout(String resDir, int id, XC_LayoutInflat...

FILE: core/src/main/java/de/robv/android/xposed/IXposedHookCmdInit.java
  type IXposedHookCmdInit (line 30) | public interface IXposedHookCmdInit extends IXposedMod {
    method initCmdApp (line 37) | void initCmdApp(StartupParam startupParam) throws Throwable;
    class StartupParam (line 42) | final class StartupParam {
      method StartupParam (line 43) | StartupParam() {

FILE: core/src/main/java/de/robv/android/xposed/IXposedHookInitPackageResources.java
  type IXposedHookInitPackageResources (line 15) | public interface IXposedHookInitPackageResources extends IXposedMod {
    method handleInitPackageResources (line 23) | void handleInitPackageResources(InitPackageResourcesParam resparam) th...
    class Wrapper (line 26) | final class Wrapper extends XC_InitPackageResources {
      method Wrapper (line 28) | public Wrapper(IXposedHookInitPackageResources instance) {
      method handleInitPackageResources (line 31) | @Override

FILE: core/src/main/java/de/robv/android/xposed/IXposedHookLoadPackage.java
  type IXposedHookLoadPackage (line 15) | public interface IXposedHookLoadPackage extends IXposedMod {
    method handleLoadPackage (line 24) | void handleLoadPackage(LoadPackageParam lpparam) throws Throwable;
    class Wrapper (line 27) | final class Wrapper extends XC_LoadPackage {
      method Wrapper (line 29) | public Wrapper(IXposedHookLoadPackage instance) {
      method handleLoadPackage (line 32) | @Override

FILE: core/src/main/java/de/robv/android/xposed/IXposedHookZygoteInit.java
  type IXposedHookZygoteInit (line 14) | public interface IXposedHookZygoteInit extends IXposedMod {
    method initZygote (line 20) | void initZygote(StartupParam startupParam) throws Throwable;
    class StartupParam (line 23) | final class StartupParam {
      method StartupParam (line 24) | StartupParam() {}

FILE: core/src/main/java/de/robv/android/xposed/IXposedMod.java
  type IXposedMod (line 26) | interface IXposedMod {

FILE: core/src/main/java/de/robv/android/xposed/SELinuxHelper.java
  class SELinuxHelper (line 29) | public final class SELinuxHelper {
    method SELinuxHelper (line 30) | private SELinuxHelper() {
    method isSELinuxEnabled (line 38) | public static boolean isSELinuxEnabled() {
    method isSELinuxEnforced (line 48) | public static boolean isSELinuxEnforced() {
    method getContext (line 58) | public static String getContext() {
    method getAppDataFileService (line 70) | public static BaseService getAppDataFileService() {

FILE: core/src/main/java/de/robv/android/xposed/XC_MethodHook.java
  class XC_MethodHook (line 36) | public abstract class XC_MethodHook extends XCallback {
    method XC_MethodHook (line 40) | @SuppressWarnings("deprecation")
    method XC_MethodHook (line 55) | public XC_MethodHook(int priority) {
    method beforeHookedMethod (line 70) | protected void beforeHookedMethod(MethodHookParam<?> param) throws Thr...
    method callBeforeHookedMethod (line 73) | public void callBeforeHookedMethod(MethodHookParam<?> param) throws Th...
    method afterHookedMethod (line 88) | protected void afterHookedMethod(MethodHookParam<?> param) throws Thro...
    method callAfterHookedMethod (line 91) | public void callAfterHookedMethod(MethodHookParam<?> param) throws Thr...
    class MethodHookParam (line 98) | public static final class MethodHookParam<T extends Executable> extend...
      method MethodHookParam (line 102) | @SuppressWarnings("deprecation")
      method getResult (line 131) | public Object getResult() {
      method setResult (line 140) | public void setResult(Object result) {
      method getThrowable (line 149) | public Throwable getThrowable() {
      method hasThrowable (line 156) | public boolean hasThrowable() {
      method setThrowable (line 165) | public void setThrowable(Throwable throwable) {
      method getResultOrThrowable (line 174) | public Object getResultOrThrowable() throws Throwable {
    class Unhook (line 184) | public class Unhook implements IXUnhook<XC_MethodHook> {
      method Unhook (line 187) | Unhook(Member hookMethod) {
      method getHookedMethod (line 194) | public Member getHookedMethod() {
      method getCallback (line 198) | @Override
      method unhook (line 203) | @SuppressWarnings("deprecation")

FILE: core/src/main/java/de/robv/android/xposed/XC_MethodReplacement.java
  class XC_MethodReplacement (line 28) | public abstract class XC_MethodReplacement extends XC_MethodHook {
    method XC_MethodReplacement (line 32) | public XC_MethodReplacement() {
    method XC_MethodReplacement (line 41) | public XC_MethodReplacement(int priority) {
    method beforeHookedMethod (line 48) | @Override
    method afterHookedMethod (line 61) | @Override
    method replaceHookedMethod (line 75) | @SuppressWarnings("UnusedParameters")
    method replaceHookedMethod (line 82) | @Override
    method returnConstant (line 93) | public static XC_MethodReplacement returnConstant(final Object result) {
    method returnConstant (line 103) | public static XC_MethodReplacement returnConstant(int priority, final ...

FILE: core/src/main/java/de/robv/android/xposed/XSharedPreferences.java
  class XSharedPreferences (line 63) | public final class XSharedPreferences implements SharedPreferences {
    method initWatcherDaemon (line 79) | private static void initWatcherDaemon() {
    method XSharedPreferences (line 139) | public XSharedPreferences(File prefFile) {
    method XSharedPreferences (line 151) | public XSharedPreferences(String packageName) {
    method XSharedPreferences (line 162) | public XSharedPreferences(String packageName, String prefFileName) {
    method tryRegisterWatcher (line 195) | private void tryRegisterWatcher() {
    method tryUnregisterWatcher (line 223) | private void tryUnregisterWatcher() {
    method init (line 243) | private void init() {
    method tryGetFileSize (line 247) | private static long tryGetFileSize(String filename) {
    method tryGetFileHash (line 255) | private static byte[] tryGetFileHash(String filename) {
    method makeWorldReadable (line 282) | @SuppressLint("SetWorldReadable")
    method getFile (line 310) | public File getFile() {
    method startLoadFromDisk (line 314) | private void startLoadFromDisk() {
    method loadFromDiskLocked (line 328) | @SuppressWarnings({"rawtypes", "unchecked"})
    method reload (line 378) | public synchronized void reload() {
    method hasFileChanged (line 389) | public synchronized boolean hasFileChanged() {
    method awaitLoadedLocked (line 402) | private void awaitLoadedLocked() {
    method getAll (line 414) | @Override
    method getString (line 425) | @Override
    method getStringSet (line 437) | @Override
    method getInt (line 450) | @Override
    method getLong (line 462) | @Override
    method getFloat (line 474) | @Override
    method getBoolean (line 486) | @Override
    method contains (line 498) | @Override
    method edit (line 509) | @Deprecated
    method registerOnSharedPreferenceChangeListener (line 523) | @Override
    method unregisterOnSharedPreferenceChangeListener (line 541) | @Override
    class PrefsData (line 550) | private static class PrefsData {
      method PrefsData (line 555) | public PrefsData(XSharedPreferences prefs) {
      method hasChanged (line 561) | public boolean hasChanged() {

FILE: core/src/main/java/de/robv/android/xposed/XposedBridge.java
  class XposedBridge (line 53) | public final class XposedBridge {
    method XposedBridge (line 79) | private XposedBridge() {
    method initXResources (line 84) | public static void initXResources() {
    method getXposedVersion (line 135) | public static int getXposedVersion() {
    method log (line 147) | public synchronized static void log(String text) {
    method log (line 159) | public synchronized static void log(Throwable t) {
    method deoptimizeMethod (line 170) | public static void deoptimizeMethod(Member deoptimizedMethod) {
    method hookMethod (line 195) | public static XC_MethodHook.Unhook hookMethod(Member hookMethod, XC_Me...
    method unhookMethod (line 226) | @Deprecated
    method hookAllMethods (line 243) | @SuppressWarnings("UnusedReturnValue")
    method hookAllConstructors (line 259) | @SuppressWarnings("UnusedReturnValue")
    method hookLoadPackage (line 276) | public static void hookLoadPackage(XC_LoadPackage callback) {
    method hookInitPackageResources (line 291) | public static void hookInitPackageResources(XC_InitPackageResources ca...
    method invokeOriginalMethod (line 318) | public static Object invokeOriginalMethod(Member method, Object thisOb...
    class CopyOnWriteSortedSet (line 334) | public static final class CopyOnWriteSortedSet<E> {
      method add (line 337) | @SuppressWarnings("UnusedReturnValue")
      method remove (line 351) | @SuppressWarnings("UnusedReturnValue")
      method indexOf (line 364) | private int indexOf(Object o) {
      method getSnapshot (line 372) | public Object[] getSnapshot() {
      method getSnapshot (line 376) | public <T> T[] getSnapshot(T[] a) {
      method clear (line 381) | public synchronized void clear() {
    class LegacyApiSupport (line 386) | public static class LegacyApiSupport<T extends Executable> {
      method LegacyApiSupport (line 393) | public LegacyApiSupport(LSPosedHookCallback<T> callback, Object[] le...
      method handleBefore (line 399) | public void handleBefore() {
      method handleAfter (line 423) | public void handleAfter() {
      method syncronizeApi (line 445) | private void syncronizeApi(XC_MethodHook.MethodHookParam<T> param, L...

FILE: core/src/main/java/de/robv/android/xposed/XposedHelpers.java
  class XposedHelpers (line 58) | public final class XposedHelpers {
    method XposedHelpers (line 59) | private XposedHelpers() {
    class MemberCacheKey (line 77) | private abstract static class MemberCacheKey {
      method MemberCacheKey (line 80) | protected MemberCacheKey(int hash) {
      method equals (line 84) | @Override
      method hashCode (line 87) | @Override
      class Constructor (line 92) | static final class Constructor extends MemberCacheKey {
        method Constructor (line 97) | public Constructor(Class<?> clazz, Class<?>[] parameters, boolean ...
        method equals (line 104) | @Override
        method toString (line 112) | @NonNull
      class Field (line 124) | static final class Field extends MemberCacheKey {
        method Field (line 128) | public Field(Class<?> clazz, String name) {
        method equals (line 134) | @Override
        method toString (line 142) | @NonNull
      class Method (line 149) | static final class Method extends MemberCacheKey {
        method Method (line 155) | public Method(Class<?> clazz, String name, Class<?>[] parameters, ...
        method equals (line 163) | @Override
        method toString (line 171) | @NonNull
    method findClass (line 201) | public static Class<?> findClass(String className, ClassLoader classLo...
    method findClassIfExists (line 219) | public static Class<?> findClassIfExists(String className, ClassLoader...
    method findField (line 235) | public static Field findField(Class<?> clazz, String fieldName) {
    method findFieldIfExists (line 257) | public static Field findFieldIfExists(Class<?> clazz, String fieldName) {
    method findFieldRecursiveImpl (line 265) | private static Field findFieldRecursiveImpl(Class<?> clazz, String fie...
    method findFirstFieldByExactType (line 292) | public static Field findFirstFieldByExactType(Class<?> clazz, Class<?>...
    method findAndHookMethod (line 310) | public static XC_MethodHook.Unhook findAndHookMethod(Class<?> clazz, S...
    method findAndHookMethod (line 389) | public static XC_MethodHook.Unhook findAndHookMethod(String className,...
    method findMethodExact (line 397) | public static Method findMethodExact(Class<?> clazz, String methodName...
    method findMethodExactIfExists (line 405) | public static Method findMethodExactIfExists(Class<?> clazz, String me...
    method findMethodExact (line 428) | public static Method findMethodExact(String className, ClassLoader cla...
    method findMethodExactIfExists (line 443) | public static Method findMethodExactIfExists(String className, ClassLo...
    method findMethodExact (line 457) | public static Method findMethodExact(Class<?> clazz, String methodName...
    method findMethodsByExactParameters (line 482) | public static Method[] findMethodsByExactParameters(Class<?> clazz, Cl...
    method findMethodBestMatch (line 522) | public static Method findMethodBestMatch(Class<?> clazz, String method...
    method findMethodBestMatch (line 574) | public static Method findMethodBestMatch(Class<?> clazz, String method...
    method findMethodBestMatch (line 585) | public static Method findMethodBestMatch(Class<?> clazz, String method...
    method getParameterTypes (line 600) | public static Class<?>[] getParameterTypes(Object... args) {
    method getParameterClasses (line 612) | private static Class<?>[] getParameterClasses(ClassLoader classLoader,...
    method getClassesAsArray (line 644) | public static Class<?>[] getClassesAsArray(Class<?>... clazzes) {
    method getParametersString (line 648) | private static String getParametersString(Class<?>... clazzes) {
    method findConstructorExact (line 670) | public static Constructor<?> findConstructorExact(Class<?> clazz, Obje...
    method findConstructorExactIfExists (line 678) | public static Constructor<?> findConstructorExactIfExists(Class<?> cla...
    method findConstructorExact (line 690) | public static Constructor<?> findConstructorExact(String className, Cl...
    method findConstructorExactIfExists (line 698) | public static Constructor<?> findConstructorExactIfExists(String class...
    method findConstructorExact (line 710) | public static Constructor<?> findConstructorExact(Class<?> clazz, Clas...
    method findAndHookConstructor (line 728) | public static XC_MethodHook.Unhook findAndHookConstructor(Class<?> cla...
    method findAndHookConstructor (line 742) | public static XC_MethodHook.Unhook findAndHookConstructor(String class...
    method findConstructorBestMatch (line 751) | public static Constructor<?> findConstructorBestMatch(Class<?> clazz, ...
    method findConstructorBestMatch (line 795) | public static Constructor<?> findConstructorBestMatch(Class<?> clazz, ...
    method findConstructorBestMatch (line 806) | public static Constructor<?> findConstructorBestMatch(Class<?> clazz, ...
    class ClassNotFoundError (line 823) | public static final class ClassNotFoundError extends Error {
      method ClassNotFoundError (line 829) | public ClassNotFoundError(Throwable cause) {
      method ClassNotFoundError (line 836) | public ClassNotFoundError(String detailMessage, Throwable cause) {
    method getFirstParameterIndexByType (line 847) | public static int getFirstParameterIndexByType(Member method, Class<?>...
    method getParameterIndexByType (line 864) | public static int getParameterIndexByType(Member method, Class<?> type) {
    method setObjectField (line 889) | public static void setObjectField(Object obj, String fieldName, Object...
    method setBooleanField (line 904) | public static void setBooleanField(Object obj, String fieldName, boole...
    method setByteField (line 919) | public static void setByteField(Object obj, String fieldName, byte val...
    method setCharField (line 934) | public static void setCharField(Object obj, String fieldName, char val...
    method setDoubleField (line 949) | public static void setDoubleField(Object obj, String fieldName, double...
    method setFloatField (line 964) | public static void setFloatField(Object obj, String fieldName, float v...
    method setIntField (line 979) | public static void setIntField(Object obj, String fieldName, int value) {
    method setLongField (line 994) | public static void setLongField(Object obj, String fieldName, long val...
    method setShortField (line 1009) | public static void setShortField(Object obj, String fieldName, short v...
    method getObjectField (line 1026) | public static Object getObjectField(Object obj, String fieldName) {
    method getSurroundingThis (line 1041) | public static Object getSurroundingThis(Object obj) {
    method getBooleanField (line 1048) | @SuppressWarnings("BooleanMethodIsAlwaysInverted")
    method getByteField (line 1064) | public static byte getByteField(Object obj, String fieldName) {
    method getCharField (line 1079) | public static char getCharField(Object obj, String fieldName) {
    method getDoubleField (line 1094) | public static double getDoubleField(Object obj, String fieldName) {
    method getFloatField (line 1109) | public static float getFloatField(Object obj, String fieldName) {
    method getIntField (line 1124) | public static int getIntField(Object obj, String fieldName) {
    method getLongField (line 1139) | public static long getLongField(Object obj, String fieldName) {
    method getShortField (line 1154) | public static short getShortField(Object obj, String fieldName) {
    method setStaticObjectField (line 1171) | public static void setStaticObjectField(Class<?> clazz, String fieldNa...
    method setStaticBooleanField (line 1186) | public static void setStaticBooleanField(Class<?> clazz, String fieldN...
    method setStaticByteField (line 1201) | public static void setStaticByteField(Class<?> clazz, String fieldName...
    method setStaticCharField (line 1216) | public static void setStaticCharField(Class<?> clazz, String fieldName...
    method setStaticDoubleField (line 1231) | public static void setStaticDoubleField(Class<?> clazz, String fieldNa...
    method setStaticFloatField (line 1246) | public static void setStaticFloatField(Class<?> clazz, String fieldNam...
    method setStaticIntField (line 1261) | public static void setStaticIntField(Class<?> clazz, String fieldName,...
    method setStaticLongField (line 1276) | public static void setStaticLongField(Class<?> clazz, String fieldName...
    method setStaticShortField (line 1291) | public static void setStaticShortField(Class<?> clazz, String fieldNam...
    method getStaticObjectField (line 1308) | public static Object getStaticObjectField(Class<?> clazz, String field...
    method getStaticBooleanField (line 1323) | public static boolean getStaticBooleanField(Class<?> clazz, String fie...
    method getStaticByteField (line 1338) | public static byte getStaticByteField(Class<?> clazz, String fieldName) {
    method getStaticCharField (line 1353) | public static char getStaticCharField(Class<?> clazz, String fieldName) {
    method getStaticDoubleField (line 1368) | public static double getStaticDoubleField(Class<?> clazz, String field...
    method getStaticFloatField (line 1383) | public static float getStaticFloatField(Class<?> clazz, String fieldNa...
    method getStaticIntField (line 1398) | public static int getStaticIntField(Class<?> clazz, String fieldName) {
    method getStaticLongField (line 1413) | public static long getStaticLongField(Class<?> clazz, String fieldName) {
    method getStaticShortField (line 1428) | public static short getStaticShortField(Class<?> clazz, String fieldNa...
    method callMethod (line 1452) | public static Object callMethod(Object obj, String methodName, Object....
    method callMethod (line 1473) | public static Object callMethod(Object obj, String methodName, Class<?...
    method callStaticMethod (line 1497) | public static Object callStaticMethod(Class<?> clazz, String methodNam...
    method callStaticMethod (line 1518) | public static Object callStaticMethod(Class<?> clazz, String methodNam...
    class InvocationTargetError (line 1539) | public static final class InvocationTargetError extends Error {
      method InvocationTargetError (line 1545) | public InvocationTargetError(Throwable cause) {
    method newInstance (line 1562) | public static Object newInstance(Class<?> clazz, Object... args) {
    method newInstance (line 1585) | public static Object newInstance(Class<?> clazz, Class<?>[] parameterT...
    method setAdditionalInstanceField (line 1612) | public static Object setAdditionalInstanceField(Object obj, String key...
    method getAdditionalInstanceField (line 1639) | public static Object getAdditionalInstanceField(Object obj, String key) {
    method removeAdditionalInstanceField (line 1664) | public static Object removeAdditionalInstanceField(Object obj, String ...
    method setAdditionalStaticField (line 1685) | public static Object setAdditionalStaticField(Object obj, String key, ...
    method getAdditionalStaticField (line 1692) | public static Object getAdditionalStaticField(Object obj, String key) {
    method removeAdditionalStaticField (line 1699) | public static Object removeAdditionalStaticField(Object obj, String ke...
    method setAdditionalStaticField (line 1706) | public static Object setAdditionalStaticField(Class<?> clazz, String k...
    method getAdditionalStaticField (line 1713) | public static Object getAdditionalStaticField(Class<?> clazz, String k...
    method removeAdditionalStaticField (line 1720) | public static Object removeAdditionalStaticField(Class<?> clazz, Strin...
    method assetAsByteArray (line 1733) | public static byte[] assetAsByteArray(Resources res, String path) thro...
    method inputStreamToByteArray (line 1738) | static byte[] inputStreamToByteArray(InputStream is) throws IOException {
    method getMD5Sum (line 1753) | public static String getMD5Sum(String file) throws IOException {
    method incrementMethodDepth (line 1784) | public static int incrementMethodDepth(String method) {
    method decrementMethodDepth (line 1795) | public static int decrementMethodDepth(String method) {
    method getMethodDepth (line 1806) | public static int getMethodDepth(String method) {
    method getMethodDepthCounter (line 1810) | private static ThreadLocal<AtomicInteger> getMethodDepthCounter(String...

FILE: core/src/main/java/de/robv/android/xposed/XposedInit.java
  class XposedInit (line 65) | public final class XposedInit {
    method hookResources (line 72) | public static void hookResources() throws Throwable {
    method cloneToXResources (line 195) | private static XResources cloneToXResources(XC_MethodHook.MethodHookPa...
    method getLoadedModules (line 222) | public static Map<String, Optional<String>> getLoadedModules() {
    method loadLegacyModules (line 226) | public static void loadLegacyModules() {
    method loadModules (line 239) | public static void loadModules(ActivityThread at) {
    method initNativeModule (line 255) | private static void initNativeModule(List<String> moduleLibraryNames) {
    method initModule (line 259) | private static boolean initModule(ClassLoader mcl, String apk, List<St...
    method loadModule (line 303) | private static boolean loadModule(String name, String apk, PreLoadedAp...

FILE: core/src/main/java/de/robv/android/xposed/callbacks/IXUnhook.java
  type IXUnhook (line 35) | public interface IXUnhook<T> {
    method getCallback (line 39) | T getCallback();
    method unhook (line 44) | void unhook();

FILE: core/src/main/java/de/robv/android/xposed/callbacks/XC_InitPackageResources.java
  class XC_InitPackageResources (line 38) | public abstract class XC_InitPackageResources extends XCallback implemen...
    method XC_InitPackageResources (line 44) | @SuppressWarnings("deprecation")
    method XC_InitPackageResources (line 55) | public XC_InitPackageResources(int priority) {
    class InitPackageResourcesParam (line 62) | public static final class InitPackageResourcesParam extends XCallback....
      method InitPackageResourcesParam (line 66) | public InitPackageResourcesParam(CopyOnWriteArraySet<XC_InitPackageR...
    method call (line 85) | @Override

FILE: core/src/main/java/de/robv/android/xposed/callbacks/XC_LayoutInflated.java
  class XC_LayoutInflated (line 33) | public abstract class XC_LayoutInflated extends XCallback implements Com...
    method XC_LayoutInflated (line 37) | @SuppressWarnings("deprecation")
    method XC_LayoutInflated (line 47) | public XC_LayoutInflated(int priority) {
    class LayoutInflatedParam (line 54) | public static final class LayoutInflatedParam extends XCallback.Param {
      method LayoutInflatedParam (line 58) | public LayoutInflatedParam(CopyOnWriteSortedSet<XC_LayoutInflated> c...
    method compareTo (line 84) | @Override
    method call (line 102) | @Override
    method handleLayoutInflated (line 114) | public abstract void handleLayoutInflated(LayoutInflatedParam liparam)...
    class Unhook (line 119) | public class Unhook implements IXUnhook<XC_LayoutInflated> {
      method Unhook (line 126) | public Unhook(String resDir, int id) {
      method getId (line 134) | public int getId() {
      method getCallback (line 138) | @Override
      method unhook (line 143) | @Override

FILE: core/src/main/java/de/robv/android/xposed/callbacks/XC_LoadPackage.java
  class XC_LoadPackage (line 39) | public abstract class XC_LoadPackage extends XCallback implements IXpose...
    method XC_LoadPackage (line 45) | @SuppressWarnings("deprecation")
    method XC_LoadPackage (line 56) | public XC_LoadPackage(int priority) {
    class LoadPackageParam (line 63) | public static final class LoadPackageParam extends XCallback.Param {
      method LoadPackageParam (line 67) | public LoadPackageParam(CopyOnWriteArraySet<XC_LoadPackage> callback...
    method call (line 100) | @Override

FILE: core/src/main/java/de/robv/android/xposed/callbacks/XCallback.java
  class XCallback (line 37) | abstract public class XCallback {
    method XCallback (line 51) | @Deprecated
    method XCallback (line 59) | public XCallback(int priority) {
    class Param (line 66) | public static abstract class Param {
      method Param (line 76) | @Deprecated
      method Param (line 84) | protected Param(XCallback[] callbacks) {
      method getExtra (line 97) | public synchronized Bundle getExtra() {
      method getObjectExtra (line 106) | public Object getObjectExtra(String key) {
      method setObjectExtra (line 117) | public void setObjectExtra(String key, Object o) {
      class SerializeWrapper (line 121) | private static class SerializeWrapper implements Serializable {
        method SerializeWrapper (line 125) | public SerializeWrapper(Object o) {
    method callAll (line 134) | public static void callAll(Param param) {
    method call (line 158) | protected void call(Param param) throws Throwable {

FILE: core/src/main/java/de/robv/android/xposed/services/BaseService.java
  class BaseService (line 35) | public abstract class BaseService {
    method hasDirectFileAccess (line 58) | public boolean hasDirectFileAccess() {
    method checkFileAccess (line 69) | public abstract boolean checkFileAccess(String filename, int mode);
    method checkFileExists (line 77) | @SuppressWarnings("BooleanMethodIsAlwaysInverted")
    method statFile (line 89) | public abstract FileResult statFile(String filename) throws IOException;
    method getFileSize (line 98) | public long getFileSize(String filename) throws IOException {
    method getFileModificationTime (line 109) | public long getFileModificationTime(String filename) throws IOException {
    method readFile (line 120) | public abstract byte[] readFile(String filename) throws IOException;
    method readFile (line 133) | public abstract FileResult readFile(String filename, long previousSize...
    method readFile (line 148) | public abstract FileResult readFile(String filename, int offset, int l...
    method getFileInputStream (line 159) | public InputStream getFileInputStream(String filename) throws IOExcept...
    method getFileInputStream (line 175) | public FileResult getFileInputStream(String filename, long previousSiz...
    method BaseService (line 184) | BaseService() {
    method ensureAbsolutePath (line 188) | static void ensureAbsolutePath(String filename) {
    method throwCommonIOException (line 195) | static void throwCommonIOException(int errno, String errorMsg, String ...

FILE: core/src/main/java/de/robv/android/xposed/services/DirectAccessService.java
  class DirectAccessService (line 32) | public final class DirectAccessService extends BaseService {
    method hasDirectFileAccess (line 33) | @Override
    method checkFileAccess (line 38) | @SuppressWarnings("RedundantIfStatement")
    method checkFileExists (line 49) | @Override
    method statFile (line 54) | @Override
    method readFile (line 60) | @Override
    method readFile (line 70) | @Override
    method readFile (line 80) | @Override
    method getFileInputStream (line 117) | @Override
    method getFileInputStream (line 126) | @Override

FILE: core/src/main/java/de/robv/android/xposed/services/FileResult.java
  class FileResult (line 28) | public final class FileResult {
    method FileResult (line 46) | FileResult(long size, long mtime) {
    method FileResult (line 53) | FileResult(byte[] content, long size, long mtime) {
    method FileResult (line 60) | FileResult(InputStream stream, long size, long mtime) {
    method toString (line 70) | @Override

FILE: core/src/main/java/org/lsposed/lspd/core/ApplicationServiceClient.java
  class ApplicationServiceClient (line 36) | public class ApplicationServiceClient implements ILSPApplicationService,...
    method ApplicationServiceClient (line 43) | private ApplicationServiceClient(@NonNull ILSPApplicationService servi...
    method Init (line 49) | synchronized static void Init(ILSPApplicationService service, String n...
    method isLogMuted (line 60) | @Override
    method getLegacyModulesList (line 69) | @Override
    method getModulesList (line 78) | @Override
    method getPrefsPath (line 87) | @Override
    method requestInjectedManagerBinder (line 96) | @Override
    method asBinder (line 105) | @Override
    method binderDied (line 110) | @Override

FILE: core/src/main/java/org/lsposed/lspd/core/Startup.java
  class Startup (line 50) | public class Startup {
    method startBootstrapHook (line 51) | private static void startBootstrapHook(boolean isSystem) {
    method bootstrapXposed (line 68) | public static void bootstrapXposed(boolean systemServerStarted) {
    method initXposed (line 95) | public static void initXposed(boolean isSystem, String processName, St...

FILE: core/src/main/java/org/lsposed/lspd/deopt/InlinedMethodCallers.java
  class InlinedMethodCallers (line 42) | public class InlinedMethodCallers {
    method getAll (line 99) | public static HashMap<String, Object[][]> getAll() {
    method get (line 103) | public static Object[][] get(String where) {

FILE: core/src/main/java/org/lsposed/lspd/deopt/PrebuiltMethodsDeopter.java
  class PrebuiltMethodsDeopter (line 36) | public class PrebuiltMethodsDeopter {
    method deoptMethods (line 38) | public static void deoptMethods(String where, ClassLoader cl) {
    method deoptBootMethods (line 66) | public static void deoptBootMethods() {
    method deoptResourceMethods (line 71) | public static void deoptResourceMethods() {
    method deoptSystemServerMethods (line 78) | public static void deoptSystemServerMethods(ClassLoader sysCL) {

FILE: core/src/main/java/org/lsposed/lspd/hooker/AttachHooker.java
  class AttachHooker (line 8) | public class AttachHooker implements XposedInterface.Hooker {
    method after (line 10) | public static void after(XposedInterface.AfterHookCallback callback) {

FILE: core/src/main/java/org/lsposed/lspd/hooker/CrashDumpHooker.java
  class CrashDumpHooker (line 8) | public class CrashDumpHooker implements XposedInterface.Hooker {
    method before (line 10) | public static void before(XposedInterface.BeforeHookCallback callback) {

FILE: core/src/main/java/org/lsposed/lspd/hooker/HandleSystemServerProcessHooker.java
  class HandleSystemServerProcessHooker (line 32) | public class HandleSystemServerProcessHooker implements XposedInterface....
    type Callback (line 34) | public interface Callback {
      method onSystemServerLoaded (line 35) | void onSystemServerLoaded(ClassLoader classLoader);
    method after (line 41) | @SuppressLint("PrivateApi")

FILE: core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCreateCLHooker.java
  class LoadedApkCreateCLHooker (line 55) | @SuppressLint("BlockedPrivateApi")
    method addLoadedApk (line 73) | static void addLoadedApk(LoadedApk loadedApk) {
    method after (line 77) | public static void after(XposedInterface.AfterHookCallback callback) {
    method hookNewXSP (line 170) | private static void hookNewXSP(XC_LoadPackage.LoadPackageParam lpparam) {

FILE: core/src/main/java/org/lsposed/lspd/hooker/LoadedApkCtorHooker.java
  class LoadedApkCtorHooker (line 34) | public class LoadedApkCtorHooker implements XposedInterface.Hooker {
    method after (line 36) | public static void after(XposedInterface.AfterHookCallback callback) {

FILE: core/src/main/java/org/lsposed/lspd/hooker/OpenDexFileHooker.java
  class OpenDexFileHooker (line 10) | public class OpenDexFileHooker implements XposedInterface.Hooker {
    method after (line 12) | public static void after(XposedInterface.AfterHookCallback callback) {

FILE: core/src/main/java/org/lsposed/lspd/hooker/StartBootstrapServicesHooker.java
  class StartBootstrapServicesHooker (line 36) | public class StartBootstrapServicesHooker implements XposedInterface.Hoo...
    method before (line 38) | public static void before() {

FILE: core/src/main/java/org/lsposed/lspd/impl/LSPosedBridge.java
  class LSPosedBridge (line 17) | public class LSPosedBridge {
    class HookerCallback (line 35) | public static class HookerCallback {
      method HookerCallback (line 44) | public HookerCallback(@NonNull Method beforeInvocation, @NonNull Met...
    method log (line 52) | public static void log(String text) {
    method log (line 56) | public static void log(Throwable t) {
    class NativeHooker (line 61) | public static class NativeHooker<T extends Executable> {
      method NativeHooker (line 64) | private NativeHooker(Executable method) {
      method callback (line 81) | public Object callback(Object[] args) throws Throwable {
    method dummyCallback (line 205) | public static void dummyCallback() {
    method doHook (line 208) | public static <T extends Executable> XposedInterface.MethodUnhooker<T>

FILE: core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java
  class LSPosedContext (line 46) | @SuppressLint("NewApi")
    method LSPosedContext (line 62) | LSPosedContext(String packageName, ApplicationInfo applicationInfo, IL...
    method callOnPackageLoaded (line 68) | public static void callOnPackageLoaded(XposedModuleInterface.PackageLo...
    method callOnSystemServerLoaded (line 78) | public static void callOnSystemServerLoaded(XposedModuleInterface.Syst...
    method loadModule (line 88) | @SuppressLint("DiscouragedPrivateApi")
    method getFrameworkName (line 142) | @NonNull
    method getFrameworkVersion (line 148) | @NonNull
    method getFrameworkVersionCode (line 154) | @Override
    method getFrameworkPrivilege (line 159) | @Override
    method hook (line 168) | @Override
    method hook (line 174) | @Override
    method hook (line 180) | @Override
    method hook (line 186) | @Override
    method hookClassInitializer (line 192) | @Override
    method hookClassInitializer (line 198) | @Override
    method doDeoptimize (line 213) | private static boolean doDeoptimize(@NonNull Executable method) {
    method deoptimize (line 222) | @Override
    method deoptimize (line 227) | @Override
    method invokeOrigin (line 232) | @Nullable
    method invokeOrigin (line 238) | @Override
    method getTypeShorty (line 244) | private static char getTypeShorty(Class<?> type) {
    method getExecutableShorty (line 268) | private static char[] getExecutableShorty(Executable executable) {
    method invokeSpecial (line 278) | @Nullable
    method invokeSpecial (line 287) | @Override
    method newInstanceOrigin (line 292) | @NonNull
    method newInstanceSpecial (line 300) | @NonNull
    method log (line 312) | @Override
    method log (line 317) | @Override
    method parseDex (line 322) | @Override
    method getApplicationInfo (line 327) | @NonNull
    method getRemotePreferences (line 333) | @NonNull
    method listRemoteFiles (line 347) | @NonNull
    method openRemoteFile (line 358) | @NonNull

FILE: core/src/main/java/org/lsposed/lspd/impl/LSPosedHelper.java
  class LSPosedHelper (line 11) | public class LSPosedHelper {
    method hookMethod (line 13) | @SuppressWarnings("UnusedReturnValue")
    method hookAllMethods (line 24) | @SuppressWarnings("UnusedReturnValue")
    method hookConstructor (line 36) | @SuppressWarnings("UnusedReturnValue")

FILE: core/src/main/java/org/lsposed/lspd/impl/LSPosedHookCallback.java
  class LSPosedHookCallback (line 11) | public class LSPosedHookCallback<T extends Executable> implements Xposed...
    method LSPosedHookCallback (line 25) | public LSPosedHookCallback() {
    method getMember (line 30) | @NonNull
    method getThisObject (line 36) | @Nullable
    method getArgs (line 42) | @NonNull
    method returnAndSkip (line 50) | @Override
    method throwAndSkip (line 57) | @Override
    method getResult (line 66) | @Nullable
    method getThrowable (line 72) | @Nullable
    method isSkipped (line 78) | @Override
    method setResult (line 83) | @Override
    method setThrowable (line 89) | @Override

FILE: core/src/main/java/org/lsposed/lspd/impl/LSPosedRemotePreferences.java
  class LSPosedRemotePreferences (line 19) | @SuppressWarnings("unchecked")
    method onUpdate (line 27) | @Override
    method LSPosedRemotePreferences (line 50) | public LSPosedRemotePreferences(ILSPInjectedModuleService service, Str...
    method getAll (line 57) | @Override
    method getString (line 62) | @Nullable
    method getStringSet (line 70) | @Nullable
    method getInt (line 78) | @Override
    method getLong (line 85) | @Override
    method getFloat (line 92) | @Override
    method getBoolean (line 99) | @Override
    method contains (line 106) | @Override
    method edit (line 111) | @Override
    method registerOnSharedPreferenceChangeListener (line 116) | @Override
    method unregisterOnSharedPreferenceChangeListener (line 123) | @Override

FILE: core/src/main/java/org/lsposed/lspd/util/ClassPathURLStreamHandler.java
  class ClassPathURLStreamHandler (line 18) | final class ClassPathURLStreamHandler extends Handler {
    method ClassPathURLStreamHandler (line 22) | ClassPathURLStreamHandler(String jarFileName) throws IOException {
    method getEntryUrlOrNull (line 27) | URL getEntryUrlOrNull(String entryName) {
    method openConnection (line 39) | @Override
    method finalize (line 44) | @Override
    class ClassPathURLConnection (line 49) | private final class ClassPathURLConnection extends JarURLConnection {
      method ClassPathURLConnection (line 55) | private ClassPathURLConnection(URL url) throws MalformedURLException {
      method setUseCaches (line 60) | @Override
      method connect (line 65) | @Override
      method getJarFile (line 79) | @Override
      method getInputStream (line 86) | @Override
      method getContentType (line 101) | @Override
      method getContentLength (line 110) | @Override

FILE: core/src/main/java/org/lsposed/lspd/util/Hookers.java
  class Hookers (line 25) | public class Hookers {
    method logD (line 27) | public static void logD(String prefix) {
    method logE (line 32) | public static void logE(String prefix, Throwable throwable) {

FILE: core/src/main/java/org/lsposed/lspd/util/LspModuleClassLoader.java
  class LspModuleClassLoader (line 32) | @SuppressWarnings("ConstantConditions")
    method splitPaths (line 40) | private static List<File> splitPaths(String searchPath) {
    method LspModuleClassLoader (line 49) | private LspModuleClassLoader(ByteBuffer[] dexBuffers,
    method LspModuleClassLoader (line 56) | @RequiresApi(Build.VERSION_CODES.Q)
    method initNativeLibraryDirs (line 66) | private void initNativeLibraryDirs(String librarySearchPath) {
    method loadClass (line 71) | @Override
    method findLibrary (line 94) | @Override
    method getLdLibraryPath (line 123) | @Override
    method findResource (line 135) | @Override
    method findResources (line 150) | @Override
    method getResource (line 158) | @Override
    method getResources (line 168) | @Override
    method toString (line 177) | @NonNull
    method loadApk (line 184) | public static ClassLoader loadApk(String apk,

FILE: core/src/main/java/org/lsposed/lspd/util/MetaDataReader.java
  class MetaDataReader (line 35) | public class MetaDataReader {
    method getMetaData (line 38) | public static Map<String, Object> getMetaData(File apk) throws IOExcep...
    method MetaDataReader (line 42) | private MetaDataReader(File apk) throws IOException {
    method getBytesFromInputStream (line 56) | public static byte[] getBytesFromInputStream(InputStream inputStream) ...
    class ManifestTagVisitor (line 67) | private class ManifestTagVisitor extends NodeVisitor {
      method ManifestTagVisitor (line 68) | public ManifestTagVisitor(NodeVisitor child) {
      method child (line 72) | @Override
      class ApplicationTagVisitor (line 81) | private class ApplicationTagVisitor extends NodeVisitor {
        method ApplicationTagVisitor (line 82) | public ApplicationTagVisitor(NodeVisitor child) {
        method child (line 86) | @Override
    class MetaDataVisitor (line 97) | private class MetaDataVisitor extends NodeVisitor {
      method MetaDataVisitor (line 101) | public MetaDataVisitor(NodeVisitor child) {
      method attr (line 105) | @Override
      method end (line 116) | @Override
    method extractIntPart (line 125) | public static int extractIntPart(String str) {

FILE: daemon/src/main/java/org/lsposed/lspd/Main.java
  class Main (line 5) | public class Main {
    method main (line 7) | public static void main(String[] args) {

FILE: daemon/src/main/java/org/lsposed/lspd/service/ActivityManagerService.java
  class ActivityManagerService (line 44) | public class ActivityManagerService {
    method binderDied (line 51) | @Override
    method getActivityManager (line 62) | public static IActivityManager getActivityManager() {
    method broadcastIntentWithFeature (line 78) | public static int broadcastIntentWithFeature(String callingFeatureId,
    method forceStopPackage (line 101) | public static void forceStopPackage(String packageName, int userId) th...
    method startUserInBackground (line 107) | public static boolean startUserInBackground(int userId) throws RemoteE...
    method registerReceiver (line 113) | public static Intent registerReceiver(String callerPackage,
    method finishReceiver (line 128) | public static void finishReceiver(IBinder intentReceiver, IBinder appl...
    method bindService (line 140) | public static int bindService(Intent service,
    method unbindService (line 152) | public static boolean unbindService(IServiceConnection connection) thr...
    method startActivityAsUserWithFeature (line 158) | public static int startActivityAsUserWithFeature(String callingPackage,
    method onSystemServerContext (line 172) | public static void onSystemServerContext(IApplicationThread thread, IB...
    method switchUser (line 177) | public static boolean switchUser(int userid) throws RemoteException {
    method getCurrentUser (line 183) | public static UserInfo getCurrentUser() throws RemoteException {
    method getConfiguration (line 189) | public static Configuration getConfiguration() throws RemoteException {
    method getContentProvider (line 195) | public static IContentProvider getContentProvider(String auth, int use...
    method registerUidObserver (line 207) | public static void registerUidObserver(IUidObserver observer, int whic...

FILE: daemon/src/main/java/org/lsposed/lspd/service/BridgeService.java
  class BridgeService (line 20) | public class BridgeService {
    type ACTION (line 25) | enum ACTION {
    type Listener (line 31) | public interface Listener {
      method onSystemServerRestarted (line 32) | void onSystemServerRestarted();
      method onResponseFromBridgeService (line 34) | void onResponseFromBridgeService(boolean response);
      method onSystemServerDied (line 36) | void onSystemServerDied();
    method binderDied (line 45) | @Override
    method sendToBridge (line 91) | private static synchronized void sendToBridge(IBinder binder, boolean ...
    method send (line 174) | public static void send(LSPosedService service, Listener listener) {

FILE: daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java
  class ConfigFileManager (line 81) | public class ConfigFileManager {
    method transfer (line 111) | public static void transfer(InputStream in, OutputStream out) throws I...
    method createLogDirPath (line 120) | private static void createLogDirPath() throws IOException {
    method getResources (line 127) | public static Resources getResources() {
    method loadRes (line 132) | private static void loadRes() {
    method reloadConfiguration (line 149) | static void reloadConfiguration() {
    method getManagerApk (line 161) | static ParcelFileDescriptor getManagerApk() throws IOException {
    method deleteFolderIfExists (line 170) | static void deleteFolderIfExists(Path target) throws IOException {
    method chattr0 (line 193) | public static boolean chattr0(Path path) {
    method moveLogDir (line 214) | static void moveLogDir() {
    method getNewLogFileName (line 228) | private static String getNewLogFileName(String prefix) {
    method getNewVerboseLogPath (line 232) | static File getNewVerboseLogPath() throws IOException {
    method getNewModulesLogPath (line 237) | static File getNewModulesLogPath() throws IOException {
    method getPropsPath (line 242) | static File getPropsPath() throws IOException {
    method getKmsgPath (line 247) | static File getKmsgPath() throws IOException {
    method getLogs (line 252) | static void getLogs(ParcelFileDescriptor zipFd) throws IllegalStateExc...
    method zipAddProcOutput (line 295) | private static void zipAddProcOutput(ZipOutputStream os, String name, ...
    method zipAddFile (line 305) | private static void zipAddFile(ZipOutputStream os, Path path, Path bas...
    method zipAddDir (line 325) | private static void zipAddDir(ZipOutputStream os, Path path) throws IO...
    method readDex (line 344) | private static SharedMemory readDex(InputStream in, boolean obfuscate)...
    method readDexes (line 360) | private static void readDexes(ZipFile apkFile, List<SharedMemory> preL...
    method readName (line 373) | private static void readName(ZipFile apkFile, String initName, List<St...
    method loadModule (line 389) | @Nullable
    method tryLock (line 432) | static boolean tryLock() {
    method getPreloadDex (line 448) | synchronized static SharedMemory getPreloadDex(boolean obfuscate) {
    method ensureModuleFilePath (line 459) | static void ensureModuleFilePath(String path) throws RemoteException {
    method resolveModuleDir (line 465) | static Path resolveModuleDir(String packageName, String dir, int userI...
    method setSelinuxContextRecursive (line 483) | private static void setSelinuxContextRecursive(Path path, String conte...
    class FileLocker (line 499) | private static class FileLocker {
      method FileLocker (line 503) | FileLocker(FileChannel lockChannel) throws IOException {
      method isValid (line 508) | boolean isValid() {
      method finalize (line 512) | @Override

FILE: daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java
  class ConfigManager (line 93) | public class ConfigManager {
    class ProcessScope (line 116) | static class ProcessScope {
      method ProcessScope (line 120) | ProcessScope(@NonNull String processName, int uid) {
      method equals (line 125) | @Override
      method hashCode (line 134) | @Override
    method openDb (line 182) | private static SQLiteDatabase openDb() {
    method updateCaches (line 192) | private void updateCaches(boolean sync) {
    method shouldSkipSystemServer (line 204) | public boolean shouldSkipSystemServer() {
    method getModulesForSystemServer (line 216) | @SuppressLint("BlockedPrivateApi")
    method updateConfig (line 267) | private synchronized void updateConfig() {
    method updateManager (line 312) | public synchronized void updateManager(boolean uninstalled) {
    method getInstance (line 330) | static ConfigManager getInstance() {
    method ConfigManager (line 348) | private ConfigManager() {
    method executeInTransaction (line 360) | private <T> T executeInTransaction(Supplier<T> execution) {
    method executeInTransaction (line 371) | private void executeInTransaction(Runnable execution) {
    method initDB (line 378) | private void initDB() {
    method getAssociatedProcesses (line 448) | private List<ProcessScope> getAssociatedProcesses(Application app) thr...
    method fetchModuleConfig (line 466) | private @NonNull
    method updateModulePrefs (line 491) | public void updateModulePrefs(String moduleName, int userId, String gr...
    method updateModulePrefs (line 497) | public void updateModulePrefs(String moduleName, int userId, String gr...
    method deleteModulePrefs (line 529) | public void deleteModulePrefs(String moduleName, int userId, String gr...
    method getModulePrefs (line 537) | public HashMap<String, Object> getModulePrefs(String moduleName, int u...
    method clearCache (line 542) | private synchronized void clearCache() {
    method cacheModules (line 551) | private synchronized void cacheModules() {
    method cacheScopes (line 656) | private synchronized void cacheScopes() {
    method getModulesForProcess (line 761) | public List<Module> getModulesForProcess(String processName, int uid) {
    method shouldSkipProcess (line 766) | public boolean shouldSkipProcess(ProcessScope scope) {
    method isUidHooked (line 770) | public boolean isUidHooked(int uid) {
    method getModuleScope (line 774) | @Nullable
    method getModuleApkPath (line 795) | @Nullable
    method updateModuleApkPath (line 816) | public boolean updateModuleApkPath(String packageName, String apkPath,...
    method getModuleId (line 846) | private int getModuleId(String packageName) {
    method setModuleScope (line 860) | public boolean setModuleScope(String packageName, List<Application> sc...
    method setModuleScope (line 881) | public boolean setModuleScope(String packageName, String scopePackageN...
    method removeModuleScope (line 898) | public boolean removeModuleScope(String packageName, String scopePacka...
    method enabledModules (line 912) | public String[] enabledModules() {
    method removeModule (line 916) | public boolean removeModule(String packageName) {
    method removeModuleWithoutCache (line 928) | private boolean removeModuleWithoutCache(String packageName) {
    method removeModuleScopeWithoutCache (line 941) | private boolean removeModuleScopeWithoutCache(Application module) {
    method removeAppWithoutCache (line 954) | private boolean removeAppWithoutCache(Application app) {
    method disableModule (line 959) | public boolean disableModule(String packageName) {
    method enableModule (line 975) | public boolean enableModule(String packageName) throws RemoteException {
    method updateCache (line 996) | public void updateCache() {
    method updateAppCache (line 1001) | public void updateAppCache() {
    method setVerboseLog (line 1006) | public void setVerboseLog(boolean on) {
    method verboseLog (line 1018) | public boolean verboseLog() {
    method setLogWatchdog (line 1022) | public void setLogWatchdog(boolean on) {
    method isLogWatchdogEnabled (line 1033) | public boolean isLogWatchdogEnabled() {
    method setDexObfuscate (line 1037) | public void setDexObfuscate(boolean on) {
    method scopeRequestBlocked (line 1041) | public boolean scopeRequestBlocked(String packageName) {
    method blockScopeRequest (line 1045) | public void blockScopeRequest(String packageName) {
    method removeBlockedScopeRequest (line 1052) | public void removeBlockedScopeRequest(String packageName) {
    method dexObfuscate (line 1060) | boolean dexObfuscate() {
    method enableStatusNotification (line 1065) | public boolean enableStatusNotification() {
    method setEnableStatusNotification (line 1070) | public void setEnableStatusNotification(boolean enable) {
    method getManagerApk (line 1075) | public ParcelFileDescriptor getManagerApk() {
    method getModulesLog (line 1084) | public ParcelFileDescriptor getModulesLog() {
    method getVerboseLog (line 1095) | public ParcelFileDescriptor getVerboseLog() {
    method clearLogs (line 1106) | public boolean clearLogs(boolean verbose) {
    method isManager (line 1111) | public boolean isManager(int uid) {
    method isManagerInstalled (line 1115) | public boolean isManagerInstalled() {
    method getPrefsPath (line 1119) | public String getPrefsPath(String packageName, int uid) {
    method getModule (line 1142) | public Module getModule(int uid) {
    method walkFileTree (line 1149) | private void walkFileTree(Path rootDir, Consumer<Path> action) throws ...
    method removeModulePrefs (line 1166) | private void removeModulePrefs(int uid, String packageName) throws IOE...
    method getDenyListPackages (line 1172) | public List<String> getDenyListPackages() {
    method setApi (line 1197) | public void setApi(String api) {
    method getApi (line 1201) | public String getApi() {
    method exportScopes (line 1205) | public void exportScopes(ZipOutputStream os) throws IOException {
    method getPreloadDex (line 1226) | synchronized SharedMemory getPreloadDex() {
    method getAutoInclude (line 1230) | public boolean getAutoInclude(String packageName) {
    method setAutoInclude (line 1237) | public boolean setAutoInclude(String packageName, boolean enable) {
    method getAutoIncludeModules (line 1246) | public String[] getAutoIncludeModules() {
    method listModules (line 1250) | private String[] listModules(String column) {

FILE: daemon/src/main/java/org/lsposed/lspd/service/Dex2OatService.java
  class Dex2OatService (line 49) | @RequiresApi(Build.VERSION_CODES.Q)
    method openDex2oat (line 62) | private void openDex2oat(int id, String path) {
    method checkAndAddDex2Oat (line 76) | private void checkAndAddDex2Oat(String path) {
    method Dex2OatService (line 124) | public Dex2OatService() {
    method notMounted (line 193) | private boolean notMounted() {
    method doMount (line 213) | private void doMount(boolean enabled) {
    method start (line 217) | public void start() {
    method run (line 234) | @Override
    method getCompatibility (line 275) | public int getCompatibility() {
    method doMountNative (line 279) | private native void doMountNative(boolean enabled,
    method setSockCreateContext (line 282) | private static native boolean setSockCreateContext(String context);
    method getSockPath (line 284) | private native String getSockPath();

FILE: daemon/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java
  class LSPApplicationService (line 42) | public class LSPApplicationService extends ILSPApplicationService.Stub {
    class ProcessInfo (line 48) | static class ProcessInfo implements DeathRecipient {
      method ProcessInfo (line 54) | ProcessInfo(int uid, int pid, String processName, IBinder heartBeat)...
      method binderDied (line 64) | @Override
      method toString (line 71) | @NonNull
    method onTransact (line 83) | @Override
    method registerHeartBeat (line 112) | public boolean registerHeartBeat(int uid, int pid, String processName,...
    method getAllModulesList (line 121) | private List<Module> getAllModulesList() throws RemoteException {
    method isLogMuted (line 131) | @Override
    method getLegacyModulesList (line 136) | @Override
    method getModulesList (line 141) | @Override
    method getPrefsPath (line 146) | @Override
    method requestInjectedManagerBinder (line 152) | @Override
    method hasRegister (line 162) | public boolean hasRegister(int uid, int pid) {
    method ensureRegistered (line 166) | @NonNull

FILE: daemon/src/main/java/org/lsposed/lspd/service/LSPInjectedModuleService.java
  class LSPInjectedModuleService (line 20) | public class LSPInjectedModuleService extends ILSPInjectedModuleService....
    method LSPInjectedModuleService (line 28) | LSPInjectedModuleService(String packageName) {
    method getFrameworkPrivilege (line 32) | @Override
    method requestRemotePreferences (line 37) | @Override
    method openRemoteFile (line 54) | @Override
    method getRemoteFileList (line 66) | @Override
    method onUpdateRemotePreferences (line 79) | void onUpdateRemotePreferences(String group, Bundle diff) {

FILE: daemon/src/main/java/org/lsposed/lspd/service/LSPManagerService.java
  class LSPManagerService (line 67) | public class LSPManagerService extends ILSPManagerService.Stub {
    class ManagerGuard (line 72) | public class ManagerGuard implements IBinder.DeathRecipient {
      method connected (line 78) | @Override
      method ManagerGuard (line 83) | public ManagerGuard(@NonNull IBinder binder, int pid, int uid) {
      method binderDied (line 101) | @Override
      method isAlive (line 112) | boolean isAlive() {
    method LSPManagerService (line 126) | LSPManagerService() {
    method getManagerIntent (line 129) | private static Intent getManagerIntent() {
    method openManager (line 158) | static void openManager(Uri withData) {
    method broadcastIntent (line 170) | @SuppressLint("WrongConstant")
    method ensureWebViewPermission (line 192) | private void ensureWebViewPermission(File f) {
    method ensureWebViewPermission (line 207) | private void ensureWebViewPermission() {
    method preStartManager (line 221) | synchronized boolean preStartManager() {
    method shouldStartManager (line 228) | synchronized boolean shouldStartManager(int pid, int uid, String proce...
    method setEnabled (line 237) | synchronized boolean setEnabled(boolean newValue) {
    method postStartManager (line 244) | boolean postStartManager(int pid, int uid) {
    method obtainManagerBinder (line 248) | public @NonNull
    method isRunningManager (line 256) | public boolean isRunningManager(int pid, int uid) {
    method onSystemServerDied (line 260) | void onSystemServerDied() {
    method asBinder (line 264) | @Override
    method getXposedApiVersion (line 269) | @Override
    method getXposedVersionCode (line 274) | @Override
    method getXposedVersionName (line 279) | @Override
    method getApi (line 284) | @Override
    method getInstalledPackagesFromAllUsers (line 289) | @Override
    method enabledModules (line 294) | @Override
    method enableModule (line 299) | @Override
    method setModuleScope (line 304) | @Override
    method getModuleScope (line 309) | @Override
    method disableModule (line 314) | @Override
    method isVerboseLog (line 319) | @Override
    method setVerboseLog (line 324) | @Override
    method getVerboseLog (line 329) | @Override
    method getModulesLog (line 334) | @Override
    method clearLogs (line 340) | @Override
    method getPackageInfo (line 345) | @Override
    method forceStopPackage (line 350) | @Override
    method reboot (line 355) | @Override
    method uninstallPackage (line 360) | @Override
    method isSepolicyLoaded (line 375) | @Override
    method getUsers (line 381) | @Override
    method installExistingPackageAsUser (line 393) | @Override
    method systemServerRequested (line 405) | @Override
    method startActivityAsUserWithFeature (line 410) | @Override
    method queryIntentActivitiesAsUser (line 430) | @Override
    method dex2oatFlagsLoaded (line 435) | @Override
    method setHiddenIcon (line 440) | @Override
    method getLogs (line 466) | @Override
    method restartFor (line 471) | @Override
    method getDenyListPackages (line 475) | @Override
    method flashZip (line 480) | @Override
    method clearApplicationProfileData (line 506) | @Override
    method enableStatusNotification (line 511) | @Override
    method setEnableStatusNotification (line 516) | @Override
    method performDexOptMode (line 526) | @Override
    method getDexObfuscate (line 531) | @Override
    method setDexObfuscate (line 536) | @Override
    method getDex2OatWrapperCompatibility (line 541) | @Override
    method setLogWatchdog (line 550) | @Override
    method isLogWatchdogEnabled (line 555) | @Override
    method setAutoInclude (line 560) | @Override
    method getAutoInclude (line 565) | @Override

FILE: daemon/src/main/java/org/lsposed/lspd/service/LSPModuleService.java
  class LSPModuleService (line 50) | public class LSPModuleService extends IXposedService.Stub {
    method uidClear (line 62) | static void uidClear() {
    method uidStarts (line 66) | static void uidStarts(int uid) {
    method uidGone (line 77) | static void uidGone(int uid) {
    method sendBinder (line 81) | private void sendBinder(int uid) {
    method LSPModuleService (line 113) | LSPModuleService(@NonNull Module module) {
    method ensureModule (line 117) | private int ensureModule() throws RemoteException {
    method getAPIVersion (line 125) | @Override
    method getFrameworkName (line 131) | @Override
    method getFrameworkVersion (line 137) | @Override
    method getFrameworkVersionCode (line 143) | @Override
    method getFrameworkPrivilege (line 149) | @Override
    method getScope (line 155) | @Override
    method requestScope (line 167) | @Override
    method removeScope (line 178) | @Override
    method requestRemotePreferences (line 191) | @Override
    method updateRemotePreferences (line 199) | @Override
    method deleteRemotePreferences (line 227) | @Override
    method listRemoteFiles (line 233) | @Override
    method openRemoteFile (line 245) | @Override
    method deleteRemoteFile (line 257) | @Override

FILE: daemon/src/main/java/org/lsposed/lspd/service/LSPNotificationManager.java
  class LSPNotificationManager (line 37) | public class LSPNotificationManager {
    method binderDied (line 55) | @Override
    method getNotificationManager (line 64) | private static INotificationManager getNotificationManager() throws Re...
    method getBitmap (line 73) | private static Bitmap getBitmap(int id) {
    method getNotificationIcon (line 93) | private static Icon getNotificationIcon() {
    method hasNotificationChannelForSystem (line 97) | private static boolean hasNotificationChannelForSystem(
    method createNotificationChannel (line 111) | private static void createNotificationChannel(INotificationManager nm)...
    method notifyStatusNotification (line 152) | static void notifyStatusNotification() {
    method cancelStatusNotification (line 178) | static void cancelStatusNotification() {
    method getModuleIntent (line 192) | private static PendingIntent getModuleIntent(String modulePackageName,...
    method getModuleScopeIntent (line 200) | private static PendingIntent getModuleScopeIntent(String modulePackage...
    method getNotificationIdKey (line 211) | private static String getNotificationIdKey(String channel, String modu...
    method pushAndGetNotificationId (line 215) | private static int pushAndGetNotificationId(String channel, String mod...
    method notifyModuleUpdated (line 224) | static void notifyModuleUpdated(String modulePackageName,
    method requestModuleScope (line 265) | static void requestModuleScope(String modulePackageName, int moduleUse...
    method cancelNotification (line 315) | static void cancelNotification(String channel, String modulePackageNam...

FILE: daemon/src/main/java/org/lsposed/lspd/service/LSPSystemServerService.java
  class LSPSystemServerService (line 33) | public class LSPSystemServerService extends ILSPSystemServerService.Stub...
    method systemServerRequested (line 39) | public boolean systemServerRequested() {
    method putBinderForSystemServer (line 43) | public void putBinderForSystemServer() {
    method LSPSystemServerService (line 48) | public LSPSystemServerService(int maxRetry, String serviceName) {
    method requestApplicationService (line 79) | @Override
    method onTransact (line 89) | @Override
    method linkToDeath (line 123) | public void linkToDeath() {
    method binderDied (line 131) | @Override
    method maybeRetryInject (line 139) | public void maybeRetryInject() {

FILE: daemon/src/main/java/org/lsposed/lspd/service/LSPosedService.java
  class LSPosedService (line 60) | public class LSPosedService extends ILSPosedService.Stub {
    method isModernModules (line 70) | private static boolean isModernModules(ApplicationInfo info) {
    method requestApplicationService (line 87) | @Override
    method dispatchPackageChanged (line 116) | private void dispatchPackageChanged(Intent intent) {
    method broadcastAndShowNotification (line 222) | private void broadcastAndShowNotification(String packageName, int user...
    method dispatchUserChanged (line 240) | private void dispatchUserChanged(Intent intent) {
    method dispatchBootCompleted (line 247) | private void dispatchBootCompleted(Intent intent) {
    method dispatchConfigurationChanged (line 257) | private void dispatchConfigurationChanged(Intent intent) {
    method dispatchSecretCodeReceive (line 268) | private void dispatchSecretCodeReceive(Intent i) {
    method dispatchOpenManager (line 272) | private void dispatchOpenManager(Intent intent) {
    method dispatchModuleScope (line 276) | private void dispatchModuleScope(Intent intent) {
    method registerReceiver (line 331) | private void registerReceiver(List<IntentFilter> filters, String requi...
    method registerReceiver (line 360) | private void registerReceiver(List<IntentFilter> filters, int userId, ...
    method registerPackageReceiver (line 365) | private void registerPackageReceiver() {
    method registerConfigurationReceiver (line 378) | private void registerConfigurationReceiver() {
    method registerSecretCodeReceiver (line 385) | private void registerSecretCodeReceiver() {
    method registerBootCompleteReceiver (line 402) | private void registerBootCompleteReceiver() {
    method registerUserChangeReceiver (line 409) | private void registerUserChangeReceiver() {
    method registerOpenManagerReceiver (line 418) | private void registerOpenManagerReceiver() {
    method registerModuleScopeReceiver (line 427) | private void registerModuleScopeReceiver() {
    method registerUidObserver (line 435) | private void registerUidObserver() {
    method dispatchSystemServerContext (line 468) | @Override
    method preStartManager (line 489) | @Override
    method setManagerEnabled (line 494) | @Override

FILE: daemon/src/main/java/org/lsposed/lspd/service/LogcatService.java
  class LogcatService (line 21) | public class LogcatService implements Runnable {
    class LogLRU (line 31) | static class LogLRU extends LinkedHashMap<File, Object> {
      method LogLRU (line 34) | public LogLRU() {
      method removeEldestEntry (line 38) | @Override
    method LogcatService (line 53) | @SuppressLint("UnsafeDynamicallyLoadedCode")
    method getprop (line 69) | private static void getprop() {
    method dmesg (line 85) | private static void dmesg() {
    method runLogcat (line 95) | private native void runLogcat();
    method run (line 97) | @Override
    method refreshFd (line 104) | @SuppressWarnings("unused")
    method checkFd (line 138) | private static void checkFd(int fd) {
    method isRunning (line 161) | public boolean isRunning() {
    method start (line 165) | public void start() {
    method startVerbose (line 177) | public void startVerbose() {
    method stopVerbose (line 181) | public void stopVerbose() {
    method enableWatchdog (line 185) | public void enableWatchdog() {
    method disableWatchdog (line 189) | public void disableWatchdog() {
    method refresh (line 193) | public void refresh(boolean isVerboseLog) {
    method fdToPath (line 201) | private static Path fdToPath(int fd) {
    method getVerboseLog (line 206) | public File getVerboseLog() {
    method getModulesLog (line 211) | public File getModulesLog() {
    method checkLogFile (line 216) | public void checkLogFile() {

FILE: daemon/src/main/java/org/lsposed/lspd/service/ObfuscationManager.java
  class ObfuscationManager (line 7) | public class ObfuscationManager {
    method obfuscateDex (line 9) | static native SharedMemory obfuscateDex(SharedMemory memory);
    method getSignatures (line 12) | static native HashMap<String, String> getSignatures();

FILE: daemon/src/main/java/org/lsposed/lspd/service/PackageService.java
  class PackageService (line 70) | public class PackageService {
    method isAlive (line 82) | static boolean isAlive() {
    method binderDied (line 88) | @Override
    method getPackageManager (line 97) | private static IPackageManager getPackageManager() {
    method getPackageInfo (line 111) | @Nullable
    method getPackageInfoFromAllUsers (line 121) | public static @NonNull
    method getApplicationInfo (line 133) | @Nullable
    method getInstalledPackagesFromAllUsers (line 144) | public static ParcelableListSlice<PackageInfo> getInstalledPackagesFro...
    method fetchProcesses (line 182) | private static Set<String> fetchProcesses(PackageInfo pkgInfo) {
    method fetchProcessesWithUid (line 200) | public static Pair<Set<String>, Integer> fetchProcessesWithUid(Applica...
    method isPackageAvailable (line 209) | public static boolean isPackageAvailable(String packageName, int userI...
    method getPackageInfoWithComponents (line 213) | @SuppressWarnings({"ConstantConditions", "SameParameterValue"})
    class IntentSenderAdaptor (line 250) | static abstract class IntentSenderAdaptor extends IIntentSender.Stub {
      method send (line 251) | public abstract void send(Intent intent);
      method send (line 253) | @Override
      method send (line 259) | @Override
      method getIntentSender (line 264) | public IntentSender getIntentSender() throws IllegalAccessException,...
    method uninstallPackage (line 272) | public static boolean uninstallPackage(VersionedPackage versionedPacka...
    method installExistingPackageAsUser (line 289) | public static int installExistingPackageAsUser(String packageName, int...
    method queryIntentActivities (line 300) | @Nullable
    method getLaunchIntentForPackage (line 318) | @Nullable
    method clearApplicationProfileData (line 343) | public static void clearApplicationProfileData(String packageName) thr...
    method performDexOptMode (line 349) | public static boolean performDexOptMode(String packageName) throws Rem...

FILE: daemon/src/main/java/org/lsposed/lspd/service/PowerService.java
  class PowerService (line 31) | public class PowerService {
    method binderDied (line 35) | @Override
    method getPowerManager (line 44) | private static IPowerManager getPowerManager() {
    method reboot (line 58) | public static void reboot(boolean confirm, String reason, boolean wait...

FILE: daemon/src/main/java/org/lsposed/lspd/service/ServiceManager.java
  class ServiceManager (line 58) | public class ServiceManager {
    method getDex2OatService (line 74) | @RequiresApi(Build.VERSION_CODES.Q)
    method getExecutorService (line 79) | public static ExecutorService getExecutorService() {
    method waitSystemService (line 83) | private static void waitSystemService(String name) {
    method getSystemServiceManager (line 95) | public static IServiceManager getSystemServiceManager() {
    method start (line 100) | public static void start(String[] args) {
    method getApplicationService (line 200) | public static LSPApplicationService getApplicationService() {
    method requestApplicationService (line 204) | public static LSPApplicationService requestApplicationService(int uid,...
    method getManagerService (line 210) | public static LSPManagerService getManagerService() {
    method getLogcatService (line 214) | public static LogcatService getLogcatService() {
    method systemServerRequested (line 218) | public static boolean systemServerRequested() {
    method toGlobalNamespace (line 222) | public static File toGlobalNamespace(File file) {
    method toGlobalNamespace (line 226) | public static File toGlobalNamespace(String path) {
    method existsInGlobalNamespace (line 232) | public static boolean existsInGlobalNamespace(File file) {
    method existsInGlobalNamespace (line 236) | public static boolean existsInGlobalNamespace(String path) {
    method permissionManagerWorkaround (line 240) | private static void permissionManagerWorkaround() {
    method notificationWorkaround (line 253) | private static void notificationWorkaround() {
    class BinderProxy (line 276) | private static class BinderProxy extends Binder {
      method BinderProxy (line 290) | BinderProxy(String name) {
      method onTransact (line 294) | @Override

FILE: daemon/src/main/java/org/lsposed/lspd/service/UserService.java
  class UserService (line 38) | public class UserService {
    method binderDied (line 42) | @Override
    method isAlive (line 51) | static boolean isAlive() {
    method getUserManager (line 56) | public static IUserManager getUserManager() {
    method getUsers (line 70) | public static List<UserInfo> getUsers() throws RemoteException {
    method getUserInfo (line 95) | public static UserInfo getUserInfo(int userId) throws RemoteException {
    method getUserName (line 101) | public static String getUserName(int userId) {
    method getProfileParent (line 110) | public static int getProfileParent(int userId) throws RemoteException {
    method isUserUnlocked (line 118) | public static boolean isUserUnlocked(int userId) throws RemoteException {

FILE: daemon/src/main/java/org/lsposed/lspd/util/FakeContext.java
  class FakeContext (line 21) | public class FakeContext extends ContextWrapper {
    method FakeContext (line 28) | public FakeContext() {
    method FakeContext (line 32) | public FakeContext(String packageName) {
    method getPackageName (line 37) | @Override
    method getResources (line 42) | @Override
    method getOpPackageName (line 47) | @Override
    method getApplicationInfo (line 52) | @Override
    method getContentResolver (line 63) | @Override
    method getUserId (line 72) | public int getUserId() {
    method getUser (line 76) | public UserHandle getUser() {
    method getTheme (line 80) | @Override
    method getAttributionTag (line 86) | @Nullable
    method createPackageContext (line 92) | @Override

FILE: daemon/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java
  class InstallerVerifier (line 11) | public class InstallerVerifier {
    method verifyInstallerSignature (line 13) | public static void verifyInstallerSignature(String path) throws IOExce...

FILE: daemon/src/main/jni/dex2oat.cpp
  function JNIEXPORT (line 31) | JNIEXPORT void JNICALL Java_org_lsposed_lspd_service_Dex2OatService_doMo...
  function setsockcreatecon_raw (line 84) | static int setsockcreatecon_raw(const char *context) {
  function JNIEXPORT (line 102) | JNIEXPORT jboolean JNICALL
  function JNIEXPORT (line 111) | JNIEXPORT jstring JNICALL

FILE: daemon/src/main/jni/logcat.cpp
  function ParseUint (line 33) | long ParseUint(const char *s) {
  function GetByteProp (line 64) | inline long GetByteProp(std::string_view prop, long def = -1) {
  function GetStrProp (line 70) | inline std::string GetStrProp(std::string_view prop, std::string def = {...
  function SetIntProp (line 76) | inline bool SetIntProp(std::string_view prop, int val) {
  function SetStrProp (line 81) | inline bool SetStrProp(std::string_view prop, std::string_view val) {
  class UniqueFile (line 87) | class UniqueFile : public std::unique_ptr<FILE, std::function<void(FILE ...
    method UniqueFile (line 91) | explicit UniqueFile(FILE *f) : std::unique_ptr<FILE, std::function<voi...
    method UniqueFile (line 93) | UniqueFile(int fd, const char *mode) : UniqueFile(fd > 0 ? fdopen(fd, ...
    method UniqueFile (line 95) | UniqueFile() : UniqueFile(stdout) {}
  class Logcat (line 98) | class Logcat {
    method Logcat (line 100) | explicit Logcat(JNIEnv *env, jobject thiz, jmethodID method)
    type log_msg (line 112) | struct log_msg
  type tm (line 139) | struct tm
  type log_msg (line 215) | struct log_msg
  type log_msg (line 344) | struct log_msg
  function JNIEXPORT (line 362) | JNIEXPORT void JNICALL

FILE: daemon/src/main/jni/logcat.h
  type AndroidLogEntry (line 16) | typedef struct AndroidLogEntry_t {
  type logger_entry (line 29) | struct logger_entry {
  type log_msg (line 40) | struct log_msg {
  function log_id_t (line 46) | log_id_t id() {
  type logger (line 51) | struct logger
  type logger_list (line 52) | struct logger_list
  type logger (line 54) | struct logger
  type logger (line 55) | struct logger
  type logger_list (line 56) | struct logger_list
  type logger_list (line 57) | struct logger_list
  type logger_list (line 58) | struct logger_list
  type log_msg (line 58) | struct log_msg
  type logger (line 59) | struct logger
  type logger_list (line 59) | struct logger_list
  type logger_entry (line 60) | struct logger_entry

FILE: daemon/src/main/jni/obfuscation.cpp
  function to_java (line 43) | static std::string to_java(const std::string &signature) {
  function ensureInitialized (line 49) | static void ensureInitialized(JNIEnv *env) {
  function jobject (line 122) | static jobject stringMapToJavaHashMap(JNIEnv *env, const std::map<std::s...
  function JNIEXPORT (line 148) | JNIEXPORT jobject JNICALL Java_org_lsposed_lspd_service_ObfuscationManag...
  function obfuscateDexBuffer (line 167) | static int obfuscateDexBuffer(const void *dex_data, size_t size) {
  function JNIEXPORT (line 194) | JNIEXPORT jobject JNICALL Java_org_lsposed_lspd_service_ObfuscationManag...

FILE: daemon/src/main/jni/obfuscation.h
  function class (line 12) | class DexAllocator : public dex::Writer::Allocator {

FILE: dex2oat/src/main/cpp/dex2oat.cpp
  function get_id_vec (line 33) | inline int get_id_vec(bool is64, bool is_debug) {
  function xrecvmsg (line 40) | ssize_t xrecvmsg(int sockfd, struct msghdr *msg, int flags) {
  type iovec (line 54) | struct iovec
  type msghdr (line 58) | struct msghdr
  type cmsghdr (line 68) | struct cmsghdr
  function recv_fd (line 82) | int recv_fd(int sockfd) {
  function read_int (line 95) | int read_int(int fd) {
  function write_int (line 104) | void write_int(int fd, int val) {
  function main (line 111) | int main(int argc, char **argv) {

FILE: dex2oat/src/main/cpp/include/oat.h
  function namespace (line 28) | namespace art {

FILE: dex2oat/src/main/cpp/oat_hook.cpp
  function process_cmd (line 32) | std::string process_cmd(std::string_view sv, std::string_view new_cmd_pa...
  function IsNonDeterministic (line 88) | bool IsNonDeterministic(const std::string_view& key) {
  function SpoofKeyValueStore (line 99) | bool SpoofKeyValueStore(uint8_t* store) {
  function DCL_HOOK_FUNC (line 179) | DCL_HOOK_FUNC(uint8_t*, _ZNK3art9OatHeader16GetKeyValueStoreEv, void* he...
  function DCL_HOOK_FUNC (line 188) | DCL_HOOK_FUNC(void, _ZNK3art9OatHeader15ComputeChecksumEPj, void* header...
  function register_hook (line 201) | void register_hook(dev_t dev, ino_t inode, const char* symbol, void* new...
  function initialize (line 213) | __attribute__((constructor)) static void initialize() {

FILE: external/apache/local/MemberUtilsX.java
  class MemberUtilsX (line 23) | public class MemberUtilsX {
    method compareConstructorFit (line 24) | public static int compareConstructorFit(final Constructor<?> left, fin...
    method compareMethodFit (line 28) | public static int compareMethodFit(final Method left, final Method rig...

FILE: hiddenapi/bridge/src/main/java/hidden/ByteBufferDexClassLoader.java
  class ByteBufferDexClassLoader (line 7) | public class ByteBufferDexClassLoader extends BaseDexClassLoader {
    method ByteBufferDexClassLoader (line 9) | public ByteBufferDexClassLoader(ByteBuffer[] dexFiles, ClassLoader par...
    method ByteBufferDexClassLoader (line 13) | public ByteBufferDexClassLoader(ByteBuffer[] dexFiles, String libraryS...
    method getLdLibraryPath (line 17) | public String getLdLibraryPath() {

FILE: hiddenapi/bridge/src/main/java/hidden/HiddenApiBridge.java
  class HiddenApiBridge (line 49) | public class HiddenApiBridge {
    method AssetManager_addAssetPath (line 50) | public static int AssetManager_addAssetPath(AssetManager am, String pa...
    method Binder_allowBlocking (line 54) | public static IBinder Binder_allowBlocking(IBinder binder) {
    method Resources_setImpl (line 58) | public static void Resources_setImpl(Resources resources, ResourcesImp...
    method PackageInstaller_SessionParams_installFlags (line 62) | public static int PackageInstaller_SessionParams_installFlags(PackageI...
    method PackageInstaller_SessionParams_installFlags (line 66) | public static void PackageInstaller_SessionParams_installFlags(Package...
    method Context_getActivityToken (line 70) | public static IBinder Context_getActivityToken(Context ctx) {
    method Environment_getDataProfilesDePackageDirectory (line 74) | public static File Environment_getDataProfilesDePackageDirectory(int u...
    method Context_registerReceiverAsUser (line 78) | public static Intent Context_registerReceiverAsUser(Context ctx, Broad...
    method UserHandle_ALL (line 84) | public static UserHandle UserHandle_ALL() {
    method UserHandle (line 88) | public static UserHandle UserHandle(int h) {
    method ApplicationInfo_credentialProtectedDataDir (line 92) | public static String ApplicationInfo_credentialProtectedDataDir(Applic...
    method ApplicationInfo_credentialProtectedDataDir (line 96) | public static void ApplicationInfo_credentialProtectedDataDir(Applicat...
    method ApplicationInfo_resourceDirs (line 100) | public static String[] ApplicationInfo_resourceDirs(ApplicationInfo ap...
    method ApplicationInfo_resourceDirs (line 104) | public static void ApplicationInfo_resourceDirs(ApplicationInfo applic...
    method ApplicationInfo_overlayPaths (line 108) | @RequiresApi(31)
    method ApplicationInfo_overlayPaths (line 113) | @RequiresApi(31)
    method Resources_getCompatibilityInfo (line 118) | public static CompatibilityInfo Resources_getCompatibilityInfo(Resourc...
    method Os_ioctlInt (line 122) | public static int Os_ioctlInt(FileDescriptor fd, int cmd, int arg) thr...
    method ActivityManager_UID_OBSERVER_GONE (line 132) | public static int ActivityManager_UID_OBSERVER_GONE() {
    method ActivityManager_UID_OBSERVER_ACTIVE (line 136) | public static int ActivityManager_UID_OBSERVER_ACTIVE() {
    method ActivityManager_UID_OBSERVER_IDLE (line 140) | public static int ActivityManager_UID_OBSERVER_IDLE() {
    method ActivityManager_UID_OBSERVER_CACHED (line 144) | public static int ActivityManager_UID_OBSERVER_CACHED() {
    method ActivityManager_PROCESS_STATE_UNKNOWN (line 148) | public static int ActivityManager_PROCESS_STATE_UNKNOWN() {

FILE: hiddenapi/stubs/src/main/java/android/app/ActivityManager.java
  class ActivityManager (line 3) | public class ActivityManager {

FILE: hiddenapi/stubs/src/main/java/android/app/ActivityThread.java
  class ActivityThread (line 9) | public final class ActivityThread {
    method currentActivityThread (line 10) | public static ActivityThread currentActivityThread() {
    method getApplicationThread (line 14) | public ApplicationThread getApplicationThread() {
    method currentApplication (line 19) | public static Application currentApplication() {
    method currentPackageName (line 23) | public static String currentPackageName() {
    method getPackageInfoNoCheck (line 27) | public final LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, Compa...
    method currentProcessName (line 31) | public static String currentProcessName() {
    method getSystemContext (line 35) | public ContextImpl getSystemContext() {
    method systemMain (line 39) | public static ActivityThread systemMain() {
    class ApplicationThread (line 43) | private class ApplicationThread extends IApplicationThread.Stub {
      method asBinder (line 44) | @Override
    class ActivityClientRecord (line 50) | public static final class ActivityClientRecord {

FILE: hiddenapi/stubs/src/main/java/android/app/Application.java
  class Application (line 3) | public class Application {

FILE: hiddenapi/stubs/src/main/java/android/app/ContentProviderHolder.java
  class ContentProviderHolder (line 5) | public class ContentProviderHolder {

FILE: hiddenapi/stubs/src/main/java/android/app/ContextImpl.java
  class ContextImpl (line 5) | public class ContextImpl extends Context {

FILE: hiddenapi/stubs/src/main/java/android/app/IActivityController.java
  type IActivityController (line 9) | public interface IActivityController extends IInterface {
    method activityStarting (line 14) | boolean activityStarting(Intent intent, String pkg);
    method activityResuming (line 20) | boolean activityResuming(String pkg);
    method appCrashed (line 27) | boolean appCrashed(String processName, int pid,
    method appEarlyNotResponding (line 34) | int appEarlyNotResponding(String processName, int pid, String annotati...
    method appNotResponding (line 41) | int appNotResponding(String processName, int pid, String processStats);
    method systemNotResponding (line 48) | int systemNotResponding(String msg);
    method moveTaskToFront (line 53) | boolean moveTaskToFront(String pkg, int task, int flags, Bundle options);
    class Stub (line 55) | abstract class Stub extends Binder implements IActivityController {
      method asInterface (line 57) | public static IActivityController asInterface(IBinder obj) {
      method asBinder (line 61) | @Override

FILE: hiddenapi/stubs/src/main/java/android/app/IActivityManager.java
  type IActivityManager (line 35) | public interface IActivityManager extends IInterface {
    method broadcastIntentWithFeature (line 36) | @RequiresApi(31)
    method broadcastIntentWithFeature (line 44) | @RequiresApi(31)
    method broadcastIntentWithFeature (line 52) | @RequiresApi(30)
    method broadcastIntent (line 58) | int broadcastIntent(IApplicationThread caller, Intent intent,
    method startActivity (line 63) | int startActivity(IApplicationThread caller, String callingPackage, In...
    method startActivityWithFeature (line 67) | @RequiresApi(30)
    method startActivityAsUser (line 73) | int startActivityAsUser(IApplicationThread caller, String callingPackage,
    method startActivityAsUserWithFeature (line 78) | @RequiresApi(30)
    method forceStopPackage (line 84) | void forceStopPackage(String packageName, int userId) throws RemoteExc...
    method startUserInBackground (line 86) | boolean startUserInBackground(int userid) throws RemoteException;
    method registerReceiver (line 88) | Intent registerReceiver(IApplicationThread caller, String callerPackage,
    method finishReceiver (line 92) | void finishReceiver(IBinder caller, int resultCode, String resultData,
    method registerReceiverWithFeature (line 95) | @RequiresApi(30)
    method registerReceiverWithFeature (line 100) | @RequiresApi(31)
    method bindService (line 105) | int bindService(IApplicationThread caller, IBinder token, Intent service,
    method bindService (line 109) | @RequiresApi(34)
    method unbindService (line 114) | boolean unbindService(IServiceConnection connection) throws RemoteExce...
    method switchUser (line 116) | boolean switchUser(int userid) throws RemoteException;
    method getCurrentUser (line 118) | UserInfo getCurrentUser() throws RemoteException;
    method setActivityController (line 120) | void setActivityController(IActivityController watcher, boolean imAMon...
    method getContentProviderExternal (line 122) | @RequiresApi(29)
    method getContentProviderExternal (line 125) | ContentProviderHolder getContentProviderExternal(String name, int user...
    method getConfiguration (line 127) | Configuration getConfiguration() throws RemoteException;
    method registerUidObserver (line 129) | void registerUidObserver(IUidObserver observer, int which, int cutpoin...
    class Stub (line 131) | abstract class Stub extends Binder implements IActivityManager {
      method asInterface (line 134) | public static IActivityManager asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/app/IApplicationThread.java
  type IApplicationThread (line 26) | public interface IApplicationThread extends IInterface {
    class Stub (line 27) | abstract class Stub extends Binder implements IApplicationThread {
      method asInterface (line 28) | public static IApplicationThread asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/app/INotificationManager.java
  type INotificationManager (line 11) | public interface INotificationManager extends IInterface {
    method enqueueNotificationWithTag (line 12) | void enqueueNotificationWithTag(String pkg, String opPkg, String tag, ...
    method cancelNotificationWithTag (line 15) | void cancelNotificationWithTag(String pkg, String tag, int id, int use...
    method cancelNotificationWithTag (line 17) | @RequiresApi(30)
    method createNotificationChannelsForPackage (line 20) | void createNotificationChannelsForPackage(String pkg, int uid, Parcele...
    method updateNotificationChannelForPackage (line 22) | void updateNotificationChannelForPackage(String pkg, int uid, Notifica...
    method getNotificationChannelForPackage (line 24) | @RequiresApi(30)
    method getNotificationChannelForPackage (line 27) | NotificationChannel getNotificationChannelForPackage(String pkg, int u...
    class Stub (line 29) | abstract class Stub extends Binder implements INotificationManager {
      method asInterface (line 30) | public static INotificationManager asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/app/IServiceConnection.java
  type IServiceConnection (line 8) | public interface IServiceConnection extends IInterface {
    method connected (line 9) | void connected(ComponentName name, IBinder service, boolean dead);
    class Stub (line 11) | abstract class Stub extends Binder implements IServiceConnection {
      method asInterface (line 13) | public static IServiceConnection asInterface(IBinder obj) {
      method asBinder (line 17) | @Override

FILE: hiddenapi/stubs/src/main/java/android/app/IUidObserver.java
  type IUidObserver (line 5) | public interface IUidObserver {
    method onUidGone (line 7) | void onUidGone(int uid, boolean disabled);
    method onUidActive (line 9) | void onUidActive(int uid);
    method onUidIdle (line 11) | void onUidIdle(int uid, boolean disabled);
    method onUidCachedChanged (line 13) | void onUidCachedChanged(int uid, boolean cached);
    class Stub (line 15) | abstract class Stub extends Binder implements IUidObserver {

FILE: hiddenapi/stubs/src/main/java/android/app/LoadedApk.java
  class LoadedApk (line 5) | public final class LoadedApk {
    method getApplicationInfo (line 8) | public ApplicationInfo getApplicationInfo() {
    method getClassLoader (line 12) | public ClassLoader getClassLoader() {
    method getPackageName (line 16) | public String getPackageName() {
    method getResDir (line 20) | public String getResDir() {

FILE: hiddenapi/stubs/src/main/java/android/app/Notification.java
  class Notification (line 3) | public class Notification {

FILE: hiddenapi/stubs/src/main/java/android/app/NotificationChannel.java
  class NotificationChannel (line 3) | public class NotificationChannel {

FILE: hiddenapi/stubs/src/main/java/android/app/ProfilerInfo.java
  class ProfilerInfo (line 22) | public class ProfilerInfo {

FILE: hiddenapi/stubs/src/main/java/android/app/ResourcesManager.java
  class ResourcesManager (line 3) | public class ResourcesManager {

FILE: hiddenapi/stubs/src/main/java/android/content/AttributionSource.java
  class AttributionSource (line 3) | public class AttributionSource {

FILE: hiddenapi/stubs/src/main/java/android/content/BroadcastReceiver.java
  class BroadcastReceiver (line 3) | public abstract class BroadcastReceiver {
    method onReceive (line 4) | public abstract void onReceive(Context context, Intent intent);

FILE: hiddenapi/stubs/src/main/java/android/content/ComponentName.java
  class ComponentName (line 3) | public final class ComponentName {

FILE: hiddenapi/stubs/src/main/java/android/content/Context.java
  class Context (line 7) | public class Context {
    method getActivityToken (line 8) | public IBinder getActivityToken() {
    method registerReceiverAsUser (line 11) | public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserH...

FILE: hiddenapi/stubs/src/main/java/android/content/IContentProvider.java
  type IContentProvider (line 9) | public interface IContentProvider extends IInterface {
    method call (line 10) | Bundle call(String callingPkg, String method,
    method call (line 13) | @RequiresApi(29)
    method call (line 17) | @RequiresApi(30)
    method call (line 21) | @RequiresApi(31)

FILE: hiddenapi/stubs/src/main/java/android/content/IIntentReceiver.java
  type IIntentReceiver (line 27) | public interface IIntentReceiver extends IInterface {
    method performReceive (line 28) | void performReceive(Intent intent, int resultCode, String data,
    class Stub (line 30) | abstract class Stub extends Binder implements IIntentReceiver {
      method asInterface (line 31) | public static IIntentReceiver asInterface(IBinder obj) {
      method asBinder (line 35) | @Override

FILE: hiddenapi/stubs/src/main/java/android/content/IIntentSender.java
  type IIntentSender (line 10) | public interface IIntentSender extends IInterface {
    method send (line 12) | int send(int code, Intent intent, String resolvedType,
    method send (line 15) | @RequiresApi(26)
    class Stub (line 19) | abstract class Stub extends Binder implements IIntentSender {
      method Stub (line 21) | public Stub() {
      method asBinder (line 25) | @Override
      method asInterface (line 30) | public static IIntentSender asInterface(IBinder binder) {

FILE: hiddenapi/stubs/src/main/java/android/content/Intent.java
  class Intent (line 22) | public class Intent {

FILE: hiddenapi/stubs/src/main/java/android/content/IntentFilter.java
  class IntentFilter (line 3) | public class IntentFilter {

FILE: hiddenapi/stubs/src/main/java/android/content/IntentSender.java
  class IntentSender (line 3) | public class IntentSender {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/ApplicationInfo.java
  class ApplicationInfo (line 5) | public class ApplicationInfo {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/BaseParceledListSlice.java
  class BaseParceledListSlice (line 5) | abstract class BaseParceledListSlice<T> {
    method getList (line 7) | public List<T> getList() {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/IPackageInstaller.java
  type IPackageInstaller (line 7) | public interface IPackageInstaller extends IInterface {
    method uninstall (line 9) | void uninstall(android.content.pm.VersionedPackage versionedPackage, j...
    class Stub (line 11) | abstract class Stub extends Binder implements IPackageInstaller {
      method asInterface (line 12) | public static IPackageInstaller asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/IPackageManager.java
  type IPackageManager (line 13) | public interface IPackageManager extends IInterface {
    method isPackageAvailable (line 15) | boolean isPackageAvailable(String packageName, int userId) throws Remo...
    method getApplicationHiddenSettingAsUser (line 17) | boolean getApplicationHiddenSettingAsUser(String packageName, int user...
    method getApplicationInfo (line 19) | ApplicationInfo getApplicationInfo(String packageName, int flags, int ...
    method getApplicationInfo (line 22) | @RequiresApi(33)
    method getPackageInfo (line 26) | PackageInfo getPackageInfo(String packageName, int flags, int userId)
    method getPackageInfo (line 29) | @RequiresApi(33)
    method getPackageUid (line 33) | int getPackageUid(String packageName, int flags, int userId) throws Re...
    method getPackageUid (line 35) | @RequiresApi(33)
    method getPackagesForUid (line 38) | String[] getPackagesForUid(int uid)
    method getInstalledPackages (line 41) | ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int use...
    method getInstalledPackages (line 44) | @RequiresApi(33)
    method getInstalledApplications (line 48) | ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags,...
    method getInstalledApplications (line 51) | @RequiresApi(33)
    method getUidForSharedUser (line 55) | int getUidForSharedUser(String sharedUserName)
    method grantRuntimePermission (line 58) | void grantRuntimePermission(String packageName, String permissionName,...
    method revokeRuntimePermission (line 61) | void revokeRuntimePermission(String packageName, String permissionName...
    method getPermissionFlags (line 64) | int getPermissionFlags(String permissionName, String packageName, int ...
    method updatePermissionFlags (line 67) | void updatePermissionFlags(String permissionName, String packageName, ...
    method checkPermission (line 70) | int checkPermission(String permName, String pkgName, int userId)
    method checkUidPermission (line 73) | int checkUidPermission(String permName, int uid)
    method getPackageInstaller (line 76) | IPackageInstaller getPackageInstaller() throws RemoteException;
    method installExistingPackageAsUser (line 78) | int installExistingPackageAsUser(String packageName, int userId, int i...
    method installExistingPackageAsUser (line 81) | @RequiresApi(29)
    method queryIntentActivities (line 85) | ParceledListSlice<ResolveInfo> queryIntentActivities(Intent intent,
    method queryIntentActivities (line 88) | @RequiresApi(33)
    method performDexOptMode (line 92) | boolean performDexOptMode(String packageName, boolean checkProfiles,
    method clearApplicationProfileData (line 96) | void clearApplicationProfileData(String packageName) throws RemoteExce...
    class Stub (line 98) | abstract class Stub extends Binder implements IPackageManager {
      method asInterface (line 100) | public static IPackageManager asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/PackageInfo.java
  class PackageInfo (line 3) | public class PackageInfo {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/PackageInstaller.java
  class PackageInstaller (line 3) | public class PackageInstaller {
    class SessionParams (line 4) | public static class SessionParams {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/PackageManager.java
  class PackageManager (line 5) | public class PackageManager {
    method getInstalledPackagesAsUser (line 6) | public List<PackageInfo> getInstalledPackagesAsUser(int flags, int use...

FILE: hiddenapi/stubs/src/main/java/android/content/pm/PackageParser.java
  class PackageParser (line 5) | public class PackageParser {
    class PackageLite (line 6) | public static class PackageLite {
    class Package (line 10) | public final static class Package {
    method parsePackageLite (line 15) | public static PackageLite parsePackageLite(String packageFile, int fla...
    method parsePackageLite (line 20) | public static PackageLite parsePackageLite(File packageFile, int flags...
    method parsePackage (line 24) | public Package parsePackage(File packageFile, int flags, boolean useCa...
    class PackageParserException (line 30) | public static class PackageParserException extends Exception {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/ParceledListSlice.java
  class ParceledListSlice (line 5) | public class ParceledListSlice<T> extends BaseParceledListSlice<T> {
    method ParceledListSlice (line 6) | public ParceledListSlice(List<T> list) {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/ResolveInfo.java
  class ResolveInfo (line 3) | public class ResolveInfo {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/UserInfo.java
  class UserInfo (line 3) | public class UserInfo {

FILE: hiddenapi/stubs/src/main/java/android/content/pm/VersionedPackage.java
  class VersionedPackage (line 3) | public class VersionedPackage {

FILE: hiddenapi/stubs/src/main/java/android/content/res/AssetManager.java
  class AssetManager (line 6) | public final class AssetManager {
    method addAssetPath (line 7) | public final int addAssetPath(String path) {
    method close (line 11) | public void close() {
    method open (line 15) | public final InputStream open(String fileName) throws IOException {

FILE: hiddenapi/stubs/src/main/java/android/content/res/CompatibilityInfo.java
  class CompatibilityInfo (line 3) | public class CompatibilityInfo {

FILE: hiddenapi/stubs/src/main/java/android/content/res/Configuration.java
  class Configuration (line 3) | public class Configuration {

FILE: hiddenapi/stubs/src/main/java/android/content/res/Resources.java
  class Resources (line 5) | public class Resources {
    method Resources (line 6) | public Resources(AssetManager assets, DisplayMetrics metrics, Configur...
    method Resources (line 10) | public Resources(ClassLoader classLoader) {
    method setImpl (line 14) | public void setImpl(ResourcesImpl impl) {
    method getCompatibilityInfo (line 18) | public CompatibilityInfo getCompatibilityInfo() {

FILE: hiddenapi/stubs/src/main/java/android/content/res/ResourcesImpl.java
  class ResourcesImpl (line 3) | public class ResourcesImpl {

FILE: hiddenapi/stubs/src/main/java/android/content/res/ResourcesKey.java
  class ResourcesKey (line 3) | public class ResourcesKey {

FILE: hiddenapi/stubs/src/main/java/android/content/res/TypedArray.java
  class TypedArray (line 3) | public class TypedArray {
    method TypedArray (line 4) | protected TypedArray(Resources resources) {

FILE: hiddenapi/stubs/src/main/java/android/ddm/DdmHandleAppName.java
  class DdmHandleAppName (line 3) | public class DdmHandleAppName {
    method setAppName (line 4) | public static void setAppName(String name, int userId) {

FILE: hiddenapi/stubs/src/main/java/android/graphics/Movie.java
  class Movie (line 3) | public class Movie {

FILE: hiddenapi/stubs/src/main/java/android/graphics/drawable/Drawable.java
  class Drawable (line 3) | public class Drawable {

FILE: hiddenapi/stubs/src/main/java/android/os/Binder.java
  class Binder (line 8) | public class Binder implements IBinder {
    method transact (line 10) | @Override
    method getInterfaceDescriptor (line 15) | @Override
    method pingBinder (line 20) | public boolean pingBinder() {
    method isBinderAlive (line 24) | @Override
    method queryLocalInterface (line 29) | @Override
    method dump (line 34) | @Override
    method dumpAsync (line 39) | @Override
    method linkToDeath (line 44) | @Override
    method unlinkToDeath (line 49) | @Override
    method onTransact (line 54) | protected boolean onTransact(int code, @NonNull Parcel data, @Nullable...
    method allowBlocking (line 59) | public static IBinder allowBlocking(IBinder binder){

FILE: hiddenapi/stubs/src/main/java/android/os/Build.java
  class Build (line 3) | public class Build {
    class VERSION (line 4) | public static class VERSION {
    class VERSION_CODES (line 8) | public static class VERSION_CODES {

FILE: hiddenapi/stubs/src/main/java/android/os/Bundle.java
  class Bundle (line 22) | public class Bundle {

FILE: hiddenapi/stubs/src/main/java/android/os/Environment.java
  class Environment (line 5) | public class Environment {
    method getDataProfilesDePackageDirectory (line 6) | public static File getDataProfilesDePackageDirectory(int userId, Strin...

FILE: hiddenapi/stubs/src/main/java/android/os/Handler.java
  class Handler (line 3) | public class Handler {

FILE: hiddenapi/stubs/src/main/java/android/os/IBinder.java
  type IBinder (line 8) | public interface IBinder {
    method transact (line 10) | boolean transact(int code, @NonNull Parcel data, @Nullable Parcel repl...
    method getInterfaceDescriptor (line 12) | @Nullable
    method pingBinder (line 15) | boolean pingBinder();
    method isBinderAlive (line 17) | boolean isBinderAlive();
    method queryLocalInterface (line 19) | @Nullable
    method dump (line 22) | void dump(@NonNull FileDescriptor fd, @Nullable String[] args);
    method dumpAsync (line 24) | void dumpAsync(@NonNull FileDescriptor fd, @Nullable String[] args);
    method linkToDeath (line 26) | void linkToDeath(@NonNull DeathRecipient recipient, int flags);
    method unlinkToDeath (line 28) | boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags);
    type DeathRecipient (line 30) | interface DeathRecipient {
      method binderDied (line 31) | void binderDied();

FILE: hiddenapi/stubs/src/main/java/android/os/IInterface.java
  type IInterface (line 3) | public interface IInterface {
    method asBinder (line 5) | IBinder asBinder();

FILE: hiddenapi/stubs/src/main/java/android/os/IPowerManager.java
  type IPowerManager (line 3) | public interface IPowerManager extends IInterface {
    method reboot (line 4) | void reboot(boolean confirm, String reason, boolean wait) throws Remot...
    class Stub (line 6) | abstract class Stub extends Binder implements IPowerManager {
      method asInterface (line 8) | public static IPowerManager asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/os/IServiceCallback.java
  type IServiceCallback (line 2) | public interface IServiceCallback extends IInterface
    class Stub (line 4) | public static abstract class Stub extends android.os.Binder implements...
    method onRegistration (line 12) | public void onRegistration(java.lang.String name, android.os.IBinder b...

FILE: hiddenapi/stubs/src/main/java/android/os/IServiceManager.java
  type IServiceManager (line 3) | public interface IServiceManager extends IInterface {
    method tryUnregisterService (line 5) | void tryUnregisterService(java.lang.String name, android.os.IBinder se...
    method getService (line 7) | IBinder getService(String name);
    method registerForNotifications (line 9) | public void registerForNotifications(String name, IServiceCallback cb);
    class Stub (line 11) | abstract class Stub extends Binder implements IServiceManager {
      method asInterface (line 12) | public static IServiceManager asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/os/IUserManager.java
  type IUserManager (line 9) | public interface IUserManager extends IInterface {
    method isUserUnlocked (line 10) | @RequiresApi(26)
    method getUsers (line 14) | List<UserInfo> getUsers(boolean excludeDying)
    method getUsers (line 17) | List<UserInfo> getUsers(boolean excludePartial, boolean excludeDying, ...
    method getUserInfo (line 20) | UserInfo getUserInfo(int userHandle) throws RemoteException;
    method getProfileParent (line 22) | UserInfo getProfileParent(int userId) throws RemoteException;
    method isUserUnlockingOrUnlocked (line 24) | boolean isUserUnlockingOrUnlocked(int userId) throws RemoteException;
    class Stub (line 26) | abstract class Stub extends Binder implements IUserManager {
      method asInterface (line 28) | public static IUserManager asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/os/Parcel.java
  class Parcel (line 3) | public class Parcel {

FILE: hiddenapi/stubs/src/main/java/android/os/Parcelable.java
  type Parcelable (line 3) | public interface Parcelable {
    type Creator (line 4) | interface Creator<T>{
      method createFromParcel (line 5) | public T createFromParcel(Parcel source);
      method newArray (line 6) | public T[] newArray(int size);
    method writeToParcel (line 8) | void writeToParcel(Parcel dest, int flags);
    method describeContents (line 9) | int describeContents();

FILE: hiddenapi/stubs/src/main/java/android/os/PersistableBundle.java
  class PersistableBundle (line 3) | public class PersistableBundle {

FILE: hiddenapi/stubs/src/main/java/android/os/RemoteException.java
  class RemoteException (line 3) | public class RemoteException extends Exception {
    method RemoteException (line 5) | public RemoteException(String message) {

FILE: hiddenapi/stubs/src/main/java/android/os/ResultReceiver.java
  class ResultReceiver (line 3) | public class ResultReceiver {

FILE: hiddenapi/stubs/src/main/java/android/os/SELinux.java
  class SELinux (line 3) | public class SELinux {
    method checkSELinuxAccess (line 4) | public static boolean checkSELinuxAccess(String scon, String tcon, Str...
    method setFileContext (line 8) | public static boolean setFileContext(String path, String context) {
    method getFileContext (line 12) | public static String getFileContext(String path) {
    method setFSCreateContext (line 16) | public static boolean setFSCreateContext(String context){

FILE: hiddenapi/stubs/src/main/java/android/os/ServiceManager.java
  class ServiceManager (line 5) | public class ServiceManager {
    method getService (line 13) | @Nullable
    method addService (line 25) | public static void addService(String name, IBinder service) {

FILE: hiddenapi/stubs/src/main/java/android/os/ShellCallback.java
  class ShellCallback (line 3) | public class ShellCallback implements Parcelable {
    method createFromParcel (line 5) | @Override
    method newArray (line 10) | @Override
    method writeToParcel (line 16) | @Override
    method describeContents (line 21) | @Override

FILE: hiddenapi/stubs/src/main/java/android/os/ShellCommand.java
  class ShellCommand (line 7) | public abstract class ShellCommand {
    method exec (line 8) | public int exec(Binder target, FileDescriptor in, FileDescriptor out, ...
    method onCommand (line 13) | public abstract int onCommand(String cmd);
    method onHelp (line 14) | public abstract void onHelp();
    method getNextOption (line 16) | public String getNextOption(){
    method getNextArgRequired (line 20) | public String getNextArgRequired() {
    method getErrPrintWriter (line 24) | public PrintWriter getErrPrintWriter() {
    method getOutPrintWriter (line 27) | public PrintWriter getOutPrintWriter() {
    method getRawInputStream (line 30) | public InputStream getRawInputStream() {

FILE: hiddenapi/stubs/src/main/java/android/os/SystemProperties.java
  class SystemProperties (line 6) | public class SystemProperties {
    method get (line 7) | public static String get(@NonNull String key) {
    method get (line 11) | public static String get(@NonNull String key, @Nullable String def) {
    method set (line 15) | public static void set(@NonNull String key, @Nullable String val) {
    method getBoolean (line 19) | public static boolean getBoolean(@NonNull String key, boolean def) {
    method getInt (line 23) | public static int getInt(@NonNull String key, int def) {

FILE: hiddenapi/stubs/src/main/java/android/os/UserHandle.java
  class UserHandle (line 5) | public class UserHandle {
    method UserHandle (line 7) | public UserHandle(int h) {
    method getIdentifier (line 11) | public int getIdentifier() {

FILE: hiddenapi/stubs/src/main/java/android/os/UserManager.java
  class UserManager (line 7) | public class UserManager {
    method getUsers (line 8) | public List<UserInfo> getUsers() {

FILE: hiddenapi/stubs/src/main/java/android/permission/IPermissionManager.java
  type IPermissionManager (line 5) | public interface IPermissionManager {
    method getSplitPermissions (line 7) | List<?> getSplitPermissions();

FILE: hiddenapi/stubs/src/main/java/android/system/ErrnoException.java
  class ErrnoException (line 3) | public final class ErrnoException extends Exception {

FILE: hiddenapi/stubs/src/main/java/android/system/Int32Ref.java
  class Int32Ref (line 5) | public class Int32Ref {
    method Int32Ref (line 8) | public Int32Ref(int value) {
    method toString (line 12) | @Override public String toString() {

FILE: hiddenapi/stubs/src/main/java/android/system/Os.java
  class Os (line 9) | public class Os {
    method ioctlInt (line 10) | public static int ioctlInt(FileDescriptor fd, int cmd, MutableInt arg)...
    method ioctlInt (line 14) | @RequiresApi(27)
    method ioctlInt (line 19) | @RequiresApi(31)

FILE: hiddenapi/stubs/src/main/java/android/util/DisplayMetrics.java
  class DisplayMetrics (line 3) | public class DisplayMetrics {

FILE: hiddenapi/stubs/src/main/java/android/util/MutableInt.java
  class MutableInt (line 3) | public final class MutableInt {
    method MutableInt (line 6) | public MutableInt(int value) {

FILE: hiddenapi/stubs/src/main/java/android/util/TypedValue.java
  class TypedValue (line 3) | public class TypedValue {

FILE: hiddenapi/stubs/src/main/java/android/view/IWindowManager.java
  type IWindowManager (line 9) | public interface IWindowManager extends IInterface {
    method lockNow (line 10) | void lockNow(Bundle options);
    class Stub (line 12) | abstract class Stub extends Binder implements IWindowManager {
      method asInterface (line 13) | public static IWindowManager asInterface(IBinder obj) {

FILE: hiddenapi/stubs/src/main/java/android/webkit/WebViewDelegate.java
  class WebViewDelegate (line 3) | public class WebViewDelegate {

FILE: hiddenapi/stubs/src/main/java/android/webkit/WebViewFactory.java
  class WebViewFactory (line 3) | public class WebViewFactory {

FILE: hiddenapi/stubs/src/main/java/android/webkit/WebViewFactoryProvider.java
  class WebViewFactoryProvider (line 3) | public class WebViewFactoryProvider {

FILE: hiddenapi/stubs/src/main/java/com/android/internal/os/BinderInternal.java
  class BinderInternal (line 5) | public class BinderInternal {
    method getContextObject (line 6) | public static final native IBinder getContextObject();

FILE: hiddenapi/stubs/src/main/java/com/android/internal/os/ZygoteInit.java
  class ZygoteInit (line 3) | public class ZygoteInit {

FILE: hiddenapi/stubs/src/main/java/com/android/internal/util/XmlUtils.java
  class XmlUtils (line 9) | public class XmlUtils {
    method readMapXml (line 10) | @SuppressWarnings("rawtypes")

FILE: hiddenapi/stubs/src/main/java/com/android/server/LocalServices.java
  class LocalServices (line 3) | public class LocalServices {
    method getService (line 5) | public static <T> T getService(Class<T> type) {

FILE: hiddenapi/stubs/src/main/java/com/android/server/SystemService.java
  class SystemService (line 3) | public abstract class SystemService {

FILE: hiddenapi/stubs/src/main/java/com/android/server/SystemServiceManager.java
  class SystemServiceManager (line 5) | public class SystemServiceManager {

FILE: hiddenapi/stubs/src/main/java/com/android/server/am/ActivityManagerService.java
  class ActivityManagerService (line 5) | public class ActivityManagerService {
    class Lifecycle (line 6) | public static final class Lifecycle extends SystemService {
      method getService (line 7) | public ActivityManagerService getService() {
      method findProcessLocked (line 10) | private ProcessRecord findProcessLocked(String process, int userId, ...

FILE: hiddenapi/stubs/src/main/java/com/android/server/am/ProcessRecord.java
  class ProcessRecord (line 3) | public class ProcessRecord {

FILE: hiddenapi/stubs/src/main/java/dalvik/system/BaseDexClassLoader.java
  class BaseDexClassLoader (line 5) | public class BaseDexClassLoader extends ClassLoader {
    method BaseDexClassLoader (line 6) | public BaseDexClassLoader(ByteBuffer[] dexFiles, ClassLoader parent) {
    method BaseDexClassLoader (line 10) | public BaseDexClassLoader(ByteBuffer[] dexFiles, String librarySearchP...
    method getLdLibraryPath (line 14) | public String getLdLibraryPath() {

FILE: hiddenapi/stubs/src/main/java/dalvik/system/VMRuntime.java
  class VMRuntime (line 3) | public class VMRuntime {
    method getRuntime (line 5) | public static VMRuntime getRuntime() {
    method is64Bit (line 10) | public native boolean is64Bit();
    method vmInstructionSet (line 12) | public native String vmInstructionSet();
    method isJavaDebuggable (line 14) | public native boolean isJavaDebuggable();

FILE: hiddenapi/stubs/src/main/java/org/xmlpull/v1/XmlPullParserException.java
  class XmlPullParserException (line 3) | public class XmlPullParserException extends Throwable {

FILE: hiddenapi/stubs/src/main/java/sun/misc/CompoundEnumeration.java
  class CompoundEnumeration (line 6) | public class CompoundEnumeration<E> implements Enumeration<E> {
    method CompoundEnumeration (line 10) | public CompoundEnumeration(Enumeration<E>[] enums) {
    method next (line 14) | private boolean next() {
    method hasMoreElements (line 24) | public boolean hasMoreElements() {
    method nextElement (line 28) | public E nextElement() {

FILE: hiddenapi/stubs/src/main/java/sun/net/www/ParseUtil.java
  class ParseUtil (line 3) | public class ParseUtil {
    method encodePath (line 4) | public static String encodePath(String path, boolean flag) {

FILE: hiddenapi/stubs/src/main/java/sun/net/www/protocol/jar/Handler.java
  class Handler (line 3) | public abstract class Handler extends java.net.URLStreamHandler {

FILE: hiddenapi/stubs/src/main/java/xposed/dummy/XResourcesSuperClass.java
  class XResourcesSuperClass (line 13) | public class XResourcesSuperClass extends Resources {
    method XResourcesSuperClass (line 15) | protected XResourcesSuperClass() {
    method XResourcesSuperClass (line 20) | protected XResourcesSuperClass(ClassLoader classLoader) {

FILE: hiddenapi/stubs/src/main/java/xposed/dummy/XTypedArraySuperClass.java
  class XTypedArraySuperClass (line 14) | public class XTypedArraySuperClass extends TypedArray {
    method XTypedArraySuperClass (line 16) | protected XTypedArraySuperClass(Resources resources) {

FILE: native/include/common/config.h
  function namespace (line 8) | namespace vector::native {

FILE: native/include/common/logging.h
  function namespace (line 67) | namespace vector::native::detail {

FILE: native/include/core/config_bridge.h
  function namespace (line 12) | namespace vector::native {

FILE: native/include/core/context.h
  function namespace (line 21) | namespace vector::native {

FILE: native/include/core/native_api.h
  type NativeAPIEntries (line 84) | struct NativeAPIEntries {
  function namespace (line 92) | namespace vector::native {

FILE: native/include/elf/elf_image.h
  function namespace (line 21) | namespace vector::native {

FILE: native/include/elf/symbol_cache.h
  function namespace (line 11) | namespace vector::native {

FILE: native/include/framework/android_types.h
  function namespace (line 12) | namespace android {

FILE: native/include/jni/jni_bridge.h
  function namespace (line 15) | namespace vector::native::jni {

FILE: native/include/jni/jni_hooks.h
  function namespace (line 10) | namespace vector::native::jni {

FILE: native/src/core/context.cpp
  type vector::native (line 6) | namespace vector::native {
    function Context (line 12) | Context *Context::GetInstance() { return instance_.get(); }

FILE: native/src/core/native_api.cpp
  type vector::native (line 81) | namespace vector::native {
    function InitializeApiEntries (line 106) | void InitializeApiEntries() {
    function RegisterNativeLib (line 124) | void RegisterNativeLib(const std::string &library_name) {
    function HasEnding (line 149) | bool HasEnding(std::string_view fullString, std::string_view ending) {
    function InstallNativeAPI (line 195) | bool InstallNativeAPI(const lsplant::HookHandler &handler) { return ha...

FILE: native/src/elf/elf_image.cpp
  type vector::native (line 14) | namespace vector::native {
    function T (line 19) | inline T PtrOffset(void *base, ptrdiff_t offset) {
    type stat (line 36) | struct stat
    type xz_dec (line 168) | struct xz_dec
    type xz_buf (line 171) | struct xz_buf
    type xz_ret (line 182) | enum xz_ret
    type MapEntry (line 303) | struct MapEntry {

FILE: native/src/elf/symbol_cache.cpp
  type vector::native (line 8) | namespace vector::native {
    function ElfImage (line 23) | const ElfImage *ElfSymbolCache::GetArt() {
    function ElfImage (line 44) | const ElfImage *ElfSymbolCache::GetLibBinder() {
    function ElfImage (line 58) | const ElfImage *ElfSymbolCache::GetLinker() {

FILE: native/src/jni/dex_parser_bridge.cpp
  class DexParser (line 58) | class DexParser : public dex::Reader {
    method DexParser (line 60) | DexParser(const dex::u1 *data, size_t size) : dex::Reader(data, size, ...
    type ClassData (line 69) | struct ClassData {
    type MethodBody (line 91) | struct MethodBody {
  function ParseIntValue (line 120) | static std::vector<jbyte> ParseIntValue(const dex::u1 **pptr, size_t siz...
  function ParseFloatValue (line 149) | static std::vector<jbyte> ParseFloatValue(const dex::u1 **pptr, size_t s...
  function Value (line 171) | Value ParseValue(const dex::u1 **value, AnnotationList &annotation_list,...
  function Annotation (line 239) | Annotation ParseAnnotation(const dex::u1 **annotation, AnnotationList &a...
  function Array (line 256) | Array ParseArray(const dex::u1 **array, AnnotationList &annotation_list,...
  function ParseAnnotationSet (line 269) | void ParseAnnotationSet(dex::Reader &dex, AnnotationList &annotation
Condensed preview — 560 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,806K chars).
[
  {
    "path": ".gitattributes",
    "chars": 323,
    "preview": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto eol=lf\n\n# Declare files that will a"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 3068,
    "preview": "name: Bug report/反馈 Bug\ndescription: Report errors or unexpected behavior./反馈错误或异常行为。\nlabels: [bug]\nbody:\n  - type: mark"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 210,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Ask a question/提问\n    url: https://github.com/JingMatrix/LSPosed/di"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 768,
    "preview": "---\nname: Feature request/新特性请求\ndescription: Suggest an idea./提出建议\nlabels: [enhancement]\nbody:\n  - type: textarea\n    at"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 470,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: github-actions\n    directory: /\n    schedule:\n      interval: monthly\n    gro"
  },
  {
    "path": ".github/workflows/core.yml",
    "chars": 3754,
    "preview": "name: Core\n\non:\n  workflow_dispatch:\n  push:\n    branches: [ master ]\n    tags: [ v* ]\n  pull_request:\n  merge_group:\n\nj"
  },
  {
    "path": ".github/workflows/crowdin.yml",
    "chars": 690,
    "preview": "name: Crowdin Action\n\non:\n  workflow_dispatch:\n  push:\n    branches: [ master ]\n    paths:\n      - app/src/main/res/valu"
  },
  {
    "path": ".gitignore",
    "chars": 96,
    "preview": ".project\n.settings\n.cache\n*.iml\n.gradle\n/local.properties\n/.idea\n.DS_Store\nbuild\n/captures\nbin/\n"
  },
  {
    "path": ".gitmodules",
    "chars": 986,
    "preview": "[submodule \"external/lsplant\"]\n\tpath = external/lsplant\n\turl = https://github.com/JingMatrix/LSPlant.git\n[submodule \"ext"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 4483,
    "preview": "# LSPosed Framework\n\n[![Build](https://img.shields.io/github/actions/workflow/status/JingMatrix/LSPosed/core.yml?branch="
  },
  {
    "path": "app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "app/build.gradle.kts",
    "chars": 5180,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/proguard-rules.pro",
    "chars": 1317,
    "preview": "-keep class org.lsposed.manager.Constants {\n    public static boolean setBinder(android.os.IBinder);\n}\n-assumenosideeffe"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "chars": 2507,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n  <!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you ca"
  },
  {
    "path": "app/src/main/assets/webview/colors_dark.css",
    "chars": 4909,
    "preview": "/* Primer Colors */\n/* Please also update colors_light.css with light mode appropriate colors when modifying this file. "
  },
  {
    "path": "app/src/main/assets/webview/colors_light.css",
    "chars": 4851,
    "preview": "/* Primer Colors */\n/* Please also update colors_dark.css with dark mode appropriate colors when modifying this file. */"
  },
  {
    "path": "app/src/main/assets/webview/markdown.css",
    "chars": 10721,
    "preview": "/* Shared styles between light & dark mode so all colors should be variables */\n\n* {\n  box-sizing: border-box;\n}\n\ninput:"
  },
  {
    "path": "app/src/main/assets/webview/syntax.css",
    "chars": 3115,
    "preview": "/* From https://github.com/primer/github-syntax-light/blob/master/lib/github-light.css */\n.pl-c /* comment, punctuation."
  },
  {
    "path": "app/src/main/assets/webview/syntax_dark.css",
    "chars": 3112,
    "preview": "/* From https://github.com/primer/github-syntax-dark/blob/master/lib/github-dark.css */\n.pl-c /* comment, punctuation.de"
  },
  {
    "path": "app/src/main/assets/webview/template.html",
    "chars": 607,
    "preview": "<!DOCTYPE html>\n<html dir=\"@dir@\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-wid"
  },
  {
    "path": "app/src/main/assets/webview/template_dark.html",
    "chars": 611,
    "preview": "<!DOCTYPE html>\n<html dir=\"@dir@\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-wid"
  },
  {
    "path": "app/src/main/java/com/google/android/material/appbar/SubtitleCollapsingToolbarLayout.java",
    "chars": 47868,
    "preview": "package com.google.android.material.appbar;\n\nimport android.animation.ValueAnimator;\nimport android.content.Context;\nimp"
  },
  {
    "path": "app/src/main/java/com/google/android/material/internal/SubtitleCollapsingTextHelper.java",
    "chars": 50360,
    "preview": "package com.google.android.material.internal;\n\nimport android.animation.TimeInterpolator;\nimport android.content.res.Col"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/App.java",
    "chars": 11750,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ConfigManager.java",
    "chars": 14179,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/Constants.java",
    "chars": 1100,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/adapters/AppHelper.java",
    "chars": 7175,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java",
    "chars": 32043,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceHolder.java",
    "chars": 1798,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/repo/RepoLoader.java",
    "chars": 12987,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/repo/model/Collaborator.java",
    "chars": 1397,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/repo/model/OnlineModule.java",
    "chars": 6893,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/repo/model/Release.java",
    "chars": 3599,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/repo/model/ReleaseAsset.java",
    "chars": 2162,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/activity/MainActivity.java",
    "chars": 11005,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/activity/base/BaseActivity.java",
    "chars": 3455,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/dialog/BlurBehindDialogBuilder.java",
    "chars": 6458,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/dialog/FlashDialogBuilder.java",
    "chars": 5262,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/dialog/WelcomeDialog.java",
    "chars": 3954,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/AppListFragment.java",
    "chars": 9372,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/BaseFragment.java",
    "chars": 5994,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/CompileDialogFragment.java",
    "chars": 4691,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/HomeFragment.java",
    "chars": 15369,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java",
    "chars": 17836,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/ModulesFragment.java",
    "chars": 34913,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/RecyclerViewDialogFragment.java",
    "chars": 3800,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/RepoFragment.java",
    "chars": 20333,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/RepoItemFragment.java",
    "chars": 29310,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/fragment/SettingsFragment.java",
    "chars": 19549,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/widget/EmptyStateRecyclerView.java",
    "chars": 3296,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/widget/ExpandableTextView.java",
    "chars": 5914,
    "preview": "/*\n * <!--This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it unde"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/widget/LinkifyTextView.java",
    "chars": 3200,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/widget/ScrollWebView.java",
    "chars": 2922,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/ui/widget/StatefulRecyclerView.java",
    "chars": 2398,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/AccessibilityUtils.java",
    "chars": 506,
    "preview": "package org.lsposed.manager.util;\n\nimport android.content.ContentResolver;\nimport android.provider.Settings;\n\npublic cla"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/AppIconModelLoader.java",
    "chars": 4738,
    "preview": "/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/AppModule.java",
    "chars": 1651,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/BackupUtils.java",
    "chars": 5488,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/CloudflareDNS.java",
    "chars": 2325,
    "preview": "package org.lsposed.manager.util;\n\nimport android.os.Build;\n\nimport androidx.annotation.NonNull;\n\nimport org.lsposed.man"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/EmptyAccessibilityDelegate.java",
    "chars": 2302,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/ModuleUtil.java",
    "chars": 15105,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/NavUtil.java",
    "chars": 2334,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/NoSniFactory.java",
    "chars": 2063,
    "preview": "package org.lsposed.manager.util;\n\nimport java.io.IOException;\nimport java.net.InetAddress;\nimport java.net.Socket;\n\nimp"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/ShortcutUtil.java",
    "chars": 6957,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/SimpleStatefulAdaptor.java",
    "chars": 3673,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/ThemeUtil.java",
    "chars": 5080,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/UpdateUtil.java",
    "chars": 5963,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/chrome/CustomTabsURLSpan.java",
    "chars": 1285,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/java/org/lsposed/manager/util/chrome/LinkTransformationMethod.java",
    "chars": 2381,
    "preview": "/*\n * This file is part of LSPosed.\n *\n * LSPosed is free software: you can redistribute it and/or modify\n * it under th"
  },
  {
    "path": "app/src/main/res/anim/fragment_enter.xml",
    "chars": 1252,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/anim/fragment_enter_pop.xml",
    "chars": 1252,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/anim/fragment_exit.xml",
    "chars": 1252,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/anim/fragment_exit_pop.xml",
    "chars": 1252,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/drawable/ic_assignment_checkable.xml",
    "chars": 1027,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/drawable/ic_attach_file.xml",
    "chars": 1390,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_add_24.xml",
    "chars": 1103,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_arrow_back_24.xml",
    "chars": 1162,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_assignment_24.xml",
    "chars": 1373,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_chat_24.xml",
    "chars": 1210,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_extension_24.xml",
    "chars": 1383,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_get_app_24.xml",
    "chars": 1112,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_home_24.xml",
    "chars": 1096,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_info_24.xml",
    "chars": 1164,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_search_24.xml",
    "chars": 1316,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_settings_24.xml",
    "chars": 1965,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_baseline_settings_backup_restore_24.xml",
    "chars": 1315,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_extension_checkable.xml",
    "chars": 1026,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/drawable/ic_get_app_checkable.xml",
    "chars": 1021,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/drawable/ic_home_checkable.xml",
    "chars": 1015,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/drawable/ic_keyboard_arrow_down.xml",
    "chars": 1172,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher.xml",
    "chars": 1056,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_foreground.xml",
    "chars": 2025,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/drawable/ic_launcher_round.xml",
    "chars": 1304,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/drawable/ic_open_in_browser.xml",
    "chars": 1264,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_android_24.xml",
    "chars": 1584,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_app_shortcut_24.xml",
    "chars": 1705,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_assignment_24.xml",
    "chars": 1609,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_dark_mode_24.xml",
    "chars": 1437,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_dns_24.xml",
    "chars": 1468,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_extension_24.xml",
    "chars": 1571,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_format_color_fill_24.xml",
    "chars": 1365,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_get_app_24.xml",
    "chars": 1156,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_groups_24.xml",
    "chars": 1921,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_home_24.xml",
    "chars": 1139,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_invert_colors_24.xml",
    "chars": 1305,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_language_24.xml",
    "chars": 1971,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_merge_type_24.xml",
    "chars": 1162,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_palette_24.xml",
    "chars": 2037,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_restore_24.xml",
    "chars": 1307,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_settings_24.xml",
    "chars": 2807,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_shield_24.xml",
    "chars": 1216,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_speaker_notes_24.xml",
    "chars": 1321,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_outline_translate_24.xml",
    "chars": 1386,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_bug_report_24.xml",
    "chars": 1927,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_check_circle_24.xml",
    "chars": 1335,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_error_outline_24.xml",
    "chars": 1323,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_settings_24.xml",
    "chars": 1939,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_update_24.xml",
    "chars": 1661,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_round_warning_24.xml",
    "chars": 1288,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_save.xml",
    "chars": 1312,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/drawable/ic_settings_checkable.xml",
    "chars": 1023,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/drawable/shortcut_ic_logs.xml",
    "chars": 1220,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/drawable/shortcut_ic_modules.xml",
    "chars": 1219,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/drawable/shortcut_ic_repo.xml",
    "chars": 1172,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/drawable/shortcut_ic_settings.xml",
    "chars": 1173,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/drawable/simple_menu_background.xml",
    "chars": 1234,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "chars": 2527,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n      ~ This file is part of LSPosed.\n      ~\n      ~ LSPosed is free softwar"
  },
  {
    "path": "app/src/main/res/layout/dialog_about.xml",
    "chars": 2443,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/dialog_item.xml",
    "chars": 1283,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/dialog_title.xml",
    "chars": 1190,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/fragment_app_list.xml",
    "chars": 4657,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/fragment_compile_dialog.xml",
    "chars": 1810,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/fragment_home.xml",
    "chars": 20187,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/fragment_pager.xml",
    "chars": 4428,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/fragment_repo.xml",
    "chars": 3916,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/fragment_settings.xml",
    "chars": 2994,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/item_log_textview.xml",
    "chars": 1326,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/item_master_switch.xml",
    "chars": 1043,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/layout/item_module.xml",
    "chars": 8286,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/item_onlinemodule.xml",
    "chars": 5989,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/item_repo_loadmore.xml",
    "chars": 2002,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/item_repo_readme.xml",
    "chars": 1775,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/item_repo_recyclerview.xml",
    "chars": 1406,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/item_repo_release.xml",
    "chars": 5070,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/item_repo_title_description.xml",
    "chars": 2939,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout/preference_recyclerview.xml",
    "chars": 1554,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/scrollable_dialog.xml",
    "chars": 1344,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/layout/swiperefresh_recyclerview.xml",
    "chars": 1648,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/layout-sw600dp/activity_main.xml",
    "chars": 2418,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/context_menu_modules.xml",
    "chars": 1506,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/menu_app_item.xml",
    "chars": 1400,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/menu_app_list.xml",
    "chars": 4284,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/menu_home.xml",
    "chars": 1370,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/menu_logs.xml",
    "chars": 1655,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/menu_modules.xml",
    "chars": 1185,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/menu_repo.xml",
    "chars": 2000,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/menu_repo_item.xml",
    "chars": 1102,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu/navigation_menu.xml",
    "chars": 1595,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/menu-sw600dp/navigation_menu.xml",
    "chars": 1594,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/navigation/main_nav.xml",
    "chars": 1575,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/navigation/modules_nav.xml",
    "chars": 2484,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/navigation/repo_nav.xml",
    "chars": 2373,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/values/arrays.xml",
    "chars": 3454,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/values/attrs.xml",
    "chars": 4590,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "chars": 1147,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "chars": 960,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/values/integer.xml",
    "chars": 1046,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values/settings.xml",
    "chars": 857,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "chars": 17027,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values/strings_untranslatable.xml",
    "chars": 1143,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "chars": 3044,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/values/themes.xml",
    "chars": 2993,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/values/themes_custom.xml",
    "chars": 2536,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/values/themes_overlay.xml",
    "chars": 988,
    "preview": "<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can redistribute it and/or modify\n  ~ it un"
  },
  {
    "path": "app/src/main/res/values/themes_override.xml",
    "chars": 4174,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can r"
  },
  {
    "path": "app/src/main/res/values-af/strings.xml",
    "chars": 16945,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-ar/strings.xml",
    "chars": 17025,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-bg/strings.xml",
    "chars": 17537,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-bn/strings.xml",
    "chars": 16859,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-ca/strings.xml",
    "chars": 17542,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-cs/strings.xml",
    "chars": 17320,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-da/strings.xml",
    "chars": 16645,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-de/strings.xml",
    "chars": 18306,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-el/strings.xml",
    "chars": 18126,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-es/strings.xml",
    "chars": 18518,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-et/strings.xml",
    "chars": 16856,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-fa/strings.xml",
    "chars": 16918,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-fi/strings.xml",
    "chars": 16959,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-fr/strings.xml",
    "chars": 18720,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-hi/strings.xml",
    "chars": 16795,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-hr/strings.xml",
    "chars": 17325,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-hu/strings.xml",
    "chars": 17459,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-in/strings.xml",
    "chars": 17447,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-it/strings.xml",
    "chars": 18158,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-iw/strings.xml",
    "chars": 16085,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-ja/strings.xml",
    "chars": 15059,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-ko/strings.xml",
    "chars": 14320,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-ku/strings.xml",
    "chars": 17067,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  },
  {
    "path": "app/src/main/res/values-lt/strings.xml",
    "chars": 17566,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ This file is part of LSPosed.\n  ~\n  ~ LSPosed is free software: you can "
  }
]

// ... and 360 more files (download for full content)

About this extraction

This page contains the full source code of the JingMatrix/LSPosed GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 560 files (2.5 MB), approximately 697.8k tokens, and a symbol index with 2384 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!