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
[](https://github.com/JingMatrix/LSPosed/actions/workflows/core.yml?query=event%3Apush+branch%3Amaster+is%3Acompleted) [](https://crowdin.com/project/lsposed_jingmatrix) [](https://github.com/JingMatrix/LSPosed/releases/latest) [](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(),
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
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[;\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.