Showing preview only (3,047K chars total). Download the full file or copy to clipboard to get everything.
Repository: android-hacker/VirtualXposed
Branch: vxp
Commit: 122beb371519
Files: 801
Total size: 2.7 MB
Directory structure:
gitextract_16jertsa/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── bug_report_cn.md
│ │ ├── feature_request.md
│ │ └── feature_request_cn.md
│ ├── issue-close-app.yml
│ ├── stale.yml
│ └── workflows/
│ └── android.yml
├── .gitignore
├── .gitmodules
├── .travis.yml
├── CHINESE.md
├── LICENSE.txt
├── README.md
└── VirtualApp/
├── .gitignore
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── aosp/
│ │ └── java/
│ │ └── io/
│ │ └── virtualapp/
│ │ └── delegate/
│ │ ├── MyCrashHandler.java
│ │ └── MyVirtualInitializer.java
│ ├── fdroid/
│ │ └── java/
│ │ └── io/
│ │ └── virtualapp/
│ │ └── delegate/
│ │ └── MyVirtualInitializer.java
│ └── main/
│ ├── AndroidManifest.xml
│ ├── assets/
│ │ └── XposedInstaller_3.1.5.apk_
│ ├── java/
│ │ └── io/
│ │ └── virtualapp/
│ │ ├── VCommends.java
│ │ ├── XApp.java
│ │ ├── abs/
│ │ │ ├── BasePresenter.java
│ │ │ ├── BaseView.java
│ │ │ ├── Callback.java
│ │ │ └── ui/
│ │ │ ├── VActivity.java
│ │ │ ├── VFragment.java
│ │ │ └── VUiKit.java
│ │ ├── delegate/
│ │ │ ├── BaseCrashHandler.java
│ │ │ ├── BaseVirtualInitializer.java
│ │ │ ├── MyAppRequestListener.java
│ │ │ ├── MyComponentDelegate.java
│ │ │ ├── MyPhoneInfoDelegate.java
│ │ │ └── MyTaskDescDelegate.java
│ │ ├── dev/
│ │ │ └── CmdReceiver.java
│ │ ├── glide/
│ │ │ ├── GlideUtils.java
│ │ │ ├── MyGlideModule.java
│ │ │ ├── PackageIconResourceDataFetcher.java
│ │ │ ├── PackageIconResourceLoader.java
│ │ │ └── PackageIconResourceLoaderFactory.java
│ │ ├── gms/
│ │ │ └── FakeGms.java
│ │ ├── home/
│ │ │ ├── ListAppActivity.java
│ │ │ ├── ListAppContract.java
│ │ │ ├── ListAppFragment.java
│ │ │ ├── ListAppPresenterImpl.java
│ │ │ ├── LoadingActivity.java
│ │ │ ├── NewHomeActivity.java
│ │ │ ├── adapters/
│ │ │ │ ├── AppPagerAdapter.java
│ │ │ │ └── CloneAppListAdapter.java
│ │ │ ├── models/
│ │ │ │ ├── AppData.java
│ │ │ │ ├── AppInfo.java
│ │ │ │ ├── AppInfoLite.java
│ │ │ │ ├── MultiplePackageAppData.java
│ │ │ │ └── PackageAppData.java
│ │ │ └── repo/
│ │ │ ├── AppDataSource.java
│ │ │ ├── AppRepository.java
│ │ │ └── PackageAppDataStorage.java
│ │ ├── settings/
│ │ │ ├── AboutActivity.java
│ │ │ ├── AppManageActivity.java
│ │ │ ├── NougatPolicy.java
│ │ │ ├── OnlinePlugin.java
│ │ │ ├── RecommendPluginActivity.java
│ │ │ ├── SettingsActivity.java
│ │ │ └── TaskManageActivity.java
│ │ ├── splash/
│ │ │ └── SplashActivity.java
│ │ ├── sys/
│ │ │ ├── Installd.java
│ │ │ ├── InstallerActivity.java
│ │ │ └── ShareBridgeActivity.java
│ │ ├── update/
│ │ │ └── VAVersionService.java
│ │ ├── utils/
│ │ │ ├── DialogUtil.java
│ │ │ ├── HanziToPinyin.java
│ │ │ └── Misc.java
│ │ └── widgets/
│ │ ├── BaseView.java
│ │ ├── CardStackAdapter.java
│ │ ├── CardStackLayout.java
│ │ ├── DragSelectRecyclerView.java
│ │ ├── DragSelectRecyclerViewAdapter.java
│ │ ├── EatBeansView.java
│ │ ├── Indicator.java
│ │ ├── LabelView.java
│ │ ├── MarqueeTextView.java
│ │ └── fittext/
│ │ ├── BaseTextView.java
│ │ ├── FitTextHelper.java
│ │ └── FitTextView.java
│ └── res/
│ ├── drawable/
│ │ ├── blue_circle.xml
│ │ ├── fab_bg.xml
│ │ ├── home_bg.xml
│ │ ├── icon_bg.xml
│ │ ├── sel_clone_app_btn.xml
│ │ ├── sel_guide_btn.xml
│ │ ├── shape_clone_app_btn.xml
│ │ └── shape_clone_app_btn_pressed.xml
│ ├── drawable-nodpi/
│ │ ├── about_icon_copy_right.xml
│ │ └── ic_more.xml
│ ├── layout/
│ │ ├── activity_clone_app.xml
│ │ ├── activity_install.xml
│ │ ├── activity_list.xml
│ │ ├── activity_loading.xml
│ │ ├── activity_location_settings.xml
│ │ ├── activity_marker.xml
│ │ ├── activity_splash.xml
│ │ ├── activity_users.xml
│ │ ├── content_toolbar.xml
│ │ ├── fragment_list_app.xml
│ │ ├── item_app.xml
│ │ ├── item_app_manage.xml
│ │ ├── item_clone_app.xml
│ │ ├── item_location_app.xml
│ │ ├── item_plugin_recommend.xml
│ │ ├── item_share.xml
│ │ ├── item_task_manage.xml
│ │ └── item_user.xml
│ ├── menu/
│ │ ├── app_manage_menu.xml
│ │ ├── main_menu.xml
│ │ └── marktet_map.xml
│ ├── values/
│ │ ├── attrs.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── fitTextView.xml
│ │ ├── ids.xml
│ │ ├── integers.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ ├── values-en/
│ │ └── strings.xml
│ ├── values-es/
│ │ └── strings.xml
│ ├── values-fr/
│ │ └── strings.xml
│ ├── values-ja/
│ │ └── strings.xml
│ ├── values-pt-rBR/
│ │ └── strings.xml
│ ├── values-ru/
│ │ └── strings.xml
│ ├── values-uk/
│ │ └── strings.xml
│ ├── values-zh-rCN/
│ │ └── strings.xml
│ ├── values-zh-rTW/
│ │ └── strings.xml
│ └── xml/
│ └── settings_preferences.xml
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── lib/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── aidl/
│ │ ├── android/
│ │ │ ├── accounts/
│ │ │ │ ├── IAccountAuthenticator.aidl
│ │ │ │ ├── IAccountAuthenticatorResponse.aidl
│ │ │ │ └── IAccountManagerResponse.aidl
│ │ │ ├── app/
│ │ │ │ ├── IActivityManager/
│ │ │ │ │ └── ContentProviderHolder.aidl
│ │ │ │ ├── IServiceConnection.aidl
│ │ │ │ ├── IStopUserCallback.aidl
│ │ │ │ └── job/
│ │ │ │ ├── IJobCallback.aidl
│ │ │ │ └── IJobService.aidl
│ │ │ ├── content/
│ │ │ │ ├── IIntentReceiver.aidl
│ │ │ │ ├── ISyncAdapter.aidl
│ │ │ │ ├── ISyncContext.aidl
│ │ │ │ ├── ISyncStatusObserver.aidl
│ │ │ │ └── pm/
│ │ │ │ ├── IPackageDataObserver.aidl
│ │ │ │ ├── IPackageDeleteObserver2.aidl
│ │ │ │ ├── IPackageInstallObserver.aidl
│ │ │ │ ├── IPackageInstallObserver2.aidl
│ │ │ │ ├── IPackageInstallerCallback.aidl
│ │ │ │ └── IPackageInstallerSession.aidl
│ │ │ ├── location/
│ │ │ │ └── ILocationListener.aidl
│ │ │ └── net/
│ │ │ ├── IConnectivityManager.aidl
│ │ │ └── wifi/
│ │ │ └── IWifiScanner.aidl
│ │ └── com/
│ │ └── lody/
│ │ └── virtual/
│ │ ├── client/
│ │ │ └── IVClient.aidl
│ │ ├── os/
│ │ │ └── VUserInfo.aidl
│ │ ├── remote/
│ │ │ ├── AppTaskInfo.aidl
│ │ │ ├── BadgerInfo.aidl
│ │ │ ├── InstallResult.aidl
│ │ │ ├── InstalledAppInfo.aidl
│ │ │ ├── PendingIntentData.aidl
│ │ │ ├── PendingResultData.aidl
│ │ │ ├── Problem.aidl
│ │ │ ├── ReceiverInfo.aidl
│ │ │ ├── VDeviceInfo.aidl
│ │ │ ├── VParceledListSlice.aidl
│ │ │ └── vloc/
│ │ │ ├── VCell.aidl
│ │ │ ├── VLocation.aidl
│ │ │ └── VWifi.aidl
│ │ └── server/
│ │ ├── IAccountManager.aidl
│ │ ├── IActivityManager.aidl
│ │ ├── IAppManager.aidl
│ │ ├── IBinderDelegateService.aidl
│ │ ├── IDeviceInfoManager.aidl
│ │ ├── IJobScheduler.aidl
│ │ ├── INotificationManager.aidl
│ │ ├── IPackageInstaller.aidl
│ │ ├── IPackageInstallerSession.aidl
│ │ ├── IPackageManager.aidl
│ │ ├── IUserManager.aidl
│ │ ├── IVirtualLocationManager.aidl
│ │ ├── IVirtualStorageService.aidl
│ │ ├── interfaces/
│ │ │ ├── IAppRequestListener.aidl
│ │ │ ├── IIntentFilterObserver.aidl
│ │ │ ├── IPackageObserver.aidl
│ │ │ ├── IProcessObserver.aidl
│ │ │ ├── IServiceFetcher.aidl
│ │ │ └── IUiCallback.aidl
│ │ └── pm/
│ │ └── installer/
│ │ ├── SessionInfo.aidl
│ │ └── SessionParams.aidl
│ ├── java/
│ │ ├── android/
│ │ │ ├── app/
│ │ │ │ ├── ActivityOptions.java
│ │ │ │ ├── ActivityThread.java
│ │ │ │ ├── ClientTransactionHandler.java
│ │ │ │ ├── LoadedApk.java
│ │ │ │ ├── TransactionHandlerProxy.java
│ │ │ │ └── servertransaction/
│ │ │ │ ├── ClientTransaction.java
│ │ │ │ ├── PendingTransactionActions.java
│ │ │ │ └── TransactionExecutor.java
│ │ │ ├── content/
│ │ │ │ ├── SyncStatusInfo.java
│ │ │ │ ├── pm/
│ │ │ │ │ └── PackageParser.java
│ │ │ │ └── res/
│ │ │ │ └── CompatibilityInfo.java
│ │ │ ├── location/
│ │ │ │ └── LocationRequest.java
│ │ │ ├── util/
│ │ │ │ └── MergedConfiguration.java
│ │ │ └── view/
│ │ │ └── DisplayAdjustments.java
│ │ ├── com/
│ │ │ └── lody/
│ │ │ └── virtual/
│ │ │ ├── Build.java
│ │ │ ├── DelegateApplication64Bit.java
│ │ │ ├── GmsSupport.java
│ │ │ ├── client/
│ │ │ │ ├── NativeEngine.java
│ │ │ │ ├── VClientImpl.java
│ │ │ │ ├── badger/
│ │ │ │ │ ├── BadgerManager.java
│ │ │ │ │ ├── BroadcastBadger1.java
│ │ │ │ │ ├── BroadcastBadger2.java
│ │ │ │ │ └── IBadger.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── CrashHandler.java
│ │ │ │ │ ├── InstallStrategy.java
│ │ │ │ │ ├── InvocationStubManager.java
│ │ │ │ │ └── VirtualCore.java
│ │ │ │ ├── env/
│ │ │ │ │ ├── Constants.java
│ │ │ │ │ ├── DeadServerException.java
│ │ │ │ │ ├── GPSStateline.java
│ │ │ │ │ ├── SpecialComponentList.java
│ │ │ │ │ ├── VirtualGPSSatalines.java
│ │ │ │ │ └── VirtualRuntime.java
│ │ │ │ ├── fixer/
│ │ │ │ │ ├── ActivityFixer.java
│ │ │ │ │ ├── ComponentFixer.java
│ │ │ │ │ └── ContextFixer.java
│ │ │ │ ├── hook/
│ │ │ │ │ ├── base/
│ │ │ │ │ │ ├── BinderInvocationProxy.java
│ │ │ │ │ │ ├── BinderInvocationStub.java
│ │ │ │ │ │ ├── Inject.java
│ │ │ │ │ │ ├── LogInvocation.java
│ │ │ │ │ │ ├── MethodBox.java
│ │ │ │ │ │ ├── MethodInvocationProxy.java
│ │ │ │ │ │ ├── MethodInvocationStub.java
│ │ │ │ │ │ ├── MethodProxy.java
│ │ │ │ │ │ ├── ReplaceCallingPkgMethodProxy.java
│ │ │ │ │ │ ├── ReplaceLastPkgMethodProxy.java
│ │ │ │ │ │ ├── ReplaceLastUidMethodProxy.java
│ │ │ │ │ │ ├── ReplaceSequencePkgMethodProxy.java
│ │ │ │ │ │ ├── ReplaceSpecPkgMethodProxy.java
│ │ │ │ │ │ ├── ReplaceUidMethodProxy.java
│ │ │ │ │ │ ├── ResultStaticMethodProxy.java
│ │ │ │ │ │ ├── SkipInject.java
│ │ │ │ │ │ └── StaticMethodProxy.java
│ │ │ │ │ ├── delegate/
│ │ │ │ │ │ ├── AppInstrumentation.java
│ │ │ │ │ │ ├── ComponentDelegate.java
│ │ │ │ │ │ ├── InstrumentationDelegate.java
│ │ │ │ │ │ ├── PhoneInfoDelegate.java
│ │ │ │ │ │ └── TaskDescriptionDelegate.java
│ │ │ │ │ ├── providers/
│ │ │ │ │ │ ├── DownloadProviderHook.java
│ │ │ │ │ │ ├── ExternalProviderHook.java
│ │ │ │ │ │ ├── InternalProviderHook.java
│ │ │ │ │ │ ├── MediaProviderHook.java
│ │ │ │ │ │ ├── ProviderHook.java
│ │ │ │ │ │ ├── QueryRedirectCursor.java
│ │ │ │ │ │ └── SettingsProviderHook.java
│ │ │ │ │ ├── proxies/
│ │ │ │ │ │ ├── account/
│ │ │ │ │ │ │ └── AccountManagerStub.java
│ │ │ │ │ │ ├── alarm/
│ │ │ │ │ │ │ └── AlarmManagerStub.java
│ │ │ │ │ │ ├── am/
│ │ │ │ │ │ │ ├── ActivityManagerStub.java
│ │ │ │ │ │ │ ├── ActivityTaskManagerStub.java
│ │ │ │ │ │ │ ├── HCallbackStub.java
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── TransactionHandlerStub.java
│ │ │ │ │ │ ├── appops/
│ │ │ │ │ │ │ └── AppOpsManagerStub.java
│ │ │ │ │ │ ├── appwidget/
│ │ │ │ │ │ │ └── AppWidgetManagerStub.java
│ │ │ │ │ │ ├── audio/
│ │ │ │ │ │ │ └── AudioManagerStub.java
│ │ │ │ │ │ ├── backup/
│ │ │ │ │ │ │ └── BackupManagerStub.java
│ │ │ │ │ │ ├── battery/
│ │ │ │ │ │ │ └── BatteryStatsStub.java
│ │ │ │ │ │ ├── bluetooth/
│ │ │ │ │ │ │ └── BluetoothStub.java
│ │ │ │ │ │ ├── clipboard/
│ │ │ │ │ │ │ └── ClipBoardStub.java
│ │ │ │ │ │ ├── connectivity/
│ │ │ │ │ │ │ └── ConnectivityStub.java
│ │ │ │ │ │ ├── content/
│ │ │ │ │ │ │ ├── ContentServiceStub.java
│ │ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ │ ├── context_hub/
│ │ │ │ │ │ │ └── ContextHubServiceStub.java
│ │ │ │ │ │ ├── devicepolicy/
│ │ │ │ │ │ │ └── DevicePolicyManagerStub.java
│ │ │ │ │ │ ├── display/
│ │ │ │ │ │ │ └── DisplayStub.java
│ │ │ │ │ │ ├── dropbox/
│ │ │ │ │ │ │ └── DropBoxManagerStub.java
│ │ │ │ │ │ ├── fingerprint/
│ │ │ │ │ │ │ └── FingerprintManagerStub.java
│ │ │ │ │ │ ├── graphics/
│ │ │ │ │ │ │ └── GraphicsStatsStub.java
│ │ │ │ │ │ ├── imms/
│ │ │ │ │ │ │ └── MmsStub.java
│ │ │ │ │ │ ├── input/
│ │ │ │ │ │ │ ├── InputMethodManagerStub.java
│ │ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ │ ├── isms/
│ │ │ │ │ │ │ └── ISmsStub.java
│ │ │ │ │ │ ├── isub/
│ │ │ │ │ │ │ └── ISubStub.java
│ │ │ │ │ │ ├── job/
│ │ │ │ │ │ │ └── JobServiceStub.java
│ │ │ │ │ │ ├── libcore/
│ │ │ │ │ │ │ ├── LibCoreStub.java
│ │ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ │ ├── location/
│ │ │ │ │ │ │ ├── GPSListenerThread.java
│ │ │ │ │ │ │ ├── GPSStatusListenerThread.java
│ │ │ │ │ │ │ ├── LocationManagerStub.java
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── MockLocationHelper.java
│ │ │ │ │ │ ├── media/
│ │ │ │ │ │ │ ├── router/
│ │ │ │ │ │ │ │ └── MediaRouterServiceStub.java
│ │ │ │ │ │ │ └── session/
│ │ │ │ │ │ │ └── SessionManagerStub.java
│ │ │ │ │ │ ├── mount/
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── MountServiceStub.java
│ │ │ │ │ │ ├── network/
│ │ │ │ │ │ │ └── NetworkManagementStub.java
│ │ │ │ │ │ ├── notification/
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── NotificationManagerStub.java
│ │ │ │ │ │ ├── os/
│ │ │ │ │ │ │ └── DeviceIdentifiersPolicyServiceStub.java
│ │ │ │ │ │ ├── persistent_data_block/
│ │ │ │ │ │ │ └── PersistentDataBlockServiceStub.java
│ │ │ │ │ │ ├── phonesubinfo/
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── PhoneSubInfoStub.java
│ │ │ │ │ │ ├── pm/
│ │ │ │ │ │ │ ├── LauncherAppsStub.java
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── PackageManagerStub.java
│ │ │ │ │ │ ├── power/
│ │ │ │ │ │ │ └── PowerManagerStub.java
│ │ │ │ │ │ ├── restriction/
│ │ │ │ │ │ │ └── RestrictionStub.java
│ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ └── SearchManagerStub.java
│ │ │ │ │ │ ├── shortcut/
│ │ │ │ │ │ │ └── ShortcutServiceStub.java
│ │ │ │ │ │ ├── telephony/
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ ├── TelephonyRegistryStub.java
│ │ │ │ │ │ │ └── TelephonyStub.java
│ │ │ │ │ │ ├── usage/
│ │ │ │ │ │ │ └── UsageStatsManagerStub.java
│ │ │ │ │ │ ├── user/
│ │ │ │ │ │ │ └── UserManagerStub.java
│ │ │ │ │ │ ├── vibrator/
│ │ │ │ │ │ │ └── VibratorStub.java
│ │ │ │ │ │ ├── view/
│ │ │ │ │ │ │ └── AutoFillManagerStub.java
│ │ │ │ │ │ ├── wifi/
│ │ │ │ │ │ │ └── WifiManagerStub.java
│ │ │ │ │ │ ├── wifi_scanner/
│ │ │ │ │ │ │ ├── GhostWifiScannerImpl.java
│ │ │ │ │ │ │ └── WifiScannerStub.java
│ │ │ │ │ │ └── window/
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ ├── WindowManagerStub.java
│ │ │ │ │ │ └── session/
│ │ │ │ │ │ ├── BaseMethodProxy.java
│ │ │ │ │ │ └── WindowSessionPatch.java
│ │ │ │ │ ├── secondary/
│ │ │ │ │ │ ├── HackAppUtils.java
│ │ │ │ │ │ ├── ProxyServiceFactory.java
│ │ │ │ │ │ ├── ServiceConnectionDelegate.java
│ │ │ │ │ │ └── StubBinder.java
│ │ │ │ │ └── utils/
│ │ │ │ │ └── MethodParameterUtils.java
│ │ │ │ ├── interfaces/
│ │ │ │ │ └── IInjector.java
│ │ │ │ ├── ipc/
│ │ │ │ │ ├── ActivityClientRecord.java
│ │ │ │ │ ├── LocalProxyUtils.java
│ │ │ │ │ ├── ProviderCall.java
│ │ │ │ │ ├── ServiceManagerNative.java
│ │ │ │ │ ├── VAccountManager.java
│ │ │ │ │ ├── VActivityManager.java
│ │ │ │ │ ├── VDeviceManager.java
│ │ │ │ │ ├── VJobScheduler.java
│ │ │ │ │ ├── VNotificationManager.java
│ │ │ │ │ ├── VPackageManager.java
│ │ │ │ │ ├── VirtualLocationManager.java
│ │ │ │ │ └── VirtualStorageManager.java
│ │ │ │ ├── natives/
│ │ │ │ │ └── NativeMethods.java
│ │ │ │ └── stub/
│ │ │ │ ├── AmsTask.java
│ │ │ │ ├── ChooseAccountTypeActivity.java
│ │ │ │ ├── ChooseTypeAndAccountActivity.java
│ │ │ │ ├── ChooserActivity.java
│ │ │ │ ├── DaemonJobService.java
│ │ │ │ ├── DaemonService.java
│ │ │ │ ├── ResolverActivity.java
│ │ │ │ ├── ShortcutHandleActivity.java
│ │ │ │ ├── StubActivity.java
│ │ │ │ ├── StubCP.java
│ │ │ │ ├── StubDialog.java
│ │ │ │ ├── StubExcludeFromRecentActivity.java
│ │ │ │ ├── StubJob.java
│ │ │ │ ├── StubPendingActivity.java
│ │ │ │ ├── StubPendingReceiver.java
│ │ │ │ ├── StubPendingService.java
│ │ │ │ └── VASettings.java
│ │ │ ├── helper/
│ │ │ │ ├── ArtDexOptimizer.java
│ │ │ │ ├── ParcelHelper.java
│ │ │ │ ├── PersistenceLayer.java
│ │ │ │ ├── collection/
│ │ │ │ │ ├── ArrayMap.java
│ │ │ │ │ ├── ArraySet.java
│ │ │ │ │ ├── ContainerHelpers.java
│ │ │ │ │ ├── IntArray.java
│ │ │ │ │ ├── MapCollections.java
│ │ │ │ │ ├── SimpleArrayMap.java
│ │ │ │ │ └── SparseArray.java
│ │ │ │ ├── compat/
│ │ │ │ │ ├── AccountManagerCompat.java
│ │ │ │ │ ├── ActivityManagerCompat.java
│ │ │ │ │ ├── ApplicationThreadCompat.java
│ │ │ │ │ ├── BuildCompat.java
│ │ │ │ │ ├── BundleCompat.java
│ │ │ │ │ ├── ContentProviderCompat.java
│ │ │ │ │ ├── ContentResolverCompat.java
│ │ │ │ │ ├── IApplicationThreadCompat.java
│ │ │ │ │ ├── NativeLibraryHelperCompat.java
│ │ │ │ │ ├── ObjectsCompat.java
│ │ │ │ │ ├── PackageParserCompat.java
│ │ │ │ │ ├── ParceledListSliceCompat.java
│ │ │ │ │ ├── StorageManagerCompat.java
│ │ │ │ │ └── SystemPropertiesCompat.java
│ │ │ │ └── utils/
│ │ │ │ ├── ArrayUtils.java
│ │ │ │ ├── AtomicFile.java
│ │ │ │ ├── BitmapUtils.java
│ │ │ │ ├── ClassUtils.java
│ │ │ │ ├── ComponentUtils.java
│ │ │ │ ├── DeviceUtil.java
│ │ │ │ ├── DrawableUtils.java
│ │ │ │ ├── EncodeUtils.java
│ │ │ │ ├── FastXmlSerializer.java
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── MD5Utils.java
│ │ │ │ ├── OSUtils.java
│ │ │ │ ├── Reflect.java
│ │ │ │ ├── ReflectException.java
│ │ │ │ ├── SchedulerTask.java
│ │ │ │ ├── Singleton.java
│ │ │ │ ├── VLog.java
│ │ │ │ ├── XmlSerializerAndParser.java
│ │ │ │ └── marks/
│ │ │ │ ├── FakeDeviceMark.java
│ │ │ │ └── FakeLocMark.java
│ │ │ ├── os/
│ │ │ │ ├── VBinder.java
│ │ │ │ ├── VEnvironment.java
│ │ │ │ ├── VUserHandle.java
│ │ │ │ ├── VUserInfo.java
│ │ │ │ └── VUserManager.java
│ │ │ ├── remote/
│ │ │ │ ├── AppTaskInfo.java
│ │ │ │ ├── BadgerInfo.java
│ │ │ │ ├── InstallResult.java
│ │ │ │ ├── InstalledAppInfo.java
│ │ │ │ ├── PendingIntentData.java
│ │ │ │ ├── PendingResultData.java
│ │ │ │ ├── Problem.java
│ │ │ │ ├── ReceiverInfo.java
│ │ │ │ ├── StubActivityRecord.java
│ │ │ │ ├── SyncInfo.java
│ │ │ │ ├── VDeviceInfo.java
│ │ │ │ ├── VParceledListSlice.java
│ │ │ │ └── vloc/
│ │ │ │ ├── VCell.java
│ │ │ │ ├── VLocation.java
│ │ │ │ └── VWifi.java
│ │ │ └── server/
│ │ │ ├── BinderProvider.java
│ │ │ ├── IJobScheduler.java
│ │ │ ├── ServiceCache.java
│ │ │ ├── accounts/
│ │ │ │ ├── RegisteredServicesParser.java
│ │ │ │ ├── VAccount.java
│ │ │ │ ├── VAccountManagerService.java
│ │ │ │ ├── VContentService.java
│ │ │ │ └── VSyncRecord.java
│ │ │ ├── am/
│ │ │ │ ├── ActivityRecord.java
│ │ │ │ ├── ActivityStack.java
│ │ │ │ ├── AppBindRecord.java
│ │ │ │ ├── AttributeCache.java
│ │ │ │ ├── BroadcastSystem.java
│ │ │ │ ├── ConnectionRecord.java
│ │ │ │ ├── PendingIntents.java
│ │ │ │ ├── ProcessMap.java
│ │ │ │ ├── ProcessRecord.java
│ │ │ │ ├── ServiceRecord.java
│ │ │ │ ├── TaskRecord.java
│ │ │ │ ├── UidSystem.java
│ │ │ │ └── VActivityManagerService.java
│ │ │ ├── device/
│ │ │ │ ├── DeviceInfoPersistenceLayer.java
│ │ │ │ └── VDeviceManagerService.java
│ │ │ ├── job/
│ │ │ │ └── VJobSchedulerService.java
│ │ │ ├── location/
│ │ │ │ └── VirtualLocationService.java
│ │ │ ├── notification/
│ │ │ │ ├── NotificationCompat.java
│ │ │ │ ├── NotificationCompatCompatV14.java
│ │ │ │ ├── NotificationCompatCompatV21.java
│ │ │ │ ├── NotificationFixer.java
│ │ │ │ ├── PendIntentCompat.java
│ │ │ │ ├── ReflectionActionCompat.java
│ │ │ │ ├── RemoteViewsFixer.java
│ │ │ │ ├── VNotificationManagerService.java
│ │ │ │ └── WidthCompat.java
│ │ │ ├── pm/
│ │ │ │ ├── FastImmutableArraySet.java
│ │ │ │ ├── IntentResolver.java
│ │ │ │ ├── PackageCacheManager.java
│ │ │ │ ├── PackagePersistenceLayer.java
│ │ │ │ ├── PackageSetting.java
│ │ │ │ ├── PackageUserState.java
│ │ │ │ ├── PrivilegeAppOptimizer.java
│ │ │ │ ├── ProviderIntentResolver.java
│ │ │ │ ├── VAppManagerService.java
│ │ │ │ ├── VPackageManagerService.java
│ │ │ │ ├── VUserManagerService.java
│ │ │ │ ├── installer/
│ │ │ │ │ ├── FileBridge.java
│ │ │ │ │ ├── PackageHelper.java
│ │ │ │ │ ├── PackageInstallInfo.java
│ │ │ │ │ ├── PackageInstallObserver.java
│ │ │ │ │ ├── PackageInstallerSession.java
│ │ │ │ │ ├── SessionInfo.java
│ │ │ │ │ ├── SessionParams.java
│ │ │ │ │ └── VPackageInstallerService.java
│ │ │ │ └── parser/
│ │ │ │ ├── PackageParserEx.java
│ │ │ │ └── VPackage.java
│ │ │ ├── secondary/
│ │ │ │ ├── BinderDelegateService.java
│ │ │ │ └── FakeIdentityBinder.java
│ │ │ └── vs/
│ │ │ ├── VSConfig.java
│ │ │ ├── VSPersistenceLayer.java
│ │ │ └── VirtualStorageService.java
│ │ └── mirror/
│ │ ├── MethodParams.java
│ │ ├── MethodReflectParams.java
│ │ ├── RefBoolean.java
│ │ ├── RefClass.java
│ │ ├── RefConstructor.java
│ │ ├── RefDouble.java
│ │ ├── RefFloat.java
│ │ ├── RefInt.java
│ │ ├── RefLong.java
│ │ ├── RefMethod.java
│ │ ├── RefObject.java
│ │ ├── RefStaticInt.java
│ │ ├── RefStaticMethod.java
│ │ ├── RefStaticObject.java
│ │ ├── android/
│ │ │ ├── accounts/
│ │ │ │ └── IAccountManager.java
│ │ │ ├── app/
│ │ │ │ ├── Activity.java
│ │ │ │ ├── ActivityManagerNative.java
│ │ │ │ ├── ActivityManagerOreo.java
│ │ │ │ ├── ActivityThread.java
│ │ │ │ ├── ActivityThreadNMR1.java
│ │ │ │ ├── ApplicationThreadNative.java
│ │ │ │ ├── ContextImpl.java
│ │ │ │ ├── ContextImplICS.java
│ │ │ │ ├── ContextImplKitkat.java
│ │ │ │ ├── IActivityManager.java
│ │ │ │ ├── IActivityManagerICS.java
│ │ │ │ ├── IActivityManagerL.java
│ │ │ │ ├── IActivityManagerN.java
│ │ │ │ ├── IActivityTaskManager.java
│ │ │ │ ├── IAlarmManager.java
│ │ │ │ ├── IApplicationThread.java
│ │ │ │ ├── IApplicationThreadICSMR1.java
│ │ │ │ ├── IApplicationThreadJBMR1.java
│ │ │ │ ├── IApplicationThreadKitkat.java
│ │ │ │ ├── IApplicationThreadOreo.java
│ │ │ │ ├── ISearchManager.java
│ │ │ │ ├── IServiceConnectionO.java
│ │ │ │ ├── IUsageStatsManager.java
│ │ │ │ ├── LoadedApk.java
│ │ │ │ ├── LoadedApkHuaWei.java
│ │ │ │ ├── Notification.java
│ │ │ │ ├── NotificationL.java
│ │ │ │ ├── NotificationM.java
│ │ │ │ ├── NotificationManager.java
│ │ │ │ ├── PendingIntentJBMR2.java
│ │ │ │ ├── ServiceStartArgs.java
│ │ │ │ ├── admin/
│ │ │ │ │ └── IDevicePolicyManager.java
│ │ │ │ ├── backup/
│ │ │ │ │ └── IBackupManager.java
│ │ │ │ └── job/
│ │ │ │ ├── IJobScheduler.java
│ │ │ │ ├── JobInfo.java
│ │ │ │ ├── JobParameters.java
│ │ │ │ └── JobWorkItem.java
│ │ │ ├── bluetooth/
│ │ │ │ └── IBluetooth.java
│ │ │ ├── content/
│ │ │ │ ├── BroadcastReceiver.java
│ │ │ │ ├── ClipboardManager.java
│ │ │ │ ├── ClipboardManagerOreo.java
│ │ │ │ ├── ContentProviderClient.java
│ │ │ │ ├── ContentProviderHolderOreo.java
│ │ │ │ ├── ContentProviderNative.java
│ │ │ │ ├── ContentResolver.java
│ │ │ │ ├── ContentResolverJBMR2.java
│ │ │ │ ├── IClipboard.java
│ │ │ │ ├── IContentProvider.java
│ │ │ │ ├── IContentService.java
│ │ │ │ ├── IIntentReceiver.java
│ │ │ │ ├── IIntentReceiverJB.java
│ │ │ │ ├── IRestrictionsManager.java
│ │ │ │ ├── IntentFilter.java
│ │ │ │ ├── SyncAdapterType.java
│ │ │ │ ├── SyncAdapterTypeN.java
│ │ │ │ ├── SyncInfo.java
│ │ │ │ ├── SyncRequest.java
│ │ │ │ ├── pm/
│ │ │ │ │ ├── ApplicationInfoL.java
│ │ │ │ │ ├── ApplicationInfoN.java
│ │ │ │ │ ├── ILauncherApps.java
│ │ │ │ │ ├── IShortcutService.java
│ │ │ │ │ ├── LauncherApps.java
│ │ │ │ │ ├── PackageInstaller.java
│ │ │ │ │ ├── PackageParser.java
│ │ │ │ │ ├── PackageParserJellyBean.java
│ │ │ │ │ ├── PackageParserJellyBean17.java
│ │ │ │ │ ├── PackageParserLollipop.java
│ │ │ │ │ ├── PackageParserLollipop22.java
│ │ │ │ │ ├── PackageParserMarshmallow.java
│ │ │ │ │ ├── PackageParserNougat.java
│ │ │ │ │ ├── PackageParserP28.java
│ │ │ │ │ ├── PackageUserState.java
│ │ │ │ │ ├── ParceledListSlice.java
│ │ │ │ │ ├── ParceledListSliceJBMR2.java
│ │ │ │ │ ├── ShortcutInfo.java
│ │ │ │ │ └── UserInfo.java
│ │ │ │ └── res/
│ │ │ │ ├── AssetManager.java
│ │ │ │ └── CompatibilityInfo.java
│ │ │ ├── ddm/
│ │ │ │ ├── DdmHandleAppName.java
│ │ │ │ └── DdmHandleAppNameJBMR1.java
│ │ │ ├── graphics/
│ │ │ │ └── drawable/
│ │ │ │ └── Icon.java
│ │ │ ├── hardware/
│ │ │ │ ├── display/
│ │ │ │ │ ├── DisplayManagerGlobal.java
│ │ │ │ │ └── IDisplayManager.java
│ │ │ │ ├── fingerprint/
│ │ │ │ │ └── IFingerprintService.java
│ │ │ │ └── location/
│ │ │ │ └── IContextHubService.java
│ │ │ ├── location/
│ │ │ │ ├── ILocationListener.java
│ │ │ │ ├── ILocationManager.java
│ │ │ │ ├── LocationManager.java
│ │ │ │ └── LocationRequestL.java
│ │ │ ├── media/
│ │ │ │ ├── AudioManager.java
│ │ │ │ ├── IAudioService.java
│ │ │ │ ├── IMediaRouterService.java
│ │ │ │ ├── MediaRouter.java
│ │ │ │ └── session/
│ │ │ │ └── ISessionManager.java
│ │ │ ├── net/
│ │ │ │ ├── IConnectivityManager.java
│ │ │ │ ├── NetworkInfo.java
│ │ │ │ └── wifi/
│ │ │ │ ├── IWifiManager.java
│ │ │ │ ├── WifiInfo.java
│ │ │ │ ├── WifiScanner.java
│ │ │ │ └── WifiSsid.java
│ │ │ ├── os/
│ │ │ │ ├── BaseBundle.java
│ │ │ │ ├── Build.java
│ │ │ │ ├── Bundle.java
│ │ │ │ ├── BundleICS.java
│ │ │ │ ├── Handler.java
│ │ │ │ ├── IDeviceIdentifiersPolicyService.java
│ │ │ │ ├── INetworkManagementService.java
│ │ │ │ ├── IPowerManager.java
│ │ │ │ ├── IUserManager.java
│ │ │ │ ├── Message.java
│ │ │ │ ├── Process.java
│ │ │ │ ├── ServiceManager.java
│ │ │ │ ├── StrictMode.java
│ │ │ │ ├── UserHandle.java
│ │ │ │ ├── mount/
│ │ │ │ │ └── IMountService.java
│ │ │ │ └── storage/
│ │ │ │ └── IStorageManager.java
│ │ │ ├── providers/
│ │ │ │ └── Settings.java
│ │ │ ├── renderscript/
│ │ │ │ └── RenderScriptCacheDir.java
│ │ │ ├── rms/
│ │ │ │ └── resource/
│ │ │ │ ├── ReceiverResourceLP.java
│ │ │ │ ├── ReceiverResourceM.java
│ │ │ │ └── ReceiverResourceN.java
│ │ │ ├── service/
│ │ │ │ └── persistentdata/
│ │ │ │ └── IPersistentDataBlockService.java
│ │ │ ├── telephony/
│ │ │ │ ├── CellIdentityCdma.java
│ │ │ │ ├── CellIdentityGsm.java
│ │ │ │ ├── CellInfoCdma.java
│ │ │ │ ├── CellInfoGsm.java
│ │ │ │ ├── CellSignalStrengthCdma.java
│ │ │ │ ├── CellSignalStrengthGsm.java
│ │ │ │ └── NeighboringCellInfo.java
│ │ │ ├── util/
│ │ │ │ └── Singleton.java
│ │ │ ├── view/
│ │ │ │ ├── Display.java
│ │ │ │ ├── HardwareRenderer.java
│ │ │ │ ├── IAutoFillManager.java
│ │ │ │ ├── IGraphicsStats.java
│ │ │ │ ├── IWindowManager.java
│ │ │ │ ├── RenderScript.java
│ │ │ │ ├── SurfaceControl.java
│ │ │ │ ├── ThreadedRenderer.java
│ │ │ │ └── WindowManagerGlobal.java
│ │ │ ├── webkit/
│ │ │ │ ├── IWebViewUpdateService.java
│ │ │ │ └── WebViewFactory.java
│ │ │ └── widget/
│ │ │ ├── RemoteViews.java
│ │ │ └── Toast.java
│ │ ├── com/
│ │ │ └── android/
│ │ │ └── internal/
│ │ │ ├── R_Hide.java
│ │ │ ├── app/
│ │ │ │ ├── IAppOpsService.java
│ │ │ │ └── IBatteryStats.java
│ │ │ ├── appwidget/
│ │ │ │ └── IAppWidgetService.java
│ │ │ ├── content/
│ │ │ │ ├── NativeLibraryHelper.java
│ │ │ │ └── ReferrerIntent.java
│ │ │ ├── os/
│ │ │ │ ├── IDropBoxManagerService.java
│ │ │ │ ├── IVibratorService.java
│ │ │ │ ├── UserManager.java
│ │ │ │ └── health/
│ │ │ │ └── SystemHealthManager.java
│ │ │ ├── policy/
│ │ │ │ └── PhoneWindow.java
│ │ │ ├── telephony/
│ │ │ │ ├── IMms.java
│ │ │ │ ├── IPhoneSubInfo.java
│ │ │ │ ├── ISms.java
│ │ │ │ ├── ISub.java
│ │ │ │ ├── ITelephony.java
│ │ │ │ ├── ITelephonyRegistry.java
│ │ │ │ └── PhoneConstantsMtk.java
│ │ │ └── view/
│ │ │ ├── IInputMethodManager.java
│ │ │ └── inputmethod/
│ │ │ └── InputMethodManager.java
│ │ ├── dalvik/
│ │ │ └── system/
│ │ │ └── VMRuntime.java
│ │ ├── java/
│ │ │ └── lang/
│ │ │ ├── ThreadGroup.java
│ │ │ └── ThreadGroupN.java
│ │ ├── libcore/
│ │ │ └── io/
│ │ │ ├── ForwardingOs.java
│ │ │ ├── Libcore.java
│ │ │ └── Os.java
│ │ └── mirror/
│ │ └── android/
│ │ └── security/
│ │ └── net/
│ │ └── config/
│ │ └── ApplicationConfig.java
│ ├── jni/
│ │ ├── A64Inlinehook/
│ │ │ ├── And64InlineHook.cpp
│ │ │ └── And64InlineHook.hpp
│ │ ├── Android.mk
│ │ ├── Application.mk
│ │ ├── Foundation/
│ │ │ ├── IOUniformer.cpp
│ │ │ ├── IOUniformer.h
│ │ │ ├── Path.cpp
│ │ │ ├── Path.h
│ │ │ ├── SandboxFs.cpp
│ │ │ ├── SandboxFs.h
│ │ │ ├── SymbolFinder.cpp
│ │ │ ├── SymbolFinder.h
│ │ │ ├── VMPatch.cpp
│ │ │ ├── VMPatch.h
│ │ │ ├── fake_dlfcn.cpp
│ │ │ └── fake_dlfcn.h
│ │ ├── Jni/
│ │ │ ├── Helper.h
│ │ │ ├── VAJni.cpp
│ │ │ └── VAJni.h
│ │ ├── Substrate/
│ │ │ ├── Buffer.hpp
│ │ │ ├── CydiaSubstrate.h
│ │ │ ├── SubstrateARM.hpp
│ │ │ ├── SubstrateDebug.cpp
│ │ │ ├── SubstrateDebug.hpp
│ │ │ ├── SubstrateHook.cpp
│ │ │ ├── SubstrateHook.h
│ │ │ ├── SubstrateLog.hpp
│ │ │ ├── SubstratePosixMemory.cpp
│ │ │ ├── SubstrateX86.hpp
│ │ │ ├── hde64.c
│ │ │ ├── hde64.h
│ │ │ └── table64.h
│ │ └── fb/
│ │ ├── Android.mk
│ │ ├── BUCK
│ │ ├── Doxyfile
│ │ ├── assert.cpp
│ │ ├── include/
│ │ │ ├── fb/
│ │ │ │ ├── ALog.h
│ │ │ │ ├── Build.h
│ │ │ │ ├── Countable.h
│ │ │ │ ├── Doxyfile
│ │ │ │ ├── Environment.h
│ │ │ │ ├── ProgramLocation.h
│ │ │ │ ├── RefPtr.h
│ │ │ │ ├── StaticInitialized.h
│ │ │ │ ├── ThreadLocal.h
│ │ │ │ ├── assert.h
│ │ │ │ ├── fbjni/
│ │ │ │ │ ├── Boxed.h
│ │ │ │ │ ├── ByteBuffer.h
│ │ │ │ │ ├── Common.h
│ │ │ │ │ ├── Context.h
│ │ │ │ │ ├── CoreClasses-inl.h
│ │ │ │ │ ├── CoreClasses.h
│ │ │ │ │ ├── Exceptions.h
│ │ │ │ │ ├── File.h
│ │ │ │ │ ├── Hybrid.h
│ │ │ │ │ ├── Iterator-inl.h
│ │ │ │ │ ├── Iterator.h
│ │ │ │ │ ├── JThread.h
│ │ │ │ │ ├── JWeakReference.h
│ │ │ │ │ ├── Meta-forward.h
│ │ │ │ │ ├── Meta-inl.h
│ │ │ │ │ ├── Meta.h
│ │ │ │ │ ├── MetaConvert.h
│ │ │ │ │ ├── NativeRunnable.h
│ │ │ │ │ ├── ReferenceAllocators-inl.h
│ │ │ │ │ ├── ReferenceAllocators.h
│ │ │ │ │ ├── References-forward.h
│ │ │ │ │ ├── References-inl.h
│ │ │ │ │ ├── References.h
│ │ │ │ │ ├── Registration-inl.h
│ │ │ │ │ ├── Registration.h
│ │ │ │ │ └── TypeTraits.h
│ │ │ │ ├── fbjni.h
│ │ │ │ ├── log.h
│ │ │ │ ├── lyra.h
│ │ │ │ ├── noncopyable.h
│ │ │ │ ├── nonmovable.h
│ │ │ │ └── visibility.h
│ │ │ └── jni/
│ │ │ ├── Countable.h
│ │ │ ├── GlobalReference.h
│ │ │ ├── JniTerminateHandler.h
│ │ │ ├── LocalReference.h
│ │ │ ├── LocalString.h
│ │ │ ├── Registration.h
│ │ │ ├── WeakReference.h
│ │ │ └── jni_helpers.h
│ │ ├── jni/
│ │ │ ├── ByteBuffer.cpp
│ │ │ ├── Countable.cpp
│ │ │ ├── Environment.cpp
│ │ │ ├── Exceptions.cpp
│ │ │ ├── Hybrid.cpp
│ │ │ ├── LocalString.cpp
│ │ │ ├── OnLoad.cpp
│ │ │ ├── References.cpp
│ │ │ ├── WeakReference.cpp
│ │ │ ├── android/
│ │ │ │ ├── CpuCapabilities.cpp
│ │ │ │ └── ReferenceChecking.cpp
│ │ │ ├── fbjni.cpp
│ │ │ ├── java/
│ │ │ │ ├── BUCK
│ │ │ │ ├── CppException.java
│ │ │ │ ├── CppSystemErrorException.java
│ │ │ │ └── UnknownCppException.java
│ │ │ └── jni_helpers.cpp
│ │ ├── log.cpp
│ │ ├── lyra/
│ │ │ └── lyra.cpp
│ │ └── onload.cpp
│ └── res/
│ ├── layout/
│ │ ├── app_not_authorized.xml
│ │ ├── choose_account_row.xml
│ │ ├── choose_account_type.xml
│ │ ├── choose_type_and_account.xml
│ │ ├── custom_notification.xml
│ │ ├── custom_notification_lite.xml
│ │ └── resolve_list_item.xml
│ ├── values/
│ │ ├── dimens.xml
│ │ ├── integer.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ ├── values-ru/
│ │ └── strings.xml
│ └── values-uk/
│ └── strings.xml
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # replace
patreon: weishu
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: http://paypal.me/virtualxposed
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_cn.md
================================================
---
name: BUG反馈
about: 中文BUG反馈
---
**反馈BUG之前,先issue里面搜看看有没有别人已经反馈过,重复的不予处理!!**
## 问题描述
(请尽量详细地描述你遇到的问题)
## 复现步骤
(请分步骤描述如何复现这个BUG,非毕现BUG请给出如何能大概率复现的步骤)
## 环境
机型:
系统版本:
ROM版本:(请区分内测版和开发版稳定版,除稳定版本外不予修复)
Xposed 插件以及插件版本:
VirtualXposed版本:
## 补充
(别的需要描述的内容)
**写完之后,请自己再读一遍自己写的,如果你自己都读不懂,就不用说修复了**
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request_cn.md
================================================
---
name: 意见和建议
about: Feature中文版
---
**BUG反馈请不要用这个模版,否则直接关闭!!**
## 场景描述
(请详细和精确地表述你的使用场景)
## 希望的解决方案
(你希望如何解决这个问题?)
## 其他信息
(其他你认为有用的信息)
================================================
FILE: .github/issue-close-app.yml
================================================
# Comment that will be sent if an issue is judged to be closed
comment: "This issue is closed because it does not meet our issue template/为方便解决问题,请使用 issue 模版提交问题。"
issueConfigs:
# There can be several configs for different kind of issues.
- content:
# Example 1: bug report
- "Expected behavior"
- "To Reproduce"
- "Describe the bug"
- content:
# Example 2: feature request
- "Describe the solution you'd like"
- content:
- "问题描述"
- "复现步骤"
- "环境"
- content:
- "场景描述"
- "希望的解决方案"
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 20
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- bug
- security
# Label to use when marking an issue as stale
staleLabel: wontfix
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
================================================
FILE: .github/workflows/android.yml
================================================
name: Android CI
on: [pull_request, push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Checkout submodules
uses: srt32/git-actions@v0.0.3
with:
args: git submodule update --init --recursive
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Gradle
run: cd VirtualApp && ./gradlew assembleRelease
- name: ls
run: ls
- name: Archive production artifacts
uses: actions/upload-artifact@v1
with:
name: compiled
path: VirtualApp/app/build/
================================================
FILE: .gitignore
================================================
# Built application files
*.apk
*.ap_
# Files for the ART/Dalvik VM
*.dex
.idea
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# Intellij
*.iml
.idea/workspace.xml
# Keystore files
*.jks
================================================
FILE: .gitmodules
================================================
[submodule "VirtualApp/launcher"]
path = VirtualApp/launcher
url = https://github.com/android-hacker/Launcher3.git
================================================
FILE: .travis.yml
================================================
language: android
android:
components:
- tools
- build-tools-28.0.3
- android-27
- android-28
- extra-android-m2repository
- extra-android-support
install:
- echo y | sdkmanager 'ndk-bundle'
- echo y | sdkmanager 'cmake;3.6.4111459'
- echo y | sdkmanager 'lldb;3.0'
before_install:
- chmod +x ./VirtualApp/gradlew
script:
- cd VirtualApp
- ./gradlew assembleRelease
================================================
FILE: CHINESE.md
================================================
[](https://travis-ci.org/android-hacker/VirtualXposed)
简介
-----
**VirtualXposed** 是基于[VirtualApp](https://github.com/asLody/VirtualApp) 和 [epic](https://github.com/tiann/epic) 在**非ROOT**环境下运行Xposed模块的实现(支持5.0~10.0)。
与 Xposed 相比,目前 VirtualXposed 有两个限制:
1. 不支持修改系统(可以修改普通APP中对系统API的调用),因此重力工具箱,应用控制器等无法使用。
2. 暂不支持资源HOOK,因此资源钩子不会起任何作用;使用资源HOOK的模块,相应的功能不会生效。
警告
-------
本项目使用的 VirtualApp 不允许用于商业用途,并且其内部的 VirtualApp 版本已经过时,如果有这个需求,为了贵公司的长期稳定发展,请使用商业授权,联系 Lody (imlody@foxmail.com)即可。
使用
----------
## 准备
首先在 [发布页面](https://github.com/android-hacker/VirtualXposed/releases) 下载最新的VAExposed安装包安装到手机。
## 安装模块
打开 VirtualXposed,在里面安装要使用的APP,以及相应的Xposed模块即可。
注意:**所有的工作(安装Xposed模块,安装APP)必须在 VirtualXposed中**进行,否则Xposed模块不会有任何作用!比如,将微信直接安装在系统上(而非VirtualXposed中),防撤回安装在VirtualXposed中;或者把微信安装在VirtualXposed上,防撤回插件直接安装在系统上;或者两者都直接安装在系统上,**均不会起任何作用**。
在VirtualXposed中安装App有两种方式:
1. 直接复制已经在系统中安装好的APP,比如如果你系统中装了微信,那么可以直接复制一份。
2. 通过外置存储直接安装APK文件;点主界面的底部按钮-添加应用,然后选择后面两个TAB即可。
在VirtualXposed中安装Xposed模块,可以跟安装正常的APK一样,以上两种安装App的方式也适用于安装Xposed模块。不过,你也可以通过VirtualXposed中内置的XposedInstaller来安装和管理模块,跟通常的XposedInstaller使用方式一样;去下载页面,下载安装即可。
## 亲测可用的模块
- [XPrivacyLua][xpl]: Really simple to use privacy manager for Android 6.0 Marshmallow and later.
- [XInsta][xinsta]: Instagram module(Feed downing, stories downloading, etc).
- [Minminguard][minminguard]: Completely remove both the ads inside apps and the empty space caused by those ads.
- [YouTube AdAway][yta]: Get rid of ads on the official YouTube App.
- [微X模块][wx]: 微信模块,功能强大。
- [畅玩微信][cwwx]: 微信模块新秀,功能丰富。
- [微信巫师][wxws]: 微信模块,项目开源,代码优秀。
- [MDWechat][mdwechat]: 微信美化模块,可以把微信整成MD风格。
- [应用变量][yybl]: 可以用来进行机型修改,比如王者荣耀高帧率;QQ空间修改小尾巴等。
- [音量增强器][ylzqq]: 网易云音乐模块,非常好用,低调。
- [微信学英语][wxxyy]: 自动把微信消息翻译为英语,非常实用。
- [情迁抢包][qqqb]: 微信QQ抢红包模块。
- [微信跳一跳助手][ttzs]: 微信跳一跳游戏辅助模块。
- [步数修改器][bsxg]: 运动步数修改模块。
- [模拟位置][mnwz]: 虚拟定位模块,稳定好用。
- [指纹支付][zwzf]: 对不支持指纹支付但系统本身有指纹的手机开启指纹支付的模块。
- [QQ精简模块 2.0][qqjj]: QQ模块,不仅可以精简QQ,还能防撤回,防闪照。
- [微信增强插件][wxzqcj]: 微信模块,VXP内最稳定的微信模块;如无特殊需求建议用这个。
- [QX模块][qx]: QQ模块,防撤回抢红包斗图一应俱全。
- [QQ斗图神器][qqdtsq]: 各种表情,斗图神器。
- [微信斗图神器][wxdtsq]: 斗图神器,微信用的。
- [大圣净化][dsjh]: 去广告神器,推荐使用。
真正能用的模块远不止这么多,要用的话可以自己测试;如果你发现某些模块可以用但不在上面的列表中,欢迎给我发个PR。
其他
-------
### GameGuardian
VirtualXposed也支持GG修改器,如果你需要用GG,那么请使用GG专版(可以在发布页面下载,带 For_GameGuardian后缀)。
[GG修改器使用视频教程](https://gameguardian.net/forum/gallery/image/437-no-root-via-virtualxposed-without-error-105-gameguardian/)
### VirusTotal
VirusTotal 还有一些其他的杀毒引擎检测到VirtualXposed有病毒,这一点我该不承认,而且我觉得这些愚蠢的杀毒引擎是在胡扯。请看[我的说明](https://github.com/android-hacker/VirtualXposed/issues/10).
而且,VirtualXposed是开源的,你可以直接查看代码;我可以打包票,VirtualXposed本身没有做任何有害的事情(但是它确实有这个能力,所以请不要下载不明来源的Xposed插件)。
如果你还是不放心,那么你可以使用 [0.8.7版本](https://github.com/android-hacker/VirtualXposed/releases/tag/0.8.7), 这个版本杀毒引擎的检测结果是安全的(简直就是扯淡)。
支持和加入
------------
目前VirtualXposed 还不完善,如果你对非ROOT下实现Xposed感兴趣;欢迎加入!你可以通过如下方式来支持:
1. 直接贡献代码,提供Feature,修复BUG!
2. 使用你拥有的手机,安装你常用的Xposed模块,反馈不可用情况;协助帮忙解决兼容性问题!
3. 提出体验上,功能上的建议,帮助完善VirtualXposed!
致谢
------
1. [VirtualApp](https://github.com/asLody/VirtualApp)
2. [Xposed](https://github.com/rovo89/Xposed)
[wx]: http://repo.xposed.info/module/com.fkzhang.wechatxposed
[qx]: http://repo.xposed.info/module/com.fkzhang.qqxposed
[wxws]: https://github.com/Gh0u1L5/WechatMagician/releases
[yybl]: https://www.coolapk.com/apk/com.sollyu.xposed.hook.model
[ylzqq]: https://github.com/bin456789/Unblock163MusicClient-Xposed/releases
[wxxyy]: https://www.coolapk.com/apk/com.hiwechart.translate
[qqqb]: http://repo.xposed.info/module/cn.qssq666.redpacket
[ttzs]: http://repo.xposed.info/module/com.emily.mmjumphelper
[mnwz]: https://www.coolapk.com/apk/com.rong.xposed.fakelocation
[zwzf]: https://github.com/android-hacker/Xposed-Fingerprint-pay/releases
[bsxg]: https://www.coolapk.com/apk/com.specher.sm
[mdwechat]: https://github.com/Blankeer/MDWechat
[wxzqcj]:https://github.com/firesunCN/WechatEnhancement
[qqjj]: https://www.coolapk.com/apk/me.zpp0196.qqsimple
[qqdtsq]: https://www.coolapk.com/apk/x.hook.qqemoji
[wxdtsq]: https://www.coolapk.com/apk/x.hook.emojihook
[dsjh]: https://wiki.ad-gone.com/archives/32
[xpl]: https://github.com/android-hacker/VirtualXposed/wiki/Privacy-control(XPrivacyLua)
[minminguard]: http://repo.xposed.info/module/tw.fatminmin.xposed.minminguard
[yta]: http://repo.xposed.info/module/ma.wanam.youtubeadaway
[xinsta]: http://repo.xposed.info/module/com.ihelp101.instagram
[cwwx]: http://repo.xposed.info/module/com.example.wx_plug_in3
================================================
FILE: LICENSE.txt
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://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 <http://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
<http://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
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
[](https://travis-ci.org/android-hacker/VirtualXposed)
[中文文档](CHINESE.md "中文")
Introduction
------------
**VirtualXposed** is a simple App based on [VirtualApp](https://github.com/asLody/VirtualApp) and [epic](https://github.com/tiann/epic) that allows you to use an Xposed Module without needing to root, unlock the bootloader, or flash a custom system image. (Supports Android 5.0~10.0)
The only two restriction of VirtualXposed are:
1. Unable to modify system, so any Module which modifies system won't be able to work properly.
2. Currently resource hooks are not supported. (Theming modules use Resource Hooks).
Warning
-----------
Usage for Commercial Purposes are not allowed!!! Please refer to VirtualApp's [declaration](https://github.com/asLody/VirtualApp).
Usage
-------
### Preparation
Download the latest APK from the [release page](https://github.com/android-hacker/VirtualXposed/releases), and install it on your Android device.
### Install APP and Xposed Module
Open VirtualXposed, Click on the **Drawer Button** at the bottom of home page(Or long click the screen), add your desired APP and Xposed Module to VirtualXposed's virtual environment.
Note: **All operations(installation of Xposed Module, APP)must be done in VirtualXposed**, otherwise the Xposed Module installed won't take effect. For example, if you install the YouTube app on your system (Your phone's original system, not in VirtualXposed), and then install YouTube AdAway (A YouTube Xposed Module) in VirtualXposed; or you install YouTube in VirtualXposed, and install YouTube AdAway on original system; or both of them are installed on original system, **neither of these three cases will work!**

There are three ways to install an APP or Xposed Module to VirtualXposed:
1. **Clone an installed app from your original system.** (Click Button at bottom of home page, then click Add App, the first page shows a list of installed apps.)
2. **Install via an APK file.** (Click Button at bottom of home page, then click Add App, the second page shows APKs found in your sdcard)
3. **Install via an external file chooser.** (Click Button at bottom of home page, then click Add App, use the floating action button to choose an APK file to install)
For Xposed Module, You can install it from Xposed Installer, too.
### Activate the Xposed Module
Open Xposed Installer in VirtualXposed, go to the module fragment, check the module you want to use:

### Reboot
You only need to reboot VirtualXposed, **There's no need to reboot your phone**; Just click Settings in home page of VirtualXposed, click `Reboot` button, and VirtualXposed will reboot in a blink.

Supported Modules
-------------------------
Almost all modules except system-relevant are supported, please try it by yourself :)
Others
-------
### GameGuardian
VirtualXposed also supports GameGuardian, **you should use the separate version for GameGuardian**.(Download it in release page).
[Video Tutorial](https://gameguardian.net/forum/gallery/image/437-no-root-via-virtualxposed-without-error-105-gameguardian/)
### VirusTotal
VirusTotal might report VirtualXposed as a malware, it is stupid, you can refer to my [explanation](https://github.com/android-hacker/VirtualXposed/issues/10).
And obviously, VirtualXposed is open source, so you can refer to the source code. I am sure that it is safe to use.
If you still couldn't believe in me, you can install version [0.8.7](https://github.com/android-hacker/VirtualXposed/releases/tag/0.8.7); VirusTotal reports this version as safe.
Support
-----------
Contributions to VirtualXposed are always welcomed!!
For Developers
--------------
- [File a bug](https://github.com/android-hacker/exposed/issues)
- [Wiki](https://github.com/android-hacker/VirtualXposed/wiki)
- [Telegram](https://t.me/vxp_devs)
Credits
-------
1. [VirtualApp](https://github.com/asLody/VirtualApp)
2. [Xposed](https://github.com/rovo89/Xposed)
3. [And64InlineHook](https://github.com/Rprop/And64InlineHook)
================================================
FILE: VirtualApp/.gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.idea
.DS_Store
/build
/captures
================================================
FILE: VirtualApp/app/.gitignore
================================================
/build
================================================
FILE: VirtualApp/app/build.gradle
================================================
apply plugin: 'com.android.application'
Properties properties = new Properties()
def localProp = file(project.rootProject.file('local.properties'))
if (localProp.exists()) {
properties.load(localProp.newDataInputStream())
}
def keyFile = file(properties.getProperty("keystore.path") ?: "/tmp/does_not_exist")
android {
signingConfigs {
config {
keyAlias properties.getProperty("keystore.alias")
keyPassword properties.getProperty("keystore.pwd")
storeFile keyFile
storePassword properties.getProperty("keystore.alias_pwd")
}
}
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "io.va.exposed64"
minSdkVersion 21
targetSdkVersion 23
versionCode 220
versionName "0.22.0"
multiDexEnabled false
android {
defaultConfig {
ndk {
abiFilters "arm64-v8a", "x86_64"
}
}
}
}
// https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html?utm_source=android-studio
flavorDimensions 'main'
productFlavors {
aosp {
dimension 'main'
//matchingFallbacks ['aosp']
if (keyFile.exists()) {
signingConfig signingConfigs.config
}
}
fdroid {
dimension 'main'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
buildTypes {
release {
minifyEnabled false
debuggable false
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation project(':lib')
implementation project(':launcher')
//Android Lib
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
//Promise Support
implementation 'org.jdeferred:jdeferred-android-aar:1.2.4'
// ThirdParty
implementation 'com.jonathanfinerty.once:once:1.0.3'
def appCenterSdkVersion = '3.0.0'
aospImplementation("com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}")
aospImplementation("com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}")
implementation 'com.kyleduo.switchbutton:library:1.4.6'
implementation 'com.allenliu.versionchecklib:library:1.8.3'
implementation 'com.github.medyo:android-about-page:1.2.2'
implementation 'moe.feng:AlipayZeroSdk:1.1'
//Glide
implementation ('com.github.bumptech.glide:glide:4.8.0') {
exclude(group: "com.android.support")
}
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
}
================================================
FILE: VirtualApp/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/lody/Desktop/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
-keep class com.amap.api.maps.**{*;}
-keep class com.autonavi.**{*;}
-keep class com.amap.api.trace.**{*;}
#定位
-keep class com.amap.api.location.**{*;}
-keep class com.amap.api.fence.**{*;}
-keep class com.autonavi.aps.amapapi.model.**{*;}
#搜索
-keep class com.amap.api.services.**{*;}
#2D地图
-keep class com.amap.api.maps2d.**{*;}
-keep class com.amap.api.mapcore2d.**{*;}
#导航
-keep class com.amap.api.navi.**{*;}
-keep class com.autonavi.**{*;}
##--Glide--
-keep class com.bumptech.glide.**{*;}
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
================================================
FILE: VirtualApp/app/src/aosp/java/io/virtualapp/delegate/MyCrashHandler.java
================================================
package io.virtualapp.delegate;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.util.Log;
import com.lody.virtual.client.VClientImpl;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.os.VUserHandle;
import com.lody.virtual.remote.InstalledAppInfo;
import com.microsoft.appcenter.crashes.Crashes;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author weishu
* @date 2019/2/25.
*/
public class MyCrashHandler extends BaseCrashHandler {
private static final String CRASH_SP = "vxp_crash";
private static final String KEY_LAST_CRASH_TIME = "last_crash_time";
private static final String KEY_LAST_CRASH_TYPE = "last_crash_type";
@Override
public void handleUncaughtException(Thread t, Throwable e) {
SharedPreferences sp = VirtualCore.get().getContext().getSharedPreferences(CRASH_SP, Context.MODE_MULTI_PROCESS);
Map<String, String> properties = new HashMap<>();
try {
ApplicationInfo currentApplicationInfo = VClientImpl.get().getCurrentApplicationInfo();
if (currentApplicationInfo != null) {
String packageName = currentApplicationInfo.packageName;
String processName = currentApplicationInfo.processName;
properties.put("process", processName);
properties.put("package", packageName);
int userId = VUserHandle.myUserId();
properties.put("uid", String.valueOf(userId));
InstalledAppInfo installedAppInfo = VirtualCore.get().getInstalledAppInfo(packageName, 0);
if (installedAppInfo != null) {
PackageInfo packageInfo = installedAppInfo.getPackageInfo(userId);
if (packageInfo != null) {
String versionName = packageInfo.versionName;
int versionCode = packageInfo.versionCode;
properties.put("versionName", versionName);
properties.put("versionCode", String.valueOf(versionCode));
}
}
}
} catch (Throwable ignored) {
}
final String exceptionType = e.getClass().getName();
final long now = System.currentTimeMillis();
final long lastCrash = sp.getLong(KEY_LAST_CRASH_TIME, 0);
final String lastCrashType = sp.getString(KEY_LAST_CRASH_TYPE, null);
if (exceptionType.equals(lastCrashType) && (now - lastCrash) < TimeUnit.MINUTES.toMillis(1)) {
// continues crash, do not upload
} else {
Crashes.trackError(e, properties, null);
}
Log.i(TAG, "uncaught :" + t, e);
// must commit.
sp.edit().putLong(KEY_LAST_CRASH_TIME, now).putString(KEY_LAST_CRASH_TYPE, exceptionType).commit();
super.handleUncaughtException(t, e);
}
}
================================================
FILE: VirtualApp/app/src/aosp/java/io/virtualapp/delegate/MyVirtualInitializer.java
================================================
package io.virtualapp.delegate;
import android.app.Application;
import com.lody.virtual.client.core.VirtualCore;
import com.microsoft.appcenter.AppCenter;
import com.microsoft.appcenter.analytics.Analytics;
import com.microsoft.appcenter.crashes.Crashes;
/**
* @author weishu
* @date 2019/2/25.
*/
public class MyVirtualInitializer extends BaseVirtualInitializer {
public MyVirtualInitializer(Application application, VirtualCore core) {
super(application, core);
}
@Override
public void onMainProcess() {
AppCenter.start(application, "bf5e74bd-3795-49bd-95c8-327db494dd11",
Analytics.class, Crashes.class);
super.onMainProcess();
}
@Override
public void onVirtualProcess() {
// For Crash statics
AppCenter.start(application, "bf5e74bd-3795-49bd-95c8-327db494dd11",
Analytics.class, Crashes.class);
super.onVirtualProcess();
// Override
virtualCore.setCrashHandler(new MyCrashHandler());
}
}
================================================
FILE: VirtualApp/app/src/fdroid/java/io/virtualapp/delegate/MyVirtualInitializer.java
================================================
package io.virtualapp.delegate;
import android.app.Application;
import com.lody.virtual.client.core.VirtualCore;
/**
* @author weishu
* @date 2019/2/25.
*/
public class MyVirtualInitializer extends BaseVirtualInitializer {
public MyVirtualInitializer(Application application, VirtualCore core) {
super(application, core);
}
}
================================================
FILE: VirtualApp/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="io.virtualapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-sdk tools:overrideLibrary="com.android.launcher3,android.support.dynamicanimation" />
<application
android:name=".XApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/vxp"
android:theme="@style/LauncherTheme"
tools:replace="android:icon,android:label">
<meta-data
android:name="android.max_aspect"
android:value="2.3"
tools:replace="android:value" />
<meta-data
android:name="android.support.VERSION"
android:value="com.android.support:design:25.4.0"
tools:replace="android:value" />
<activity
android:name=".splash.SplashActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".home.ListAppActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity
android:name=".home.LoadingActivity"
android:excludeFromRecents="true"
android:noHistory="true"
android:screenOrientation="portrait"
android:taskAffinity="va.task.loading"
android:theme="@style/TransparentTheme" />
<activity
android:name=".settings.AboutActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity android:name=".home.NewHomeActivity" />
<activity
android:name=".settings.SettingsActivity"
android:label="@string/settings_title"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Material.Light" />
<activity
android:name=".settings.RecommendPluginActivity"
android:label="@string/settings_plugin_recommend"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light" />
<activity
android:name=".settings.AppManageActivity"
android:label="@string/settings_app_manage_text"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light" />
<activity
android:name=".settings.TaskManageActivity"
android:label="@string/settings_task_manage_text"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light" />
<activity
android:name=".sys.ShareBridgeActivity"
android:configChanges="keyboard|keyboardHidden|orientation"
android:excludeFromRecents="true"
android:label="@string/shared_to_vxp"
android:screenOrientation="portrait"
android:taskAffinity="${applicationId}.share"
android:theme="@style/Theme.AppCompat.Light.Dialog">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".sys.InstallerActivity"
android:allowTaskReparenting="true"
android:configChanges="keyboard|keyboardHidden|orientation"
android:excludeFromRecents="true"
android:exported="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_installer_label"
android:noHistory="true"
android:taskAffinity="${applicationId}.installer"
android:theme="@style/Theme.AppCompat.Light" />
<activity-alias
android:name="vxp.installer"
android:enabled="true"
android:exported="true"
android:targetActivity=".sys.InstallerActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="file" />
<data android:mimeType="application/vnd.android.package-archive" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="application/vnd.android.package-archive" />
</intent-filter>
</activity-alias>
<activity-alias
android:name="vxp.launcher"
android:enabled="false"
android:exported="true"
android:targetActivity=".home.NewHomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY" />
<category android:name="android.intent.category.LAUNCHER_APP" />
</intent-filter>
</activity-alias>
<service
android:name=".update.VAVersionService"
android:enabled="true"
android:exported="true" />
<receiver
android:name=".dev.CmdReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="${applicationId}.CMD" />
</intent-filter>
</receiver>
</application>
</manifest>
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/VCommends.java
================================================
package io.virtualapp;
/**
* @author Lody
*/
public class VCommends {
public static final String TAG_NEW_VERSION = "First launch new Version";
public static final String TAG_SHOW_ADD_APP_GUIDE = "Should show add app guide";
public static final int REQUEST_SELECT_APP = 5;
public static final String EXTRA_APP_INFO_LIST = "va.extra.APP_INFO_LIST";
public static final String TAG_ASK_INSTALL_GMS = "va.extra.ASK_INSTALL_GMS";
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/XApp.java
================================================
package io.virtualapp;
import android.app.Application;
import android.content.Context;
import android.os.Build;
import com.lody.virtual.client.NativeEngine;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.stub.VASettings;
import io.virtualapp.delegate.MyVirtualInitializer;
/**
* @author Lody
*/
public class XApp extends Application {
private static final String TAG = "XApp";
public static final String XPOSED_INSTALLER_PACKAGE = "de.robv.android.xposed.installer";
private static XApp gApp;
public static XApp getApp() {
return gApp;
}
@Override
protected void attachBaseContext(Context base) {
gApp = this;
super.attachBaseContext(base);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
NativeEngine.disableJit(Build.VERSION.SDK_INT);
}
VASettings.ENABLE_IO_REDIRECT = true;
VASettings.ENABLE_INNER_SHORTCUT = false;
try {
VirtualCore.get().startup(base);
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onCreate() {
super.onCreate();
VirtualCore virtualCore = VirtualCore.get();
virtualCore.initialize(new MyVirtualInitializer(this, virtualCore));
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/BasePresenter.java
================================================
package io.virtualapp.abs;
/**
* @author Lody
*/
public interface BasePresenter {
void start();
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/BaseView.java
================================================
package io.virtualapp.abs;
import android.app.Activity;
import android.content.Context;
/**
* @author Lody
*/
public interface BaseView<T> {
Activity getActivity();
Context getContext();
void setPresenter(T presenter);
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/Callback.java
================================================
package io.virtualapp.abs;
/**
* @author Lody
*/
public interface Callback<T> {
void callback(T result);
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VActivity.java
================================================
package io.virtualapp.abs.ui;
import android.app.Activity;
import android.content.Context;
import android.support.annotation.IdRes;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import org.jdeferred.android.AndroidDeferredManager;
import io.virtualapp.abs.BaseView;
/**
* @author Lody
*/
public class VActivity extends AppCompatActivity {
/**
* Implement of {@link BaseView#getActivity()}
*/
public Activity getActivity() {
return this;
}
/**
* Implement of {@link BaseView#getContext()} ()}
*/
public Context getContext() {
return this;
}
protected AndroidDeferredManager defer() {
return VUiKit.defer();
}
public Fragment findFragmentById(@IdRes int id) {
return getSupportFragmentManager().findFragmentById(id);
}
public void replaceFragment(@IdRes int id, Fragment fragment) {
getSupportFragmentManager().beginTransaction().replace(id, fragment).commit();
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
super.onStop();
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VFragment.java
================================================
package io.virtualapp.abs.ui;
import org.jdeferred.android.AndroidDeferredManager;
import android.app.Activity;
import android.support.v4.app.Fragment;
import io.virtualapp.abs.BasePresenter;
/**
* @author Lody
*/
public class VFragment<T extends BasePresenter> extends Fragment {
protected T mPresenter;
public T getPresenter() {
return mPresenter;
}
public void setPresenter(T presenter) {
this.mPresenter = presenter;
}
protected AndroidDeferredManager defer() {
return VUiKit.defer();
}
public void finishActivity() {
Activity activity = getActivity();
if (activity != null) {
activity.finish();
}
}
public void destroy() {
finishActivity();
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VUiKit.java
================================================
package io.virtualapp.abs.ui;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.TypedValue;
import org.jdeferred.android.AndroidDeferredManager;
/**
* @author Lody
* <p>
* A set of tools for UI.
*/
public class VUiKit {
private static final AndroidDeferredManager gDM = new AndroidDeferredManager();
private static final Handler gUiHandler = new Handler(Looper.getMainLooper());
public static AndroidDeferredManager defer() {
return gDM;
}
public static int dpToPx(Context context, int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
context.getResources().getDisplayMetrics());
}
public static void post(Runnable r) {
gUiHandler.post(r);
}
public static void postDelayed(long delay, Runnable r) {
gUiHandler.postDelayed(r, delay);
}
public static void sleep(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/BaseCrashHandler.java
================================================
package io.virtualapp.delegate;
import android.annotation.SuppressLint;
import android.os.Looper;
import android.util.Log;
import com.lody.virtual.client.core.CrashHandler;
/**
* author: weishu on 18/3/10.
*/
public class BaseCrashHandler implements CrashHandler {
protected static final String TAG = "XApp";
@SuppressLint("ApplySharedPref")
@Override
public void handleUncaughtException(Thread t, Throwable e) {
if (t == Looper.getMainLooper().getThread()) {
System.exit(0);
} else {
Log.e(TAG, "ignore uncaught exception of sub thread: " + t);
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/BaseVirtualInitializer.java
================================================
package io.virtualapp.delegate;
import android.app.Application;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.os.VEnvironment;
import jonathanfinerty.once.Once;
import me.weishu.exposed.LogcatService;
import static io.virtualapp.XApp.XPOSED_INSTALLER_PACKAGE;
/**
* @author weishu
* @date 2019/2/25.
*/
public class BaseVirtualInitializer extends VirtualCore.VirtualInitializer {
protected Application application;
protected VirtualCore virtualCore;
public BaseVirtualInitializer(Application application, VirtualCore core) {
this.application = application;
this.virtualCore = core;
}
@Override
public void onMainProcess() {
Once.initialise(application);
}
@Override
public void onVirtualProcess() {
virtualCore.setCrashHandler(new BaseCrashHandler());
//listener components
virtualCore.setComponentDelegate(new MyComponentDelegate());
//fake phone imei,macAddress,BluetoothAddress
virtualCore.setPhoneInfoDelegate(new MyPhoneInfoDelegate());
//fake task description's icon and title
virtualCore.setTaskDescriptionDelegate(new MyTaskDescDelegate());
// ensure the logcat service alive when every virtual process start.
LogcatService.start(application, VEnvironment.getDataUserPackageDirectory(0, XPOSED_INSTALLER_PACKAGE));
}
@Override
public void onServerProcess() {
virtualCore.setAppRequestListener(new MyAppRequestListener(application));
virtualCore.addVisibleOutsidePackage("com.tencent.mobileqq");
virtualCore.addVisibleOutsidePackage("com.tencent.mobileqqi");
virtualCore.addVisibleOutsidePackage("com.tencent.minihd.qq");
virtualCore.addVisibleOutsidePackage("com.tencent.qqlite");
virtualCore.addVisibleOutsidePackage("com.facebook.katana");
virtualCore.addVisibleOutsidePackage("com.whatsapp");
virtualCore.addVisibleOutsidePackage("com.tencent.mm");
virtualCore.addVisibleOutsidePackage("com.immomo.momo");
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/MyAppRequestListener.java
================================================
package io.virtualapp.delegate;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.Toast;
import com.lody.virtual.client.core.VirtualCore;
import java.io.File;
import io.virtualapp.sys.InstallerActivity;
/**
* @author Lody
*/
public class MyAppRequestListener implements VirtualCore.AppRequestListener {
private final Context context;
public MyAppRequestListener(Context context) {
this.context = context;
}
@Override
public void onRequestInstall(String path) {
try {
Intent t = new Intent(context, InstallerActivity.class);
t.setDataAndType(Uri.fromFile(new File(path)), "application/vnd.android.package-archive");
t.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(t);
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onRequestUninstall(String pkg) {
Toast.makeText(context, "Uninstall: " + pkg, Toast.LENGTH_SHORT).show();
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/MyComponentDelegate.java
================================================
package io.virtualapp.delegate;
import android.app.Activity;
import android.app.Application;
import android.content.Intent;
import com.lody.virtual.client.hook.delegate.ComponentDelegate;
import com.lody.virtual.helper.utils.Reflect;
import java.io.File;
public class MyComponentDelegate implements ComponentDelegate {
@Override
public void beforeApplicationCreate(Application application) {
}
@Override
public void afterApplicationCreate(Application application) {
}
@Override
public void beforeActivityCreate(Activity activity) {
}
@Override
public void beforeActivityResume(Activity activity) {
}
@Override
public void beforeActivityPause(Activity activity) {
}
@Override
public void beforeActivityDestroy(Activity activity) {
}
@Override
public void afterActivityCreate(Activity activity) {
}
@Override
public void afterActivityResume(Activity activity) {
}
@Override
public void afterActivityPause(Activity activity) {
}
@Override
public void afterActivityDestroy(Activity activity) {
}
@Override
public void onSendBroadcast(Intent intent) {
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/MyPhoneInfoDelegate.java
================================================
package io.virtualapp.delegate;
import com.lody.virtual.client.hook.delegate.PhoneInfoDelegate;
/**
* Fake the Device ID.
*/
public class MyPhoneInfoDelegate implements PhoneInfoDelegate {
@Override
public String getDeviceId(String oldDeviceId, int userId) {
return oldDeviceId;
}
@Override
public String getBluetoothAddress(String oldAddress, int userId) {
return oldAddress;
}
@Override
public String getMacAddress(String oldAddress, int userId) {
return oldAddress;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/MyTaskDescDelegate.java
================================================
package io.virtualapp.delegate;
import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.os.Build;
import com.lody.virtual.client.hook.delegate.TaskDescriptionDelegate;
import com.lody.virtual.os.VUserManager;
/**
* Patch the task description with the (Virtual) user name
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public class MyTaskDescDelegate implements TaskDescriptionDelegate {
@Override
public ActivityManager.TaskDescription getTaskDescription(ActivityManager.TaskDescription oldTaskDescription) {
if (oldTaskDescription == null) {
return null;
}
String labelPrefix = "[" + VUserManager.get().getUserName() + "] ";
String oldLabel = oldTaskDescription.getLabel() != null ? oldTaskDescription.getLabel() : "";
if (!oldLabel.startsWith(labelPrefix)) {
// Is it really necessary?
return new ActivityManager.TaskDescription(labelPrefix + oldTaskDescription.getLabel(), oldTaskDescription.getIcon(), oldTaskDescription.getPrimaryColor());
} else {
return oldTaskDescription;
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/dev/CmdReceiver.java
================================================
package io.virtualapp.dev;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.widget.Toast;
import com.lody.virtual.client.core.InstallStrategy;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.remote.InstallResult;
import io.virtualapp.BuildConfig;
import io.virtualapp.home.LoadingActivity;
/**
* author: weishu on 18/2/23.
*/
public class CmdReceiver extends BroadcastReceiver {
private static final String ACTION = BuildConfig.APPLICATION_ID + ".CMD";
private static final String KEY_CMD = "cmd";
private static final String KEY_PKG = "pkg";
private static final String KEY_UID = "uid";
private static final String CMD_UPDATE = "update";
private static final String CMD_REBOOT = "reboot";
private static final String CMD_LAUNCH = "launch";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (!ACTION.equalsIgnoreCase(action)) {
return;
}
String cmd = intent.getStringExtra(KEY_CMD);
if (TextUtils.isEmpty(cmd)) {
showTips(context, "No cmd found!");
return;
}
if (CMD_REBOOT.equalsIgnoreCase(cmd)) {
VirtualCore.get().killAllApps();
showTips(context, "Reboot Success!!");
return;
}
if (CMD_UPDATE.equalsIgnoreCase(cmd)) {
String pkg = intent.getStringExtra(KEY_PKG);
if (TextUtils.isEmpty(pkg)) {
showTips(context, "Please tell me the update package!!");
return;
}
PackageManager packageManager = context.getPackageManager();
if (packageManager == null) {
showTips(context, "system error, update failed!");
return;
}
try {
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(pkg, 0);
String apkPath = applicationInfo.sourceDir;
InstallResult installResult = VirtualCore.get().installPackage(apkPath, InstallStrategy.UPDATE_IF_EXIST);
if (installResult.isSuccess) {
if (installResult.isUpdate) {
showTips(context, "Update " + pkg + " Success!!");
}
} else {
showTips(context, "Update " + pkg + " failed: " + installResult.error);
}
} catch (PackageManager.NameNotFoundException e) {
showTips(context, "Can not found " + pkg + " outside!");
}
} else if (CMD_LAUNCH.equalsIgnoreCase(cmd)) {
String pkg = intent.getStringExtra(KEY_PKG);
if (TextUtils.isEmpty(pkg)) {
showTips(context, "Please tell me the launch package!!");
return;
}
String uid = intent.getStringExtra(KEY_UID);
int userId = 0;
if (!TextUtils.isEmpty(uid)){
try {
userId = Integer.parseInt(uid);
}catch (NumberFormatException e){
e.printStackTrace();
}
}
LoadingActivity.launch(context, pkg, userId);
}
}
private void showTips(Context context, String tips) {
Toast.makeText(context, tips, Toast.LENGTH_SHORT).show();
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/GlideUtils.java
================================================
package io.virtualapp.glide;
import android.content.Context;
import android.support.annotation.DrawableRes;
import android.widget.ImageView;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import static io.virtualapp.glide.PackageIconResourceLoader.DATA_PACKAGE_FILE_PATH_PREFIX;
import static io.virtualapp.glide.PackageIconResourceLoader.DATA_PACKAGE_PREFIX;
/**
* Created by Windy on 2018/10/25
*/
public class GlideUtils {
public static void loadInstalledPackageIcon(Context context, String packageName, ImageView target, @DrawableRes int placeHolder) {
GlideApp.with(context)
.load(DATA_PACKAGE_PREFIX + packageName)
.placeholder(placeHolder)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(target);
}
public static void loadPackageIconFromApkFile(Context context, String apkFilePath, ImageView target, @DrawableRes int placeHolder) {
GlideApp.with(context)
.load(DATA_PACKAGE_FILE_PATH_PREFIX + apkFilePath)
.placeholder(placeHolder)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(target);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/MyGlideModule.java
================================================
package io.virtualapp.glide;
import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.Registry;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.load.engine.cache.MemorySizeCalculator;
import com.bumptech.glide.module.AppGlideModule;
import com.lody.virtual.helper.utils.VLog;
import java.io.InputStream;
/**
* Created by Windy on 2018/10/25
*/
@GlideModule
public class MyGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
MemorySizeCalculator calculator = new MemorySizeCalculator.Builder(context)
.build();
builder.setMemoryCache(new LruResourceCache(calculator.getMemoryCacheSize() / 2));
VLog.i("MyGlideModule", "applyOptions");
}
@Override
public boolean isManifestParsingEnabled() {
return false;
}
@Override
public void registerComponents(Context context, Glide glide, Registry registry) {
super.registerComponents(context, glide, registry);
registry.prepend(String.class, InputStream.class, new PackageIconResourceLoaderFactory(context));
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceDataFetcher.java
================================================
package io.virtualapp.glide;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import com.bumptech.glide.Priority;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.data.DataFetcher;
import com.lody.virtual.helper.utils.VLog;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import static io.virtualapp.glide.PackageIconResourceLoader.DATA_PACKAGE_FILE_PATH_PREFIX;
import static io.virtualapp.glide.PackageIconResourceLoader.DATA_PACKAGE_PREFIX;
/**
* Created by Windy on 2018/10/25
*/
public class PackageIconResourceDataFetcher implements DataFetcher<InputStream> {
private static final String TAG = PackageIconResourceDataFetcher.class.getSimpleName();
private Context context;
private String packageModel;
private InputStream data;
public PackageIconResourceDataFetcher(Context context, String packageName) {
this.context = context.getApplicationContext();
this.packageModel = packageName;
}
@Override
public void loadData(@NonNull Priority priority, @NonNull DataCallback<? super InputStream> callback) {
try {
data = loadResource();
} catch (Exception e) {
VLog.e(TAG, "Failed to load data from asset manager", e);
callback.onLoadFailed(e);
return;
}
callback.onDataReady(data);
}
@Override
public void cleanup() {
if (data == null) {
return;
}
try {
data.close();
} catch (IOException e) {
// Ignored.
}
}
@Override
public void cancel() {
}
@NonNull
@Override
public Class<InputStream> getDataClass() {
return InputStream.class;
}
@NonNull
@Override
public DataSource getDataSource() {
return DataSource.LOCAL;
}
//load icon res accord to package name, or apk path
private InputStream loadResource() {
PackageInfo packageInfo = null;
Drawable drawable = null;
try {
packageInfo = getPackageInfo();
if (packageInfo == null) {
return null;
}
drawable = packageInfo.applicationInfo.loadIcon(context.getPackageManager());
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (drawable == null) {
return null;
}
return drawableToInputStream(drawable);
}
private PackageInfo getPackageInfo() throws PackageManager.NameNotFoundException {
if (packageModel.startsWith(DATA_PACKAGE_PREFIX)) {
return context.getPackageManager().getPackageInfo(getPackageTrueModel(DATA_PACKAGE_PREFIX), 0);
} else if (packageModel.startsWith(DATA_PACKAGE_FILE_PATH_PREFIX)) {
return context.getPackageManager().getPackageArchiveInfo(getPackageTrueModel(DATA_PACKAGE_FILE_PATH_PREFIX), 0);
}
return null;
}
private String getPackageTrueModel(String prefix) {
return packageModel.replaceAll(prefix, "");
}
private InputStream drawableToInputStream(Drawable drawable) {
Bitmap bitmap = drawableToBitmap(drawable);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); //use the compression format of your need
return new ByteArrayInputStream(stream.toByteArray());
}
private static Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
int width = drawable.getIntrinsicWidth();
width = width > 0 ? width : 1;
int height = drawable.getIntrinsicHeight();
height = height > 0 ? height : 1;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceLoader.java
================================================
package io.virtualapp.glide;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.bumptech.glide.load.Options;
import com.bumptech.glide.load.model.ModelLoader;
import com.bumptech.glide.signature.ObjectKey;
import java.io.InputStream;
/**
* Created by Windy on 2018/10/25
*/
public class PackageIconResourceLoader implements ModelLoader<String, InputStream> {
public static final String DATA_PACKAGE_PREFIX = "data:packageName/";
public static final String DATA_PACKAGE_FILE_PATH_PREFIX = "data:packageFilePath/";
private Context context;
public PackageIconResourceLoader(Context context) {
this.context = context;
}
@Nullable
@Override
public LoadData<InputStream> buildLoadData(@NonNull String model, int width, int height, @NonNull Options options) {
return new LoadData<>(new ObjectKey(model), new PackageIconResourceDataFetcher(context, model));
}
@Override
public boolean handles(@NonNull String model) {
return model.startsWith(DATA_PACKAGE_PREFIX) || model.startsWith(DATA_PACKAGE_FILE_PATH_PREFIX);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceLoaderFactory.java
================================================
package io.virtualapp.glide;
import android.content.Context;
import android.support.annotation.NonNull;
import com.bumptech.glide.load.model.ModelLoader;
import com.bumptech.glide.load.model.ModelLoaderFactory;
import com.bumptech.glide.load.model.MultiModelLoaderFactory;
import java.io.InputStream;
/**
* Created by Windy on 2018/10/25
*/
public class PackageIconResourceLoaderFactory implements ModelLoaderFactory<String, InputStream> {
private Context context;
public PackageIconResourceLoaderFactory(Context context) {
this.context = context;
}
@NonNull
@Override
public ModelLoader<String, InputStream> build(@NonNull MultiModelLoaderFactory multiFactory) {
return new PackageIconResourceLoader(context);
}
@Override
public void teardown() {
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/gms/FakeGms.java
================================================
package io.virtualapp.gms;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.util.Log;
import com.lody.virtual.client.core.InstallStrategy;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.os.VEnvironment;
import com.lody.virtual.remote.InstallResult;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import io.virtualapp.R;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.utils.DialogUtil;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
/**
* @author weishu
* @date 2018/6/9.
*/
public class FakeGms {
private static final String TAG = "FakeGms";
private static final String GMS_CONFIG_URL = "http://vaexposed.weishu.me/gms.json";
private static final String GMS_PKG = "com.google.android.gms";
private static final String GSF_PKG = "com.google.android.gsf";
private static final String STORE_PKG = "com.android.vending";
private static final String FAKE_GAPPS_PKG = "com.thermatk.android.xf.fakegapps";
private static ExecutorService executorService = Executors.newSingleThreadExecutor();
public static void uninstallGms(Activity activity) {
if (activity == null) {
return;
}
AlertDialog failDialog = new AlertDialog.Builder(activity, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
.setTitle(R.string.uninstall_gms_title)
.setMessage(R.string.uninstall_gms_content)
.setPositiveButton(R.string.uninstall_gms_ok, ((dialog1, which1) -> {
ProgressDialog dialog = new ProgressDialog(activity);
dialog.show();
VUiKit.defer().when(() -> {
VirtualCore.get().uninstallPackage(GMS_PKG);
VirtualCore.get().uninstallPackage(GSF_PKG);
VirtualCore.get().uninstallPackage(STORE_PKG);
VirtualCore.get().uninstallPackage(FAKE_GAPPS_PKG);
}).then((v) -> {
dialog.dismiss();
AlertDialog hits = new AlertDialog.Builder(activity, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
.setTitle(R.string.uninstall_gms_title)
.setMessage(R.string.uninstall_gms_success)
.setPositiveButton(android.R.string.ok, null)
.create();
DialogUtil.showDialog(hits);
}).fail((v) -> {
dialog.dismiss();
});
}))
.setNegativeButton(android.R.string.cancel, null)
.create();
DialogUtil.showDialog(failDialog);
}
public static boolean isAlreadyInstalled(Context context) {
if (context == null) {
return false;
}
boolean alreadyInstalled = true;
if (!VirtualCore.get().isAppInstalled(GMS_PKG)) {
alreadyInstalled = false;
}
if (!VirtualCore.get().isAppInstalled(GSF_PKG)) {
alreadyInstalled = false;
}
if (!VirtualCore.get().isAppInstalled(STORE_PKG)) {
alreadyInstalled = false;
}
if (!VirtualCore.get().isAppInstalled(FAKE_GAPPS_PKG)) {
alreadyInstalled = false;
}
return alreadyInstalled;
}
public static void installGms(Activity activity) {
if (activity == null) {
return;
}
AlertDialog alertDialog = new AlertDialog.Builder(activity, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
.setTitle(R.string.install_gms_title)
.setMessage(R.string.install_gms_content)
.setPositiveButton(android.R.string.ok, ((dialog, which) -> {
// show a loading dialog and start install gms.
ProgressDialog progressDialog = new ProgressDialog(activity);
progressDialog.setCancelable(false);
progressDialog.show();
executorService.submit(() -> {
String failMsg = installGmsInternal(activity, progressDialog);
Log.i(TAG, "install gms result: " + failMsg);
try {
progressDialog.dismiss();
} catch (Throwable e) {
e.printStackTrace();
}
if (failMsg == null) {
activity.runOnUiThread(() -> {
AlertDialog failDialog = new AlertDialog.Builder(activity, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
.setTitle(R.string.install_gms_title)
.setMessage(R.string.install_gms_success)
.setPositiveButton(android.R.string.ok, null)
.create();
DialogUtil.showDialog(failDialog);
});
} else {
activity.runOnUiThread(() -> {
AlertDialog failDialog = new AlertDialog.Builder(activity, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
.setTitle(R.string.install_gms_fail_title)
.setMessage(R.string.install_gms_fail_content)
.setPositiveButton(R.string.install_gms_fail_ok, ((dialog1, which1) -> {
try {
Intent t = new Intent(Intent.ACTION_VIEW);
t.setData(Uri.parse("https://github.com/android-hacker/VirtualXposed/wiki/Google-service-support"));
activity.startActivity(t);
} catch (Throwable ignored) {
ignored.printStackTrace();
}
}))
.setNegativeButton(android.R.string.cancel, null)
.create();
DialogUtil.showDialog(failDialog);
});
}
});
}))
.setNegativeButton(android.R.string.cancel, null)
.create();
DialogUtil.showDialog(alertDialog);
}
private static String installGmsInternal(Activity activity, ProgressDialog dialog) {
File cacheDir = activity.getCacheDir();
// 下载配置文件,得到各自的URL
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build();
Request request = new Request.Builder()
.url(GMS_CONFIG_URL)
.build();
updateMessage(activity, dialog, "Fetching gms config...");
Response response;
try {
response = client.newCall(request).execute();
} catch (IOException e) {
return "Download gms config failed, please check your network, error: 0";
}
if (!response.isSuccessful()) {
return "Download gms config failed, please check your network, error: 1";
}
Log.i(TAG, "response success: " + response.code());
if (200 != response.code()) {
return "Download gms config failed, please check your network, error: 2";
}
updateMessage(activity, dialog, "Parsing gms config...");
ResponseBody body = response.body();
if (body == null) {
return "Download gms config failed, please check your network, error: 3";
}
String string = null;
try {
string = body.string();
} catch (IOException e) {
return "Download gms config failed, please check your network, error: 4";
}
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(string);
} catch (JSONException e) {
return "Download gms config failed, please check your network, error: 5";
}
String gmsCoreUrl = null;
try {
gmsCoreUrl = jsonObject.getString("gms");
} catch (JSONException e) {
return "Download gms config failed, please check your network, error: 6";
}
String gmsServiceUrl = null;
try {
gmsServiceUrl = jsonObject.getString("gsf");
} catch (JSONException e) {
return "Download gms config failed, please check your network, error: 7";
}
String storeUrl = null;
try {
storeUrl = jsonObject.getString("store");
} catch (JSONException e) {
return "Download gms config failed, please check your network, error: 8";
}
String fakeGappsUrl = null;
try {
fakeGappsUrl = jsonObject.getString("fakegapps");
} catch (JSONException e) {
return "Download gms config failed, please check your network, error: 9";
}
String yalpStoreUrl = null;
try {
yalpStoreUrl = jsonObject.getString("yalp");
} catch (JSONException e) {
// ignore.
Log.i(TAG, "Download gms config failed, please check your network");
}
updateMessage(activity, dialog, "config parse success!");
File gmsCoreFile = new File(cacheDir, "gms.apk");
File gmsServiceFile = new File(cacheDir, "gsf.apk");
File storeFile = new File(cacheDir, "store.apk");
File fakeGappsFile = new File(cacheDir, "fakegapps.apk");
File yalpStoreFile = new File(cacheDir, "yalpStore.apk");
// clear old files.
if (gmsCoreFile.exists()) {
gmsCoreFile.delete();
}
if (gmsServiceFile.exists()) {
gmsServiceFile.delete();
}
if (storeFile.exists()) {
storeFile.delete();
}
if (fakeGappsFile.exists()) {
fakeGappsFile.delete();
}
boolean downloadResult = downloadFile(gmsCoreUrl, gmsCoreFile,
(progress) -> updateMessage(activity, dialog, "download gms core..." + progress + "%"));
if (!downloadResult) {
return "Download gms config failed, please check your network, error: 10";
}
downloadResult = downloadFile(gmsServiceUrl, gmsServiceFile,
(progress -> updateMessage(activity, dialog, "download gms service framework proxy.." + progress + "%")));
if (!downloadResult) {
return "Download gms config failed, please check your network, error: 11";
}
updateMessage(activity, dialog, "download gms store...");
downloadResult = downloadFile(storeUrl, storeFile,
(progress -> updateMessage(activity, dialog, "download gms store.." + progress + "%")));
if (!downloadResult) {
return "Download gms config failed, please check your network, error: 12";
}
downloadResult = downloadFile(fakeGappsUrl, fakeGappsFile,
(progress -> updateMessage(activity, dialog, "download gms Xposed module.." + progress + "%")));
if (!downloadResult) {
return "Download gms config failed, please check your network, error: 13";
}
if (yalpStoreUrl != null) {
downloadFile(yalpStoreUrl,yalpStoreFile,
(progress -> updateMessage(activity, dialog, "download yalp store.." + progress + "%")));
}
updateMessage(activity, dialog, "installing gms core");
InstallResult installResult = VirtualCore.get().installPackage(gmsCoreFile.getAbsolutePath(), InstallStrategy.UPDATE_IF_EXIST);
if (!installResult.isSuccess) {
return "install gms core failed: " + installResult.error;
}
updateMessage(activity, dialog, "installing gms service framework...");
installResult = VirtualCore.get().installPackage(gmsServiceFile.getAbsolutePath(), InstallStrategy.UPDATE_IF_EXIST);
if (!installResult.isSuccess) {
return "install gms service framework failed: " + installResult.error;
}
updateMessage(activity, dialog, "installing gms store...");
installResult = VirtualCore.get().installPackage(storeFile.getAbsolutePath(), InstallStrategy.UPDATE_IF_EXIST);
if (!installResult.isSuccess) {
return "install gms store failed: " + installResult.error;
}
updateMessage(activity, dialog, "installing gms Xposed module...");
installResult = VirtualCore.get().installPackage(fakeGappsFile.getAbsolutePath(), InstallStrategy.UPDATE_IF_EXIST);
if (!installResult.isSuccess) {
return "install gms xposed module failed: " + installResult.error;
}
if (yalpStoreFile.exists()) {
updateMessage(activity, dialog, "installing yalp store...");
VirtualCore.get().installPackage(yalpStoreFile.getAbsolutePath(), InstallStrategy.UPDATE_IF_EXIST);
}
// Enable the Xposed module.
File dataDir = VEnvironment.getDataUserPackageDirectory(0, "de.robv.android.xposed.installer");
File modulePath = VEnvironment.getPackageResourcePath(FAKE_GAPPS_PKG);
File configDir = new File(dataDir, "exposed_conf" + File.separator + "modules.list");
FileWriter writer = null;
try {
writer = new FileWriter(configDir, true);
writer.append(modulePath.getAbsolutePath());
writer.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// success!!!
return null;
}
private static void updateMessage(Activity activity, ProgressDialog dialog, String msg) {
if (activity == null || dialog == null || TextUtils.isEmpty(msg)) {
return;
}
Log.i(TAG, "update dialog message: " + msg);
activity.runOnUiThread(() -> {
dialog.setMessage(msg);
});
}
public interface DownloadListener {
void onProgress(int progress);
}
public static boolean downloadFile(String url, File outFile, DownloadListener listener) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
FileOutputStream fos = null;
try {
Response response = client.newCall(request).execute();
if (response.code() != 200) {
return false;
}
ResponseBody body = response.body();
if (body == null) {
return false;
}
long toal = body.contentLength();
long sum = 0;
InputStream inputStream = body.byteStream();
fos = new FileOutputStream(outFile);
byte[] buffer = new byte[1024];
int count = 0;
while ((count = inputStream.read(buffer)) >= 0) {
fos.write(buffer, 0, count);
sum += count;
int progress = (int) ((sum * 1.0) / toal * 100);
if (listener != null) {
listener.onProgress(progress);
}
}
fos.flush();
return true;
} catch (IOException e) {
return false;
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppActivity.java
================================================
package io.virtualapp.home;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import io.virtualapp.R;
import io.virtualapp.VCommends;
import io.virtualapp.abs.ui.VActivity;
import io.virtualapp.home.adapters.AppPagerAdapter;
/**
* @author Lody
*/
public class ListAppActivity extends VActivity {
private Toolbar mToolBar;
private TabLayout mTabLayout;
private ViewPager mViewPager;
public static void gotoListApp(Activity activity) {
Intent intent = new Intent(activity, ListAppActivity.class);
activity.startActivityForResult(intent, VCommends.REQUEST_SELECT_APP);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clone_app);
mToolBar = findViewById(R.id.clone_app_tool_bar);
mTabLayout = mToolBar.findViewById(R.id.clone_app_tab_layout);
mViewPager = findViewById(R.id.clone_app_view_pager);
mViewPager.setAdapter(new AppPagerAdapter(getSupportFragmentManager()));
mTabLayout.setupWithViewPager(mViewPager);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppContract.java
================================================
package io.virtualapp.home;
import java.util.List;
import io.virtualapp.abs.BasePresenter;
import io.virtualapp.abs.BaseView;
import io.virtualapp.home.models.AppInfo;
/**
* @author Lody
* @version 1.0
*/
/*package*/ class ListAppContract {
interface ListAppView extends BaseView<ListAppPresenter> {
void startLoading();
void loadFinish(List<AppInfo> infoList);
}
interface ListAppPresenter extends BasePresenter {
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppFragment.java
================================================
package io.virtualapp.home;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.lody.virtual.helper.compat.NativeLibraryHelperCompat;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import io.virtualapp.R;
import io.virtualapp.XApp;
import io.virtualapp.abs.ui.VFragment;
import io.virtualapp.home.adapters.CloneAppListAdapter;
import io.virtualapp.home.models.AppInfo;
import io.virtualapp.home.models.AppInfoLite;
import io.virtualapp.sys.Installd;
import io.virtualapp.widgets.DragSelectRecyclerView;
/**
* @author Lody
*/
public class ListAppFragment extends VFragment<ListAppContract.ListAppPresenter> implements ListAppContract.ListAppView {
private static final String KEY_SELECT_FROM = "key_select_from";
private static final int REQUEST_GET_FILE = 1;
private DragSelectRecyclerView mRecyclerView;
private ProgressBar mProgressBar;
private Button mInstallButton;
private CloneAppListAdapter mAdapter;
private View mSelectFromExternal;
public static ListAppFragment newInstance(File selectFrom) {
Bundle args = new Bundle();
if (selectFrom != null)
args.putString(KEY_SELECT_FROM, selectFrom.getPath());
ListAppFragment fragment = new ListAppFragment();
fragment.setArguments(args);
return fragment;
}
private File getSelectFrom() {
Bundle bundle = getArguments();
if (bundle != null) {
String selectFrom = bundle.getString(KEY_SELECT_FROM);
if (selectFrom != null) {
return new File(selectFrom);
}
}
return null;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_list_app, null);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mAdapter.saveInstanceState(outState);
}
private void chooseInstallWay(Runnable runnable, String path) {
AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(R.string.install_choose_way)
.setMessage(R.string.install_choose_content)
.setPositiveButton(R.string.install_choose_taichi, (dialog, which) -> {
PackageManager packageManager = getActivity().getPackageManager();
try {
packageManager.getPackageInfo("me.weishu.exp", 0);
Intent intent = new Intent();
intent.setComponent(new ComponentName("me.weishu.exp", "me.weishu.exp.ui.MainActivity"));
intent.putExtra("path", path);
startActivity(intent);
} catch (PackageManager.NameNotFoundException e) {
AlertDialog showInstallDialog = new AlertDialog.Builder(getContext())
.setTitle(android.R.string.dialog_alert_title)
.setMessage(R.string.install_taichi_not_exist)
.setPositiveButton(R.string.install_go_to_install_exp, (dialog1, which1) -> {
Intent t = new Intent(Intent.ACTION_VIEW);
t.setData(Uri.parse("https://www.coolapk.com/apk/me.weishu.exp"));
startActivity(t);
})
.create();
showInstallDialog.show();
} catch (Throwable e) {
AlertDialog showInstallDialog = new AlertDialog.Builder(getContext())
.setTitle(android.R.string.dialog_alert_title)
.setMessage(R.string.install_taichi_while_old_version)
.setPositiveButton(R.string.install_go_latest_exp, (dialog1, which1) -> {
Intent t = new Intent(Intent.ACTION_VIEW);
t.setData(Uri.parse("https://taichi.cool"));
startActivity(t);
})
.create();
showInstallDialog.show();
}
finishActivity();
}).setNegativeButton("VirtualXposed", (dialog, which) -> {
if (runnable != null) {
runnable.run();
}
finishActivity();
}).setNeutralButton(R.string.what_is_exp, ((dialog, which) -> {
Intent t = new Intent(Intent.ACTION_VIEW);
t.setData(Uri.parse("https://taichi.cool"));
startActivity(t);
}))
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
}
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
mRecyclerView = (DragSelectRecyclerView) view.findViewById(R.id.select_app_recycler_view);
mProgressBar = (ProgressBar) view.findViewById(R.id.select_app_progress_bar);
mInstallButton = (Button) view.findViewById(R.id.select_app_install_btn);
mSelectFromExternal = view.findViewById(R.id.select_app_from_external);
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, OrientationHelper.VERTICAL));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);
dividerItemDecoration.setDrawable(new ColorDrawable(0x1f000000));
mRecyclerView.addItemDecoration(dividerItemDecoration);
mAdapter = new CloneAppListAdapter(getActivity(), getSelectFrom());
mRecyclerView.setAdapter(mAdapter);
mAdapter.setOnItemClickListener(new CloneAppListAdapter.ItemEventListener() {
@Override
public void onItemClick(AppInfo info, int position) {
if (!NativeLibraryHelperCompat.isApk64(info.path)) {
Toast.makeText(getContext(), R.string.unsupported_for_32bit_app, Toast.LENGTH_SHORT).show();
return;
}
int count = mAdapter.getSelectedCount();
if (!mAdapter.isIndexSelected(position)) {
if (count >= 9) {
Toast.makeText(getContext(), R.string.install_too_much_once_time, Toast.LENGTH_SHORT).show();
return;
}
}
mAdapter.toggleSelected(position);
}
@Override
public boolean isSelectable(int position) {
return mAdapter.isIndexSelected(position) || mAdapter.getSelectedCount() < 9;
}
});
mAdapter.setSelectionListener(count -> {
mInstallButton.setEnabled(count > 0);
mInstallButton.setText(String.format(Locale.ENGLISH, XApp.getApp().getResources().getString(R.string.install_d), count));
});
mInstallButton.setOnClickListener(v -> {
Integer[] selectedIndices = mAdapter.getSelectedIndices();
ArrayList<AppInfoLite> dataList = new ArrayList<AppInfoLite>(selectedIndices.length);
for (int index : selectedIndices) {
AppInfo info = mAdapter.getItem(index);
dataList.add(new AppInfoLite(info.packageName, info.path, info.fastOpen, info.disableMultiVersion));
}
if (dataList.size() > 0) {
String path = dataList.get(0).path;
chooseInstallWay(() -> {
Activity activity = getActivity();
if (activity == null) {
return;
}
Installd.startInstallerActivity(activity, dataList);
activity.setResult(Activity.RESULT_OK);
}, path);
}
});
mSelectFromExternal.setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("application/vnd.android.package-archive"); // apk file
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(intent, REQUEST_GET_FILE);
} catch (Throwable ignored) {
Toast.makeText(getActivity(), "Error", Toast.LENGTH_SHORT).show();
}
});
new ListAppPresenterImpl(getActivity(), this, getSelectFrom()).start();
}
@Override
public void startLoading() {
mProgressBar.setVisibility(View.VISIBLE);
mRecyclerView.setVisibility(View.GONE);
}
@Override
public void loadFinish(List<AppInfo> infoList) {
mAdapter.setList(infoList);
mRecyclerView.setDragSelectActive(false, 0);
mAdapter.setSelected(0, false);
mProgressBar.setVisibility(View.GONE);
mRecyclerView.setVisibility(View.VISIBLE);
}
@Override
public void setPresenter(ListAppContract.ListAppPresenter presenter) {
this.mPresenter = presenter;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (!(requestCode == REQUEST_GET_FILE && resultCode == Activity.RESULT_OK)) {
return;
}
Activity current = getActivity();
if (current == null) {
return;
}
Uri uri = data.getData();
String path = getPath(getActivity(), uri);
if (path == null) {
return;
}
chooseInstallWay(() -> {
Installd.handleRequestFromFile(getActivity(), path);
getActivity().setResult(Activity.RESULT_OK);
}, path);
}
public static String getPath(Context context, Uri uri) {
if (uri == null) {
return null;
}
if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = {"_data"};
Cursor cursor = null;
try {
cursor = context.getContentResolver().query(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow("_data");
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
// Eat it Or Log it.
} finally {
if (cursor != null) {
cursor.close();
}
}
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppPresenterImpl.java
================================================
package io.virtualapp.home;
import android.app.Activity;
import java.io.File;
import io.virtualapp.home.repo.AppDataSource;
import io.virtualapp.home.repo.AppRepository;
/**
* @author Lody
*/
class ListAppPresenterImpl implements ListAppContract.ListAppPresenter {
private Activity mActivity;
private ListAppContract.ListAppView mView;
private AppDataSource mRepository;
private File from;
ListAppPresenterImpl(Activity activity, ListAppContract.ListAppView view, File fromWhere) {
mActivity = activity;
mView = view;
mRepository = new AppRepository(activity);
mView.setPresenter(this);
this.from = fromWhere;
}
@Override
public void start() {
mView.setPresenter(this);
mView.startLoading();
if (from == null) {
mRepository.getInstalledApps(mActivity).done(mView::loadFinish);
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/LoadingActivity.java
================================================
package io.virtualapp.home;
import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.env.Constants;
import com.lody.virtual.client.ipc.VActivityManager;
import com.lody.virtual.client.ipc.VPackageManager;
import com.lody.virtual.helper.utils.VLog;
import com.lody.virtual.server.pm.parser.VPackage;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import io.virtualapp.R;
import io.virtualapp.abs.ui.VActivity;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.home.models.PackageAppData;
import io.virtualapp.home.repo.PackageAppDataStorage;
import io.virtualapp.widgets.EatBeansView;
import jonathanfinerty.once.Once;
/**
* @author Lody
*/
public class LoadingActivity extends VActivity {
private static final String TAG = "LoadingActivity";
private PackageAppData appModel;
private EatBeansView loadingView;
private static final int REQUEST_PERMISSION_CODE = 100;
private Intent intentToLaunch;
private int userToLaunch;
private long start;
public static boolean launch(Context context, String packageName, int userId) {
Intent intent = VirtualCore.get().getLaunchIntent(packageName, userId);
if (intent != null) {
Intent loadingPageIntent = new Intent(context, LoadingActivity.class);
loadingPageIntent.putExtra(Constants.PASS_PKG_NAME_ARGUMENT, packageName);
loadingPageIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
loadingPageIntent.putExtra(Constants.PASS_KEY_INTENT, intent);
loadingPageIntent.putExtra(Constants.PASS_KEY_USER, userId);
context.startActivity(loadingPageIntent);
return true;
} else {
return false;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
start = SystemClock.elapsedRealtime();
setContentView(R.layout.activity_loading);
loadingView = (EatBeansView) findViewById(R.id.loading_anim);
int userId = getIntent().getIntExtra(Constants.PASS_KEY_USER, -1);
String pkg = getIntent().getStringExtra(Constants.PASS_PKG_NAME_ARGUMENT);
appModel = PackageAppDataStorage.get().acquire(pkg);
if (appModel == null) {
Toast.makeText(getApplicationContext(), "Open App:" + pkg + " failed.", Toast.LENGTH_SHORT).show();
finish();
return;
}
ImageView iconView = (ImageView) findViewById(R.id.app_icon);
iconView.setImageDrawable(appModel.icon);
TextView nameView = (TextView) findViewById(R.id.app_name);
nameView.setText(String.format(Locale.ENGLISH, "Opening %s...", appModel.name));
Intent intent = getIntent().getParcelableExtra(Constants.PASS_KEY_INTENT);
if (intent == null) {
finish();
return;
}
VirtualCore.get().setUiCallback(intent, mUiCallback);
try {
// 如果已经在运行了,那么直接拉起,不做任何检测。
boolean uiRunning = false;
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
if (am != null) {
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo runningAppProcess : runningAppProcesses) {
String appProcessName = VActivityManager.get().getAppProcessName(runningAppProcess.pid);
if (TextUtils.equals(appProcessName, pkg)) {
uiRunning = true;
break;
}
}
}
VLog.i(TAG, pkg + "is running: " + uiRunning);
if (uiRunning) {
launchActivity(intent, userId);
return;
}
} catch (Throwable ignored) {
ignored.printStackTrace();
}
checkAndLaunch(intent, userId);
}
private void checkAndLaunch(Intent intent, int userId) {
final int RUNTIME_PERMISSION_API_LEVEL = android.os.Build.VERSION_CODES.M;
if (android.os.Build.VERSION.SDK_INT < RUNTIME_PERMISSION_API_LEVEL) {
// the device is below Android M, the permissions are granted when install, start directly
Log.i(TAG, "device's api level below Android M, do not need runtime permission.");
launchActivityWithDelay(intent, userId);
return;
}
// The device is above android M, support runtime permission.
String packageName = appModel.packageName;
String name = appModel.name;
// analyze permission
try {
ApplicationInfo applicationInfo = VPackageManager.get().getApplicationInfo(packageName, 0, 0);
int targetSdkVersion = applicationInfo.targetSdkVersion;
Log.i(TAG, "target package: " + packageName + " targetSdkVersion: " + targetSdkVersion);
if (targetSdkVersion >= RUNTIME_PERMISSION_API_LEVEL) {
Log.i(TAG, "target package support runtime permission, launch directly.");
launchActivityWithDelay(intent, userId);
} else {
intentToLaunch = intent;
userToLaunch = userId;
PackageInfo packageInfo = VPackageManager.get().getPackageInfo(packageName, PackageManager.GET_PERMISSIONS, 0);
String[] requestedPermissions = packageInfo.requestedPermissions;
Set<String> dangerousPermissions = new HashSet<>();
for (String requestedPermission : requestedPermissions) {
if (VPackage.PermissionComponent.DANGEROUS_PERMISSION.contains(requestedPermission)) {
// dangerous permission, check it
if (ContextCompat.checkSelfPermission(this, requestedPermission) != PackageManager.PERMISSION_GRANTED) {
dangerousPermissions.add(requestedPermission);
} else {
Log.i(TAG, "permission: " + requestedPermission + " is granted, ignore.");
}
}
}
if (dangerousPermissions.isEmpty()) {
Log.i(TAG, "all permission are granted, launch directly.");
// all permission are granted, launch directly.
launchActivityWithDelay(intent, userId);
} else {
// tell user that this app need that permission
Log.i(TAG, "request permission: " + dangerousPermissions);
AlertDialog alertDialog = new AlertDialog.Builder(this, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
.setTitle(R.string.permission_tip_title)
.setMessage(getResources().getString(R.string.permission_tips_content, name))
.setPositiveButton(R.string.permission_tips_confirm, (dialog, which) -> {
String[] permissionToRequest = dangerousPermissions.toArray(new String[dangerousPermissions.size()]);
try {
ActivityCompat.requestPermissions(this, permissionToRequest, REQUEST_PERMISSION_CODE);
} catch (Throwable ignored) {
}
})
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
// BadTokenException.
finish();
Toast.makeText(this, getResources().getString(R.string.start_app_failed, appModel.name), Toast.LENGTH_SHORT).show();
}
}
}
} catch (Throwable e) {
Log.e(TAG, "check permission failed: ", e);
launchActivityWithDelay(intent, userId);
}
}
private void launchActivityWithDelay(Intent intent, int userId) {
final int MAX_WAIT = 1000;
long delta = SystemClock.elapsedRealtime() - start;
long waitTime = MAX_WAIT - delta;
if (waitTime <= 0) {
launchActivity(intent, userId);
} else {
loadingView.postDelayed(() -> launchActivity(intent, userId), waitTime);
}
}
private void launchActivity(Intent intent, int userId) {
try {
VActivityManager.get().startActivity(intent, userId);
} catch (Throwable e) {
VLog.e(TAG, "start activity failed:", e);
Toast.makeText(getApplicationContext(), getResources().getString(R.string.start_app_failed, appModel.name), Toast.LENGTH_SHORT).show();
finish();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSION_CODE) {
boolean allGranted = true;
for (int grantResult : grantResults) {
if (grantResult == PackageManager.PERMISSION_DENIED) {
allGranted = false;
break;
}
}
if (allGranted) {
if (intentToLaunch == null) {
Toast.makeText(this, getResources().getString(R.string.start_app_failed, appModel.name), Toast.LENGTH_SHORT).show();
finish();
} else {
launchActivityWithDelay(intentToLaunch, userToLaunch);
}
} else {
// 提示用户,targetSdkVersion < 23 无法使用运行时权限
Log.i(TAG, "can not use runtime permission, you must grant all permission, otherwise the app may not work!");
final String tag = "permission_tips_" + appModel.packageName.replaceAll("\\.", "_");
// TODO find a device figuring out why some permissions are not detected.
if (!Once.beenDone(tag)) {
AlertDialog alertDialog = new AlertDialog.Builder(this, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
.setTitle(android.R.string.dialog_alert_title)
.setMessage(getResources().getString(R.string.permission_denied_tips_content, appModel.name))
.setPositiveButton(R.string.permission_tips_confirm, (dialog, which) -> {
finish();
Once.markDone(tag);
launchActivityWithDelay(intentToLaunch, userToLaunch);
})
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
// BadTokenException.
Toast.makeText(this, getResources().getString(R.string.start_app_failed, appModel.name), Toast.LENGTH_SHORT).show();
}
} else {
launchActivityWithDelay(intentToLaunch, userToLaunch);
finish();
}
}
}
}
private final VirtualCore.UiCallback mUiCallback = new VirtualCore.UiCallback() {
@Override
public void onAppOpened(String packageName, int userId) throws RemoteException {
finish();
}
@Override
public void onOpenFailed(String packageName, int userId) throws RemoteException {
VUiKit.defer().when(() -> {
}).done((v) -> {
if (!isFinishing()) {
Toast.makeText(getApplicationContext(), getResources().getString(R.string.start_app_failed, packageName),
Toast.LENGTH_SHORT).show();
}
});
finish();
}
};
@Override
protected void onResume() {
super.onResume();
startAnim();
}
private void startAnim() {
if (loadingView != null) {
loadingView.startAnim();
}
}
@Override
protected void onStop() {
super.onStop();
if (loadingView != null) {
loadingView.stopAnim();
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/NewHomeActivity.java
================================================
package io.virtualapp.home;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
import com.android.launcher3.LauncherFiles;
import com.google.android.apps.nexuslauncher.NexusLauncherActivity;
import com.lody.virtual.client.core.InstallStrategy;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.helper.utils.DeviceUtil;
import com.lody.virtual.helper.utils.FileUtils;
import com.lody.virtual.helper.utils.MD5Utils;
import com.lody.virtual.helper.utils.VLog;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.concurrent.atomic.AtomicBoolean;
import io.virtualapp.R;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.settings.SettingsActivity;
import io.virtualapp.update.VAVersionService;
import io.virtualapp.utils.Misc;
import jonathanfinerty.once.Once;
import static io.virtualapp.XApp.XPOSED_INSTALLER_PACKAGE;
/**
* @author weishu
* @date 18/2/9.
*/
public class NewHomeActivity extends NexusLauncherActivity {
private static final String SHOW_DOZE_ALERT_KEY = "SHOW_DOZE_ALERT_KEY";
private static final String WALLPAPER_FILE_NAME = "wallpaper.png";
private Handler mUiHandler;
private boolean mDirectlyBack = false;
private final AtomicBoolean checkXposedInstaller = new AtomicBoolean(true);
public static void goHome(Context context) {
Intent intent = new Intent(context, NewHomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
@Override
public void onCreate(Bundle savedInstanceState) {
SharedPreferences sharedPreferences = getSharedPreferences(LauncherFiles.SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE);
super.onCreate(savedInstanceState);
showMenuKey();
mUiHandler = new Handler(getMainLooper());
alertForMeizu();
alertForDonate();
mDirectlyBack = sharedPreferences.getBoolean(SettingsActivity.DIRECTLY_BACK_KEY, false);
}
private void installXposed() {
if (!VirtualCore.get().isXposedEnabled()) {
return;
}
boolean isXposedInstalled = false;
try {
isXposedInstalled = VirtualCore.get().isAppInstalled(XPOSED_INSTALLER_PACKAGE);
File oldXposedInstallerApk = getFileStreamPath("XposedInstaller_1_31.apk");
if (oldXposedInstallerApk.exists()) {
VirtualCore.get().uninstallPackage(XPOSED_INSTALLER_PACKAGE);
oldXposedInstallerApk.delete();
isXposedInstalled = false;
Log.d(TAG, "remove xposed installer success!");
}
} catch (Throwable e) {
VLog.d(TAG, "remove xposed install failed.", e);
}
if (!isXposedInstalled) {
ProgressDialog dialog = new ProgressDialog(this);
dialog.setCancelable(false);
dialog.setMessage(getResources().getString(R.string.prepare_xposed_installer));
dialog.show();
VUiKit.defer().when(() -> {
File xposedInstallerApk = getFileStreamPath("XposedInstaller_5_8.apk");
if (!xposedInstallerApk.exists()) {
InputStream input = null;
OutputStream output = null;
try {
input = getApplicationContext().getAssets().open("XposedInstaller_3.1.5.apk_");
output = new FileOutputStream(xposedInstallerApk);
byte[] buffer = new byte[1024];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
} catch (Throwable e) {
VLog.e(TAG, "copy file error", e);
} finally {
FileUtils.closeQuietly(input);
FileUtils.closeQuietly(output);
}
}
if (xposedInstallerApk.isFile() && !DeviceUtil.isMeizuBelowN()) {
try {
if ("8537fb219128ead3436cc19ff35cfb2e".equals(MD5Utils.getFileMD5String(xposedInstallerApk))) {
VirtualCore.get().installPackage(xposedInstallerApk.getPath(), InstallStrategy.TERMINATE_IF_EXIST);
} else {
VLog.w(TAG, "unknown Xposed installer, ignore!");
}
} catch (Throwable ignored) {
}
}
}).then((v) -> {
dismissDialog(dialog);
}).fail((err) -> {
dismissDialog(dialog);
});
}
}
private static void dismissDialog(ProgressDialog dialog) {
if (dialog == null) {
return;
}
try {
dialog.dismiss();
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
if (checkXposedInstaller.compareAndSet(true, false)) {
installXposed();
}
// check for update
new Handler().postDelayed(() ->
VAVersionService.checkUpdate(getApplicationContext(), false), 1000);
// check for wallpaper
setWallpaper();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
onSettingsClicked();
return true;
}
return super.onKeyDown(keyCode, event);
}
public Activity getActivity() {
return this;
}
public Context getContext() {
return this;
}
@Override
public void onClickAddWidgetButton(View view) {
onAddAppClicked();
}
private void onAddAppClicked() {
ListAppActivity.gotoListApp(this);
}
private void onSettingsClicked() {
startActivity(new Intent(NewHomeActivity.this, SettingsActivity.class));
}
@Override
public void onClickSettingsButton(View v) {
onSettingsClicked();
}
@Override
protected void onClickAllAppsButton(View v) {
onSettingsClicked();
}
@Override
public void startVirtualActivity(Intent intent, Bundle options, int usedId) {
String packageName = intent.getPackage();
if (TextUtils.isEmpty(packageName)) {
ComponentName component = intent.getComponent();
if (component != null) {
packageName = component.getPackageName();
}
}
if (packageName == null) {
try {
startActivity(intent);
return;
} catch (Throwable ignored) {
// ignore
}
}
boolean result = LoadingActivity.launch(this, packageName, usedId);
if (!result) {
throw new ActivityNotFoundException("can not launch activity for :" + intent);
}
if (mDirectlyBack) {
finish();
}
}
private void alertForDonate() {
final String TAG = "show_donate";
if (Once.beenDone(Once.THIS_APP_VERSION, TAG)) {
alertForDoze();
return;
}
AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(R.string.about_donate)
.setMessage(R.string.donate_dialog_content)
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
Misc.showDonate(this);
Once.markDone(TAG);
})
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
}
}
private void alertForMeizu() {
if (!DeviceUtil.isMeizuBelowN()) {
return;
}
boolean isXposedInstalled = VirtualCore.get().isAppInstalled(XPOSED_INSTALLER_PACKAGE);
if (isXposedInstalled) {
return;
}
mUiHandler.postDelayed(() -> {
AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(R.string.meizu_device_tips_title)
.setMessage(R.string.meizu_device_tips_content)
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
})
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
}
}, 2000);
}
private void alertForDoze() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return;
}
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
if (powerManager == null) {
return;
}
boolean showAlert = PreferenceManager.getDefaultSharedPreferences(this).getBoolean(SHOW_DOZE_ALERT_KEY, true);
if (!showAlert) {
return;
}
String packageName = getPackageName();
boolean ignoringBatteryOptimizations = powerManager.isIgnoringBatteryOptimizations(packageName);
if (!ignoringBatteryOptimizations) {
mUiHandler.postDelayed(() -> {
AlertDialog alertDialog = new AlertDialog.Builder(getContext())
.setTitle(R.string.alert_for_doze_mode_title)
.setMessage(R.string.alert_for_doze_mode_content)
.setPositiveButton(R.string.alert_for_doze_mode_yes, (dialog, which) -> {
try {
startActivity(new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, Uri.parse("package:" + getPackageName())));
} catch (ActivityNotFoundException ignored) {
// ActivityNotFoundException on some devices.
try {
startActivity(new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS));
} catch (Throwable e) {
PreferenceManager.getDefaultSharedPreferences(getActivity())
.edit().putBoolean(SHOW_DOZE_ALERT_KEY, false).apply();
}
} catch (Throwable e) {
PreferenceManager.getDefaultSharedPreferences(getActivity())
.edit().putBoolean(SHOW_DOZE_ALERT_KEY, false).apply();
}
})
.setNegativeButton(R.string.alert_for_doze_mode_no, (dialog, which) ->
PreferenceManager.getDefaultSharedPreferences(getActivity())
.edit().putBoolean(SHOW_DOZE_ALERT_KEY, false).apply())
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
ignored.printStackTrace();
}
}, 1000);
}
}
private void setWallpaper() {
File wallpaper = getFileStreamPath(WALLPAPER_FILE_NAME);
if (wallpaper == null || !wallpaper.exists() || wallpaper.isDirectory()) {
setOurWallpaper(getResources().getDrawable(R.drawable.home_bg));
} else {
long start = SystemClock.elapsedRealtime();
Drawable d;
try {
d = BitmapDrawable.createFromPath(wallpaper.getPath());
} catch (Throwable e) {
Toast.makeText(getApplicationContext(), R.string.wallpaper_too_big_tips, Toast.LENGTH_SHORT).show();
return;
}
long cost = SystemClock.elapsedRealtime() - start;
if (cost > 200) {
Toast.makeText(getApplicationContext(), R.string.wallpaper_too_big_tips, Toast.LENGTH_SHORT).show();
}
if (d == null) {
setOurWallpaper(getResources().getDrawable(R.drawable.home_bg));
} else {
setOurWallpaper(d);
}
}
}
private void showMenuKey() {
try {
Method setNeedsMenuKey = Window.class.getDeclaredMethod("setNeedsMenuKey", int.class);
setNeedsMenuKey.setAccessible(true);
int value = WindowManager.LayoutParams.class.getField("NEEDS_MENU_SET_TRUE").getInt(null);
setNeedsMenuKey.invoke(getWindow(), value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java
================================================
package io.virtualapp.home.adapters;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import io.virtualapp.R;
import io.virtualapp.XApp;
import io.virtualapp.home.ListAppFragment;
/**
* @author Lody
*/
public class AppPagerAdapter extends FragmentPagerAdapter {
private List<String> titles = new ArrayList<>();
private List<File> dirs = new ArrayList<>();
public AppPagerAdapter(FragmentManager fm) {
super(fm);
titles.add(XApp.getApp().getResources().getString(R.string.clone_apps));
dirs.add(null);
}
@Override
public Fragment getItem(int position) {
return ListAppFragment.newInstance(dirs.get(position));
}
@Override
public int getCount() {
return titles.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java
================================================
package io.virtualapp.home.adapters;
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.File;
import java.util.List;
import io.virtualapp.R;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.glide.GlideUtils;
import io.virtualapp.home.models.AppInfo;
import io.virtualapp.widgets.DragSelectRecyclerViewAdapter;
import io.virtualapp.widgets.LabelView;
/**
* @author Lody
*/
public class CloneAppListAdapter extends DragSelectRecyclerViewAdapter<CloneAppListAdapter.ViewHolder> {
private static final int TYPE_FOOTER = -2;
private final View mFooterView;
private LayoutInflater mInflater;
private List<AppInfo> mAppList;
private ItemEventListener mItemEventListener;
private Context mContext;
private File mFrom;
public CloneAppListAdapter(Context context, @Nullable File from) {
mContext = context;
mFrom = from;
this.mInflater = LayoutInflater.from(context);
mFooterView = new View(context);
StaggeredGridLayoutManager.LayoutParams params = new StaggeredGridLayoutManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, VUiKit.dpToPx(context, 60)
);
params.setFullSpan(true);
mFooterView.setLayoutParams(params);
}
public void setOnItemClickListener(ItemEventListener mItemEventListener) {
this.mItemEventListener = mItemEventListener;
}
public List<AppInfo> getList() {
return mAppList;
}
public void setList(List<AppInfo> models) {
this.mAppList = models;
notifyDataSetChanged();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_FOOTER) {
return new ViewHolder(mFooterView);
}
return new ViewHolder(mInflater.inflate(R.layout.item_clone_app, null));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_FOOTER) {
return;
}
super.onBindViewHolder(holder, position);
AppInfo info = mAppList.get(position);
if (mFrom == null) {
GlideUtils.loadInstalledPackageIcon(mContext, info.packageName, holder.iconView, android.R.drawable.sym_def_app_icon);
} else {
GlideUtils.loadPackageIconFromApkFile(mContext, info.path, holder.iconView, android.R.drawable.sym_def_app_icon);
}
holder.nameView.setText(String.format("%s: %s%s", info.name, info.version, info.splitApk ? " [S]" : ""));
if (isIndexSelected(position)) {
holder.iconView.setAlpha(1f);
holder.appCheckView.setImageResource(R.drawable.ic_check);
} else {
holder.iconView.setAlpha(0.65f);
holder.appCheckView.setImageResource(R.drawable.ic_no_check);
}
if (info.cloneCount > 0) {
holder.labelView.setVisibility(View.VISIBLE);
holder.labelView.setText(info.cloneCount + 1 + "");
} else {
holder.labelView.setVisibility(View.INVISIBLE);
}
holder.itemView.setOnClickListener(v -> {
mItemEventListener.onItemClick(info, position);
});
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
protected boolean isIndexSelectable(int index) {
return mItemEventListener.isSelectable(index);
}
@Override
public int getItemCount() {
return mAppList == null ? 1 : mAppList.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1) {
return TYPE_FOOTER;
}
return super.getItemViewType(position);
}
public AppInfo getItem(int index) {
return mAppList.get(index);
}
public interface ItemEventListener {
void onItemClick(AppInfo appData, int position);
boolean isSelectable(int position);
}
class ViewHolder extends RecyclerView.ViewHolder {
private ImageView iconView;
private TextView nameView;
private ImageView appCheckView;
private LabelView labelView;
ViewHolder(View itemView) {
super(itemView);
if (itemView != mFooterView) {
iconView = (ImageView) itemView.findViewById(R.id.item_app_icon);
nameView = (TextView) itemView.findViewById(R.id.item_app_name);
appCheckView = (ImageView) itemView.findViewById(R.id.item_app_checked);
labelView = (LabelView) itemView.findViewById(R.id.item_app_clone_count);
}
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java
================================================
package io.virtualapp.home.models;
import android.graphics.drawable.Drawable;
/**
* @author Lody
*/
public interface AppData {
boolean isInstalling();
boolean isLoading();
boolean isFirstOpen();
Drawable getIcon();
String getName();
boolean canReorder();
boolean canLaunch();
boolean canDelete();
boolean canCreateShortcut();
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java
================================================
package io.virtualapp.home.models;
import android.graphics.drawable.Drawable;
/**
* @author Lody
*/
public class AppInfo {
public String packageName;
public String path;
public boolean fastOpen;
public Drawable icon;
public CharSequence name;
public CharSequence version;
public int cloneCount;
public boolean disableMultiVersion;
public boolean splitApk;
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfoLite.java
================================================
package io.virtualapp.home.models;
import android.os.Parcel;
import android.os.Parcelable;
/**
* @author Lody
*/
public class AppInfoLite implements Parcelable {
public static final Creator<AppInfoLite> CREATOR = new Creator<AppInfoLite>() {
@Override
public AppInfoLite createFromParcel(Parcel source) {
return new AppInfoLite(source);
}
@Override
public AppInfoLite[] newArray(int size) {
return new AppInfoLite[size];
}
};
public String packageName;
public String path;
public boolean fastOpen;
public boolean disableMultiVersion;
public AppInfoLite(String packageName, String path, boolean fastOpen, boolean disableMultiVersion) {
this.packageName = packageName;
this.path = path;
this.fastOpen = fastOpen;
this.disableMultiVersion = disableMultiVersion;
}
protected AppInfoLite(Parcel in) {
this.packageName = in.readString();
this.path = in.readString();
this.fastOpen = in.readByte() != 0;
this.disableMultiVersion = in.readByte() != 0;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.packageName);
dest.writeString(this.path);
dest.writeByte(this.fastOpen ? (byte) 1 : (byte) 0);
dest.writeByte(this.disableMultiVersion ? (byte) 1 : (byte) 0);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/MultiplePackageAppData.java
================================================
package io.virtualapp.home.models;
import android.graphics.drawable.Drawable;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.remote.InstalledAppInfo;
/**
* @author Lody
*/
public class MultiplePackageAppData implements AppData {
public InstalledAppInfo appInfo;
public int userId;
public boolean isFirstOpen;
public boolean isInstalling;
public boolean isLoading;
public Drawable icon;
public String name;
public MultiplePackageAppData(PackageAppData target, int userId) {
this.userId = userId;
this.appInfo = VirtualCore.get().getInstalledAppInfo(target.packageName, 0);
this.isFirstOpen = !appInfo.isLaunched(userId);
if (target.icon != null) {
Drawable.ConstantState state = target.icon.getConstantState();
if (state != null) {
icon = state.newDrawable();
}
}
name = target.name;
}
@Override
public boolean isInstalling() {
return isInstalling;
}
@Override
public boolean isLoading() {
return isLoading;
}
@Override
public boolean isFirstOpen() {
return isFirstOpen;
}
@Override
public Drawable getIcon() {
return icon;
}
@Override
public String getName() {
return name;
}
@Override
public boolean canReorder() {
return true;
}
@Override
public boolean canLaunch() {
return true;
}
@Override
public boolean canDelete() {
return true;
}
@Override
public boolean canCreateShortcut() {
return true;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/PackageAppData.java
================================================
package io.virtualapp.home.models;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import com.lody.virtual.remote.InstalledAppInfo;
/**
* @author Lody
*/
public class PackageAppData implements AppData {
public String packageName;
public String name;
public Drawable icon;
public boolean fastOpen;
public boolean isFirstOpen;
public boolean isLoading;
public boolean isInstalling;
public PackageAppData(Context context, InstalledAppInfo installedAppInfo) {
this.packageName = installedAppInfo.packageName;
this.isFirstOpen = !installedAppInfo.isLaunched(0);
loadData(context, installedAppInfo.getApplicationInfo(installedAppInfo.getInstalledUsers()[0]));
}
public PackageAppData(Context context, ApplicationInfo appInfo) {
this.packageName = appInfo.packageName;
loadData(context, appInfo);
}
private void loadData(Context context, ApplicationInfo appInfo) {
if (appInfo == null) {
return;
}
PackageManager pm = context.getPackageManager();
try {
CharSequence sequence = appInfo.loadLabel(pm);
if (sequence != null) {
name = sequence.toString();
}
icon = appInfo.loadIcon(pm);
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public boolean isInstalling() {
return isInstalling;
}
@Override
public boolean isLoading() {
return isLoading;
}
@Override
public boolean isFirstOpen() {
return isFirstOpen;
}
@Override
public Drawable getIcon() {
return icon;
}
@Override
public String getName() {
return name;
}
@Override
public boolean canReorder() {
return true;
}
@Override
public boolean canLaunch() {
return true;
}
@Override
public boolean canDelete() {
return true;
}
@Override
public boolean canCreateShortcut() {
return true;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppDataSource.java
================================================
package io.virtualapp.home.repo;
import android.content.Context;
import com.lody.virtual.remote.InstallResult;
import org.jdeferred.Promise;
import java.io.File;
import java.util.List;
import io.virtualapp.home.models.AppData;
import io.virtualapp.home.models.AppInfo;
import io.virtualapp.home.models.AppInfoLite;
/**
* @author Lody
* @version 1.0
*/
public interface AppDataSource {
/**
* @return All the Applications we Virtual.
*/
Promise<List<AppData>, Throwable, Void> getVirtualApps();
/**
* @param context Context
* @return All the Applications we Installed.
*/
Promise<List<AppInfo>, Throwable, Void> getInstalledApps(Context context);
Promise<List<AppInfo>, Throwable, Void> getStorageApps(Context context, File rootDir);
InstallResult addVirtualApp(AppInfoLite info);
boolean removeVirtualApp(String packageName, int userId);
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java
================================================
package io.virtualapp.home.repo;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.lody.virtual.GmsSupport;
import com.lody.virtual.client.core.InstallStrategy;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.helper.utils.DeviceUtil;
import com.lody.virtual.remote.InstallResult;
import com.lody.virtual.remote.InstalledAppInfo;
import org.jdeferred.Promise;
import java.io.File;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.home.models.AppData;
import io.virtualapp.home.models.AppInfo;
import io.virtualapp.home.models.AppInfoLite;
import io.virtualapp.home.models.MultiplePackageAppData;
import io.virtualapp.home.models.PackageAppData;
import io.virtualapp.utils.HanziToPinyin;
/**
* @author Lody
*/
public class AppRepository implements AppDataSource {
private static final Collator COLLATOR = Collator.getInstance(Locale.CHINA);
private static final List<String> SCAN_PATH_LIST = Arrays.asList(
".",
"wandoujia/app",
"tencent/tassistant/apk",
"BaiduAsa9103056",
"360Download",
"pp/downloader",
"pp/downloader/apk",
"pp/downloader/silent/apk");
private static final int MAX_SCAN_DEPTH = 2;
private Context mContext;
public AppRepository(Context context) {
mContext = context;
}
private static boolean isSystemApplication(PackageInfo packageInfo) {
return (packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0
&& !GmsSupport.isGmsFamilyPackage(packageInfo.packageName);
}
@Override
public Promise<List<AppData>, Throwable, Void> getVirtualApps() {
return VUiKit.defer().when(() -> {
List<InstalledAppInfo> infos = VirtualCore.get().getInstalledApps(0);
List<AppData> models = new ArrayList<>();
for (InstalledAppInfo info : infos) {
if (!VirtualCore.get().isPackageLaunchable(info.packageName)) {
continue;
}
PackageAppData data = new PackageAppData(mContext, info);
if (VirtualCore.get().isAppInstalledAsUser(0, info.packageName)) {
models.add(data);
}
int[] userIds = info.getInstalledUsers();
for (int userId : userIds) {
if (userId != 0) {
models.add(new MultiplePackageAppData(data, userId));
}
}
}
return models;
});
}
@Override
public Promise<List<AppInfo>, Throwable, Void> getInstalledApps(Context context) {
return VUiKit.defer().when(() -> convertPackageInfoToAppData(context, context.getPackageManager().getInstalledPackages(PackageManager.GET_META_DATA), true));
}
@Override
public Promise<List<AppInfo>, Throwable, Void> getStorageApps(Context context, File rootDir) {
// return VUiKit.defer().when(() -> convertPackageInfoToAppData(context, findAndParseAPKs(context, rootDir, SCAN_PATH_LIST), false));
return VUiKit.defer().when(() -> convertPackageInfoToAppData(context, findAndParseApkRecursively(context, rootDir,null, 0), false));
}
private List<PackageInfo> findAndParseApkRecursively(Context context, File rootDir, List<PackageInfo> result, int depth) {
if (result == null) {
result = new ArrayList<>();
}
if (depth > MAX_SCAN_DEPTH) {
return result;
}
File[] dirFiles = rootDir.listFiles();
if (dirFiles == null) {
return Collections.emptyList();
}
for (File f: dirFiles) {
if (f.isDirectory()) {
List<PackageInfo> andParseApkRecursively = findAndParseApkRecursively(context, f, new ArrayList<>(), depth + 1);
result.addAll(andParseApkRecursively);
}
if (!(f.isFile() && f.getName().toLowerCase().endsWith(".apk"))) {
continue;
}
PackageInfo pkgInfo = null;
try {
pkgInfo = context.getPackageManager().getPackageArchiveInfo(f.getAbsolutePath(), PackageManager.GET_META_DATA);
pkgInfo.applicationInfo.sourceDir = f.getAbsolutePath();
pkgInfo.applicationInfo.publicSourceDir = f.getAbsolutePath();
} catch (Exception e) {
// Ignore
}
if (pkgInfo != null) {
result.add(pkgInfo);
}
}
return result;
}
private List<PackageInfo> findAndParseAPKs(Context context, File rootDir, List<String> paths) {
List<PackageInfo> packageList = new ArrayList<>();
if (paths == null)
return packageList;
for (String path : paths) {
File[] dirFiles = new File(rootDir, path).listFiles();
if (dirFiles == null)
continue;
for (File f : dirFiles) {
if (!f.getName().toLowerCase().endsWith(".apk"))
continue;
PackageInfo pkgInfo = null;
try {
pkgInfo = context.getPackageManager().getPackageArchiveInfo(f.getAbsolutePath(), 0);
pkgInfo.applicationInfo.sourceDir = f.getAbsolutePath();
pkgInfo.applicationInfo.publicSourceDir = f.getAbsolutePath();
} catch (Exception e) {
// Ignore
}
if (pkgInfo != null)
packageList.add(pkgInfo);
}
}
return packageList;
}
private List<AppInfo> convertPackageInfoToAppData(Context context, List<PackageInfo> pkgList, boolean fastOpen) {
PackageManager pm = context.getPackageManager();
List<AppInfo> list = new ArrayList<>(pkgList.size());
String hostPkg = VirtualCore.get().getHostPkg();
for (PackageInfo pkg : pkgList) {
// ignore the host package
if (hostPkg.equals(pkg.packageName)) {
continue;
}
// ignore taichi package
if (VirtualCore.TAICHI_PACKAGE.equals(pkg.packageName)) {
continue;
}
// ignore the System package
if (isSystemApplication(pkg)) {
continue;
}
ApplicationInfo ai = pkg.applicationInfo;
String path = ai.publicSourceDir != null ? ai.publicSourceDir : ai.sourceDir;
boolean splitApk = false;
if (ai.splitPublicSourceDirs != null || ai.splitSourceDirs != null) {
splitApk = true;
path = new File(path).getParent();
}
if (path == null) {
continue;
}
AppInfo info = new AppInfo();
info.packageName = pkg.packageName;
info.fastOpen = fastOpen;
info.path = path;
info.icon = null; // Use Glide to load the icon async
info.name = ai.loadLabel(pm);
info.version = pkg.versionName;
info.splitApk = splitApk;
InstalledAppInfo installedAppInfo = VirtualCore.get().getInstalledAppInfo(pkg.packageName, 0);
if (installedAppInfo != null) {
info.cloneCount = installedAppInfo.getInstalledUsers().length;
}
if (ai.metaData != null && ai.metaData.containsKey("xposedmodule")) {
info.disableMultiVersion = true;
info.cloneCount = 0;
}
list.add(info);
}
// sort by name
Collections.sort(list, (o1, o2) -> {
HanziToPinyin hanziToPinyin = HanziToPinyin.getInstance();
String pinyin1 = hanziToPinyin.toPinyinString(o1.name.toString().trim());
String pinyin2 = hanziToPinyin.toPinyinString(o2.name.toString().trim());
return pinyin1.compareTo(pinyin2);
});
return list;
}
@Override
public InstallResult addVirtualApp(AppInfoLite info) {
int flags = InstallStrategy.COMPARE_VERSION | InstallStrategy.SKIP_DEX_OPT;
info.fastOpen = false; // disable fast open for compile.
if (DeviceUtil.isMeizuBelowN()) {
info.fastOpen = true;
}
if (info.fastOpen) {
flags |= InstallStrategy.DEPEND_SYSTEM_IF_EXIST;
}
if (info.disableMultiVersion) {
flags |= InstallStrategy.UPDATE_IF_EXIST;
}
return VirtualCore.get().installPackage(info.path, flags);
}
@Override
public boolean removeVirtualApp(String packageName, int userId) {
return VirtualCore.get().uninstallPackageAsUser(packageName, userId);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/repo/PackageAppDataStorage.java
================================================
package io.virtualapp.home.repo;
import android.content.pm.ApplicationInfo;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.remote.InstalledAppInfo;
import java.util.HashMap;
import java.util.Map;
import io.virtualapp.XApp;
import io.virtualapp.abs.Callback;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.home.models.PackageAppData;
/**
* @author Lody
* <p>
* Cache the loaded PackageAppData.
*/
public class PackageAppDataStorage {
private static final PackageAppDataStorage STORAGE = new PackageAppDataStorage();
private final Map<String, PackageAppData> packageDataMap = new HashMap<>();
public static PackageAppDataStorage get() {
return STORAGE;
}
public PackageAppData acquire(String packageName) {
PackageAppData data;
synchronized (packageDataMap) {
data = packageDataMap.get(packageName);
if (data == null) {
data = loadAppData(packageName);
}
}
return data;
}
public void acquire(String packageName, Callback<PackageAppData> callback) {
VUiKit.defer()
.when(() -> acquire(packageName))
.done(callback::callback);
}
private PackageAppData loadAppData(String packageName) {
InstalledAppInfo setting = VirtualCore.get().getInstalledAppInfo(packageName, 0);
if (setting != null) {
PackageAppData data = new PackageAppData(XApp.getApp(), setting);
synchronized (packageDataMap) {
packageDataMap.put(packageName, data);
}
return data;
}
return null;
}
public PackageAppData acquire(ApplicationInfo appInfo) {
PackageAppData data;
synchronized (packageDataMap) {
data = packageDataMap.get(appInfo.packageName);
if (data == null) {
data = loadAppData(appInfo);
}
}
return data;
}
public void acquire(ApplicationInfo appInfo, Callback<PackageAppData> callback) {
VUiKit.defer()
.when(() -> acquire(appInfo))
.done(callback::callback);
}
private PackageAppData loadAppData(ApplicationInfo appInfo) {
PackageAppData data = new PackageAppData(XApp.getApp(), appInfo);
synchronized (packageDataMap) {
packageDataMap.put(appInfo.packageName, data);
}
return data;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/AboutActivity.java
================================================
package io.virtualapp.settings;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.view.Gravity;
import android.view.View;
import android.widget.Toast;
import java.util.Calendar;
import io.virtualapp.R;
import io.virtualapp.abs.ui.VActivity;
import io.virtualapp.update.VAVersionService;
import mehdi.sakout.aboutpage.AboutPage;
import mehdi.sakout.aboutpage.Element;
/**
* author: weishu on 18/1/12.
*/
public class AboutActivity extends VActivity {
private AboutPage mPage;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPage = new AboutPage(this)
.isRTL(false)
.setImage(R.mipmap.ic_launcher)
.addItem(getCopyRightsElement())
.addItem(getVersionElement())
.addItem(getCheckUpdateElement())
.addItem(getFeedbackEmailElement())
.addItem(getThanksElement())
.addItem(getFeedbacTelegramElement())
.addItem(getWebsiteElement())
.addGitHub("tiann");
View aboutPage = mPage.create();
setContentView(aboutPage);
}
Element getCopyRightsElement() {
Element copyRightsElement = new Element();
final String copyrights = String.format(getString(R.string.copy_right), Calendar.getInstance().get(Calendar.YEAR));
copyRightsElement.setTitle(copyrights);
copyRightsElement.setGravity(Gravity.START);
return copyRightsElement;
}
Element getVersionElement() {
Element version = new Element();
String versionName = "unknown";
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException ignored) {
}
version.setTitle(getResources().getString(R.string.about_version_title, versionName));
final int[] clickCount = {0};
version.setOnClickListener(v -> {
clickCount[0]++;
if (clickCount[0] == 3) {
mPage.addItem(getFeedbackQQElement());
mPage.addItem(getFeedbackWechatElement());
}
});
return version;
}
Element getFeedbackQQElement() {
Element feedback = new Element();
final String qqGroup = "597478474";
feedback.setTitle(getResources().getString(R.string.about_feedback_qq_title));
feedback.setOnClickListener(v -> {
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
if (clipboardManager != null) {
clipboardManager.setPrimaryClip(ClipData.newPlainText(null, qqGroup));
}
Toast.makeText(v.getContext(), getResources().getString(R.string.about_feedback_tips), Toast.LENGTH_SHORT).show();
});
return feedback;
}
Element getFeedbackEmailElement() {
Element emailElement = new Element();
final String email = "virtualxposed@gmail.com";
String title = getResources().getString(R.string.about_feedback_title);
emailElement.setTitle(title);
Uri uri = Uri.parse("mailto:" + email);
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
intent.putExtra(Intent.EXTRA_SUBJECT, title); // 主题
String hint = getResources().getString(R.string.about_feedback_hint);
intent.putExtra(Intent.EXTRA_TEXT, hint);
emailElement.setIntent(intent);
return emailElement;
}
Element getFeedbackWechatElement() {
Element feedback = new Element();
// final String weChatGroup = "CSYJZF";
feedback.setTitle(getResources().getString(R.string.about_feedback_wechat_title));
feedback.setOnClickListener(v -> {
ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
if (clipboardManager != null) {
clipboardManager.setPrimaryClip(ClipData.newPlainText(null, "VirtualXposed"));
}
Toast.makeText(v.getContext(), getResources().getString(R.string.about_feedback_tips), Toast.LENGTH_SHORT).show();
});
return feedback;
}
Element getFeedbacTelegramElement() {
Element feedback = new Element();
final String weChatGroup = "VirtualXposed";
feedback.setTitle(getResources().getString(R.string.about_feedback_tel_title, weChatGroup));
feedback.setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://t.me/joinchat/Gtti8Usj1JD4TchHQmy-ew"));
try {
startActivity(intent);
} catch (Throwable ignored) {
}
});
return feedback;
}
Element getWebsiteElement() {
Element feedback = new Element();
feedback.setTitle(getResources().getString(R.string.about_website_title));
feedback.setOnClickListener(v -> {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://vxposed.com"));
try {
startActivity(intent);
} catch (Throwable ignored) {
}
});
return feedback;
}
Element getThanksElement() {
Element thanks = new Element();
thanks.setTitle(getResources().getString(R.string.about_thanks));
thanks.setOnClickListener(v -> {
AlertDialog alertDialog = new AlertDialog.Builder(this, R.style.Theme_AppCompat_DayNight_Dialog_Alert)
.setTitle(R.string.thanks_dialog_title)
.setMessage(R.string.thanks_dialog_content)
.setPositiveButton(R.string.about_icon_yes, null)
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
// BadTokenException.
}
});
return thanks;
}
Element getCheckUpdateElement() {
Element checkUpdate = new Element();
checkUpdate.setTitle(getResources().getString(R.string.check_update));
checkUpdate.setOnClickListener(v -> {
VAVersionService.checkUpdateImmediately(getApplicationContext(), true);
});
return checkUpdate;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/AppManageActivity.java
================================================
package io.virtualapp.settings;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.ipc.VirtualStorageManager;
import com.lody.virtual.helper.ArtDexOptimizer;
import com.lody.virtual.os.VEnvironment;
import com.lody.virtual.remote.InstalledAppInfo;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import io.virtualapp.R;
import io.virtualapp.abs.ui.VActivity;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.glide.GlideUtils;
/**
* @author weishu
* @date 18/2/15.
*/
public class AppManageActivity extends VActivity {
private ListView mListView;
private List<AppManageInfo> mInstalledApps = new ArrayList<>();
private AppManageAdapter mAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);
mListView = (ListView) findViewById(R.id.list);
mAdapter = new AppManageAdapter();
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener((parent, view, position, id) -> {
AppManageInfo appManageInfo = mInstalledApps.get(position);
showContextMenu(appManageInfo, view);
});
loadAsync();
}
private void loadAsync() {
VUiKit.defer().when(this::loadApp).done((v) -> mAdapter.notifyDataSetChanged());
}
private void loadApp() {
List<AppManageInfo> ret = new ArrayList<>();
List<InstalledAppInfo> installedApps = VirtualCore.get().getInstalledApps(0);
PackageManager packageManager = getPackageManager();
for (InstalledAppInfo installedApp : installedApps) {
int[] installedUsers = installedApp.getInstalledUsers();
for (int installedUser : installedUsers) {
AppManageInfo info = new AppManageInfo();
info.userId = installedUser;
ApplicationInfo applicationInfo = installedApp.getApplicationInfo(installedUser);
info.name = applicationInfo.loadLabel(packageManager);
// info.icon = applicationInfo.loadIcon(packageManager); //Use Glide to load icon async
info.pkgName = installedApp.packageName;
info.path = applicationInfo.sourceDir;
ret.add(info);
}
}
mInstalledApps.clear();
mInstalledApps.addAll(ret);
}
class AppManageAdapter extends BaseAdapter {
@Override
public int getCount() {
return mInstalledApps.size();
}
@Override
public AppManageInfo getItem(int position) {
return mInstalledApps.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder(AppManageActivity.this, parent);
convertView = holder.root;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
AppManageInfo item = getItem(position);
holder.label.setText(item.getName());
if (VirtualCore.get().isOutsideInstalled(item.pkgName)) {
GlideUtils.loadInstalledPackageIcon(getContext(), item.pkgName, holder.icon, android.R.drawable.sym_def_app_icon);
} else {
GlideUtils.loadPackageIconFromApkFile(getContext(), item.path, holder.icon, android.R.drawable.sym_def_app_icon);
}
holder.button.setOnClickListener(v -> showContextMenu(item, v));
return convertView;
}
}
private void showContextMenu(AppManageInfo appManageInfo, View anchor) {
if (appManageInfo == null) {
return;
}
PopupMenu popupMenu = new PopupMenu(this, anchor);
popupMenu.inflate(R.menu.app_manage_menu);
MenuItem redirectMenu = popupMenu.getMenu().findItem(R.id.action_redirect);
try {
final String packageName = appManageInfo.pkgName;
final int userId = appManageInfo.userId;
boolean virtualStorageEnable = VirtualStorageManager.get().isVirtualStorageEnable(packageName, userId);
redirectMenu.setTitle(virtualStorageEnable ? R.string.app_manage_redirect_off : R.string.app_manage_redirect_on);
} catch (Throwable e) {
redirectMenu.setVisible(false);
}
popupMenu.setOnMenuItemClickListener(item -> {
switch (item.getItemId()) {
case R.id.action_uninstall:
showUninstallDialog(appManageInfo, appManageInfo.getName());
break;
case R.id.action_repair:
showRepairDialog(appManageInfo);
break;
case R.id.action_redirect:
showStorageRedirectDialog(appManageInfo);
break;
}
return false;
});
try {
popupMenu.show();
} catch (Throwable ignored) {
}
}
private void showRepairDialog(AppManageInfo item) {
ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle(getResources().getString(R.string.app_manage_repairing));
try {
dialog.setCancelable(false);
dialog.show();
} catch (Throwable e) {
return;
}
VUiKit.defer().when(() -> {
NougatPolicy.fullCompile(getApplicationContext());
String packageName = item.pkgName;
String apkPath = item.path;
if (TextUtils.isEmpty(packageName) || TextUtils.isEmpty(apkPath)) {
return;
}
// 1. kill package
VirtualCore.get().killApp(packageName, item.userId);
// 2. backup the odex file
File odexFile = VEnvironment.getOdexFile(packageName);
if (odexFile.delete()) {
try {
ArtDexOptimizer.compileDex2Oat(apkPath, odexFile.getPath());
} catch (IOException e) {
throw new RuntimeException("compile failed.");
}
}
}).done((v) -> {
dismiss(dialog);
showAppDetailDialog();
}).fail((v) -> {
dismiss(dialog);
Toast.makeText(this, R.string.app_manage_repair_failed_tips, Toast.LENGTH_SHORT).show();
});
}
private void showAppDetailDialog() {
AlertDialog alertDialog = new AlertDialog.Builder(AppManageActivity.this)
.setTitle(R.string.app_manage_repair_success_title)
.setMessage(getResources().getString(R.string.app_manage_repair_success_content))
.setPositiveButton(R.string.app_manage_repair_reboot_now, (dialog, which) -> {
String packageName = getPackageName();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", packageName, null));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
})
.create();
alertDialog.setCancelable(false);
try {
alertDialog.show();
} catch (Throwable ignored) {
}
}
private void showUninstallDialog(AppManageInfo item, CharSequence name) {
AlertDialog alertDialog = new AlertDialog.Builder(AppManageActivity.this)
.setTitle(com.android.launcher3.R.string.home_menu_delete_title)
.setMessage(getResources().getString(com.android.launcher3.R.string.home_menu_delete_content, name))
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
VirtualCore.get().uninstallPackageAsUser(item.pkgName, item.userId);
loadAsync();
})
.setNegativeButton(android.R.string.no, null)
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
}
}
private void showStorageRedirectDialog(AppManageInfo item) {
final String packageName = item.pkgName;
final int userId = item.userId;
boolean virtualStorageEnable;
try {
virtualStorageEnable = VirtualStorageManager.get().isVirtualStorageEnable(packageName, userId);
} catch (Throwable e) {
return;
}
AlertDialog alertDialog = new AlertDialog.Builder(AppManageActivity.this)
.setTitle(virtualStorageEnable ? R.string.app_manage_redirect_off : R.string.app_manage_redirect_on)
.setMessage(getResources().getString(R.string.app_manage_redirect_desc))
.setPositiveButton(virtualStorageEnable ? R.string.app_manage_redirect_off_confirm : R.string.app_manage_redirect_on_confirm,
(dialog, which) -> {
try {
VirtualStorageManager.get().setVirtualStorageState(packageName, userId, !virtualStorageEnable);
} catch (Throwable ignored) {
}
})
.setNegativeButton(android.R.string.no, null)
.create();
try {
alertDialog.show();
} catch (Throwable ignored) {
}
}
static class ViewHolder {
ImageView icon;
TextView label;
ImageView button;
View root;
ViewHolder(Context context, ViewGroup parent) {
root = LayoutInflater.from(context).inflate(R.layout.item_app_manage, parent, false);
icon = root.findViewById(R.id.item_app_icon);
label = root.findViewById(R.id.item_app_name);
button = root.findViewById(R.id.item_app_button);
}
}
static class AppManageInfo {
CharSequence name;
int userId;
Drawable icon;
String pkgName;
String path;
CharSequence getName() {
if (userId == 0) {
return name;
} else {
return name + "[" + (userId + 1) + "]";
}
}
}
private static void dismiss(Dialog dialog) {
if (dialog == null) {
return;
}
try {
dialog.dismiss();
} catch (Throwable ignored) {
}
}
}
================
gitextract_16jertsa/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── bug_report_cn.md
│ │ ├── feature_request.md
│ │ └── feature_request_cn.md
│ ├── issue-close-app.yml
│ ├── stale.yml
│ └── workflows/
│ └── android.yml
├── .gitignore
├── .gitmodules
├── .travis.yml
├── CHINESE.md
├── LICENSE.txt
├── README.md
└── VirtualApp/
├── .gitignore
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── aosp/
│ │ └── java/
│ │ └── io/
│ │ └── virtualapp/
│ │ └── delegate/
│ │ ├── MyCrashHandler.java
│ │ └── MyVirtualInitializer.java
│ ├── fdroid/
│ │ └── java/
│ │ └── io/
│ │ └── virtualapp/
│ │ └── delegate/
│ │ └── MyVirtualInitializer.java
│ └── main/
│ ├── AndroidManifest.xml
│ ├── assets/
│ │ └── XposedInstaller_3.1.5.apk_
│ ├── java/
│ │ └── io/
│ │ └── virtualapp/
│ │ ├── VCommends.java
│ │ ├── XApp.java
│ │ ├── abs/
│ │ │ ├── BasePresenter.java
│ │ │ ├── BaseView.java
│ │ │ ├── Callback.java
│ │ │ └── ui/
│ │ │ ├── VActivity.java
│ │ │ ├── VFragment.java
│ │ │ └── VUiKit.java
│ │ ├── delegate/
│ │ │ ├── BaseCrashHandler.java
│ │ │ ├── BaseVirtualInitializer.java
│ │ │ ├── MyAppRequestListener.java
│ │ │ ├── MyComponentDelegate.java
│ │ │ ├── MyPhoneInfoDelegate.java
│ │ │ └── MyTaskDescDelegate.java
│ │ ├── dev/
│ │ │ └── CmdReceiver.java
│ │ ├── glide/
│ │ │ ├── GlideUtils.java
│ │ │ ├── MyGlideModule.java
│ │ │ ├── PackageIconResourceDataFetcher.java
│ │ │ ├── PackageIconResourceLoader.java
│ │ │ └── PackageIconResourceLoaderFactory.java
│ │ ├── gms/
│ │ │ └── FakeGms.java
│ │ ├── home/
│ │ │ ├── ListAppActivity.java
│ │ │ ├── ListAppContract.java
│ │ │ ├── ListAppFragment.java
│ │ │ ├── ListAppPresenterImpl.java
│ │ │ ├── LoadingActivity.java
│ │ │ ├── NewHomeActivity.java
│ │ │ ├── adapters/
│ │ │ │ ├── AppPagerAdapter.java
│ │ │ │ └── CloneAppListAdapter.java
│ │ │ ├── models/
│ │ │ │ ├── AppData.java
│ │ │ │ ├── AppInfo.java
│ │ │ │ ├── AppInfoLite.java
│ │ │ │ ├── MultiplePackageAppData.java
│ │ │ │ └── PackageAppData.java
│ │ │ └── repo/
│ │ │ ├── AppDataSource.java
│ │ │ ├── AppRepository.java
│ │ │ └── PackageAppDataStorage.java
│ │ ├── settings/
│ │ │ ├── AboutActivity.java
│ │ │ ├── AppManageActivity.java
│ │ │ ├── NougatPolicy.java
│ │ │ ├── OnlinePlugin.java
│ │ │ ├── RecommendPluginActivity.java
│ │ │ ├── SettingsActivity.java
│ │ │ └── TaskManageActivity.java
│ │ ├── splash/
│ │ │ └── SplashActivity.java
│ │ ├── sys/
│ │ │ ├── Installd.java
│ │ │ ├── InstallerActivity.java
│ │ │ └── ShareBridgeActivity.java
│ │ ├── update/
│ │ │ └── VAVersionService.java
│ │ ├── utils/
│ │ │ ├── DialogUtil.java
│ │ │ ├── HanziToPinyin.java
│ │ │ └── Misc.java
│ │ └── widgets/
│ │ ├── BaseView.java
│ │ ├── CardStackAdapter.java
│ │ ├── CardStackLayout.java
│ │ ├── DragSelectRecyclerView.java
│ │ ├── DragSelectRecyclerViewAdapter.java
│ │ ├── EatBeansView.java
│ │ ├── Indicator.java
│ │ ├── LabelView.java
│ │ ├── MarqueeTextView.java
│ │ └── fittext/
│ │ ├── BaseTextView.java
│ │ ├── FitTextHelper.java
│ │ └── FitTextView.java
│ └── res/
│ ├── drawable/
│ │ ├── blue_circle.xml
│ │ ├── fab_bg.xml
│ │ ├── home_bg.xml
│ │ ├── icon_bg.xml
│ │ ├── sel_clone_app_btn.xml
│ │ ├── sel_guide_btn.xml
│ │ ├── shape_clone_app_btn.xml
│ │ └── shape_clone_app_btn_pressed.xml
│ ├── drawable-nodpi/
│ │ ├── about_icon_copy_right.xml
│ │ └── ic_more.xml
│ ├── layout/
│ │ ├── activity_clone_app.xml
│ │ ├── activity_install.xml
│ │ ├── activity_list.xml
│ │ ├── activity_loading.xml
│ │ ├── activity_location_settings.xml
│ │ ├── activity_marker.xml
│ │ ├── activity_splash.xml
│ │ ├── activity_users.xml
│ │ ├── content_toolbar.xml
│ │ ├── fragment_list_app.xml
│ │ ├── item_app.xml
│ │ ├── item_app_manage.xml
│ │ ├── item_clone_app.xml
│ │ ├── item_location_app.xml
│ │ ├── item_plugin_recommend.xml
│ │ ├── item_share.xml
│ │ ├── item_task_manage.xml
│ │ └── item_user.xml
│ ├── menu/
│ │ ├── app_manage_menu.xml
│ │ ├── main_menu.xml
│ │ └── marktet_map.xml
│ ├── values/
│ │ ├── attrs.xml
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── fitTextView.xml
│ │ ├── ids.xml
│ │ ├── integers.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ ├── values-en/
│ │ └── strings.xml
│ ├── values-es/
│ │ └── strings.xml
│ ├── values-fr/
│ │ └── strings.xml
│ ├── values-ja/
│ │ └── strings.xml
│ ├── values-pt-rBR/
│ │ └── strings.xml
│ ├── values-ru/
│ │ └── strings.xml
│ ├── values-uk/
│ │ └── strings.xml
│ ├── values-zh-rCN/
│ │ └── strings.xml
│ ├── values-zh-rTW/
│ │ └── strings.xml
│ └── xml/
│ └── settings_preferences.xml
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── lib/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ └── main/
│ ├── AndroidManifest.xml
│ ├── aidl/
│ │ ├── android/
│ │ │ ├── accounts/
│ │ │ │ ├── IAccountAuthenticator.aidl
│ │ │ │ ├── IAccountAuthenticatorResponse.aidl
│ │ │ │ └── IAccountManagerResponse.aidl
│ │ │ ├── app/
│ │ │ │ ├── IActivityManager/
│ │ │ │ │ └── ContentProviderHolder.aidl
│ │ │ │ ├── IServiceConnection.aidl
│ │ │ │ ├── IStopUserCallback.aidl
│ │ │ │ └── job/
│ │ │ │ ├── IJobCallback.aidl
│ │ │ │ └── IJobService.aidl
│ │ │ ├── content/
│ │ │ │ ├── IIntentReceiver.aidl
│ │ │ │ ├── ISyncAdapter.aidl
│ │ │ │ ├── ISyncContext.aidl
│ │ │ │ ├── ISyncStatusObserver.aidl
│ │ │ │ └── pm/
│ │ │ │ ├── IPackageDataObserver.aidl
│ │ │ │ ├── IPackageDeleteObserver2.aidl
│ │ │ │ ├── IPackageInstallObserver.aidl
│ │ │ │ ├── IPackageInstallObserver2.aidl
│ │ │ │ ├── IPackageInstallerCallback.aidl
│ │ │ │ └── IPackageInstallerSession.aidl
│ │ │ ├── location/
│ │ │ │ └── ILocationListener.aidl
│ │ │ └── net/
│ │ │ ├── IConnectivityManager.aidl
│ │ │ └── wifi/
│ │ │ └── IWifiScanner.aidl
│ │ └── com/
│ │ └── lody/
│ │ └── virtual/
│ │ ├── client/
│ │ │ └── IVClient.aidl
│ │ ├── os/
│ │ │ └── VUserInfo.aidl
│ │ ├── remote/
│ │ │ ├── AppTaskInfo.aidl
│ │ │ ├── BadgerInfo.aidl
│ │ │ ├── InstallResult.aidl
│ │ │ ├── InstalledAppInfo.aidl
│ │ │ ├── PendingIntentData.aidl
│ │ │ ├── PendingResultData.aidl
│ │ │ ├── Problem.aidl
│ │ │ ├── ReceiverInfo.aidl
│ │ │ ├── VDeviceInfo.aidl
│ │ │ ├── VParceledListSlice.aidl
│ │ │ └── vloc/
│ │ │ ├── VCell.aidl
│ │ │ ├── VLocation.aidl
│ │ │ └── VWifi.aidl
│ │ └── server/
│ │ ├── IAccountManager.aidl
│ │ ├── IActivityManager.aidl
│ │ ├── IAppManager.aidl
│ │ ├── IBinderDelegateService.aidl
│ │ ├── IDeviceInfoManager.aidl
│ │ ├── IJobScheduler.aidl
│ │ ├── INotificationManager.aidl
│ │ ├── IPackageInstaller.aidl
│ │ ├── IPackageInstallerSession.aidl
│ │ ├── IPackageManager.aidl
│ │ ├── IUserManager.aidl
│ │ ├── IVirtualLocationManager.aidl
│ │ ├── IVirtualStorageService.aidl
│ │ ├── interfaces/
│ │ │ ├── IAppRequestListener.aidl
│ │ │ ├── IIntentFilterObserver.aidl
│ │ │ ├── IPackageObserver.aidl
│ │ │ ├── IProcessObserver.aidl
│ │ │ ├── IServiceFetcher.aidl
│ │ │ └── IUiCallback.aidl
│ │ └── pm/
│ │ └── installer/
│ │ ├── SessionInfo.aidl
│ │ └── SessionParams.aidl
│ ├── java/
│ │ ├── android/
│ │ │ ├── app/
│ │ │ │ ├── ActivityOptions.java
│ │ │ │ ├── ActivityThread.java
│ │ │ │ ├── ClientTransactionHandler.java
│ │ │ │ ├── LoadedApk.java
│ │ │ │ ├── TransactionHandlerProxy.java
│ │ │ │ └── servertransaction/
│ │ │ │ ├── ClientTransaction.java
│ │ │ │ ├── PendingTransactionActions.java
│ │ │ │ └── TransactionExecutor.java
│ │ │ ├── content/
│ │ │ │ ├── SyncStatusInfo.java
│ │ │ │ ├── pm/
│ │ │ │ │ └── PackageParser.java
│ │ │ │ └── res/
│ │ │ │ └── CompatibilityInfo.java
│ │ │ ├── location/
│ │ │ │ └── LocationRequest.java
│ │ │ ├── util/
│ │ │ │ └── MergedConfiguration.java
│ │ │ └── view/
│ │ │ └── DisplayAdjustments.java
│ │ ├── com/
│ │ │ └── lody/
│ │ │ └── virtual/
│ │ │ ├── Build.java
│ │ │ ├── DelegateApplication64Bit.java
│ │ │ ├── GmsSupport.java
│ │ │ ├── client/
│ │ │ │ ├── NativeEngine.java
│ │ │ │ ├── VClientImpl.java
│ │ │ │ ├── badger/
│ │ │ │ │ ├── BadgerManager.java
│ │ │ │ │ ├── BroadcastBadger1.java
│ │ │ │ │ ├── BroadcastBadger2.java
│ │ │ │ │ └── IBadger.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── CrashHandler.java
│ │ │ │ │ ├── InstallStrategy.java
│ │ │ │ │ ├── InvocationStubManager.java
│ │ │ │ │ └── VirtualCore.java
│ │ │ │ ├── env/
│ │ │ │ │ ├── Constants.java
│ │ │ │ │ ├── DeadServerException.java
│ │ │ │ │ ├── GPSStateline.java
│ │ │ │ │ ├── SpecialComponentList.java
│ │ │ │ │ ├── VirtualGPSSatalines.java
│ │ │ │ │ └── VirtualRuntime.java
│ │ │ │ ├── fixer/
│ │ │ │ │ ├── ActivityFixer.java
│ │ │ │ │ ├── ComponentFixer.java
│ │ │ │ │ └── ContextFixer.java
│ │ │ │ ├── hook/
│ │ │ │ │ ├── base/
│ │ │ │ │ │ ├── BinderInvocationProxy.java
│ │ │ │ │ │ ├── BinderInvocationStub.java
│ │ │ │ │ │ ├── Inject.java
│ │ │ │ │ │ ├── LogInvocation.java
│ │ │ │ │ │ ├── MethodBox.java
│ │ │ │ │ │ ├── MethodInvocationProxy.java
│ │ │ │ │ │ ├── MethodInvocationStub.java
│ │ │ │ │ │ ├── MethodProxy.java
│ │ │ │ │ │ ├── ReplaceCallingPkgMethodProxy.java
│ │ │ │ │ │ ├── ReplaceLastPkgMethodProxy.java
│ │ │ │ │ │ ├── ReplaceLastUidMethodProxy.java
│ │ │ │ │ │ ├── ReplaceSequencePkgMethodProxy.java
│ │ │ │ │ │ ├── ReplaceSpecPkgMethodProxy.java
│ │ │ │ │ │ ├── ReplaceUidMethodProxy.java
│ │ │ │ │ │ ├── ResultStaticMethodProxy.java
│ │ │ │ │ │ ├── SkipInject.java
│ │ │ │ │ │ └── StaticMethodProxy.java
│ │ │ │ │ ├── delegate/
│ │ │ │ │ │ ├── AppInstrumentation.java
│ │ │ │ │ │ ├── ComponentDelegate.java
│ │ │ │ │ │ ├── InstrumentationDelegate.java
│ │ │ │ │ │ ├── PhoneInfoDelegate.java
│ │ │ │ │ │ └── TaskDescriptionDelegate.java
│ │ │ │ │ ├── providers/
│ │ │ │ │ │ ├── DownloadProviderHook.java
│ │ │ │ │ │ ├── ExternalProviderHook.java
│ │ │ │ │ │ ├── InternalProviderHook.java
│ │ │ │ │ │ ├── MediaProviderHook.java
│ │ │ │ │ │ ├── ProviderHook.java
│ │ │ │ │ │ ├── QueryRedirectCursor.java
│ │ │ │ │ │ └── SettingsProviderHook.java
│ │ │ │ │ ├── proxies/
│ │ │ │ │ │ ├── account/
│ │ │ │ │ │ │ └── AccountManagerStub.java
│ │ │ │ │ │ ├── alarm/
│ │ │ │ │ │ │ └── AlarmManagerStub.java
│ │ │ │ │ │ ├── am/
│ │ │ │ │ │ │ ├── ActivityManagerStub.java
│ │ │ │ │ │ │ ├── ActivityTaskManagerStub.java
│ │ │ │ │ │ │ ├── HCallbackStub.java
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── TransactionHandlerStub.java
│ │ │ │ │ │ ├── appops/
│ │ │ │ │ │ │ └── AppOpsManagerStub.java
│ │ │ │ │ │ ├── appwidget/
│ │ │ │ │ │ │ └── AppWidgetManagerStub.java
│ │ │ │ │ │ ├── audio/
│ │ │ │ │ │ │ └── AudioManagerStub.java
│ │ │ │ │ │ ├── backup/
│ │ │ │ │ │ │ └── BackupManagerStub.java
│ │ │ │ │ │ ├── battery/
│ │ │ │ │ │ │ └── BatteryStatsStub.java
│ │ │ │ │ │ ├── bluetooth/
│ │ │ │ │ │ │ └── BluetoothStub.java
│ │ │ │ │ │ ├── clipboard/
│ │ │ │ │ │ │ └── ClipBoardStub.java
│ │ │ │ │ │ ├── connectivity/
│ │ │ │ │ │ │ └── ConnectivityStub.java
│ │ │ │ │ │ ├── content/
│ │ │ │ │ │ │ ├── ContentServiceStub.java
│ │ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ │ ├── context_hub/
│ │ │ │ │ │ │ └── ContextHubServiceStub.java
│ │ │ │ │ │ ├── devicepolicy/
│ │ │ │ │ │ │ └── DevicePolicyManagerStub.java
│ │ │ │ │ │ ├── display/
│ │ │ │ │ │ │ └── DisplayStub.java
│ │ │ │ │ │ ├── dropbox/
│ │ │ │ │ │ │ └── DropBoxManagerStub.java
│ │ │ │ │ │ ├── fingerprint/
│ │ │ │ │ │ │ └── FingerprintManagerStub.java
│ │ │ │ │ │ ├── graphics/
│ │ │ │ │ │ │ └── GraphicsStatsStub.java
│ │ │ │ │ │ ├── imms/
│ │ │ │ │ │ │ └── MmsStub.java
│ │ │ │ │ │ ├── input/
│ │ │ │ │ │ │ ├── InputMethodManagerStub.java
│ │ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ │ ├── isms/
│ │ │ │ │ │ │ └── ISmsStub.java
│ │ │ │ │ │ ├── isub/
│ │ │ │ │ │ │ └── ISubStub.java
│ │ │ │ │ │ ├── job/
│ │ │ │ │ │ │ └── JobServiceStub.java
│ │ │ │ │ │ ├── libcore/
│ │ │ │ │ │ │ ├── LibCoreStub.java
│ │ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ │ ├── location/
│ │ │ │ │ │ │ ├── GPSListenerThread.java
│ │ │ │ │ │ │ ├── GPSStatusListenerThread.java
│ │ │ │ │ │ │ ├── LocationManagerStub.java
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── MockLocationHelper.java
│ │ │ │ │ │ ├── media/
│ │ │ │ │ │ │ ├── router/
│ │ │ │ │ │ │ │ └── MediaRouterServiceStub.java
│ │ │ │ │ │ │ └── session/
│ │ │ │ │ │ │ └── SessionManagerStub.java
│ │ │ │ │ │ ├── mount/
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── MountServiceStub.java
│ │ │ │ │ │ ├── network/
│ │ │ │ │ │ │ └── NetworkManagementStub.java
│ │ │ │ │ │ ├── notification/
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── NotificationManagerStub.java
│ │ │ │ │ │ ├── os/
│ │ │ │ │ │ │ └── DeviceIdentifiersPolicyServiceStub.java
│ │ │ │ │ │ ├── persistent_data_block/
│ │ │ │ │ │ │ └── PersistentDataBlockServiceStub.java
│ │ │ │ │ │ ├── phonesubinfo/
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── PhoneSubInfoStub.java
│ │ │ │ │ │ ├── pm/
│ │ │ │ │ │ │ ├── LauncherAppsStub.java
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ └── PackageManagerStub.java
│ │ │ │ │ │ ├── power/
│ │ │ │ │ │ │ └── PowerManagerStub.java
│ │ │ │ │ │ ├── restriction/
│ │ │ │ │ │ │ └── RestrictionStub.java
│ │ │ │ │ │ ├── search/
│ │ │ │ │ │ │ └── SearchManagerStub.java
│ │ │ │ │ │ ├── shortcut/
│ │ │ │ │ │ │ └── ShortcutServiceStub.java
│ │ │ │ │ │ ├── telephony/
│ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ ├── TelephonyRegistryStub.java
│ │ │ │ │ │ │ └── TelephonyStub.java
│ │ │ │ │ │ ├── usage/
│ │ │ │ │ │ │ └── UsageStatsManagerStub.java
│ │ │ │ │ │ ├── user/
│ │ │ │ │ │ │ └── UserManagerStub.java
│ │ │ │ │ │ ├── vibrator/
│ │ │ │ │ │ │ └── VibratorStub.java
│ │ │ │ │ │ ├── view/
│ │ │ │ │ │ │ └── AutoFillManagerStub.java
│ │ │ │ │ │ ├── wifi/
│ │ │ │ │ │ │ └── WifiManagerStub.java
│ │ │ │ │ │ ├── wifi_scanner/
│ │ │ │ │ │ │ ├── GhostWifiScannerImpl.java
│ │ │ │ │ │ │ └── WifiScannerStub.java
│ │ │ │ │ │ └── window/
│ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ ├── WindowManagerStub.java
│ │ │ │ │ │ └── session/
│ │ │ │ │ │ ├── BaseMethodProxy.java
│ │ │ │ │ │ └── WindowSessionPatch.java
│ │ │ │ │ ├── secondary/
│ │ │ │ │ │ ├── HackAppUtils.java
│ │ │ │ │ │ ├── ProxyServiceFactory.java
│ │ │ │ │ │ ├── ServiceConnectionDelegate.java
│ │ │ │ │ │ └── StubBinder.java
│ │ │ │ │ └── utils/
│ │ │ │ │ └── MethodParameterUtils.java
│ │ │ │ ├── interfaces/
│ │ │ │ │ └── IInjector.java
│ │ │ │ ├── ipc/
│ │ │ │ │ ├── ActivityClientRecord.java
│ │ │ │ │ ├── LocalProxyUtils.java
│ │ │ │ │ ├── ProviderCall.java
│ │ │ │ │ ├── ServiceManagerNative.java
│ │ │ │ │ ├── VAccountManager.java
│ │ │ │ │ ├── VActivityManager.java
│ │ │ │ │ ├── VDeviceManager.java
│ │ │ │ │ ├── VJobScheduler.java
│ │ │ │ │ ├── VNotificationManager.java
│ │ │ │ │ ├── VPackageManager.java
│ │ │ │ │ ├── VirtualLocationManager.java
│ │ │ │ │ └── VirtualStorageManager.java
│ │ │ │ ├── natives/
│ │ │ │ │ └── NativeMethods.java
│ │ │ │ └── stub/
│ │ │ │ ├── AmsTask.java
│ │ │ │ ├── ChooseAccountTypeActivity.java
│ │ │ │ ├── ChooseTypeAndAccountActivity.java
│ │ │ │ ├── ChooserActivity.java
│ │ │ │ ├── DaemonJobService.java
│ │ │ │ ├── DaemonService.java
│ │ │ │ ├── ResolverActivity.java
│ │ │ │ ├── ShortcutHandleActivity.java
│ │ │ │ ├── StubActivity.java
│ │ │ │ ├── StubCP.java
│ │ │ │ ├── StubDialog.java
│ │ │ │ ├── StubExcludeFromRecentActivity.java
│ │ │ │ ├── StubJob.java
│ │ │ │ ├── StubPendingActivity.java
│ │ │ │ ├── StubPendingReceiver.java
│ │ │ │ ├── StubPendingService.java
│ │ │ │ └── VASettings.java
│ │ │ ├── helper/
│ │ │ │ ├── ArtDexOptimizer.java
│ │ │ │ ├── ParcelHelper.java
│ │ │ │ ├── PersistenceLayer.java
│ │ │ │ ├── collection/
│ │ │ │ │ ├── ArrayMap.java
│ │ │ │ │ ├── ArraySet.java
│ │ │ │ │ ├── ContainerHelpers.java
│ │ │ │ │ ├── IntArray.java
│ │ │ │ │ ├── MapCollections.java
│ │ │ │ │ ├── SimpleArrayMap.java
│ │ │ │ │ └── SparseArray.java
│ │ │ │ ├── compat/
│ │ │ │ │ ├── AccountManagerCompat.java
│ │ │ │ │ ├── ActivityManagerCompat.java
│ │ │ │ │ ├── ApplicationThreadCompat.java
│ │ │ │ │ ├── BuildCompat.java
│ │ │ │ │ ├── BundleCompat.java
│ │ │ │ │ ├── ContentProviderCompat.java
│ │ │ │ │ ├── ContentResolverCompat.java
│ │ │ │ │ ├── IApplicationThreadCompat.java
│ │ │ │ │ ├── NativeLibraryHelperCompat.java
│ │ │ │ │ ├── ObjectsCompat.java
│ │ │ │ │ ├── PackageParserCompat.java
│ │ │ │ │ ├── ParceledListSliceCompat.java
│ │ │ │ │ ├── StorageManagerCompat.java
│ │ │ │ │ └── SystemPropertiesCompat.java
│ │ │ │ └── utils/
│ │ │ │ ├── ArrayUtils.java
│ │ │ │ ├── AtomicFile.java
│ │ │ │ ├── BitmapUtils.java
│ │ │ │ ├── ClassUtils.java
│ │ │ │ ├── ComponentUtils.java
│ │ │ │ ├── DeviceUtil.java
│ │ │ │ ├── DrawableUtils.java
│ │ │ │ ├── EncodeUtils.java
│ │ │ │ ├── FastXmlSerializer.java
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── MD5Utils.java
│ │ │ │ ├── OSUtils.java
│ │ │ │ ├── Reflect.java
│ │ │ │ ├── ReflectException.java
│ │ │ │ ├── SchedulerTask.java
│ │ │ │ ├── Singleton.java
│ │ │ │ ├── VLog.java
│ │ │ │ ├── XmlSerializerAndParser.java
│ │ │ │ └── marks/
│ │ │ │ ├── FakeDeviceMark.java
│ │ │ │ └── FakeLocMark.java
│ │ │ ├── os/
│ │ │ │ ├── VBinder.java
│ │ │ │ ├── VEnvironment.java
│ │ │ │ ├── VUserHandle.java
│ │ │ │ ├── VUserInfo.java
│ │ │ │ └── VUserManager.java
│ │ │ ├── remote/
│ │ │ │ ├── AppTaskInfo.java
│ │ │ │ ├── BadgerInfo.java
│ │ │ │ ├── InstallResult.java
│ │ │ │ ├── InstalledAppInfo.java
│ │ │ │ ├── PendingIntentData.java
│ │ │ │ ├── PendingResultData.java
│ │ │ │ ├── Problem.java
│ │ │ │ ├── ReceiverInfo.java
│ │ │ │ ├── StubActivityRecord.java
│ │ │ │ ├── SyncInfo.java
│ │ │ │ ├── VDeviceInfo.java
│ │ │ │ ├── VParceledListSlice.java
│ │ │ │ └── vloc/
│ │ │ │ ├── VCell.java
│ │ │ │ ├── VLocation.java
│ │ │ │ └── VWifi.java
│ │ │ └── server/
│ │ │ ├── BinderProvider.java
│ │ │ ├── IJobScheduler.java
│ │ │ ├── ServiceCache.java
│ │ │ ├── accounts/
│ │ │ │ ├── RegisteredServicesParser.java
│ │ │ │ ├── VAccount.java
│ │ │ │ ├── VAccountManagerService.java
│ │ │ │ ├── VContentService.java
│ │ │ │ └── VSyncRecord.java
│ │ │ ├── am/
│ │ │ │ ├── ActivityRecord.java
│ │ │ │ ├── ActivityStack.java
│ │ │ │ ├── AppBindRecord.java
│ │ │ │ ├── AttributeCache.java
│ │ │ │ ├── BroadcastSystem.java
│ │ │ │ ├── ConnectionRecord.java
│ │ │ │ ├── PendingIntents.java
│ │ │ │ ├── ProcessMap.java
│ │ │ │ ├── ProcessRecord.java
│ │ │ │ ├── ServiceRecord.java
│ │ │ │ ├── TaskRecord.java
│ │ │ │ ├── UidSystem.java
│ │ │ │ └── VActivityManagerService.java
│ │ │ ├── device/
│ │ │ │ ├── DeviceInfoPersistenceLayer.java
│ │ │ │ └── VDeviceManagerService.java
│ │ │ ├── job/
│ │ │ │ └── VJobSchedulerService.java
│ │ │ ├── location/
│ │ │ │ └── VirtualLocationService.java
│ │ │ ├── notification/
│ │ │ │ ├── NotificationCompat.java
│ │ │ │ ├── NotificationCompatCompatV14.java
│ │ │ │ ├── NotificationCompatCompatV21.java
│ │ │ │ ├── NotificationFixer.java
│ │ │ │ ├── PendIntentCompat.java
│ │ │ │ ├── ReflectionActionCompat.java
│ │ │ │ ├── RemoteViewsFixer.java
│ │ │ │ ├── VNotificationManagerService.java
│ │ │ │ └── WidthCompat.java
│ │ │ ├── pm/
│ │ │ │ ├── FastImmutableArraySet.java
│ │ │ │ ├── IntentResolver.java
│ │ │ │ ├── PackageCacheManager.java
│ │ │ │ ├── PackagePersistenceLayer.java
│ │ │ │ ├── PackageSetting.java
│ │ │ │ ├── PackageUserState.java
│ │ │ │ ├── PrivilegeAppOptimizer.java
│ │ │ │ ├── ProviderIntentResolver.java
│ │ │ │ ├── VAppManagerService.java
│ │ │ │ ├── VPackageManagerService.java
│ │ │ │ ├── VUserManagerService.java
│ │ │ │ ├── installer/
│ │ │ │ │ ├── FileBridge.java
│ │ │ │ │ ├── PackageHelper.java
│ │ │ │ │ ├── PackageInstallInfo.java
│ │ │ │ │ ├── PackageInstallObserver.java
│ │ │ │ │ ├── PackageInstallerSession.java
│ │ │ │ │ ├── SessionInfo.java
│ │ │ │ │ ├── SessionParams.java
│ │ │ │ │ └── VPackageInstallerService.java
│ │ │ │ └── parser/
│ │ │ │ ├── PackageParserEx.java
│ │ │ │ └── VPackage.java
│ │ │ ├── secondary/
│ │ │ │ ├── BinderDelegateService.java
│ │ │ │ └── FakeIdentityBinder.java
│ │ │ └── vs/
│ │ │ ├── VSConfig.java
│ │ │ ├── VSPersistenceLayer.java
│ │ │ └── VirtualStorageService.java
│ │ └── mirror/
│ │ ├── MethodParams.java
│ │ ├── MethodReflectParams.java
│ │ ├── RefBoolean.java
│ │ ├── RefClass.java
│ │ ├── RefConstructor.java
│ │ ├── RefDouble.java
│ │ ├── RefFloat.java
│ │ ├── RefInt.java
│ │ ├── RefLong.java
│ │ ├── RefMethod.java
│ │ ├── RefObject.java
│ │ ├── RefStaticInt.java
│ │ ├── RefStaticMethod.java
│ │ ├── RefStaticObject.java
│ │ ├── android/
│ │ │ ├── accounts/
│ │ │ │ └── IAccountManager.java
│ │ │ ├── app/
│ │ │ │ ├── Activity.java
│ │ │ │ ├── ActivityManagerNative.java
│ │ │ │ ├── ActivityManagerOreo.java
│ │ │ │ ├── ActivityThread.java
│ │ │ │ ├── ActivityThreadNMR1.java
│ │ │ │ ├── ApplicationThreadNative.java
│ │ │ │ ├── ContextImpl.java
│ │ │ │ ├── ContextImplICS.java
│ │ │ │ ├── ContextImplKitkat.java
│ │ │ │ ├── IActivityManager.java
│ │ │ │ ├── IActivityManagerICS.java
│ │ │ │ ├── IActivityManagerL.java
│ │ │ │ ├── IActivityManagerN.java
│ │ │ │ ├── IActivityTaskManager.java
│ │ │ │ ├── IAlarmManager.java
│ │ │ │ ├── IApplicationThread.java
│ │ │ │ ├── IApplicationThreadICSMR1.java
│ │ │ │ ├── IApplicationThreadJBMR1.java
│ │ │ │ ├── IApplicationThreadKitkat.java
│ │ │ │ ├── IApplicationThreadOreo.java
│ │ │ │ ├── ISearchManager.java
│ │ │ │ ├── IServiceConnectionO.java
│ │ │ │ ├── IUsageStatsManager.java
│ │ │ │ ├── LoadedApk.java
│ │ │ │ ├── LoadedApkHuaWei.java
│ │ │ │ ├── Notification.java
│ │ │ │ ├── NotificationL.java
│ │ │ │ ├── NotificationM.java
│ │ │ │ ├── NotificationManager.java
│ │ │ │ ├── PendingIntentJBMR2.java
│ │ │ │ ├── ServiceStartArgs.java
│ │ │ │ ├── admin/
│ │ │ │ │ └── IDevicePolicyManager.java
│ │ │ │ ├── backup/
│ │ │ │ │ └── IBackupManager.java
│ │ │ │ └── job/
│ │ │ │ ├── IJobScheduler.java
│ │ │ │ ├── JobInfo.java
│ │ │ │ ├── JobParameters.java
│ │ │ │ └── JobWorkItem.java
│ │ │ ├── bluetooth/
│ │ │ │ └── IBluetooth.java
│ │ │ ├── content/
│ │ │ │ ├── BroadcastReceiver.java
│ │ │ │ ├── ClipboardManager.java
│ │ │ │ ├── ClipboardManagerOreo.java
│ │ │ │ ├── ContentProviderClient.java
│ │ │ │ ├── ContentProviderHolderOreo.java
│ │ │ │ ├── ContentProviderNative.java
│ │ │ │ ├── ContentResolver.java
│ │ │ │ ├── ContentResolverJBMR2.java
│ │ │ │ ├── IClipboard.java
│ │ │ │ ├── IContentProvider.java
│ │ │ │ ├── IContentService.java
│ │ │ │ ├── IIntentReceiver.java
│ │ │ │ ├── IIntentReceiverJB.java
│ │ │ │ ├── IRestrictionsManager.java
│ │ │ │ ├── IntentFilter.java
│ │ │ │ ├── SyncAdapterType.java
│ │ │ │ ├── SyncAdapterTypeN.java
│ │ │ │ ├── SyncInfo.java
│ │ │ │ ├── SyncRequest.java
│ │ │ │ ├── pm/
│ │ │ │ │ ├── ApplicationInfoL.java
│ │ │ │ │ ├── ApplicationInfoN.java
│ │ │ │ │ ├── ILauncherApps.java
│ │ │ │ │ ├── IShortcutService.java
│ │ │ │ │ ├── LauncherApps.java
│ │ │ │ │ ├── PackageInstaller.java
│ │ │ │ │ ├── PackageParser.java
│ │ │ │ │ ├── PackageParserJellyBean.java
│ │ │ │ │ ├── PackageParserJellyBean17.java
│ │ │ │ │ ├── PackageParserLollipop.java
│ │ │ │ │ ├── PackageParserLollipop22.java
│ │ │ │ │ ├── PackageParserMarshmallow.java
│ │ │ │ │ ├── PackageParserNougat.java
│ │ │ │ │ ├── PackageParserP28.java
│ │ │ │ │ ├── PackageUserState.java
│ │ │ │ │ ├── ParceledListSlice.java
│ │ │ │ │ ├── ParceledListSliceJBMR2.java
│ │ │ │ │ ├── ShortcutInfo.java
│ │ │ │ │ └── UserInfo.java
│ │ │ │ └── res/
│ │ │ │ ├── AssetManager.java
│ │ │ │ └── CompatibilityInfo.java
│ │ │ ├── ddm/
│ │ │ │ ├── DdmHandleAppName.java
│ │ │ │ └── DdmHandleAppNameJBMR1.java
│ │ │ ├── graphics/
│ │ │ │ └── drawable/
│ │ │ │ └── Icon.java
│ │ │ ├── hardware/
│ │ │ │ ├── display/
│ │ │ │ │ ├── DisplayManagerGlobal.java
│ │ │ │ │ └── IDisplayManager.java
│ │ │ │ ├── fingerprint/
│ │ │ │ │ └── IFingerprintService.java
│ │ │ │ └── location/
│ │ │ │ └── IContextHubService.java
│ │ │ ├── location/
│ │ │ │ ├── ILocationListener.java
│ │ │ │ ├── ILocationManager.java
│ │ │ │ ├── LocationManager.java
│ │ │ │ └── LocationRequestL.java
│ │ │ ├── media/
│ │ │ │ ├── AudioManager.java
│ │ │ │ ├── IAudioService.java
│ │ │ │ ├── IMediaRouterService.java
│ │ │ │ ├── MediaRouter.java
│ │ │ │ └── session/
│ │ │ │ └── ISessionManager.java
│ │ │ ├── net/
│ │ │ │ ├── IConnectivityManager.java
│ │ │ │ ├── NetworkInfo.java
│ │ │ │ └── wifi/
│ │ │ │ ├── IWifiManager.java
│ │ │ │ ├── WifiInfo.java
│ │ │ │ ├── WifiScanner.java
│ │ │ │ └── WifiSsid.java
│ │ │ ├── os/
│ │ │ │ ├── BaseBundle.java
│ │ │ │ ├── Build.java
│ │ │ │ ├── Bundle.java
│ │ │ │ ├── BundleICS.java
│ │ │ │ ├── Handler.java
│ │ │ │ ├── IDeviceIdentifiersPolicyService.java
│ │ │ │ ├── INetworkManagementService.java
│ │ │ │ ├── IPowerManager.java
│ │ │ │ ├── IUserManager.java
│ │ │ │ ├── Message.java
│ │ │ │ ├── Process.java
│ │ │ │ ├── ServiceManager.java
│ │ │ │ ├── StrictMode.java
│ │ │ │ ├── UserHandle.java
│ │ │ │ ├── mount/
│ │ │ │ │ └── IMountService.java
│ │ │ │ └── storage/
│ │ │ │ └── IStorageManager.java
│ │ │ ├── providers/
│ │ │ │ └── Settings.java
│ │ │ ├── renderscript/
│ │ │ │ └── RenderScriptCacheDir.java
│ │ │ ├── rms/
│ │ │ │ └── resource/
│ │ │ │ ├── ReceiverResourceLP.java
│ │ │ │ ├── ReceiverResourceM.java
│ │ │ │ └── ReceiverResourceN.java
│ │ │ ├── service/
│ │ │ │ └── persistentdata/
│ │ │ │ └── IPersistentDataBlockService.java
│ │ │ ├── telephony/
│ │ │ │ ├── CellIdentityCdma.java
│ │ │ │ ├── CellIdentityGsm.java
│ │ │ │ ├── CellInfoCdma.java
│ │ │ │ ├── CellInfoGsm.java
│ │ │ │ ├── CellSignalStrengthCdma.java
│ │ │ │ ├── CellSignalStrengthGsm.java
│ │ │ │ └── NeighboringCellInfo.java
│ │ │ ├── util/
│ │ │ │ └── Singleton.java
│ │ │ ├── view/
│ │ │ │ ├── Display.java
│ │ │ │ ├── HardwareRenderer.java
│ │ │ │ ├── IAutoFillManager.java
│ │ │ │ ├── IGraphicsStats.java
│ │ │ │ ├── IWindowManager.java
│ │ │ │ ├── RenderScript.java
│ │ │ │ ├── SurfaceControl.java
│ │ │ │ ├── ThreadedRenderer.java
│ │ │ │ └── WindowManagerGlobal.java
│ │ │ ├── webkit/
│ │ │ │ ├── IWebViewUpdateService.java
│ │ │ │ └── WebViewFactory.java
│ │ │ └── widget/
│ │ │ ├── RemoteViews.java
│ │ │ └── Toast.java
│ │ ├── com/
│ │ │ └── android/
│ │ │ └── internal/
│ │ │ ├── R_Hide.java
│ │ │ ├── app/
│ │ │ │ ├── IAppOpsService.java
│ │ │ │ └── IBatteryStats.java
│ │ │ ├── appwidget/
│ │ │ │ └── IAppWidgetService.java
│ │ │ ├── content/
│ │ │ │ ├── NativeLibraryHelper.java
│ │ │ │ └── ReferrerIntent.java
│ │ │ ├── os/
│ │ │ │ ├── IDropBoxManagerService.java
│ │ │ │ ├── IVibratorService.java
│ │ │ │ ├── UserManager.java
│ │ │ │ └── health/
│ │ │ │ └── SystemHealthManager.java
│ │ │ ├── policy/
│ │ │ │ └── PhoneWindow.java
│ │ │ ├── telephony/
│ │ │ │ ├── IMms.java
│ │ │ │ ├── IPhoneSubInfo.java
│ │ │ │ ├── ISms.java
│ │ │ │ ├── ISub.java
│ │ │ │ ├── ITelephony.java
│ │ │ │ ├── ITelephonyRegistry.java
│ │ │ │ └── PhoneConstantsMtk.java
│ │ │ └── view/
│ │ │ ├── IInputMethodManager.java
│ │ │ └── inputmethod/
│ │ │ └── InputMethodManager.java
│ │ ├── dalvik/
│ │ │ └── system/
│ │ │ └── VMRuntime.java
│ │ ├── java/
│ │ │ └── lang/
│ │ │ ├── ThreadGroup.java
│ │ │ └── ThreadGroupN.java
│ │ ├── libcore/
│ │ │ └── io/
│ │ │ ├── ForwardingOs.java
│ │ │ ├── Libcore.java
│ │ │ └── Os.java
│ │ └── mirror/
│ │ └── android/
│ │ └── security/
│ │ └── net/
│ │ └── config/
│ │ └── ApplicationConfig.java
│ ├── jni/
│ │ ├── A64Inlinehook/
│ │ │ ├── And64InlineHook.cpp
│ │ │ └── And64InlineHook.hpp
│ │ ├── Android.mk
│ │ ├── Application.mk
│ │ ├── Foundation/
│ │ │ ├── IOUniformer.cpp
│ │ │ ├── IOUniformer.h
│ │ │ ├── Path.cpp
│ │ │ ├── Path.h
│ │ │ ├── SandboxFs.cpp
│ │ │ ├── SandboxFs.h
│ │ │ ├── SymbolFinder.cpp
│ │ │ ├── SymbolFinder.h
│ │ │ ├── VMPatch.cpp
│ │ │ ├── VMPatch.h
│ │ │ ├── fake_dlfcn.cpp
│ │ │ └── fake_dlfcn.h
│ │ ├── Jni/
│ │ │ ├── Helper.h
│ │ │ ├── VAJni.cpp
│ │ │ └── VAJni.h
│ │ ├── Substrate/
│ │ │ ├── Buffer.hpp
│ │ │ ├── CydiaSubstrate.h
│ │ │ ├── SubstrateARM.hpp
│ │ │ ├── SubstrateDebug.cpp
│ │ │ ├── SubstrateDebug.hpp
│ │ │ ├── SubstrateHook.cpp
│ │ │ ├── SubstrateHook.h
│ │ │ ├── SubstrateLog.hpp
│ │ │ ├── SubstratePosixMemory.cpp
│ │ │ ├── SubstrateX86.hpp
│ │ │ ├── hde64.c
│ │ │ ├── hde64.h
│ │ │ └── table64.h
│ │ └── fb/
│ │ ├── Android.mk
│ │ ├── BUCK
│ │ ├── Doxyfile
│ │ ├── assert.cpp
│ │ ├── include/
│ │ │ ├── fb/
│ │ │ │ ├── ALog.h
│ │ │ │ ├── Build.h
│ │ │ │ ├── Countable.h
│ │ │ │ ├── Doxyfile
│ │ │ │ ├── Environment.h
│ │ │ │ ├── ProgramLocation.h
│ │ │ │ ├── RefPtr.h
│ │ │ │ ├── StaticInitialized.h
│ │ │ │ ├── ThreadLocal.h
│ │ │ │ ├── assert.h
│ │ │ │ ├── fbjni/
│ │ │ │ │ ├── Boxed.h
│ │ │ │ │ ├── ByteBuffer.h
│ │ │ │ │ ├── Common.h
│ │ │ │ │ ├── Context.h
│ │ │ │ │ ├── CoreClasses-inl.h
│ │ │ │ │ ├── CoreClasses.h
│ │ │ │ │ ├── Exceptions.h
│ │ │ │ │ ├── File.h
│ │ │ │ │ ├── Hybrid.h
│ │ │ │ │ ├── Iterator-inl.h
│ │ │ │ │ ├── Iterator.h
│ │ │ │ │ ├── JThread.h
│ │ │ │ │ ├── JWeakReference.h
│ │ │ │ │ ├── Meta-forward.h
│ │ │ │ │ ├── Meta-inl.h
│ │ │ │ │ ├── Meta.h
│ │ │ │ │ ├── MetaConvert.h
│ │ │ │ │ ├── NativeRunnable.h
│ │ │ │ │ ├── ReferenceAllocators-inl.h
│ │ │ │ │ ├── ReferenceAllocators.h
│ │ │ │ │ ├── References-forward.h
│ │ │ │ │ ├── References-inl.h
│ │ │ │ │ ├── References.h
│ │ │ │ │ ├── Registration-inl.h
│ │ │ │ │ ├── Registration.h
│ │ │ │ │ └── TypeTraits.h
│ │ │ │ ├── fbjni.h
│ │ │ │ ├── log.h
│ │ │ │ ├── lyra.h
│ │ │ │ ├── noncopyable.h
│ │ │ │ ├── nonmovable.h
│ │ │ │ └── visibility.h
│ │ │ └── jni/
│ │ │ ├── Countable.h
│ │ │ ├── GlobalReference.h
│ │ │ ├── JniTerminateHandler.h
│ │ │ ├── LocalReference.h
│ │ │ ├── LocalString.h
│ │ │ ├── Registration.h
│ │ │ ├── WeakReference.h
│ │ │ └── jni_helpers.h
│ │ ├── jni/
│ │ │ ├── ByteBuffer.cpp
│ │ │ ├── Countable.cpp
│ │ │ ├── Environment.cpp
│ │ │ ├── Exceptions.cpp
│ │ │ ├── Hybrid.cpp
│ │ │ ├── LocalString.cpp
│ │ │ ├── OnLoad.cpp
│ │ │ ├── References.cpp
│ │ │ ├── WeakReference.cpp
│ │ │ ├── android/
│ │ │ │ ├── CpuCapabilities.cpp
│ │ │ │ └── ReferenceChecking.cpp
│ │ │ ├── fbjni.cpp
│ │ │ ├── java/
│ │ │ │ ├── BUCK
│ │ │ │ ├── CppException.java
│ │ │ │ ├── CppSystemErrorException.java
│ │ │ │ └── UnknownCppException.java
│ │ │ └── jni_helpers.cpp
│ │ ├── log.cpp
│ │ ├── lyra/
│ │ │ └── lyra.cpp
│ │ └── onload.cpp
│ └── res/
│ ├── layout/
│ │ ├── app_not_authorized.xml
│ │ ├── choose_account_row.xml
│ │ ├── choose_account_type.xml
│ │ ├── choose_type_and_account.xml
│ │ ├── custom_notification.xml
│ │ ├── custom_notification_lite.xml
│ │ └── resolve_list_item.xml
│ ├── values/
│ │ ├── dimens.xml
│ │ ├── integer.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ ├── values-ru/
│ │ └── strings.xml
│ └── values-uk/
│ └── strings.xml
└── settings.gradle
Showing preview only (462K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (5437 symbols across 627 files)
FILE: VirtualApp/app/src/aosp/java/io/virtualapp/delegate/MyCrashHandler.java
class MyCrashHandler (line 23) | public class MyCrashHandler extends BaseCrashHandler {
method handleUncaughtException (line 28) | @Override
FILE: VirtualApp/app/src/aosp/java/io/virtualapp/delegate/MyVirtualInitializer.java
class MyVirtualInitializer (line 14) | public class MyVirtualInitializer extends BaseVirtualInitializer {
method MyVirtualInitializer (line 15) | public MyVirtualInitializer(Application application, VirtualCore core) {
method onMainProcess (line 19) | @Override
method onVirtualProcess (line 26) | @Override
FILE: VirtualApp/app/src/fdroid/java/io/virtualapp/delegate/MyVirtualInitializer.java
class MyVirtualInitializer (line 11) | public class MyVirtualInitializer extends BaseVirtualInitializer {
method MyVirtualInitializer (line 12) | public MyVirtualInitializer(Application application, VirtualCore core) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/VCommends.java
class VCommends (line 6) | public class VCommends {
FILE: VirtualApp/app/src/main/java/io/virtualapp/XApp.java
class XApp (line 16) | public class XApp extends Application {
method getApp (line 24) | public static XApp getApp() {
method attachBaseContext (line 28) | @Override
method onCreate (line 44) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/BasePresenter.java
type BasePresenter (line 6) | public interface BasePresenter {
method start (line 7) | void start();
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/BaseView.java
type BaseView (line 9) | public interface BaseView<T> {
method getActivity (line 10) | Activity getActivity();
method getContext (line 11) | Context getContext();
method setPresenter (line 12) | void setPresenter(T presenter);
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/Callback.java
type Callback (line 7) | public interface Callback<T> {
method callback (line 8) | void callback(T result);
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VActivity.java
class VActivity (line 16) | public class VActivity extends AppCompatActivity {
method getActivity (line 21) | public Activity getActivity() {
method getContext (line 28) | public Context getContext() {
method defer (line 32) | protected AndroidDeferredManager defer() {
method findFragmentById (line 36) | public Fragment findFragmentById(@IdRes int id) {
method replaceFragment (line 40) | public void replaceFragment(@IdRes int id, Fragment fragment) {
method onStart (line 44) | @Override
method onStop (line 49) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VFragment.java
class VFragment (line 13) | public class VFragment<T extends BasePresenter> extends Fragment {
method getPresenter (line 17) | public T getPresenter() {
method setPresenter (line 21) | public void setPresenter(T presenter) {
method defer (line 25) | protected AndroidDeferredManager defer() {
method finishActivity (line 29) | public void finishActivity() {
method destroy (line 36) | public void destroy() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VUiKit.java
class VUiKit (line 15) | public class VUiKit {
method defer (line 19) | public static AndroidDeferredManager defer() {
method dpToPx (line 23) | public static int dpToPx(Context context, int dp) {
method post (line 28) | public static void post(Runnable r) {
method postDelayed (line 32) | public static void postDelayed(long delay, Runnable r) {
method sleep (line 36) | public static void sleep(long time) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/BaseCrashHandler.java
class BaseCrashHandler (line 12) | public class BaseCrashHandler implements CrashHandler {
method handleUncaughtException (line 16) | @SuppressLint("ApplySharedPref")
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/BaseVirtualInitializer.java
class BaseVirtualInitializer (line 17) | public class BaseVirtualInitializer extends VirtualCore.VirtualInitializ...
method BaseVirtualInitializer (line 22) | public BaseVirtualInitializer(Application application, VirtualCore cor...
method onMainProcess (line 27) | @Override
method onVirtualProcess (line 32) | @Override
method onServerProcess (line 48) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/MyAppRequestListener.java
class MyAppRequestListener (line 18) | public class MyAppRequestListener implements VirtualCore.AppRequestListe...
method MyAppRequestListener (line 22) | public MyAppRequestListener(Context context) {
method onRequestInstall (line 26) | @Override
method onRequestUninstall (line 38) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/MyComponentDelegate.java
class MyComponentDelegate (line 13) | public class MyComponentDelegate implements ComponentDelegate {
method beforeApplicationCreate (line 15) | @Override
method afterApplicationCreate (line 20) | @Override
method beforeActivityCreate (line 25) | @Override
method beforeActivityResume (line 30) | @Override
method beforeActivityPause (line 35) | @Override
method beforeActivityDestroy (line 40) | @Override
method afterActivityCreate (line 45) | @Override
method afterActivityResume (line 50) | @Override
method afterActivityPause (line 55) | @Override
method afterActivityDestroy (line 60) | @Override
method onSendBroadcast (line 65) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/MyPhoneInfoDelegate.java
class MyPhoneInfoDelegate (line 9) | public class MyPhoneInfoDelegate implements PhoneInfoDelegate {
method getDeviceId (line 11) | @Override
method getBluetoothAddress (line 16) | @Override
method getMacAddress (line 21) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/delegate/MyTaskDescDelegate.java
class MyTaskDescDelegate (line 14) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method getTaskDescription (line 16) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/dev/CmdReceiver.java
class CmdReceiver (line 22) | public class CmdReceiver extends BroadcastReceiver {
method onReceive (line 33) | @Override
method showTips (line 100) | private void showTips(Context context, String tips) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/GlideUtils.java
class GlideUtils (line 15) | public class GlideUtils {
method loadInstalledPackageIcon (line 17) | public static void loadInstalledPackageIcon(Context context, String pa...
method loadPackageIconFromApkFile (line 25) | public static void loadPackageIconFromApkFile(Context context, String ...
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/MyGlideModule.java
class MyGlideModule (line 19) | @GlideModule
method applyOptions (line 21) | @Override
method isManifestParsingEnabled (line 30) | @Override
method registerComponents (line 35) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceDataFetcher.java
class PackageIconResourceDataFetcher (line 28) | public class PackageIconResourceDataFetcher implements DataFetcher<Input...
method PackageIconResourceDataFetcher (line 37) | public PackageIconResourceDataFetcher(Context context, String packageN...
method loadData (line 42) | @Override
method cleanup (line 54) | @Override
method cancel (line 66) | @Override
method getDataClass (line 71) | @NonNull
method getDataSource (line 77) | @NonNull
method loadResource (line 84) | private InputStream loadResource() {
method getPackageInfo (line 103) | private PackageInfo getPackageInfo() throws PackageManager.NameNotFoun...
method getPackageTrueModel (line 112) | private String getPackageTrueModel(String prefix) {
method drawableToInputStream (line 116) | private InputStream drawableToInputStream(Drawable drawable) {
method drawableToBitmap (line 123) | private static Bitmap drawableToBitmap(Drawable drawable) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceLoader.java
class PackageIconResourceLoader (line 16) | public class PackageIconResourceLoader implements ModelLoader<String, In...
method PackageIconResourceLoader (line 24) | public PackageIconResourceLoader(Context context) {
method buildLoadData (line 28) | @Nullable
method handles (line 34) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceLoaderFactory.java
class PackageIconResourceLoaderFactory (line 15) | public class PackageIconResourceLoaderFactory implements ModelLoaderFact...
method PackageIconResourceLoaderFactory (line 19) | public PackageIconResourceLoaderFactory(Context context) {
method build (line 23) | @NonNull
method teardown (line 29) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/gms/FakeGms.java
class FakeGms (line 41) | public class FakeGms {
method uninstallGms (line 54) | public static void uninstallGms(Activity activity) {
method isAlreadyInstalled (line 89) | public static boolean isAlreadyInstalled(Context context) {
method installGms (line 110) | public static void installGms(Activity activity) {
method installGmsInternal (line 173) | private static String installGmsInternal(Activity activity, ProgressDi...
method updateMessage (line 365) | private static void updateMessage(Activity activity, ProgressDialog di...
type DownloadListener (line 375) | public interface DownloadListener {
method onProgress (line 376) | void onProgress(int progress);
method downloadFile (line 379) | public static boolean downloadFile(String url, File outFile, DownloadL...
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppActivity.java
class ListAppActivity (line 20) | public class ListAppActivity extends VActivity {
method gotoListApp (line 26) | public static void gotoListApp(Activity activity) {
method onCreate (line 31) | @Override
method onOptionsItemSelected (line 43) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppContract.java
class ListAppContract (line 13) | class ListAppContract {
type ListAppView (line 14) | interface ListAppView extends BaseView<ListAppPresenter> {
method startLoading (line 16) | void startLoading();
method loadFinish (line 18) | void loadFinish(List<AppInfo> infoList);
type ListAppPresenter (line 21) | interface ListAppPresenter extends BasePresenter {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppFragment.java
class ListAppFragment (line 44) | public class ListAppFragment extends VFragment<ListAppContract.ListAppPr...
method newInstance (line 54) | public static ListAppFragment newInstance(File selectFrom) {
method getSelectFrom (line 63) | private File getSelectFrom() {
method onCreateView (line 74) | @Nullable
method onSaveInstanceState (line 80) | @Override
method chooseInstallWay (line 86) | private void chooseInstallWay(Runnable runnable, String path) {
method onViewCreated (line 139) | @Override
method startLoading (line 210) | @Override
method loadFinish (line 216) | @Override
method setPresenter (line 225) | @Override
method onActivityResult (line 230) | @Override
method getPath (line 253) | public static String getPath(Context context, Uri uri) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppPresenterImpl.java
class ListAppPresenterImpl (line 13) | class ListAppPresenterImpl implements ListAppContract.ListAppPresenter {
method ListAppPresenterImpl (line 21) | ListAppPresenterImpl(Activity activity, ListAppContract.ListAppView vi...
method start (line 29) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/LoadingActivity.java
class LoadingActivity (line 46) | public class LoadingActivity extends VActivity {
method launch (line 60) | public static boolean launch(Context context, String packageName, int ...
method onCreate (line 76) | @Override
method checkAndLaunch (line 130) | private void checkAndLaunch(Intent intent, int userId) {
method launchActivityWithDelay (line 207) | private void launchActivityWithDelay(Intent intent, int userId) {
method launchActivity (line 219) | private void launchActivity(Intent intent, int userId) {
method onRequestPermissionsResult (line 229) | @Override
method onAppOpened (line 280) | @Override
method onOpenFailed (line 285) | @Override
method onResume (line 299) | @Override
method startAnim (line 305) | private void startAnim() {
method onStop (line 311) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/NewHomeActivity.java
class NewHomeActivity (line 59) | public class NewHomeActivity extends NexusLauncherActivity {
method goHome (line 68) | public static void goHome(Context context) {
method onCreate (line 75) | @Override
method installXposed (line 86) | private void installXposed() {
method dismissDialog (line 149) | private static void dismissDialog(ProgressDialog dialog) {
method onResume (line 160) | @Override
method onKeyDown (line 174) | @Override
method getActivity (line 183) | public Activity getActivity() {
method getContext (line 187) | public Context getContext() {
method onClickAddWidgetButton (line 191) | @Override
method onAddAppClicked (line 196) | private void onAddAppClicked() {
method onSettingsClicked (line 200) | private void onSettingsClicked() {
method onClickSettingsButton (line 204) | @Override
method onClickAllAppsButton (line 209) | @Override
method startVirtualActivity (line 214) | @Override
method alertForDonate (line 240) | private void alertForDonate() {
method alertForMeizu (line 260) | private void alertForMeizu() {
method alertForDoze (line 282) | private void alertForDoze() {
method setWallpaper (line 331) | private void setWallpaper() {
method showMenuKey (line 356) | private void showMenuKey() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java
class AppPagerAdapter (line 18) | public class AppPagerAdapter extends FragmentPagerAdapter {
method AppPagerAdapter (line 22) | public AppPagerAdapter(FragmentManager fm) {
method getItem (line 28) | @Override
method getCount (line 33) | @Override
method getPageTitle (line 38) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java
class CloneAppListAdapter (line 26) | public class CloneAppListAdapter extends DragSelectRecyclerViewAdapter<C...
method CloneAppListAdapter (line 38) | public CloneAppListAdapter(Context context, @Nullable File from) {
method setOnItemClickListener (line 51) | public void setOnItemClickListener(ItemEventListener mItemEventListene...
method getList (line 55) | public List<AppInfo> getList() {
method setList (line 59) | public void setList(List<AppInfo> models) {
method onCreateViewHolder (line 64) | @Override
method onBindViewHolder (line 72) | @Override
method onAttachedToRecyclerView (line 106) | @Override
method isIndexSelectable (line 111) | @Override
method getItemCount (line 116) | @Override
method getItemViewType (line 121) | @Override
method getItem (line 129) | public AppInfo getItem(int index) {
type ItemEventListener (line 133) | public interface ItemEventListener {
method onItemClick (line 135) | void onItemClick(AppInfo appData, int position);
method isSelectable (line 137) | boolean isSelectable(int position);
class ViewHolder (line 140) | class ViewHolder extends RecyclerView.ViewHolder {
method ViewHolder (line 146) | ViewHolder(View itemView) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java
type AppData (line 9) | public interface AppData {
method isInstalling (line 11) | boolean isInstalling();
method isLoading (line 13) | boolean isLoading();
method isFirstOpen (line 15) | boolean isFirstOpen();
method getIcon (line 17) | Drawable getIcon();
method getName (line 19) | String getName();
method canReorder (line 21) | boolean canReorder();
method canLaunch (line 23) | boolean canLaunch();
method canDelete (line 25) | boolean canDelete();
method canCreateShortcut (line 27) | boolean canCreateShortcut();
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java
class AppInfo (line 9) | public class AppInfo {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfoLite.java
class AppInfoLite (line 10) | public class AppInfoLite implements Parcelable {
method createFromParcel (line 13) | @Override
method newArray (line 18) | @Override
method AppInfoLite (line 28) | public AppInfoLite(String packageName, String path, boolean fastOpen, ...
method AppInfoLite (line 35) | protected AppInfoLite(Parcel in) {
method describeContents (line 42) | @Override
method writeToParcel (line 47) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/MultiplePackageAppData.java
class MultiplePackageAppData (line 12) | public class MultiplePackageAppData implements AppData {
method MultiplePackageAppData (line 22) | public MultiplePackageAppData(PackageAppData target, int userId) {
method isInstalling (line 35) | @Override
method isLoading (line 40) | @Override
method isFirstOpen (line 45) | @Override
method getIcon (line 50) | @Override
method getName (line 55) | @Override
method canReorder (line 60) | @Override
method canLaunch (line 65) | @Override
method canDelete (line 70) | @Override
method canCreateShortcut (line 75) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/PackageAppData.java
class PackageAppData (line 13) | public class PackageAppData implements AppData {
method PackageAppData (line 23) | public PackageAppData(Context context, InstalledAppInfo installedAppIn...
method PackageAppData (line 29) | public PackageAppData(Context context, ApplicationInfo appInfo) {
method loadData (line 34) | private void loadData(Context context, ApplicationInfo appInfo) {
method isInstalling (line 50) | @Override
method isLoading (line 55) | @Override
method isFirstOpen (line 60) | @Override
method getIcon (line 65) | @Override
method getName (line 70) | @Override
method canReorder (line 75) | @Override
method canLaunch (line 80) | @Override
method canDelete (line 85) | @Override
method canCreateShortcut (line 90) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppDataSource.java
type AppDataSource (line 20) | public interface AppDataSource {
method getVirtualApps (line 25) | Promise<List<AppData>, Throwable, Void> getVirtualApps();
method getInstalledApps (line 31) | Promise<List<AppInfo>, Throwable, Void> getInstalledApps(Context conte...
method getStorageApps (line 33) | Promise<List<AppInfo>, Throwable, Void> getStorageApps(Context context...
method addVirtualApp (line 35) | InstallResult addVirtualApp(AppInfoLite info);
method removeVirtualApp (line 37) | boolean removeVirtualApp(String packageName, int userId);
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java
class AppRepository (line 36) | public class AppRepository implements AppDataSource {
method AppRepository (line 53) | public AppRepository(Context context) {
method isSystemApplication (line 57) | private static boolean isSystemApplication(PackageInfo packageInfo) {
method getVirtualApps (line 62) | @Override
method getInstalledApps (line 86) | @Override
method getStorageApps (line 91) | @Override
method findAndParseApkRecursively (line 97) | private List<PackageInfo> findAndParseApkRecursively(Context context, ...
method findAndParseAPKs (line 137) | private List<PackageInfo> findAndParseAPKs(Context context, File rootD...
method convertPackageInfoToAppData (line 163) | private List<AppInfo> convertPackageInfoToAppData(Context context, Lis...
method addVirtualApp (line 221) | @Override
method removeVirtualApp (line 237) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/repo/PackageAppDataStorage.java
class PackageAppDataStorage (line 21) | public class PackageAppDataStorage {
method get (line 26) | public static PackageAppDataStorage get() {
method acquire (line 30) | public PackageAppData acquire(String packageName) {
method acquire (line 41) | public void acquire(String packageName, Callback<PackageAppData> callb...
method loadAppData (line 47) | private PackageAppData loadAppData(String packageName) {
method acquire (line 59) | public PackageAppData acquire(ApplicationInfo appInfo) {
method acquire (line 70) | public void acquire(ApplicationInfo appInfo, Callback<PackageAppData> ...
method loadAppData (line 76) | private PackageAppData loadAppData(ApplicationInfo appInfo) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/AboutActivity.java
class AboutActivity (line 27) | public class AboutActivity extends VActivity {
method onCreate (line 31) | @Override
method getCopyRightsElement (line 52) | Element getCopyRightsElement() {
method getVersionElement (line 60) | Element getVersionElement() {
method getFeedbackQQElement (line 81) | Element getFeedbackQQElement() {
method getFeedbackEmailElement (line 96) | Element getFeedbackEmailElement() {
method getFeedbackWechatElement (line 112) | Element getFeedbackWechatElement() {
method getFeedbacTelegramElement (line 127) | Element getFeedbacTelegramElement() {
method getWebsiteElement (line 143) | Element getWebsiteElement() {
method getThanksElement (line 158) | Element getThanksElement() {
method getCheckUpdateElement (line 176) | Element getCheckUpdateElement() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/AppManageActivity.java
class AppManageActivity (line 48) | public class AppManageActivity extends VActivity {
method onCreate (line 54) | @Override
method loadAsync (line 69) | private void loadAsync() {
method loadApp (line 73) | private void loadApp() {
class AppManageAdapter (line 95) | class AppManageAdapter extends BaseAdapter {
method getCount (line 97) | @Override
method getItem (line 102) | @Override
method getItemId (line 107) | @Override
method getView (line 112) | @Override
method showContextMenu (line 139) | private void showContextMenu(AppManageInfo appManageInfo, View anchor) {
method showRepairDialog (line 176) | private void showRepairDialog(AppManageInfo item) {
method showAppDetailDialog (line 217) | private void showAppDetailDialog() {
method showUninstallDialog (line 238) | private void showUninstallDialog(AppManageInfo item, CharSequence name) {
method showStorageRedirectDialog (line 254) | private void showStorageRedirectDialog(AppManageInfo item) {
class ViewHolder (line 282) | static class ViewHolder {
method ViewHolder (line 289) | ViewHolder(Context context, ViewGroup parent) {
class AppManageInfo (line 297) | static class AppManageInfo {
method getName (line 304) | CharSequence getName() {
method dismiss (line 313) | private static void dismiss(Dialog dialog) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/NougatPolicy.java
class NougatPolicy (line 13) | public class NougatPolicy {
method fullCompile (line 15) | static boolean fullCompile(Context context) {
method clearCompileData (line 41) | public static boolean clearCompileData(Context context) {
method getPackageManagerBinderProxy (line 54) | private static Object getPackageManagerBinderProxy() throws Exception {
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/OnlinePlugin.java
class OnlinePlugin (line 39) | public class OnlinePlugin {
method openOrDownload (line 49) | public static void openOrDownload(Activity context, String packageName...
method downloadAndInstall (line 92) | private static String downloadAndInstall(Activity activity, ProgressDi...
method updateMessage (line 190) | private static void updateMessage(Activity activity, ProgressDialog di...
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/RecommendPluginActivity.java
class RecommendPluginActivity (line 34) | public class RecommendPluginActivity extends VActivity {
method onCreate (line 42) | @Override
method loadRecommend (line 68) | private void loadRecommend() {
class PluginInfo (line 123) | static class PluginInfo {
class ViewHolder (line 129) | static class ViewHolder {
method ViewHolder (line 135) | public ViewHolder(Context context, ViewGroup parent) {
class PluginAdapter (line 142) | class PluginAdapter extends BaseAdapter {
method getCount (line 144) | @Override
method getItem (line 149) | @Override
method getItemId (line 154) | @Override
method getView (line 159) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/SettingsActivity.java
class SettingsActivity (line 33) | public class SettingsActivity extends Activity {
method onCreate (line 57) | @Override
class SettingsFragment (line 72) | public static class SettingsFragment extends PreferenceFragment {
method onCreate (line 75) | @Override
method dismiss (line 309) | private static void dismiss(ProgressDialog dialog) {
method dp2px (line 316) | protected int dp2px(float dp) {
method startActivity (line 321) | @Override
method onActivityResult (line 332) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/settings/TaskManageActivity.java
class TaskManageActivity (line 34) | public class TaskManageActivity extends VActivity {
method onCreate (line 40) | @Override
method loadAsync (line 51) | private void loadAsync() {
method loadApp (line 55) | private void loadApp() {
class AppManageAdapter (line 106) | class AppManageAdapter extends BaseAdapter {
method getCount (line 108) | @Override
method getItem (line 113) | @Override
method getItemId (line 118) | @Override
method getView (line 123) | @Override
class ViewHolder (line 155) | static class ViewHolder {
method ViewHolder (line 162) | ViewHolder(Context context, ViewGroup parent) {
class TaskManageInfo (line 170) | static class TaskManageInfo {
FILE: VirtualApp/app/src/main/java/io/virtualapp/splash/SplashActivity.java
class SplashActivity (line 15) | public class SplashActivity extends VActivity {
method onCreate (line 18) | @Override
method doActionInThread (line 40) | private void doActionInThread() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/sys/Installd.java
class Installd (line 37) | public class Installd {
type UpdateListener (line 39) | public interface UpdateListener {
method update (line 40) | void update(AppData model);
method fail (line 42) | void fail(String msg);
method addApp (line 45) | public static void addApp(AppInfoLite info, UpdateListener refreshList...
method handleOptApp (line 146) | private static void handleOptApp(AppData data, String packageName, boo...
method addVirtualApp (line 178) | public static InstallResult addVirtualApp(AppInfoLite info) {
method getAppInfoLiteFromPath (line 193) | private static ArrayList<AppInfoLite> getAppInfoLiteFromPath(Context c...
method handleRequestFromFile (line 226) | public static void handleRequestFromFile(Context context, String path) {
method startInstallerActivity (line 235) | public static void startInstallerActivity(Context context, ArrayList<A...
method addGmsSupport (line 245) | public static void addGmsSupport() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/sys/InstallerActivity.java
class InstallerActivity (line 38) | public class InstallerActivity extends AppCompatActivity {
method onCreate (line 48) | @Override
method onNewIntent (line 63) | @Override
method onBackPressed (line 69) | @Override
method handleIntent (line 77) | private void handleIntent(Intent intent) {
method handleSelfIntent (line 91) | private void handleSelfIntent(ArrayList<AppInfoLite> appList) {
method addApp (line 116) | private void addApp(AppInfoLite appInfoLite) {
method dealUpdate (line 172) | private boolean dealUpdate(List<AppInfoLite> appList) {
method handleSystemIntent (line 236) | private void handleSystemIntent(Intent intent) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/sys/ShareBridgeActivity.java
class ShareBridgeActivity (line 31) | public class ShareBridgeActivity extends AppCompatActivity {
method onCreate (line 35) | @Override
class SharedAdapter (line 79) | private class SharedAdapter extends BaseAdapter {
method getCount (line 81) | @Override
method getItem (line 86) | @Override
method getItemId (line 91) | @Override
method getView (line 96) | @Override
class ViewHolder (line 124) | static class ViewHolder {
method ViewHolder (line 130) | ViewHolder(Context context, ViewGroup parent) {
method getActivity (line 137) | private Activity getActivity() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/update/VAVersionService.java
class VAVersionService (line 27) | public class VAVersionService extends AVersionService {
method onResponses (line 42) | @Override
method checkUpdateImmediately (line 75) | public static void checkUpdateImmediately(Context context, boolean sho...
method checkUpdate (line 88) | public static void checkUpdate(Context context, boolean showTip) {
method getCurrentVersionCode (line 96) | private static int getCurrentVersionCode(Context context) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/utils/DialogUtil.java
class DialogUtil (line 9) | public class DialogUtil {
method showDialog (line 10) | public static void showDialog(AlertDialog dialog) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/utils/HanziToPinyin.java
class HanziToPinyin (line 35) | public class HanziToPinyin {
class Token (line 350) | public static class Token {
method Token (line 360) | public Token() {
method Token (line 363) | public Token(int type, String source, String target) {
method HanziToPinyin (line 384) | protected HanziToPinyin(boolean hasChinaCollator) {
method getInstance (line 388) | public static HanziToPinyin getInstance() {
method doSelfValidation (line 422) | private static boolean doSelfValidation() {
method getToken (line 441) | private Token getToken(char character) {
method get (line 510) | public ArrayList<Token> get(final String input) {
method addToken (line 558) | private void addToken(
method toPinyinString (line 565) | public String toPinyinString(String string) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/utils/Misc.java
class Misc (line 19) | public class Misc {
method showDonate (line 20) | public static void showDonate(Activity context) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/BaseView.java
class BaseView (line 13) | public abstract class BaseView extends View {
method BaseView (line 18) | public BaseView(Context context) {
method BaseView (line 22) | public BaseView(Context context, AttributeSet attrs) {
method BaseView (line 26) | public BaseView(Context context, AttributeSet attrs, int defStyleAttr) {
method startAnim (line 31) | public void startAnim() {
method startAnim (line 36) | public void startAnim(int time) {
method stopAnim (line 41) | public void stopAnim() {
method startViewAnim (line 57) | private ValueAnimator startViewAnim(float startF, final float endF, lo...
method InitPaint (line 110) | protected abstract void InitPaint();
method OnAnimationUpdate (line 112) | protected abstract void OnAnimationUpdate(ValueAnimator valueAnimator);
method OnAnimationRepeat (line 114) | protected abstract void OnAnimationRepeat(Animator animation);
method OnStopAnim (line 116) | protected abstract int OnStopAnim();
method SetAnimRepeatMode (line 118) | protected abstract int SetAnimRepeatMode();
method SetAnimRepeatCount (line 120) | protected abstract int SetAnimRepeatCount();
method AnimIsRunning (line 122) | protected abstract void AnimIsRunning();
method getFontlength (line 125) | public float getFontlength(Paint paint, String str) {
method getFontHeight (line 131) | public float getFontHeight(Paint paint, String str) {
method getFontHeight (line 138) | public float getFontHeight(Paint paint) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/CardStackAdapter.java
class CardStackAdapter (line 34) | public abstract class CardStackAdapter implements View.OnTouchListener, ...
method CardStackAdapter (line 62) | public CardStackAdapter(Context context) {
method getCardGapBottom (line 72) | protected float getCardGapBottom() {
method createView (line 84) | public abstract View createView(int position, ViewGroup container);
method getCount (line 93) | public abstract int getCount();
method isScreenTouchable (line 102) | public boolean isScreenTouchable() {
method setScreenTouchable (line 106) | private void setScreenTouchable(boolean screenTouchable) {
method addView (line 110) | void addView(final int position) {
method getCardFinalY (line 133) | protected float getCardFinalY(int position) {
method getCardOriginalY (line 137) | protected float getCardOriginalY(int position) {
method resetCards (line 147) | public void resetCards(Runnable r) {
method startAnimations (line 165) | private void startAnimations(List<Animator> animations, final Runnable...
method onTouch (line 183) | @Override
method onClick (line 220) | @Override
method getAnimatorForView (line 258) | protected Animator getAnimatorForView(View view, int currentCardPositi...
method moveCards (line 267) | private void moveCards(int positionOfCardToMove, float diff) {
method setAdapterParams (line 293) | void setAdapterParams(CardStackLayout cardStackLayout) {
method resetCards (line 310) | public void resetCards() {
method isCardSelected (line 323) | public boolean isCardSelected() {
method getSelectedCardPosition (line 331) | public int getSelectedCardPosition() {
method getCardView (line 344) | public View getCardView(int position) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/CardStackLayout.java
class CardStackLayout (line 26) | public class CardStackLayout extends FrameLayout {
method CardStackLayout (line 39) | public CardStackLayout(Context context) {
method CardStackLayout (line 44) | public CardStackLayout(Context context, AttributeSet attrs) {
method CardStackLayout (line 48) | public CardStackLayout(Context context, AttributeSet attrs, int defSty...
method CardStackLayout (line 53) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method getOnCardSelectedListener (line 62) | OnCardSelected getOnCardSelectedListener() {
method setOnCardSelectedListener (line 73) | public void setOnCardSelectedListener(OnCardSelected onCardSelectedLis...
method resetDefaults (line 77) | private void resetDefaults() {
method handleArgs (line 81) | private void handleArgs(Context context, AttributeSet attrs, int defSt...
method getAdapter (line 101) | public CardStackAdapter getAdapter() {
method setAdapter (line 111) | public void setAdapter(CardStackAdapter adapter) {
method getParallaxScale (line 126) | public int getParallaxScale() {
method setParallaxScale (line 134) | public void setParallaxScale(int mParallaxScale) {
method isParallaxEnabled (line 138) | public boolean isParallaxEnabled() {
method setParallaxEnabled (line 142) | public void setParallaxEnabled(boolean mParallaxEnabled) {
method isShowInitAnimation (line 146) | public boolean isShowInitAnimation() {
method setShowInitAnimation (line 150) | public void setShowInitAnimation(boolean mShowInitAnimation) {
method getCardGap (line 157) | public float getCardGap() {
method setCardGap (line 164) | public void setCardGap(float mCardGap) {
method getCardGapBottom (line 172) | public float getCardGapBottom() {
method setCardGapBottom (line 176) | public void setCardGapBottom(float mCardGapBottom) {
method isCardSelected (line 183) | public boolean isCardSelected() {
method removeAdapter (line 191) | public void removeAdapter() {
method restoreCards (line 201) | public void restoreCards() {
type OnCardSelected (line 208) | public interface OnCardSelected {
method onCardSelected (line 209) | void onCardSelected(View v, int position);
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/DragSelectRecyclerView.java
class DragSelectRecyclerView (line 22) | public class DragSelectRecyclerView extends RecyclerView {
method run (line 45) | @Override
method DragSelectRecyclerView (line 63) | public DragSelectRecyclerView(Context context) {
method DragSelectRecyclerView (line 68) | public DragSelectRecyclerView(Context context, AttributeSet attrs) {
method DragSelectRecyclerView (line 73) | public DragSelectRecyclerView(Context context, AttributeSet attrs, int...
method LOG (line 78) | private static void LOG(String message, Object... args) {
method init (line 88) | private void init(Context context, AttributeSet attrs) {
method setFingerListener (line 119) | public void setFingerListener(@Nullable FingerListener listener) {
method onMeasure (line 123) | @Override
method setDragSelectActive (line 137) | public boolean setDragSelectActive(boolean active, int initialSelectio...
method setAdapter (line 165) | @Override
method setAdapter (line 173) | public void setAdapter(DragSelectRecyclerViewAdapter<?> adapter) {
method getItemPosition (line 178) | private int getItemPosition(MotionEvent e) {
method enableDebug (line 187) | public final void enableDebug() {
method onDraw (line 192) | @Override
method dispatchTouchEvent (line 210) | @Override
type FingerListener (line 286) | public interface FingerListener {
method onDragSelectFingerAction (line 287) | void onDragSelectFingerAction(boolean fingerDown);
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/DragSelectRecyclerViewAdapter.java
class DragSelectRecyclerViewAdapter (line 12) | public abstract class DragSelectRecyclerViewAdapter<VH extends RecyclerV...
method DragSelectRecyclerViewAdapter (line 18) | protected DragSelectRecyclerViewAdapter() {
method fireSelectionListener (line 22) | private void fireSelectionListener() {
method setMaxSelectionCount (line 30) | public void setMaxSelectionCount(int maxSelectionCount) {
method setSelectionListener (line 34) | public void setSelectionListener(SelectionListener selectionListener) {
method saveInstanceState (line 38) | public void saveInstanceState(Bundle out) {
method saveInstanceState (line 42) | public void saveInstanceState(String key, Bundle out) {
method restoreInstanceState (line 46) | public void restoreInstanceState(Bundle in) {
method restoreInstanceState (line 50) | public void restoreInstanceState(String key, Bundle in) {
method setSelected (line 59) | public final void setSelected(int index, boolean selected) {
method toggleSelected (line 76) | public final boolean toggleSelected(int index) {
method isIndexSelectable (line 92) | protected boolean isIndexSelectable(int index) {
method onBindViewHolder (line 96) | @CallSuper
method selectRange (line 102) | public final void selectRange(int from, int to, int min, int max) {
method selectAll (line 147) | public final void selectAll() {
method clearSelected (line 159) | public final void clearSelected() {
method getSelectedCount (line 165) | public final int getSelectedCount() {
method getSelectedIndices (line 169) | public final Integer[] getSelectedIndices() {
method isIndexSelected (line 173) | public final boolean isIndexSelected(int index) {
type SelectionListener (line 177) | public interface SelectionListener {
method onDragSelectionChanged (line 178) | void onDragSelectionChanged(int count);
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/EatBeansView.java
class EatBeansView (line 12) | public class EatBeansView extends BaseView {
method EatBeansView (line 29) | public EatBeansView(Context context) {
method EatBeansView (line 33) | public EatBeansView(Context context, AttributeSet attrs) {
method EatBeansView (line 37) | public EatBeansView(Context context, AttributeSet attrs, int defStyleA...
method onMeasure (line 42) | @Override
method onDraw (line 51) | @Override
method initPaint (line 75) | private void initPaint() {
method setViewColor (line 93) | public void setViewColor(int color) {
method setEyeColor (line 98) | public void setEyeColor(int color) {
method InitPaint (line 104) | @Override
method OnAnimationUpdate (line 109) | @Override
method OnAnimationRepeat (line 118) | @Override
method OnStopAnim (line 123) | @Override
method SetAnimRepeatMode (line 130) | @Override
method AnimIsRunning (line 135) | @Override
method SetAnimRepeatCount (line 140) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/Indicator.java
class Indicator (line 17) | public abstract class Indicator extends Drawable implements Animatable {
method Indicator (line 28) | public Indicator() {
method getColor (line 34) | public int getColor() {
method setColor (line 38) | public void setColor(int color) {
method getAlpha (line 42) | @Override
method setAlpha (line 47) | @Override
method getOpacity (line 52) | @Override
method setColorFilter (line 57) | @Override
method draw (line 62) | @Override
method draw (line 67) | public abstract void draw(Canvas canvas, Paint paint);
method onCreateAnimators (line 69) | public abstract ArrayList<ValueAnimator> onCreateAnimators();
method start (line 71) | @Override
method startAnimators (line 87) | private void startAnimators() {
method stopAnimators (line 102) | private void stopAnimators() {
method ensureAnimators (line 113) | private void ensureAnimators() {
method stop (line 120) | @Override
method isStarted (line 125) | private boolean isStarted() {
method isRunning (line 132) | @Override
method addUpdateListener (line 147) | public void addUpdateListener(ValueAnimator animator, ValueAnimator.An...
method onBoundsChange (line 151) | @Override
method setDrawBounds (line 157) | public void setDrawBounds(int left, int top, int right, int bottom) {
method postInvalidate (line 161) | public void postInvalidate() {
method getDrawBounds (line 165) | public Rect getDrawBounds() {
method setDrawBounds (line 169) | public void setDrawBounds(Rect drawBounds) {
method getWidth (line 173) | public int getWidth() {
method getHeight (line 177) | public int getHeight() {
method centerX (line 181) | public int centerX() {
method centerY (line 185) | public int centerY() {
method exactCenterX (line 189) | public float exactCenterX() {
method exactCenterY (line 193) | public float exactCenterY() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/LabelView.java
class LabelView (line 15) | public class LabelView extends View {
method LabelView (line 31) | public LabelView(Context context) {
method LabelView (line 35) | public LabelView(Context context, AttributeSet attrs) {
method obtainAttributes (line 42) | private void obtainAttributes(Context context, AttributeSet attrs) {
method getText (line 57) | public String getText() {
method setText (line 61) | public void setText(String text) {
method getTextColor (line 66) | public int getTextColor() {
method setTextColor (line 70) | public void setTextColor(int textColor) {
method getTextSize (line 75) | public float getTextSize() {
method setTextSize (line 79) | public void setTextSize(float textSize) {
method isTextBold (line 84) | public boolean isTextBold() {
method setTextBold (line 88) | public void setTextBold(boolean textBold) {
method isFillTriangle (line 93) | public boolean isFillTriangle() {
method setFillTriangle (line 97) | public void setFillTriangle(boolean fillTriangle) {
method isTextAllCaps (line 102) | public boolean isTextAllCaps() {
method setTextAllCaps (line 106) | public void setTextAllCaps(boolean textAllCaps) {
method getBgColor (line 111) | public int getBgColor() {
method setBgColor (line 115) | public void setBgColor(int backgroundColor) {
method getMinSize (line 120) | public float getMinSize() {
method setMinSize (line 124) | public void setMinSize(float minSize) {
method getPadding (line 129) | public float getPadding() {
method setPadding (line 133) | public void setPadding(float padding) {
method getGravity (line 138) | public int getGravity() {
method setGravity (line 148) | public void setGravity(int gravity) {
method onDraw (line 152) | @Override
method drawText (line 246) | private void drawText(int size, float degrees, Canvas canvas, float te...
method drawTextWhenFill (line 256) | private void drawTextWhenFill(int size, float degrees, Canvas canvas, ...
method onMeasure (line 266) | @Override
method measureWidth (line 275) | private int measureWidth(int widthMeasureSpec) {
method dp2px (line 298) | protected int dp2px(float dp) {
method sp2px (line 303) | protected int sp2px(float sp) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/MarqueeTextView.java
class MarqueeTextView (line 8) | public class MarqueeTextView extends AppCompatTextView {
method MarqueeTextView (line 12) | public MarqueeTextView(Context context) {
method MarqueeTextView (line 16) | public MarqueeTextView(Context context, AttributeSet attrs) {
method MarqueeTextView (line 20) | public MarqueeTextView(Context context, AttributeSet attrs, int defSty...
method isFocused (line 24) | public boolean isFocused() {
method stopScroll (line 31) | public void stopScroll() {
method start (line 35) | public void start() {
method onDetachedFromWindow (line 39) | protected void onDetachedFromWindow() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/fittext/BaseTextView.java
class BaseTextView (line 16) | class BaseTextView extends TextView {
method BaseTextView (line 38) | public BaseTextView(Context context) {
method BaseTextView (line 42) | public BaseTextView(Context context, AttributeSet attrs) {
method BaseTextView (line 57) | public BaseTextView(Context context, AttributeSet attrs, int defStyleA...
method isKeepWord (line 61) | public boolean isKeepWord() {
method setKeepWord (line 65) | public void setKeepWord(boolean keepWord) {
method isJustify (line 69) | public boolean isJustify() {
method setJustify (line 73) | public void setJustify(boolean justify) {
method isLineEndNoSpace (line 77) | public boolean isLineEndNoSpace() {
method setLineEndNoSpace (line 81) | public void setLineEndNoSpace(boolean lineEndNoSpace) {
method getIncludeFontPaddingCompat (line 85) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
method getLineSpacingMultiplierCompat (line 94) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
method getLineSpacingExtraCompat (line 103) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
method getMaxLinesCompat (line 112) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
method setLineSpacing (line 121) | @Override
method setIncludeFontPadding (line 128) | @Override
method setMaxLines (line 134) | @Override
method setSingleLine (line 140) | @Override
method getTextWidth (line 147) | public int getTextWidth() {
method getTextHeight (line 151) | public int getTextHeight() {
method setBoldText (line 161) | public void setBoldText(boolean bold) {
method setItalicText (line 170) | public void setItalicText(boolean italic) {
method isItalicText (line 174) | public boolean isItalicText() {
method isSingleLine (line 178) | public boolean isSingleLine() {
method getTextLineHeight (line 182) | public float getTextLineHeight() {
method getTextView (line 186) | public TextView getTextView() {
method onDraw (line 190) | protected void onDraw(Canvas canvas) {
method countEmpty (line 266) | protected int countEmpty(CharSequence text) {
method isEmpty (line 284) | protected boolean isEmpty(CharSequence c, int start, int end) {
method needScale (line 321) | protected boolean needScale(CharSequence end) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/fittext/FitTextHelper.java
class FitTextHelper (line 22) | class FitTextHelper {
method FitTextHelper (line 84) | public FitTextHelper(BaseTextView textView) {
method isSingleLine (line 92) | public static boolean isSingleLine(TextView textView) {
method getMaxLineCount (line 117) | protected int getMaxLineCount() {
method getTextWidth (line 135) | public static int getTextWidth(TextView textView) {
method getStaticLayout (line 145) | public StaticLayout getStaticLayout(CharSequence text, TextPaint paint) {
method getStaticLayout (line 155) | public static StaticLayout getStaticLayout(TextView textView, CharSequ...
method isFit (line 193) | protected boolean isFit(CharSequence text, TextPaint paint) {
method fitTextSize (line 223) | public float fitTextSize(TextPaint oldPaint, CharSequence text, float ...
method getLineBreaks (line 253) | public CharSequence getLineBreaks(
method getLayoutAlignment (line 308) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/fittext/FitTextView.java
class FitTextView (line 16) | public class FitTextView extends BaseTextView {
method FitTextView (line 32) | public FitTextView(Context context) {
method FitTextView (line 36) | public FitTextView(Context context, AttributeSet attrs) {
method FitTextView (line 40) | public FitTextView(Context context, AttributeSet attrs, int defStyleAt...
method getFitTextHelper (line 57) | protected FitTextHelper getFitTextHelper() {
method getMinTextSize (line 67) | public float getMinTextSize() {
method setMinTextSize (line 74) | public void setMinTextSize(float minTextSize) {
method getMaxTextSize (line 81) | public float getMaxTextSize() {
method setMaxTextSize (line 88) | public void setMaxTextSize(float maxTextSize) {
method isNeedFit (line 97) | public boolean isNeedFit() {
method setNeedFit (line 104) | public void setNeedFit(boolean needFit) {
method setTextSize (line 108) | @Override
method getOriginalTextSize (line 114) | public float getOriginalTextSize() {
method onMeasure (line 119) | @Override
method setText (line 136) | @Override
method getOriginalText (line 143) | public CharSequence getOriginalText() {
method fitText (line 152) | protected void fitText(CharSequence text) {
method onDraw (line 166) | @Override
FILE: VirtualApp/lib/src/main/java/android/app/ActivityOptions.java
class ActivityOptions (line 8) | class ActivityOptions {
FILE: VirtualApp/lib/src/main/java/android/app/ActivityThread.java
class ActivityThread (line 7) | public class ActivityThread {
class ActivityClientRecord (line 8) | public static class ActivityClientRecord {}
FILE: VirtualApp/lib/src/main/java/android/app/ClientTransactionHandler.java
class ClientTransactionHandler (line 40) | public abstract class ClientTransactionHandler {
method scheduleTransaction (line 44) | void scheduleTransaction(ClientTransaction transaction) {
method executeTransaction (line 51) | public void executeTransaction(ClientTransaction transaction) {
method getTransactionExecutor (line 58) | abstract TransactionExecutor getTransactionExecutor();
method sendMessage (line 59) | abstract void sendMessage(int what, Object obj);
method updatePendingConfiguration (line 63) | public abstract void updatePendingConfiguration(Configuration config);
method updateProcessState (line 65) | public abstract void updateProcessState(int processState, boolean from...
method handleDestroyActivity (line 69) | public abstract void handleDestroyActivity(IBinder token, boolean fini...
method handlePauseActivity (line 72) | public abstract void handlePauseActivity(IBinder token, boolean finish...
method handleDestroyActivity (line 77) | public abstract void handleDestroyActivity(ActivityThread.ActivityClie...
method handlePauseActivity (line 81) | public abstract void handlePauseActivity(ActivityThread.ActivityClient...
method handleResumeActivity (line 91) | public abstract void handleResumeActivity(IBinder token, boolean final...
method handleResumeActivity (line 95) | public abstract void handleResumeActivity(ActivityThread.ActivityClien...
method handleStopActivity (line 109) | public abstract void handleStopActivity(IBinder token, boolean show, i...
method handleStopActivity (line 113) | public abstract void handleStopActivity(IBinder token, int configChanges,
method handleStopActivity (line 117) | public abstract void handleStopActivity(ActivityThread.ActivityClientR...
method reportStop (line 121) | public abstract void reportStop(PendingTransactionActions pendingActio...
method performRestartActivity (line 123) | public abstract void performRestartActivity(IBinder token, boolean sta...
method performRestartActivity (line 125) | public abstract void performRestartActivity(ActivityThread.ActivityCli...
method handleActivityConfigurationChanged (line 128) | public abstract void handleActivityConfigurationChanged(IBinder activi...
method handleActivityConfigurationChanged (line 130) | public abstract void handleActivityConfigurationChanged(ActivityThread...
method handleSendResult (line 134) | public abstract void handleSendResult(IBinder token, List results, Str...
method handleSendResult (line 137) | public abstract void handleSendResult(
method handleMultiWindowModeChanged (line 141) | public abstract void handleMultiWindowModeChanged(IBinder token, boole...
method handleNewIntent (line 144) | public abstract void handleNewIntent(IBinder token, List intents,
method handleNewIntent (line 146) | public abstract void handleNewIntent(
method handlePictureInPictureModeChanged (line 149) | public abstract void handlePictureInPictureModeChanged(IBinder token, ...
method handlePictureInPictureRequested (line 153) | public abstract void handlePictureInPictureRequested(IBinder token);
method handlePictureInPictureRequested (line 154) | public abstract void handlePictureInPictureRequested(ActivityThread.Ac...
method handlePictureInPictureStateChanged (line 157) | public abstract void handlePictureInPictureStateChanged(ActivityThread...
method isHandleSplashScreenExit (line 161) | public abstract boolean isHandleSplashScreenExit(IBinder token);
method handleAttachSplashScreenView (line 164) | public abstract void handleAttachSplashScreenView(ActivityThread.Activ...
method handOverSplashScreenView (line 168) | public abstract void handOverSplashScreenView(ActivityThread.ActivityC...
method handleWindowVisibility (line 171) | public abstract void handleWindowVisibility(IBinder token, boolean show);
method handleLaunchActivity (line 173) | public abstract Activity handleLaunchActivity(ActivityThread.ActivityC...
method handleStartActivity (line 176) | public abstract void handleStartActivity(ActivityThread.ActivityClient...
method handleStartActivity (line 181) | public abstract void handleStartActivity(ActivityThread.ActivityClient...
method handleStartActivity (line 185) | public abstract void handleStartActivity(IBinder binder,
method getPackageInfoNoCheck (line 188) | public abstract LoadedApk getPackageInfoNoCheck(ApplicationInfo ai,
method handleConfigurationChanged (line 191) | public abstract void handleConfigurationChanged(Configuration config);
method handleFixedRotationAdjustments (line 193) | public abstract void handleFixedRotationAdjustments(IBinder token,
method addLaunchingActivity (line 201) | public abstract void addLaunchingActivity(IBinder token, ActivityThrea...
method getLaunchingActivity (line 208) | public abstract ActivityThread.ActivityClientRecord getLaunchingActivi...
method removeLaunchingActivity (line 214) | public abstract void removeLaunchingActivity(IBinder token);
method getActivityClient (line 220) | public abstract ActivityThread.ActivityClientRecord getActivityClient(...
method prepareRelaunchActivity (line 234) | public abstract ActivityThread.ActivityClientRecord prepareRelaunchAct...
method handleRelaunchActivity (line 242) | public abstract void handleRelaunchActivity(ActivityThread.ActivityCli...
method reportRelaunch (line 250) | public abstract void reportRelaunch(IBinder token, PendingTransactionA...
method getActivitiesToBeDestroyed (line 252) | public abstract Map getActivitiesToBeDestroyed();
method getActivity (line 255) | public abstract Activity getActivity(IBinder token);
method updatePendingActivityConfiguration (line 257) | public abstract void updatePendingActivityConfiguration(IBinder arg1, ...
method handleTopResumedActivityChanged (line 259) | public abstract void handleTopResumedActivityChanged(IBinder arg1, boo...
method handleTopResumedActivityChanged (line 261) | public abstract void handleTopResumedActivityChanged(ActivityThread.Ac...
method countLaunchingActivities (line 265) | public abstract void countLaunchingActivities(int num);
method handleNewIntent (line 268) | public abstract void handleNewIntent(IBinder token, List intents);
FILE: VirtualApp/lib/src/main/java/android/app/LoadedApk.java
class LoadedApk (line 7) | public class LoadedApk {
FILE: VirtualApp/lib/src/main/java/android/app/TransactionHandlerProxy.java
class TransactionHandlerProxy (line 37) | public class TransactionHandlerProxy extends ClientTransactionHandler {
method TransactionHandlerProxy (line 43) | public TransactionHandlerProxy(ClientTransactionHandler originalHandle...
method getTransactionExecutor (line 47) | @Override
method sendMessage (line 52) | @Override
method updatePendingConfiguration (line 57) | @Override
method updateProcessState (line 62) | @Override
method handleDestroyActivity (line 67) | @Override
method handlePauseActivity (line 72) | @Override
method handleDestroyActivity (line 77) | @Override
method handlePauseActivity (line 82) | @Override
method handleResumeActivity (line 87) | @Override
method handleResumeActivity (line 92) | @Override
method handleStopActivity (line 97) | @Override
method handleStopActivity (line 102) | @Override
method handleStopActivity (line 107) | @Override
method reportStop (line 112) | @Override
method performRestartActivity (line 117) | @Override
method performRestartActivity (line 122) | @Override
method handleActivityConfigurationChanged (line 127) | @Override
method handleActivityConfigurationChanged (line 132) | @Override
method handleSendResult (line 137) | @Override
method handleSendResult (line 142) | @Override
method handleMultiWindowModeChanged (line 147) | @Override
method handleNewIntent (line 152) | @Override
method handlePictureInPictureModeChanged (line 157) | @Override
method handlePictureInPictureRequested (line 162) | @Override
method handlePictureInPictureRequested (line 167) | @Override
method handlePictureInPictureStateChanged (line 172) | @Override
method isHandleSplashScreenExit (line 177) | @Override
method handleAttachSplashScreenView (line 182) | @Override
method handOverSplashScreenView (line 187) | @Override
method handleWindowVisibility (line 192) | @Override
method handleLaunchActivity (line 197) | @Override
method handleStartActivity (line 246) | @Override
method handleStartActivity (line 251) | @Override
method handleStartActivity (line 256) | @Override
method getPackageInfoNoCheck (line 261) | @Override
method handleConfigurationChanged (line 266) | @Override
method handleFixedRotationAdjustments (line 271) | @Override
method addLaunchingActivity (line 276) | @Override
method getLaunchingActivity (line 281) | @Override
method removeLaunchingActivity (line 286) | @Override
method getActivityClient (line 291) | @Override
method prepareRelaunchActivity (line 297) | @Override
method handleRelaunchActivity (line 302) | @Override
method reportRelaunch (line 307) | @Override
method getActivitiesToBeDestroyed (line 312) | @Override
method getActivity (line 317) | @Override
method updatePendingActivityConfiguration (line 322) | @Override
method handleTopResumedActivityChanged (line 327) | @Override
method handleTopResumedActivityChanged (line 332) | @Override
method countLaunchingActivities (line 337) | @Override
method handleNewIntent (line 342) | @Override
method handleNewIntent (line 347) | @Override
FILE: VirtualApp/lib/src/main/java/android/app/servertransaction/ClientTransaction.java
class ClientTransaction (line 26) | public class ClientTransaction {
FILE: VirtualApp/lib/src/main/java/android/app/servertransaction/PendingTransactionActions.java
class PendingTransactionActions (line 25) | public class PendingTransactionActions {
FILE: VirtualApp/lib/src/main/java/android/app/servertransaction/TransactionExecutor.java
class TransactionExecutor (line 22) | public class TransactionExecutor {
FILE: VirtualApp/lib/src/main/java/android/content/SyncStatusInfo.java
class SyncStatusInfo (line 9) | public class SyncStatusInfo implements Parcelable {
method SyncStatusInfo (line 35) | public SyncStatusInfo(int authorityId) {
method getLastFailureMesgAsInt (line 39) | public int getLastFailureMesgAsInt(int def) {
method describeContents (line 43) | public int describeContents() {
method writeToParcel (line 47) | public void writeToParcel(Parcel parcel, int flags) {
method SyncStatusInfo (line 74) | public SyncStatusInfo(Parcel parcel) {
method SyncStatusInfo (line 109) | public SyncStatusInfo(SyncStatusInfo other) {
method setPeriodicSyncTime (line 131) | public void setPeriodicSyncTime(int index, long when) {
method getPeriodicSyncTime (line 138) | public long getPeriodicSyncTime(int index) {
method removePeriodicSyncTime (line 146) | public void removePeriodicSyncTime(int index) {
method createFromParcel (line 153) | public SyncStatusInfo createFromParcel(Parcel in) {
method newArray (line 157) | public SyncStatusInfo[] newArray(int size) {
method ensurePeriodicSyncTimeSize (line 162) | private void ensurePeriodicSyncTimeSize(int index) {
FILE: VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java
class PackageParser (line 12) | public class PackageParser {
class IntentInfo (line 16) | public static class IntentInfo extends IntentFilter {
class Component (line 25) | public static class Component<II extends IntentInfo> {
method getComponentName (line 31) | public ComponentName getComponentName() {
class Activity (line 36) | public final static class Activity extends Component<ActivityIntentInf...
class Package (line 40) | public class Package {
class Service (line 75) | public final class Service extends Component<ServiceIntentInfo> {
class Provider (line 79) | public final class Provider extends Component<ProviderIntentInfo> {
class Instrumentation (line 83) | public final class Instrumentation extends Component<IntentInfo> {
class Permission (line 87) | public final class Permission extends Component<IntentInfo> {
class PermissionGroup (line 91) | public final class PermissionGroup extends Component<IntentInfo> {
class ActivityIntentInfo (line 95) | public class ActivityIntentInfo extends IntentInfo {
class ServiceIntentInfo (line 100) | public class ServiceIntentInfo extends IntentInfo {
class ProviderIntentInfo (line 104) | public class ProviderIntentInfo extends IntentInfo {
FILE: VirtualApp/lib/src/main/java/android/content/res/CompatibilityInfo.java
class CompatibilityInfo (line 24) | public class CompatibilityInfo {
FILE: VirtualApp/lib/src/main/java/android/location/LocationRequest.java
class LocationRequest (line 6) | public final class LocationRequest implements Parcelable {
method getProvider (line 8) | public String getProvider() {
method createFromParcel (line 14) | @Override
method newArray (line 19) | @Override
method describeContents (line 25) | @Override
method writeToParcel (line 30) | @Override
FILE: VirtualApp/lib/src/main/java/android/util/MergedConfiguration.java
class MergedConfiguration (line 24) | public class MergedConfiguration {
FILE: VirtualApp/lib/src/main/java/android/view/DisplayAdjustments.java
class DisplayAdjustments (line 9) | public class DisplayAdjustments {
class FixedRotationAdjustments (line 10) | public static class FixedRotationAdjustments {}
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/Build.java
class Build (line 11) | public class Build {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/DelegateApplication64Bit.java
class DelegateApplication64Bit (line 28) | @TargetApi(Build.VERSION_CODES.M)
method get32BitPackageName (line 33) | protected abstract String get32BitPackageName();
method findField (line 36) | private static Field findField(Object instance, String name) throws No...
method findMethod (line 56) | private static Method findMethod(Object instance, String name, Class<?...
method expandFieldArray (line 78) | private static void expandFieldArray(Object instance, String fieldName,
method expandFieldList (line 91) | private static void expandFieldList(Object instance, String fieldName,...
method makeDexElements (line 100) | private static Object[] makeDexElements(
method attachBaseContext (line 116) | protected void attachBaseContext(Context context) {
method onConfigurationChanged (line 169) | public void onConfigurationChanged(Configuration configuration) {
method onCreate (line 176) | public void onCreate() {
method onLowMemory (line 183) | public void onLowMemory() {
method onTerminate (line 190) | public void onTerminate() {
method onTrimMemory (line 197) | public void onTrimMemory(int i) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/GmsSupport.java
class GmsSupport (line 15) | public class GmsSupport {
method isGmsFamilyPackage (line 39) | public static boolean isGmsFamilyPackage(String packageName) {
method isGoogleFrameworkInstalled (line 44) | public static boolean isGoogleFrameworkInstalled() {
method isOutsideGoogleFrameworkExist (line 48) | public static boolean isOutsideGoogleFrameworkExist() {
method installPackages (line 52) | private static void installPackages(List<String> list, int userId) {
method installGApps (line 75) | public static void installGApps(int userId) {
method installGoogleService (line 80) | public static void installGoogleService(int userId) {
method installGoogleApp (line 84) | public static void installGoogleApp(int userId) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/NativeEngine.java
class NativeEngine (line 27) | public class NativeEngine {
method startDexOverride (line 51) | public static void startDexOverride() {
method getRedirectedPath (line 63) | public static String getRedirectedPath(String redirectPath) {
method resverseRedirectedPath (line 72) | public static String resverseRedirectedPath(String origPath) {
method redirectDirectory (line 81) | public static void redirectDirectory(String origPath, String newPath) {
method getEscapePath (line 95) | public static String getEscapePath(String path) {
method redirectFile (line 106) | public static void redirectFile(String origPath, String newPath) {
method whitelist (line 121) | public static void whitelist(String path, boolean directory) {
method forbid (line 134) | public static void forbid(String path) {
method enableIORedirect (line 145) | public static void enableIORedirect() {
method launchEngine (line 158) | static void launchEngine() {
method onKillProcess (line 171) | public static void onKillProcess(int pid, int signal) {
method onGetCallingUid (line 178) | public static int onGetCallingUid(int originUid) {
method onOpenDexFileNative (line 194) | public static void onOpenDexFileNative(String[] params) {
method nativeLaunchEngine (line 211) | private static native void nativeLaunchEngine(Object[] method, String ...
method nativeMark (line 213) | private static native void nativeMark();
method nativeReverseRedirectedPath (line 215) | private static native String nativeReverseRedirectedPath(String redire...
method nativeGetRedirectedPath (line 217) | private static native String nativeGetRedirectedPath(String orgPath);
method nativeIORedirect (line 219) | private static native void nativeIORedirect(String origPath, String ne...
method nativeIOWhitelist (line 221) | private static native void nativeIOWhitelist(String path);
method nativeIOForbid (line 223) | private static native void nativeIOForbid(String path);
method nativeEnableIORedirect (line 225) | private static native void nativeEnableIORedirect(String selfSoPath, i...
method disableJit (line 227) | public static native void disableJit(int apiLevel);
method onGetUid (line 229) | public static int onGetUid(int uid) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java
class VClientImpl (line 89) | public final class VClientImpl extends IVClient.Stub {
method get (line 108) | public static VClientImpl get() {
method isBound (line 112) | public boolean isBound() {
method getDeviceInfo (line 116) | public VDeviceInfo getDeviceInfo() {
method getCurrentApplication (line 127) | public Application getCurrentApplication() {
method getCurrentPackage (line 131) | public String getCurrentPackage() {
method getCurrentApplicationInfo (line 136) | public ApplicationInfo getCurrentApplicationInfo() {
method getCrashHandler (line 140) | public CrashHandler getCrashHandler() {
method setCrashHandler (line 144) | public void setCrashHandler(CrashHandler crashHandler) {
method getVUid (line 148) | public int getVUid() {
method getBaseVUid (line 152) | public int getBaseVUid() {
method getClassLoader (line 156) | public ClassLoader getClassLoader(ApplicationInfo appInfo) {
method getClassLoader (line 161) | public ClassLoader getClassLoader(String packageName) {
method sendMessage (line 166) | private void sendMessage(int what, Object obj) {
method getAppThread (line 173) | @Override
method getToken (line 178) | @Override
method initProcess (line 183) | public void initProcess(IBinder token, int vuid) {
method handleNewIntent (line 188) | private void handleNewIntent(NewIntentData data) {
method bindApplicationForActivity (line 214) | public void bindApplicationForActivity(final String packageName, final...
method bindApplication (line 219) | public void bindApplication(final String packageName, final String pro...
method bindApplicationNoCheck (line 235) | private void bindApplicationNoCheck(String packageName, String process...
method fixWeChatRecovery (line 408) | private void fixWeChatRecovery(Application app) {
method setupUncaughtHandler (line 421) | private void setupUncaughtHandler() {
method startIOUniformer (line 462) | @SuppressLint("SdCardPath")
method setupVirtualStorage (line 496) | private void setupVirtualStorage(ApplicationInfo info, int userId) {
method getMountPoints (line 567) | @SuppressLint("SdCardPath")
method createPackageContext (line 583) | private Context createPackageContext(String packageName) {
method fixBoundApp (line 594) | private Object fixBoundApp(AppBindData data) {
method installContentProviders (line 607) | private void installContentProviders(Context app, List<ProviderInfo> p...
method acquireProviderClient (line 623) | @Override
method fixInstalledProviders (line 652) | private void fixInstalledProviders() {
method clearSettingProvider (line 692) | private void clearSettingProvider() {
method clearContentProvider (line 710) | private static void clearContentProvider(Object cache) {
method finishActivity (line 721) | @Override
method scheduleNewIntent (line 726) | @Override
method scheduleReceiver (line 735) | @Override
method handleReceiver (line 745) | private void handleReceiver(ReceiverData data) {
method createProxyService (line 771) | @Override
method getDebugInfo (line 776) | @Override
class RootThreadGroup (line 783) | private static class RootThreadGroup extends ThreadGroup {
method RootThreadGroup (line 785) | RootThreadGroup(ThreadGroup parent) {
method uncaughtException (line 789) | @Override
class NewIntentData (line 801) | private final class NewIntentData {
class AppBindData (line 807) | private final class AppBindData {
class ReceiverData (line 814) | private final class ReceiverData {
class H (line 821) | private class H extends Handler {
method H (line 823) | private H() {
method handleMessage (line 827) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/badger/BadgerManager.java
class BadgerManager (line 14) | public class BadgerManager {
method addBadger (line 28) | private static void addBadger(IBadger badger) {
method handleBadger (line 32) | public static boolean handleBadger(Intent intent) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/badger/BroadcastBadger1.java
class BroadcastBadger1 (line 10) | public abstract class BroadcastBadger1 implements IBadger {
method getAction (line 12) | public abstract String getAction();
method getPackageKey (line 14) | public abstract String getPackageKey();
method getClassNameKey (line 16) | public abstract String getClassNameKey();
method getCountKey (line 18) | public abstract String getCountKey();
method handleBadger (line 20) | @Override
class LGHomeBadger (line 32) | static class LGHomeBadger extends BroadcastBadger1 {
method getAction (line 34) | @Override
method getPackageKey (line 39) | @Override
method getClassNameKey (line 44) | @Override
method getCountKey (line 49) | @Override
class AdwHomeBadger (line 55) | static class AdwHomeBadger extends BroadcastBadger1 {
method getAction (line 57) | @Override
method getPackageKey (line 62) | @Override
method getClassNameKey (line 67) | @Override
method getCountKey (line 72) | @Override
class AospHomeBadger (line 78) | static class AospHomeBadger extends BroadcastBadger1 {
method getAction (line 80) | @Override
method getPackageKey (line 85) | @Override
method getClassNameKey (line 90) | @Override
method getCountKey (line 95) | @Override
class NewHtcHomeBadger2 (line 102) | static class NewHtcHomeBadger2 extends BroadcastBadger1 {
method getAction (line 104) | @Override
method getPackageKey (line 109) | @Override
method getClassNameKey (line 114) | @Override
method getCountKey (line 119) | @Override
class OPPOHomeBader (line 126) | static class OPPOHomeBader extends BroadcastBadger1 {
method getAction (line 128) | @Override
method getPackageKey (line 133) | @Override
method getClassNameKey (line 138) | @Override
method getCountKey (line 143) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/badger/BroadcastBadger2.java
class BroadcastBadger2 (line 11) | public abstract class BroadcastBadger2 implements IBadger {
method getAction (line 13) | public abstract String getAction();
method getComponentKey (line 15) | public abstract String getComponentKey();
method getCountKey (line 17) | public abstract String getCountKey();
method handleBadger (line 19) | @Override
class NewHtcHomeBadger1 (line 34) | static class NewHtcHomeBadger1 extends BroadcastBadger2 {
method getAction (line 36) | @Override
method getComponentKey (line 41) | @Override
method getCountKey (line 47) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/badger/IBadger.java
type IBadger (line 10) | public interface IBadger {
method getAction (line 12) | String getAction();
method handleBadger (line 14) | BadgerInfo handleBadger(Intent intent);
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/core/CrashHandler.java
type CrashHandler (line 7) | public interface CrashHandler {
method handleUncaughtException (line 9) | void handleUncaughtException(Thread t, Throwable e);
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InstallStrategy.java
type InstallStrategy (line 8) | public interface InstallStrategy {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java
class InvocationStubManager (line 77) | public final class InvocationStubManager {
method InvocationStubManager (line 84) | private InvocationStubManager() {
method getInstance (line 87) | public static InvocationStubManager getInstance() {
method injectAll (line 91) | void injectAll() throws Throwable {
method isInit (line 102) | public boolean isInit() {
method init (line 107) | public void init() throws Throwable {
method injectInternal (line 116) | private void injectInternal() throws Throwable {
method addInjector (line 207) | private void addInjector(IInjector IInjector) {
method findInjector (line 211) | public <T extends IInjector> T findInjector(Class<T> clazz) {
method checkEnv (line 216) | public <T extends IInjector> void checkEnv(Class<T> clazz) {
method getInvocationStub (line 227) | public <T extends IInjector, H extends MethodInvocationStub> H getInvo...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java
class VirtualCore (line 66) | public final class VirtualCore {
method VirtualCore (line 106) | private VirtualCore() {
method get (line 109) | public static VirtualCore get() {
method getPM (line 113) | public static PackageManager getPM() {
method mainThread (line 117) | public static Object mainThread() {
method getInitLock (line 121) | public ConditionVariable getInitLock() {
method myUid (line 125) | public int myUid() {
method myUserId (line 129) | public int myUserId() {
method getComponentDelegate (line 133) | public ComponentDelegate getComponentDelegate() {
method setComponentDelegate (line 137) | public void setComponentDelegate(ComponentDelegate delegate) {
method getPhoneInfoDelegate (line 141) | public PhoneInfoDelegate getPhoneInfoDelegate() {
method setPhoneInfoDelegate (line 145) | public void setPhoneInfoDelegate(PhoneInfoDelegate phoneInfoDelegate) {
method setCrashHandler (line 149) | public void setCrashHandler(CrashHandler handler) {
method getTaskDescriptionDelegate (line 153) | public TaskDescriptionDelegate getTaskDescriptionDelegate() {
method setTaskDescriptionDelegate (line 157) | public void setTaskDescriptionDelegate(TaskDescriptionDelegate taskDes...
method getGids (line 161) | public int[] getGids() {
method getContext (line 165) | public Context getContext() {
method getPackageManager (line 169) | public PackageManager getPackageManager() {
method getHostPkg (line 173) | public String getHostPkg() {
method getUnHookPackageManager (line 177) | public PackageManager getUnHookPackageManager() {
method startup (line 182) | public void startup(Context context) throws Throwable {
method waitForEngine (line 208) | public void waitForEngine() {
method isEngineLaunched (line 212) | public boolean isEngineLaunched() {
method getEngineProcessName (line 223) | public String getEngineProcessName() {
method initialize (line 227) | public void initialize(VirtualInitializer initializer) {
method detectProcessType (line 247) | private void detectProcessType() {
method getService (line 268) | private IAppManager getService() {
method getStubInterface (line 279) | private Object getStubInterface() {
method isVAppProcess (line 287) | public boolean isVAppProcess() {
method isMainProcess (line 294) | public boolean isMainProcess() {
method isChildProcess (line 301) | public boolean isChildProcess() {
method isServerProcess (line 308) | public boolean isServerProcess() {
method getProcessName (line 315) | public String getProcessName() {
method getMainProcessName (line 322) | public String getMainProcessName() {
method preOpt (line 332) | @Deprecated
method isAppRunning (line 348) | public boolean isAppRunning(String packageName, int userId) {
method installPackage (line 352) | public InstallResult installPackage(String apkPath, int flags) {
method clearPackage (line 360) | public boolean clearPackage(String packageName) {
method clearPackageAsUser (line 368) | public boolean clearPackageAsUser(int userId, String packageName) {
method addVisibleOutsidePackage (line 376) | public void addVisibleOutsidePackage(String pkg) {
method removeVisibleOutsidePackage (line 384) | public void removeVisibleOutsidePackage(String pkg) {
method isOutsidePackageVisible (line 392) | public boolean isOutsidePackageVisible(String pkg) {
method isXposedEnabled (line 400) | public boolean isXposedEnabled() {
method isAppInstalled (line 404) | public boolean isAppInstalled(String pkg) {
method isPackageLaunchable (line 412) | public boolean isPackageLaunchable(String packageName) {
method getLaunchIntent (line 418) | public Intent getLaunchIntent(String packageName, int userId) {
method createShortcut (line 457) | public boolean createShortcut(int userId, String packageName, OnEmitSh...
method createShortcut (line 461) | public boolean createShortcut(int userId, String packageName, Intent s...
method createShortcutAboveN (line 536) | @TargetApi(Build.VERSION_CODES.N_MR1)
method createDeskShortcutAboveO (line 565) | @TargetApi(Build.VERSION_CODES.O)
method removeShortcut (line 594) | public boolean removeShortcut(int userId, String packageName, Intent s...
class UiCallback (line 636) | public abstract static class UiCallback extends IUiCallback.Stub {
method setUiCallback (line 639) | public void setUiCallback(Intent intent, IUiCallback callback) {
method getUiCallback (line 647) | public static IUiCallback getUiCallback(Intent intent) {
method getInstalledAppInfo (line 666) | public InstalledAppInfo getInstalledAppInfo(String pkg, int flags) {
method getInstalledAppCount (line 674) | public int getInstalledAppCount() {
method isStartup (line 682) | public boolean isStartup() {
method uninstallPackageAsUser (line 686) | public boolean uninstallPackageAsUser(String pkgName, int userId) {
method uninstallPackage (line 695) | public boolean uninstallPackage(String pkgName) {
method getResources (line 704) | public Resources getResources(String pkg) throws Resources.NotFoundExc...
method resolveActivityInfo (line 720) | public synchronized ActivityInfo resolveActivityInfo(Intent intent, in...
method resolveActivityInfo (line 741) | public ActivityInfo resolveActivityInfo(ComponentName componentName, i...
method resolveServiceInfo (line 745) | public ServiceInfo resolveServiceInfo(Intent intent, int userId) {
method killApp (line 754) | public void killApp(String pkg, int userId) {
method killAllApps (line 758) | public void killAllApps() {
method getInstalledApps (line 762) | public List<InstalledAppInfo> getInstalledApps(int flags) {
method getInstalledAppsAsUser (line 770) | public List<InstalledAppInfo> getInstalledAppsAsUser(int userId, int f...
method clearAppRequestListener (line 778) | public void clearAppRequestListener() {
method scanApps (line 786) | public void scanApps() {
method getAppRequestListener (line 794) | public IAppRequestListener getAppRequestListener() {
method setAppRequestListener (line 802) | public void setAppRequestListener(final AppRequestListener listener) {
method isPackageLaunched (line 831) | public boolean isPackageLaunched(int userId, String packageName) {
method setPackageHidden (line 839) | public void setPackageHidden(int userId, String packageName, boolean h...
method installPackageAsUser (line 847) | public boolean installPackageAsUser(int userId, String packageName) {
method isAppInstalledAsUser (line 855) | public boolean isAppInstalledAsUser(int userId, String packageName) {
method getPackageInstalledUsers (line 863) | public int[] getPackageInstalledUsers(String packageName) {
class PackageObserver (line 871) | public abstract static class PackageObserver extends IPackageObserver....
method registerObserver (line 874) | public void registerObserver(IPackageObserver observer) {
method unregisterObserver (line 882) | public void unregisterObserver(IPackageObserver observer) {
method isOutsideInstalled (line 890) | public boolean isOutsideInstalled(String packageName) {
method getSystemPid (line 900) | public int getSystemPid() {
type ProcessType (line 907) | private enum ProcessType {
type AppRequestListener (line 926) | public interface AppRequestListener {
method onRequestInstall (line 927) | void onRequestInstall(String path);
method onRequestUninstall (line 929) | void onRequestUninstall(String pkg);
type OnEmitShortcutListener (line 932) | public interface OnEmitShortcutListener {
method getIcon (line 933) | Bitmap getIcon(Bitmap originIcon);
method getName (line 935) | String getName(String originName);
class VirtualInitializer (line 938) | public static abstract class VirtualInitializer {
method onMainProcess (line 939) | public void onMainProcess() {
method onVirtualProcess (line 942) | public void onVirtualProcess() {
method onServerProcess (line 945) | public void onServerProcess() {
method onChildProcess (line 948) | public void onChildProcess() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/env/Constants.java
class Constants (line 15) | public class Constants {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/env/DeadServerException.java
class DeadServerException (line 7) | public class DeadServerException extends RuntimeException {
method DeadServerException (line 9) | public DeadServerException() {
method DeadServerException (line 12) | public DeadServerException(String message) {
method DeadServerException (line 16) | public DeadServerException(String message, Throwable cause) {
method DeadServerException (line 20) | public DeadServerException(Throwable cause) {
method DeadServerException (line 24) | public DeadServerException(String message, Throwable cause, boolean en...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/env/GPSStateline.java
class GPSStateline (line 4) | class GPSStateline {
method getAzimuth (line 14) | public double getAzimuth() {
method getElevation (line 18) | public double getElevation() {
method getPnr (line 22) | public int getPnr() {
method getSnr (line 26) | public double getSnr() {
method isHasAlmanac (line 30) | public boolean isHasAlmanac() {
method isHasEphemeris (line 34) | public boolean isHasEphemeris() {
method isUseInFix (line 38) | public boolean isUseInFix() {
method setAzimuth (line 42) | public void setAzimuth(double azimuth) {
method setElevation (line 46) | public void setElevation(double elevation) {
method setHasAlmanac (line 50) | public void setHasAlmanac(boolean hasAlmanac) {
method setHasEphemeris (line 54) | public void setHasEphemeris(boolean hasEphemeris) {
method setPnr (line 58) | public void setPnr(int pnr) {
method setSnr (line 62) | public void setSnr(double snr) {
method setUseInFix (line 66) | public void setUseInFix(boolean useInFix) {
method GPSStateline (line 70) | public GPSStateline(int pnr, double snr, double elevation, double azim...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/env/SpecialComponentList.java
class SpecialComponentList (line 23) | public final class SpecialComponentList {
class ConflictInstrumentation (line 25) | public static class ConflictInstrumentation {
method isConflictingInstrumentation (line 34) | public static boolean isConflictingInstrumentation(String packageNam...
class SpecSystemComponent (line 39) | public static class SpecSystemComponent {
method isSpecSystemPackage (line 58) | public static boolean isSpecSystemPackage(String pkg) {
method isActionInBlackList (line 114) | public static boolean isActionInBlackList(String action) {
method addBlackAction (line 123) | public static void addBlackAction(String action) {
method protectIntentFilter (line 127) | public static void protectIntentFilter(IntentFilter filter) {
method protectIntent (line 148) | public static void protectIntent(Intent intent) {
method unprotectIntent (line 155) | public static void unprotectIntent(Intent intent) {
method protectAction (line 162) | public static String protectAction(String originAction) {
method unprotectAction (line 176) | public static String unprotectAction(String action) {
method isWhitePermission (line 192) | public static boolean isWhitePermission(String permission) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/env/VirtualGPSSatalines.java
class VirtualGPSSatalines (line 6) | public class VirtualGPSSatalines {
method getAlmanacMask (line 22) | public int getAlmanacMask() {
method getAzimuths (line 26) | public float[] getAzimuths() {
method getElevations (line 30) | public float[] getElevations() {
method getEphemerisMask (line 34) | public int getEphemerisMask() {
method getPrns (line 38) | public int[] getPrns() {
method getSnrs (line 42) | public float[] getSnrs() {
method getUsedInFixMask (line 46) | public int getUsedInFixMask() {
method get (line 50) | public static VirtualGPSSatalines get() {
method VirtualGPSSatalines (line 54) | private VirtualGPSSatalines() {
method getSvCount (line 126) | public int getSvCount() {
method getPrnWithFlags (line 130) | public int[] getPrnWithFlags() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/env/VirtualRuntime.java
class VirtualRuntime (line 22) | public class VirtualRuntime {
method getUIHandler (line 29) | public static Handler getUIHandler() {
method getProcessName (line 33) | public static String getProcessName() {
method getInitialPackageName (line 37) | public static String getInitialPackageName() {
method setupRuntime (line 41) | public static void setupRuntime(String processName, ApplicationInfo ap...
method crash (line 55) | public static <T> T crash(RemoteException e) throws RuntimeException {
method isArt (line 65) | public static boolean isArt() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ActivityFixer.java
class ActivityFixer (line 22) | public final class ActivityFixer {
method ActivityFixer (line 24) | private ActivityFixer() {
method fixActivity (line 27) | public static void fixActivity(Activity activity) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ComponentFixer.java
class ComponentFixer (line 12) | public class ComponentFixer {
method fixComponentClassName (line 14) | public static String fixComponentClassName(String pkgName, String clas...
method fixComponentInfo (line 24) | public static void fixComponentInfo(PackageSetting setting, ComponentI...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ContextFixer.java
class ContextFixer (line 24) | public class ContextFixer {
method fixContext (line 33) | public static void fixContext(Context context) {
method fixAttributionSource (line 80) | public static void fixAttributionSource(Object attr, String pkg, int u...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/BinderInvocationProxy.java
class BinderInvocationProxy (line 14) | public abstract class BinderInvocationProxy extends MethodInvocationProx...
method BinderInvocationProxy (line 18) | public BinderInvocationProxy(IInterface stub, String serviceName) {
method BinderInvocationProxy (line 22) | public BinderInvocationProxy(RefStaticMethod<IInterface> asInterfaceMe...
method BinderInvocationProxy (line 26) | public BinderInvocationProxy(Class<?> stubClass, String serviceName) {
method BinderInvocationProxy (line 30) | public BinderInvocationProxy(BinderInvocationStub hookDelegate, String...
method inject (line 35) | @Override
method isEnvBad (line 40) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/BinderInvocationStub.java
class BinderInvocationStub (line 23) | @SuppressWarnings("unchecked")
method BinderInvocationStub (line 29) | public BinderInvocationStub(RefStaticMethod<IInterface> asInterfaceMet...
method BinderInvocationStub (line 33) | public BinderInvocationStub(Class<?> stubClass, IBinder binder) {
method BinderInvocationStub (line 38) | public BinderInvocationStub(IInterface mBaseInterface) {
method asInterface (line 44) | private static IInterface asInterface(RefStaticMethod<IInterface> asIn...
method asInterface (line 51) | private static IInterface asInterface(Class<?> stubClass, IBinder bind...
method replaceService (line 64) | public void replaceService(String name) {
class AsBinder (line 70) | private final class AsBinder extends MethodProxy {
method getMethodName (line 72) | @Override
method call (line 77) | @Override
method getInterfaceDescriptor (line 84) | @Override
method getContext (line 89) | public Context getContext() {
method pingBinder (line 93) | @Override
method isBinderAlive (line 98) | @Override
method queryLocalInterface (line 103) | @Override
method dump (line 108) | @Override
method dumpAsync (line 113) | @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
method transact (line 119) | @Override
method linkToDeath (line 124) | @Override
method unlinkToDeath (line 129) | @Override
method getBaseBinder (line 134) | public IBinder getBaseBinder() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/LogInvocation.java
type Condition (line 18) | static enum Condition {
method getLogLevel (line 21) | public int getLogLevel(boolean isHooked, boolean isError) {
method getLogLevel (line 30) | public int getLogLevel(boolean isHooked, boolean isError) {
method getLogLevel (line 39) | public int getLogLevel(boolean isHooked, boolean isError) {
method getLogLevel (line 49) | public int getLogLevel(boolean isHooked, boolean isError) {
method getLogLevel (line 54) | public abstract int getLogLevel(boolean isHooked, boolean isError);
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/MethodBox.java
class MethodBox (line 10) | @SuppressWarnings("unchecked")
method MethodBox (line 16) | public MethodBox(Method method, Object who, Object[] args) {
method call (line 22) | public <T> T call() throws InvocationTargetException {
method callSafe (line 30) | public <T> T callSafe() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/MethodInvocationProxy.java
class MethodInvocationProxy (line 25) | public abstract class MethodInvocationProxy<T extends MethodInvocationSt...
method MethodInvocationProxy (line 29) | public MethodInvocationProxy(T invocationStub) {
method onBindMethods (line 40) | protected void onBindMethods() {
method addMethodProxy (line 61) | private void addMethodProxy(Class<?> hookType) {
method addMethodProxy (line 79) | public MethodProxy addMethodProxy(MethodProxy methodProxy) {
method afterHookApply (line 83) | protected void afterHookApply(T delegate) {
method inject (line 86) | @Override
method getContext (line 89) | public Context getContext() {
method getInvocationStub (line 93) | public T getInvocationStub() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/MethodInvocationStub.java
class MethodInvocationStub (line 27) | @SuppressWarnings("unchecked")
method getAllHooks (line 39) | public Map<String, MethodProxy> getAllHooks() {
method MethodInvocationStub (line 44) | public MethodInvocationStub(T baseInterface, Class<?>... proxyInterfac...
method getInvocationLoggingCondition (line 56) | public LogInvocation.Condition getInvocationLoggingCondition() {
method setInvocationLoggingCondition (line 60) | public void setInvocationLoggingCondition(LogInvocation.Condition invo...
method setIdentityName (line 64) | public void setIdentityName(String identityName) {
method getIdentityName (line 68) | public String getIdentityName() {
method MethodInvocationStub (line 75) | public MethodInvocationStub(T baseInterface) {
method copyMethodProxies (line 84) | public void copyMethodProxies(MethodInvocationStub from) {
method addMethodProxy (line 93) | public MethodProxy addMethodProxy(MethodProxy methodProxy) {
method removeMethodProxy (line 111) | public MethodProxy removeMethodProxy(String hookName) {
method removeMethodProxy (line 120) | public void removeMethodProxy(MethodProxy methodProxy) {
method removeAllMethodProxies (line 129) | public void removeAllMethodProxies() {
method getMethodProxy (line 140) | @SuppressWarnings("unchecked")
method getProxyInterface (line 148) | public T getProxyInterface() {
method getBaseInterface (line 155) | public T getBaseInterface() {
method getMethodProxiesCount (line 162) | public int getMethodProxiesCount() {
class HookInvocationHandler (line 166) | private class HookInvocationHandler implements InvocationHandler {
method invoke (line 167) | @Override
method dumpMethodProxies (line 223) | private void dumpMethodProxies() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/MethodProxy.java
class MethodProxy (line 19) | public abstract class MethodProxy {
method MethodProxy (line 24) | public MethodProxy() {
method getHostPkg (line 31) | public static String getHostPkg() {
method getAppPkg (line 35) | public static String getAppPkg() {
method getHostContext (line 39) | protected static Context getHostContext() {
method isAppProcess (line 43) | protected static boolean isAppProcess() {
method isServerProcess (line 47) | protected static boolean isServerProcess() {
method isMainProcess (line 51) | protected static boolean isMainProcess() {
method getVUid (line 55) | protected static int getVUid() {
method getAppUserId (line 59) | public static int getAppUserId() {
method getBaseVUid (line 63) | protected static int getBaseVUid() {
method getRealUid (line 67) | protected static int getRealUid() {
method getDeviceInfo (line 71) | protected static VDeviceInfo getDeviceInfo() {
method isFakeLocationEnable (line 75) | protected static boolean isFakeLocationEnable() {
method isVisiblePackage (line 79) | public static boolean isVisiblePackage(ApplicationInfo info) {
method getMethodName (line 85) | public abstract String getMethodName();
method beforeCall (line 87) | public boolean beforeCall(Object who, Method method, Object... args) {
method call (line 91) | public Object call(Object who, Method method, Object... args) throws T...
method afterCall (line 95) | public Object afterCall(Object who, Method method, Object[] args, Obje...
method isEnable (line 99) | public boolean isEnable() {
method setEnable (line 103) | public void setEnable(boolean enable) {
method getInvocationLoggingCondition (line 107) | public LogInvocation.Condition getInvocationLoggingCondition() {
method setInvocationloggingCondition (line 111) | public void setInvocationloggingCondition(LogInvocation.Condition invo...
method isAppPkg (line 115) | public boolean isAppPkg(String pkg) {
method getPM (line 119) | protected PackageManager getPM() {
method toString (line 123) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceCallingPkgMethodProxy.java
class ReplaceCallingPkgMethodProxy (line 11) | public class ReplaceCallingPkgMethodProxy extends StaticMethodProxy {
method ReplaceCallingPkgMethodProxy (line 13) | public ReplaceCallingPkgMethodProxy(String name) {
method beforeCall (line 17) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceLastPkgMethodProxy.java
class ReplaceLastPkgMethodProxy (line 11) | public class ReplaceLastPkgMethodProxy extends StaticMethodProxy {
method ReplaceLastPkgMethodProxy (line 13) | public ReplaceLastPkgMethodProxy(String name) {
method beforeCall (line 17) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceLastUidMethodProxy.java
class ReplaceLastUidMethodProxy (line 9) | public class ReplaceLastUidMethodProxy extends StaticMethodProxy {
method ReplaceLastUidMethodProxy (line 11) | public ReplaceLastUidMethodProxy(String name) {
method beforeCall (line 15) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceSequencePkgMethodProxy.java
class ReplaceSequencePkgMethodProxy (line 11) | public class ReplaceSequencePkgMethodProxy extends StaticMethodProxy {
method ReplaceSequencePkgMethodProxy (line 15) | public ReplaceSequencePkgMethodProxy(String name, int sequence) {
method beforeCall (line 20) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceSpecPkgMethodProxy.java
class ReplaceSpecPkgMethodProxy (line 9) | public class ReplaceSpecPkgMethodProxy extends StaticMethodProxy {
method ReplaceSpecPkgMethodProxy (line 13) | public ReplaceSpecPkgMethodProxy(String name, int index) {
method beforeCall (line 18) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceUidMethodProxy.java
class ReplaceUidMethodProxy (line 5) | public class ReplaceUidMethodProxy extends StaticMethodProxy {
method ReplaceUidMethodProxy (line 8) | public ReplaceUidMethodProxy(String name, int index) {
method beforeCall (line 13) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/ResultStaticMethodProxy.java
class ResultStaticMethodProxy (line 9) | public class ResultStaticMethodProxy extends StaticMethodProxy {
method ResultStaticMethodProxy (line 13) | public ResultStaticMethodProxy(String name, Object result) {
method getResult (line 18) | public Object getResult() {
method call (line 22) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/base/StaticMethodProxy.java
class StaticMethodProxy (line 7) | public class StaticMethodProxy extends MethodProxy {
method StaticMethodProxy (line 11) | public StaticMethodProxy(String name) {
method getMethodName (line 15) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/delegate/AppInstrumentation.java
class AppInstrumentation (line 31) | public final class AppInstrumentation extends InstrumentationDelegate im...
method AppInstrumentation (line 37) | private AppInstrumentation(Instrumentation base) {
method getDefault (line 41) | public static AppInstrumentation getDefault() {
method create (line 52) | private static AppInstrumentation create() {
method inject (line 61) | @Override
method isEnvBad (line 67) | @Override
method callActivityOnCreate (line 72) | @Override
method newActivity (line 113) | @Override
method newActivity (line 126) | @Override
method callActivityOnCreate (line 139) | @Override
method callActivityOnResume (line 147) | @Override
method callActivityOnDestroy (line 159) | @Override
method callActivityOnPause (line 166) | @Override
method callApplicationOnCreate (line 174) | @Override
method callUiCallback (line 183) | private void callUiCallback(Intent intent, boolean success) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/delegate/ComponentDelegate.java
type ComponentDelegate (line 9) | public interface ComponentDelegate {
method beforeActivityCreate (line 13) | @Override
method beforeActivityResume (line 18) | @Override
method beforeActivityPause (line 23) | @Override
method beforeActivityDestroy (line 28) | @Override
method afterActivityCreate (line 33) | @Override
method afterActivityResume (line 38) | @Override
method afterActivityPause (line 43) | @Override
method afterActivityDestroy (line 48) | @Override
method onSendBroadcast (line 53) | @Override
method beforeApplicationCreate (line 58) | @Override
method afterApplicationCreate (line 63) | @Override
method beforeApplicationCreate (line 69) | void beforeApplicationCreate(Application application);
method afterApplicationCreate (line 71) | void afterApplicationCreate(Application application);
method beforeActivityCreate (line 73) | void beforeActivityCreate(Activity activity);
method beforeActivityResume (line 75) | void beforeActivityResume(Activity activity);
method beforeActivityPause (line 77) | void beforeActivityPause(Activity activity);
method beforeActivityDestroy (line 79) | void beforeActivityDestroy(Activity activity);
method afterActivityCreate (line 81) | void afterActivityCreate(Activity activity);
method afterActivityResume (line 83) | void afterActivityResume(Activity activity);
method afterActivityPause (line 85) | void afterActivityPause(Activity activity);
method afterActivityDestroy (line 87) | void afterActivityDestroy(Activity activity);
method onSendBroadcast (line 89) | void onSendBroadcast(Intent intent);
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/delegate/InstrumentationDelegate.java
class InstrumentationDelegate (line 24) | public class InstrumentationDelegate extends Instrumentation {
method InstrumentationDelegate (line 28) | public InstrumentationDelegate(Instrumentation base) {
method newApplication (line 32) | public static Application newApplication(Class<?> clazz, Context context)
method onCreate (line 37) | @Override
method start (line 42) | @Override
method onStart (line 47) | @Override
method onException (line 52) | @Override
method sendStatus (line 57) | @Override
method finish (line 62) | @Override
method setAutomaticPerformanceSnapshots (line 67) | @Override
method startPerformanceSnapshot (line 72) | @Override
method endPerformanceSnapshot (line 77) | @Override
method onDestroy (line 82) | @Override
method getContext (line 87) | @Override
method getComponentName (line 92) | @Override
method getTargetContext (line 97) | @Override
method isProfiling (line 102) | @Override
method startProfiling (line 107) | @Override
method stopProfiling (line 112) | @Override
method setInTouchMode (line 117) | @Override
method waitForIdle (line 122) | @Override
method waitForIdleSync (line 127) | @Override
method runOnMainSync (line 132) | @Override
method startActivitySync (line 137) | @Override
method addMonitor (line 142) | @Override
method addMonitor (line 147) | @Override
method addMonitor (line 152) | @Override
method checkMonitorHit (line 157) | @Override
method waitForMonitor (line 162) | @Override
method waitForMonitorWithTimeout (line 167) | @Override
method removeMonitor (line 172) | @Override
method invokeMenuActionSync (line 177) | @Override
method invokeContextMenuAction (line 182) | @Override
method sendStringSync (line 187) | @Override
method sendKeySync (line 192) | @Override
method sendKeyDownUpSync (line 197) | @Override
method sendCharacterSync (line 202) | @Override
method sendPointerSync (line 207) | @Override
method sendTrackballEventSync (line 212) | @Override
method newApplication (line 217) | @Override
method callApplicationOnCreate (line 223) | @Override
method newActivity (line 228) | @Override
method newActivity (line 236) | @Override
method callActivityOnCreate (line 242) | @Override
method callActivityOnCreate (line 247) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method callActivityOnDestroy (line 253) | @Override
method callActivityOnRestoreInstanceState (line 258) | @Override
method callActivityOnRestoreInstanceState (line 263) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method callActivityOnPostCreate (line 270) | @Override
method callActivityOnPostCreate (line 275) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method callActivityOnNewIntent (line 281) | @Override
method callActivityOnStart (line 287) | @Override
method callActivityOnRestart (line 292) | @Override
method callActivityOnResume (line 297) | @Override
method callActivityOnStop (line 302) | @Override
method callActivityOnSaveInstanceState (line 307) | @Override
method callActivityOnSaveInstanceState (line 312) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method callActivityOnPause (line 319) | @Override
method callActivityOnUserLeaving (line 324) | @Override
method getAllocCounts (line 329) | @Override
method getBinderCounts (line 334) | @Override
method getUiAutomation (line 340) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/delegate/PhoneInfoDelegate.java
type PhoneInfoDelegate (line 3) | public interface PhoneInfoDelegate {
method getDeviceId (line 11) | String getDeviceId(String oldDeviceId, int userId);
method getBluetoothAddress (line 19) | String getBluetoothAddress(String oldBluetoothAddress, int userId);
method getMacAddress (line 27) | String getMacAddress(String oldMacAddress, int userId);
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/delegate/TaskDescriptionDelegate.java
type TaskDescriptionDelegate (line 8) | public interface TaskDescriptionDelegate {
method getTaskDescription (line 9) | public ActivityManager.TaskDescription getTaskDescription(ActivityMana...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/DownloadProviderHook.java
class DownloadProviderHook (line 18) | class DownloadProviderHook extends ExternalProviderHook {
method DownloadProviderHook (line 34) | DownloadProviderHook(Object base) {
method insert (line 38) | @Override
method query (line 65) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ExternalProviderHook.java
class ExternalProviderHook (line 11) | public class ExternalProviderHook extends ProviderHook {
method ExternalProviderHook (line 13) | public ExternalProviderHook(Object base) {
method processArgs (line 17) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/InternalProviderHook.java
class InternalProviderHook (line 7) | public class InternalProviderHook extends ProviderHook {
method InternalProviderHook (line 9) | public InternalProviderHook(Object base) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/MediaProviderHook.java
class MediaProviderHook (line 18) | class MediaProviderHook extends ProviderHook {
method MediaProviderHook (line 21) | MediaProviderHook(Object base) {
method insert (line 25) | @Override
method query (line 46) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java
class ProviderHook (line 32) | public class ProviderHook implements InvocationHandler {
method fetch (line 45) | @Override
method fetch (line 51) | @Override
method fetch (line 57) | @Override
method ProviderHook (line 66) | public ProviderHook(Object base) {
method fetchHook (line 70) | private static HookFetcher fetchHook(String authority) {
method createProxy (line 86) | private static IInterface createProxy(IInterface provider, ProviderHoo...
method createProxy (line 95) | public static IInterface createProxy(boolean external, String authorit...
method call (line 110) | public Bundle call(MethodBox methodBox, String method, String arg, Bun...
method insert (line 114) | public Uri insert(MethodBox methodBox, Uri url, ContentValues initialV...
method query (line 119) | public Cursor query(MethodBox methodBox, Uri url, String[] projection,...
method getType (line 124) | public String getType(MethodBox methodBox, Uri url) throws InvocationT...
method bulkInsert (line 128) | public int bulkInsert(MethodBox methodBox, Uri url, ContentValues[] in...
method delete (line 132) | public int delete(MethodBox methodBox, Uri url, String selection, Stri...
method update (line 136) | public int update(MethodBox methodBox, Uri url, ContentValues values, ...
method openFile (line 141) | public ParcelFileDescriptor openFile(MethodBox methodBox, Uri url, Str...
method openAssetFile (line 145) | public AssetFileDescriptor openAssetFile(MethodBox methodBox, Uri url,...
method invoke (line 149) | @Override
method processArgs (line 245) | protected void processArgs(Method method, Object... args) {
type HookFetcher (line 249) | public interface HookFetcher {
method fetch (line 250) | ProviderHook fetch(boolean external, IInterface provider);
method tryFixAttributionSource (line 253) | private void tryFixAttributionSource(Object[] args) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/QueryRedirectCursor.java
class QueryRedirectCursor (line 13) | class QueryRedirectCursor extends CrossProcessCursorWrapper {
method QueryRedirectCursor (line 22) | QueryRedirectCursor(Cursor cursor, String columnName) {
method copyStringToBuffer (line 27) | @Override
method getString (line 46) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/providers/SettingsProviderHook.java
class SettingsProviderHook (line 18) | public class SettingsProviderHook extends ExternalProviderHook {
method SettingsProviderHook (line 33) | public SettingsProviderHook(Object base) {
method getMethodType (line 37) | private static int getMethodType(String method) {
method isSecureMethod (line 47) | private static boolean isSecureMethod(String method) {
method call (line 52) | @Override
method wrapBundle (line 82) | private Bundle wrapBundle(String name, String value) {
method processArgs (line 93) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/account/AccountManagerStub.java
class AccountManagerStub (line 19) | public class AccountManagerStub extends BinderInvocationProxy {
method AccountManagerStub (line 23) | public AccountManagerStub() {
method onBindMethods (line 27) | @Override
class getPassword (line 69) | private static class getPassword extends MethodProxy {
method getMethodName (line 70) | @Override
method call (line 75) | @Override
class getUserData (line 82) | private static class getUserData extends MethodProxy {
method getMethodName (line 83) | @Override
method call (line 88) | @Override
class getAuthenticatorTypes (line 96) | private static class getAuthenticatorTypes extends MethodProxy {
method getMethodName (line 97) | @Override
method call (line 102) | @Override
class getAccounts (line 108) | private static class getAccounts extends MethodProxy {
method getMethodName (line 109) | @Override
method call (line 114) | @Override
class getAccountsForPackage (line 121) | private static class getAccountsForPackage extends MethodProxy {
method getMethodName (line 122) | @Override
method call (line 127) | @Override
class getAccountsByTypeForPackage (line 134) | private static class getAccountsByTypeForPackage extends MethodProxy {
method getMethodName (line 135) | @Override
method call (line 140) | @Override
class getAccountsAsUser (line 148) | private static class getAccountsAsUser extends MethodProxy {
method getMethodName (line 149) | @Override
method call (line 154) | @Override
class hasFeatures (line 161) | private static class hasFeatures extends MethodProxy {
method getMethodName (line 162) | @Override
method call (line 167) | @Override
class getAccountsByFeatures (line 177) | private static class getAccountsByFeatures extends MethodProxy {
method getMethodName (line 178) | @Override
method call (line 183) | @Override
class addAccountExplicitly (line 193) | private static class addAccountExplicitly extends MethodProxy {
method getMethodName (line 194) | @Override
method call (line 199) | @Override
class removeAccount (line 208) | private static class removeAccount extends MethodProxy {
method getMethodName (line 209) | @Override
method call (line 214) | @Override
class removeAccountAsUser (line 224) | private static class removeAccountAsUser extends MethodProxy {
method getMethodName (line 225) | @Override
method call (line 230) | @Override
class removeAccountExplicitly (line 240) | private static class removeAccountExplicitly extends MethodProxy {
method getMethodName (line 241) | @Override
method call (line 246) | @Override
class copyAccountToUser (line 253) | private static class copyAccountToUser extends MethodProxy {
method getMethodName (line 254) | @Override
method call (line 259) | @Override
class invalidateAuthToken (line 270) | private static class invalidateAuthToken extends MethodProxy {
method getMethodName (line 271) | @Override
method call (line 276) | @Override
class peekAuthToken (line 285) | private static class peekAuthToken extends MethodProxy {
method getMethodName (line 286) | @Override
method call (line 291) | @Override
class setAuthToken (line 299) | private static class setAuthToken extends MethodProxy {
method getMethodName (line 300) | @Override
method call (line 305) | @Override
class setPassword (line 315) | private static class setPassword extends MethodProxy {
method getMethodName (line 316) | @Override
method call (line 321) | @Override
class clearPassword (line 330) | private static class clearPassword extends MethodProxy {
method getMethodName (line 331) | @Override
method call (line 336) | @Override
class setUserData (line 344) | private static class setUserData extends MethodProxy {
method getMethodName (line 345) | @Override
method call (line 350) | @Override
class updateAppPermission (line 360) | private static class updateAppPermission extends MethodProxy {
method getMethodName (line 361) | @Override
method call (line 366) | @Override
class getAuthToken (line 377) | private static class getAuthToken extends MethodProxy {
method getMethodName (line 378) | @Override
method call (line 383) | @Override
class addAccount (line 396) | private static class addAccount extends MethodProxy {
method getMethodName (line 397) | @Override
method call (line 402) | @Override
class addAccountAsUser (line 415) | private static class addAccountAsUser extends MethodProxy {
method getMethodName (line 416) | @Override
method call (line 421) | @Override
class updateCredentials (line 434) | private static class updateCredentials extends MethodProxy {
method getMethodName (line 435) | @Override
method call (line 440) | @Override
class editProperties (line 452) | private static class editProperties extends MethodProxy {
method getMethodName (line 453) | @Override
method call (line 458) | @Override
class confirmCredentialsAsUser (line 468) | private static class confirmCredentialsAsUser extends MethodProxy {
method getMethodName (line 469) | @Override
method call (line 474) | @Override
class accountAuthenticated (line 486) | private static class accountAuthenticated extends MethodProxy {
method getMethodName (line 487) | @Override
method call (line 492) | @Override
class getAuthTokenLabel (line 499) | private static class getAuthTokenLabel extends MethodProxy {
method getMethodName (line 500) | @Override
method call (line 505) | @Override
class addSharedAccountAsUser (line 515) | private static class addSharedAccountAsUser extends MethodProxy {
method getMethodName (line 516) | @Override
method call (line 521) | @Override
class getSharedAccountsAsUser (line 529) | private static class getSharedAccountsAsUser extends MethodProxy {
method getMethodName (line 530) | @Override
method call (line 535) | @Override
class removeSharedAccountAsUser (line 542) | private static class removeSharedAccountAsUser extends MethodProxy {
method getMethodName (line 543) | @Override
method call (line 548) | @Override
class renameAccount (line 556) | private static class renameAccount extends MethodProxy {
method getMethodName (line 557) | @Override
method call (line 562) | @Override
class getPreviousName (line 572) | private static class getPreviousName extends MethodProxy {
method getMethodName (line 573) | @Override
method call (line 578) | @Override
class renameSharedAccountAsUser (line 585) | private static class renameSharedAccountAsUser extends MethodProxy {
method getMethodName (line 586) | @Override
method call (line 591) | @Override
class setAccountVisibility (line 600) | private static class setAccountVisibility extends MethodProxy {
method getMethodName (line 602) | @Override
method call (line 607) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/alarm/AlarmManagerStub.java
class AlarmManagerStub (line 20) | public class AlarmManagerStub extends BinderInvocationProxy {
method AlarmManagerStub (line 22) | public AlarmManagerStub() {
method onBindMethods (line 26) | @Override
class SetTimeZone (line 34) | private static class SetTimeZone extends MethodProxy {
method getMethodName (line 35) | @Override
method call (line 40) | @Override
class SetTime (line 46) | private static class SetTime extends MethodProxy {
method getMethodName (line 47) | @Override
method call (line 52) | @Override
class Set (line 61) | private static class Set extends MethodProxy {
method getMethodName (line 63) | @Override
method beforeCall (line 68) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/ActivityManagerStub.java
class ActivityManagerStub (line 41) | @Inject(MethodProxies.class)
method ActivityManagerStub (line 44) | public ActivityManagerStub() {
method inject (line 48) | @Override
method onBindMethods (line 67) | @Override
method isEnvBad (line 145) | @Override
class isUserRunning (line 150) | private class isUserRunning extends MethodProxy {
method getMethodName (line 151) | @Override
method call (line 156) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/ActivityTaskManagerStub.java
class ActivityTaskManagerStub (line 20) | @Inject(MethodProxies.class)
method ActivityTaskManagerStub (line 22) | public ActivityTaskManagerStub() {
method onBindMethods (line 26) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/HCallbackStub.java
class HCallbackStub (line 29) | public class HCallbackStub implements Handler.Callback, IInjector {
method HCallbackStub (line 50) | private HCallbackStub() {
method getDefault (line 53) | public static HCallbackStub getDefault() {
method getH (line 57) | private static Handler getH() {
method getHCallback (line 61) | private static Handler.Callback getHCallback() {
method handleMessage (line 71) | @Override
method handleLaunchActivity (line 103) | private boolean handleLaunchActivity(Message msg) {
method inject (line 141) | @Override
method isEnvBad (line 147) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java
class MethodProxies (line 85) | @SuppressWarnings("unused")
class ForceStopPackage (line 89) | static class ForceStopPackage extends MethodProxy {
method getMethodName (line 91) | @Override
method call (line 96) | @Override
method isEnable (line 104) | @Override
class CrashApplication (line 111) | static class CrashApplication extends MethodProxy {
method getMethodName (line 113) | @Override
method call (line 118) | @Override
method isEnable (line 123) | @Override
class AddPackageDependency (line 130) | static class AddPackageDependency extends MethodProxy {
method getMethodName (line 132) | @Override
method call (line 137) | @Override
method isEnable (line 143) | @Override
class GetPackageForToken (line 149) | static class GetPackageForToken extends MethodProxy {
method getMethodName (line 151) | @Override
method call (line 156) | @Override
class UnbindService (line 167) | static class UnbindService extends MethodProxy {
method getMethodName (line 169) | @Override
method call (line 174) | @Override
method isEnable (line 184) | @Override
class GetContentProviderExternal (line 190) | static class GetContentProviderExternal extends GetContentProvider {
method getMethodName (line 192) | @Override
method getProviderNameIndex (line 197) | @Override
method getPackageIndex (line 202) | @Override
method isEnable (line 207) | @Override
class StartVoiceActivity (line 213) | static class StartVoiceActivity extends StartActivity {
method getMethodName (line 214) | @Override
method call (line 219) | @Override
class UnstableProviderDied (line 226) | static class UnstableProviderDied extends MethodProxy {
method getMethodName (line 228) | @Override
method call (line 233) | @Override
class PeekService (line 243) | static class PeekService extends MethodProxy {
method getMethodName (line 245) | @Override
method call (line 250) | @Override
method isEnable (line 258) | @Override
class GetPackageAskScreenCompat (line 265) | static class GetPackageAskScreenCompat extends MethodProxy {
method getMethodName (line 267) | @Override
method call (line 272) | @Override
method isEnable (line 283) | @Override
class GetIntentSender (line 290) | static class GetIntentSender extends MethodProxy {
method getMethodName (line 296) | @Override
method call (line 301) | @Override
method redirectIntentSender (line 333) | private Intent redirectIntentSender(int type, String creator, Intent...
method isEnable (line 365) | @Override
class OverridePendingTransition (line 373) | static class OverridePendingTransition extends MethodProxy {
method getMethodName (line 375) | @Override
method call (line 380) | @Override
class StartActivity (line 387) | static class StartActivity extends MethodProxy {
method getMethodName (line 393) | @Override
method call (line 398) | @Override
method handleInstallRequest (line 504) | private boolean handleInstallRequest(Intent intent) {
method handleUninstallRequest (line 519) | private boolean handleUninstallRequest(Intent intent) {
method handleMediaCaptureRequest (line 537) | private void handleMediaCaptureRequest(Intent intent) {
class StartActivities (line 554) | static class StartActivities extends MethodProxy {
method getMethodName (line 556) | @Override
method call (line 561) | @Override
method isEnable (line 574) | @Override
class FinishActivity (line 581) | static class FinishActivity extends MethodProxy {
method getMethodName (line 582) | @Override
method afterCall (line 587) | @Override
method isEnable (line 614) | @Override
class GetCallingPackage (line 621) | static class GetCallingPackage extends MethodProxy {
method getMethodName (line 623) | @Override
method call (line 628) | @Override
method isEnable (line 634) | @Override
class GetPackageForIntentSender (line 641) | static class GetPackageForIntentSender extends MethodProxy {
method getMethodName (line 642) | @Override
method call (line 647) | @Override
method isEnable (line 659) | @Override
class PublishContentProviders (line 666) | @SuppressWarnings("unchecked")
method getMethodName (line 669) | @Override
method call (line 674) | @Override
method isEnable (line 679) | @Override
class GetServices (line 686) | static class GetServices extends MethodProxy {
method getMethodName (line 687) | @Override
method call (line 692) | @Override
method isEnable (line 699) | @Override
class GrantUriPermissionFromOwner (line 705) | static class GrantUriPermissionFromOwner extends MethodProxy {
method getMethodName (line 707) | @Override
method call (line 712) | @Override
method isEnable (line 718) | @Override
class SetServiceForeground (line 724) | static class SetServiceForeground extends MethodProxy {
method getMethodName (line 726) | @Override
method call (line 731) | @Override
method isEnable (line 767) | @Override
class UpdateDeviceOwner (line 774) | static class UpdateDeviceOwner extends MethodProxy {
method getMethodName (line 776) | @Override
method call (line 781) | @Override
method isEnable (line 787) | @Override
class GetIntentForIntentSender (line 795) | static class GetIntentForIntentSender extends MethodProxy {
method getMethodName (line 797) | @Override
method afterCall (line 802) | @Override
class UnbindFinished (line 813) | static class UnbindFinished extends MethodProxy {
method getMethodName (line 815) | @Override
method call (line 820) | @Override
method isEnable (line 829) | @Override
class StartActivityIntentSender (line 835) | static class StartActivityIntentSender extends MethodProxy {
method getMethodName (line 836) | @Override
method call (line 841) | @Override
class BindService (line 849) | static class BindService extends MethodProxy {
method getMethodName (line 851) | @Override
method call (line 856) | @Override
method isEnable (line 883) | @Override
class BindIsolatedService (line 890) | static class BindIsolatedService extends BindService {
method getMethodName (line 891) | @Override
method beforeCall (line 896) | @Override
class StartService (line 904) | static class StartService extends MethodProxy {
method getMethodName (line 906) | @Override
method call (line 911) | @Override
method isEnable (line 941) | @Override
method isFiltered (line 946) | private boolean isFiltered(Intent service) {
class StartActivityAndWait (line 957) | static class StartActivityAndWait extends StartActivity {
method getMethodName (line 958) | @Override
method call (line 963) | @Override
class PublishService (line 970) | static class PublishService extends MethodProxy {
method getMethodName (line 972) | @Override
method call (line 977) | @Override
method isEnable (line 989) | @Override
class GetRunningAppProcesses (line 996) | @SuppressWarnings("unchecked")
method getMethodName (line 999) | @Override
method call (line 1004) | @Override
class SetPackageAskScreenCompat (line 1026) | static class SetPackageAskScreenCompat extends MethodProxy {
method getMethodName (line 1028) | @Override
method call (line 1033) | @Override
method isEnable (line 1044) | @Override
class GetCallingActivity (line 1051) | static class GetCallingActivity extends MethodProxy {
method getMethodName (line 1053) | @Override
method call (line 1058) | @Override
method isEnable (line 1064) | @Override
class GetCurrentUser (line 1071) | static class GetCurrentUser extends MethodProxy {
method getMethodName (line 1073) | @Override
method call (line 1078) | @Override
class KillApplicationProcess (line 1090) | static class KillApplicationProcess extends MethodProxy {
method getMethodName (line 1092) | @Override
method call (line 1097) | @Override
method isEnable (line 1108) | @Override
class StartActivityAsUser (line 1115) | static class StartActivityAsUser extends StartActivity {
method getMethodName (line 1117) | @Override
method call (line 1122) | @Override
class CheckPermission (line 1129) | static class CheckPermission extends MethodProxy {
method getMethodName (line 1131) | @Override
method call (line 1136) | @Override
method isEnable (line 1149) | @Override
class StartActivityAsCaller (line 1157) | static class StartActivityAsCaller extends StartActivity {
method getMethodName (line 1159) | @Override
class HandleIncomingUser (line 1166) | static class HandleIncomingUser extends MethodProxy {
method getMethodName (line 1168) | @Override
method call (line 1173) | @Override
method isEnable (line 1182) | @Override
class GetTasks (line 1190) | @SuppressWarnings("unchecked")
method getMethodName (line 1193) | @Override
method call (line 1198) | @Override
method isEnable (line 1212) | @Override
class GetPersistedUriPermissions (line 1219) | static class GetPersistedUriPermissions extends MethodProxy {
method getMethodName (line 1221) | @Override
method call (line 1226) | @Override
method isEnable (line 1232) | @Override
class RegisterReceiver (line 1239) | static class RegisterReceiver extends MethodProxy {
method getMethodName (line 1253) | @Override
method call (line 1258) | @Override
method isEnable (line 1293) | @Override
class IIntentReceiverProxy (line 1298) | private static class IIntentReceiverProxy extends IIntentReceiver.St...
method IIntentReceiverProxy (line 1302) | IIntentReceiverProxy(IInterface old) {
method performReceive (line 1306) | public void performReceive(Intent intent, int resultCode, String d...
method accept (line 1322) | private boolean accept(Intent intent) {
method performReceive (line 1331) | @SuppressWarnings("unused")
class StopService (line 1341) | static class StopService extends MethodProxy {
method getMethodName (line 1343) | @Override
method call (line 1348) | @Override
method isEnable (line 1368) | @Override
class GetContentProvider (line 1375) | static class GetContentProvider extends MethodProxy {
method getMethodName (line 1377) | @Override
method call (line 1382) | @Override
method getProviderNameIndex (line 1450) | public int getProviderNameIndex() {
method getPackageIndex (line 1457) | public int getPackageIndex() {
method isEnable (line 1464) | @Override
class SetTaskDescription (line 1470) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method getMethodName (line 1472) | @Override
method call (line 1477) | @Override
method isEnable (line 1514) | @Override
class StopServiceToken (line 1520) | static class StopServiceToken extends MethodProxy {
method getMethodName (line 1522) | @Override
method call (line 1527) | @Override
method isEnable (line 1541) | @Override
class StartActivityWithConfig (line 1547) | static class StartActivityWithConfig extends StartActivity {
method getMethodName (line 1548) | @Override
method call (line 1553) | @Override
class StartNextMatchingActivity (line 1559) | static class StartNextMatchingActivity extends StartActivity {
method getMethodName (line 1560) | @Override
method call (line 1565) | @Override
class BroadcastIntent (line 1572) | static class BroadcastIntent extends MethodProxy {
method getMethodName (line 1574) | @Override
method call (line 1579) | @Override
method handleIntent (line 1602) | private Intent handleIntent(final Intent intent) {
method handleMediaScannerIntent (line 1624) | private Intent handleMediaScannerIntent(Intent intent) {
method handleInstallShortcutIntent (line 1649) | private Intent handleInstallShortcutIntent(Intent intent) {
method handleUninstallShortcutIntent (line 1687) | private void handleUninstallShortcutIntent(Intent intent) {
method isEnable (line 1701) | @Override
class GetActivityClassForToken (line 1708) | static class GetActivityClassForToken extends MethodProxy {
method getMethodName (line 1710) | @Override
method call (line 1715) | @Override
method isEnable (line 1721) | @Override
class CheckGrantUriPermission (line 1728) | static class CheckGrantUriPermission extends MethodProxy {
method getMethodName (line 1730) | @Override
method call (line 1735) | @Override
method isEnable (line 1741) | @Override
class ServiceDoneExecuting (line 1748) | static class ServiceDoneExecuting extends MethodProxy {
method getMethodName (line 1750) | @Override
method call (line 1755) | @Override
method isEnable (line 1768) | @Override
class GetPackageProcessState (line 1774) | static class GetPackageProcessState extends ReplaceLastPkgMethodProxy {
method GetPackageProcessState (line 1775) | public GetPackageProcessState() {
class RegisterReceiverWithFeature (line 1781) | static class RegisterReceiverWithFeature extends RegisterReceiver {
method RegisterReceiverWithFeature (line 1782) | public RegisterReceiverWithFeature() {
method getMethodName (line 1796) | @Override
class GetIntentSenderWithFeature (line 1802) | static class GetIntentSenderWithFeature extends GetIntentSender {
method GetIntentSenderWithFeature (line 1804) | public GetIntentSenderWithFeature() {
method getMethodName (line 1811) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/TransactionHandlerStub.java
class TransactionHandlerStub (line 17) | public class TransactionHandlerStub implements IInjector {
method inject (line 20) | @Override
method isEnvBad (line 35) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/appops/AppOpsManagerStub.java
class AppOpsManagerStub (line 22) | @TargetApi(Build.VERSION_CODES.KITKAT)
method AppOpsManagerStub (line 25) | public AppOpsManagerStub() {
method onBindMethods (line 29) | @Override
class BaseMethodProxy (line 56) | private class BaseMethodProxy extends StaticMethodProxy {
method BaseMethodProxy (line 60) | BaseMethodProxy(String name, int uidIndex, int pkgIndex) {
method beforeCall (line 66) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/appwidget/AppWidgetManagerStub.java
class AppWidgetManagerStub (line 17) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method AppWidgetManagerStub (line 20) | public AppWidgetManagerStub() {
method onBindMethods (line 24) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/audio/AudioManagerStub.java
class AudioManagerStub (line 16) | public class AudioManagerStub extends BinderInvocationProxy {
method AudioManagerStub (line 17) | public AudioManagerStub() {
method onBindMethods (line 21) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/backup/BackupManagerStub.java
class BackupManagerStub (line 15) | public class BackupManagerStub extends BinderInvocationProxy {
method BackupManagerStub (line 16) | public BackupManagerStub() {
method onBindMethods (line 20) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/battery/BatteryStatsStub.java
class BatteryStatsStub (line 16) | public class BatteryStatsStub extends BinderInvocationProxy {
method BatteryStatsStub (line 18) | public BatteryStatsStub() {
method getInterface (line 22) | private static IInterface getInterface() {
method onBindMethods (line 27) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/bluetooth/BluetoothStub.java
class BluetoothStub (line 16) | public class BluetoothStub extends BinderInvocationProxy {
method BluetoothStub (line 21) | public BluetoothStub() {
method onBindMethods (line 25) | @Override
class GetAddress (line 31) | @FakeDeviceMark("fake MAC")
method GetAddress (line 34) | GetAddress() {
method call (line 38) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/ClipBoardStub.java
class ClipBoardStub (line 20) | public class ClipBoardStub extends BinderInvocationProxy {
method ClipBoardStub (line 22) | public ClipBoardStub() {
method getInterface (line 26) | private static IInterface getInterface() {
method onBindMethods (line 36) | @Override
method inject (line 50) | @Override
method isOreo (line 62) | private static boolean isOreo() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/connectivity/ConnectivityStub.java
class ConnectivityStub (line 18) | public class ConnectivityStub extends BinderInvocationProxy {
method ConnectivityStub (line 20) | public ConnectivityStub() {
method onBindMethods (line 24) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/content/ContentServiceStub.java
class ContentServiceStub (line 12) | @Inject(MethodProxies.class)
method ContentServiceStub (line 15) | public ContentServiceStub() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/content/MethodProxies.java
class MethodProxies (line 14) | class MethodProxies {
class NotifyChange (line 16) | static class NotifyChange extends MethodProxy {
method getMethodName (line 18) | @Override
method beforeCall (line 23) | @Override
method isEnable (line 67) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/context_hub/ContextHubServiceStub.java
class ContextHubServiceStub (line 10) | public class ContextHubServiceStub extends BinderInvocationProxy {
method ContextHubServiceStub (line 12) | public ContextHubServiceStub() {
method getServiceName (line 16) | private static String getServiceName() {
method onBindMethods (line 20) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/devicepolicy/DevicePolicyManagerStub.java
class DevicePolicyManagerStub (line 18) | public class DevicePolicyManagerStub extends BinderInvocationProxy{
method DevicePolicyManagerStub (line 19) | public DevicePolicyManagerStub() {
method onBindMethods (line 23) | @Override
class GetStorageEncryptionStatus (line 29) | private static class GetStorageEncryptionStatus extends MethodProxy {
method getMethodName (line 31) | @Override
method call (line 36) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/display/DisplayStub.java
class DisplayStub (line 16) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
method DisplayStub (line 18) | public DisplayStub() {
method onBindMethods (line 23) | @Override
method inject (line 29) | @Override
method isEnvBad (line 35) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/dropbox/DropBoxManagerStub.java
class DropBoxManagerStub (line 13) | public class DropBoxManagerStub extends BinderInvocationProxy {
method DropBoxManagerStub (line 14) | public DropBoxManagerStub() {
method onBindMethods (line 18) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/fingerprint/FingerprintManagerStub.java
class FingerprintManagerStub (line 16) | @TargetApi(Build.VERSION_CODES.M)
method FingerprintManagerStub (line 18) | public FingerprintManagerStub() {
method onBindMethods (line 22) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/graphics/GraphicsStatsStub.java
class GraphicsStatsStub (line 12) | public class GraphicsStatsStub extends BinderInvocationProxy {
method GraphicsStatsStub (line 14) | public GraphicsStatsStub() {
method onBindMethods (line 18) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/imms/MmsStub.java
class MmsStub (line 13) | public class MmsStub extends BinderInvocationProxy {
method MmsStub (line 15) | public MmsStub() {
method onBindMethods (line 19) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/input/InputMethodManagerStub.java
class InputMethodManagerStub (line 16) | @Inject(MethodProxies.class)
method InputMethodManagerStub (line 21) | public InputMethodManagerStub() {
method inject (line 28) | @Override
method isEnvBad (line 36) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/input/MethodProxies.java
class MethodProxies (line 14) | class MethodProxies {
class StartInput (line 16) | static class StartInput extends StartInputOrWindowGainedFocus {
method getMethodName (line 18) | @Override
class WindowGainedFocus (line 24) | static class WindowGainedFocus extends StartInputOrWindowGainedFocus {
method getMethodName (line 26) | @Override
class StartInputOrWindowGainedFocus (line 34) | static class StartInputOrWindowGainedFocus extends MethodProxy {
method getMethodName (line 37) | @Override
method call (line 42) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/isms/ISmsStub.java
class ISmsStub (line 15) | public class ISmsStub extends BinderInvocationProxy {
method ISmsStub (line 17) | public ISmsStub() {
method onBindMethods (line 21) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/isub/ISubStub.java
class ISubStub (line 12) | public class ISubStub extends BinderInvocationProxy {
method ISubStub (line 14) | public ISubStub() {
method onBindMethods (line 18) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/job/JobServiceStub.java
class JobServiceStub (line 24) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method JobServiceStub (line 27) | public JobServiceStub() {
method onBindMethods (line 31) | @Override
class getPendingJob (line 47) | private class getPendingJob extends MethodProxy {
method getPendingJob (line 48) | private getPendingJob() {
method call (line 50) | public Object call(Object who, Method method, Object... args) throws...
method getMethodName (line 53) | public String getMethodName() {
class enqueue (line 58) | private class enqueue extends MethodProxy {
method enqueue (line 59) | private enqueue() {
method call (line 61) | public Object call(Object who, Method method, Object... args) throws...
method getMethodName (line 67) | public String getMethodName() {
method redirect (line 72) | private Object redirect(Object item, String pkg) {
class schedule (line 84) | private class schedule extends MethodProxy {
method getMethodName (line 86) | @Override
method call (line 91) | @Override
class getAllPendingJobs (line 98) | private class getAllPendingJobs extends MethodProxy {
method getMethodName (line 100) | @Override
method call (line 105) | @Override
class cancelAll (line 111) | private class cancelAll extends MethodProxy {
method getMethodName (line 113) | @Override
method call (line 118) | @Override
class cancel (line 125) | private class cancel extends MethodProxy {
method getMethodName (line 127) | @Override
method call (line 132) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/libcore/LibCoreStub.java
class LibCoreStub (line 14) | @Inject(MethodProxies.class)
method LibCoreStub (line 17) | public LibCoreStub() {
method getOs (line 21) | private static Object getOs() {
method onBindMethods (line 32) | @Override
method inject (line 42) | @Override
method isEnvBad (line 47) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/libcore/MethodProxies.java
class MethodProxies (line 18) | class MethodProxies {
class Lstat (line 20) | static class Lstat extends Stat {
method getMethodName (line 22) | @Override
class Getpwnam (line 28) | static class Getpwnam extends MethodProxy {
method getMethodName (line 29) | @Override
method afterCall (line 34) | @Override
class GetUid (line 47) | static class GetUid extends MethodProxy {
method getMethodName (line 49) | @Override
method afterCall (line 54) | @Override
class GetsockoptUcred (line 61) | static class GetsockoptUcred extends MethodProxy {
method getMethodName (line 62) | @Override
method afterCall (line 67) | @Override
class Stat (line 80) | static class Stat extends MethodProxy {
method afterCall (line 95) | @Override
method getMethodName (line 104) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/GPSListenerThread.java
class GPSListenerThread (line 19) | public class GPSListenerThread extends TimerTask {
method notifyGPSStatus (line 30) | private void notifyGPSStatus(Map listeners) {
method notifyLocation (line 47) | private void notifyLocation(Map listeners) {
method notifyMNmeaListener (line 74) | private void notifyMNmeaListener(Map listeners) {
method addListenerTransport (line 91) | public void addListenerTransport(Object transport) {
method removeListenerTransport (line 103) | public void removeListenerTransport(Object transport) {
method run (line 109) | public void run() {
method stop (line 151) | public void stop() {
method get (line 155) | public static GPSListenerThread get() {
method GPSListenerThread (line 159) | private GPSListenerThread() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/GPSStatusListenerThread.java
class GPSStatusListenerThread (line 9) | public class GPSStatusListenerThread extends TimerTask {
method addListenerTransport (line 19) | public void addListenerTransport(Object transport) {
method removeListenerTransport (line 31) | public void removeListenerTransport(Object obj) {
method run (line 37) | public void run() {
method stop (line 51) | public void stop() {
method get (line 55) | public static GPSStatusListenerThread get() {
method GPSStatusListenerThread (line 59) | private GPSStatusListenerThread() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/LocationManagerStub.java
class LocationManagerStub (line 21) | @LogInvocation(LogInvocation.Condition.ALWAYS)
method LocationManagerStub (line 24) | public LocationManagerStub() {
method onBindMethods (line 28) | @Override
class FakeReplaceLastPkgMethodProxy (line 62) | private static class FakeReplaceLastPkgMethodProxy extends ReplaceLast...
method FakeReplaceLastPkgMethodProxy (line 65) | private FakeReplaceLastPkgMethodProxy(String name, Object def) {
method call (line 70) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MethodProxies.java
class MethodProxies (line 24) | @SuppressWarnings("ALL")
method fixLocationRequest (line 27) | private static void fixLocationRequest(LocationRequest request) {
class AddGpsStatusListener (line 38) | static class AddGpsStatusListener extends ReplaceLastPkgMethodProxy {
method AddGpsStatusListener (line 40) | public AddGpsStatusListener() {
method AddGpsStatusListener (line 44) | public AddGpsStatusListener(String name) {
method call (line 48) | @Override
class RequestLocationUpdates (line 67) | static class RequestLocationUpdates extends ReplaceLastPkgMethodProxy {
method RequestLocationUpdates (line 69) | public RequestLocationUpdates() {
method call (line 73) | @Override
class RemoveUpdates (line 97) | static class RemoveUpdates extends ReplaceLastPkgMethodProxy {
method RemoveUpdates (line 99) | public RemoveUpdates() {
method call (line 103) | @Override
class GetLastLocation (line 113) | static class GetLastLocation extends ReplaceLastPkgMethodProxy {
method GetLastLocation (line 115) | public GetLastLocation() {
method call (line 119) | @Override
class GetLastKnownLocation (line 137) | static class GetLastKnownLocation extends GetLastLocation {
method getMethodName (line 138) | @Override
class getProviders (line 144) | static class getProviders extends MethodProxy {
method getMethodName (line 152) | @Override
method call (line 157) | @Override
class IsProviderEnabled (line 163) | static class IsProviderEnabled extends MethodProxy {
method getMethodName (line 164) | @Override
method call (line 169) | @Override
class getAllProviders (line 189) | static class getAllProviders extends getProviders {
method getMethodName (line 191) | @Override
class GetBestProvider (line 197) | static class GetBestProvider extends MethodProxy {
method getMethodName (line 198) | @Override
method call (line 203) | @Override
class RemoveGpsStatusListener (line 213) | static class RemoveGpsStatusListener extends ReplaceLastPkgMethodProxy {
method RemoveGpsStatusListener (line 214) | public RemoveGpsStatusListener() {
method RemoveGpsStatusListener (line 218) | public RemoveGpsStatusListener(String name) {
method call (line 222) | @Override
class sendExtraCommand (line 231) | static class sendExtraCommand extends MethodProxy {
method getMethodName (line 233) | @Override
method call (line 238) | @Override
class UnregisterGnssStatusCallback (line 248) | static class UnregisterGnssStatusCallback extends RemoveGpsStatusListe...
method UnregisterGnssStatusCallback (line 249) | public UnregisterGnssStatusCallback() {
class RegisterGnssStatusCallback (line 254) | static class RegisterGnssStatusCallback extends MethodProxy {
method getMethodName (line 256) | @Override
method call (line 261) | @Override
class getProviderProperties (line 283) | static class getProviderProperties extends MethodProxy {
method getMethodName (line 285) | @Override
method afterCall (line 290) | @Override
class locationCallbackFinished (line 305) | static class locationCallbackFinished extends MethodProxy {
method call (line 307) | @Override
method getMethodName (line 315) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/location/MockLocationHelper.java
class MockLocationHelper (line 20) | public class MockLocationHelper {
method invokeNmeaReceived (line 22) | public static void invokeNmeaReceived(Object listener) {
method setGpsStatus (line 55) | public static void setGpsStatus(Object locationManager) {
method invokeSvStatusChanged (line 102) | public static void invokeSvStatusChanged(Object transport) {
method getSouthEast (line 156) | private static String getSouthEast(VLocation location) {
method getNorthWest (line 163) | private static String getNorthWest(VLocation location) {
method getGPSLat (line 170) | public static String getGPSLat(double v) {
method leftZeroPad (line 176) | private static String leftZeroPad(int num, int size) {
method leftZeroPad (line 180) | private static String leftZeroPad(String num, int size) {
method checksum (line 196) | public static String checksum(String nema) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/media/router/MediaRouterServiceStub.java
class MediaRouterServiceStub (line 16) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
method MediaRouterServiceStub (line 19) | public MediaRouterServiceStub() {
method onBindMethods (line 23) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/media/session/SessionManagerStub.java
class SessionManagerStub (line 15) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method SessionManagerStub (line 18) | public SessionManagerStub() {
method onBindMethods (line 22) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/mount/MethodProxies.java
class MethodProxies (line 15) | class MethodProxies {
class GetVolumeList (line 17) | static class GetVolumeList extends MethodProxy {
method getMethodName (line 19) | @Override
method beforeCall (line 24) | @Override
method afterCall (line 36) | @Override
class Mkdirs (line 42) | static class Mkdirs extends MethodProxy {
method getMethodName (line 44) | @Override
method beforeCall (line 49) | @Override
method call (line 55) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/mount/MountServiceStub.java
class MountServiceStub (line 16) | @Inject(MethodProxies.class)
method MountServiceStub (line 19) | public MountServiceStub() {
method getInterfaceMethod (line 23) | private static RefStaticMethod<IInterface> getInterfaceMethod() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/network/NetworkManagementStub.java
class NetworkManagementStub (line 11) | @TargetApi(Build.VERSION_CODES.M)
method NetworkManagementStub (line 15) | public NetworkManagementStub() {
method onBindMethods (line 19) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/notification/MethodProxies.java
class MethodProxies (line 19) | @SuppressWarnings("unused")
class EnqueueNotification (line 22) | static class EnqueueNotification extends MethodProxy {
method getMethodName (line 24) | @Override
method call (line 29) | @Override
class EnqueueNotificationWithTag (line 50) | static class EnqueueNotificationWithTag extends MethodProxy {
method getMethodName (line 52) | @Override
method call (line 57) | @Override
class EnqueueNotificationWithTagPriority (line 87) | static class EnqueueNotificationWithTagPriority extends EnqueueNotific...
method getMethodName (line 89) | @Override
class CancelNotificationWithTag (line 95) | static class CancelNotificationWithTag extends MethodProxy {
method getMethodName (line 97) | @Override
method call (line 102) | @Override
class CancelAllNotifications (line 132) | static class CancelAllNotifications extends MethodProxy {
method getMethodName (line 134) | @Override
method call (line 139) | @Override
class AreNotificationsEnabledForPackage (line 150) | static class AreNotificationsEnabledForPackage extends MethodProxy {
method getMethodName (line 151) | @Override
method call (line 156) | @Override
class SetNotificationsEnabledForPackage (line 166) | static class SetNotificationsEnabledForPackage extends MethodProxy {
method getMethodName (line 167) | @Override
method call (line 172) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/notification/NotificationManagerStub.java
class NotificationManagerStub (line 25) | @Inject(MethodProxies.class)
method NotificationManagerStub (line 28) | public NotificationManagerStub() {
method onBindMethods (line 32) | @Override
method inject (line 75) | @Override
method isEnvBad (line 81) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/os/DeviceIdentifiersPolicyServiceStub.java
class DeviceIdentifiersPolicyServiceStub (line 18) | public class DeviceIdentifiersPolicyServiceStub extends BinderInvocation...
method DeviceIdentifiersPolicyServiceStub (line 19) | public DeviceIdentifiersPolicyServiceStub() {
method onBindMethods (line 23) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/persistent_data_block/PersistentDataBlockServiceStub.java
class PersistentDataBlockServiceStub (line 11) | public class PersistentDataBlockServiceStub extends BinderInvocationProxy {
method PersistentDataBlockServiceStub (line 13) | public PersistentDataBlockServiceStub() {
method onBindMethods (line 17) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/phonesubinfo/MethodProxies.java
class MethodProxies (line 11) | @SuppressWarnings("ALL")
class GetDeviceId (line 14) | @FakeDeviceMark("fake device id")
method getMethodName (line 17) | @Override
method call (line 22) | @Override
class GetDeviceIdForSubscriber (line 28) | static class GetDeviceIdForSubscriber extends GetDeviceId {
method getMethodName (line 30) | @Override
class GetIccSerialNumber (line 37) | @FakeDeviceMark("fake iccid")
method getMethodName (line 40) | @Override
method call (line 45) | @Override
class getIccSerialNumberForSubscriber (line 52) | static class getIccSerialNumberForSubscriber extends GetIccSerialNumber {
method getMethodName (line 53) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/phonesubinfo/PhoneSubInfoStub.java
class PhoneSubInfoStub (line 13) | @Inject(MethodProxies.class)
method PhoneSubInfoStub (line 15) | public PhoneSubInfoStub() {
method onBindMethods (line 19) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/pm/LauncherAppsStub.java
class LauncherAppsStub (line 15) | public class LauncherAppsStub extends BinderInvocationProxy {
method LauncherAppsStub (line 17) | public LauncherAppsStub() {
method getInterface (line 21) | private static IInterface getInterface() {
method inject (line 26) | @Override
method onBindMethods (line 33) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/pm/MethodProxies.java
class MethodProxies (line 53) | @SuppressWarnings("unused")
class IsPackageAvailable (line 56) | static class IsPackageAvailable extends MethodProxy {
method getMethodName (line 58) | @Override
method call (line 63) | @Override
method isEnable (line 72) | @Override
class GetInstallerPackageName (line 79) | static class GetInstallerPackageName extends MethodProxy {
method getMethodName (line 81) | @Override
method call (line 86) | @Override
method isEnable (line 91) | @Override
class GetPreferredActivities (line 97) | static class GetPreferredActivities extends MethodProxy {
method getMethodName (line 99) | @Override
method call (line 104) | @Override
class GetComponentEnabledSetting (line 112) | static class GetComponentEnabledSetting extends MethodProxy {
method getMethodName (line 114) | @Override
method call (line 119) | @Override
class RemovePackageFromPreferred (line 131) | static class RemovePackageFromPreferred extends MethodProxy {
method getMethodName (line 133) | @Override
method call (line 138) | @Override
class GetServiceInfo (line 151) | static class GetServiceInfo extends MethodProxy {
method getMethodName (line 153) | @Override
method call (line 158) | @Override
method isEnable (line 174) | @Override
class GetPackageUid (line 181) | static class GetPackageUid extends MethodProxy {
method getMethodName (line 183) | @Override
method call (line 188) | @Override
method isEnable (line 198) | @Override
class GetActivityInfo (line 212) | static class GetActivityInfo extends MethodProxy {
method getMethodName (line 214) | @Override
method call (line 219) | @Override
method isEnable (line 237) | @Override
class GetPackageUidEtc (line 243) | static class GetPackageUidEtc extends GetPackageUid {
method getMethodName (line 244) | @Override
class GetPackageInstaller (line 250) | static class GetPackageInstaller extends MethodProxy {
method isEnable (line 252) | @Override
method getMethodName (line 257) | @Override
method call (line 262) | @Override
class FreeStorageAndNotify (line 338) | static class FreeStorageAndNotify extends MethodProxy {
method getMethodName (line 339) | @Override
method call (line 344) | @Override
class GetPackageGids (line 355) | static class GetPackageGids extends MethodProxy {
method getMethodName (line 357) | @Override
method call (line 362) | @Override
method isEnable (line 368) | @Override
class RevokeRuntimePermission (line 376) | static class RevokeRuntimePermission extends MethodProxy {
method getMethodName (line 378) | @Override
method call (line 383) | @Override
method isEnable (line 389) | @Override
class ClearPackagePreferredActivities (line 396) | static class ClearPackagePreferredActivities extends MethodProxy {
method getMethodName (line 398) | @Override
method call (line 403) | @Override
class ResolveContentProvider (line 411) | static class ResolveContentProvider extends MethodProxy {
method getMethodName (line 413) | @Override
method call (line 418) | @Override
class QueryIntentServices (line 435) | @SuppressWarnings("unchecked")
method getMethodName (line 438) | @Override
method call (line 443) | @Override
method isEnable (line 470) | @Override
class GetPermissions (line 477) | static class GetPermissions extends MethodProxy {
method getMethodName (line 479) | @Override
method call (line 484) | @Override
class IsPackageForzen (line 490) | static class IsPackageForzen extends MethodProxy {
method getMethodName (line 492) | @Override
method call (line 497) | @Override
method isEnable (line 502) | @Override
class GetPackageGidsEtc (line 509) | static class GetPackageGidsEtc extends GetPackageGids {
method getMethodName (line 511) | @Override
class QueryIntentActivities (line 518) | @SuppressWarnings("unchecked")
method getMethodName (line 521) | @Override
method call (line 526) | @Override
method isEnable (line 553) | @Override
class ResolveService (line 559) | static class ResolveService extends MethodProxy {
method getMethodName (line 561) | @Override
method call (line 566) | @Override
class ClearPackagePersistentPreferredActivities (line 581) | static class ClearPackagePersistentPreferredActivities extends MethodP...
method getMethodName (line 583) | @Override
method call (line 588) | @Override
class GetPermissionGroupInfo (line 595) | static class GetPermissionGroupInfo extends MethodProxy {
method getMethodName (line 597) | @Override
method call (line 602) | @Override
method isEnable (line 613) | @Override
class GetPackageInfo (line 620) | static final class GetPackageInfo extends MethodProxy {
method getMethodName (line 622) | @Override
method beforeCall (line 627) | @Override
method call (line 632) | @Override
class DeleteApplicationCacheFiles (line 653) | static class DeleteApplicationCacheFiles extends MethodProxy {
method getMethodName (line 655) | @Override
method call (line 660) | @Override
class SetApplicationBlockedSettingAsUser (line 668) | static class SetApplicationBlockedSettingAsUser extends MethodProxy {
method getMethodName (line 670) | @Override
method call (line 675) | @Override
method isEnable (line 681) | @Override
class GetApplicationEnabledSetting (line 688) | static class GetApplicationEnabledSetting extends MethodProxy {
method getMethodName (line 690) | @Override
method call (line 695) | @Override
class AddPackageToPreferred (line 702) | static class AddPackageToPreferred extends MethodProxy {
method getMethodName (line 704) | @Override
method call (line 709) | @Override
class CheckPermission (line 715) | static class CheckPermission extends MethodProxy {
method getMethodName (line 717) | @Override
method call (line 722) | @Override
method afterCall (line 730) | @Override
method isEnable (line 735) | @Override
class GetPackagesForUid (line 742) | static class GetPackagesForUid extends MethodProxy {
method getMethodName (line 745) | @Override
method call (line 750) | @Override
method isEnable (line 774) | @Override
class QueryContentProviders (line 781) | @SuppressWarnings("unchecked")
method getMethodName (line 784) | @Override
method call (line 789) | @Override
class SetApplicationEnabledSetting (line 803) | static class SetApplicationEnabledSetting extends MethodProxy {
method getMethodName (line 805) | @Override
method call (line 810) | @Override
method isEnable (line 816) | @Override
class CheckSignatures (line 822) | @SuppressLint("PackageManagerGetSignatures")
method getMethodName (line 825) | @Override
method call (line 830) | @Override
class checkUidSignatures (line 871) | static class checkUidSignatures extends MethodProxy {
method getMethodName (line 873) | @Override
method call (line 878) | @Override
class getNameForUid (line 887) | static class getNameForUid extends MethodProxy {
method getMethodName (line 889) | @Override
method call (line 894) | @Override
class DeletePackage (line 902) | static class DeletePackage extends MethodProxy {
method getMethodName (line 904) | @Override
method call (line 909) | @Override
class ActivitySupportsIntent (line 927) | static class ActivitySupportsIntent extends MethodProxy {
method getMethodName (line 928) | @Override
method call (line 933) | @Override
class ResolveIntent (line 943) | static class ResolveIntent extends MethodProxy {
method getMethodName (line 945) | @Override
method call (line 950) | @Override
class GetApplicationInfo (line 965) | static class GetApplicationInfo extends MethodProxy {
method getMethodName (line 967) | @Override
method call (line 972) | @Override
method isEnable (line 991) | @Override
class GetProviderInfo (line 998) | static class GetProviderInfo extends MethodProxy {
method getMethodName (line 1000) | @Override
method call (line 1005) | @Override
class SetComponentEnabledSetting (line 1025) | static class SetComponentEnabledSetting extends MethodProxy {
method getMethodName (line 1027) | @Override
method call (line 1034) | @Override
method isEnable (line 1039) | @Override
class GetInstalledApplications (line 1045) | static class GetInstalledApplications extends MethodProxy {
method getMethodName (line 1047) | @Override
method call (line 1052) | @Override
class GetInstalledPackages (line 1065) | @SuppressWarnings({"unchecked", "WrongConstant"})
method getMethodName (line 1068) | @Override
method call (line 1073) | @Override
class QueryIntentReceivers (line 1092) | @SuppressWarnings("unchecked")
method getMethodName (line 1095) | @Override
method call (line 1100) | @Override
class GetReceiverInfo (line 1127) | static class GetReceiverInfo extends MethodProxy {
method getMethodName (line 1129) | @Override
method call (line 1134) | @Override
method isEnable (line 1151) | @Override
class GetPermissionFlags (line 1158) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
method getMethodName (line 1161) | @Override
method call (line 1166) | @Override
class SetPackageStoppedState (line 1175) | static class SetPackageStoppedState extends MethodProxy {
method getMethodName (line 1177) | @Override
method call (line 1182) | @Override
method isEnable (line 1188) | @Override
class QueryIntentContentProviders (line 1195) | @SuppressWarnings("unchecked")
method getMethodName (line 1199) | @Override
method call (line 1204) | @Override
method isEnable (line 1229) | @Override
class GetApplicationBlockedSettingAsUser (line 1236) | static class GetApplicationBlockedSettingAsUser extends MethodProxy {
method getMethodName (line 1238) | @Override
method call (line 1243) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/pm/PackageManagerStub.java
class PackageManagerStub (line 18) | @Inject(MethodProxies.class)
method PackageManagerStub (line 21) | public PackageManagerStub() {
method onBindMethods (line 25) | @Override
method inject (line 47) | @Override
method isEnvBad (line 56) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/power/PowerManagerStub.java
class PowerManagerStub (line 18) | public class PowerManagerStub extends BinderInvocationProxy {
method PowerManagerStub (line 20) | public PowerManagerStub() {
method onBindMethods (line 24) | @Override
method onHandleError (line 51) | private Object onHandleError(InvocationTargetException e) throws Throw...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/restriction/RestrictionStub.java
class RestrictionStub (line 15) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method RestrictionStub (line 18) | public RestrictionStub() {
method onBindMethods (line 22) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/search/SearchManagerStub.java
class SearchManagerStub (line 21) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
method SearchManagerStub (line 24) | public SearchManagerStub() {
method onBindMethods (line 28) | @Override
class GetSearchableInfo (line 35) | private static class GetSearchableInfo extends MethodProxy {
method getMethodName (line 37) | @Override
method call (line 42) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/shortcut/ShortcutServiceStub.java
class ShortcutServiceStub (line 27) | public class ShortcutServiceStub extends BinderInvocationProxy {
method ShortcutServiceStub (line 30) | public ShortcutServiceStub() {
method inject (line 34) | @Override
method onBindMethods (line 39) | @Override
method replaceShortcutInfo (line 62) | @TargetApi(Build.VERSION_CODES.M)
class ReplacePkgAndShortcutListMethodProxy (line 108) | private static class ReplacePkgAndShortcutListMethodProxy extends Repl...
method ReplacePkgAndShortcutListMethodProxy (line 109) | ReplacePkgAndShortcutListMethodProxy(String name) {
method beforeCall (line 113) | @Override
method findFirstShortcutList (line 127) | @TargetApi(Build.VERSION_CODES.N_MR1)
class ReplacePkgAndShortcutMethodProxy (line 141) | private static class ReplacePkgAndShortcutMethodProxy extends ReplaceC...
method ReplacePkgAndShortcutMethodProxy (line 143) | ReplacePkgAndShortcutMethodProxy(String name) {
method beforeCall (line 147) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method findFirstShortcutInfo (line 156) | @TargetApi(Build.VERSION_CODES.N_MR1)
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/MethodProxies.java
class MethodProxies (line 30) | @SuppressWarnings("ALL")
class GetDeviceId (line 33) | @FakeDeviceMark("fake device id.")
method GetDeviceId (line 36) | public GetDeviceId() {
method call (line 40) | @Override
class GetCellLocation (line 46) | @FakeLocMark("cell location")
method GetCellLocation (line 49) | public GetCellLocation() {
method call (line 53) | @Override
class getAllCellInfoUsingSubId (line 65) | static class getAllCellInfoUsingSubId extends ReplaceCallingPkgMethodP...
method getAllCellInfoUsingSubId (line 67) | public getAllCellInfoUsingSubId() {
method call (line 71) | @Override
class GetAllCellInfo (line 80) | @FakeLocMark("cell location")
method GetAllCellInfo (line 83) | public GetAllCellInfo() {
method call (line 87) | @Override
class GetNeighboringCellInfo (line 104) | @FakeLocMark("neb cell location")
method GetNeighboringCellInfo (line 107) | public GetNeighboringCellInfo() {
method call (line 111) | @Override
method getCellLocationInternal (line 131) | private static Bundle getCellLocationInternal(VCell cell) {
method createCellInfo (line 163) | private static CellInfo createCellInfo(VCell cell) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyRegistryStub.java
class TelephonyRegistryStub (line 14) | public class TelephonyRegistryStub extends BinderInvocationProxy {
method TelephonyRegistryStub (line 16) | public TelephonyRegistryStub() {
method onBindMethods (line 20) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyStub.java
class TelephonyStub (line 23) | @Inject(MethodProxies.class)
method TelephonyStub (line 26) | public TelephonyStub() {
method onBindMethods (line 30) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/usage/UsageStatsManagerStub.java
class UsageStatsManagerStub (line 15) | @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
method UsageStatsManagerStub (line 18) | public UsageStatsManagerStub() {
method onBindMethods (line 21) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/user/UserManagerStub.java
class UserManagerStub (line 19) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
method UserManagerStub (line 22) | public UserManagerStub() {
method onBindMethods (line 26) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/vibrator/VibratorStub.java
class VibratorStub (line 16) | public class VibratorStub extends BinderInvocationProxy {
method VibratorStub (line 18) | public VibratorStub() {
method onBindMethods (line 22) | @Override
class VibrateMethodProxy (line 32) | private final static class VibrateMethodProxy extends ReplaceCallingPk...
method VibrateMethodProxy (line 34) | private VibrateMethodProxy(String name) {
method beforeCall (line 38) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/view/AutoFillManagerStub.java
class AutoFillManagerStub (line 20) | public class AutoFillManagerStub extends BinderInvocationProxy {
method AutoFillManagerStub (line 25) | public AutoFillManagerStub() {
method inject (line 29) | @SuppressLint("WrongConstant")
class ReplacePkgAndComponentProxy (line 55) | static class ReplacePkgAndComponentProxy extends ReplaceLastPkgMethodP...
method ReplacePkgAndComponentProxy (line 57) | ReplacePkgAndComponentProxy(String name) {
method beforeCall (line 61) | @Override
method replaceLastAppComponent (line 67) | static ComponentName replaceLastAppComponent(Object[] args, String h...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/wifi/WifiManagerStub.java
class WifiManagerStub (line 42) | public class WifiManagerStub extends BinderInvocationProxy {
class RemoveWorkSourceMethodProxy (line 44) | private class RemoveWorkSourceMethodProxy extends StaticMethodProxy {
method RemoveWorkSourceMethodProxy (line 46) | RemoveWorkSourceMethodProxy(String name) {
method call (line 50) | @Override
method WifiManagerStub (line 61) | public WifiManagerStub() {
method onBindMethods (line 65) | @Override
class GetConnectionInfo (line 127) | @FakeLocMark("Fake wifi bssid")
method getMethodName (line 130) | @Override
method call (line 135) | @Override
class GetScanResults (line 152) | @FakeLocMark("fake scan result")
method GetScanResults (line 155) | public GetScanResults() {
method call (line 159) | @Override
method cloneScanResult (line 169) | private static ScanResult cloneScanResult(Parcelable scanResult) {
class IPInfo (line 178) | public static class IPInfo {
method getIPInfo (line 187) | private static IPInfo getIPInfo() {
method isIPv4Address (line 214) | private static boolean isIPv4Address(String input) {
method netmask_to_hex (line 219) | private static int netmask_to_hex(int netmask_slash) {
method InetAddress_to_hex (line 227) | private static int InetAddress_to_hex(InetAddress a) {
method createDhcpInfo (line 235) | private DhcpInfo createDhcpInfo(IPInfo ip) {
method createWifiInfo (line 244) | private static WifiInfo createWifiInfo() throws Exception {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/wifi_scanner/GhostWifiScannerImpl.java
class GhostWifiScannerImpl (line 18) | public class GhostWifiScannerImpl extends IWifiScanner.Stub {
method getMessenger (line 22) | @Override
method getAvailableChannels (line 27) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/wifi_scanner/WifiScannerStub.java
class WifiScannerStub (line 9) | public class WifiScannerStub extends BinderInvocationProxy {
method WifiScannerStub (line 11) | public WifiScannerStub() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/window/MethodProxies.java
class MethodProxies (line 14) | class MethodProxies {
class OpenSession (line 17) | static class OpenSession extends BasePatchSession {
method getMethodName (line 19) | @Override
class OverridePendingAppTransition (line 26) | static class OverridePendingAppTransition extends BasePatchSession {
method getMethodName (line 28) | @Override
method call (line 33) | @Override
class OverridePendingAppTransitionInPlace (line 43) | static class OverridePendingAppTransitionInPlace extends MethodProxy {
method getMethodName (line 45) | @Override
method call (line 50) | @Override
class SetAppStartingWindow (line 60) | static class SetAppStartingWindow extends BasePatchSession {
method getMethodName (line 62) | @Override
class BasePatchSession (line 68) | abstract static class BasePatchSession extends MethodProxy {
method call (line 70) | @Override
method proxySession (line 79) | private Object proxySession(IInterface session) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/window/WindowManagerStub.java
class WindowManagerStub (line 18) | @Inject(MethodProxies.class)
method WindowManagerStub (line 21) | public WindowManagerStub() {
method inject (line 25) | @Override
method onBindMethods (line 42) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/window/session/BaseMethodProxy.java
class BaseMethodProxy (line 13) | class BaseMethodProxy extends StaticMethodProxy {
method BaseMethodProxy (line 15) | public BaseMethodProxy(String name) {
method call (line 19) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/window/session/WindowSessionPatch.java
class WindowSessionPatch (line 12) | public class WindowSessionPatch extends MethodInvocationProxy<MethodInvo...
method WindowSessionPatch (line 14) | public WindowSessionPatch(IInterface session) {
method onBindMethods (line 18) | @Override
method inject (line 34) | @Override
method isEnvBad (line 39) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/secondary/HackAppUtils.java
class HackAppUtils (line 10) | public class HackAppUtils {
method enableQQLogOutput (line 18) | public static void enableQQLogOutput(String packageName, ClassLoader c...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/secondary/ProxyServiceFactory.java
class ProxyServiceFactory (line 18) | public class ProxyServiceFactory {
method getService (line 26) | @Override
method getService (line 50) | @Override
method getService (line 74) | @Override
method getProxyService (line 101) | public static IBinder getProxyService(Context context, ComponentName c...
type ServiceFetcher (line 123) | private interface ServiceFetcher {
method getService (line 124) | IBinder getService(Context context, ClassLoader classLoader, IBinder...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/secondary/ServiceConnectionDelegate.java
class ServiceConnectionDelegate (line 27) | public class ServiceConnectionDelegate extends IServiceConnection.Stub {
method ServiceConnectionDelegate (line 31) | private ServiceConnectionDelegate(IServiceConnection mConn) {
method getDelegate (line 35) | public static IServiceConnection getDelegate(Context context, ServiceC...
method removeDelegate (line 54) | public static IServiceConnection removeDelegate(Context context, Servi...
method getDelegate (line 68) | public static ServiceConnectionDelegate getDelegate(IServiceConnection...
method removeDelegate (line 81) | public static ServiceConnectionDelegate removeDelegate(IServiceConnect...
method connected (line 85) | @Override
method connected (line 90) | public void connected(ComponentName name, IBinder service, boolean dea...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/secondary/StubBinder.java
class StubBinder (line 18) | abstract class StubBinder implements IBinder {
method StubBinder (line 23) | StubBinder(ClassLoader classLoader, IBinder base) {
method getInterfaceDescriptor (line 28) | @Override
method pingBinder (line 33) | @Override
method isBinderAlive (line 38) | @Override
method queryLocalInterface (line 50) | @Override
method createHandler (line 89) | public abstract InvocationHandler createHandler(Class<?> interfaceClas...
method dump (line 92) | @Override
method dumpAsync (line 97) | @Override
method transact (line 102) | @Override
method linkToDeath (line 107) | @Override
method unlinkToDeath (line 112) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/utils/MethodParameterUtils.java
class MethodParameterUtils (line 15) | public class MethodParameterUtils {
method getFirstParam (line 17) | public static <T> T getFirstParam(Object[] args, Class<T> tClass) {
method replaceFirstAppPkg (line 28) | public static String replaceFirstAppPkg(Object[] args) {
method replaceLastAppPkg (line 41) | public static String replaceLastAppPkg(Object[] args) {
method replaceLastUid (line 51) | public static void replaceLastUid(Object[] args) {
method replaceSequenceAppPkg (line 61) | public static String replaceSequenceAppPkg(Object[] args, int sequence) {
method getAllInterface (line 71) | public static Class<?>[] getAllInterface(Class clazz){
method getAllInterfaces (line 80) | public static void getAllInterfaces(Class clazz, HashSet<Class<?>> int...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/interfaces/IInjector.java
type IInjector (line 9) | public interface IInjector {
method inject (line 17) | void inject() throws Throwable;
method isEnvBad (line 24) | boolean isEnvBad();
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/ActivityClientRecord.java
class ActivityClientRecord (line 6) | public class ActivityClientRecord {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/LocalProxyUtils.java
class LocalProxyUtils (line 11) | public class LocalProxyUtils {
method genProxy (line 19) | public static <T> T genProxy(Class<T> interfaceClass, final Object bas...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/ProviderCall.java
class ProviderCall (line 17) | public class ProviderCall {
method call (line 19) | public static Bundle call(String authority, String methodName, String ...
method call (line 23) | public static Bundle call(String authority, Context context, String me...
class Builder (line 28) | public static final class Builder {
method Builder (line 38) | public Builder(Context context, String auth) {
method methodName (line 43) | public Builder methodName(String name) {
method arg (line 48) | public Builder arg(String arg) {
method addArg (line 53) | public Builder addArg(String key, Object value) {
method call (line 74) | public Bundle call() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/ServiceManagerNative.java
class ServiceManagerNative (line 17) | public class ServiceManagerNative {
method getServiceFetcher (line 36) | private static IServiceFetcher getServiceFetcher() {
method ensureServerStarted (line 51) | public static void ensureServerStarted() {
method clearServerFetcher (line 55) | public static void clearServerFetcher() {
method linkBinderDied (line 59) | private static void linkBinderDied(final IBinder binder) {
method getService (line 73) | public static IBinder getService(String name) {
method addService (line 89) | public static void addService(String name, IBinder service) {
method removeService (line 101) | public static void removeService(String name) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VAccountManager.java
class VAccountManager (line 25) | public class VAccountManager {
method get (line 31) | public static VAccountManager get() {
method getRemote (line 35) | public IAccountManager getRemote() {
method getStubInterface (line 46) | private Object getStubInterface() {
method getAuthenticatorTypes (line 51) | public AuthenticatorDescription[] getAuthenticatorTypes() {
method removeAccount (line 59) | public void removeAccount(IAccountManagerResponse response, Account ac...
method getAuthToken (line 67) | public void getAuthToken(IAccountManagerResponse response, Account acc...
method addAccountExplicitly (line 75) | public boolean addAccountExplicitly(Account account, String password, ...
method getAccounts (line 83) | public Account[] getAccounts(int userId, String type) {
method getAccounts (line 91) | public Account[] getAccounts(String type) {
method peekAuthToken (line 99) | public String peekAuthToken(Account account, String authTokenType) {
method getPreviousName (line 107) | public String getPreviousName(Account account) {
method hasFeatures (line 115) | public void hasFeatures(IAccountManagerResponse response, Account acco...
method accountAuthenticated (line 123) | public boolean accountAuthenticated(Account account) {
method clearPassword (line 131) | public void clearPassword(Account account) {
method renameAccount (line 139) | public void renameAccount(IAccountManagerResponse response, Account ac...
method setPassword (line 147) | public void setPassword(Account account, String password) {
method addAccount (line 155) | public void addAccount(int userId, IAccountManagerResponse response, S...
method addAccount (line 163) | public void addAccount(IAccountManagerResponse response, String accoun...
method updateCredentials (line 171) | public void updateCredentials(IAccountManagerResponse response, Accoun...
method removeAccountExplicitly (line 179) | public boolean removeAccountExplicitly(Account account) {
method setUserData (line 187) | public void setUserData(Account account, String key, String value) {
method editProperties (line 195) | public void editProperties(IAccountManagerResponse response, String ac...
method getAuthTokenLabel (line 203) | public void getAuthTokenLabel(IAccountManagerResponse response, String...
method confirmCredentials (line 211) | public void confirmCredentials(IAccountManagerResponse response, Accou...
method invalidateAuthToken (line 219) | public void invalidateAuthToken(String accountType, String authToken) {
method getAccountsByFeatures (line 227) | public void getAccountsByFeatures(IAccountManagerResponse response, St...
method setAuthToken (line 235) | public void setAuthToken(Account account, String authTokenType, String...
method getPassword (line 243) | public Object getPassword(Account account) {
method getUserData (line 251) | public String getUserData(Account account, String key) {
method addAccount (line 270) | public AccountManagerFuture<Bundle> addAccount(final int userId, final...
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VActivityManager.java
class VActivityManager (line 41) | public class VActivityManager {
method get (line 47) | public static VActivityManager get() {
method getService (line 51) | public IActivityManager getService() {
method getRemoteInterface (line 63) | private Object getRemoteInterface() {
method startActivity (line 69) | public int startActivity(Intent intent, ActivityInfo info, IBinder res...
method startActivities (line 77) | public int startActivities(Intent[] intents, String[] resolvedTypes, I...
method startActivity (line 85) | public int startActivity(Intent intent, int userId) {
method onActivityCreate (line 96) | public ActivityClientRecord onActivityCreate(ComponentName component, ...
method getActivityRecord (line 108) | public ActivityClientRecord getActivityRecord(IBinder token) {
method onActivityResumed (line 114) | public void onActivityResumed(Activity activity) {
method onActivityResumed (line 119) | public void onActivityResumed(IBinder token) {
method onActivityDestroy (line 127) | public boolean onActivityDestroy(IBinder token) {
method getTaskInfo (line 136) | public AppTaskInfo getTaskInfo(int taskId) {
method getCallingActivity (line 144) | public ComponentName getCallingActivity(IBinder token) {
method getCallingPackage (line 152) | public String getCallingPackage(IBinder token) {
method getPackageForToken (line 160) | public String getPackageForToken(IBinder token) {
method getActivityForToken (line 168) | public ComponentName getActivityForToken(IBinder token) {
method startService (line 176) | public ComponentName startService(IInterface caller, Intent service, S...
method stopService (line 184) | public int stopService(IInterface caller, Intent service, String resol...
method stopServiceToken (line 192) | public boolean stopServiceToken(ComponentName className, IBinder token...
method setServiceForeground (line 200) | public void setServiceForeground(ComponentName className, IBinder toke...
method bindService (line 208) | public int bindService(Context context, Intent service, ServiceConnect...
method unbindService (line 217) | public boolean unbindService(Context context, ServiceConnection connec...
method bindService (line 226) | public int bindService(IBinder caller, IBinder token, Intent service, ...
method unbindService (line 234) | public boolean unbindService(IServiceConnection connection) {
method unbindFinished (line 242) | public void unbindFinished(IBinder token, Intent service, boolean doRe...
method serviceDoneExecuting (line 250) | public void serviceDoneExecuting(IBinder token, int type, int startId,...
method peekService (line 258) | public IBinder peekService(Intent service, String resolvedType) {
method publishService (line 266) | public void publishService(IBinder token, Intent intent, IBinder servi...
method getServices (line 274) | public VParceledListSlice getServices(int maxNum, int flags) {
method processRestarted (line 282) | public void processRestarted(String packageName, String processName, i...
method getAppProcessName (line 290) | public String getAppProcessName(int pid) {
method getInitialPackage (line 298) | public String getInitialPackage(int pid) {
method isAppProcess (line 306) | public boolean isAppProcess(String processName) {
method handleApplicationCrash (line 314) | public void handleApplicationCrash() {
method killAllApps (line 322) | public void killAllApps() {
method killApplicationProcess (line 330) | public void killApplicationProcess(String procName, int uid) {
method registerProcessObserver (line 338) | public void registerProcessObserver(IProcessObserver observer) {
method killAppByPkg (line 346) | public void killAppByPkg(String pkg, int userId) {
method unregisterProcessObserver (line 354) | public void unregisterProcessObserver(IProcessObserver observer) {
method appDoneExecuting (line 362) | public void appDoneExecuting() {
method getProcessPkgList (line 370) | public List<String> getProcessPkgList(int pid) {
method isAppPid (line 378) | public boolean isAppPid(int pid) {
method getUidByPid (line 386) | public int getUidByPid(int pid) {
method getSystemPid (line 394) | public int getSystemPid() {
method sendActivityResult (line 402) | public void sendActivityResult(IBinder resultTo, String resultWho, int...
method acquireProviderClient (line 410) | public IInterface acquireProviderClient(int userId, ProviderInfo info)...
method getPendingIntent (line 414) | public PendingIntentData getPendingIntent(IBinder binder) throws Remot...
method addPendingIntent (line 418) | public void addPendingIntent(IBinder binder, String creator) throws Re...
method removePendingIntent (line 422) | public void removePendingIntent(IBinder binder) throws RemoteException {
method finishActivity (line 426) | public void finishActivity(IBinder token) {
method isAppRunning (line 450) | public boolean isAppRunning(String packageName, int userId) {
method initProcess (line 458) | public int initProcess(String packageName, String processName, int use...
method sendBroadcast (line 466) | public void sendBroadcast(Intent intent, int userId) {
method isVAServiceToken (line 473) | public boolean isVAServiceToken(IBinder token) {
method broadcastFinish (line 481) | public void broadcastFinish(PendingResultData res) {
method getPackageForIntentSender (line 489) | public String getPackageForIntentSender(IBinder binder) {
method notifyBadgerChange (line 497) | public void notifyBadgerChange(BadgerInfo info) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VDeviceManager.java
class VDeviceManager (line 15) | public class VDeviceManager {
method get (line 21) | public static VDeviceManager get() {
method getRemote (line 26) | public IDeviceInfoManager getRemote() {
method getRemoteInterface (line 37) | private Object getRemoteInterface() {
method getDeviceInfo (line 42) | public VDeviceInfo getDeviceInfo(int userId) {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/ipc/VJobScheduler.java
class VJobScheduler (line 20) | public class VJobScheduler {
method get (line 26) | public static VJobSchedu
Condensed preview — 801 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,034K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 568,
"preview": "# These are supported funding model platforms\n\ngithub: # replace\npatreon: weishu\nopen_collective: # Replace with a singl"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 799,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\n\n---\n\n**Describe the bug**\nA clear and concise descriptio"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report_cn.md",
"chars": 302,
"preview": "---\nname: BUG反馈\nabout: 中文BUG反馈\n\n---\n\n**反馈BUG之前,先issue里面搜看看有没有别人已经反馈过,重复的不予处理!!**\n\n## 问题描述\n\n(请尽量详细地描述你遇到的问题)\n\n## 复现步骤\n\n(请"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 564,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\n\n---\n\n**Is your feature request related to a problem? "
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request_cn.md",
"chars": 145,
"preview": "---\nname: 意见和建议\nabout: Feature中文版\n\n---\n\n**BUG反馈请不要用这个模版,否则直接关闭!!**\n\n## 场景描述\n\n(请详细和精确地表述你的使用场景)\n\n## 希望的解决方案\n\n(你希望如何解决这个问题"
},
{
"path": ".github/issue-close-app.yml",
"chars": 497,
"preview": "# Comment that will be sent if an issue is judged to be closed\ncomment: \"This issue is closed because it does not meet o"
},
{
"path": ".github/stale.yml",
"chars": 681,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 20\n# Number of days of inactivity before a "
},
{
"path": ".github/workflows/android.yml",
"chars": 629,
"preview": "name: Android CI\n\non: [pull_request, push]\n\njobs:\n build:\n\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/c"
},
{
"path": ".gitignore",
"chars": 470,
"preview": "# Built application files\n*.apk\n*.ap_\n\n# Files for the ART/Dalvik VM\n*.dex\n.idea\n# Java class files\n*.class\n\n# Generated"
},
{
"path": ".gitmodules",
"chars": 117,
"preview": "[submodule \"VirtualApp/launcher\"]\n\tpath = VirtualApp/launcher\n\turl = https://github.com/android-hacker/Launcher3.git\n"
},
{
"path": ".travis.yml",
"chars": 407,
"preview": "language: android\nandroid:\n components:\n - tools\n - build-tools-28.0.3\n - android-27\n - android-28\n - ex"
},
{
"path": "CHINESE.md",
"chars": 4559,
"preview": "[](https://travis-ci.org/android-h"
},
{
"path": "LICENSE.txt",
"chars": 35147,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 4360,
"preview": "[](https://travis-ci.org/android-h"
},
{
"path": "VirtualApp/.gitignore",
"chars": 103,
"preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.idea\n.DS_Store\n/build\n/captures\n"
},
{
"path": "VirtualApp/app/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "VirtualApp/app/build.gradle",
"chars": 3233,
"preview": "apply plugin: 'com.android.application'\n\nProperties properties = new Properties()\ndef localProp = file(project.rootProje"
},
{
"path": "VirtualApp/app/proguard-rules.pro",
"chars": 1404,
"preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
},
{
"path": "VirtualApp/app/src/aosp/java/io/virtualapp/delegate/MyCrashHandler.java",
"chars": 3040,
"preview": "package io.virtualapp.delegate;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport androi"
},
{
"path": "VirtualApp/app/src/aosp/java/io/virtualapp/delegate/MyVirtualInitializer.java",
"chars": 1031,
"preview": "package io.virtualapp.delegate;\n\nimport android.app.Application;\n\nimport com.lody.virtual.client.core.VirtualCore;\nimpor"
},
{
"path": "VirtualApp/app/src/fdroid/java/io/virtualapp/delegate/MyVirtualInitializer.java",
"chars": 348,
"preview": "package io.virtualapp.delegate;\n\nimport android.app.Application;\n\nimport com.lody.virtual.client.core.VirtualCore;\n\n/**\n"
},
{
"path": "VirtualApp/app/src/main/AndroidManifest.xml",
"chars": 6360,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/VCommends.java",
"chars": 438,
"preview": "package io.virtualapp;\n\n/**\n * @author Lody\n */\npublic class VCommends {\n\n\tpublic static final String TAG_NEW_VERSION = "
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/XApp.java",
"chars": 1314,
"preview": "package io.virtualapp;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.os.Build;\n\nimport"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/BasePresenter.java",
"chars": 102,
"preview": "package io.virtualapp.abs;\n\n/**\n * @author Lody\n */\npublic interface BasePresenter {\n\tvoid start();\n}\n"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/BaseView.java",
"chars": 234,
"preview": "package io.virtualapp.abs;\n\nimport android.app.Activity;\nimport android.content.Context;\n\n/**\n * @author Lody\n */\npublic"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/Callback.java",
"chars": 115,
"preview": "package io.virtualapp.abs;\n\n/**\n * @author Lody\n */\n\npublic interface Callback<T> {\n void callback(T result);\n}\n"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VActivity.java",
"chars": 1178,
"preview": "package io.virtualapp.abs.ui;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.support.annot"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VFragment.java",
"chars": 690,
"preview": "package io.virtualapp.abs.ui;\n\nimport org.jdeferred.android.AndroidDeferredManager;\n\nimport android.app.Activity;\nimport"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VUiKit.java",
"chars": 1009,
"preview": "package io.virtualapp.abs.ui;\n\nimport android.content.Context;\nimport android.os.Handler;\nimport android.os.Looper;\nimpo"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/delegate/BaseCrashHandler.java",
"chars": 629,
"preview": "package io.virtualapp.delegate;\n\nimport android.annotation.SuppressLint;\nimport android.os.Looper;\nimport android.util.L"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/delegate/BaseVirtualInitializer.java",
"chars": 2084,
"preview": "package io.virtualapp.delegate;\n\nimport android.app.Application;\n\nimport com.lody.virtual.client.core.VirtualCore;\nimpor"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/delegate/MyAppRequestListener.java",
"chars": 1072,
"preview": "package io.virtualapp.delegate;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\n"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/delegate/MyComponentDelegate.java",
"chars": 1210,
"preview": "package io.virtualapp.delegate;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.content.Int"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/delegate/MyPhoneInfoDelegate.java",
"chars": 541,
"preview": "package io.virtualapp.delegate;\n\nimport com.lody.virtual.client.hook.delegate.PhoneInfoDelegate;\n\n\n/**\n * Fake the Devic"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/delegate/MyTaskDescDelegate.java",
"chars": 1139,
"preview": "package io.virtualapp.delegate;\n\nimport android.annotation.TargetApi;\nimport android.app.ActivityManager;\nimport android"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/dev/CmdReceiver.java",
"chars": 3586,
"preview": "package io.virtualapp.dev;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.con"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/glide/GlideUtils.java",
"chars": 1181,
"preview": "package io.virtualapp.glide;\n\nimport android.content.Context;\nimport android.support.annotation.DrawableRes;\nimport andr"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/glide/MyGlideModule.java",
"chars": 1285,
"preview": "package io.virtualapp.glide;\n\nimport android.content.Context;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glid"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceDataFetcher.java",
"chars": 4422,
"preview": "package io.virtualapp.glide;\n\nimport android.content.Context;\nimport android.content.pm.PackageInfo;\nimport android.cont"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceLoader.java",
"chars": 1174,
"preview": "package io.virtualapp.glide;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\nimport android."
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/glide/PackageIconResourceLoaderFactory.java",
"chars": 819,
"preview": "package io.virtualapp.glide;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\n\nimport com.bum"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/gms/FakeGms.java",
"chars": 16770,
"preview": "package io.virtualapp.gms;\n\nimport android.app.Activity;\nimport android.app.ProgressDialog;\nimport android.content.Conte"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/ListAppActivity.java",
"chars": 1603,
"preview": "package io.virtualapp.home;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimpor"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/ListAppContract.java",
"chars": 461,
"preview": "package io.virtualapp.home;\n\nimport java.util.List;\n\nimport io.virtualapp.abs.BasePresenter;\nimport io.virtualapp.abs.Ba"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/ListAppFragment.java",
"chars": 11634,
"preview": "package io.virtualapp.home;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.content.Compone"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/ListAppPresenterImpl.java",
"chars": 823,
"preview": "package io.virtualapp.home;\n\nimport android.app.Activity;\n\nimport java.io.File;\n\nimport io.virtualapp.home.repo.AppDataS"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/LoadingActivity.java",
"chars": 13154,
"preview": "package io.virtualapp.home;\n\nimport android.app.ActivityManager;\nimport android.content.Context;\nimport android.content."
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/NewHomeActivity.java",
"chars": 13638,
"preview": "package io.virtualapp.home;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.app.ProgressDia"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java",
"chars": 1033,
"preview": "package io.virtualapp.home.adapters;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentMana"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java",
"chars": 5039,
"preview": "package io.virtualapp.home.adapters;\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java",
"chars": 378,
"preview": "package io.virtualapp.home.models;\n\nimport android.graphics.drawable.Drawable;\n\n/**\n * @author Lody\n */\n\npublic interfac"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfo.java",
"chars": 399,
"preview": "package io.virtualapp.home.models;\n\nimport android.graphics.drawable.Drawable;\n\n/**\n * @author Lody\n */\n\npublic class Ap"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/models/AppInfoLite.java",
"chars": 1499,
"preview": "package io.virtualapp.home.models;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\n/**\n * @author Lody\n */\n\npu"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/models/MultiplePackageAppData.java",
"chars": 1662,
"preview": "package io.virtualapp.home.models;\n\nimport android.graphics.drawable.Drawable;\n\nimport com.lody.virtual.client.core.Virt"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/models/PackageAppData.java",
"chars": 2181,
"preview": "package io.virtualapp.home.models;\n\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport an"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppDataSource.java",
"chars": 906,
"preview": "package io.virtualapp.home.repo;\n\nimport android.content.Context;\n\nimport com.lody.virtual.remote.InstallResult;\n\nimport"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/repo/AppRepository.java",
"chars": 9095,
"preview": "package io.virtualapp.home.repo;\n\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport andr"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/repo/PackageAppDataStorage.java",
"chars": 2494,
"preview": "package io.virtualapp.home.repo;\n\nimport android.content.pm.ApplicationInfo;\n\nimport com.lody.virtual.client.core.Virtua"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/settings/AboutActivity.java",
"chars": 6726,
"preview": "package io.virtualapp.settings;\n\nimport android.content.ClipData;\nimport android.content.ClipboardManager;\nimport androi"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/settings/AppManageActivity.java",
"chars": 11541,
"preview": "package io.virtualapp.settings;\n\nimport android.app.AlertDialog;\nimport android.app.Dialog;\nimport android.app.ProgressD"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/settings/NougatPolicy.java",
"chars": 2086,
"preview": "package io.virtualapp.settings;\n\nimport android.content.Context;\nimport android.os.Build;\n\nimport java.lang.reflect.Meth"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/settings/OnlinePlugin.java",
"chars": 7211,
"preview": "package io.virtualapp.settings;\n\nimport android.app.Activity;\nimport android.app.ProgressDialog;\nimport android.os.Syste"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/settings/RecommendPluginActivity.java",
"chars": 5347,
"preview": "package io.virtualapp.settings;\n\nimport android.app.ProgressDialog;\nimport android.content.Context;\nimport android.conte"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/settings/SettingsActivity.java",
"chars": 14755,
"preview": "package io.virtualapp.settings;\n\nimport android.app.Activity;\nimport android.app.ProgressDialog;\nimport android.content."
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/settings/TaskManageActivity.java",
"chars": 6020,
"preview": "package io.virtualapp.settings;\n\nimport android.app.ActivityManager;\nimport android.content.Context;\nimport android.grap"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/splash/SplashActivity.java",
"chars": 1390,
"preview": "package io.virtualapp.splash;\n\nimport android.os.Bundle;\nimport android.view.WindowManager;\n\nimport com.lody.virtual.cli"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/sys/Installd.java",
"chars": 10352,
"preview": "package io.virtualapp.sys;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.App"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/sys/InstallerActivity.java",
"chars": 13971,
"preview": "package io.virtualapp.sys;\n\nimport android.app.AlertDialog;\nimport android.content.Context;\nimport android.content.Inten"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/sys/ShareBridgeActivity.java",
"chars": 4336,
"preview": "package io.virtualapp.sys;\n\nimport android.app.Activity;\nimport android.content.ComponentName;\nimport android.content.Co"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/update/VAVersionService.java",
"chars": 3590,
"preview": "package io.virtualapp.update;\n\nimport android.content.Context;\nimport android.content.pm.PackageInfo;\nimport android.con"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/utils/DialogUtil.java",
"chars": 385,
"preview": "package io.virtualapp.utils;\n\nimport android.support.v7.app.AlertDialog;\n\n/**\n * @author weishu\n * @date 2018/7/5.\n */\np"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/utils/HanziToPinyin.java",
"chars": 27675,
"preview": "package io.virtualapp.utils;\n/*\n * Copyright (C) 2009 The Android Open Source Project\n *\n * Licensed under the Apache Li"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/utils/Misc.java",
"chars": 2587,
"preview": "package io.virtualapp.utils;\n\nimport android.app.Activity;\nimport android.content.ClipData;\nimport android.content.Clipb"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/BaseView.java",
"chars": 3839,
"preview": "package io.virtualapp.widgets;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimp"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/CardStackAdapter.java",
"chars": 10942,
"preview": "package io.virtualapp.widgets;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport android.animation.Animator;\ni"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/CardStackLayout.java",
"chars": 5736,
"preview": "package io.virtualapp.widgets;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.cont"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/DragSelectRecyclerView.java",
"chars": 12078,
"preview": "package io.virtualapp.widgets;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.gr"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/DragSelectRecyclerViewAdapter.java",
"chars": 5802,
"preview": "package io.virtualapp.widgets;\n\nimport android.os.Bundle;\nimport android.support.annotation.CallSuper;\nimport android.su"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/EatBeansView.java",
"chars": 3903,
"preview": "package io.virtualapp.widgets;\n\nimport android.animation.Animator;\nimport android.animation.ValueAnimator;\nimport androi"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/Indicator.java",
"chars": 4856,
"preview": "package io.virtualapp.widgets;\n\nimport android.animation.ValueAnimator;\nimport android.graphics.Canvas;\nimport android.g"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/LabelView.java",
"chars": 10588,
"preview": "package io.virtualapp.widgets;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.gr"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/MarqueeTextView.java",
"chars": 970,
"preview": "package io.virtualapp.widgets;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.support.v"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/fittext/BaseTextView.java",
"chars": 10159,
"preview": "package io.virtualapp.widgets.fittext;\n\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport and"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/fittext/FitTextHelper.java",
"chars": 12155,
"preview": "package io.virtualapp.widgets.fittext;\n\nimport android.annotation.TargetApi;\nimport android.os.Build;\nimport android.tex"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/fittext/FitTextView.java",
"chars": 4397,
"preview": "package io.virtualapp.widgets.fittext;\n\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport a"
},
{
"path": "VirtualApp/app/src/main/res/drawable/blue_circle.xml",
"chars": 219,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:sha"
},
{
"path": "VirtualApp/app/src/main/res/drawable/fab_bg.xml",
"chars": 9719,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "VirtualApp/app/src/main/res/drawable/home_bg.xml",
"chars": 228,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <gradient\n"
},
{
"path": "VirtualApp/app/src/main/res/drawable/icon_bg.xml",
"chars": 258,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "VirtualApp/app/src/main/res/drawable/sel_clone_app_btn.xml",
"chars": 244,
"preview": "<selector xmlns:Android=\"http://schemas.android.com/apk/res/android\">\n\n\n <item Android:drawable=\"@drawable/shape_clon"
},
{
"path": "VirtualApp/app/src/main/res/drawable/sel_guide_btn.xml",
"chars": 405,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:"
},
{
"path": "VirtualApp/app/src/main/res/drawable/shape_clone_app_btn.xml",
"chars": 224,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android"
},
{
"path": "VirtualApp/app/src/main/res/drawable/shape_clone_app_btn_pressed.xml",
"chars": 224,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<shape\n xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android"
},
{
"path": "VirtualApp/app/src/main/res/drawable-nodpi/about_icon_copy_right.xml",
"chars": 1251,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\"24dp\"\n "
},
{
"path": "VirtualApp/app/src/main/res/drawable-nodpi/ic_more.xml",
"chars": 460,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:height=\"32dp\"\n android:width=\"32dp\"\n "
},
{
"path": "VirtualApp/app/src/main/res/layout/activity_clone_app.xml",
"chars": 966,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "VirtualApp/app/src/main/res/layout/activity_install.xml",
"chars": 1887,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "VirtualApp/app/src/main/res/layout/activity_list.xml",
"chars": 847,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "VirtualApp/app/src/main/res/layout/activity_loading.xml",
"chars": 1501,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andro"
},
{
"path": "VirtualApp/app/src/main/res/layout/activity_location_settings.xml",
"chars": 419,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "VirtualApp/app/src/main/res/layout/activity_marker.xml",
"chars": 1586,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.CoordinatorLayout\n xmlns:android=\"http://schema"
},
{
"path": "VirtualApp/app/src/main/res/layout/activity_splash.xml",
"chars": 689,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "VirtualApp/app/src/main/res/layout/activity_users.xml",
"chars": 547,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "VirtualApp/app/src/main/res/layout/content_toolbar.xml",
"chars": 713,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.AppBarLayout\n xmlns:android=\"http://schemas.and"
},
{
"path": "VirtualApp/app/src/main/res/layout/fragment_list_app.xml",
"chars": 1621,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns"
},
{
"path": "VirtualApp/app/src/main/res/layout/item_app.xml",
"chars": 1031,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "VirtualApp/app/src/main/res/layout/item_app_manage.xml",
"chars": 1559,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "VirtualApp/app/src/main/res/layout/item_clone_app.xml",
"chars": 2287,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andro"
},
{
"path": "VirtualApp/app/src/main/res/layout/item_location_app.xml",
"chars": 1867,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "VirtualApp/app/src/main/res/layout/item_plugin_recommend.xml",
"chars": 1004,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n a"
},
{
"path": "VirtualApp/app/src/main/res/layout/item_share.xml",
"chars": 1084,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "VirtualApp/app/src/main/res/layout/item_task_manage.xml",
"chars": 1512,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "VirtualApp/app/src/main/res/layout/item_user.xml",
"chars": 687,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n "
},
{
"path": "VirtualApp/app/src/main/res/menu/app_manage_menu.xml",
"chars": 710,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app=\"h"
},
{
"path": "VirtualApp/app/src/main/res/menu/main_menu.xml",
"chars": 383,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app="
},
{
"path": "VirtualApp/app/src/main/res/menu/marktet_map.xml",
"chars": 410,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app="
},
{
"path": "VirtualApp/app/src/main/res/values/attrs.xml",
"chars": 2456,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <declare-styleable name=\"CardStackLayout\">\n <attr name=\"pa"
},
{
"path": "VirtualApp/app/src/main/res/values/colors.xml",
"chars": 1243,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"colorPrimary\">#607191</color>\n <color name=\"color"
},
{
"path": "VirtualApp/app/src/main/res/values/dimens.xml",
"chars": 789,
"preview": "<resources>\n <!-- Default screen margins, per the Android Design guidelines. -->\n <dimen name=\"activity_horizontal"
},
{
"path": "VirtualApp/app/src/main/res/values/fitTextView.xml",
"chars": 243,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <declare-styleable name=\"FitTextView\">\n <attr name=\"ftMinT"
},
{
"path": "VirtualApp/app/src/main/res/values/ids.xml",
"chars": 124,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <item name=\"cardstack_internal_position_tag\" type=\"id\"/>\n</resour"
},
{
"path": "VirtualApp/app/src/main/res/values/integers.xml",
"chars": 119,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <integer name=\"parallax_scale_default\">-2</integer>\n</resources>"
},
{
"path": "VirtualApp/app/src/main/res/values/strings.xml",
"chars": 17018,
"preview": "<resources>\n <!--<string name=\"app_name\">VirtualApp</string>-->\n <string name=\"app_name\">VirtualXposed</string>\n "
},
{
"path": "VirtualApp/app/src/main/res/values/styles.xml",
"chars": 1541,
"preview": "<resources>\n\n <!-- Base application theme. -->\n <style name=\"AppTheme\" parent=\"Theme.AppCompat.NoActionBar\">\n "
},
{
"path": "VirtualApp/app/src/main/res/values-en/strings.xml",
"chars": 336,
"preview": "<resources>\n <!--Avoid to be Override By library-->\n <string name=\"app_name\">VirtualXposed</string>\n <string na"
},
{
"path": "VirtualApp/app/src/main/res/values-es/strings.xml",
"chars": 16007,
"preview": "<resources>\n <!--<string name=\"app_name\">VirtualApp</string>-->\n <string name=\"app_name\">VirtualXposed</string>\n "
},
{
"path": "VirtualApp/app/src/main/res/values-fr/strings.xml",
"chars": 17231,
"preview": "<resources>\n <string name=\"wait\">Veuillez patienter…</string>\n <string name=\"desktop\">Bureau</string>\n <string "
},
{
"path": "VirtualApp/app/src/main/res/values-ja/strings.xml",
"chars": 14088,
"preview": "\n<resources>\n <!--<string name=\"app_name\">VirtualApp</string>-->\n <string name=\"app_name\">VirtualXposed</string>\n "
},
{
"path": "VirtualApp/app/src/main/res/values-pt-rBR/strings.xml",
"chars": 16318,
"preview": "<resources>\n \n <string name=\"app_name\">VirtualXposed</string>\n <string name=\"vxp\">VirtualXposed</string>\n <s"
},
{
"path": "VirtualApp/app/src/main/res/values-ru/strings.xml",
"chars": 13273,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">VirtualXposed</string>\n\t<string name=\"wait\">"
},
{
"path": "VirtualApp/app/src/main/res/values-uk/strings.xml",
"chars": 16999,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">VirtualXposed</string>\n\t<string name=\"wait\">"
},
{
"path": "VirtualApp/app/src/main/res/values-zh-rCN/strings.xml",
"chars": 11983,
"preview": "<resources>\n <!--<string name=\"app_name\">VirtualApp</string>-->\n <string name=\"app_name\">VirtualXposed</string>\n "
},
{
"path": "VirtualApp/app/src/main/res/values-zh-rTW/strings.xml",
"chars": 11220,
"preview": "<resources>\n <string name=\"app_name\">VirtualXposed</string>\n <string name=\"desktop\">桌面</string>\n <string name=\""
},
{
"path": "VirtualApp/app/src/main/res/xml/settings_preferences.xml",
"chars": 4725,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n "
},
{
"path": "VirtualApp/build.gradle",
"chars": 867,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n r"
},
{
"path": "VirtualApp/gradle/wrapper/gradle-wrapper.properties",
"chars": 230,
"preview": "#Mon Oct 29 11:05:44 CST 2018\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
},
{
"path": "VirtualApp/gradle.properties",
"chars": 885,
"preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
},
{
"path": "VirtualApp/gradlew",
"chars": 4971,
"preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n## Gradle start "
},
{
"path": "VirtualApp/gradlew.bat",
"chars": 2314,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
},
{
"path": "VirtualApp/lib/.gitignore",
"chars": 34,
"preview": "/build\n.externalNativeBuild/\nobj/\n"
},
{
"path": "VirtualApp/lib/build.gradle",
"chars": 1485,
"preview": "apply plugin: 'com.android.library'\n\nandroid {\n compileSdkVersion 28\n buildToolsVersion '28.0.3'\n\n defaultConfi"
},
{
"path": "VirtualApp/lib/proguard-rules.pro",
"chars": 662,
"preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /U"
},
{
"path": "VirtualApp/lib/src/main/AndroidManifest.xml",
"chars": 94597,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/accounts/IAccountAuthenticator.aidl",
"chars": 3165,
"preview": "/*\n * Copyright (C) 2009 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/accounts/IAccountAuthenticatorResponse.aidl",
"chars": 927,
"preview": "/*\n * Copyright (C) 2009 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/accounts/IAccountManagerResponse.aidl",
"chars": 286,
"preview": "package android.accounts;\n\nimport android.os.Bundle;\n\n/**\n * The interface used to return responses for asynchronous cal"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/app/IActivityManager/ContentProviderHolder.aidl",
"chars": 102,
"preview": "// ContentProviderHolder.aidl\npackage android.app.IActivityManager;\n\nparcelable ContentProviderHolder;"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/app/IServiceConnection.aidl",
"chars": 853,
"preview": "/* //device/java/android/android/app/IServiceConnection.aidl\n**\n** Copyright 2007, The Android Open Source Project\n**\n**"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/app/IStopUserCallback.aidl",
"chars": 824,
"preview": "/*\n** Copyright 2012, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/app/job/IJobCallback.aidl",
"chars": 2039,
"preview": "/**\n * Copyright 2014, The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Licens"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/app/job/IJobService.aidl",
"chars": 540,
"preview": "package android.app.job;\n\nimport android.app.job.JobParameters;\n\n/**\n * Interface that the framework uses to communicate"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/IIntentReceiver.aidl",
"chars": 1090,
"preview": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/ISyncAdapter.aidl",
"chars": 2039,
"preview": "/*\n * Copyright (C) 2008 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/ISyncContext.aidl",
"chars": 1229,
"preview": "/*\n * Copyright (C) 2008 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/ISyncStatusObserver.aidl",
"chars": 98,
"preview": "package android.content;\n\n\ninterface ISyncStatusObserver {\n void onStatusChanged(int which);\n}\n"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/pm/IPackageDataObserver.aidl",
"chars": 342,
"preview": "package android.content.pm;\n\n/**\n * API for package data change related callbacks from the Package Manager.\n * Some usag"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/pm/IPackageDeleteObserver2.aidl",
"chars": 844,
"preview": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/pm/IPackageInstallObserver.aidl",
"chars": 202,
"preview": "package android.content.pm;\n\n/**\n * API for installation callbacks from the Package Manager.\n */\ninterface IPackageInsta"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/pm/IPackageInstallObserver2.aidl",
"chars": 1674,
"preview": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/pm/IPackageInstallerCallback.aidl",
"chars": 350,
"preview": "package android.content.pm;\n\ninterface IPackageInstallerCallback {\n void onSessionCreated(int sessionId);\n void on"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/content/pm/IPackageInstallerSession.aidl",
"chars": 574,
"preview": "package android.content.pm;\n\nimport android.content.pm.IPackageInstallObserver2;\nimport android.content.IntentSender;\nim"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/location/ILocationListener.aidl",
"chars": 359,
"preview": "// ILocationListener.aidl\npackage android.location;\n\nimport android.location.Location;\nimport android.os.Bundle;\n\ninterf"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/net/IConnectivityManager.aidl",
"chars": 539,
"preview": "package android.net;\n\nimport android.net.NetworkInfo;\nimport android.net.LinkProperties;\n\ninterface IConnectivityManager"
},
{
"path": "VirtualApp/lib/src/main/aidl/android/net/wifi/IWifiScanner.aidl",
"chars": 184,
"preview": "package android.net.wifi;\n\nimport android.os.Messenger;\nimport android.os.Bundle;\n\ninterface IWifiScanner\n{\n Messenge"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/client/IVClient.aidl",
"chars": 717,
"preview": "// IVClient.aidl\npackage com.lody.virtual.client;\n\nimport android.content.pm.ActivityInfo;\nimport android.content.pm.App"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/os/VUserInfo.aidl",
"chars": 69,
"preview": "// VUserInfo.aidl\npackage com.lody.virtual.os;\n\nparcelable VUserInfo;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/AppTaskInfo.aidl",
"chars": 77,
"preview": "// AppTaskInfo.aidl\npackage com.lody.virtual.remote;\n\nparcelable AppTaskInfo;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/BadgerInfo.aidl",
"chars": 75,
"preview": "// BadgerInfo.aidl\npackage com.lody.virtual.remote;\n\nparcelable BadgerInfo;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/InstallResult.aidl",
"chars": 81,
"preview": "// InstallResult.aidl\npackage com.lody.virtual.remote;\n\nparcelable InstallResult;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/InstalledAppInfo.aidl",
"chars": 81,
"preview": "// AppSetting.aidl\npackage com.lody.virtual.remote;\n\nparcelable InstalledAppInfo;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/PendingIntentData.aidl",
"chars": 89,
"preview": "// PendingIntentData.aidl\npackage com.lody.virtual.remote;\n\nparcelable PendingIntentData;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/PendingResultData.aidl",
"chars": 89,
"preview": "// PendingResultData.aidl\npackage com.lody.virtual.remote;\n\nparcelable PendingResultData;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/Problem.aidl",
"chars": 69,
"preview": "// Problem.aidl\npackage com.lody.virtual.remote;\n\nparcelable Problem;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/ReceiverInfo.aidl",
"chars": 79,
"preview": "// ReceiverInfo.aidl\npackage com.lody.virtual.remote;\n\nparcelable ReceiverInfo;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/VDeviceInfo.aidl",
"chars": 77,
"preview": "// VDeviceInfo.aidl\npackage com.lody.virtual.remote;\n\nparcelable VDeviceInfo;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/VParceledListSlice.aidl",
"chars": 91,
"preview": "// VParceledListSlice.aidl\npackage com.lody.virtual.remote;\n\nparcelable VParceledListSlice;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/vloc/VCell.aidl",
"chars": 70,
"preview": "// VCell.aidl\npackage com.lody.virtual.remote.vloc;\n\nparcelable VCell;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/vloc/VLocation.aidl",
"chars": 78,
"preview": "// VLocation.aidl\npackage com.lody.virtual.remote.vloc;\n\nparcelable VLocation;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/remote/vloc/VWifi.aidl",
"chars": 70,
"preview": "// VWifi.aidl\npackage com.lody.virtual.remote.vloc;\n\nparcelable VWifi;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IAccountManager.aidl",
"chars": 2918,
"preview": "package com.lody.virtual.server;\n\nimport android.accounts.IAccountManagerResponse;\nimport android.accounts.Account;\nimpo"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IActivityManager.aidl",
"chars": 3963,
"preview": "// IActivityManager.aidl\npackage com.lody.virtual.server;\n\nimport com.lody.virtual.remote.VParceledListSlice;\nimport com"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IAppManager.aidl",
"chars": 1613,
"preview": "// IAppManager.aidl\npackage com.lody.virtual.server;\n\nimport com.lody.virtual.server.interfaces.IPackageObserver;\nimport"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IBinderDelegateService.aidl",
"chars": 202,
"preview": "// IBinderDelegateService.aidl\npackage com.lody.virtual.server;\n\nimport android.content.ComponentName;\n\ninterface IBinde"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IDeviceInfoManager.aidl",
"chars": 245,
"preview": "// IDeviceInfoManager.aidl\npackage com.lody.virtual.server;\n\nimport com.lody.virtual.remote.VDeviceInfo;\n\ninterface IDev"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IJobScheduler.aidl",
"chars": 462,
"preview": "//package com.lody.virtual.server;\n//\n//import android.app.job.JobInfo;\n//import android.app.job.JobParameters;\n//\n// /*"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/INotificationManager.aidl",
"chars": 684,
"preview": "// INotificationManager.aidl\r\npackage com.lody.virtual.server;\r\n\r\n// Declare any non-default types here with import stat"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IPackageInstaller.aidl",
"chars": 1297,
"preview": "package com.lody.virtual.server;\n\nimport android.content.pm.IPackageDeleteObserver2;\nimport android.content.pm.IPackageI"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IPackageInstallerSession.aidl",
"chars": 485,
"preview": "package com.lody.virtual.server;\n\nimport android.content.IntentSender;\nimport android.os.ParcelFileDescriptor;\n\ninterfac"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IPackageManager.aidl",
"chars": 3086,
"preview": "// IPackageManager.aidl\npackage com.lody.virtual.server;\n\nimport android.content.ComponentName;\nimport android.content.I"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IUserManager.aidl",
"chars": 712,
"preview": "package com.lody.virtual.server;\n\nimport android.os.ParcelFileDescriptor;\nimport com.lody.virtual.os.VUserInfo;\nimport a"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IVirtualLocationManager.aidl",
"chars": 1081,
"preview": "// IVirtualLocationManager.aidl\npackage com.lody.virtual.server;\n\nimport com.lody.virtual.remote.vloc.VCell;\nimport com."
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/IVirtualStorageService.aidl",
"chars": 420,
"preview": "// IVirtualStorageService.aidl\npackage com.lody.virtual.server;\n\n\ninterface IVirtualStorageService {\n\n void setVirtual"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/interfaces/IAppRequestListener.aidl",
"chars": 194,
"preview": "// IAppRequestListener.aidl\npackage com.lody.virtual.server.interfaces;\n\ninterface IAppRequestListener {\n void onRequ"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/interfaces/IIntentFilterObserver.aidl",
"chars": 399,
"preview": "// IIntentFilterObserver.aidl\npackage com.lody.virtual.server.interfaces;\n\n// Declare any non-default types here with im"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/interfaces/IPackageObserver.aidl",
"chars": 355,
"preview": "// IPackageObserver.aidl\npackage com.lody.virtual.server.interfaces;\n\ninterface IPackageObserver {\n void onPackageIns"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/interfaces/IProcessObserver.aidl",
"chars": 229,
"preview": "// IProcessObserver.aidl\npackage com.lody.virtual.server.interfaces;\n\ninterface IProcessObserver {\n void onProcessCre"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/interfaces/IServiceFetcher.aidl",
"chars": 225,
"preview": "// IServiceFetcher.aidl\npackage com.lody.virtual.server.interfaces;\n\ninterface IServiceFetcher {\n IBinder getService("
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/interfaces/IUiCallback.aidl",
"chars": 212,
"preview": "// IUiCallback.aidl\npackage com.lody.virtual.server.interfaces;\n\ninterface IUiCallback {\n void onAppOpened(in String "
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/pm/installer/SessionInfo.aidl",
"chars": 90,
"preview": "// SessionInfo.aidl\npackage com.lody.virtual.server.pm.installer;\n\nparcelable SessionInfo;"
}
]
// ... and 601 more files (download for full content)
About this extraction
This page contains the full source code of the android-hacker/VirtualXposed GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 801 files (2.7 MB), approximately 763.9k tokens, and a symbol index with 5437 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.