Showing preview only (3,312K chars total). Download the full file or copy to clipboard to get everything.
Repository: asLody/VirtualApp
Branch: master
Commit: dd01dce84601
Files: 900
Total size: 2.9 MB
Directory structure:
gitextract_bfy_ta4s/
├── .gitignore
├── README.md
├── README_eng.md
├── VirtualApp/
│ ├── .gitignore
│ ├── app/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── libs/
│ │ │ ├── TencentLocationSDK_v6.1.2_r1df4baaa_170627_1056.jar
│ │ │ ├── TencentMapSDK_Raster_v_1.2.8_e45bcd0.jar
│ │ │ └── TencentMapSearch_v1.1.7.3207904.jar
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── assets/
│ │ │ └── OaceOaT8w5Xda6wa
│ │ ├── java/
│ │ │ └── io/
│ │ │ └── virtualapp/
│ │ │ ├── VApp.java
│ │ │ ├── VCommends.java
│ │ │ ├── abs/
│ │ │ │ ├── BasePresenter.java
│ │ │ │ ├── BaseView.java
│ │ │ │ ├── Callback.java
│ │ │ │ ├── Value.java
│ │ │ │ ├── nestedadapter/
│ │ │ │ │ ├── RecyclerViewAdapterWrapper.java
│ │ │ │ │ └── SmartRecyclerAdapter.java
│ │ │ │ ├── percent/
│ │ │ │ │ └── PercentLinearLayout.java
│ │ │ │ ├── reflect/
│ │ │ │ │ └── ReflectException.java
│ │ │ │ └── ui/
│ │ │ │ ├── BaseAdapterPlus.java
│ │ │ │ ├── VActivity.java
│ │ │ │ ├── VFragment.java
│ │ │ │ └── VUiKit.java
│ │ │ ├── delegate/
│ │ │ │ ├── MyAppRequestListener.java
│ │ │ │ ├── MyComponentDelegate.java
│ │ │ │ ├── MyPhoneInfoDelegate.java
│ │ │ │ └── MyTaskDescriptionDelegate.java
│ │ │ ├── effects/
│ │ │ │ ├── ExplosionAnimator.java
│ │ │ │ └── ExplosionField.java
│ │ │ ├── home/
│ │ │ │ ├── FlurryROMCollector.java
│ │ │ │ ├── HomeActivity.java
│ │ │ │ ├── HomeContract.java
│ │ │ │ ├── HomePresenterImpl.java
│ │ │ │ ├── ListAppActivity.java
│ │ │ │ ├── ListAppContract.java
│ │ │ │ ├── ListAppFragment.java
│ │ │ │ ├── ListAppPresenterImpl.java
│ │ │ │ ├── LoadingActivity.java
│ │ │ │ ├── adapters/
│ │ │ │ │ ├── AppLocationAdapter.java
│ │ │ │ │ ├── AppPagerAdapter.java
│ │ │ │ │ ├── CloneAppListAdapter.java
│ │ │ │ │ ├── LaunchpadAdapter.java
│ │ │ │ │ └── decorations/
│ │ │ │ │ └── ItemOffsetDecoration.java
│ │ │ │ ├── location/
│ │ │ │ │ ├── MarkerActivity.java
│ │ │ │ │ └── VirtualLocationSettings.java
│ │ │ │ ├── models/
│ │ │ │ │ ├── AddAppButton.java
│ │ │ │ │ ├── AppData.java
│ │ │ │ │ ├── AppInfo.java
│ │ │ │ │ ├── AppInfoLite.java
│ │ │ │ │ ├── EmptyAppData.java
│ │ │ │ │ ├── LocationData.java
│ │ │ │ │ ├── MultiplePackageAppData.java
│ │ │ │ │ └── PackageAppData.java
│ │ │ │ ├── platform/
│ │ │ │ │ ├── PlatformInfo.java
│ │ │ │ │ └── WechatPlatformInfo.java
│ │ │ │ └── repo/
│ │ │ │ ├── AppDataSource.java
│ │ │ │ ├── AppRepository.java
│ │ │ │ └── PackageAppDataStorage.java
│ │ │ ├── splash/
│ │ │ │ └── SplashActivity.java
│ │ │ ├── vs/
│ │ │ │ └── VSManagerActivity.java
│ │ │ └── widgets/
│ │ │ ├── BallGridBeatIndicator.java
│ │ │ ├── BallPulseIndicator.java
│ │ │ ├── BaseView.java
│ │ │ ├── CardStackAdapter.java
│ │ │ ├── CardStackLayout.java
│ │ │ ├── CircularAnim.java
│ │ │ ├── DragSelectRecyclerView.java
│ │ │ ├── DragSelectRecyclerViewAdapter.java
│ │ │ ├── EatBeansView.java
│ │ │ ├── Indicator.java
│ │ │ ├── LabelView.java
│ │ │ ├── LauncherIconView.java
│ │ │ ├── LoadingIndicatorView.java
│ │ │ ├── MarqueeTextView.java
│ │ │ ├── MaterialRippleLayout.java
│ │ │ ├── RippleButton.java
│ │ │ ├── ShadowProperty.java
│ │ │ ├── ShadowViewDrawable.java
│ │ │ ├── Shimmer.java
│ │ │ ├── ShimmerViewBase.java
│ │ │ ├── ShimmerViewHelper.java
│ │ │ ├── TwoGearsView.java
│ │ │ ├── ViewHelper.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
│ │ ├── layout/
│ │ │ ├── activity_clone_app.xml
│ │ │ ├── activity_home.xml
│ │ │ ├── activity_install.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_clone_app.xml
│ │ │ ├── item_launcher_app.xml
│ │ │ ├── item_location_app.xml
│ │ │ └── item_user.xml
│ │ ├── menu/
│ │ │ ├── marktet_map.xml
│ │ │ └── user_menu.xml
│ │ ├── values/
│ │ │ ├── attrs.xml
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── fitTextView.xml
│ │ │ ├── ids.xml
│ │ │ ├── integers.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ └── values-zh-rTW/
│ │ └── strings.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/
│ │ │ ├── IBinderDelegateService.aidl
│ │ │ ├── IPackageInstaller.aidl
│ │ │ ├── IPackageInstallerSession.aidl
│ │ │ ├── interfaces/
│ │ │ │ ├── IAppRequestListener.aidl
│ │ │ │ ├── IIntentFilterObserver.aidl
│ │ │ │ ├── IPackageObserver.aidl
│ │ │ │ ├── IProcessObserver.aidl
│ │ │ │ ├── IServiceFetcher.aidl
│ │ │ │ └── IUiCallback.aidl
│ │ │ └── pm/
│ │ │ └── installer/
│ │ │ ├── SessionInfo.aidl
│ │ │ └── SessionParams.aidl
│ │ ├── java/
│ │ │ ├── android/
│ │ │ │ ├── content/
│ │ │ │ │ ├── SyncStatusInfo.java
│ │ │ │ │ └── pm/
│ │ │ │ │ └── PackageParser.java
│ │ │ │ └── location/
│ │ │ │ └── LocationRequest.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
│ │ │ │ │ │ │ ├── ProviderHook.java
│ │ │ │ │ │ │ └── SettingsProviderHook.java
│ │ │ │ │ │ ├── proxies/
│ │ │ │ │ │ │ ├── account/
│ │ │ │ │ │ │ │ └── AccountManagerStub.java
│ │ │ │ │ │ │ ├── alarm/
│ │ │ │ │ │ │ │ └── AlarmManagerStub.java
│ │ │ │ │ │ │ ├── am/
│ │ │ │ │ │ │ │ ├── ActivityManagerStub.java
│ │ │ │ │ │ │ │ ├── HCallbackStub.java
│ │ │ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ │ │ ├── appops/
│ │ │ │ │ │ │ │ └── AppOpsManagerStub.java
│ │ │ │ │ │ │ ├── appwidget/
│ │ │ │ │ │ │ │ └── AppWidgetManagerStub.java
│ │ │ │ │ │ │ ├── audio/
│ │ │ │ │ │ │ │ └── AudioManagerStub.java
│ │ │ │ │ │ │ ├── backup/
│ │ │ │ │ │ │ │ └── BackupManagerStub.java
│ │ │ │ │ │ │ ├── bluetooth/
│ │ │ │ │ │ │ │ └── BluetoothStub.java
│ │ │ │ │ │ │ ├── clipboard/
│ │ │ │ │ │ │ │ └── ClipBoardStub.java
│ │ │ │ │ │ │ ├── connectivity/
│ │ │ │ │ │ │ │ └── ConnectivityStub.java
│ │ │ │ │ │ │ ├── content/
│ │ │ │ │ │ │ │ └── ContentServiceStub.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
│ │ │ │ │ │ │ ├── persistent_data_block/
│ │ │ │ │ │ │ │ └── PersistentDataBlockServiceStub.java
│ │ │ │ │ │ │ ├── phonesubinfo/
│ │ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ │ └── PhoneSubInfoStub.java
│ │ │ │ │ │ │ ├── pm/
│ │ │ │ │ │ │ │ ├── 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
│ │ │ │ │ ├── DaemonService.java
│ │ │ │ │ ├── ResolverActivity.java
│ │ │ │ │ ├── ShortcutHandleActivity.java
│ │ │ │ │ ├── StubActivity.java
│ │ │ │ │ ├── StubContentProvider.java
│ │ │ │ │ ├── StubDialog.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
│ │ │ │ │ ├── ipcbus/
│ │ │ │ │ │ ├── IPCBus.java
│ │ │ │ │ │ ├── IPCInvocationBridge.java
│ │ │ │ │ │ ├── IPCMethod.java
│ │ │ │ │ │ ├── IPCSingleton.java
│ │ │ │ │ │ ├── IServerCache.java
│ │ │ │ │ │ ├── ServerInterface.java
│ │ │ │ │ │ └── TransformBinder.java
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── ArrayUtils.java
│ │ │ │ │ ├── AtomicFile.java
│ │ │ │ │ ├── BitmapUtils.java
│ │ │ │ │ ├── ClassUtils.java
│ │ │ │ │ ├── ComponentUtils.java
│ │ │ │ │ ├── DrawableUtils.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
│ │ │ │ ├── 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
│ │ │ │ ├── interfaces/
│ │ │ │ │ ├── IAccountManager.java
│ │ │ │ │ ├── IActivityManager.java
│ │ │ │ │ ├── IAppManager.java
│ │ │ │ │ ├── IDeviceInfoManager.java
│ │ │ │ │ ├── IJobService.java
│ │ │ │ │ ├── INotificationManager.java
│ │ │ │ │ ├── IPackageManager.java
│ │ │ │ │ ├── IUserManager.java
│ │ │ │ │ ├── IVirtualLocationManager.java
│ │ │ │ │ └── IVirtualStorageService.java
│ │ │ │ ├── job/
│ │ │ │ │ └── VJobSchedulerService.java
│ │ │ │ ├── location/
│ │ │ │ │ └── VirtualLocationService.java
│ │ │ │ ├── memory/
│ │ │ │ │ ├── MappedMemoryRegion.java
│ │ │ │ │ ├── MemoryRegionParser.java
│ │ │ │ │ ├── MemoryScanEngine.java
│ │ │ │ │ ├── MemoryValue.java
│ │ │ │ │ └── ProcessMemory.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
│ │ │ │ │ ├── IAlarmManager.java
│ │ │ │ │ ├── IApplicationThread.java
│ │ │ │ │ ├── IApplicationThreadICSMR1.java
│ │ │ │ │ ├── IApplicationThreadJBMR1.java
│ │ │ │ │ ├── IApplicationThreadKitkat.java
│ │ │ │ │ ├── IApplicationThreadOreo.java
│ │ │ │ │ ├── ISearchManager.java
│ │ │ │ │ ├── IServiceConnectionO.java
│ │ │ │ │ ├── IUsageStatsManager.java
│ │ │ │ │ ├── LoadedApk.java
│ │ │ │ │ ├── LoadedApkHuaWei.java
│ │ │ │ │ ├── LoadedApkICS.java
│ │ │ │ │ ├── LoadedApkKitkat.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
│ │ │ │ │ └── IBluetoothManager.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
│ │ │ │ │ │ ├── PackageUserState.java
│ │ │ │ │ │ ├── ParceledListSlice.java
│ │ │ │ │ │ ├── ParceledListSliceJBMR2.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
│ │ │ │ │ ├── INetworkManagementService.java
│ │ │ │ │ ├── IPowerManager.java
│ │ │ │ │ ├── IUserManager.java
│ │ │ │ │ ├── Message.java
│ │ │ │ │ ├── Process.java
│ │ │ │ │ ├── ServiceManager.java
│ │ │ │ │ ├── StrictMode.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/
│ │ │ │ │ ├── CompatibilityInfoHolder.java
│ │ │ │ │ ├── Display.java
│ │ │ │ │ ├── DisplayAdjustments.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
│ │ │ │ ├── appwidget/
│ │ │ │ │ └── IAppWidgetService.java
│ │ │ │ ├── content/
│ │ │ │ │ ├── NativeLibraryHelper.java
│ │ │ │ │ └── ReferrerIntent.java
│ │ │ │ ├── os/
│ │ │ │ │ ├── IDropBoxManagerService.java
│ │ │ │ │ ├── IVibratorService.java
│ │ │ │ │ └── UserManager.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
│ │ ├── jni/
│ │ │ ├── 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
│ │ │ ├── HookZz/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .gitmodules
│ │ │ │ ├── Android.mk
│ │ │ │ ├── LICENSE
│ │ │ │ ├── Makefile
│ │ │ │ ├── README.md
│ │ │ │ ├── docs/
│ │ │ │ │ ├── HookFrameworkDesign.md
│ │ │ │ │ ├── hookzz-docs.md
│ │ │ │ │ ├── hookzz-example.md
│ │ │ │ │ └── hookzz-getting-started.md
│ │ │ │ ├── include/
│ │ │ │ │ └── hookzz.h
│ │ │ │ ├── src/
│ │ │ │ │ ├── allocator.c
│ │ │ │ │ ├── allocator.h
│ │ │ │ │ ├── interceptor.c
│ │ │ │ │ ├── interceptor.h
│ │ │ │ │ ├── memory.c
│ │ │ │ │ ├── memory.h
│ │ │ │ │ ├── platforms/
│ │ │ │ │ │ ├── arch-arm/
│ │ │ │ │ │ │ ├── instructions.c
│ │ │ │ │ │ │ ├── instructions.h
│ │ │ │ │ │ │ ├── reader-arm.c
│ │ │ │ │ │ │ ├── reader-arm.h
│ │ │ │ │ │ │ ├── reader-thumb.c
│ │ │ │ │ │ │ ├── reader-thumb.h
│ │ │ │ │ │ │ ├── regs-arm.c
│ │ │ │ │ │ │ ├── regs-arm.h
│ │ │ │ │ │ │ ├── relocator-arm.c
│ │ │ │ │ │ │ ├── relocator-arm.h
│ │ │ │ │ │ │ ├── relocator-thumb.c
│ │ │ │ │ │ │ ├── relocator-thumb.h
│ │ │ │ │ │ │ ├── writer-arm.c
│ │ │ │ │ │ │ ├── writer-arm.h
│ │ │ │ │ │ │ ├── writer-thumb.c
│ │ │ │ │ │ │ └── writer-thumb.h
│ │ │ │ │ │ ├── arch-arm64/
│ │ │ │ │ │ │ ├── instructions.c
│ │ │ │ │ │ │ ├── instructions.h
│ │ │ │ │ │ │ ├── reader-arm64.c
│ │ │ │ │ │ │ ├── reader-arm64.h
│ │ │ │ │ │ │ ├── regs-arm64.c
│ │ │ │ │ │ │ ├── regs-arm64.h
│ │ │ │ │ │ │ ├── relocator-arm64.c
│ │ │ │ │ │ │ ├── relocator-arm64.h
│ │ │ │ │ │ │ ├── writer-arm64.c
│ │ │ │ │ │ │ └── writer-arm64.h
│ │ │ │ │ │ ├── arch-x86/
│ │ │ │ │ │ │ ├── instructions.c
│ │ │ │ │ │ │ ├── instructions.h
│ │ │ │ │ │ │ ├── reader-x86.c
│ │ │ │ │ │ │ ├── reader-x86.h
│ │ │ │ │ │ │ ├── regs-x86.c
│ │ │ │ │ │ │ ├── regs-x86.h
│ │ │ │ │ │ │ ├── relocator-x86.c
│ │ │ │ │ │ │ ├── relocator-x86.h
│ │ │ │ │ │ │ ├── writer-x86.c
│ │ │ │ │ │ │ └── writer-x86.h
│ │ │ │ │ │ ├── backend-arm/
│ │ │ │ │ │ │ ├── interceptor-arm.c
│ │ │ │ │ │ │ ├── interceptor-arm.h
│ │ │ │ │ │ │ ├── interceptor-template-arm.s
│ │ │ │ │ │ │ ├── thunker-arm.c
│ │ │ │ │ │ │ └── thunker-arm.h
│ │ │ │ │ │ ├── backend-arm64/
│ │ │ │ │ │ │ ├── interceptor-arm64.c
│ │ │ │ │ │ │ ├── interceptor-arm64.h
│ │ │ │ │ │ │ ├── interceptor-template-arm64.s
│ │ │ │ │ │ │ ├── thunker-arm64.c
│ │ │ │ │ │ │ └── thunker-arm64.h
│ │ │ │ │ │ ├── backend-darwin/
│ │ │ │ │ │ │ ├── memory-darwin.c
│ │ │ │ │ │ │ └── memory-darwin.h
│ │ │ │ │ │ ├── backend-linux/
│ │ │ │ │ │ │ ├── memory-linux.c
│ │ │ │ │ │ │ └── memory-linux.h
│ │ │ │ │ │ ├── backend-posix/
│ │ │ │ │ │ │ ├── thread-posix.c
│ │ │ │ │ │ │ └── thread-posix.h
│ │ │ │ │ │ ├── backend-x86/
│ │ │ │ │ │ │ ├── interceptor-template-x86.s
│ │ │ │ │ │ │ ├── interceptor-x86.c
│ │ │ │ │ │ │ ├── interceptor-x86.h
│ │ │ │ │ │ │ ├── thunker-x86.c
│ │ │ │ │ │ │ └── thunker-x86.h
│ │ │ │ │ │ └── x86/
│ │ │ │ │ │ ├── instructions.h
│ │ │ │ │ │ ├── reader.c
│ │ │ │ │ │ ├── reader.h
│ │ │ │ │ │ ├── writer.c
│ │ │ │ │ │ └── writer.h
│ │ │ │ │ ├── relocator.h
│ │ │ │ │ ├── stack.c
│ │ │ │ │ ├── stack.h
│ │ │ │ │ ├── thread.h
│ │ │ │ │ ├── thunker.h
│ │ │ │ │ ├── trampoline.c
│ │ │ │ │ ├── trampoline.h
│ │ │ │ │ ├── writer.h
│ │ │ │ │ ├── zzdefs.h
│ │ │ │ │ ├── zzdeps/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── common/
│ │ │ │ │ │ │ ├── LEB128.h
│ │ │ │ │ │ │ ├── debugbreak.h
│ │ │ │ │ │ │ ├── memory-utils-common.c
│ │ │ │ │ │ │ └── memory-utils-common.h
│ │ │ │ │ │ ├── darwin/
│ │ │ │ │ │ │ ├── mach_vm.h
│ │ │ │ │ │ │ ├── macho-utils-darwin.c
│ │ │ │ │ │ │ ├── macho-utils-darwin.h
│ │ │ │ │ │ │ ├── memory-utils-darwin.c
│ │ │ │ │ │ │ └── memory-utils-darwin.h
│ │ │ │ │ │ ├── linux/
│ │ │ │ │ │ │ ├── memory-utils-linux.c
│ │ │ │ │ │ │ └── memory-utils-linux.h
│ │ │ │ │ │ ├── memory-utils.h
│ │ │ │ │ │ ├── posix/
│ │ │ │ │ │ │ ├── memory-utils-posix.c
│ │ │ │ │ │ │ ├── memory-utils-posix.h
│ │ │ │ │ │ │ ├── thread-utils-posix.c
│ │ │ │ │ │ │ └── thread-utils-posix.h
│ │ │ │ │ │ └── zz.h
│ │ │ │ │ ├── zzinfo.c
│ │ │ │ │ └── zzinfo.h
│ │ │ │ ├── tests/
│ │ │ │ │ ├── arm-android/
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ ├── test_hook_address_thumb.c
│ │ │ │ │ │ ├── test_hook_open_arm.c
│ │ │ │ │ │ └── test_hook_printf.c
│ │ │ │ │ ├── arm-insn-fix/
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ └── test_insn_fix.c
│ │ │ │ │ ├── arm-ios/
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ ├── test_hook_address_thumb.c
│ │ │ │ │ │ ├── test_hook_freeaddr.c
│ │ │ │ │ │ ├── test_hook_oc_thumb.m
│ │ │ │ │ │ ├── test_hook_open_arm.c
│ │ │ │ │ │ └── test_hook_printf.c
│ │ │ │ │ ├── arm64-insn-fix/
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ └── test_insn_fix.c
│ │ │ │ │ └── arm64-ios/
│ │ │ │ │ ├── makefile
│ │ │ │ │ ├── test_hook_address.c
│ │ │ │ │ ├── test_hook_oc.m
│ │ │ │ │ └── test_hook_printf.c
│ │ │ │ └── tools/
│ │ │ │ └── ZzSolidifyHook/
│ │ │ │ ├── solidifyhook
│ │ │ │ ├── solidifyhook.cpp
│ │ │ │ └── solidifytrampoline.c
│ │ │ ├── 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
│ └── settings.gradle
└── doc/
├── VADev.md
└── VADev_eng.md
================================================
FILE CONTENTS
================================================
================================================
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: README.md
================================================
[English Doc](README_eng.md "English")
<h1><p align="center">VA产品说明&开发指导</p></h1>
## VA是什么? ##
VirtualApp(简称:VA)是一款运行于Android系统的沙盒产品,可以理解为轻量级的“Android虚拟机”。其产品形态为高可扩展,可定制的集成SDK,您可以基于VA或者使用VA定制开发各种看似不可能完成的项目。VA目前被广泛应用于APP多开、小游戏合集、手游加速器、手游租号、手游手柄免激活、VR程序移植、区块链、移动办公安全、军队政府数据隔离、手机模拟信息、脚本自动化、插件化开发、无感知热更新、云控等技术领域。<br> **Github上代码已在2017年12月份停止更新,商业版代码在持续更新中,如需授权获得最新代码,请联系微信:10890**
## VA中的术语 ##
术语 | 解释
---- | ---
宿主 | 集成VirtualApp类库(lib)的App叫做宿主
宿主插件 | 用于在同一个手机,运行另一种ABI的宿主包,又称做插件包,扩展包,宿主插件包,宿主扩展包
虚拟App/VApp | VA的虚拟环境多开的app
外部App | 手机真实环境安装的app
<br/>
## VA技术架构 ##

VA技术一共涉及到了Android的APP层,Framework层以及Native层。
一个APP想要在Android系统上运行,必须要安装后系统才会接纳。安装到VA内部的APP实际上并没有安装到系统中,所以正常情况下是无法运行的。那如何才能让它运行呢?
答:那就只有“欺骗”系统,让系统认为已经安装。而这个“欺骗”过程就是VA Framework的核心工作内容,也是整个VA的核心技术原理。
**下面介绍下在这3个层次分别做了什么事情:**
层次 | 主要工作
---- | ---
VA Space | 由VA提供了一个内部的空间,用于安装要在其内部运行的APP,这个空间是系统隔离的。
VA Framework | 这一层主要给Android Framework和VAPP做代理,这也是VA的核心。VA提供了一套自己的VA Framework,处于Android Framework与VA APP之间。</br>1. 对于VAPP,其访问的所有系统Service均已被 `VA Framework` 代理,它会修改VAPP的请求参数,将其中与VAPP安装信息相关的全部参数修改为宿主的参数之后发送给Android Framework(有部分请求会发送给自己的VA Server直接处理而不再发送给Android系统)。这样Android Framework收到VAPP请求后检查参数就会认为没有问题。</br>2. 待Android系统对该请求处理完成返回结果时,VA Framework同样也会拦截住该返回结果,此时再将原来修改过的参数全部还原为VAPP请求时发送的。</br>这样VAPP与Android系统的交互也就能跑通了。
VA Native | 在这一层主要为了完成2个工作,IO重定向和VA APP与Android系统交互的请求修改。</br>1. IO重定向是因为可能有部分APP会通过写死的绝对路径访问,但是如果APP没有安装到系统,这个路径是不存在的,通过IO重定向,则将其转向VA内部安装的路径。</br>2. 另外有部分jni函数在VA Framework中无法hook的,所以需要在native层来做hook。
</br>
总结:
通过上面技术架构可以看到,VA内部的APP实际是跑在VA自己的VA Framework之上。
VA已将其内部APP的全部系统请求进行拦截,通过这项技术也能对APP进行全面控制,而不仅仅只是多开。并且为了方便开发者,VA还提供了SDK以及Hook SDK。
## VA进程架构 #

VA运行时有5类进程:CHILD进程,VA Host Main进程,VA Host Plugin进程,VAPP Client进程,VAServer进程。
VA为了同时支持32位APP与64位APP,需要安装2个包:一个主包,一个插件包(在本文档中主包是32位,插件包是64位)。
2个包也是必须的,因为一个包只能运行在一种模式下,要么32位,要么64位。所以对于32位的APP,VA使用32位的主包去运行,对于64位的APP,VA则使用64位的插件包去运行。
在主包中含了VA的所有代码,插件包中只有一段加载主包代码执行的代码,无其他代码。所以插件包几乎不用更新,只需要更新主包即可。
另外主包是选择用32位还是64位,可以在配置文件中修改(比如对于要上GooglePlay的用户,会修改为主包64位,插件包32位)。
**各类进程的作用与解释如下:**</br>
进程类型 | 作用
---- | ---
CHILD | 由VA Host集成的其他进程,比如:保活进程,推送进程等。
VA Host Main | VA主包的UI主界面所在的进程。默认主包是32位,插件包是64位,可在配置文件中修改切换。
VA Host Plugin | 支持64位APP的插件包所在进程。默认主包是32位,插件包是64位,可在配置文件中修改切换。
VAPP Client | 安装到VA中的APP启动后产生的进程,在运行时会将io.busniess.va:pxxx进程名修改VAPP的真实进程名。
VAServer | VA Server的所在的进程,用于处理VA中不交予系统处理的请求。比如APP的安装处理。
<br/>
## VA几乎能满足您的一切需求 ##
通过上面的技术架构,我们可以了解到VA可以对APP进行全面的控制,并且提供了Hook SDK,几乎能满足您在各个领域的一切需求:
1. 可以满足您的**双开/多开**需求
VA可以让您在同一部手机上安装多个微信/QQ/WhatsApp/Facebook等APP,实现一部手机,多个账号同时登录。
2. 可以满足您的**移动安全**需求
VA提供了一整套内部与外部的隔离机制,包括但不限于(文件隔离/组件隔离/进程通讯隔离),简单的说VA内部就是一个“完全独立的空间”。
通过VA可将工作事务与个人事务安全的隔离,互不干扰。稍作定制即可实现应用行为审计、数据加密、数据采集、数据防泄漏、防攻击泄密等移动安全相关的需求。
**2.1 应用行为审计**
通过VA提供的HOOK能力可以实现实时监测用户使用行为,将违规信息上传到服务器;并能轻易实现诸如时间围栏(在某个时间段内能否使用应用的某个功能)、地理围栏(在某个区域内能否使用应用的某个功能)、敏感关键字过滤拦截等功能需求。
**2.2 数据加密**
通过VA提供的HOOK能力可以实现对应用的全部数据/文件加密,保证数据/文件落地安全。
**2.3 数据采集**
通过VA提供的HOOK能力可以实现应用数据的实时无感上传需求,如聊天记录、转账记录等,防止事后删除无法追溯。
**2.4 数据防泄漏**
通过VA提供的HOOK能力可以实现应用防复制/粘贴、防截屏/录屏、防分享/转发、水印溯源等需求。
**2.5 防攻击泄密**
通过VA提供的应用管控能力可以将APP获取短信/通讯录/通话记录/后台录音/后台拍照/浏览历史/位置信息等隐私相关的行为完全控制在沙盒中,防止木马/恶意APP获取到用户真实的隐私数据,造成泄密等严重后果。
3. 可以满足您的**免ROOT HOOK**需求
VA提供了Java与Native的Hook能力,通过VA,您可以轻易实现诸如虚拟定位、改机、APP监控管理、移动安全等各种场景需要的功能。
4. 可以满足您的**APP静默安装**需求
VA提供了APP静默安装,静默升级,静默卸载的能力。如应用商店或游戏中心在集成VA后可以避免需要用户手动点击确认安装的操作,做到下载后立即安装到VA内,给用户带来“小程序”搬的体验,彻底避免了应用不易被用户安装上的问题。
5. 可以满足您的**APP管控**需求
您可以通过VA清楚的掌握APP访问了哪些系统API,哪些敏感数据,哪些设备信息等。比如APP是否访问了联系人,相册,通话记录,是否访问了用户的地理位置等信息。
当然,您还可以通过VA控制或者构造自定义的信息给这些APP。不仅于此,您还可以获取到APP的私有数据,比如聊天数据库等。总之通过VA提供的应用管控能力,您可以轻易控制APP的一切行为,甚至修改APP与服务器交互内容等。 </br>
6. 可以满足您的**海外市场**需求
VA实现了对Google服务的支持,以支持海外的App运行,比如Twitter、Messenger、WhatsApp、Instagram、FaceBook、Youtube等。
7. 可以满足您的**VR程序移植**需求
可以通过VA的Hook能力拦截VR设备的API,让您无需改动代码即可将VR程序移植到新的设备。
8. 可以满足您**几乎一切能想到**的需求
VA对于内部的App具有完全的监管和控制能力,几乎能满足您的一切需求!
9. 同时VA也是该技术领域**唯一一款**对外商业授权的产品
截止目前已有**上百家**授权客户在付费使用VirtualApp商业版代码,集成VirtualApp代码的APP**日启动**次数**超过2亿次**,众多安卓工程师向我们提供不同场景下的用户反馈,通过我们技术团队不断优化迭代,不断提升产品性能与兼容性!
VA的特有能力
---
- 克隆能力<br/>
可以克隆外部系统中已经安装的App,并在内部运行,互不干扰。典型应用场景为App双开。
- 免安装能力<br/>
除了克隆已安装之外,VA可以直接在内部安装(外部无感知)apk,并在内部直接运行。典型应用场景为插件化,独立应用市场等。
- 多开能力<br/>
VA不仅可以“双开”,独特的多用户模式支持用户在内部无限多开同一个App。
- 内外隔离能力<br/>
VA是一个标准的沙盒,或者说“虚拟机”,提供了一整套内部与外部的隔离机制,包括但不限于(文件隔离/组件隔离/进程通讯隔离),简单的说VA内部就是一个“完全独立的空间”。在此基础之上,稍作定制即可实现一部手机上的“虚拟手机”。当然您也可以发挥想象,定制成应用于数据加密,数据隔离,隐私保护,企业管理的应用系统。
- 对于内部App的完全控制能力<br/>
VA对于内部的App具有完全的监控和控制能力,这点在未Root的外部环境中是绝对无法实现的。
<details>
<summary>详细(下拉打开)</summary>
1. 服务请求控制,首先VA直接提供了一些服务请求的拦截,您可以在集成VA的时候方便的定制这些服务请求,包括但远不限于(App请求安装apk/App请求打开某些文件/App请求定位数据/App请求手机信息等等)<br/><br/>
2. 系统API控制,VA虚拟并实现了整个安卓系统框架,这也是VA可以免安装在内部运行apk的原理,您可以对虚拟框架的实现进行修改以动态监测分析App的行为等;除此之外,您还可模拟一些系统行为以实现一些在外部难以实现的需求(例如游戏手柄)。<br/><br/>
3. 内存读写,VA可以无需Root读写内部App进程的内存。<br/><br/>
4. 免Root调试,VA可以免Root调试(ptrace)内部的App进程,基于此您还可以实现免Root的进程注入。<br/><br/>
5. 加载任意“插件”和“行为”,VA内部的App进程由VA的框架Client端代码派生而来,所以您可以在进程的入口代码插入任何“加载”以及“控制”逻辑。这些实现都非常简单。<br/><br/>
6. 方法Hook,VA内置了一套运行于Android各个版本(直到AndroidQ)的Xposed框架以及native hook框架,基于此您可以方便的Hook任意内部App的任意Java/Native方法。可以轻松实现一个免Root的Xposed环境(有实例代码)。<br/><br/>
7. 文件控制,VA内置了完整的文件重定向,可以方便的控制内部App的文件的读写,基于此可以实现对文件的保护加密等功能。<br/><br/>
8. 注:以上控制能力均有实现代码或者实例以作参考。
</details>
VA的其他特性
---
- 高性能<br/>
进程级“虚拟机”,VA独特的实现方式让其性能几乎于原生App一致,更不需要普通虚拟机漫长的启动。
- 全版本支持<br/>
支持5.0-17.0,支持32位/64位app,支持ARM以及X86处理器。并且支持未来将更新的Android版本。
- 易扩展与集成<br/>
VA 的集成方式与普通Android库类似,即使您的App已经完成上线,您也方便的可以集成VA,享受VA带来的能力。
- 支持Google服务<br/>
提供Google服务的支持,以支持海外的App
## VA与其他技术方案对比 ##
在做企业级移动安全时,往往需要对APP进行管控,以下是列出的可能技术方案对比:
技术方案 | 原理简介 | 点评 | 运行性能 | 兼容稳定性 | 项目维护成本
---- | --- | --- | --- | --- | ---
二次打包 | 通过反编译目标APP,加入自己的控制代码,重新打包 | 1.现在的APP几乎都有加固或防篡改保护,重打包已是一件非常困难的事</br> 2.手机系统也会检测APP是否被重打包,如果重打包,会直接提示用户存在安全风险,甚至不让安装</br>3.针对每一个APP,甚至每一个版本都要深入去逆向分析,耗时耗力,难于维护 | 优秀 | 差 | 高
定制ROM | 通过定制系统源码,编译刷到指定手机 | 只能针对指定的内部手机,局限性太大,无法扩展 | 优秀 | 优秀 | 高
ROOT手机 | 通过ROOT手机,刷入xposed等类似框架 | 1.ROOT手机现在本身已是一件不太可能的事</br> 2.现实中也很难让用户能去ROOT自己的手机 | 优秀 | 差 | 高
VA | 轻量级虚拟机,速度快,对设备要求低 | 无上述风险点 | 优秀 | 优秀,有上百家企业在同时测试反馈 | 低,VA提供了API并有专业的技术团队保障项目稳定运行
<br/>
通过以上对比可以看出,VA是一款优秀的产品,并且能降低您的开发维护成本!
## 集成VA步骤 ##
第1步:在您的Application中调用VA接口```VirtualCore.get().startup()```来启动VA引擎
第2步:调用VA接口```VirtualCore.get().installPackageAsUser(userId, packageName)```将目标APP安装到VA中
第3步:调用VA接口```VActivityManager.get().launchApp(userId, packageName)```启动APP
**仅通过以上3个API就完成了基础使用,VA已屏蔽了复杂的技术细节,并提供了接口API,让您的开发变得很简单!**
## VA的兼容稳定性 ##
VA已被**上百家**企业进行了广泛测试,包含**数十家上市公司高标准**的测试及反馈,几乎涵盖了海内外的各种机型设备和场景!
为您的稳定运行提供了充分的保障!
截止目前,支持的系统版本:
系统版本 | 是否支持
---- | ---
5.0 | 支持
5.1 | 支持
6.0 | 支持
7.0 | 支持
8.0 | 支持
9.1 | 支持
10.0 | 支持
11.0 | 支持
12.0 | 支持
13.0 | 支持
14.0 | 支持
15.0 | 支持
16.0 | 支持
17.0 | 支持
<br/>
支持的APP类型:
APP类型 | 是否支持
---- | ---
32位APP | 支持
64位APP | 支持
<br/>
支持的HOOK类型:
Hook类型 | 是否支持
---- | ---
Java Hook | 支持
Native Hook | 支持
支持的CPU类型:
Hook类型 | 是否支持
---- | ---
ARM 32 | 支持
ARM 64 | 支持
<br/>
## 集成VA遇到问题如何反馈? ##
购买授权后我们会建立微信群,有任何问题可以随时反馈给我们,并根据优先级在第一时间处理!
## VA开发文档 ##
VA开发文档请参考:[开发文档](doc/VADev.md)
授权说明
------
VirtualApp虚拟机技术归属于:山东盒一网络科技有限公司(原:济宁市罗盒网络科技有限公司),于2015年至2026年申请多项VirtualApp知识产权,`受中华人民共和国知识产权法保护`。当您需要使用Github上的代码时,**请购买商业授权**,获取商业授权后将可以收到最新VirtualApp商业版全部源代码。上百家授权客户在付费使用VirtualApp商业版代码,集成VirtualApp代码的APP日启动次数超过2亿次,众多安卓工程师向我们提供不同场景下的用户反馈,通过我们技术团队不断优化迭代,VirtualApp商业版代码性能更好、兼容性更高。`当您的公司获取授权后,将成为其中一员,享受这些不断迭代完善后的技术成果。并可以和我们的授权客户进行运营、技术及商业上的互动合作。`
<br/>
负责人:张总 <br/>
微信:10890 <br/>
<br/>
严重声明
------
您如果未经授权将VirtualApp用于**内部使用、商业牟利或上传应用市场**,我们将取证后报警(侵犯著作权罪)或起诉,这将对您所属公司造成刑事责任及法律诉讼,影响到您公司的商誉和投资。`购买商业授权为您节省大量开发、测试和完善兼容性的时间,让您更多时间用于创新及盈利。`罗盒科技已在2020年报警和起诉了一些个人及公司。<br/>
**为响应国家对于知识产权的保护号召!凡举报自己所在公司或其他公司未经授权,违法使用VirtualApp代码开发产品的,一经核实给予现金奖励。我们会对举报人身份保密!举报联系微信:10890**
<br/>
商业版主要更新
------
1. 兼容最新Android 17.0
2. 支持Binder拦截,不再使用动态代理
3. 支持Seccomp-Bpf拦截
4. 不易被杀毒软件误报
5. 框架优化,性能大幅提升
6. 手机系统及APP兼容性大幅提升
7. 完美运行Google服务
8. 支持运行纯64位App
9. 内置`XPosed Hook`框架
10. 增加定位模拟代码
11. 增加改机代码
12. 其他600+项问题的修复和改进,详情请见下表
<br>
2017年-2026年商业版代码更新详细
------
**2026年3月5号 至 2026年 3月16号 商业版代码更新内容**
663、17.0 beta2上的报错修复<br/>
662、 Seccomp-bpf only相关的调整<br/>
661、反射代码调整<br/>
**2026年2月12号 至 2026年 3月4号 商业版代码更新内容**
660、增加对部分加固的支持<br/>
659、 fp指针调整避免某些App无法打开<br/>
<details>
<summary>2017年 12月 至 2026年 2 月 11 日 商业版代码更新内容(下拉打开)</summary> <br/>
**2026年2月1号 至 2026年 2月11号 商业版代码更新内容**
658、 修复NativeEngine.onGetCallingUid在VisitRoots的时候crash<br/>
657、 Secomp-Bpf开启后,执行execve时支持fd<br/>
656、fix getFromLocation crash on 15.0+<br/>
**2025年12月31号 至 2026年 1月30号 商业版代码更新内容**
655、增强环境检测方面的处理<br/>
654、.0上AdvancedProtectionService以及ISupervisionManager适配<br/>
653、fix AttributionSource子类验证报错:AttributionSource should be unparceled during a binder<br/>
652、fix ParceledListSlice->getList返回null<br/>
651、对于一些没有权限的函数调用进行处理<br/>
650、maps处理方式更新<br/>
649、对fp指令范围进行判断,避免crash<br/>
**2025年12月19号 至 2025年 12月30号 商业版代码更新内容**
648、从处理openat2与faccessat2,seccomp等调用<br/>
647、适配APP中对seccomp-bpf的调用<br/>
646、处理某些应用因为检测打不开<br/>
**2025年12月3号 至 2025年 12月18号 商业版代码更新内容**
645、某些svc处理<br/>
644、系统路径调整<br/>
643、maps调整<br/>
**2025年11月12号 至 2025年 12月2号 商业版代码更新内容**
642、新功能:Native层增加机型模拟支持<br/>
641、支持对应用强制开启机型模拟/强制使用真机信息<br/>
640、seccomp-bpf对ptrace的一些处理<br/>
639、修复执行Java命令时进程可能崩溃的问题<br/>
638、修复其他几处崩溃的问题<br/>
**2025年10月29号 至 2025年 11月11号 商业版代码更新内容**
637、新功能:Seccomp-Bpf下增加了对execve的调用支持<br/>
636、处理了与反射相关的几个地方<br/>
635、对几个内存文件的chmod处理<br/>
**2025年10月11号 至 2025年 10月28号 商业版代码更新内容**
634、修复IBatteryStats相关的空指针<br/>
**2025年9月18号 至 2025年 10月10号 商业版代码更新内容**
633、处理onNewIntent()中的activity Referrer<br/>
632、适配NotificationProviderPublic<br/>
631、修复15.0+上isDirectlyHandlingTransaction()的多线程处理<br/>
630、隐藏Libcore.os的反射获取<br/>
629、binderproxy模式支持IBatteryStats<br/>
628、适配某些加固APP<br/>
**2025年9月2号 至 2025年 9月17号 商业版代码更新内容**
627、Android 16kb page size 适配<br/>
626、fix蓝牙几个代理类的代码错误<br/>
625、处理某些APP在Application->attach中获取到宿主Application的场景<br/>
624、处理Activity referrer相关的<br/>
623、处理processOutsideIntent时intent包含vapp class的情况<br/>
622、针对某些oppo 13.0机型适配<br/>
621、处理调用ArrayUtils.indexOf时,有的地方按0开始起步有的地方按1开始起步导致异常,都统一为1<br/>
620、适配LockSettings/WifiScanner/NetworkScoreManager/WifiManager/SensitiveContentProtectionManager等几个manager<br/>
619、新功能模式下BinderProxyInjectManager.addInjector增加判断,避免有些因为class不存在导致crash<br/>
618、新功能模式下支持Instrumentation注入<br/>
617、增加对native层获取宿主信息的处理<br/>
**2025年8月9号 至 2025年 9月1号 商业版代码更新内容**
616、增加对setxattr/lsetxattr/bind/connect/syscall等几个libc api处理<br/>
615、增加对execve启动的进程实现inline hook<br/>
614、增加可对application中的全部路径模拟为系统安装路径<br/>
613、增加对logcat等命令的过滤处理<br/>
612、修复app 崩溃/anr等系列问题<br/>
611、修复ParceledListSlice.getList返回Null的问题<br/>
**2025年7月22号 至 2025年 8月8号 商业版代码更新内容**
610、增加对INetworkScoreService的处理<br/>
609、修复新功能在release下的一些错误<br/>
608、修复某些手机上新功能无法打开APP <br/>
607、修复Tethering相关的crash
**2025年7月3号 至 2025年 7月21 商业版代码更新内容**
606、与新功能相关的路径处理<br/>
605、一些bug处理<br/>
**2025年5月1号 至 2025年 7月2号 商业版代码更新内容**
604、新功能开发:基于拦截Binder的方式来实现对系统AIDL调用的拦截。通过这种方式可不再使用动态代理,对于稳定性将会有比较大提升<br/>
603、16.0最新版本继续适配<br/>
**2025年4月16号 至 2025年 4月30号 商业版代码更新内容**
602、对Android 16.0 beta 4 适配<br/>
601、完善seccomp-bpf重定向相关的功能<br/>
600、增加配置可以让APP只使用seccomp-bpf,不使用inline hook<br/>
599、将target sdk升级到34<br/>
598、修复va core进程由于client为空导致的crash<br/>
597、启动进程的时候增加重试,避免在某些机型上由于进程死亡太频繁导致无法启动进程<br/>
596、对于某类型加固后是否需要安装provider的部分改为动态判断<br/>
595、修复demo在某些设备上由于title为null导致的crash<br/>
**2025年3月27号 至 2025年 4月15号 商业版代码更新内容**
594、修复GMS无法调起登录的问题<br/>
593、增加对IInputMethodManagerGlobalInvoker的hook<br/>
592、修复工作空间中无法打开VAPP的问题<br/>
591、适配微信8.0.57<br/>
**2025年3月20号 至 2025年 3月26号 商业版代码更新内容**
590、增加对AppSearchManager的适配<br/>
589、增加对DomainVerificationManager的适配<br/>
588、增加对SystemUpdateManager的适配<br/>
587、修复多个进程同时启动同一个进程时的crash问题<br/>
**2025年2月28号 至 2025年 3月19号 商业版代码更新内容**
586、seccomp 相关的调整<br/>
585、修复微信在14.0+上开启seccomp-bpf无法打开的问题<br/>
584、新增对StorageStatsManager的适配<br/>
583、UsageStatsManager相关API适配<br/>
**2025年2月11号 至 2025年 2月27号 商业版代码更新内容**
582、适配最新版微信<br/>
**2025年1月24号 至 2025年 2月10号 商业版代码更新内容**
581、对IO进行inline hook时暂停所有Java线程,避免冷启动时因多线程导致的低概率crash<br/>
**2025年1月8号 至 2025年 1月23号 商业版代码更新内容**
580、installer静默安装部分适配<br/>
579、修复静态广播收不到消息<br/>
578、修复pending intent数据丢失问题<br/>
577、input manager 14.0+上的适配<br/>
576、蓝牙适配<br/>
575、queryStatsForPackage适配<br/>
574、修复有些手机上显示不出应用列表<br/>
573、其他一些小问题适配<br/>
**2024年12月21号 至 2025年 1月7号 商业版代码更新内容**
572、Seccomp-bpf支持32位<br/>
571、修复某些情况下路径多次重定向的问题<br/>
570、修复抖音人脸识别时可能白屏的问题<br/>
569、去掉几年前为抖音打不开做的一些修改<br/>
**2024年12月7号 至 2024年 12月20号 商业版代码更新内容**
568、修复startIntentSenderFoeResult无法工作的问题<br/>
567、修复GMS由于StatsManager无法hook导致crash的问题<br/>
**2024年11月27号 至 2024年 12月6号 商业版代码更新内容**
566、修复release打包后IJobService中的onNetworkChanged等几个函数被混淆导致找不到crash的问题<br/>
565、修复由于BluetoothAdapter.sService为null导致IBluetooth hook失败的问题<br/>
564、修复packagesettings被覆盖的问题<br/>
563、删除getCallingUid()中的缓存代码<br/>
562、Seccomp条件判断时处理Application.name为Null的情况<br/>
561、AGP升级到8.2.0<br/>
**2024年11月12号 至 2024年 11月26号 商业版代码更新内容**
560、重定向路径调整,区分/data/data/com.xxx以及/data/user/0/com.xxx,使其更符合APP使用实际使用的路径<br/>
559、适配fixupAppDir<br/>
558、reverseRedirectedPath增加检查,防止路径多次重复转换<br/>
557、修复splitNames信息缺失导致部分应用无法正常使用<br/>
556、补充一批normal权限,解决部分APP因为权限丢失无法正常使用的问题<br/>
**2024年10月31号 至 2024年 11月11号 商业版代码更新内容**
555、新功能:增加Seccomp-Bpf支持,实现更底层的拦截<br/>
554、增加对部分加固APP的支持<br/>
553、系统OTA升级时对Split Apks重新安装<br/>
**2024年10月14号 至 2024年 10月29号 商业版代码更新内容**
552、所有手机package.ini版本升级到7,避免某些情况下出现应用丢失<br/>
551、修改Demo包名<br/>
**2024年9月15号 至 2024年 10月13号 商业版代码更新内容**
550、移除对Sandhook的依赖<br/>
549、移除几处hook,避免部分机型crash<br/>
548、移除未使用到的goAsync,避免ANR<br/>
547、移除部分对1.X的升级处理废弃代码<br/>
546、修复手机系统升级到13.0+上后,应用列表消失的问题<br/>
**2024年8月23号 至 2024年 9月14号 商业版代码更新内容**
545、修复IO重定向中一系列函数未对dfd正确处理<br/>
**2024年8月9号 至 2024年 8月22号 商业版代码更新内容**
544、修复Native的一个空指针问题<br/>
543、修复Native的某个函数由于栈上随机数导致判断出错<br/>
542、修复unity中的检测问题<br/>
541、修复publishService crash问题<br/>
540、修复getPid死循环崩溃问题<br/>
**2024年8月3号 至 2024年 8月8号 商业版代码更新内容**
539、修复微信等APP因为webview导致的crash问题<br/>
**2024年7月19号 至 2024年 8月2号 商业版代码更新内容**
538、修复sandhook崩溃问题<br/>
537、修复sandhook hook不起效问题<br/>
536、替换sandhook中inline hook部分<br/>
535、修复android.permission.DETECT_SCREEN_CAPTURE权限导致的crash问题<br/>
534、修复静态广播导致的crash问题<br/>
533、修复百度搜索crash的问题<br/>
532、修复ResolveActivity跳转到外部应用时没有过滤export为false的场景导致crash<br/>
531、修复在某些华为设备上微信白屏的问题<br/>
530、修复微信流量异常的问题<br/>
529、class_linker适配android 15<br/>
528、修复 readlinkat参数问题导致的crash<br/>
527、解决某些unity路径检测的问题<br/>
**2024年7月3号 至 2024年 7月18号 商业版代码更新内容**
526、适配了几十个API,很大程度提升了稳定性<br/>
525、调整stopService不再走initProcess流程,解决了某些情况下的死锁问题<br/>
524、修复 startprocess启动App后再次进入VActivityManagerService导致死锁的问题<br/>
523、修复锁屏/亮屏广播引起的crash问题<br/>
**2024年6月17号 至 2024年 7月2号 商业版代码更新内容**
522、AttributionSoure中的uid调整 <br/>
521、修复微信注册,找回账号等几个界面白屏的问题<br/>
**2024年6月4号 至 2024年 6月16号 商业版代码更新内容**
520、将内置的Java hook框架SandHook调整为可选配置 <br/>
519、修复VA_ENABLE_EXT_FULL_SOURCE_CODE功能选项开启时,加载so错误的问题<br/>
**2024年5月8号 至 2024年 6月3号 商业版代码更新内容**
518、修复微信在鸿蒙4.0+上无法使用的问题 <br/>
517、调整VA demo package name<br/>
**2024年4月20号 至 2024年 5月7号 商业版代码更新内容**
516、适配华为账户登录和授权登录等功能 <br/>
515、适配荣耀账户登录和授权登录等功能 <br/>
514、修复Service中getApplicationContext返回Null的问题<br/>
**2024年4月4号 至 2024年 4月19号 商业版代码更新内容**
513、修复link&unlink参数没有处理重定向的问题 <br/>
512、修复AutoFillManagerStub未生效问题 <br/>
511、适配高版本ShadowJobService <br/>
**2024年3月7号 至 2024年 4月2号 商业版代码更新内容**
510、修复数款游因为戏二次注册provider导致无法打开 <br/>
**2024年2月19号 至 2024年 3月6号 商业版代码更新内容**
509、修通知跳转Crash <br/>
508、AMS API适配<br/>
507、DevicePolicyManager API适配<br/>
506、BlueTooth API适配<br/>
505、修复抖音crash问题<br/>
**2024年1月25号 至 2024年 2月18号 商业版代码更新内容**
504、修复抖音在部分手机无法打开的问题<br/>
503、修复抖音在部分手机运行一小段时间后崩溃的问题<br/>
502、修复抖音在部分手机crash后一直打不开的问题<br/>
501、修复抖音极速版在部分手机无法打开的问题<br/>
500、修复抖音极速版在部分手机运行一小段时间后崩溃的问题<br/>
499、修复抖音极速版在部分手机crash后一直打不开的问题<br/>
498、UserManager相关API适配<br/>
497、PackageManager相关API适配<br/>
496、Notification相关API适配<br/>
495、FingerprintManager相关API适配<br/>
**2024年1月5号 至 2024年 1月24号 商业版代码更新内容**
494、Activity Token获取适配<br/>
493、适配最新版微信<br/>
**2023年12月21号 至 2024年 1月4号 商业版代码更新内容**
492、适配libc可能没有R权限的情况<br/>
**2023年12月5号 至 2023年 12月20号 商业版代码更新内容**
491、修复储存空间异常的问题<br/>
**2023年10月24号 至 2023年 12月4号 商业版代码更新内容**
490、取消对Xposed依赖<br/>
489、适配最新版微信<br/>
488、适配setCompatibilityVersion<br/>
487、取消hookGetCallingUid对xposed的依赖<br/>
486、蓝牙适配<br/>
485、AddToDisplayAsUser处理<br/>
478、PendingIntent适配<br/>
484、MediaRecorder适配<br/>
483、处理dispatchVolumeKeyEvent API<br/>
482、修复AttributionSource cast crash<br/>
481、增加配置:是否优先使用外部app<br/>
480、修复启动前台service crash<br/>
479、修复14.0上renameat太短导致hook后覆盖其他函数的问题<br/>
**2023年10月8号 至 2023年 10月23号 商业版代码更新内容**
478、修复Annotation依赖包为空的问题<br/>
477、修复抖音等APP由于动态框架导致无法打开Activity的问题<br/>
476、修复纯Java APP在64位下以32位模式安装的问题<br/>
475、修复了13.0+上的class linker偏移检测问题<br/>
474、调整默认使用isUseRealDataDir模拟真实路径<br/>
473、JobServiceStub适配<br/>
472、IO重定向增加对renameat2的hook<br/>
471、修复APK安装模式下某些APP拍照黑屏<br/>
470、修复APK安装模式下微信小程序无法使用的问题<br/>
**2023年9月16号 至 2023年 10月7号 商业版代码更新内容**
469、移除已经废弃的虚拟定位代码<br/>
468、修复WhatsApp 来电通知bug<br/>
467、修复GMS相关问题<br/>
466、修复WhatsApp无法跳过短息验证界面问题<br/>
465、修复WhatsApp等部分APP启动后界面白屏问题<br/>
464、适配Alarms 相关API
**2023年9月6号 至 2023年 9月15号 商业版代码更新内容**
463、14.0上JobScheduler API适配<br/>
462、修复从sdcard上安装时signature可能获取的可能不是最旧的问题<br/>
461、LocaleManager适配<br/>
**2023年8月16号 至 2023年 9月5号 商业版代码更新内容**
460、14.0上JobScheduler适配<br/>
459、修复API broadcastIntentWithFeature<br/>
458、修复WhatsApp验证跳转的问题<br/>
457、内部Provider访问适配<br/>
**2023年8月2号 至 2023年 8月15号 商业版代码更新内容**
456、修复Twitter白屏的问题<br/>
455、修复ContentProvider在12.0+上的适配问题<br/>
454、修复微信在nova9z上崩溃的问题<br/>
453、修复微信等APP发送定位时黑屏的问题<br/>
452、编译SDK版本升级到14.0<br/>
**2023年7月13号 至 2023年 8月1号 商业版代码更新内容**
451、适配12.0+上蓝牙相关的10来个API<br/>
450、适配UserManager相关的10来个API<br/>
**2023年6月30号 至 2023年 7月12号 商业版代码更新内容**
449、修复JobService unbind崩溃问题<br/>
448、修复JobService persisted崩溃问题<br/>
**2023年5月26号 至 2023年 6月29号 商业版代码更新内容**
447、修复部分APP无法录音的问题<br/>
446、修复从Sdcard安装APK失败的问题<br/>
445、更改VA Demo包名<br/>
**2023年4月28号 至 2023年 5月25号 商业版代码更新内容**
444、适配Android 14.0<br/>
**2023年3月18号 至 2023年 4月27号 商业版代码更新内容**
443、修复GMS支持,修复各种crash,权限等问题<br/>
442、修复GooglePlay无法打开的问题<br/>
441、修复GooglePlay无法登录Google账号的问题<br/>
440、修复Youtube,WhatsApp等APP无法登录Google账号的问题<br/>
439、修复Facebook无法打开的问题<br/>
**2023年2月17号 至 2023年 3月17号 商业版代码更新内容**
438、修setPictureInPictureParams crash<br/>
**2023年1月27号 至 2023年 2月16号 商业版代码更新内容**
437、修复mOpPackageName空指针<br/>
436、修复13.0上PackageManager几个flags参数导致的crash<br/>
435、修复VAPP返回主页的Intent crash<br/>
434、TelecomManagerStub API适配<br/>
**2022年12月9号 至 2023年 1月26号 商业版代码更新内容**
433、修复PendingIntent flag处理问题<br/>
**2022年11月9号 至 2022年 12月8号 商业版代码更新内容**
432、修复Facebook在某些情况下无法启动的问题<br/>
431、启动外部App时,排除对VA自身的判断<br/>
430、修复queryIntentServices过滤规则<br/>
**2022年10月9号 至 2022年 11月8号 商业版代码更新内容**
429、修复当VA_AUTHORITY_PREFIX不等于包名时找不到Provider的问题:"Failed to find provider info ..."<br/>
428、getPermissionActivityIntent处理<br/>
427、修复特殊情况下,检查权限无限弹窗<br/>
426、强调Intent使用外部通讯录(如果被第三方接管,建议使用外部可见)<br/>
425、新增几个Java API适配<br/>
424、修复修复部分后台Activity跳转问题<br/>
423、修复在10.0+上后台Activity无法启动的问题<br/>
**2022年 8月20号 至 2022年 10月8号 商业版代码更新内容**
422、新功能:增加启动插件Activity代理,绕过后台5s限制<br/>
421、修复Provider在10.0+上crash的问题<br/>
420、适配最新版微信<br/>
419、适配克隆时不显示sdcard上的APK<br/>
418、适配12.0+上PendingIntent Flags必须为FLAG_UPDATE_CURRENT/FLAG_IMMUTABLE<br/>
417、修复MediaProvider因为ACCESS_MEDIA_LOCATION 权限检查导致的crash<br/>
416、修复12.0+上debug模式下hook失败的问题<br/>
415、适配在Multi User账户下crash的问题<br/>
414、适配由于后台限制导致VA Core启动插件中Activity失败的问题<br/>
**2022年 7月27号 至 2022年 8月19号 商业版代码更新内容**
413、Android 13.0继续适配<br/>
412、主版调整为64bit<br/>
411、修复某些华为手机上App无法打开的问题<br/>
410、修复OPPO 13.0上无法打开应用的问题<br/>
409、修复百度语音TTS的调用问题<br/>
408、修复数据隔离后仍可以访问sdcard根目录的问题<br/>
407、修复鸿蒙手机上的崩溃问题<br/>
406、修复Debug模式下Hook失效问题<br/>
405、添加对BinderInvocationStub的混淆处理,避免混淆后崩溃问题<br/>
404、修复Native层调用free函数可能导致崩溃的问题<br/>
403、修复微信由于虚拟文件系统导致的崩溃问题<br/>
**2022年 7月9号 至 2022年 7月26号 商业版代码更新内容**
402、Android 13.0适配<br/>
401、修复开启虚拟储存后文件路径的处理问题<br/>
400、修复12.0上Notification没有提示的问题<br/>
**2022年 4月28号 至 2022年 5月31号 商业版代码更新内容**
399、修复onGetCallingUid hook引起的崩溃问题<br/>
398、修复微信8.0.22启动崩溃的问题<br/>
**2022年 4月5号 至 2022年 4月27号 商业版代码更新内容**
397、去掉sandhook中一些多余的hook代码,避免某些APP无法启动<br/>
**2022年 3月13号 至 2022年 4月5号 商业版代码更新内容**
396、新增功能:在VA中实现内置media provider,以支持媒体库隔离等需求<br/>
395、修复微信/QQ使用语音时崩溃<br/>
394、蓝牙崩溃问题适配<br/>
393、增加部分Log<br/>
392、删除一些无用代码<br/>
**2022年 1月22号 至 2022年 3月12号 商业版代码更新内容**
391、修复华为手机上StorageManager没有被hook的问题<br/>
390、修复最新版微信无法从SD卡启动的问题<br/>
389、PackageInfo中增加对requestedPermissionsFlags字段的处理<br/>
388、新增VSettingsProvider,避免内置应用没有权限操作settings provider导致异常<br/>
387、修复微信等APP启动黑屏,ANR等问题<br/>
386、新增对MediaProvider的hook<br/>
385、新增对插件shareUserId的处理,从而可以配置将插件的数据放到主包中<br/>
384、新增可以配置是否将Tinker禁用<br/>
383、修复Android 12权限处理适配<br/>
**2021年 12月30号 至 2022年 1月21号 商业版代码更新内容**
382、Sandhook适配12.0<br/>
381、修复Sandhook在部分11.0上不生效的问题<br/>
380、增加编译选项VA_FULL_EXT控制是否将VA源码编译到插件,满足加固场景。<br/>
**2021年 11月24号 至 2021年 12月29号 商业版代码更新内容**
379、Android 12.0第一轮适配已完成<br/>
378、Demo App在11.0上增加文件权限检测<br/>
377、修复静态广播接收者在独立进程无法接收广播的问题<br/>
376、修复微信第一次登录可能crash问题<br/>
375、修复部分APP无法显示头像问题<br/>
374、修复在部分OPPO手机上打不开问题<br/>
**2021年 9月21号 至 2021年 11月23号 商业版代码更新内容**
373、修复WhatsApp在360手机上黑屏问题<br/>
372、增加VA内外广播通信测试demo<br/>
371、修复抖音极速版兼容性问题<br/>
370、修复readlinkat返回值精度<br/>
369、修复从外部安装app,没有引用org.apache.http.legacy的问题<br/>
368、修复华为Nova 5i, 64位主包兼容性<br/>
367、修复11.0上外部存储重定向问题<br/>
366、修复11.0上GMS登录问题<br/>
365、修复11.0 部分APP读写sdcard报错的问题<br/>
364、修复va core进程死亡后,APP可能打不开的问题<br/>
363、增加未安装插件时无法启动的错误日志<br/>
**2021年 8月22号 至 2021年 9月20号 商业版代码更新内容**
362、横屏重新适配<br/>
361、修复部分APP通过file协议安装后无法打开的问题<br/>
360、修复传递给JobIntentService中Intent数据丢失问题<br/>
359、修复JobIntentService第二次调用无法工作的问题<br/>
358、修复华为手机上某些APP奔溃的问题<br/>
357、修复小米手机上游戏登录问题<br/>
356、修复某些应用加固后无法打开的问题<br/>
355、增加对关联启动权限检测<br/>
354、targetSdk 30适配<br/>
353、修复targetSdk为30时,某些应用无法上网的问题<br/>
352、修复targetSdk为30时,sdcard无法访问的问题<br/>
351、编译脚本中使用cmake替换gradle task<br/>
350、移除过时文档<br/>
**2021年 8月7号 至 2021年 8月21号 商业版代码更新内容**
349、调整优化gradle脚本<br/>
348、hidedenApiBypass支持Android R+<br/>
347、targetSdk 30 支持<br/>
346、修复VIVO系统服务bug<br/>
345、修复VIVO手机无法使用摄像头的bug<br/>
344、修复dex加载异常状态的获取<br/>
343、修复Android R上libart.so路径问题<br/>
342、修复Andoid Q+ 删除通知的bug<br/>
341、修复APN uri的权限检查<br/>
340、修复Android R暂停恢复线程状态<br/>
339、修复debug模式下部分hook失效情况<br/>
338、修复hook在R之后的一些bug<br/>
**2021年 4月25号 至 2021年 8月6号 商业版代码更新内容**
337、修复探探部分手机不能上传头像问题<br/>
336、修复Android 10 华为设备IO重定向问题<br/>
335、调整横竖屏逻辑,减少异常情况发生<br/>
334、添加Activity生命周期的回调接口<br/>
333、修复Android 12的广播问题<br/>
332、修复微信部分界面状态异常的BUG<br/>
331、修复Outlook、One drive、Teams、Zoom等海外app的支持<br/>
330、修复Android 11 一个权限请求BUG<br/>
329、修复部分cocos2d引擎只显示半屏的问题<br/>
328、修复微信在多用户下不能发送文件的问题<br/>
327、split apk 支持<br/>
326、Android S 支持<br/>
**2021年 2月24号 至 2021年 4月24号 商业版代码更新内容**
325、适配多用户环境<br/>
324、修复新版微信的兼容问题<br/>
323、兼容更多企业级加固<br/>
322、支持VAPP设置电源优化<br/>
321、修复缺失权限声明<br/>
320、修复Android 11上android.test.base库的引用<br/>
319、优化ext插件判断<br/>
318、优化安装时ABI的选择<br/>
317、修复Google文档在Android 11上崩溃的问题<br/>
**2020年 10月15号 至 2021年 2月23号 商业版代码更新内容**
316、解决新版爱加密、邦邦等加固的兼容性<br/>
315、修复WhatsApp不显示冷启动Splash的问题<br/>
314、优化对系统app的识别<br/>
313、完善多用户环境下的支持<br/>
312、解决ext插件部分情况下卡死的问题<br/>
311、支持Google Play在容器中下载APP<br/>
310、修复Android 11 QQ无法显示图片的问题<br/>
309、兼容Android 11运行Google Service<br/>
308、解决Android 11无法运行chromium<br/>
307、支持Hook @CriticalNative Method<br/>
306、修复JDK 13无法编译运行的问题<br/>
305、修复Service部分情况可能crash的问题<br/>
304、修复Android 11无法加载外部存储私有数据的问题<br/>
303、修复低版本app无法使用org.apache.http.legacy的问题<br/>
302、修复某些情况系统任务栈只显示最后一个的问题<br/>
301、完善不同平台的构建脚本<br/>
300、修复Android 11无法读取obb的问题<br/>
299、解决软件无法向后兼容的问题<br/>
298、重构VApp安装框架<br/>
297、重构virtual文件系统<br/>
296、修复某些情况下WebView无法启动的问题<br/>
295、修复VApp卸载重装的BUG<br/>
294、修复LOL手游的登录异常问题<br/>
293、支持安装Splits APK<br/>
292、支持动态配置主包环境<br/>
291、修复32位QQ调用64位微信卡顿的问题<br/>
290、修复Messenger调用Facebook崩溃的问题<br/>
289、优化对Google服务框架的支持<br/>
288、实现新的扩展包同步机制<br/>
287、修复Android 11正式版的异常问题<br/>
286、添加系统Package缓存,优化性能<br/>
285、修复disabled组件还能被PMS查询的BUG<br/>
284、修复微信部分界面Launch行为异常的问题<br/>
283、修复ContentProvider.getCallingPackage返回Host包名的BUG<br/>
282、修复uid虚拟化的BUG,解决部分app权限检查失败的问题<br/>
281、重写PendingIntent, IntentSender的实现<br/>
280、优化进程管理,修复长期存在的概率性进程死锁问题<br/>
279、重写Service实现,Service生命周期更准确,不容易被杀死<br/>
**2020年 9月13号 至 2020年 10月15号 商业版代码更新内容**
278、修复 64 位 App 无法调用 32 位 App 的问题<br/>
277、修复 Android R 加载 HttpClient 的问题 <br/>
276、修复 Android R debug 模式下的崩溃问题<br/>
**2020年 8月23号 至 2020年 9月12号 商业版代码更新内容**
275、添加缺失的 service hook<br/>
274、修复百度翻译无法启动的问题 <br/>
273、修复 GP 下载的 split app 无法启动的问题<br/>
**2020年 7月10号 至 2020年 8月22号 商业版代码更新内容**
272、修复 Service 创建<br/>
271、添加 NotificationService 缺失的 Hook<br/>
270、修复 Yotube 崩溃<br/>
**2020年 5月19号 至 2020年 7月9号 商业版代码更新内容**
269、初步适配 Android 11 beta1<br/>
268、修复小红书多开闪退的问题<br/>
267、修复某些 App 多开报“应用签名被篡改”的问题<br/>
**2020年 4月24号 至 2020年 5月18号 商业版代码更新内容**
266、修复 sh 调用错误<br/>
265、修复 9.0 以上最新版 Facebook 无法登陆的问题<br/>
264、帮助企业微信修复启动虚拟存储的情况下无法拍照的问题<br/>
263、修复某些情况下 64位 app 打不开 Activity 的问题<br/>
**2020年 3月24号 至 2020年 4月23号 商业版代码更新内容**
262、修复 Vivo 设备提示安装游戏 SDK 的问题<br/>
261、修复 Android Q 无法加载部分系统 so 的问题<br/>
260、修复华为设备微博未响应<br/>
259、忽略不必要的权限检查造成的崩溃<br/>
258、修复 WPS 分享文件崩溃的问题<br/>
257、部分 10.0 设备的闪退问题<br/>
**2020年 3月7号 至 2020年 3月23号 商业版代码更新内容**
256、修复微信同时打开两个页面问题<br/>
255、修复微信登陆成功但是返回登陆页面的问题<br/>
254、修复最新版 QQ 无法下载附件的问题<br/>
253、更新 SandHook 版本<br/>
252、修复 9.0 以上安装未签名Apk问题 <br/>
251、修复 10.0 的定位问题<br/>
**2020年 1月16号 至 2020年 3月6号 商业版代码更新内容**
250、调整 lib 重定向逻辑<br/>
249、修复三星 10.0 系统上的崩溃问题<br/>
248、修复 release build 的 hook 异常<br/>
247、增加 SandHook 的 proguard 规则<br/>
246、修复对部分 App 中 VirtualApk 的兼容问题 <br/>
245、修复 VA 内部请求安装 apk 失败的问题<br/>
**2019年 12月26号 至 2020年 1月15号 商业版代码更新内容**
244、修复 Android Q 遗漏的 hook<br/>
243、禁用 Emui10 的 AutoFill<br/>
242、增加新 api 结束所有 activity<br/>
**2019年 12月15号 至 2019年 12月25号 商业版代码更新内容**
241、修复 Emui10 上企业微信等 App 无法启动的问题<br/>
240、修复在 4.x 可能导致的崩溃<br/>
239、升级 SandHook 修复对 Thread 类的 Hook<br/>
238、修复 Android Q 某些接口导致的权限问题<br/>
**2019年 11月20号 至 2019年 12月14号 商业版代码更新内容**
237、修复 Notification 缓存导致的崩溃<br/>
236、修复高版本 Notification 的 classloader 问题<br/>
**2019年 11月9号 至 2019年 11月19号 商业版代码更新内容**
235、修复 Android 5.x 的 ART Hook <br/>
234、修复 ART Hook 可能导致的死锁问题 <br/>
**2019年 11月2号 至 2019年 11月8号 商业版代码更新内容**
233、修复 WPS, 网易邮箱等在 Q 设备上崩溃的问题 <br/>
232、修复汤姆猫跑酷在部分 Q 设备上崩溃的问题 <br/>
231、修复 QQ 在部分 Q 设备上崩溃的问题 <br/>
**2019年 10月25号 至 2019年 11月1号 商业版代码更新内容**
230、修复克隆 Google Play 下载的 64位 App<br/>
229、修复企业微信 <br/>
228、修复 Telegram <br/>
**2019年 10月8号 至 2019年 10月24号 商业版代码更新内容**
227、修复 Android P 下 AppOspManager 的异常 <br/>
226、添加 Android P 下 ActivityTaskManager 丢失的 Hook <br/>
225、修复 Android P 下 Activity Top Resume 异常 <br/>
224、支持在系统多用户模式下运行! <br/>
**2019年 10月8号 商业版代码更新内容**
223、修复Android P 以上内部 app 返回桌面异常的问题 <br/>
222、64位分支支持 Android Q <br/>
**2019年 9月20号 至 2019年 10月7号 商业版代码更新内容**
221、修复安装在扩展插件中的 apk 无法正确显示图标和名称的问题 <br/>
220、修复 twitter 无法打开的问题 <br/>
219、正式兼容 Android Q 正式版! <br/>
218、修复 Android Q 某些 Activity 无法再次打开的问题 <br/>
217、初步适配 Android Q 正式版 <br/>
216、修复数个64位分支的 Bug <br/>
215、新增加支持32位插件的64位分支,该分支支持32位旧设备并且64位设备在32位插件的情况下可以支持32位旧应用 <br/>
**2017年 12月 至 2019年 7月 30 日 商业版代码更新内容**
214、改进 App 层提示信息 <br/>
213、改进部分编码 <br/>
212、修复从宿主向插件发送广播的方法 <br/>
211、兼容最新版 gradle 插件 <br/>
210、增加广播命名空间以避免多个使用 VA 技术的 App 互相干扰 <br/>
209、修复 IMO 打不开的问题 <br/>
208、修复部分 ContentProvider 找不到的问题 <br/>
207、支持纯32位模式,以兼容老设备 <br/>
206、初步支持纯64位模式,以应对8月份的谷歌市场的策略变化 <br/>
205、适配到 Android Q beta4 <br/>
204、修复了货拉拉无法安装的问题<br/>
203、优化了64位apk的判定逻辑<br/>
202、修复配置网络证书的 App 的联网<br/>
201、重构组件状态管理<br/>
200、优化 MIUI/EMUI ContentProvider 兼容性<br/>
199、修复 StorageStats Hook<br/>
198、修复快手无法登陆<br/>
197、修复 YY 无法启动,更好的兼容插件化框架<br/>
196、修复 Facebook 登陆<br/>
195、修复 Google Play 下载的 App 无法找到 so 的问题(皇室战争)<br/>
194、修复 split apk 支持<br/>
193、修复 Youtube 无法启动<br/>
192、修复优酷无法启动的问题<br/>
191、修复多开时app间可能存在广播namespace冲突的BUG<br/>
190、采用新的策略绕过Android P以后的Hidden Policy API<br/>
189、适配Android Q(beta1)<br/>
188、修复华为设备部分app无法识别存储的问题<br/>
187、修复启动进程可能失败导致app无法运行的问题<br/>
186、修复4.4设备部分native符号无法找到的问题<br/>
185、修复部分设备WebView包名获取失败的问题<br/>
184、修复Service细节处理的问题<br/>
183、优化启动速度<br/>
182、修复WebView在少数机型加载失败的情况<br/>
181、修复Lib决策的问题<br/>
180、修复部分华为机型无法读取内存卡的问题<br/>
179、修复Service可能存在的问题<br/>
178、允许根据intent判断Activity是否在外部启动<br/>
177、修复部分机型上Gms和Google Play启动到了不正确的环境<br/>
176、修复新实现的StaticBroadcast导致的兼容性问题<br/>
175、修复Android P上无法使用apache.http.legacy的问题<br/>
174、实现Native trace<br/>
173、优化IO Redirect性能<br/>
172、修复wechat部分时候出现网络无法连接的问题<br/>
171、修复小概率process attach不正确的BUG<br/>
170、开始下一阶段的ROADMAP<br/>
169、解决Android P无法注册超过1000个广播导致的问题<br/>
168、修复可能导致ANR的DeadLock<br/>
167、修复部分app动态加载so失败的问题<br/>
166、修复免安装运行环境下部分机型第一次打开出现黑屏的问题<br/>
165、兼容适配多款主流的Android模拟器<br/>
164、优化启动性能<br/>
163、解决多个内存泄露问题<br/>
162、修复IO Redirect优先级的问题<br/>
161、修复8.0以下设备Messenger无网络连接的问题<br/>
160、修复双开时外部app卸载时内部app仍然保留的BUG<br/>
159、修复部分腾讯加固无法运行的问题<br/>
158、修复Instagram无法登录Facebook的BUG<br/>
157、修复进程小概率可能重复启动的BUG<br/>
156、修复GET_PERMISSIONS没有获取权限的BUG<br/>
155、修复startActivityIntentSender的BUG<br/>
154、修复vivo设备部分Activity无法启动的问题<br/>
153、修复app无法调用外部app选择文件的问题<br/>
152、完善Android P的兼容<br/>
151、兼容Android P的Google服务<br/>
150、解决Messenger部分功能异常<br/>
149、完善IO Redirect<br/>
148、大量适配Gms, 修复Gms运行过程中进程无限重启的问题<br/>
147、重新实现Service的运行机制<br/>
146、完善64bit,提供了部分ROM配置64bit Engine权限的API<br/>
145、修复了4.4设备上的Activity启动问题<br/>
144、支持excludeFromRecent属性<br/>
143、修复Instagram无法Facebook登录的问题<br/>
142、修复Facebook第一次登录闪退的问题<br/>
141、支持以64位模式运行Gms、Google play、Play game<br/>
140、支持在双开/免安装运行的Google play中下载和安装app<br/>
139、修复DownloadManager的BUG<br/>
138、修复Google play返回上层时重启界面的BUG<br/>
137、修复免安装模式下so决策问题<br/>
136、优化构建脚本,便于引入项目<br/>
135、修复移动MM SDK无法启动的问题<br/>
134、修复微信摇一摇的BUG<br/>
133、修复中兴设备不稳定的BUG<br/>
132、支持ARM64下的IO Redirect<br/>
131、修复USE_OUTSIDE模式下外部app更新时,内部app没有更新的BUG<br/>
130、兼容最新Android 9.0(代号: pie) 及正式版之前发布的四个Preview版本<br/>
129、兼容内置houdini的x86设备<br/>
128、WindowPreview技术,使app启动与真实app达到一样的速度<br/>
127、新的ActivityStack以提高app运行质量<br/>
126、解决接入Atlas Framework的app运行异常的问题<br/>
125、现在可以定义虚拟app返回桌面的具体行为<br/>
124、现在双开模式下app随系统动态更新,不需要手动检查<br/>
123、支持targetSdkVersion >= 26时仍可正常运行低版本的app<br/>
122、兼容腾讯游戏管家的QDroid虚拟引擎 (beta)<br/>
121、大量重构底层代码,大幅提升运行速度<br/>
120、修复网易新闻分享到微博后无法取消的问题<br/>
119、修复App自定义权限无法识别的问题<br/>
118、修复墨迹天气app无法启动的问题<br/>
117、修复部分政府app无法启动的问题<br/>
116、API的变动详见代码<br/>
115、修复三星系列应用的相互调用问题<br/>
114、修复小米应用在非小米系统的账号问题<br/>
113、修复分享/发送等第三方调用,返回页面不正常<br/>
112、修复应用宝提示不能安装<br/>
111、调用第三方app,对uri进行加密<br/>
110、适配前刘海<br/>
109、适配小米rom的hook<br/>
108、适配努比亚录音问题<br/>
107、内部悬浮窗权限控制<br/>
106、优化自定义通知栏的处理<br/>
105、修复Context的INCLUDE_CODE权限问题<br/>
104、适配华为,oppo的角标<br/>
103、修复百度视频的进程重启问题<br/>
102、修复某些snapchat的无法启动问题<br/>
101、适配autofill服务,例如piexl系列<br/>
100、完善64位的io hook<br/>
99、优化hook库的兼容性,加回dlopen<br/>
98、64位扩展包的so移到32位主包。(jni代码改动后,在Run之前,请先build一次)<br/>
97、通知栏改动:适配8.1的通知渠道;移除应用时,移除应用的全部通知<br/>
96、兼容部分app,需要设置android:largeHeap=true<br/>
95、修复ffmpeg库的视频无法播放问题<br/>
94、优化横竖屏切换<br/>
93、降低通过Intent.ACTION_VIEW调用外部Activity限制。<br/>
92、兼容MG SDK<br/>
91、64位支持还在开发阶段<br/>
90、更新混淆配置app/proguard-rules.pro,必须加规则-dontshrink<br/>
89、优化模拟机型,例如:模拟后,某些app不出现设备验证<br/>
88、提高dex2oat兼容性<br/>
87、优化模拟定位<br/>
86、移除dlopen<br/>
85、targetVersion可以改为26:支持targetVersion<23的app动态权限申请,支持targetVersion<24的文件Uri<br/>
84、installPackage改为默认异步形式<br/>
83、为了支持64位模式,换回aidl<br/>
82、去掉SettingHandler现在可以动态设置特殊规则,规则会存储,不需要重复设置<br/>
81、增加2个native_setup<br/>
80、提高jobService兼容性<br/>
79、ShortcutService相关:关联VASettings.ENABLE_INNER_SHORTCUT<br/>
78、为了稳定性和运行效率,去掉上个版本的蓝牙,wifi,不声明权限的适配。<br/>
77、增加app启动异常的广播Constants.ACTION_PROCESS_ERROR<br/>
76、修复少数游戏横屏判断问题<br/>
75、demo增加机型模拟<br/>
74、适配vivo一个自定义权限(后台弹窗)VA是把一个历史acitivty返回前台,vivo需要这个权限。<br/>
73、如果没有蓝牙权限,返回默认值(海外用)<br/>
72、修复uid权限检查问题<br/>
71、安全性更新,内部应用的文件权限控制<br/>
70、提高内部app调用的兼容性,第三方登录,分享<br/>
69、自动过滤没权限的外部ContentProvider<br/>
68、增加功能:内部app的权限检查(默认关闭)<br/>
67、机型模拟:Build类和build.prop<br/>
66、提高对乐固加固的app兼容性<br/>
65、适配三星wifimanager<br/>
64、修复ipc框架一个参数传递问题(IPCMethod这个类必须更新)<br/>
63、补全7.0通知栏的hook<br/>
62、修正8.0动态快捷菜单的hook<br/>
61、SettingHandler新增一个适配接口,主要适配各种游戏<br/>
60、功能改动:google自动安装改为手动安装,避免第一次启动时间过久<br/>
59、可以禁止访问外部某个ContentProvider<br/>
58、适配华为桌面图标数量<br/>
57、权限分类注释,标注可删除权限。<br/>
56、增加双开模式的app跟随外部升级的开关。<br/>
55、提高app的jni兼容性。<br/>
54、提高对app集成其他插件框架的兼容性。<br/>
53、增加设置接口,根据包名进行设置。<br/>
52、增加Uri的适配范围,支持通过Uri分享和查看文件。<br/>
51、修复一个在三星8.0的问题。<br/>
50、提高对系统自带的app组件兼容性,更好兼容chrome webview,google service。<br/>
49、提高ART稳定性<br/>
48、增加相机适配范围<br/>
47、支持内部App在8.0下的快捷方式管理<br/>
46、修复exec异常<br/>
45、提高稳定性(修复微信登录闪退)<br/>
44、解决微信数据库崩溃问题<br/>
43、修复部分4.4设备崩溃问题<br/>
42、修复后台应用易被杀死,土豆视频黑屏,新浪微博无法打开,优酷两次返回无法退出。<br/>
41、增加应用的保活机制,双开APP更不易被杀死。<br/>
40、优化虚拟引擎启动性能。<br/>
39、兼容了大部分的加固,第三方APP兼容性对比上一版提升40%+。<br/>
38、修复某些rom下,快捷方式图标不正确<br/>
37、兼容以前组件StubFileProvider<br/>
36、适配部分新ROM的虚拟IMEI<br/>
35、改善进程初始化代码,增加稳定性<br/>
34、添加内部发送Intent.ACTION_BOOT_COMPLETED的广播,可以设置开关<br/>
33、适配关联google play游戏,支持游戏使用google登录<br/>
32、适配android O的google service框架<br/>
31、适配android O 快捷方式<br/>
30、适配耳机模式<br/>
29、某些rom对intent的大小限制,demo添加缩放快捷方式图标代码<br/>
28、修复多开情况下一个bug<br/>
27、修复某些情况下MediaController的bug<br/>
26、修复4.1.2的StubFileProvider报错<br/>
25、分享的uri处理<br/>
24、修复跨app调用Activity的回调<br/>
23、前台服务的通知栏拦截开关<br/>
22、附带doc<br/>
21、完善VA内部的intent的CHOOSE回调<br/>
20、Android O的通知栏适配2<br/>
19、ipc框架优化, 提高判断binder的存活准确性<br/>
18、jni的log开关 Android.mk:LOCAL_CFLAGS += -DLOG_ENABLE<br/>
17、混淆配置<br/>
16、Android O的通知栏适配<br/>
15、修复部分app网络卡的问题<br/>
14、适配 android 8.0的dl_open(jni加载)<br/>
13、修复华为emui8.0的一个bug<br/>
12、完善定位<br/>
11、设置手机信息,imei伪装算法<br/>
10、适配8.0某个功能(主要app:whatsapp)<br/>
9、修复内部微信等应用,无法更新图片,视频<br/>
8、demo增加安装监听,自动升级克隆模式的应用<br/>
7、7.0的file provider适配<br/>
6、增加了定位代码<br/>
5、代码进行了架构优化<br/>
4、与开源版不同的特征<br/>
3、解决了微信被封的一些问题<br/>
2、修复了部分机型兼容性<br/>
1、修复了12个小BUG<br/>
</details>
================================================
FILE: README_eng.md
================================================
[中文文档](README.md "中文")
<h1><p align="center">VA Product description & Development guidance</p></h1>
## What is VA? ##
VirtualAPP (abbreviation: VA) is a sandbox product running on Android system, which can be understood as a lightweight "Android virtual machine". Its product form is a highly extensible, customizable, integrated SDK that allows you to develop a variety of seemingly impossible projects based on or using VA. Now, VA is widely used in many technology fields as following: mini game collection, blockchain, cloud control, silent hot fix and so on. On the one hand, you can realize cloud control mobile office security and achieve military and government data isolation with VA. On the other hand, you can implement script automation, device-info-mock, and plug-in development. Meanwhile, you can realize multi space and games booster. You can also rent the mobile game account and use the mobile controller without activation by VA. <br> **The code on Github has stopped updating in December 2017. The code of business version is continuously being updated. If you need license to obtain the latest code, please contact WeChat: 10890.**
## Terminology in VA ##
Terminology | Explanation
---- | ---
Host | The APP that integrates the VirtualAPP SDK is called host.
Host Plug-in | A host package is used to run another ABI on the same device. It also called plug-in package,extension package, host plug-in package, host extension package.
Virtual APP / VAPP | App installed in the VA space
External APP | App installed in the device
<br/>
## VA Technical architecture ##

VA technology involves the APP layer, Framework layer and Native layer of Android in total.
App must be installed on the system before it can run. The APP installed inside the VA space is not actually installed into the system, so it cannot run. Then how to get it to run?
Answer: The only way to do this is to "cheat" the system into thinking it has been installed. This "cheat" process is the core work of the VA Framework, and is also the core technical principle of the VA.
**Here is the description of what did each layer do:**
Layer | Main work
---- | ---
VA Space | An internal space is provided by the VA for the installation of the APP to be run inside it, and this space is system isolated.
VA Framework | This layer is mainly a proxy for Android Framework and VAPP, which is the core of VA. And VA provides a set of VA Framework of its own, which is between Android Framework and VA APP. </br>1. For VAPP, all the system services it accesses have been proxied by VA Framework, which will modify the request parameters of VAPP and send all the parameters related to VAPP installation information to Android Framework after changing them to the parameters of the host (Some of the requests will be sent to their own VA Server to be processed directly, and no longer send to the Android system). This way Android Framework receives the VAPP request and checks the parameters, and it will think there is no problem.</br>2. When the Android system finishes processing the request and returns the result, the VA Framework will also intercept the return result and restore all the parameters that have been original modified to those that were sent during the VAPP request. This way the interaction between VAPP and Android system can work.
VA Native | The main purpose of this layer is to accomplish 2 tasks: IO redirection and the request modification for VA APP to interact with Android system. </br>1. IO redirection is some APPs may be accessed through the hard code absolute path. But if the APP is not installed to the system, this path does not exist. Through IO redirection, it will be redirected to the path to install inside VA.</br>2. In addition, there are some jni functions that cannot be hooked in VA Framework, so they need to be hooked in the native layer.
</br>
In summary:
As you can see from the above technical architecture, the internal VA APP actually runs on top of VA's own VA Framework. VA has intercepted all system requests from its internal APP, and through this technology it can also have full control over the APP, not just the multi space. And for the convenience of developers, VA also provides SDK and Hook SDK.
## VA Process architecture#

There are five types of processes in the VA’s runtime: CHILD process, VA Host Main process, VA Host Plugin process, VAPP Client process, and VAServer process.
To support both 32-bit and 64-bit APPs, VA needs to install two packages: a master package and a plug-in package ( In this document, the main package is 32 bits and the plug-in package is 64 bit ).
Two packages are also necessary because a package can only run in one mode, either 32-bit or 64-bit. So for 32-bit APPs, VA uses the 32-bit main package to run, and for 64-bit APPs, VA uses the 64-bit plug-in package to run.
The main package contains all the code of VA, and the plug-in package contains only one piece of code that loads the main package code for execution, no other code. So plug-in package rarely needs to be updated, just the main package.
In addition, whether the main package is chosen to use 32-bit or 64-bit can be modified in the configuration file ( For example, for users who want to access GooglePlay, it will be modified to 64-bit for the main package and 32-bit for the plug-in package ).
**The functions and explanations of the each type of process are as follows:**</br>
Process Type | Function
---- | ---
CHILD | Other processes integrated by VA Host, such as: keepalive process, push process, etc.
VA Host Main | The process where the UI main interface of the VA main package is located. The default main package is 32-bit and the plug-in package is 64-bit, which can be modified and switched in the configuration file
VA Host Plugin | The process that supports the plug-in package of 64-bit APP. The default main package is 32-bit and the plug-in package is 64-bit, which can be modified and switched in the configuration file.
VAPP Client | The process generated by the APP installed into VA after it starts, it will modify io.busniess.va:pxxx process name to the real process name of VAPP when it runs.
VAServer | The process where the VA Server is located, it is used to handle requests in VA that are not assigned to the system for processing, such as APP installation processing.
<br/>
## VA can satisfy almost all your needs ##
Through the above technical architecture, we can know that VA can fully control APP and provide Hook SDK, which can satisfy almost all your needs in various fields:
1. Satisfy the need of **dual/multi space**
VA allows you to install multiple WeChat/QQ/WhatsAPP/Facebook and other APPs on the same mobile phone, so you can have one phone with multiple accounts logged in at the same time.
2. Satisfy the need of **mobile security**
VA provides a set of internal and external isolation mechanisms, including but not limited to (file isolation / component isolation / process communication isolation). Simply speaking, VA internal is a "completely independent space".
Through VA, work affairs and personal affairs can be safely separated without mutual interference. With a little customization, you can achieve mobile security-related needs such as application behavior audit, data encryption, data acquisition, data leakage prevention, anti-attack leaks and so on.
**2.1 Application behavior audit**
The HOOK capability provided by VA can realize real-time monitoring of user usage behavior and upload violation information to the server. And it's easy to implement things like Time Fence ( whether a feature of the APP can be used in a certain time ), Geo Fence ( whether a feature of the APP can be used in a certain area ), sensitive keyword filtering interception and other functional requirements.
**2.2 Data encryption**
The HOOK capability provided by VA can realize all data/file encryption of the application, ensuring data/file landing security.
**2.3 Data acquisition**
The HOOK capability provided by VA can realize the demand for real-time silent upload of application data, such as chat records and transfer records, preventing them from being deleted afterwards without traceability.
**2.4 Data leakage prevention**
The HOOK capability provided by VA can realize application anti-copy/paste, anti-screenshot/recording, anti-sharing/forwarding, watermark traceability and other requirements.
**2.5 Anti-attack leaks**
With the application control capability provided by VA, privacy-related behaviors such as SMS/ address book/call log/ background recording/background photo/ browsing history and location information can be completely controlled in sandbox, prevent Trojan horses/malicious APPs from acquiring users' real private data, causing serious consequences such as leakage of secrets.
3. Satisfy the need of **ROOT without HOOK**
VA provides Hook capability of Java and Native. With VA, you can easily achieve functions required by various scenarios, such as virtual positioning, changing device, APP monitoring and management, mobile security and so on.
4. Satisfy the need of **silent installation**
VA provides the ability to silently install, silently upgrade and silently uninstall APPs. For example, the application store or game center can be integrated with VA to avoid the need for users to manually click to confirm the installation operation, so that it can be installed into VA immediately after downloading, bringing users an experience like "small program" , completely avoiding the problem of applications not easily installed by users.
5. Satisfy the need of **APP controlled**
You can clearly grasp the system API, sensitive data, device information, etc. accessed by the APP through VA. For example, whether the APP accesses the contacts, photo albums, call log, whether it accesses the user's geographic location and other information.
Of course, you can also control or construct custom messages to these APPs via VA, and not only that, you can also get access to the APP's private data, such as chat database and so on. In a word, through the application control capability provided by VA, you can easily control all the behaviors of the APP, even modify the content of the APP and server interaction and so on . </br>
6. Satisfy the need of **overseas markets**
VA implements support for Google services to support overseas APPs running, such as Twitter, Messenger, WhatsAPP, Instagram, FaceBook, Youtube and so on.
7. Satisfy the need of **almost everything you can think of**
VA has complete oversight and control over the internal APP, and can meet almost any of your needs!
8. VA is also the only commercially licensed product in this technology area
**Hundreds of** licensed customers are currently paying to use the business version of VirtualAPP code, and the APP integrated with VirtualAPP code is launched more than 200 million times per day. Many Android engineers provide us with user feedback in different scenarios, and through our technical team's continuous optimization and iteration, we continue to improve product performance and compatibility.
VA Specialized capabilities
---
- Cloning ability<br/>
You can clone the APP already installed in the external system and run it internally without mutual interference. Typical application scenario is double space.
- Without installation ability<br/>
In addition to cloning already installed, VA can install (externally silent ) apk's directly internally and run them directly internally. Typical application scenarios are plug-in, standalone APP marketplace and so on.
- Double space ability<br/>
VA is not only "double space", but also has a unique multi-user mode that allows users to open the same APP internally for an unlimited number of times.
- Internal and external isolation ability<br/>
VA is a standard sandbox, or "virtual machine", that provides a set of internal and external isolation mechanisms, including but not limited to (file isolation/component isolation/process communication isolation). Simply put, the inside of a VA is a "completely separate space". Simply put, the inside of a VA is a "completely separate space". Based on it, you can realize a "virtual phone" on your cell phone with a little customization. Of course, you can also use your imagination to customize it for data encryption, data isolation, privacy protection, and enterprise management applications.
- Full control over internal APPs ability<br/>
VA has complete monitoring and control over the internal APP, which is absolutely impossible to achieve in an external environment without Root.
<details>
<summary>Details(Drop down to open)</summary>
1. Service request control. First, VA directly provides some service request interception, you can easily customize these service requests when integrating VA, including but far from limited to (APP request to install apk / APP request to open certain files / APP request for location data / APP request for phone information, etc.)<br/><br/>
2. System API control. VA virtualizes and implements the entire Android system framework, which is the principle that VA can run apk internally without installation. And you can through modify the virtual framework's implementation to dynamically monitor and analyze the behavior of the app, etc. In addition, you can also mock some system behavior to achieve some needs that are difficult to achieve externally (e.g. game controller).<br/><br/>
3. Memory read and write. VA can read and write the memory of internal APP processes without Root.<br/><br/>
4. Root without debugging. VA can debug (ptrace) internal APP processes without Root, based on which you can also achieve Root-free process injection.<br/><br/>
5. Load arbitrary "plug-in" and "behaviors". The APP process inside VA is derived from the Client side code of the VA framework, so you can insert any "load" and "control" logic into the entry code of the process. These are very simple to implement.<br/><br/>
6. Hook. VA has a set of built-in Xposed framework and native hook framework running on all versions of Android (until AndroidQ), based on it, you can easily Hook any Java/Native of any internal APP.<br/><br/>
7. File control. VA built in a complete file redirection, which allows easy control of reading and writing of files from internal apps. Based on it, you can realize many functions such as protection and encryption of files can be achieved.<br/><br/>
8. Note: The above control capabilities are implemented with code or examples for reference.
</details>
VA Other features
---
- High performance<br/>
Process-level "virtual machine", VA's unique implementation model makes its performance almost the same as that of the native APP, and does not need a long startup of ordinary virtual machines.
- Full version support<br/>
Support 5.0-17.0, 32-bit/64-bit APP, ARM and X86 processor. And support Android version in the future which will be updated.
- Easy Expansion and Integration<br/>
The integration of VA is similar to the normal Android library, even if your APP has been online, you can conveniently integrate VA and enjoy the capability brought by VA.
- Support Google services<br/>
Provide support for Google services in order to support overseas APPs.
## Comparison between VA and other technical solutions ##
When doing enterprise-level mobile security, it is often necessary to control the APP, and the following is a comparison of possible technical solutions listed:
Technical solution | Principle introduction | Comment | Running performance | Compatibility stability | Project maintenance cost
---- | --- | --- | --- | --- | ---
Repackage | Repackage the target APP by decompiling it and adding your own control code | 1. Nowadays, almost all APPs have hardened or tamper-proof protection, and repackaging is already a very difficult task</br> 2.The mobile phone system will also detect whether the APP is repackaged, if it is repackaged, it will directly prompt the user that there is a security risk, and even not allow the installation</br>3.For each APP, even each version to go deep to reverse analysis, time-consuming and difficult to maintain | Excellent | Poor | High
Custom ROM | By customizing the system source code and compiling it to flash to the designated mobile phone | Only for specified internal mobile phones, too limited to be extended | Excellent | Excellent | High
ROOT the mobile phone | By rooting the mobile phone,flashing a framework which is similar to Xposed | 1.Now, root the mobile phone is an unlikely thing</br> 2.In reality, it is difficult for users to root their own mobile phones | Excellent | Poor | High
VA | Lightweight virtual machine with high speed and low device requirements | No risk point mentioned above | Excellent | Excellent. Hundreds of companies testing feedback at the same time | Low.
VA provides API and a professional technical team to ensure the stable operation of the project
<br/>
As you can see from the above comparison, VA is an excellent product and can reduce your development and maintenance costs.
## Integrating VA Steps ##
Step 1: Call the VA interface```VirtualCore.get().startup()```in your application to start the VA engine.
Step 2: Call VA interface```VirtualCore.get().installPackageAsUser(userId, packageName)```to install the target APP into VA.
Step 3: Call VA interface```VActivityManager.get().launchApp(userId, packageName)```to start the APP.
**With only the above 3 APIs to complete the basic use, VA has shielded the complex technical details and provided the interface API to make your development easy.**
## VA compatible stability ##
VA has been extensively tested by ** hundreds of **companies, including **high standards of testing and feedback of dozens of listed companies**, covering almost all types of equipment and scenarios at home and abroad, providing full protection for your stable operation!
Up to now, the supported system versions:
System version | Whether to support
---- | ---
5.0 | support
5.1 | support
6.0 | support
7.0 | support
8.0 | support
9.1 | support
10.0 | support
11.0 | support
12.0 | support
13.0 | support
14.0 | support
15.0 | support
16.0 | support
17.0 | support
<br/>
Supported App Types:
App Type | Whether to support
---- | ---
32-bit APP | support
64-bit APP | support
<br/>
Supported HOOK Types:
Hook Type | Whether to support
---- | ---
Java Hook | support
Native Hook | support
Supported CPU Types:
Hook Type | Whether to support
---- | ---
ARM 32 | support
ARM 64 | support
<br/>
## How to give feedback on problems encountered with integrated VA ? ##
After the purchase of the license we will establish a WeChat group, any problems can always feedback to us, and according to the priority in the first time to deal with.
## VA Development document ##
Please refer to the VA development documentation:[Development document](doc/VADev_eng.md)
License Instructions
------
VirtualApp virtual machine technology belongs to: Jining Luohe Network Technology Co., LTD. It applied for several VirtualApp intellectual property rights from 2015 to 2026 and` is protected by the Intellectual property Law of the People's Republic of China`.When you need to use the code on Github, **please purchase a business license**,and receive the full source code of the latest VirtualApp business version.Hundreds of licensed customers are paying to use the business version of VirtualApp code, and the app integrated with VirtualApp code is launched more than 200 million times a day. Many Android engineers provided us with user feedback in different scenarios, and through our technical team's continuous optimization and iteration, VirtualApp Business Edition code has better performance and higher compatibility. `The company of that year will become one of them after obtaining the license, and enjoy the technological achievements after the continuous iteration. And we can interact and collaborate with our licensed customers operationally, technically and commercially.`
<br/>
Person in charge: Mr. Zhang <br/>
WeChat:10890 <br/>
<br/>
Serious statement
------
If you use VirtualApp for **internal use, business profit or upload it to the application market**without licensing. We will take evidence and then report you to the police (for copyright infringement) or prosecute you. It will cause your company to undertake criminal liability and legal action, and affect your company's goodwill and investment.`Purchasing a business license can save you a lot of time developing, testing and refining compatibility, leaving you more time for innovation and profitability.`Luo He Technology has called to the police and sued a number of individuals and companies in 2020.<br/>
**In response to the national call for the protection of intellectual property rights! Anyone who reports that his or her company or other companies are using VirtualApp code to develop products without licensing will be given a cash reward upon verification. We will keep the identity of the whistleblower confidential! Reporting WeChat: 10890.**
<br/>
Major updates of the business version
------
1. Support Android 17.0
2. Support Seccomp-Bpf.
3. Not easily misreported by anti-virus software
4. Framework optimization, performance greatly improved
5. Mobile system and APP compatibility greatly improved
6. Run Google services perfectly
7. Supports running pure 64-bit Apps
8. Built-in `XPosed Hook` framework
9. Add positioning mock code
10. Add code to change device
11. Nearly 700 other fixes and improvements
<br>
================================================
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'
android {
compileSdkVersion 26
buildToolsVersion '26.0.2'
defaultConfig {
applicationId "io.virtualapp"
minSdkVersion 15
targetSdkVersion 22
versionCode 24
versionName "1.2.5"
multiDexEnabled true
android {
defaultConfig {
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86"
}
}
}
}
sourceSets {
main{
jniLibs.srcDirs = ['libs']
}
}
buildTypes {
release {
minifyEnabled false
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
android {
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 {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile project(':lib')
//Android Lib
compile 'com.android.support:multidex:1.0.2'
compile 'com.android.support:appcompat-v7:25.4.0'
compile 'com.melnykov:floatingactionbutton:1.3.0'
compile 'com.android.support:recyclerview-v7:25.4.0'
compile 'com.android.support:percent:25.4.0'
compile 'com.android.support:design:25.4.0'
compile 'com.android.support:cardview-v7:25.4.0'
//Promise Support
compile 'org.jdeferred:jdeferred-android-aar:1.2.4'
// ThirdParty
compile 'com.jonathanfinerty.once:once:1.0.3'
compile 'com.flurry.android:analytics:6.9.2'
compile 'com.kyleduo.switchbutton:library:1.4.6'
}
================================================
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.**{*;}
================================================
FILE: VirtualApp/app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="io.virtualapp">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:name=".VApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<meta-data
android:name="TencentMapSDK"
android:value="4HPBZ-2QWC6-H47SR-M6PZY-MTZB5-N2F4F"/>
<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.HomeActivity"
android:screenOrientation="portrait"
android:theme="@style/UITheme"/>
<activity
android:name=".home.ListAppActivity"
android:screenOrientation="portrait"
android:theme="@style/UITheme"/>
<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=".home.location.VirtualLocationSettings"
android:screenOrientation="portrait"
android:theme="@style/UITheme"
/>
<activity
android:name=".home.location.MarkerActivity"
android:screenOrientation="portrait"
android:theme="@style/UITheme"
/>
</application>
</manifest>
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/VApp.java
================================================
package io.virtualapp;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.multidex.MultiDexApplication;
import com.flurry.android.FlurryAgent;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.stub.VASettings;
import io.virtualapp.delegate.MyAppRequestListener;
import io.virtualapp.delegate.MyComponentDelegate;
import io.virtualapp.delegate.MyPhoneInfoDelegate;
import io.virtualapp.delegate.MyTaskDescriptionDelegate;
import jonathanfinerty.once.Once;
/**
* @author Lody
*/
public class VApp extends MultiDexApplication {
private static VApp gApp;
private SharedPreferences mPreferences;
public static VApp getApp() {
return gApp;
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
mPreferences = base.getSharedPreferences("va", Context.MODE_MULTI_PROCESS);
VASettings.ENABLE_IO_REDIRECT = true;
VASettings.ENABLE_INNER_SHORTCUT = false;
try {
VirtualCore.get().startup(base);
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void onCreate() {
gApp = this;
super.onCreate();
VirtualCore virtualCore = VirtualCore.get();
virtualCore.initialize(new VirtualCore.VirtualInitializer() {
@Override
public void onMainProcess() {
Once.initialise(VApp.this);
new FlurryAgent.Builder()
.withLogEnabled(true)
.withListener(() -> {
// nothing
})
.build(VApp.this, "48RJJP7ZCZZBB6KMMWW5");
}
@Override
public void onVirtualProcess() {
//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 MyTaskDescriptionDelegate());
}
@Override
public void onServerProcess() {
virtualCore.setAppRequestListener(new MyAppRequestListener(VApp.this));
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");
}
});
}
public static SharedPreferences getPreferences() {
return getApp().mPreferences;
}
}
================================================
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/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/Value.java
================================================
package io.virtualapp.abs;
/**
* @author Lody
*/
public class Value<T> {
public T val;
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/nestedadapter/RecyclerViewAdapterWrapper.java
================================================
package io.virtualapp.abs.nestedadapter;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
public class RecyclerViewAdapterWrapper extends RecyclerView.Adapter {
protected final RecyclerView.Adapter wrapped;
public RecyclerViewAdapterWrapper(RecyclerView.Adapter wrapped) {
super();
this.wrapped = wrapped;
this.wrapped.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
public void onChanged() {
notifyDataSetChanged();
}
public void onItemRangeChanged(int positionStart, int itemCount) {
notifyItemRangeChanged(positionStart, itemCount);
}
public void onItemRangeInserted(int positionStart, int itemCount) {
notifyItemRangeInserted(positionStart, itemCount);
}
public void onItemRangeRemoved(int positionStart, int itemCount) {
notifyItemRangeRemoved(positionStart, itemCount);
}
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
notifyItemMoved(fromPosition, toPosition);
}
});
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return wrapped.onCreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
wrapped.onBindViewHolder(holder, position);
}
@Override
public int getItemCount() {
return wrapped.getItemCount();
}
@Override
public int getItemViewType(int position) {
return wrapped.getItemViewType(position);
}
@Override
public void setHasStableIds(boolean hasStableIds) {
wrapped.setHasStableIds(hasStableIds);
}
@Override
public long getItemId(int position) {
return wrapped.getItemId(position);
}
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
wrapped.onViewRecycled(holder);
}
@Override
public boolean onFailedToRecycleView(RecyclerView.ViewHolder holder) {
return wrapped.onFailedToRecycleView(holder);
}
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
wrapped.onViewAttachedToWindow(holder);
}
@Override
public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) {
wrapped.onViewDetachedFromWindow(holder);
}
@Override
public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
wrapped.registerAdapterDataObserver(observer);
}
@Override
public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
wrapped.unregisterAdapterDataObserver(observer);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
wrapped.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
wrapped.onDetachedFromRecyclerView(recyclerView);
}
public RecyclerView.Adapter getWrappedAdapter() {
return wrapped;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/nestedadapter/SmartRecyclerAdapter.java
================================================
package io.virtualapp.abs.nestedadapter;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.ViewGroup;
public class SmartRecyclerAdapter extends RecyclerViewAdapterWrapper {
public static final int TYPE_HEADER = -1;
public static final int TYPE_FOOTER = -2;
private RecyclerView.LayoutManager layoutManager;
private View headerView, footerView;
public SmartRecyclerAdapter(@NonNull RecyclerView.Adapter targetAdapter) {
super(targetAdapter);
}
public void setHeaderView(View view) {
headerView = view;
getWrappedAdapter().notifyDataSetChanged();
}
public void removeHeaderView() {
headerView = null;
getWrappedAdapter().notifyDataSetChanged();
}
public void setFooterView(View view) {
footerView = view;
getWrappedAdapter().notifyDataSetChanged();
}
public void removeFooterView() {
footerView = null;
getWrappedAdapter().notifyDataSetChanged();
}
private void setGridHeaderFooter(RecyclerView.LayoutManager layoutManager) {
if (layoutManager instanceof GridLayoutManager) {
final GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
boolean isShowHeader = (position == 0 && hasHeader());
boolean isShowFooter = (position == getItemCount() - 1 && hasFooter());
if (isShowFooter || isShowHeader) {
return gridLayoutManager.getSpanCount();
}
return 1;
}
});
}
}
private boolean hasHeader() {
return headerView != null;
}
private boolean hasFooter() {
return footerView != null;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
layoutManager = recyclerView.getLayoutManager();
setGridHeaderFooter(layoutManager);
}
@Override
public int getItemCount() {
return super.getItemCount() + (hasHeader() ? 1 : 0) + (hasFooter() ? 1 : 0);
}
@Override
public int getItemViewType(int position) {
if (hasHeader() && position == 0) {
return TYPE_HEADER;
}
if (hasFooter() && position == getItemCount() - 1) {
return TYPE_FOOTER;
}
return super.getItemViewType(hasHeader() ? position - 1 : position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = null;
if (viewType == TYPE_HEADER) {
itemView = headerView;
} else if (viewType == TYPE_FOOTER) {
itemView = footerView;
}
if (itemView != null) {
//set StaggeredGridLayoutManager header & footer view
if (layoutManager instanceof StaggeredGridLayoutManager) {
ViewGroup.LayoutParams targetParams = itemView.getLayoutParams();
StaggeredGridLayoutManager.LayoutParams StaggerLayoutParams;
if (targetParams != null) {
StaggerLayoutParams = new StaggeredGridLayoutManager.LayoutParams(targetParams.width, targetParams.height);
} else {
StaggerLayoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
StaggerLayoutParams.setFullSpan(true);
itemView.setLayoutParams(StaggerLayoutParams);
}
return new RecyclerView.ViewHolder(itemView) {
};
}
return super.onCreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_HEADER || getItemViewType(position) == TYPE_FOOTER) {
//if you need get header & footer state , do here
return;
}
super.onBindViewHolder(holder, hasHeader() ? position - 1 : position);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/percent/PercentLinearLayout.java
================================================
package io.virtualapp.abs.percent;
import android.content.Context;
import android.content.res.TypedArray;
import android.support.percent.PercentLayoutHelper;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.LinearLayout;
/**
* @author Lody
*/
public class PercentLinearLayout extends LinearLayout {
private PercentLayoutHelper mPercentLayoutHelper;
public PercentLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mPercentLayoutHelper = new PercentLayoutHelper(this);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mPercentLayoutHelper.adjustChildren(widthMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mPercentLayoutHelper.handleMeasuredStateTooSmall()) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
mPercentLayoutHelper.restoreOriginalParams();
}
@Override
public LayoutParams generateLayoutParams(AttributeSet attrs) {
return new LayoutParams(getContext(), attrs);
}
public static class LayoutParams extends LinearLayout.LayoutParams
implements
PercentLayoutHelper.PercentLayoutParams {
private PercentLayoutHelper.PercentLayoutInfo mPercentLayoutInfo;
public LayoutParams(Context c, AttributeSet attrs) {
super(c, attrs);
mPercentLayoutInfo = PercentLayoutHelper.getPercentLayoutInfo(c, attrs);
}
public LayoutParams(int width, int height) {
super(width, height);
}
public LayoutParams(ViewGroup.LayoutParams source) {
super(source);
}
public LayoutParams(MarginLayoutParams source) {
super(source);
}
@Override
public PercentLayoutHelper.PercentLayoutInfo getPercentLayoutInfo() {
return mPercentLayoutInfo;
}
@Override
protected void setBaseAttributes(TypedArray a, int widthAttr, int heightAttr) {
PercentLayoutHelper.fetchWidthAndHeight(this, a, widthAttr, heightAttr);
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/reflect/ReflectException.java
================================================
package io.virtualapp.abs.reflect;
/**
* @author Lody
*/
public class ReflectException extends RuntimeException {
private static final long serialVersionUID = 663038727503637969L;
public ReflectException(Throwable cause) {
super(cause);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/BaseAdapterPlus.java
================================================
package io.virtualapp.abs.ui;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.SpinnerAdapter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public abstract class BaseAdapterPlus<T> extends BaseAdapter implements SpinnerAdapter {
protected Context context;
private LayoutInflater mLayoutInflater;
protected final List<T> mItems = new ArrayList<T>();
public BaseAdapterPlus(Context context) {
this.context = context;
mLayoutInflater = LayoutInflater.from(context);
}
public Context getContext() {
return context;
}
public boolean add(T item) {
return add(-1, item, false);
}
public boolean add(int pos, T item, boolean onlyone) {
if (item != null) {
if (onlyone) {
if (exist(item)) {
return false;
}
}
if (pos >= 0) {
mItems.add(pos, item);
} else {
mItems.add(item);
}
return true;
}
return true;
}
public T remove(int pos) {
return mItems.remove(pos);
}
public List<T> getItems() {
return mItems;
}
protected <VW extends View> VW inflate(int resource, ViewGroup root) {
return (VW) mLayoutInflater.inflate(resource, root);
}
protected <VW extends View> VW inflate(int resource, ViewGroup root, boolean attachToRoot) {
return (VW) mLayoutInflater.inflate(resource, root, attachToRoot);
}
public void clear() {
mItems.clear();
}
public void set(Collection<T> items) {
clear();
addAll(items);
}
public void addAll(Collection<T> items) {
if (items != null) {
mItems.addAll(items);
}
}
public int findItem(T item) {
return mItems.indexOf(item);
}
public boolean exist(T item) {
if (item == null) return false;
return mItems.contains(item);
}
@Override
public final int getCount() {
return mItems.size();
}
public final T getDataItem(int position) {
return mItems.get(position);
}
@Override
public final T getItem(int position) {
if (position >= 0 && position < getCount()) {
return mItems.get(position);
}
return null;
}
public final T getItemById(long id) {
return getItem((int) id);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public final View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = createView(position, parent);
}
T t = getItem(position);
attach(convertView, t, position);
return convertView;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = createView(position, parent);
}
T t = getItem(position);
attach(convertView, t, position);
return convertView;
}
protected abstract View createView(int position, ViewGroup parent);
protected abstract void attach(View view, T item, int position);
public static class BaseViewHolder {
protected View view;
protected Context context;
public BaseViewHolder(View view) {
this.view = view;
this.context = view.getContext();
}
protected <T extends View> T $(int id) {
return (T) view.findViewById(id);
}
}
}
================================================
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 com.flurry.android.FlurryAgent;
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();
FlurryAgent.onStartSession(this);
}
@Override
protected void onStop() {
super.onStop();
FlurryAgent.onEndSession(this);
}
}
================================================
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/MyAppRequestListener.java
================================================
package io.virtualapp.delegate;
import android.content.Context;
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 java.io.IOException;
/**
* @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) {
Toast.makeText(context, "Installing: " + path, Toast.LENGTH_SHORT).show();
InstallResult res = VirtualCore.get().installPackage(path, InstallStrategy.UPDATE_IF_EXIST);
if (res.isSuccess) {
try {
VirtualCore.get().preOpt(res.packageName);
} catch (IOException e) {
e.printStackTrace();
}
if (res.isUpdate) {
Toast.makeText(context, "Update: " + res.packageName + " success!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Install: " + res.packageName + " success!", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(context, "Install failed: " + res.error, Toast.LENGTH_SHORT).show();
}
}
@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/MyTaskDescriptionDelegate.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 MyTaskDescriptionDelegate 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/effects/ExplosionAnimator.java
================================================
package io.virtualapp.effects;
import java.util.Random;
import android.animation.ValueAnimator;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Interpolator;
import io.virtualapp.VApp;
import io.virtualapp.abs.ui.VUiKit;
public class ExplosionAnimator extends ValueAnimator {
private static final Interpolator DEFAULT_INTERPOLATOR = new AccelerateInterpolator(0.6f);
private static final float END_VALUE = 1.4f;
private static final float X = VUiKit.dpToPx(VApp.getApp(), 5);
private static final float Y = VUiKit.dpToPx(VApp.getApp(), 20);
private static final float V = VUiKit.dpToPx(VApp.getApp(), 2);
private static final float W = VUiKit.dpToPx(VApp.getApp(), 1);
static long DEFAULT_DURATION = 0x450;
private Paint mPaint;
private Particle[] mParticles;
private Rect mBound;
private View mContainer;
public ExplosionAnimator(View container, Bitmap bitmap, Rect bound) {
mPaint = new Paint();
mBound = new Rect(bound);
int partLen = 15;
mParticles = new Particle[partLen * partLen];
Random random = new Random(System.currentTimeMillis());
int w = bitmap.getWidth() / (partLen + 2);
int h = bitmap.getHeight() / (partLen + 2);
for (int i = 0; i < partLen; i++) {
for (int j = 0; j < partLen; j++) {
mParticles[(i * partLen) + j] = generateParticle(bitmap.getPixel((j + 1) * w, (i + 1) * h), random);
}
}
mContainer = container;
setFloatValues(0f, END_VALUE);
setInterpolator(DEFAULT_INTERPOLATOR);
setDuration(DEFAULT_DURATION);
}
private Particle generateParticle(int color, Random random) {
Particle particle = new Particle();
particle.color = color;
particle.radius = V;
if (random.nextFloat() < 0.2f) {
particle.baseRadius = V + ((X - V) * random.nextFloat());
} else {
particle.baseRadius = W + ((V - W) * random.nextFloat());
}
float nextFloat = random.nextFloat();
particle.top = mBound.height() * ((0.18f * random.nextFloat()) + 0.2f);
particle.top = nextFloat < 0.2f ? particle.top : particle.top + ((particle.top * 0.2f) * random.nextFloat());
particle.bottom = (mBound.height() * (random.nextFloat() - 0.5f)) * 1.8f;
float f = nextFloat < 0.2f
? particle.bottom
: nextFloat < 0.8f ? particle.bottom * 0.6f : particle.bottom * 0.3f;
particle.bottom = f;
particle.mag = 4.0f * particle.top / particle.bottom;
particle.neg = (-particle.mag) / particle.bottom;
f = mBound.centerX() + (Y * (random.nextFloat() - 0.5f));
particle.baseCx = f;
particle.cx = f;
f = mBound.centerY() + (Y * (random.nextFloat() - 0.5f));
particle.baseCy = f;
particle.cy = f;
particle.life = END_VALUE / 10 * random.nextFloat();
particle.overflow = 0.4f * random.nextFloat();
particle.alpha = 1f;
return particle;
}
public boolean draw(Canvas canvas) {
if (!isStarted()) {
return false;
}
for (Particle particle : mParticles) {
particle.advance((float) getAnimatedValue());
if (particle.alpha > 0f) {
mPaint.setColor(particle.color);
mPaint.setAlpha((int) (Color.alpha(particle.color) * particle.alpha));
canvas.drawCircle(particle.cx, particle.cy, particle.radius, mPaint);
}
}
mContainer.invalidate();
return true;
}
@Override
public void start() {
super.start();
mContainer.invalidate(mBound);
}
private class Particle {
float alpha;
int color;
float cx;
float cy;
float radius;
float baseCx;
float baseCy;
float baseRadius;
float top;
float bottom;
float mag;
float neg;
float life;
float overflow;
public void advance(float factor) {
float f = 0f;
float normalization = factor / END_VALUE;
if (normalization < life || normalization > 1f - overflow) {
alpha = 0f;
return;
}
normalization = (normalization - life) / (1f - life - overflow);
float f2 = normalization * END_VALUE;
if (normalization >= 0.7f) {
f = (normalization - 0.7f) / 0.3f;
}
alpha = 1f - f;
f = bottom * f2;
cx = baseCx + f;
cy = (float) (baseCy - this.neg * Math.pow(f, 2.0)) - f * mag;
radius = V + (baseRadius - V) * f2;
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/effects/ExplosionField.java
================================================
package io.virtualapp.effects;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import io.virtualapp.VApp;
import io.virtualapp.abs.ui.VUiKit;
public class ExplosionField extends View {
private static final Canvas sCanvas = new Canvas();
private List<ExplosionAnimator> mExplosions = new ArrayList<>();
private int[] mExpandInset = new int[2];
public ExplosionField(Context context) {
super(context);
init();
}
public ExplosionField(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ExplosionField(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public static Bitmap createBitmapFromView(View view) {
if (view instanceof ImageView) {
Drawable drawable = ((ImageView) view).getDrawable();
if (drawable != null && drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
}
view.clearFocus();
Bitmap bitmap = createBitmapSafely(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888, 1);
if (bitmap != null) {
synchronized (sCanvas) {
Canvas canvas = sCanvas;
canvas.setBitmap(bitmap);
view.draw(canvas);
canvas.setBitmap(null);
}
}
return bitmap;
}
public static Bitmap createBitmapSafely(int width, int height, Bitmap.Config config, int retryCount) {
try {
return Bitmap.createBitmap(width, height, config);
} catch (OutOfMemoryError e) {
e.printStackTrace();
if (retryCount > 0) {
System.gc();
return createBitmapSafely(width, height, config, retryCount - 1);
}
return null;
}
}
public static ExplosionField attachToWindow(Activity activity) {
ViewGroup rootView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
ExplosionField explosionField = new ExplosionField(activity);
rootView.addView(explosionField,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return explosionField;
}
public static ExplosionField attachToWindow(ViewGroup rootView, Activity activity) {
ExplosionField explosionField = new ExplosionField(activity);
rootView.addView(explosionField,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return explosionField;
}
private void init() {
Arrays.fill(mExpandInset, VUiKit.dpToPx(VApp.getApp(), 32));
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (ExplosionAnimator explosion : mExplosions) {
explosion.draw(canvas);
}
}
public void expandExplosionBound(int dx, int dy) {
mExpandInset[0] = dx;
mExpandInset[1] = dy;
}
public void explode(Bitmap bitmap, Rect bound, long startDelay, long duration) {
final ExplosionAnimator explosion = new ExplosionAnimator(this, bitmap, bound);
explosion.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mExplosions.remove(animation);
}
});
explosion.setStartDelay(startDelay);
explosion.setDuration(duration);
mExplosions.add(explosion);
explosion.start();
}
public void explode(final View view) {
explode(view, null);
}
public void explode(final View view, OnExplodeFinishListener listener) {
Rect r = new Rect();
view.getGlobalVisibleRect(r);
int[] location = new int[2];
getLocationOnScreen(location);
r.offset(-location[0], -location[1]);
r.inset(-mExpandInset[0], -mExpandInset[1]);
int startDelay = 100;
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f).setDuration(150);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
Random random = new Random();
@Override
public void onAnimationUpdate(ValueAnimator animation) {
view.setTranslationX((random.nextFloat() - 0.5f) * view.getWidth() * 0.05f);
view.setTranslationY((random.nextFloat() - 0.5f) * view.getHeight() * 0.05f);
}
});
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (listener != null) {
listener.onExplodeFinish(view);
}
}
});
animator.start();
view.animate().setDuration(150).setStartDelay(startDelay).scaleX(0f).scaleY(0f).alpha(0f).start();
explode(createBitmapFromView(view), r, startDelay, ExplosionAnimator.DEFAULT_DURATION);
}
public void clear() {
mExplosions.clear();
invalidate();
}
public interface OnExplodeFinishListener {
void onExplodeFinish(View v);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/FlurryROMCollector.java
================================================
package io.virtualapp.home;
import android.hardware.Camera;
import android.os.Build;
import android.util.Log;
import com.flurry.android.FlurryAgent;
import com.flurry.android.FlurryEventRecordStatus;
import com.lody.virtual.client.natives.NativeMethods;
import com.lody.virtual.helper.utils.Reflect;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* @author Lody
*/
public class FlurryROMCollector {
private static final String TAG = FlurryROMCollector.class.getSimpleName();
public static void startCollect() {
Log.d(TAG, "start collect...");
NativeMethods.init();
if (NativeMethods.gCameraNativeSetup == null) {
reportCameraNativeSetup();
}
Log.d(TAG, "end collect...");
}
private static void reportCameraNativeSetup() {
for (Method method : Camera.class.getDeclaredMethods()) {
if ("native_setup".equals(method.getName())) {
FlurryEventRecordStatus status =
FlurryAgent.logEvent("camera::native_setup", createLogContent("method_details", Reflect.getMethodDetails(method)));
Log.d(TAG, "report CNS: " + status);
break;
}
}
}
private static Map<String, String> createLogContent(String tag, String value) {
Map<String, String> content = new HashMap<>(3);
addRomInfo(content);
content.put(tag, value);
return content;
}
private static void addRomInfo(Map<String, String> content) {
content.put("device", Build.DEVICE);
content.put("brand", Build.BRAND);
content.put("manufacturer", Build.MANUFACTURER);
content.put("display", Build.DISPLAY);
content.put("model", Build.MODEL);
content.put("protect", Build.PRODUCT);
content.put("sdk_version", "API-" + Build.VERSION.SDK_INT);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/HomeActivity.java
================================================
package io.virtualapp.home;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.ContextThemeWrapper;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.lody.virtual.GmsSupport;
import com.lody.virtual.client.stub.ChooseTypeAndAccountActivity;
import com.lody.virtual.os.VUserInfo;
import com.lody.virtual.os.VUserManager;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import io.virtualapp.R;
import io.virtualapp.VCommends;
import io.virtualapp.abs.nestedadapter.SmartRecyclerAdapter;
import io.virtualapp.abs.ui.VActivity;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.home.adapters.LaunchpadAdapter;
import io.virtualapp.home.adapters.decorations.ItemOffsetDecoration;
import io.virtualapp.home.location.VirtualLocationSettings;
import io.virtualapp.home.models.AddAppButton;
import io.virtualapp.home.models.AppData;
import io.virtualapp.home.models.AppInfoLite;
import io.virtualapp.home.models.EmptyAppData;
import io.virtualapp.home.models.MultiplePackageAppData;
import io.virtualapp.home.models.PackageAppData;
import io.virtualapp.widgets.TwoGearsView;
import static android.support.v7.widget.helper.ItemTouchHelper.ACTION_STATE_DRAG;
import static android.support.v7.widget.helper.ItemTouchHelper.DOWN;
import static android.support.v7.widget.helper.ItemTouchHelper.END;
import static android.support.v7.widget.helper.ItemTouchHelper.LEFT;
import static android.support.v7.widget.helper.ItemTouchHelper.RIGHT;
import static android.support.v7.widget.helper.ItemTouchHelper.START;
import static android.support.v7.widget.helper.ItemTouchHelper.UP;
/**
* @author Lody
*/
public class HomeActivity extends VActivity implements HomeContract.HomeView {
private static final String TAG = HomeActivity.class.getSimpleName();
private HomeContract.HomePresenter mPresenter;
private TwoGearsView mLoadingView;
private RecyclerView mLauncherView;
private View mMenuView;
private PopupMenu mPopupMenu;
private View mBottomArea;
private View mCreateShortcutBox;
private TextView mCreateShortcutTextView;
private View mDeleteAppBox;
private TextView mDeleteAppTextView;
private LaunchpadAdapter mLaunchpadAdapter;
private Handler mUiHandler;
public static void goHome(Context context) {
Intent intent = new Intent(context, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
overridePendingTransition(0, 0);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mUiHandler = new Handler(Looper.getMainLooper());
bindViews();
initLaunchpad();
initMenu();
new HomePresenterImpl(this).start();
}
private void initMenu() {
mPopupMenu = new PopupMenu(new ContextThemeWrapper(this, R.style.Theme_AppCompat_Light), mMenuView);
Menu menu = mPopupMenu.getMenu();
setIconEnable(menu, true);
menu.add("Accounts").setIcon(R.drawable.ic_account).setOnMenuItemClickListener(item -> {
List<VUserInfo> users = VUserManager.get().getUsers();
List<String> names = new ArrayList<>(users.size());
for (VUserInfo info : users) {
names.add(info.name);
}
CharSequence[] items = new CharSequence[names.size()];
for (int i = 0; i < names.size(); i++) {
items[i] = names.get(i);
}
new AlertDialog.Builder(this)
.setTitle("Please select an user")
.setItems(items, (dialog, which) -> {
VUserInfo info = users.get(which);
Intent intent = new Intent(this, ChooseTypeAndAccountActivity.class);
intent.putExtra(ChooseTypeAndAccountActivity.KEY_USER_ID, info.id);
startActivity(intent);
}).show();
return false;
});
menu.add("Virtual Storage").setIcon(R.drawable.ic_vs).setOnMenuItemClickListener(item -> {
Toast.makeText(this, "The coming", Toast.LENGTH_SHORT).show();
return false;
});
menu.add("Notification").setIcon(R.drawable.ic_notification).setOnMenuItemClickListener(item -> {
Toast.makeText(this, "The coming", Toast.LENGTH_SHORT).show();
return false;
});
menu.add("Virtual Location").setIcon(R.drawable.ic_notification).setOnMenuItemClickListener(item -> {
startActivity(new Intent(this, VirtualLocationSettings.class));
return true;
});
menu.add("Settings").setIcon(R.drawable.ic_settings).setOnMenuItemClickListener(item -> {
Toast.makeText(this, "The coming", Toast.LENGTH_SHORT).show();
return false;
});
mMenuView.setOnClickListener(v -> mPopupMenu.show());
}
private static void setIconEnable(Menu menu, boolean enable) {
try {
@SuppressLint("PrivateApi")
Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
m.invoke(menu, enable);
} catch (Exception e) {
e.printStackTrace();
}
}
private void bindViews() {
mLoadingView = (TwoGearsView) findViewById(R.id.pb_loading_app);
mLauncherView = (RecyclerView) findViewById(R.id.home_launcher);
mMenuView = findViewById(R.id.home_menu);
mBottomArea = findViewById(R.id.bottom_area);
mCreateShortcutBox = findViewById(R.id.create_shortcut_area);
mCreateShortcutTextView = (TextView) findViewById(R.id.create_shortcut_text);
mDeleteAppBox = findViewById(R.id.delete_app_area);
mDeleteAppTextView = (TextView) findViewById(R.id.delete_app_text);
}
private void initLaunchpad() {
mLauncherView.setHasFixedSize(true);
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, OrientationHelper.VERTICAL);
mLauncherView.setLayoutManager(layoutManager);
mLaunchpadAdapter = new LaunchpadAdapter(this);
SmartRecyclerAdapter wrap = new SmartRecyclerAdapter(mLaunchpadAdapter);
View footer = new View(this);
footer.setLayoutParams(new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, VUiKit.dpToPx(this, 60)));
wrap.setFooterView(footer);
mLauncherView.setAdapter(wrap);
mLauncherView.addItemDecoration(new ItemOffsetDecoration(this, R.dimen.desktop_divider));
ItemTouchHelper touchHelper = new ItemTouchHelper(new LauncherTouchCallback());
touchHelper.attachToRecyclerView(mLauncherView);
mLaunchpadAdapter.setAppClickListener((pos, data) -> {
if (!data.isLoading()) {
if (data instanceof AddAppButton) {
onAddAppButtonClick();
}
mLaunchpadAdapter.notifyItemChanged(pos);
mPresenter.launchApp(data);
}
});
}
private void onAddAppButtonClick() {
ListAppActivity.gotoListApp(this);
}
private void deleteApp(int position) {
AppData data = mLaunchpadAdapter.getList().get(position);
new AlertDialog.Builder(this)
.setTitle("Delete app")
.setMessage("Do you want to delete " + data.getName() + "?")
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
mPresenter.deleteApp(data);
})
.setNegativeButton(android.R.string.no, null)
.show();
}
private void createShortcut(int position) {
AppData model = mLaunchpadAdapter.getList().get(position);
if (model instanceof PackageAppData || model instanceof MultiplePackageAppData) {
mPresenter.createShortcut(model);
}
}
@Override
public void setPresenter(HomeContract.HomePresenter presenter) {
mPresenter = presenter;
}
@Override
public void showBottomAction() {
mBottomArea.setTranslationY(mBottomArea.getHeight());
mBottomArea.setVisibility(View.VISIBLE);
mBottomArea.animate().translationY(0).setDuration(500L).start();
}
@Override
public void hideBottomAction() {
mBottomArea.setTranslationY(0);
ObjectAnimator transAnim = ObjectAnimator.ofFloat(mBottomArea, "translationY", 0, mBottomArea.getHeight());
transAnim.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
mBottomArea.setVisibility(View.GONE);
}
@Override
public void onAnimationCancel(Animator animator) {
mBottomArea.setVisibility(View.GONE);
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
transAnim.setDuration(500L);
transAnim.start();
}
@Override
public void showLoading() {
mLoadingView.setVisibility(View.VISIBLE);
mLoadingView.startAnim();
}
@Override
public void hideLoading() {
mLoadingView.setVisibility(View.GONE);
mLoadingView.stopAnim();
}
@Override
public void loadFinish(List<AppData> list) {
list.add(new AddAppButton(this));
mLaunchpadAdapter.setList(list);
hideLoading();
}
@Override
public void loadError(Throwable err) {
err.printStackTrace();
hideLoading();
}
@Override
public void showGuide() {
}
@Override
public void addAppToLauncher(AppData model) {
List<AppData> dataList = mLaunchpadAdapter.getList();
boolean replaced = false;
for (int i = 0; i < dataList.size(); i++) {
AppData data = dataList.get(i);
if (data instanceof EmptyAppData) {
mLaunchpadAdapter.replace(i, model);
replaced = true;
break;
}
}
if (!replaced) {
mLaunchpadAdapter.add(model);
mLauncherView.smoothScrollToPosition(mLaunchpadAdapter.getItemCount() - 1);
}
}
@Override
public void removeAppToLauncher(AppData model) {
mLaunchpadAdapter.remove(model);
}
@Override
public void refreshLauncherItem(AppData model) {
mLaunchpadAdapter.refresh(model);
}
@Override
public void askInstallGms() {
new AlertDialog.Builder(this)
.setTitle("Hi")
.setMessage("We found that your device has been installed the Google service, whether you need to install them?")
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
defer().when(() -> {
GmsSupport.installGApps(0);
}).done((res) -> {
mPresenter.dataChanged();
});
})
.setNegativeButton(android.R.string.cancel, (dialog, which) ->
Toast.makeText(HomeActivity.this, "You can also find it in the Settings~", Toast.LENGTH_LONG).show())
.setCancelable(false)
.show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && data != null) {
List<AppInfoLite> appList = data.getParcelableArrayListExtra(VCommends.EXTRA_APP_INFO_LIST);
if (appList != null) {
for (AppInfoLite info : appList) {
mPresenter.addApp(info);
}
}
}
}
private class LauncherTouchCallback extends ItemTouchHelper.SimpleCallback {
int[] location = new int[2];
boolean upAtDeleteAppArea;
boolean upAtCreateShortcutArea;
RecyclerView.ViewHolder dragHolder;
LauncherTouchCallback() {
super(UP | DOWN | LEFT | RIGHT | START | END, 0);
}
@Override
public int interpolateOutOfBoundsScroll(RecyclerView recyclerView, int viewSize, int viewSizeOutOfBounds, int totalSize, long msSinceStartScroll) {
return 0;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
try {
AppData data = mLaunchpadAdapter.getList().get(viewHolder.getAdapterPosition());
if (!data.canReorder()) {
return makeMovementFlags(0, 0);
}
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
return super.getMovementFlags(recyclerView, viewHolder);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int pos = viewHolder.getAdapterPosition();
int targetPos = target.getAdapterPosition();
mLaunchpadAdapter.moveItem(pos, targetPos);
return true;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return false;
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (viewHolder instanceof LaunchpadAdapter.ViewHolder) {
if (actionState == ACTION_STATE_DRAG) {
if (dragHolder != viewHolder) {
dragHolder = viewHolder;
viewHolder.itemView.setScaleX(1.2f);
viewHolder.itemView.setScaleY(1.2f);
if (mBottomArea.getVisibility() == View.GONE) {
showBottomAction();
}
}
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current, RecyclerView.ViewHolder target) {
if (upAtCreateShortcutArea || upAtDeleteAppArea) {
return false;
}
try {
AppData data = mLaunchpadAdapter.getList().get(target.getAdapterPosition());
return data.canReorder();
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
return false;
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (viewHolder instanceof LaunchpadAdapter.ViewHolder) {
LaunchpadAdapter.ViewHolder holder = (LaunchpadAdapter.ViewHolder) viewHolder;
viewHolder.itemView.setScaleX(1f);
viewHolder.itemView.setScaleY(1f);
viewHolder.itemView.setBackgroundColor(holder.color);
}
super.clearView(recyclerView, viewHolder);
if (dragHolder == viewHolder) {
if (mBottomArea.getVisibility() == View.VISIBLE) {
mUiHandler.postDelayed(HomeActivity.this::hideBottomAction, 200L);
if (upAtCreateShortcutArea) {
createShortcut(viewHolder.getAdapterPosition());
} else if (upAtDeleteAppArea) {
deleteApp(viewHolder.getAdapterPosition());
}
}
dragHolder = null;
}
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
if (actionState != ACTION_STATE_DRAG || !isCurrentlyActive) {
return;
}
View itemView = viewHolder.itemView;
itemView.getLocationInWindow(location);
int x = (int) (location[0] + dX);
int y = (int) (location[1] + dY);
mBottomArea.getLocationInWindow(location);
int baseLine = location[1] - mBottomArea.getHeight();
if (y >= baseLine) {
mDeleteAppBox.getLocationInWindow(location);
int deleteAppAreaStartX = location[0];
if (x < deleteAppAreaStartX) {
upAtCreateShortcutArea = true;
upAtDeleteAppArea = false;
mCreateShortcutTextView.setTextColor(Color.parseColor("#0099cc"));
mDeleteAppTextView.setTextColor(Color.WHITE);
} else {
upAtDeleteAppArea = true;
upAtCreateShortcutArea = false;
mDeleteAppTextView.setTextColor(Color.parseColor("#0099cc"));
mCreateShortcutTextView.setTextColor(Color.WHITE);
}
} else {
upAtCreateShortcutArea = false;
upAtDeleteAppArea = false;
mDeleteAppTextView.setTextColor(Color.WHITE);
mCreateShortcutTextView.setTextColor(Color.WHITE);
}
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/HomeContract.java
================================================
package io.virtualapp.home;
import java.util.List;
import io.virtualapp.abs.BasePresenter;
import io.virtualapp.abs.BaseView;
import io.virtualapp.home.models.AppData;
import io.virtualapp.home.models.AppInfoLite;
/**
* @author Lody
*/
/* package */ class HomeContract {
/* package */ interface HomeView extends BaseView<HomePresenter> {
void showBottomAction();
void hideBottomAction();
void showLoading();
void hideLoading();
void loadFinish(List<AppData> appModels);
void loadError(Throwable err);
void showGuide();
void addAppToLauncher(AppData model);
void removeAppToLauncher(AppData model);
void refreshLauncherItem(AppData model);
void askInstallGms();
}
/* package */ interface HomePresenter extends BasePresenter {
void launchApp(AppData data);
void dataChanged();
void addApp(AppInfoLite info);
void deleteApp(AppData data);
void createShortcut(AppData data);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/HomePresenterImpl.java
================================================
package io.virtualapp.home;
import android.app.Activity;
import android.graphics.Bitmap;
import com.lody.virtual.GmsSupport;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.os.VUserInfo;
import com.lody.virtual.os.VUserManager;
import com.lody.virtual.remote.InstallResult;
import com.lody.virtual.remote.InstalledAppInfo;
import java.io.IOException;
import io.virtualapp.VCommends;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.home.models.AppData;
import io.virtualapp.home.models.AppInfoLite;
import io.virtualapp.home.models.MultiplePackageAppData;
import io.virtualapp.home.models.PackageAppData;
import io.virtualapp.home.repo.AppRepository;
import io.virtualapp.home.repo.PackageAppDataStorage;
import jonathanfinerty.once.Once;
/**
* @author Lody
*/
class HomePresenterImpl implements HomeContract.HomePresenter {
private HomeContract.HomeView mView;
private Activity mActivity;
private AppRepository mRepo;
private AppData mTempAppData;
HomePresenterImpl(HomeContract.HomeView view) {
mView = view;
mActivity = view.getActivity();
mRepo = new AppRepository(mActivity);
mView.setPresenter(this);
}
@Override
public void start() {
dataChanged();
if (!Once.beenDone(VCommends.TAG_SHOW_ADD_APP_GUIDE)) {
mView.showGuide();
Once.markDone(VCommends.TAG_SHOW_ADD_APP_GUIDE);
}
if (!Once.beenDone(VCommends.TAG_ASK_INSTALL_GMS) && GmsSupport.isOutsideGoogleFrameworkExist()) {
mView.askInstallGms();
Once.markDone(VCommends.TAG_ASK_INSTALL_GMS);
}
}
@Override
public void launchApp(AppData data) {
try {
if (data instanceof PackageAppData) {
PackageAppData appData = (PackageAppData) data;
appData.isFirstOpen = false;
LoadingActivity.launch(mActivity, appData.packageName, 0);
} else if (data instanceof MultiplePackageAppData) {
MultiplePackageAppData multipleData = (MultiplePackageAppData) data;
multipleData.isFirstOpen = false;
LoadingActivity.launch(mActivity, multipleData.appInfo.packageName, ((MultiplePackageAppData) data).userId);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void dataChanged() {
mView.showLoading();
mRepo.getVirtualApps().done(mView::loadFinish).fail(mView::loadError);
}
@Override
public void addApp(AppInfoLite info) {
class AddResult {
private PackageAppData appData;
private int userId;
private boolean justEnableHidden;
}
AddResult addResult = new AddResult();
VUiKit.defer().when(() -> {
InstalledAppInfo installedAppInfo = VirtualCore.get().getInstalledAppInfo(info.packageName, 0);
addResult.justEnableHidden = installedAppInfo != null;
if (addResult.justEnableHidden) {
int[] userIds = installedAppInfo.getInstalledUsers();
int nextUserId = userIds.length;
/*
Input : userIds = {0, 1, 3}
Output: nextUserId = 2
*/
for (int i = 0; i < userIds.length; i++) {
if (userIds[i] != i) {
nextUserId = i;
break;
}
}
addResult.userId = nextUserId;
if (VUserManager.get().getUserInfo(nextUserId) == null) {
// user not exist, create it automatically.
String nextUserName = "Space " + (nextUserId + 1);
VUserInfo newUserInfo = VUserManager.get().createUser(nextUserName, VUserInfo.FLAG_ADMIN);
if (newUserInfo == null) {
throw new IllegalStateException();
}
}
boolean success = VirtualCore.get().installPackageAsUser(nextUserId, info.packageName);
if (!success) {
throw new IllegalStateException();
}
} else {
InstallResult res = mRepo.addVirtualApp(info);
if (!res.isSuccess) {
throw new IllegalStateException();
}
}
}).then((res) -> {
addResult.appData = PackageAppDataStorage.get().acquire(info.packageName);
}).done(res -> {
boolean multipleVersion = addResult.justEnableHidden && addResult.userId != 0;
if (!multipleVersion) {
PackageAppData data = addResult.appData;
data.isLoading = true;
mView.addAppToLauncher(data);
handleOptApp(data, info.packageName, true);
} else {
MultiplePackageAppData data = new MultiplePackageAppData(addResult.appData, addResult.userId);
data.isLoading = true;
mView.addAppToLauncher(data);
handleOptApp(data, info.packageName, false);
}
});
}
private void handleOptApp(AppData data, String packageName, boolean needOpt) {
VUiKit.defer().when(() -> {
long time = System.currentTimeMillis();
if (needOpt) {
try {
VirtualCore.get().preOpt(packageName);
} catch (IOException e) {
e.printStackTrace();
}
}
time = System.currentTimeMillis() - time;
if (time < 1500L) {
try {
Thread.sleep(1500L - time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).done((res) -> {
if (data instanceof PackageAppData) {
((PackageAppData) data).isLoading = false;
((PackageAppData) data).isFirstOpen = true;
} else if (data instanceof MultiplePackageAppData) {
((MultiplePackageAppData) data).isLoading = false;
((MultiplePackageAppData) data).isFirstOpen = true;
}
mView.refreshLauncherItem(data);
});
}
@Override
public void deleteApp(AppData data) {
try {
mView.removeAppToLauncher(data);
if (data instanceof PackageAppData) {
mRepo.removeVirtualApp(((PackageAppData) data).packageName, 0);
} else {
MultiplePackageAppData appData = (MultiplePackageAppData) data;
mRepo.removeVirtualApp(appData.appInfo.packageName, appData.userId);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void createShortcut(AppData data) {
VirtualCore.OnEmitShortcutListener listener = new VirtualCore.OnEmitShortcutListener() {
@Override
public Bitmap getIcon(Bitmap originIcon) {
return originIcon;
}
@Override
public String getName(String originName) {
return originName + "(VA)";
}
};
if (data instanceof PackageAppData) {
VirtualCore.get().createShortcut(0, ((PackageAppData) data).packageName, listener);
} else if (data instanceof MultiplePackageAppData) {
MultiplePackageAppData appData = (MultiplePackageAppData) data;
VirtualCore.get().createShortcut(appData.userId, appData.appInfo.packageName, listener);
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppActivity.java
================================================
package io.virtualapp.home;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
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);
getWindow().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.colorPrimaryDark)));
setContentView(R.layout.activity_clone_app);
mToolBar = (Toolbar) findViewById(R.id.clone_app_tool_bar);
mTabLayout = (TabLayout) mToolBar.findViewById(R.id.clone_app_tab_layout);
mViewPager = (ViewPager) findViewById(R.id.clone_app_view_pager);
setupToolBar();
mViewPager.setAdapter(new AppPagerAdapter(getSupportFragmentManager()));
mTabLayout.setupWithViewPager(mViewPager);
// Request permission to access external storage
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
}
}
}
private void setupToolBar() {
setSupportActionBar(mToolBar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
for (int result : grantResults) {
if (result == PackageManager.PERMISSION_GRANTED) {
mViewPager.setAdapter(new AppPagerAdapter(getSupportFragmentManager()));
break;
}
}
}
}
================================================
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.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
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 java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import io.virtualapp.R;
import io.virtualapp.VCommends;
import io.virtualapp.abs.ui.VFragment;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.home.adapters.CloneAppListAdapter;
import io.virtualapp.home.adapters.decorations.ItemOffsetDecoration;
import io.virtualapp.home.models.AppInfo;
import io.virtualapp.home.models.AppInfoLite;
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 DragSelectRecyclerView mRecyclerView;
private ProgressBar mProgressBar;
private Button mInstallButton;
private CloneAppListAdapter mAdapter;
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);
}
@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);
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, OrientationHelper.VERTICAL));
mRecyclerView.addItemDecoration(new ItemOffsetDecoration(VUiKit.dpToPx(getContext(), 2)));
mAdapter = new CloneAppListAdapter(getActivity());
mRecyclerView.setAdapter(mAdapter);
mAdapter.setOnItemClickListener(new CloneAppListAdapter.ItemEventListener() {
@Override
public void onItemClick(AppInfo info, int position) {
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, 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));
}
Intent data = new Intent();
data.putParcelableArrayListExtra(VCommends.EXTRA_APP_INFO_LIST, dataList);
getActivity().setResult(Activity.RESULT_OK, data);
getActivity().finish();
});
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;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppPresenterImpl.java
================================================
package io.virtualapp.home;
import android.app.Activity;
import android.content.Intent;
import java.io.File;
import io.virtualapp.VCommends;
import io.virtualapp.home.repo.AppDataSource;
import io.virtualapp.home.models.PackageAppData;
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);
else
mRepository.getStorageApps(mActivity, from).done(mView::loadFinish);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/LoadingActivity.java
================================================
package io.virtualapp.home;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.RemoteException;
import android.widget.ImageView;
import android.widget.TextView;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.ipc.VActivityManager;
import java.util.Locale;
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;
/**
* @author Lody
*/
public class LoadingActivity extends VActivity {
private static final String PKG_NAME_ARGUMENT = "MODEL_ARGUMENT";
private static final String KEY_INTENT = "KEY_INTENT";
private static final String KEY_USER = "KEY_USER";
private PackageAppData appModel;
private EatBeansView loadingView;
public static void 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(PKG_NAME_ARGUMENT, packageName);
loadingPageIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
loadingPageIntent.putExtra(KEY_INTENT, intent);
loadingPageIntent.putExtra(KEY_USER, userId);
context.startActivity(loadingPageIntent);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading);
loadingView = (EatBeansView) findViewById(R.id.loading_anim);
int userId = getIntent().getIntExtra(KEY_USER, -1);
String pkg = getIntent().getStringExtra(PKG_NAME_ARGUMENT);
appModel = PackageAppDataStorage.get().acquire(pkg);
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(KEY_INTENT);
if (intent == null) {
return;
}
VirtualCore.get().setUiCallback(intent, mUiCallback);
VUiKit.defer().when(() -> {
if (!appModel.fastOpen) {
try {
VirtualCore.get().preOpt(appModel.packageName);
} catch (Exception e) {
e.printStackTrace();
}
}
VActivityManager.get().startActivity(intent, userId);
});
}
private final VirtualCore.UiCallback mUiCallback = new VirtualCore.UiCallback() {
@Override
public void onAppOpened(String packageName, int userId) throws RemoteException {
finish();
}
};
@Override
protected void onResume() {
super.onResume();
loadingView.startAnim();
}
@Override
protected void onPause() {
super.onPause();
loadingView.stopAnim();
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppLocationAdapter.java
================================================
package io.virtualapp.home.adapters;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import io.virtualapp.R;
import io.virtualapp.abs.ui.BaseAdapterPlus;
import io.virtualapp.home.models.LocationData;
public class AppLocationAdapter extends BaseAdapterPlus<LocationData> {
public AppLocationAdapter(Context context) {
super(context);
}
@Override
protected View createView(int position, ViewGroup parent) {
View view = inflate(R.layout.item_location_app, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
view.setTag(viewHolder);
return view;
}
@Override
protected void attach(View view, LocationData item, int position) {
ViewHolder viewHolder = (ViewHolder) view.getTag();
viewHolder.icon.setImageDrawable(item.icon);
viewHolder.label.setText(item.name);
if (item.location != null && item.mode != 0) {
viewHolder.location.setText(item.location.latitude + "," + item.location.longitude);
} else {
viewHolder.location.setText("real location");
}
}
static class ViewHolder extends BaseAdapterPlus.BaseViewHolder {
public ViewHolder(View view) {
super(view);
icon = $(R.id.item_app_icon);
label = $(R.id.item_app_name);
location = $(R.id.item_location);
}
final ImageView icon;
final TextView label, location;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java
================================================
package io.virtualapp.home.adapters;
import android.content.Context;
import android.os.Build;
import android.os.Environment;
import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.lody.virtual.helper.utils.Reflect;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import io.virtualapp.R;
import io.virtualapp.VApp;
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(VApp.getApp().getResources().getString(R.string.clone_apps));
dirs.add(null);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Context ctx = VApp.getApp();
StorageManager storage = (StorageManager) ctx.getSystemService(Context.STORAGE_SERVICE);
for (StorageVolume volume : storage.getStorageVolumes()) {
//Why the fuck are getPathFile and getUserLabel hidden?!
//StorageVolume is kinda useless without those...
File dir = Reflect.on(volume).call("getPathFile").get();
String label = Reflect.on(volume).call("getUserLabel").get();
if (dir.listFiles() != null) {
titles.add(label);
dirs.add(dir);
}
}
} else {
// Fallback: only support the default storage sources
File storageFir = Environment.getExternalStorageDirectory();
if (storageFir != null && storageFir.isDirectory()) {
titles.add(VApp.getApp().getResources().getString(R.string.external_storage));
dirs.add(storageFir);
}
}
}
@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.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.util.List;
import io.virtualapp.R;
import io.virtualapp.abs.ui.VUiKit;
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;
public CloneAppListAdapter(Context context) {
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);
holder.iconView.setImageDrawable(info.icon);
holder.nameView.setText(info.name);
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/adapters/LaunchpadAdapter.java
================================================
package io.virtualapp.home.adapters;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import io.virtualapp.R;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.home.models.AppData;
import io.virtualapp.home.models.MultiplePackageAppData;
import io.virtualapp.widgets.LabelView;
import io.virtualapp.widgets.LauncherIconView;
/**
* @author Lody
*/
public class LaunchpadAdapter extends RecyclerView.Adapter<LaunchpadAdapter.ViewHolder> {
private LayoutInflater mInflater;
private List<AppData> mList;
private SparseIntArray mColorArray = new SparseIntArray();
private OnAppClickListener mAppClickListener;
public LaunchpadAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public void add(AppData model) {
int insertPos = mList.size() - 1;
mList.add(insertPos, model);
notifyItemInserted(insertPos);
}
public void replace(int index, AppData data) {
mList.set(index, data);
notifyItemChanged(index);
}
public void remove(AppData data) {
if (mList.remove(data)) {
notifyDataSetChanged();
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(mInflater.inflate(R.layout.item_launcher_app, null));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
AppData data = mList.get(position);
holder.color = getColor(position);
holder.iconView.setImageDrawable(data.getIcon());
holder.nameView.setText(data.getName());
if (data.isFirstOpen() && !data.isLoading()) {
holder.firstOpenDot.setVisibility(View.VISIBLE);
} else {
holder.firstOpenDot.setVisibility(View.INVISIBLE);
}
holder.itemView.setBackgroundColor(holder.color);
holder.itemView.setOnClickListener(v -> {
if (mAppClickListener != null) {
mAppClickListener.onAppClick(position, data);
}
});
if (data instanceof MultiplePackageAppData) {
MultiplePackageAppData multipleData = (MultiplePackageAppData) data;
holder.spaceLabelView.setVisibility(View.VISIBLE);
holder.spaceLabelView.setText(multipleData.userId + 1 + "");
} else {
holder.spaceLabelView.setVisibility(View.INVISIBLE);
}
if (data.isLoading()) {
startLoadingAnimation(holder.iconView);
} else {
holder.iconView.setProgress(100, false);
}
}
private void startLoadingAnimation(LauncherIconView iconView) {
iconView.setProgress(40, true);
VUiKit.defer().when(() -> {
try {
Thread.sleep(900L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).done((res) -> iconView.setProgress(80, true));
}
private int getColor(int position) {
int color = mColorArray.get(position);
if (color == 0) {
int type = position % 3;
int row = position / 3;
int rowType = row % 3;
if (rowType == 0) {
if (type == 0) {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorA);
} else if (type == 1) {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorB);
} else {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorC);
}
} else if (rowType == 1) {
if (type == 0) {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorB);
} else if (type == 1) {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorC);
} else {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorA);
}
} else {
if (type == 0) {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorC);
} else if (type == 1) {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorA);
} else {
color = mInflater.getContext().getResources().getColor(R.color.desktopColorB);
}
}
mColorArray.put(position, color);
}
return color;
}
@Override
public int getItemCount() {
return mList == null ? 0 : mList.size();
}
public List<AppData> getList() {
return mList;
}
public void setList(List<AppData> list) {
this.mList = list;
notifyDataSetChanged();
}
public void setAppClickListener(OnAppClickListener mAppClickListener) {
this.mAppClickListener = mAppClickListener;
}
public void moveItem(int pos, int targetPos) {
AppData model = mList.remove(pos);
mList.add(targetPos, model);
notifyItemMoved(pos, targetPos);
}
public void refresh(AppData model) {
int index = mList.indexOf(model);
if (index >= 0) {
notifyItemChanged(index);
}
}
public interface OnAppClickListener {
void onAppClick(int position, AppData model);
}
public class ViewHolder extends RecyclerView.ViewHolder {
public int color;
LauncherIconView iconView;
TextView nameView;
LabelView spaceLabelView;
View firstOpenDot;
ViewHolder(View itemView) {
super(itemView);
iconView = (LauncherIconView) itemView.findViewById(R.id.item_app_icon);
nameView = (TextView) itemView.findViewById(R.id.item_app_name);
spaceLabelView = (LabelView) itemView.findViewById(R.id.item_app_space_idx);
firstOpenDot = itemView.findViewById(R.id.item_first_open_dot);
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/decorations/ItemOffsetDecoration.java
================================================
package io.virtualapp.home.adapters.decorations;
import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.DimenRes;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
public class ItemOffsetDecoration extends RecyclerView.ItemDecoration {
private int mItemOffset;
public ItemOffsetDecoration(int itemOffset) {
mItemOffset = itemOffset;
}
public ItemOffsetDecoration(@NonNull Context context, @DimenRes int itemOffsetId) {
this(context.getResources().getDimensionPixelSize(itemOffsetId));
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
outRect.set(mItemOffset, mItemOffset, mItemOffset, mItemOffset);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/location/MarkerActivity.java
================================================
package io.virtualapp.home.location;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.lody.virtual.helper.utils.VLog;
import com.lody.virtual.remote.vloc.VLocation;
import com.tencent.lbssearch.TencentSearch;
import com.tencent.lbssearch.httpresponse.BaseObject;
import com.tencent.lbssearch.httpresponse.HttpResponseListener;
import com.tencent.lbssearch.object.Location;
import com.tencent.lbssearch.object.param.Geo2AddressParam;
import com.tencent.lbssearch.object.result.Geo2AddressResultObject;
import com.tencent.map.geolocation.TencentLocation;
import com.tencent.map.geolocation.TencentLocationListener;
import com.tencent.map.geolocation.TencentLocationManager;
import com.tencent.map.geolocation.TencentLocationRequest;
import com.tencent.mapsdk.raster.model.BitmapDescriptorFactory;
import com.tencent.mapsdk.raster.model.CameraPosition;
import com.tencent.mapsdk.raster.model.LatLng;
import com.tencent.mapsdk.raster.model.MarkerOptions;
import com.tencent.tencentmap.mapsdk.map.CameraUpdateFactory;
import com.tencent.tencentmap.mapsdk.map.MapView;
import com.tencent.tencentmap.mapsdk.map.TencentMap;
import io.virtualapp.abs.ui.VActivity;
import io.virtualapp.R;
public class MarkerActivity extends VActivity implements TencentMap.OnMapClickListener, TencentLocationListener {
private TencentMap mMap;
private MapView mapView;
private LatLng mLatLng = new LatLng(39.9182645956, 116.3970032689);
private TextView pathText;
private TencentSearch geocoderSearch;
private String mAddress;
private boolean isNoPoint = true;
private VLocation mVLocation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_marker);
setResult(Activity.RESULT_CANCELED);
Toolbar toolbar = bind(R.id.task_top_toolbar);
setSupportActionBar(toolbar);
//地址显示,暂时不用
pathText = bind(R.id.address);
pathText.setVisibility(View.VISIBLE);
enableBackHome();
mapView = (MapView) findViewById(R.id.map);
mapView.onCreate(savedInstanceState); // 此方法必须重写
mMap = mapView.getMap();
mMap.setOnMapClickListener(this);
geocoderSearch = new TencentSearch(this);
//
Intent data = getIntent();
if (data != null) {
mVLocation = data.getParcelableExtra(EXTRA_LOCATION);
if (mVLocation != null && mVLocation.latitude != 0 && mVLocation.longitude != 0) {
mLatLng = new LatLng(mVLocation.latitude, mVLocation.longitude);
isNoPoint = false;
}
}
if (isNoPoint) {
startLocation();
} else {
onMapClick(mLatLng);
}
}
@SuppressWarnings("unchecked")
protected <T extends View> T bind(int id) {
return (T) findViewById(id);
}
public void enableBackHome() {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
private void startLocation() {
Toast.makeText(this, "start location", Toast.LENGTH_SHORT).show();
TencentLocationRequest request = TencentLocationRequest.create()
.setRequestLevel(TencentLocationRequest.REQUEST_LEVEL_GEO)
.setAllowGPS(true);
int error = TencentLocationManager.getInstance(this)
.requestLocationUpdates(request, this);
if (error != 0) {
VLog.w("TMap", "startLocation:error=" + error);
}
}
@Override
public void onLocationChanged(TencentLocation location, int error, String msg) {
if (location != null) {
TencentLocationManager.getInstance(this).removeUpdates(this);
onMapClick(new LatLng(location.getLatitude(), location.getLongitude()));
} else {
String errText = "定位失败," + error + ": " + msg;
VLog.e("TMap", errText);
}
}
@Override
public void onStatusUpdate(String s, int i, String s1) {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.marktet_map, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
case R.id.action_clear:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Question");
builder.setMessage("Clear virtual location");
builder.setNegativeButton(android.R.string.ok, (d, s) -> {
if (mMap != null) {
mMap.clearAllOverlays();
}
setResultOk(null);
finish();
d.dismiss();
});
builder.setNeutralButton(android.R.string.cancel, (d, s) -> {
d.dismiss();
});
builder.show();
break;
case R.id.action_ok:
if (mLatLng != null) {
/**
* TODO edit info
* @see com.lody.virtual.remote.vloc.VLocation#altitude
* @see com.lody.virtual.remote.vloc.VLocation#accuracy
* @see com.lody.virtual.remote.vloc.VLocation#speed
* @see com.lody.virtual.remote.vloc.VLocation#bearing
*/
if (mVLocation == null) {
mVLocation = new VLocation();
mVLocation.accuracy = 50;
}
mVLocation.latitude = mLatLng.getLatitude();
mVLocation.longitude = mLatLng.getLongitude();
setResultOk(mVLocation);
finish();
}
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onMapClick(LatLng latLng) {
mLatLng = latLng;
MarkerOptions markerOption = new MarkerOptions()
.icon(BitmapDescriptorFactory.defaultMarker())
.position(mLatLng)
.draggable(true);
mMap.clearAllOverlays();
mMap.addMarker(markerOption);
int level = Math.min(mMap.getZoomLevel(), mMap.getMaxZoomLevel() / 3 * 2);
mMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(latLng, level)));
//查询地理位置
ProgressDialog dialog = ProgressDialog.show(this, null, "get address of location");
Geo2AddressParam param = new Geo2AddressParam()
.location(new Location()
.lat((float) latLng.getLatitude())
.lng((float) latLng.getLongitude()));
geocoderSearch.geo2address(param, new HttpResponseListener() {
@Override
public void onSuccess(int i, BaseObject object) {
Geo2AddressResultObject oj = (Geo2AddressResultObject) object;
if (oj.result != null) {
pathText.setText(oj.result.address);
mAddress = oj.result.address;
}
dialog.dismiss();
}
@Override
public void onFailure(int i, String s, Throwable throwable) {
dialog.dismiss();
pathText.setText("error:" + s);
}
});
}
/**
* 方法必须重写
*/
@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}
/**
* 方法必须重写
*/
@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}
/**
* 方法必须重写
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
/**
* 方法必须重写
*/
@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
private void setResultOk(VLocation location) {
Intent intent = new Intent();
intent.putExtra(EXTRA_LOCATION, location);
setResult(Activity.RESULT_OK, intent);
}
public static final String EXTRA_LOCATION = "virtual_location";
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/location/VirtualLocationSettings.java
================================================
package io.virtualapp.home.location;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.ipc.VirtualLocationManager;
import com.lody.virtual.helper.utils.VLog;
import com.lody.virtual.remote.InstalledAppInfo;
import com.lody.virtual.remote.vloc.VLocation;
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.home.adapters.AppLocationAdapter;
import io.virtualapp.home.models.LocationData;
import io.virtualapp.home.repo.AppRepository;
import static io.virtualapp.home.location.MarkerActivity.EXTRA_LOCATION;
public class VirtualLocationSettings extends VActivity implements AdapterView.OnItemClickListener {
private static final int REQUSET_CODE = 1001;
private AppRepository mRepo;
private ListView mListView;
private AppLocationAdapter mAppLocationAdapter;
private LocationData mSelectData;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location_settings);
mListView = (ListView) findViewById(R.id.appdata_list);
mRepo = new AppRepository(this);
mAppLocationAdapter = new AppLocationAdapter(this);
mListView.setAdapter(mAppLocationAdapter);
mListView.setOnItemClickListener(this);
loadData();
}
private void readLocation(LocationData locationData) {
locationData.mode = VirtualLocationManager.get().getMode(locationData.userId, locationData.packageName);
locationData.location = VirtualLocationManager.get().getLocation(locationData.userId, locationData.packageName);
}
private void saveLocation(LocationData locationData) {
if(locationData.location == null||locationData.location.isEmpty()){
VirtualLocationManager.get().setMode(locationData.userId, locationData.packageName, 0);
}else if(locationData.mode != 2){
VirtualLocationManager.get().setMode(locationData.userId, locationData.packageName, 2);
}
VirtualLocationManager.get().setLocation(locationData.userId, locationData.packageName, locationData.location);
}
private void loadData() {
ProgressDialog dialog = ProgressDialog.show(this, null, "loading");
VUiKit.defer().when(() -> {
List<InstalledAppInfo> infos = VirtualCore.get().getInstalledApps(0);
List<LocationData> models = new ArrayList<>();
for (InstalledAppInfo info : infos) {
if (!VirtualCore.get().isPackageLaunchable(info.packageName)) {
continue;
}
int[] userIds = info.getInstalledUsers();
for (int userId : userIds) {
LocationData data = new LocationData(this, info, userId);
readLocation(data);
models.add(data);
}
}
return models;
}).done((list) -> {
dialog.dismiss();
mAppLocationAdapter.set(list);
mAppLocationAdapter.notifyDataSetChanged();
}).fail((e) -> {
dialog.dismiss();
});
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mSelectData = mAppLocationAdapter.getItem(position);
Intent intent = new Intent(this, MarkerActivity.class);
if (mSelectData.location != null) {
intent.putExtra(EXTRA_LOCATION, mSelectData.location);
}
startActivityForResult(intent, REQUSET_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUSET_CODE) {
if (resultCode == RESULT_OK) {
VLocation location = data.getParcelableExtra(EXTRA_LOCATION);
if (mSelectData != null) {
mSelectData.location = location;
VLog.i("kk", "set" + mSelectData);
saveLocation(mSelectData);
mSelectData = null;
loadData();
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AddAppButton.java
================================================
package io.virtualapp.home.models;
import android.content.Context;
import android.graphics.drawable.Drawable;
import io.virtualapp.R;
/**
* @author Lody
*/
public class AddAppButton implements AppData {
private String name;
private Drawable icon;
public AddAppButton(Context context) {
name = context.getResources().getString(R.string.add_app);
icon = context.getResources().getDrawable(R.drawable.ic_add_circle);
}
@Override
public boolean isLoading() {
return false;
}
@Override
public boolean isFirstOpen() {
return false;
}
@Override
public Drawable getIcon() {
return icon;
}
@Override
public String getName() {
return name;
}
@Override
public boolean canReorder() {
return false;
}
@Override
public boolean canLaunch() {
return false;
}
@Override
public boolean canDelete() {
return false;
}
@Override
public boolean canCreateShortcut() {
return false;
}
}
================================================
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 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 int cloneCount;
}
================================================
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 AppInfoLite(String packageName, String path, boolean fastOpen) {
this.packageName = packageName;
this.path = path;
this.fastOpen = fastOpen;
}
protected AppInfoLite(Parcel in) {
this.packageName = in.readString();
this.path = in.readString();
this.fastOpen = 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);
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/EmptyAppData.java
================================================
package io.virtualapp.home.models;
import android.graphics.drawable.Drawable;
/**
* @author Lody
*/
public class EmptyAppData implements AppData {
@Override
public boolean isLoading() {
return false;
}
@Override
public boolean isFirstOpen() {
return false;
}
@Override
public Drawable getIcon() {
return null;
}
@Override
public String getName() {
return null;
}
@Override
public boolean canReorder() {
return false;
}
@Override
public boolean canLaunch() {
return false;
}
@Override
public boolean canDelete() {
return false;
}
@Override
public boolean canCreateShortcut() {
return false;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/LocationData.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;
import com.lody.virtual.remote.vloc.VLocation;
/**
* @see android.location.Location
*/
public class LocationData {
public String packageName;
public int userId;
public String name;
public Drawable icon;
public int mode;
public VLocation location;
public LocationData() {
}
public LocationData(Context context, InstalledAppInfo installedAppInfo, int userId) {
this.packageName = installedAppInfo.packageName;
this.userId = userId;
loadData(context, installedAppInfo.getApplicationInfo(installedAppInfo.getInstalledUsers()[0]));
}
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 String toString() {
return "LocationData{" +
"packageName='" + packageName + '\'' +
", userId=" + userId +
", location=" + location +
'}';
}
}
================================================
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 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 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 PackageAppData(Context context, InstalledAppInfo installedAppInfo) {
this.packageName = installedAppInfo.packageName;
this.isFirstOpen = !installedAppInfo.isLaunched(0);
loadData(context, installedAppInfo.getApplicationInfo(installedAppInfo.getInstalledUsers()[0]));
}
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 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/platform/PlatformInfo.java
================================================
package io.virtualapp.home.platform;
import android.content.pm.PackageInfo;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
/**
* @author Lody
*/
public abstract class PlatformInfo {
private final Set<String> platformPkgs = new HashSet<>();
public PlatformInfo(String... pkgs) {
Collections.addAll(platformPkgs, pkgs);
}
public abstract boolean relyOnPlatform(PackageInfo info);
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/platform/WechatPlatformInfo.java
================================================
package io.virtualapp.home.platform;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
/**
* @author Lody
*/
public class WechatPlatformInfo extends PlatformInfo {
public WechatPlatformInfo() {
super("com.tencent.mm");
}
@Override
public boolean relyOnPlatform(PackageInfo info) {
if (info.activities == null) {
return false;
}
for (ActivityInfo activityInfo : info.activities) {
if (activityInfo.name.endsWith("WXEntryActivity")) {
return true;
}
}
return false;
}
}
================================================
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.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.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;
/**
* @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 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(0), 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));
}
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 the System package
if (isSystemApplication(pkg)) {
continue;
}
ApplicationInfo ai = pkg.applicationInfo;
String path = ai.publicSourceDir != null ? ai.publicSourceDir : ai.sourceDir;
if (path == null) {
continue;
}
AppInfo info = new AppInfo();
info.packageName = pkg.packageName;
info.fastOpen = fastOpen;
info.path = path;
info.icon = ai.loadIcon(pm);
info.name = ai.loadLabel(pm);
InstalledAppInfo installedAppInfo = VirtualCore.get().getInstalledAppInfo(pkg.packageName, 0);
if (installedAppInfo != null) {
info.cloneCount = installedAppInfo.getInstalledUsers().length;
}
list.add(info);
}
return list;
}
@Override
public InstallResult addVirtualApp(AppInfoLite info) {
int flags = InstallStrategy.COMPARE_VERSION | InstallStrategy.SKIP_DEX_OPT;
if (info.fastOpen) {
flags |= InstallStrategy.DEPEND_SYSTEM_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 com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.remote.InstalledAppInfo;
import java.util.HashMap;
import java.util.Map;
import io.virtualapp.VApp;
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(VApp.getApp(), setting);
synchronized (packageDataMap) {
packageDataMap.put(packageName, data);
}
return data;
}
return null;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/splash/SplashActivity.java
================================================
package io.virtualapp.splash;
import android.os.Bundle;
import android.view.WindowManager;
import com.lody.virtual.client.core.VirtualCore;
import io.virtualapp.R;
import io.virtualapp.VCommends;
import io.virtualapp.abs.ui.VActivity;
import io.virtualapp.abs.ui.VUiKit;
import io.virtualapp.home.FlurryROMCollector;
import io.virtualapp.home.HomeActivity;
import jonathanfinerty.once.Once;
public class SplashActivity extends VActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
@SuppressWarnings("unused")
boolean enterGuide = !Once.beenDone(Once.THIS_APP_INSTALL, VCommends.TAG_NEW_VERSION);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
VUiKit.defer().when(() -> {
if (!Once.beenDone("collect_flurry")) {
FlurryROMCollector.startCollect();
Once.markDone("collect_flurry");
}
long time = System.currentTimeMillis();
doActionInThread();
time = System.currentTimeMillis() - time;
long delta = 3000L - time;
if (delta > 0) {
VUiKit.sleep(delta);
}
}).done((res) -> {
HomeActivity.goHome(this);
finish();
});
}
private void doActionInThread() {
if (!VirtualCore.get().isEngineLaunched()) {
VirtualCore.get().waitForEngine();
}
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/vs/VSManagerActivity.java
================================================
package io.virtualapp.vs;
import io.virtualapp.abs.ui.VActivity;
/**
* @author Lody
*
*
*
*/
public class VSManagerActivity extends VActivity {
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/BallGridBeatIndicator.java
================================================
package io.virtualapp.widgets;
import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.Paint;
import java.util.ArrayList;
public class BallGridBeatIndicator extends Indicator {
private static final int ALPHA = 255;
private static final int[] ALPHAS = new int[]{ALPHA,
ALPHA,
ALPHA,
ALPHA,
ALPHA,
ALPHA,
ALPHA,
ALPHA,
ALPHA};
@Override
public void draw(Canvas canvas, Paint paint) {
float circleSpacing = 4;
float radius = (getWidth() - circleSpacing * 4) / 6;
float x = getWidth() / 2 - (radius * 2 + circleSpacing);
float y = getWidth() / 2 - (radius * 2 + circleSpacing);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
canvas.save();
float translateX = x + (radius * 2) * j + circleSpacing * j;
float translateY = y + (radius * 2) * i + circleSpacing * i;
canvas.translate(translateX, translateY);
paint.setAlpha(ALPHAS[3 * i + j]);
canvas.drawCircle(0, 0, radius, paint);
canvas.restore();
}
}
}
@Override
public ArrayList<ValueAnimator> onCreateAnimators() {
ArrayList<ValueAnimator> animators = new ArrayList<>();
int[] durations = {960, 930, 1190, 1130, 1340, 940, 1200, 820, 1190};
int[] delays = {360, 400, 680, 410, 710, -150, -120, 10, 320};
for (int i = 0; i < 9; i++) {
final int index = i;
ValueAnimator alphaAnim = ValueAnimator.ofInt(255, 168, 255);
alphaAnim.setDuration(durations[i]);
alphaAnim.setRepeatCount(-1);
alphaAnim.setStartDelay(delays[i]);
addUpdateListener(alphaAnim, animation -> {
ALPHAS[index] = (int) animation.getAnimatedValue();
postInvalidate();
});
animators.add(alphaAnim);
}
return animators;
}
}
================================================
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/BallPulseIndicator.java
================================================
package io.virtualapp.widgets;
import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.Paint;
import java.util.ArrayList;
public class BallPulseIndicator extends Indicator {
public s
gitextract_bfy_ta4s/
├── .gitignore
├── README.md
├── README_eng.md
├── VirtualApp/
│ ├── .gitignore
│ ├── app/
│ │ ├── .gitignore
│ │ ├── build.gradle
│ │ ├── libs/
│ │ │ ├── TencentLocationSDK_v6.1.2_r1df4baaa_170627_1056.jar
│ │ │ ├── TencentMapSDK_Raster_v_1.2.8_e45bcd0.jar
│ │ │ └── TencentMapSearch_v1.1.7.3207904.jar
│ │ ├── proguard-rules.pro
│ │ └── src/
│ │ └── main/
│ │ ├── AndroidManifest.xml
│ │ ├── assets/
│ │ │ └── OaceOaT8w5Xda6wa
│ │ ├── java/
│ │ │ └── io/
│ │ │ └── virtualapp/
│ │ │ ├── VApp.java
│ │ │ ├── VCommends.java
│ │ │ ├── abs/
│ │ │ │ ├── BasePresenter.java
│ │ │ │ ├── BaseView.java
│ │ │ │ ├── Callback.java
│ │ │ │ ├── Value.java
│ │ │ │ ├── nestedadapter/
│ │ │ │ │ ├── RecyclerViewAdapterWrapper.java
│ │ │ │ │ └── SmartRecyclerAdapter.java
│ │ │ │ ├── percent/
│ │ │ │ │ └── PercentLinearLayout.java
│ │ │ │ ├── reflect/
│ │ │ │ │ └── ReflectException.java
│ │ │ │ └── ui/
│ │ │ │ ├── BaseAdapterPlus.java
│ │ │ │ ├── VActivity.java
│ │ │ │ ├── VFragment.java
│ │ │ │ └── VUiKit.java
│ │ │ ├── delegate/
│ │ │ │ ├── MyAppRequestListener.java
│ │ │ │ ├── MyComponentDelegate.java
│ │ │ │ ├── MyPhoneInfoDelegate.java
│ │ │ │ └── MyTaskDescriptionDelegate.java
│ │ │ ├── effects/
│ │ │ │ ├── ExplosionAnimator.java
│ │ │ │ └── ExplosionField.java
│ │ │ ├── home/
│ │ │ │ ├── FlurryROMCollector.java
│ │ │ │ ├── HomeActivity.java
│ │ │ │ ├── HomeContract.java
│ │ │ │ ├── HomePresenterImpl.java
│ │ │ │ ├── ListAppActivity.java
│ │ │ │ ├── ListAppContract.java
│ │ │ │ ├── ListAppFragment.java
│ │ │ │ ├── ListAppPresenterImpl.java
│ │ │ │ ├── LoadingActivity.java
│ │ │ │ ├── adapters/
│ │ │ │ │ ├── AppLocationAdapter.java
│ │ │ │ │ ├── AppPagerAdapter.java
│ │ │ │ │ ├── CloneAppListAdapter.java
│ │ │ │ │ ├── LaunchpadAdapter.java
│ │ │ │ │ └── decorations/
│ │ │ │ │ └── ItemOffsetDecoration.java
│ │ │ │ ├── location/
│ │ │ │ │ ├── MarkerActivity.java
│ │ │ │ │ └── VirtualLocationSettings.java
│ │ │ │ ├── models/
│ │ │ │ │ ├── AddAppButton.java
│ │ │ │ │ ├── AppData.java
│ │ │ │ │ ├── AppInfo.java
│ │ │ │ │ ├── AppInfoLite.java
│ │ │ │ │ ├── EmptyAppData.java
│ │ │ │ │ ├── LocationData.java
│ │ │ │ │ ├── MultiplePackageAppData.java
│ │ │ │ │ └── PackageAppData.java
│ │ │ │ ├── platform/
│ │ │ │ │ ├── PlatformInfo.java
│ │ │ │ │ └── WechatPlatformInfo.java
│ │ │ │ └── repo/
│ │ │ │ ├── AppDataSource.java
│ │ │ │ ├── AppRepository.java
│ │ │ │ └── PackageAppDataStorage.java
│ │ │ ├── splash/
│ │ │ │ └── SplashActivity.java
│ │ │ ├── vs/
│ │ │ │ └── VSManagerActivity.java
│ │ │ └── widgets/
│ │ │ ├── BallGridBeatIndicator.java
│ │ │ ├── BallPulseIndicator.java
│ │ │ ├── BaseView.java
│ │ │ ├── CardStackAdapter.java
│ │ │ ├── CardStackLayout.java
│ │ │ ├── CircularAnim.java
│ │ │ ├── DragSelectRecyclerView.java
│ │ │ ├── DragSelectRecyclerViewAdapter.java
│ │ │ ├── EatBeansView.java
│ │ │ ├── Indicator.java
│ │ │ ├── LabelView.java
│ │ │ ├── LauncherIconView.java
│ │ │ ├── LoadingIndicatorView.java
│ │ │ ├── MarqueeTextView.java
│ │ │ ├── MaterialRippleLayout.java
│ │ │ ├── RippleButton.java
│ │ │ ├── ShadowProperty.java
│ │ │ ├── ShadowViewDrawable.java
│ │ │ ├── Shimmer.java
│ │ │ ├── ShimmerViewBase.java
│ │ │ ├── ShimmerViewHelper.java
│ │ │ ├── TwoGearsView.java
│ │ │ ├── ViewHelper.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
│ │ ├── layout/
│ │ │ ├── activity_clone_app.xml
│ │ │ ├── activity_home.xml
│ │ │ ├── activity_install.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_clone_app.xml
│ │ │ ├── item_launcher_app.xml
│ │ │ ├── item_location_app.xml
│ │ │ └── item_user.xml
│ │ ├── menu/
│ │ │ ├── marktet_map.xml
│ │ │ └── user_menu.xml
│ │ ├── values/
│ │ │ ├── attrs.xml
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── fitTextView.xml
│ │ │ ├── ids.xml
│ │ │ ├── integers.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ ├── values-zh-rCN/
│ │ │ └── strings.xml
│ │ └── values-zh-rTW/
│ │ └── strings.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/
│ │ │ ├── IBinderDelegateService.aidl
│ │ │ ├── IPackageInstaller.aidl
│ │ │ ├── IPackageInstallerSession.aidl
│ │ │ ├── interfaces/
│ │ │ │ ├── IAppRequestListener.aidl
│ │ │ │ ├── IIntentFilterObserver.aidl
│ │ │ │ ├── IPackageObserver.aidl
│ │ │ │ ├── IProcessObserver.aidl
│ │ │ │ ├── IServiceFetcher.aidl
│ │ │ │ └── IUiCallback.aidl
│ │ │ └── pm/
│ │ │ └── installer/
│ │ │ ├── SessionInfo.aidl
│ │ │ └── SessionParams.aidl
│ │ ├── java/
│ │ │ ├── android/
│ │ │ │ ├── content/
│ │ │ │ │ ├── SyncStatusInfo.java
│ │ │ │ │ └── pm/
│ │ │ │ │ └── PackageParser.java
│ │ │ │ └── location/
│ │ │ │ └── LocationRequest.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
│ │ │ │ │ │ │ ├── ProviderHook.java
│ │ │ │ │ │ │ └── SettingsProviderHook.java
│ │ │ │ │ │ ├── proxies/
│ │ │ │ │ │ │ ├── account/
│ │ │ │ │ │ │ │ └── AccountManagerStub.java
│ │ │ │ │ │ │ ├── alarm/
│ │ │ │ │ │ │ │ └── AlarmManagerStub.java
│ │ │ │ │ │ │ ├── am/
│ │ │ │ │ │ │ │ ├── ActivityManagerStub.java
│ │ │ │ │ │ │ │ ├── HCallbackStub.java
│ │ │ │ │ │ │ │ └── MethodProxies.java
│ │ │ │ │ │ │ ├── appops/
│ │ │ │ │ │ │ │ └── AppOpsManagerStub.java
│ │ │ │ │ │ │ ├── appwidget/
│ │ │ │ │ │ │ │ └── AppWidgetManagerStub.java
│ │ │ │ │ │ │ ├── audio/
│ │ │ │ │ │ │ │ └── AudioManagerStub.java
│ │ │ │ │ │ │ ├── backup/
│ │ │ │ │ │ │ │ └── BackupManagerStub.java
│ │ │ │ │ │ │ ├── bluetooth/
│ │ │ │ │ │ │ │ └── BluetoothStub.java
│ │ │ │ │ │ │ ├── clipboard/
│ │ │ │ │ │ │ │ └── ClipBoardStub.java
│ │ │ │ │ │ │ ├── connectivity/
│ │ │ │ │ │ │ │ └── ConnectivityStub.java
│ │ │ │ │ │ │ ├── content/
│ │ │ │ │ │ │ │ └── ContentServiceStub.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
│ │ │ │ │ │ │ ├── persistent_data_block/
│ │ │ │ │ │ │ │ └── PersistentDataBlockServiceStub.java
│ │ │ │ │ │ │ ├── phonesubinfo/
│ │ │ │ │ │ │ │ ├── MethodProxies.java
│ │ │ │ │ │ │ │ └── PhoneSubInfoStub.java
│ │ │ │ │ │ │ ├── pm/
│ │ │ │ │ │ │ │ ├── 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
│ │ │ │ │ ├── DaemonService.java
│ │ │ │ │ ├── ResolverActivity.java
│ │ │ │ │ ├── ShortcutHandleActivity.java
│ │ │ │ │ ├── StubActivity.java
│ │ │ │ │ ├── StubContentProvider.java
│ │ │ │ │ ├── StubDialog.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
│ │ │ │ │ ├── ipcbus/
│ │ │ │ │ │ ├── IPCBus.java
│ │ │ │ │ │ ├── IPCInvocationBridge.java
│ │ │ │ │ │ ├── IPCMethod.java
│ │ │ │ │ │ ├── IPCSingleton.java
│ │ │ │ │ │ ├── IServerCache.java
│ │ │ │ │ │ ├── ServerInterface.java
│ │ │ │ │ │ └── TransformBinder.java
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── ArrayUtils.java
│ │ │ │ │ ├── AtomicFile.java
│ │ │ │ │ ├── BitmapUtils.java
│ │ │ │ │ ├── ClassUtils.java
│ │ │ │ │ ├── ComponentUtils.java
│ │ │ │ │ ├── DrawableUtils.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
│ │ │ │ ├── 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
│ │ │ │ ├── interfaces/
│ │ │ │ │ ├── IAccountManager.java
│ │ │ │ │ ├── IActivityManager.java
│ │ │ │ │ ├── IAppManager.java
│ │ │ │ │ ├── IDeviceInfoManager.java
│ │ │ │ │ ├── IJobService.java
│ │ │ │ │ ├── INotificationManager.java
│ │ │ │ │ ├── IPackageManager.java
│ │ │ │ │ ├── IUserManager.java
│ │ │ │ │ ├── IVirtualLocationManager.java
│ │ │ │ │ └── IVirtualStorageService.java
│ │ │ │ ├── job/
│ │ │ │ │ └── VJobSchedulerService.java
│ │ │ │ ├── location/
│ │ │ │ │ └── VirtualLocationService.java
│ │ │ │ ├── memory/
│ │ │ │ │ ├── MappedMemoryRegion.java
│ │ │ │ │ ├── MemoryRegionParser.java
│ │ │ │ │ ├── MemoryScanEngine.java
│ │ │ │ │ ├── MemoryValue.java
│ │ │ │ │ └── ProcessMemory.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
│ │ │ │ │ ├── IAlarmManager.java
│ │ │ │ │ ├── IApplicationThread.java
│ │ │ │ │ ├── IApplicationThreadICSMR1.java
│ │ │ │ │ ├── IApplicationThreadJBMR1.java
│ │ │ │ │ ├── IApplicationThreadKitkat.java
│ │ │ │ │ ├── IApplicationThreadOreo.java
│ │ │ │ │ ├── ISearchManager.java
│ │ │ │ │ ├── IServiceConnectionO.java
│ │ │ │ │ ├── IUsageStatsManager.java
│ │ │ │ │ ├── LoadedApk.java
│ │ │ │ │ ├── LoadedApkHuaWei.java
│ │ │ │ │ ├── LoadedApkICS.java
│ │ │ │ │ ├── LoadedApkKitkat.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
│ │ │ │ │ └── IBluetoothManager.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
│ │ │ │ │ │ ├── PackageUserState.java
│ │ │ │ │ │ ├── ParceledListSlice.java
│ │ │ │ │ │ ├── ParceledListSliceJBMR2.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
│ │ │ │ │ ├── INetworkManagementService.java
│ │ │ │ │ ├── IPowerManager.java
│ │ │ │ │ ├── IUserManager.java
│ │ │ │ │ ├── Message.java
│ │ │ │ │ ├── Process.java
│ │ │ │ │ ├── ServiceManager.java
│ │ │ │ │ ├── StrictMode.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/
│ │ │ │ │ ├── CompatibilityInfoHolder.java
│ │ │ │ │ ├── Display.java
│ │ │ │ │ ├── DisplayAdjustments.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
│ │ │ │ ├── appwidget/
│ │ │ │ │ └── IAppWidgetService.java
│ │ │ │ ├── content/
│ │ │ │ │ ├── NativeLibraryHelper.java
│ │ │ │ │ └── ReferrerIntent.java
│ │ │ │ ├── os/
│ │ │ │ │ ├── IDropBoxManagerService.java
│ │ │ │ │ ├── IVibratorService.java
│ │ │ │ │ └── UserManager.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
│ │ ├── jni/
│ │ │ ├── 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
│ │ │ ├── HookZz/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .gitmodules
│ │ │ │ ├── Android.mk
│ │ │ │ ├── LICENSE
│ │ │ │ ├── Makefile
│ │ │ │ ├── README.md
│ │ │ │ ├── docs/
│ │ │ │ │ ├── HookFrameworkDesign.md
│ │ │ │ │ ├── hookzz-docs.md
│ │ │ │ │ ├── hookzz-example.md
│ │ │ │ │ └── hookzz-getting-started.md
│ │ │ │ ├── include/
│ │ │ │ │ └── hookzz.h
│ │ │ │ ├── src/
│ │ │ │ │ ├── allocator.c
│ │ │ │ │ ├── allocator.h
│ │ │ │ │ ├── interceptor.c
│ │ │ │ │ ├── interceptor.h
│ │ │ │ │ ├── memory.c
│ │ │ │ │ ├── memory.h
│ │ │ │ │ ├── platforms/
│ │ │ │ │ │ ├── arch-arm/
│ │ │ │ │ │ │ ├── instructions.c
│ │ │ │ │ │ │ ├── instructions.h
│ │ │ │ │ │ │ ├── reader-arm.c
│ │ │ │ │ │ │ ├── reader-arm.h
│ │ │ │ │ │ │ ├── reader-thumb.c
│ │ │ │ │ │ │ ├── reader-thumb.h
│ │ │ │ │ │ │ ├── regs-arm.c
│ │ │ │ │ │ │ ├── regs-arm.h
│ │ │ │ │ │ │ ├── relocator-arm.c
│ │ │ │ │ │ │ ├── relocator-arm.h
│ │ │ │ │ │ │ ├── relocator-thumb.c
│ │ │ │ │ │ │ ├── relocator-thumb.h
│ │ │ │ │ │ │ ├── writer-arm.c
│ │ │ │ │ │ │ ├── writer-arm.h
│ │ │ │ │ │ │ ├── writer-thumb.c
│ │ │ │ │ │ │ └── writer-thumb.h
│ │ │ │ │ │ ├── arch-arm64/
│ │ │ │ │ │ │ ├── instructions.c
│ │ │ │ │ │ │ ├── instructions.h
│ │ │ │ │ │ │ ├── reader-arm64.c
│ │ │ │ │ │ │ ├── reader-arm64.h
│ │ │ │ │ │ │ ├── regs-arm64.c
│ │ │ │ │ │ │ ├── regs-arm64.h
│ │ │ │ │ │ │ ├── relocator-arm64.c
│ │ │ │ │ │ │ ├── relocator-arm64.h
│ │ │ │ │ │ │ ├── writer-arm64.c
│ │ │ │ │ │ │ └── writer-arm64.h
│ │ │ │ │ │ ├── arch-x86/
│ │ │ │ │ │ │ ├── instructions.c
│ │ │ │ │ │ │ ├── instructions.h
│ │ │ │ │ │ │ ├── reader-x86.c
│ │ │ │ │ │ │ ├── reader-x86.h
│ │ │ │ │ │ │ ├── regs-x86.c
│ │ │ │ │ │ │ ├── regs-x86.h
│ │ │ │ │ │ │ ├── relocator-x86.c
│ │ │ │ │ │ │ ├── relocator-x86.h
│ │ │ │ │ │ │ ├── writer-x86.c
│ │ │ │ │ │ │ └── writer-x86.h
│ │ │ │ │ │ ├── backend-arm/
│ │ │ │ │ │ │ ├── interceptor-arm.c
│ │ │ │ │ │ │ ├── interceptor-arm.h
│ │ │ │ │ │ │ ├── interceptor-template-arm.s
│ │ │ │ │ │ │ ├── thunker-arm.c
│ │ │ │ │ │ │ └── thunker-arm.h
│ │ │ │ │ │ ├── backend-arm64/
│ │ │ │ │ │ │ ├── interceptor-arm64.c
│ │ │ │ │ │ │ ├── interceptor-arm64.h
│ │ │ │ │ │ │ ├── interceptor-template-arm64.s
│ │ │ │ │ │ │ ├── thunker-arm64.c
│ │ │ │ │ │ │ └── thunker-arm64.h
│ │ │ │ │ │ ├── backend-darwin/
│ │ │ │ │ │ │ ├── memory-darwin.c
│ │ │ │ │ │ │ └── memory-darwin.h
│ │ │ │ │ │ ├── backend-linux/
│ │ │ │ │ │ │ ├── memory-linux.c
│ │ │ │ │ │ │ └── memory-linux.h
│ │ │ │ │ │ ├── backend-posix/
│ │ │ │ │ │ │ ├── thread-posix.c
│ │ │ │ │ │ │ └── thread-posix.h
│ │ │ │ │ │ ├── backend-x86/
│ │ │ │ │ │ │ ├── interceptor-template-x86.s
│ │ │ │ │ │ │ ├── interceptor-x86.c
│ │ │ │ │ │ │ ├── interceptor-x86.h
│ │ │ │ │ │ │ ├── thunker-x86.c
│ │ │ │ │ │ │ └── thunker-x86.h
│ │ │ │ │ │ └── x86/
│ │ │ │ │ │ ├── instructions.h
│ │ │ │ │ │ ├── reader.c
│ │ │ │ │ │ ├── reader.h
│ │ │ │ │ │ ├── writer.c
│ │ │ │ │ │ └── writer.h
│ │ │ │ │ ├── relocator.h
│ │ │ │ │ ├── stack.c
│ │ │ │ │ ├── stack.h
│ │ │ │ │ ├── thread.h
│ │ │ │ │ ├── thunker.h
│ │ │ │ │ ├── trampoline.c
│ │ │ │ │ ├── trampoline.h
│ │ │ │ │ ├── writer.h
│ │ │ │ │ ├── zzdefs.h
│ │ │ │ │ ├── zzdeps/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── common/
│ │ │ │ │ │ │ ├── LEB128.h
│ │ │ │ │ │ │ ├── debugbreak.h
│ │ │ │ │ │ │ ├── memory-utils-common.c
│ │ │ │ │ │ │ └── memory-utils-common.h
│ │ │ │ │ │ ├── darwin/
│ │ │ │ │ │ │ ├── mach_vm.h
│ │ │ │ │ │ │ ├── macho-utils-darwin.c
│ │ │ │ │ │ │ ├── macho-utils-darwin.h
│ │ │ │ │ │ │ ├── memory-utils-darwin.c
│ │ │ │ │ │ │ └── memory-utils-darwin.h
│ │ │ │ │ │ ├── linux/
│ │ │ │ │ │ │ ├── memory-utils-linux.c
│ │ │ │ │ │ │ └── memory-utils-linux.h
│ │ │ │ │ │ ├── memory-utils.h
│ │ │ │ │ │ ├── posix/
│ │ │ │ │ │ │ ├── memory-utils-posix.c
│ │ │ │ │ │ │ ├── memory-utils-posix.h
│ │ │ │ │ │ │ ├── thread-utils-posix.c
│ │ │ │ │ │ │ └── thread-utils-posix.h
│ │ │ │ │ │ └── zz.h
│ │ │ │ │ ├── zzinfo.c
│ │ │ │ │ └── zzinfo.h
│ │ │ │ ├── tests/
│ │ │ │ │ ├── arm-android/
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ ├── test_hook_address_thumb.c
│ │ │ │ │ │ ├── test_hook_open_arm.c
│ │ │ │ │ │ └── test_hook_printf.c
│ │ │ │ │ ├── arm-insn-fix/
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ └── test_insn_fix.c
│ │ │ │ │ ├── arm-ios/
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ ├── test_hook_address_thumb.c
│ │ │ │ │ │ ├── test_hook_freeaddr.c
│ │ │ │ │ │ ├── test_hook_oc_thumb.m
│ │ │ │ │ │ ├── test_hook_open_arm.c
│ │ │ │ │ │ └── test_hook_printf.c
│ │ │ │ │ ├── arm64-insn-fix/
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ └── test_insn_fix.c
│ │ │ │ │ └── arm64-ios/
│ │ │ │ │ ├── makefile
│ │ │ │ │ ├── test_hook_address.c
│ │ │ │ │ ├── test_hook_oc.m
│ │ │ │ │ └── test_hook_printf.c
│ │ │ │ └── tools/
│ │ │ │ └── ZzSolidifyHook/
│ │ │ │ ├── solidifyhook
│ │ │ │ ├── solidifyhook.cpp
│ │ │ │ └── solidifytrampoline.c
│ │ │ ├── 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
│ └── settings.gradle
└── doc/
├── VADev.md
└── VADev_eng.md
Showing preview only (543K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6230 symbols across 720 files)
FILE: VirtualApp/app/src/main/java/io/virtualapp/VApp.java
class VApp (line 20) | public class VApp extends MultiDexApplication {
method getApp (line 25) | public static VApp getApp() {
method attachBaseContext (line 29) | @Override
method onCreate (line 42) | @Override
method getPreferences (line 85) | public static SharedPreferences getPreferences() {
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/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/Value.java
class Value (line 7) | public class Value<T> {
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/nestedadapter/RecyclerViewAdapterWrapper.java
class RecyclerViewAdapterWrapper (line 6) | public class RecyclerViewAdapterWrapper extends RecyclerView.Adapter {
method RecyclerViewAdapterWrapper (line 10) | public RecyclerViewAdapterWrapper(RecyclerView.Adapter wrapped) {
method onCreateViewHolder (line 36) | @Override
method onBindViewHolder (line 42) | @Override
method getItemCount (line 47) | @Override
method getItemViewType (line 52) | @Override
method setHasStableIds (line 57) | @Override
method getItemId (line 62) | @Override
method onViewRecycled (line 67) | @Override
method onFailedToRecycleView (line 72) | @Override
method onViewAttachedToWindow (line 77) | @Override
method onViewDetachedFromWindow (line 82) | @Override
method registerAdapterDataObserver (line 87) | @Override
method unregisterAdapterDataObserver (line 92) | @Override
method onAttachedToRecyclerView (line 97) | @Override
method onDetachedFromRecyclerView (line 102) | @Override
method getWrappedAdapter (line 107) | public RecyclerView.Adapter getWrappedAdapter() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/nestedadapter/SmartRecyclerAdapter.java
class SmartRecyclerAdapter (line 10) | public class SmartRecyclerAdapter extends RecyclerViewAdapterWrapper {
method SmartRecyclerAdapter (line 18) | public SmartRecyclerAdapter(@NonNull RecyclerView.Adapter targetAdapte...
method setHeaderView (line 22) | public void setHeaderView(View view) {
method removeHeaderView (line 27) | public void removeHeaderView() {
method setFooterView (line 32) | public void setFooterView(View view) {
method removeFooterView (line 37) | public void removeFooterView() {
method setGridHeaderFooter (line 42) | private void setGridHeaderFooter(RecyclerView.LayoutManager layoutMana...
method hasHeader (line 59) | private boolean hasHeader() {
method hasFooter (line 63) | private boolean hasFooter() {
method onAttachedToRecyclerView (line 67) | @Override
method getItemCount (line 74) | @Override
method getItemViewType (line 79) | @Override
method onCreateViewHolder (line 91) | @Override
method onBindViewHolder (line 118) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/percent/PercentLinearLayout.java
class PercentLinearLayout (line 13) | public class PercentLinearLayout extends LinearLayout {
method PercentLinearLayout (line 17) | public PercentLinearLayout(Context context, AttributeSet attrs) {
method onMeasure (line 23) | @Override
method onLayout (line 32) | @Override
method generateLayoutParams (line 38) | @Override
class LayoutParams (line 43) | public static class LayoutParams extends LinearLayout.LayoutParams
method LayoutParams (line 48) | public LayoutParams(Context c, AttributeSet attrs) {
method LayoutParams (line 53) | public LayoutParams(int width, int height) {
method LayoutParams (line 57) | public LayoutParams(ViewGroup.LayoutParams source) {
method LayoutParams (line 61) | public LayoutParams(MarginLayoutParams source) {
method getPercentLayoutInfo (line 65) | @Override
method setBaseAttributes (line 70) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/reflect/ReflectException.java
class ReflectException (line 6) | public class ReflectException extends RuntimeException {
method ReflectException (line 10) | public ReflectException(Throwable cause) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/BaseAdapterPlus.java
class BaseAdapterPlus (line 14) | public abstract class BaseAdapterPlus<T> extends BaseAdapter implements ...
method BaseAdapterPlus (line 19) | public BaseAdapterPlus(Context context) {
method getContext (line 24) | public Context getContext() {
method add (line 28) | public boolean add(T item) {
method add (line 32) | public boolean add(int pos, T item, boolean onlyone) {
method remove (line 49) | public T remove(int pos) {
method getItems (line 53) | public List<T> getItems() {
method inflate (line 57) | protected <VW extends View> VW inflate(int resource, ViewGroup root) {
method inflate (line 61) | protected <VW extends View> VW inflate(int resource, ViewGroup root, b...
method clear (line 65) | public void clear() {
method set (line 69) | public void set(Collection<T> items) {
method addAll (line 74) | public void addAll(Collection<T> items) {
method findItem (line 80) | public int findItem(T item) {
method exist (line 84) | public boolean exist(T item) {
method getCount (line 89) | @Override
method getDataItem (line 94) | public final T getDataItem(int position) {
method getItem (line 98) | @Override
method getItemById (line 106) | public final T getItemById(long id) {
method getItemId (line 110) | @Override
method getView (line 115) | @Override
method getDropDownView (line 125) | @Override
method createView (line 135) | protected abstract View createView(int position, ViewGroup parent);
method attach (line 137) | protected abstract void attach(View view, T item, int position);
class BaseViewHolder (line 139) | public static class BaseViewHolder {
method BaseViewHolder (line 143) | public BaseViewHolder(View view) {
method $ (line 148) | protected <T extends View> T $(int id) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VActivity.java
class VActivity (line 18) | public class VActivity extends AppCompatActivity {
method getActivity (line 23) | public Activity getActivity() {
method getContext (line 30) | public Context getContext() {
method defer (line 34) | protected AndroidDeferredManager defer() {
method findFragmentById (line 38) | public Fragment findFragmentById(@IdRes int id) {
method replaceFragment (line 42) | public void replaceFragment(@IdRes int id, Fragment fragment) {
method onStart (line 46) | @Override
method onStop (line 52) | @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/MyAppRequestListener.java
class MyAppRequestListener (line 16) | public class MyAppRequestListener implements VirtualCore.AppRequestListe...
method MyAppRequestListener (line 20) | public MyAppRequestListener(Context context) {
method onRequestInstall (line 24) | @Override
method onRequestUninstall (line 44) | @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/MyTaskDescriptionDelegate.java
class MyTaskDescriptionDelegate (line 14) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method getTaskDescription (line 16) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/effects/ExplosionAnimator.java
class ExplosionAnimator (line 18) | public class ExplosionAnimator extends ValueAnimator {
method ExplosionAnimator (line 32) | public ExplosionAnimator(View container, Bitmap bitmap, Rect bound) {
method generateParticle (line 51) | private Particle generateParticle(int color, Random random) {
method draw (line 82) | public boolean draw(Canvas canvas) {
method start (line 98) | @Override
class Particle (line 104) | private class Particle {
method advance (line 120) | public void advance(float factor) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/effects/ExplosionField.java
class ExplosionField (line 27) | public class ExplosionField extends View {
method ExplosionField (line 33) | public ExplosionField(Context context) {
method ExplosionField (line 38) | public ExplosionField(Context context, AttributeSet attrs) {
method ExplosionField (line 43) | public ExplosionField(Context context, AttributeSet attrs, int defStyl...
method createBitmapFromView (line 48) | public static Bitmap createBitmapFromView(View view) {
method createBitmapSafely (line 68) | public static Bitmap createBitmapSafely(int width, int height, Bitmap....
method attachToWindow (line 81) | public static ExplosionField attachToWindow(Activity activity) {
method attachToWindow (line 89) | public static ExplosionField attachToWindow(ViewGroup rootView, Activi...
method init (line 96) | private void init() {
method onDraw (line 100) | @Override
method expandExplosionBound (line 108) | public void expandExplosionBound(int dx, int dy) {
method explode (line 113) | public void explode(Bitmap bitmap, Rect bound, long startDelay, long d...
method explode (line 127) | public void explode(final View view) {
method explode (line 131) | public void explode(final View view, OnExplodeFinishListener listener) {
method clear (line 163) | public void clear() {
type OnExplodeFinishListener (line 168) | public interface OnExplodeFinishListener {
method onExplodeFinish (line 169) | void onExplodeFinish(View v);
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/FlurryROMCollector.java
class FlurryROMCollector (line 19) | public class FlurryROMCollector {
method startCollect (line 23) | public static void startCollect() {
method reportCameraNativeSetup (line 33) | private static void reportCameraNativeSetup() {
method createLogContent (line 44) | private static Map<String, String> createLogContent(String tag, String...
method addRomInfo (line 52) | private static void addRomInfo(Map<String, String> content) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/HomeActivity.java
class HomeActivity (line 63) | public class HomeActivity extends VActivity implements HomeContract.Home...
method goHome (line 81) | public static void goHome(Context context) {
method onCreate (line 88) | @Override
method initMenu (line 100) | private void initMenu() {
method setIconEnable (line 143) | private static void setIconEnable(Menu menu, boolean enable) {
method bindViews (line 154) | private void bindViews() {
method initLaunchpad (line 165) | private void initLaunchpad() {
method onAddAppButtonClick (line 189) | private void onAddAppButtonClick() {
method deleteApp (line 193) | private void deleteApp(int position) {
method createShortcut (line 205) | private void createShortcut(int position) {
method setPresenter (line 212) | @Override
method showBottomAction (line 217) | @Override
method hideBottomAction (line 224) | @Override
method showLoading (line 253) | @Override
method hideLoading (line 259) | @Override
method loadFinish (line 265) | @Override
method loadError (line 272) | @Override
method showGuide (line 278) | @Override
method addAppToLauncher (line 283) | @Override
method removeAppToLauncher (line 302) | @Override
method refreshLauncherItem (line 307) | @Override
method askInstallGms (line 312) | @Override
method onActivityResult (line 330) | @Override
class LauncherTouchCallback (line 343) | private class LauncherTouchCallback extends ItemTouchHelper.SimpleCall...
method LauncherTouchCallback (line 350) | LauncherTouchCallback() {
method interpolateOutOfBoundsScroll (line 354) | @Override
method getMovementFlags (line 359) | @Override
method onMove (line 372) | @Override
method isLongPressDragEnabled (line 380) | @Override
method isItemViewSwipeEnabled (line 385) | @Override
method onSelectedChanged (line 390) | @Override
method canDropOver (line 407) | @Override
method clearView (line 421) | @Override
method onSwiped (line 444) | @Override
method onChildDraw (line 448) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/HomeContract.java
class HomeContract (line 14) | class HomeContract {
type HomeView (line 16) | interface HomeView extends BaseView<HomePresenter> {
method showBottomAction (line 18) | void showBottomAction();
method hideBottomAction (line 20) | void hideBottomAction();
method showLoading (line 22) | void showLoading();
method hideLoading (line 24) | void hideLoading();
method loadFinish (line 26) | void loadFinish(List<AppData> appModels);
method loadError (line 28) | void loadError(Throwable err);
method showGuide (line 30) | void showGuide();
method addAppToLauncher (line 32) | void addAppToLauncher(AppData model);
method removeAppToLauncher (line 34) | void removeAppToLauncher(AppData model);
method refreshLauncherItem (line 36) | void refreshLauncherItem(AppData model);
method askInstallGms (line 38) | void askInstallGms();
type HomePresenter (line 41) | interface HomePresenter extends BasePresenter {
method launchApp (line 43) | void launchApp(AppData data);
method dataChanged (line 45) | void dataChanged();
method addApp (line 47) | void addApp(AppInfoLite info);
method deleteApp (line 49) | void deleteApp(AppData data);
method createShortcut (line 51) | void createShortcut(AppData data);
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/HomePresenterImpl.java
class HomePresenterImpl (line 28) | class HomePresenterImpl implements HomeContract.HomePresenter {
method HomePresenterImpl (line 36) | HomePresenterImpl(HomeContract.HomeView view) {
method start (line 43) | @Override
method launchApp (line 56) | @Override
method dataChanged (line 73) | @Override
method addApp (line 80) | @Override
method handleOptApp (line 143) | private void handleOptApp(AppData data, String packageName, boolean ne...
method deleteApp (line 173) | @Override
method createShortcut (line 188) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppActivity.java
class ListAppActivity (line 27) | public class ListAppActivity extends VActivity {
method gotoListApp (line 33) | public static void gotoListApp(Activity activity) {
method onCreate (line 38) | @Override
method setupToolBar (line 57) | private void setupToolBar() {
method onOptionsItemSelected (line 66) | @Override
method onRequestPermissionsResult (line 75) | @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 34) | public class ListAppFragment extends VFragment<ListAppContract.ListAppPr...
method newInstance (line 41) | public static ListAppFragment newInstance(File selectFrom) {
method getSelectFrom (line 50) | private File getSelectFrom() {
method onCreateView (line 61) | @Nullable
method onSaveInstanceState (line 67) | @Override
method onViewCreated (line 73) | @Override
method startLoading (line 119) | @Override
method loadFinish (line 125) | @Override
method setPresenter (line 134) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/ListAppPresenterImpl.java
class ListAppPresenterImpl (line 16) | class ListAppPresenterImpl implements ListAppContract.ListAppPresenter {
method ListAppPresenterImpl (line 24) | ListAppPresenterImpl(Activity activity, ListAppContract.ListAppView vi...
method start (line 32) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/LoadingActivity.java
class LoadingActivity (line 26) | public class LoadingActivity extends VActivity {
method launch (line 34) | public static void launch(Context context, String packageName, int use...
method onCreate (line 46) | @Override
method onAppOpened (line 78) | @Override
method onResume (line 84) | @Override
method onPause (line 90) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppLocationAdapter.java
class AppLocationAdapter (line 14) | public class AppLocationAdapter extends BaseAdapterPlus<LocationData> {
method AppLocationAdapter (line 15) | public AppLocationAdapter(Context context) {
method createView (line 19) | @Override
method attach (line 27) | @Override
class ViewHolder (line 39) | static class ViewHolder extends BaseAdapterPlus.BaseViewHolder {
method ViewHolder (line 40) | public ViewHolder(View view) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java
class AppPagerAdapter (line 25) | public class AppPagerAdapter extends FragmentPagerAdapter {
method AppPagerAdapter (line 29) | public AppPagerAdapter(FragmentManager fm) {
method getItem (line 56) | @Override
method getCount (line 61) | @Override
method getPageTitle (line 66) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java
class CloneAppListAdapter (line 23) | public class CloneAppListAdapter extends DragSelectRecyclerViewAdapter<C...
method CloneAppListAdapter (line 31) | public CloneAppListAdapter(Context context) {
method setOnItemClickListener (line 42) | public void setOnItemClickListener(ItemEventListener mItemEventListene...
method getList (line 46) | public List<AppInfo> getList() {
method setList (line 50) | public void setList(List<AppInfo> models) {
method onCreateViewHolder (line 55) | @Override
method onBindViewHolder (line 63) | @Override
method onAttachedToRecyclerView (line 91) | @Override
method isIndexSelectable (line 96) | @Override
method getItemCount (line 101) | @Override
method getItemViewType (line 106) | @Override
method getItem (line 114) | public AppInfo getItem(int index) {
type ItemEventListener (line 118) | public interface ItemEventListener {
method onItemClick (line 120) | void onItemClick(AppInfo appData, int position);
method isSelectable (line 122) | boolean isSelectable(int position);
class ViewHolder (line 125) | class ViewHolder extends RecyclerView.ViewHolder {
method ViewHolder (line 131) | ViewHolder(View itemView) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/LaunchpadAdapter.java
class LaunchpadAdapter (line 23) | public class LaunchpadAdapter extends RecyclerView.Adapter<LaunchpadAdap...
method LaunchpadAdapter (line 30) | public LaunchpadAdapter(Context context) {
method add (line 34) | public void add(AppData model) {
method replace (line 40) | public void replace(int index, AppData data) {
method remove (line 45) | public void remove(AppData data) {
method onCreateViewHolder (line 51) | @Override
method onBindViewHolder (line 56) | @Override
method startLoadingAnimation (line 87) | private void startLoadingAnimation(LauncherIconView iconView) {
method getColor (line 98) | private int getColor(int position) {
method getItemCount (line 134) | @Override
method getList (line 139) | public List<AppData> getList() {
method setList (line 143) | public void setList(List<AppData> list) {
method setAppClickListener (line 148) | public void setAppClickListener(OnAppClickListener mAppClickListener) {
method moveItem (line 152) | public void moveItem(int pos, int targetPos) {
method refresh (line 158) | public void refresh(AppData model) {
type OnAppClickListener (line 165) | public interface OnAppClickListener {
method onAppClick (line 166) | void onAppClick(int position, AppData model);
class ViewHolder (line 169) | public class ViewHolder extends RecyclerView.ViewHolder {
method ViewHolder (line 176) | ViewHolder(View itemView) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/adapters/decorations/ItemOffsetDecoration.java
class ItemOffsetDecoration (line 10) | public class ItemOffsetDecoration extends RecyclerView.ItemDecoration {
method ItemOffsetDecoration (line 14) | public ItemOffsetDecoration(int itemOffset) {
method ItemOffsetDecoration (line 18) | public ItemOffsetDecoration(@NonNull Context context, @DimenRes int it...
method getItemOffsets (line 22) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/location/MarkerActivity.java
class MarkerActivity (line 40) | public class MarkerActivity extends VActivity implements TencentMap.OnMa...
method onCreate (line 50) | @Override
method bind (line 83) | @SuppressWarnings("unchecked")
method enableBackHome (line 88) | public void enableBackHome() {
method startLocation (line 95) | private void startLocation() {
method onLocationChanged (line 107) | @Override
method onStatusUpdate (line 118) | @Override
method onCreateOptionsMenu (line 123) | @Override
method onOptionsItemSelected (line 129) | @Override
method onMapClick (line 175) | @Override
method onResume (line 215) | @Override
method onPause (line 224) | @Override
method onSaveInstanceState (line 233) | @Override
method onDestroy (line 242) | @Override
method setResultOk (line 249) | private void setResultOk(VLocation location) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/location/VirtualLocationSettings.java
class VirtualLocationSettings (line 30) | public class VirtualLocationSettings extends VActivity implements Adapte...
method onCreate (line 37) | @Override
method readLocation (line 49) | private void readLocation(LocationData locationData) {
method saveLocation (line 54) | private void saveLocation(LocationData locationData) {
method loadData (line 63) | private void loadData() {
method onItemClick (line 89) | @Override
method onActivityResult (line 99) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AddAppButton.java
class AddAppButton (line 12) | public class AddAppButton implements AppData {
method AddAppButton (line 17) | public AddAppButton(Context context) {
method isLoading (line 22) | @Override
method isFirstOpen (line 27) | @Override
method getIcon (line 32) | @Override
method getName (line 37) | @Override
method canReorder (line 42) | @Override
method canLaunch (line 47) | @Override
method canDelete (line 52) | @Override
method canCreateShortcut (line 57) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java
type AppData (line 9) | public interface AppData {
method isLoading (line 11) | boolean isLoading();
method isFirstOpen (line 13) | boolean isFirstOpen();
method getIcon (line 15) | Drawable getIcon();
method getName (line 17) | String getName();
method canReorder (line 19) | boolean canReorder();
method canLaunch (line 21) | boolean canLaunch();
method canDelete (line 23) | boolean canDelete();
method canCreateShortcut (line 25) | 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 27) | public AppInfoLite(String packageName, String path, boolean fastOpen) {
method AppInfoLite (line 33) | protected AppInfoLite(Parcel in) {
method describeContents (line 39) | @Override
method writeToParcel (line 44) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/EmptyAppData.java
class EmptyAppData (line 9) | public class EmptyAppData implements AppData {
method isLoading (line 11) | @Override
method isFirstOpen (line 16) | @Override
method getIcon (line 21) | @Override
method getName (line 26) | @Override
method canReorder (line 31) | @Override
method canLaunch (line 36) | @Override
method canDelete (line 41) | @Override
method canCreateShortcut (line 46) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/models/LocationData.java
class LocationData (line 14) | public class LocationData {
method LocationData (line 22) | public LocationData() {
method LocationData (line 25) | public LocationData(Context context, InstalledAppInfo installedAppInfo...
method loadData (line 31) | private void loadData(Context context, ApplicationInfo appInfo) {
method toString (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 21) | public MultiplePackageAppData(PackageAppData target, int userId) {
method isLoading (line 34) | @Override
method isFirstOpen (line 39) | @Override
method getIcon (line 44) | @Override
method getName (line 49) | @Override
method canReorder (line 54) | @Override
method canLaunch (line 59) | @Override
method canDelete (line 64) | @Override
method canCreateShortcut (line 69) | @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 22) | public PackageAppData(Context context, InstalledAppInfo installedAppIn...
method loadData (line 28) | private void loadData(Context context, ApplicationInfo appInfo) {
method isLoading (line 44) | @Override
method isFirstOpen (line 49) | @Override
method getIcon (line 54) | @Override
method getName (line 59) | @Override
method canReorder (line 64) | @Override
method canLaunch (line 69) | @Override
method canDelete (line 74) | @Override
method canCreateShortcut (line 79) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/platform/PlatformInfo.java
class PlatformInfo (line 12) | public abstract class PlatformInfo {
method PlatformInfo (line 16) | public PlatformInfo(String... pkgs) {
method relyOnPlatform (line 20) | public abstract boolean relyOnPlatform(PackageInfo info);
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/platform/WechatPlatformInfo.java
class WechatPlatformInfo (line 10) | public class WechatPlatformInfo extends PlatformInfo {
method WechatPlatformInfo (line 12) | public WechatPlatformInfo() {
method relyOnPlatform (line 16) | @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 33) | public class AppRepository implements AppDataSource {
method AppRepository (line 48) | public AppRepository(Context context) {
method isSystemApplication (line 52) | private static boolean isSystemApplication(PackageInfo packageInfo) {
method getVirtualApps (line 57) | @Override
method getInstalledApps (line 81) | @Override
method getStorageApps (line 86) | @Override
method findAndParseAPKs (line 91) | private List<PackageInfo> findAndParseAPKs(Context context, File rootD...
method convertPackageInfoToAppData (line 117) | private List<AppInfo> convertPackageInfoToAppData(Context context, Lis...
method addVirtualApp (line 150) | @Override
method removeVirtualApp (line 159) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/home/repo/PackageAppDataStorage.java
class PackageAppDataStorage (line 19) | public class PackageAppDataStorage {
method get (line 24) | public static PackageAppDataStorage get() {
method acquire (line 28) | public PackageAppData acquire(String packageName) {
method acquire (line 39) | public void acquire(String packageName, Callback<PackageAppData> callb...
method loadAppData (line 45) | private PackageAppData loadAppData(String packageName) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/splash/SplashActivity.java
class SplashActivity (line 16) | public class SplashActivity extends VActivity {
method onCreate (line 19) | @Override
method doActionInThread (line 46) | private void doActionInThread() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/vs/VSManagerActivity.java
class VSManagerActivity (line 11) | public class VSManagerActivity extends VActivity {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/BallGridBeatIndicator.java
class BallGridBeatIndicator (line 9) | public class BallGridBeatIndicator extends Indicator {
method draw (line 23) | @Override
method onCreateAnimators (line 43) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/BallPulseIndicator.java
class BallPulseIndicator (line 9) | public class BallPulseIndicator extends Indicator {
method draw (line 19) | @Override
method onCreateAnimators (line 35) | @Override
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/CircularAnim.java
class CircularAnim (line 13) | public class CircularAnim {
method getPerfectMills (line 22) | private static long getPerfectMills() {
method getFullActivityMills (line 29) | private static long getFullActivityMills() {
method getColorOrImageRes (line 36) | private static int getColorOrImageRes() {
method show (line 43) | public static VisibleBuilder show(View animView) {
method hide (line 47) | public static VisibleBuilder hide(View animView) {
method fullActivity (line 51) | public static FullActivityBuilder fullActivity(Activity activity, View...
method init (line 55) | public static void init(long perfectMills, long fullActivityPerfectMil...
type OnAnimationEndListener (line 61) | public interface OnAnimationEndListener {
method onAnimationEnd (line 62) | void onAnimationEnd();
class VisibleBuilder (line 65) | @SuppressLint("NewApi")
method VisibleBuilder (line 78) | public VisibleBuilder(View animView, boolean isShow) {
method triggerView (line 89) | public VisibleBuilder triggerView(View triggerView) {
method startRadius (line 94) | public VisibleBuilder startRadius(float startRadius) {
method endRadius (line 99) | public VisibleBuilder endRadius(float endRadius) {
method duration (line 104) | public VisibleBuilder duration(long durationMills) {
method onAnimationEndListener (line 109) | @Deprecated //You can use method - go(OnAnimationEndListener onAnima...
method go (line 115) | public void go() {
method go (line 119) | public void go(OnAnimationEndListener onAnimationEndListener) {
method doOnEnd (line 197) | private void doOnEnd() {
class FullActivityBuilder (line 209) | @SuppressLint("NewApi")
method FullActivityBuilder (line 219) | public FullActivityBuilder(Activity activity, View triggerView) {
method startRadius (line 224) | public FullActivityBuilder startRadius(float startRadius) {
method colorOrImageRes (line 229) | public FullActivityBuilder colorOrImageRes(int colorOrImageRes) {
method duration (line 234) | public FullActivityBuilder duration(long durationMills) {
method overridePendingTransition (line 239) | public FullActivityBuilder overridePendingTransition(int enterAnim, ...
method go (line 245) | public void go(OnAnimationEndListener onAnimationEndListener) {
method doOnEnd (line 329) | private void doOnEnd() {
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 13) | 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 89) | public void setViewColor(int color) {
method setEyeColor (line 94) | public void setEyeColor(int color) {
method InitPaint (line 100) | @Override
method OnAnimationUpdate (line 105) | @Override
method OnAnimationRepeat (line 114) | @Override
method OnStopAnim (line 119) | @Override
method SetAnimRepeatMode (line 126) | @Override
method AnimIsRunning (line 131) | @Override
method SetAnimRepeatCount (line 136) | @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/LauncherIconView.java
class LauncherIconView (line 23) | public class LauncherIconView extends AppCompatImageView implements Shim...
method LauncherIconView (line 52) | public LauncherIconView(Context context) {
method LauncherIconView (line 57) | public LauncherIconView(Context context, AttributeSet attrs) {
method LauncherIconView (line 62) | public LauncherIconView(Context context, AttributeSet attrs, int defSt...
method init (line 67) | private void init(Context context, AttributeSet attrs) {
method initParams (line 90) | private void initParams() {
method onDraw (line 113) | @Override
method drawMask (line 138) | private void drawMask(Canvas canvas) {
method drawProgress (line 142) | private void drawProgress(Canvas canvas) {
method updateInterAnim (line 151) | private void updateInterAnim(Canvas canvas) {
method updateMaskAnim (line 163) | private void updateMaskAnim(Canvas canvas) {
method startInterAnim (line 171) | private void startInterAnim(final int progress) {
method startProgressAnim (line 210) | private void startProgressAnim(float from, float to) {
method startMaskAnim (line 233) | private void startMaskAnim() {
method getStrokeWidth (line 275) | public int getStrokeWidth() {
method setStrokeWidth (line 284) | public void setStrokeWidth(int strokeWidth) {
method getRadius (line 295) | public float getRadius() {
method setRadius (line 304) | public void setRadius(float radius) {
method getMaskColor (line 315) | public int getMaskColor() {
method setMaskColor (line 324) | public void setMaskColor(int maskColor) {
method getProgress (line 335) | public int getProgress() {
method setProgress (line 342) | public void setProgress(int progress) {
method setProgress (line 350) | public void setProgress(int progress, boolean animate) {
method onMeasure (line 374) | @Override
method getGradientX (line 385) | @Override
method setGradientX (line 390) | @Override
method isShimmering (line 395) | @Override
method setShimmering (line 400) | @Override
method isSetUp (line 405) | @Override
method setAnimationSetupCallback (line 410) | @Override
method getPrimaryColor (line 415) | @Override
method setPrimaryColor (line 420) | @Override
method getReflectionColor (line 425) | @Override
method setReflectionColor (line 430) | @Override
method onSizeChanged (line 435) | @Override
method stopShimmer (line 443) | public void stopShimmer() {
method startShimmer (line 450) | public void startShimmer() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/LoadingIndicatorView.java
class LoadingIndicatorView (line 20) | public class LoadingIndicatorView extends View {
method run (line 41) | @Override
method run (line 50) | @Override
method LoadingIndicatorView (line 60) | public LoadingIndicatorView(Context context) {
method LoadingIndicatorView (line 65) | public LoadingIndicatorView(Context context, AttributeSet attrs) {
method LoadingIndicatorView (line 70) | public LoadingIndicatorView(Context context, AttributeSet attrs, int d...
method LoadingIndicatorView (line 75) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method init (line 81) | private void init(Context context, AttributeSet attrs, int defStyleAtt...
method getIndicator (line 103) | public Indicator getIndicator() {
method setIndicator (line 116) | public void setIndicator(String indicatorName) {
method setIndicator (line 140) | public void setIndicator(Indicator d) {
method setIndicatorColor (line 170) | public void setIndicatorColor(int color) {
method smoothToShow (line 175) | public void smoothToShow() {
method smoothToHide (line 180) | public void smoothToHide() {
method hide (line 185) | public void hide() {
method show (line 205) | public void show() {
method verifyDrawable (line 216) | @Override
method startAnimation (line 222) | void startAnimation() {
method stopAnimation (line 233) | void stopAnimation() {
method setVisibility (line 241) | @Override
method onVisibilityChanged (line 253) | @Override
method invalidateDrawable (line 263) | @Override
method onSizeChanged (line 277) | @Override
method updateDrawableBounds (line 282) | private void updateDrawableBounds(int w, int h) {
method onDraw (line 317) | @Override
method drawTrack (line 323) | void drawTrack(Canvas canvas) {
method onMeasure (line 342) | @Override
method drawableStateChanged (line 363) | @Override
method updateDrawableState (line 369) | private void updateDrawableState() {
method drawableHotspotChanged (line 376) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method onAttachedToWindow (line 386) | @Override
method onDetachedFromWindow (line 393) | @Override
method removeCallbacks (line 402) | private void removeCallbacks() {
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/MaterialRippleLayout.java
class MaterialRippleLayout (line 40) | public class MaterialRippleLayout extends FrameLayout {
method get (line 100) | @Override
method set (line 105) | @Override
method get (line 112) | @Override
method set (line 117) | @Override
method onLongPress (line 123) | public void onLongPress(MotionEvent e) {
method onDown (line 133) | @Override
method MaterialRippleLayout (line 141) | public MaterialRippleLayout(Context context) {
method MaterialRippleLayout (line 145) | public MaterialRippleLayout(Context context, AttributeSet attrs) {
method MaterialRippleLayout (line 149) | public MaterialRippleLayout(Context context, AttributeSet attrs, int d...
method on (line 180) | public static RippleBuilder on(View view) {
method dpToPx (line 184) | static float dpToPx(Resources resources, float dp) {
method getChildView (line 188) | @SuppressWarnings("unchecked")
method addView (line 193) | @Override
method setOnClickListener (line 203) | @Override
method setOnLongClickListener (line 211) | @Override
method onInterceptTouchEvent (line 219) | @Override
method onTouchEvent (line 224) | @Override
method cancelPressedEvent (line 317) | private void cancelPressedEvent() {
method startHover (line 324) | private void startHover() {
method startRipple (line 337) | private void startRipple(final Runnable animationEndRunnable) {
method cancelAnimations (line 377) | private void cancelAnimations() {
method getEndRadius (line 388) | private float getEndRadius() {
method isInScrollingContainer (line 401) | private boolean isInScrollingContainer() {
method findParentAdapterView (line 412) | private AdapterView findParentAdapterView() {
method setPositionInAdapter (line 431) | private void setPositionInAdapter() {
method adapterPositionChanged (line 437) | private boolean adapterPositionChanged() {
method findClickableViewInChild (line 453) | private boolean findClickableViewInChild(View view, int x, int y) {
method onSizeChanged (line 473) | @Override
method isInEditMode (line 480) | @Override
method draw (line 488) | @Override
method getRadius (line 514) | private float getRadius() {
method setRadius (line 518) | public void setRadius(float radius) {
method getRippleAlpha (line 523) | public int getRippleAlpha() {
method setRippleAlpha (line 527) | public void setRippleAlpha(Integer rippleAlpha) {
method setRippleColor (line 535) | public void setRippleColor(int rippleColor) {
method setRippleOverlay (line 542) | public void setRippleOverlay(boolean rippleOverlay) {
method setRippleDiameter (line 546) | public void setRippleDiameter(int rippleDiameter) {
method setRippleDuration (line 550) | public void setRippleDuration(int rippleDuration) {
method setRippleBackground (line 554) | public void setRippleBackground(int color) {
method setRippleHover (line 560) | public void setRippleHover(boolean rippleHover) {
method setRippleDelayClick (line 564) | public void setRippleDelayClick(boolean rippleDelayClick) {
method setRippleFadeDuration (line 568) | public void setRippleFadeDuration(int rippleFadeDuration) {
method setRipplePersistent (line 572) | public void setRipplePersistent(boolean ripplePersistent) {
method setRippleInAdapter (line 576) | public void setRippleInAdapter(boolean rippleInAdapter) {
method setRippleRoundedCorners (line 580) | public void setRippleRoundedCorners(int rippleRoundedCorner) {
method setDefaultRippleAlpha (line 585) | public void setDefaultRippleAlpha(float alpha) {
method performRipple (line 591) | public void performRipple() {
method performRipple (line 596) | public void performRipple(Point anchor) {
method enableClipPathSupportIfNecessary (line 607) | private void enableClipPathSupportIfNecessary() {
class RippleBuilder (line 618) | public static class RippleBuilder {
method RippleBuilder (line 636) | public RippleBuilder(View child) {
method rippleColor (line 641) | public RippleBuilder rippleColor(int color) {
method rippleOverlay (line 646) | public RippleBuilder rippleOverlay(boolean overlay) {
method rippleHover (line 651) | public RippleBuilder rippleHover(boolean hover) {
method rippleDiameterDp (line 656) | public RippleBuilder rippleDiameterDp(int diameterDp) {
method rippleDuration (line 661) | public RippleBuilder rippleDuration(int duration) {
method rippleAlpha (line 666) | public RippleBuilder rippleAlpha(float alpha) {
method rippleDelayClick (line 671) | public RippleBuilder rippleDelayClick(boolean delayClick) {
method rippleFadeDuration (line 676) | public RippleBuilder rippleFadeDuration(int fadeDuration) {
method ripplePersistent (line 681) | public RippleBuilder ripplePersistent(boolean persistent) {
method rippleBackground (line 686) | public RippleBuilder rippleBackground(int color) {
method rippleInAdapter (line 691) | public RippleBuilder rippleInAdapter(boolean inAdapter) {
method rippleRoundedCorners (line 696) | public RippleBuilder rippleRoundedCorners(int radiusDp) {
method create (line 701) | public MaterialRippleLayout create() {
class PerformClickEvent (line 742) | private class PerformClickEvent implements Runnable {
method run (line 744) | @Override public void run() {
method clickAdapterView (line 762) | private void clickAdapterView(AdapterView parent) {
class PressedEvent (line 777) | private final class PressedEvent implements Runnable {
method PressedEvent (line 781) | public PressedEvent(MotionEvent event) {
method run (line 785) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/RippleButton.java
class RippleButton (line 26) | @SuppressLint("ClickableViewAccessibility")
method RippleButton (line 47) | public RippleButton(Context context) {
method RippleButton (line 51) | public RippleButton(Context context, AttributeSet attrs) {
method RippleButton (line 55) | public RippleButton(Context context, AttributeSet attrs, int defStyle) {
method dp (line 68) | private int dp(int dp) {
method init (line 72) | public void init() {
method setRippleColor (line 81) | public void setRippleColor(int rippleColor, float alphaFactor) {
method setHover (line 86) | public void setHover(boolean enabled) {
method onSizeChanged (line 90) | @Override
method onTouchEvent (line 96) | @Override
method adjustAlpha (line 204) | public int adjustAlpha(int color, float factor) {
method setRadius (line 212) | public void setRadius(final float radius) {
method onDraw (line 223) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/ShadowProperty.java
class ShadowProperty (line 3) | public class ShadowProperty {
method getShadowSide (line 32) | public int getShadowSide() {
method setShadowSide (line 36) | public ShadowProperty setShadowSide(int shadowSide) {
method getShadowOffset (line 41) | public int getShadowOffset() {
method getShadowOffsetHalf (line 45) | public int getShadowOffsetHalf() {
method getShadowColor (line 49) | public int getShadowColor() {
method setShadowColor (line 53) | public ShadowProperty setShadowColor(int shadowColor) {
method getShadowRadius (line 58) | public int getShadowRadius() {
method setShadowRadius (line 62) | public ShadowProperty setShadowRadius(int shadowRadius) {
method getShadowDx (line 67) | public int getShadowDx() {
method setShadowDx (line 71) | public ShadowProperty setShadowDx(int shadowDx) {
method getShadowDy (line 76) | public int getShadowDy() {
method setShadowDy (line 80) | public ShadowProperty setShadowDy(int shadowDy) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/ShadowViewDrawable.java
class ShadowViewDrawable (line 14) | public class ShadowViewDrawable extends Drawable {
method ShadowViewDrawable (line 31) | public ShadowViewDrawable(ShadowProperty shadowProperty, int color, fl...
method onBoundsChange (line 55) | @Override
method draw (line 81) | @Override
method setColor (line 93) | public ShadowViewDrawable setColor(int color) {
method setAlpha (line 98) | @Override
method setColorFilter (line 103) | @Override
method getOpacity (line 108) | @Override
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/Shimmer.java
class Shimmer (line 9) | public class Shimmer {
method Shimmer (line 27) | public Shimmer() {
method getRepeatCount (line 34) | public int getRepeatCount() {
method setRepeatCount (line 38) | public Shimmer setRepeatCount(int repeatCount) {
method getDuration (line 43) | public long getDuration() {
method setDuration (line 47) | public Shimmer setDuration(long duration) {
method getStartDelay (line 52) | public long getStartDelay() {
method setStartDelay (line 56) | public Shimmer setStartDelay(long startDelay) {
method getDirection (line 61) | public int getDirection() {
method setDirection (line 65) | public Shimmer setDirection(int direction) {
method getAnimatorListener (line 75) | public Animator.AnimatorListener getAnimatorListener() {
method setAnimatorListener (line 79) | public Shimmer setAnimatorListener(Animator.AnimatorListener animatorL...
method start (line 84) | public <V extends View & ShimmerViewBase> void start(final V shimmerVi...
method cancel (line 156) | public void cancel() {
method isAnimating (line 162) | public boolean isAnimating() {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/ShimmerViewBase.java
type ShimmerViewBase (line 3) | public interface ShimmerViewBase {
method getGradientX (line 5) | float getGradientX();
method setGradientX (line 7) | void setGradientX(float gradientX);
method isShimmering (line 9) | boolean isShimmering();
method setShimmering (line 11) | void setShimmering(boolean isShimmering);
method isSetUp (line 13) | boolean isSetUp();
method setAnimationSetupCallback (line 15) | void setAnimationSetupCallback(ShimmerViewHelper.AnimationSetupCallbac...
method getPrimaryColor (line 17) | int getPrimaryColor();
method setPrimaryColor (line 19) | void setPrimaryColor(int primaryColor);
method getReflectionColor (line 21) | int getReflectionColor();
method setReflectionColor (line 23) | void setReflectionColor(int reflectionColor);
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/ShimmerViewHelper.java
class ShimmerViewHelper (line 13) | public class ShimmerViewHelper {
method ShimmerViewHelper (line 36) | public ShimmerViewHelper(View view, Paint paint, AttributeSet attribut...
method getGradientX (line 42) | public float getGradientX() {
method setGradientX (line 46) | public void setGradientX(float gradientX) {
method isShimmering (line 51) | public boolean isShimmering() {
method setShimmering (line 55) | public void setShimmering(boolean isShimmering) {
method isSetUp (line 59) | public boolean isSetUp() {
method setAnimationSetupCallback (line 63) | public void setAnimationSetupCallback(AnimationSetupCallback callback) {
method getPrimaryColor (line 67) | public int getPrimaryColor() {
method setPrimaryColor (line 71) | public void setPrimaryColor(int primaryColor) {
method getReflectionColor (line 78) | public int getReflectionColor() {
method setReflectionColor (line 82) | public void setReflectionColor(int reflectionColor) {
method init (line 89) | private void init(AttributeSet attributeSet) {
method resetLinearGradient (line 109) | private void resetLinearGradient() {
method onSizeChanged (line 131) | protected void onSizeChanged() {
method onDraw (line 148) | public void onDraw() {
type AnimationSetupCallback (line 171) | public interface AnimationSetupCallback {
method onSetupAnimation (line 172) | void onSetupAnimation(View target);
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/TwoGearsView.java
class TwoGearsView (line 12) | public class TwoGearsView extends BaseView {
method TwoGearsView (line 28) | public TwoGearsView(Context context) {
method TwoGearsView (line 32) | public TwoGearsView(Context context, AttributeSet attrs) {
method TwoGearsView (line 36) | public TwoGearsView(Context context, AttributeSet attrs, int defStyleA...
method onMeasure (line 41) | @Override
method drawSmallRing (line 51) | private void drawSmallRing(Canvas canvas) {
method drawSmallGear (line 63) | private void drawSmallGear(Canvas canvas) {
method drawBigGear (line 84) | private void drawBigGear(Canvas canvas) {
method drawBigRing (line 105) | private void drawBigRing(Canvas canvas) {
method drawAxle (line 119) | private void drawAxle(Canvas canvas) {
method onDraw (line 147) | @Override
method initPaint (line 161) | private void initPaint() {
method setViewColor (line 186) | public void setViewColor(int color) {
method InitPaint (line 194) | @Override
method OnAnimationUpdate (line 199) | @Override
method OnAnimationRepeat (line 205) | @Override
method OnStopAnim (line 210) | @Override
method SetAnimRepeatMode (line 217) | @Override
method AnimIsRunning (line 222) | @Override
method SetAnimRepeatCount (line 227) | @Override
method dip2px (line 232) | private int dip2px(float dpValue) {
FILE: VirtualApp/app/src/main/java/io/virtualapp/widgets/ViewHelper.java
class ViewHelper (line 8) | public class ViewHelper {
method dip2px (line 10) | public static int dip2px(float dpValue) {
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/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 68) | public final class Service extends Component<ServiceIntentInfo> {
class Provider (line 72) | public final class Provider extends Component<ProviderIntentInfo> {
class Instrumentation (line 76) | public final class Instrumentation extends Component<IntentInfo> {
class Permission (line 80) | public final class Permission extends Component<IntentInfo> {
class PermissionGroup (line 84) | public final class PermissionGroup extends Component<IntentInfo> {
class ActivityIntentInfo (line 88) | public class ActivityIntentInfo extends IntentInfo {
class ServiceIntentInfo (line 93) | public class ServiceIntentInfo extends IntentInfo {
class ProviderIntentInfo (line 97) | public class ProviderIntentInfo extends IntentInfo {
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/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 26) | public class NativeEngine {
method startDexOverride (line 47) | public static void startDexOverride() {
method getRedirectedPath (line 59) | public static String getRedirectedPath(String origPath) {
method resverseRedirectedPath (line 68) | public static String resverseRedirectedPath(String origPath) {
method redirectDirectory (line 77) | public static void redirectDirectory(String origPath, String newPath) {
method redirectFile (line 91) | public static void redirectFile(String origPath, String newPath) {
method whitelist (line 106) | public static void whitelist(String path) {
method forbid (line 114) | public static void forbid(String path) {
method enableIORedirect (line 125) | public static void enableIORedirect() {
method launchEngine (line 137) | static void launchEngine() {
method onKillProcess (line 150) | public static void onKillProcess(int pid, int signal) {
method onGetCallingUid (line 157) | public static int onGetCallingUid(int originUid) {
method onOpenDexFileNative (line 173) | public static void onOpenDexFileNative(String[] params) {
method nativeLaunchEngine (line 190) | private static native void nativeLaunchEngine(Object[] method, String ...
method nativeMark (line 192) | private static native void nativeMark();
method nativeReverseRedirectedPath (line 194) | private static native String nativeReverseRedirectedPath(String redire...
method nativeGetRedirectedPath (line 196) | private static native String nativeGetRedirectedPath(String orgPath);
method nativeIORedirect (line 198) | private static native void nativeIORedirect(String origPath, String ne...
method nativeIOWhitelist (line 200) | private static native void nativeIOWhitelist(String path);
method nativeIOForbid (line 202) | private static native void nativeIOForbid(String path);
method nativeEnableIORedirect (line 204) | private static native void nativeEnableIORedirect(String selfSoPath, i...
method onGetUid (line 206) | 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 107) | public static VClientImpl get() {
method isBound (line 111) | public boolean isBound() {
method getDeviceInfo (line 115) | public VDeviceInfo getDeviceInfo() {
method getCurrentApplication (line 126) | public Application getCurrentApplication() {
method getCurrentPackage (line 130) | public String getCurrentPackage() {
method getCurrentApplicationInfo (line 135) | public ApplicationInfo getCurrentApplicationInfo() {
method getCrashHandler (line 139) | public CrashHandler getCrashHandler() {
method setCrashHandler (line 143) | public void setCrashHandler(CrashHandler crashHandler) {
method getVUid (line 147) | public int getVUid() {
method getBaseVUid (line 151) | public int getBaseVUid() {
method getClassLoader (line 155) | public ClassLoader getClassLoader(ApplicationInfo appInfo) {
method sendMessage (line 160) | private void sendMessage(int what, Object obj) {
method getAppThread (line 167) | @Override
method getToken (line 172) | @Override
method initProcess (line 177) | public void initProcess(IBinder token, int vuid) {
method handleNewIntent (line 182) | private void handleNewIntent(NewIntentData data) {
method bindApplication (line 204) | public void bindApplication(final String packageName, final String pro...
method bindApplicationNoCheck (line 220) | private void bindApplicationNoCheck(String packageName, String process...
method fixWeChatRecovery (line 351) | private void fixWeChatRecovery(Application app) {
method setupUncaughtHandler (line 364) | private void setupUncaughtHandler() {
method startIOUniformer (line 401) | @SuppressLint("SdCardPath")
method getMountPoints (line 436) | @SuppressLint("SdCardPath")
method createPackageContext (line 449) | private Context createPackageContext(String packageName) {
method fixBoundApp (line 460) | private Object fixBoundApp(AppBindData data) {
method installContentProviders (line 473) | private void installContentProviders(Context app, List<ProviderInfo> p...
method acquireProviderClient (line 489) | @Override
method fixInstalledProviders (line 518) | private void fixInstalledProviders() {
method clearSettingProvider (line 558) | private void clearSettingProvider() {
method clearContentProvider (line 576) | private static void clearContentProvider(Object cache) {
method finishActivity (line 587) | @Override
method scheduleNewIntent (line 592) | @Override
method scheduleReceiver (line 601) | @Override
method handleReceiver (line 611) | private void handleReceiver(ReceiverData data) {
method createProxyService (line 639) | @Override
method getDebugInfo (line 644) | @Override
class RootThreadGroup (line 651) | private static class RootThreadGroup extends ThreadGroup {
method RootThreadGroup (line 653) | RootThreadGroup(ThreadGroup parent) {
method uncaughtException (line 657) | @Override
class NewIntentData (line 669) | private final class NewIntentData {
class AppBindData (line 675) | private final class AppBindData {
class ReceiverData (line 682) | private final class ReceiverData {
class H (line 689) | private class H extends Handler {
method H (line 691) | private H() {
method handleMessage (line 695) | @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 71) | public final class InvocationStubManager {
method InvocationStubManager (line 78) | private InvocationStubManager() {
method getInstance (line 81) | public static InvocationStubManager getInstance() {
method injectAll (line 85) | void injectAll() throws Throwable {
method isInit (line 96) | public boolean isInit() {
method init (line 101) | public void init() throws Throwable {
method injectInternal (line 110) | private void injectInternal() throws Throwable {
method addInjector (line 189) | private void addInjector(IInjector IInjector) {
method findInjector (line 193) | public <T extends IInjector> T findInjector(Class<T> clazz) {
method checkEnv (line 198) | public <T extends IInjector> void checkEnv(Class<T> clazz) {
method getInvocationStub (line 209) | 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 60) | public final class VirtualCore {
method VirtualCore (line 98) | private VirtualCore() {
method get (line 101) | public static VirtualCore get() {
method getPM (line 105) | public static PackageManager getPM() {
method mainThread (line 109) | public static Object mainThread() {
method getInitLock (line 113) | public ConditionVariable getInitLock() {
method myUid (line 117) | public int myUid() {
method myUserId (line 121) | public int myUserId() {
method getComponentDelegate (line 125) | public ComponentDelegate getComponentDelegate() {
method setComponentDelegate (line 129) | public void setComponentDelegate(ComponentDelegate delegate) {
method getPhoneInfoDelegate (line 133) | public PhoneInfoDelegate getPhoneInfoDelegate() {
method setPhoneInfoDelegate (line 137) | public void setPhoneInfoDelegate(PhoneInfoDelegate phoneInfoDelegate) {
method setCrashHandler (line 141) | public void setCrashHandler(CrashHandler handler) {
method getTaskDescriptionDelegate (line 145) | public TaskDescriptionDelegate getTaskDescriptionDelegate() {
method setTaskDescriptionDelegate (line 149) | public void setTaskDescriptionDelegate(TaskDescriptionDelegate taskDes...
method getGids (line 153) | public int[] getGids() {
method getContext (line 157) | public Context getContext() {
method getPackageManager (line 161) | public PackageManager getPackageManager() {
method getHostPkg (line 165) | public String getHostPkg() {
method getUnHookPackageManager (line 169) | public PackageManager getUnHookPackageManager() {
method startup (line 174) | public void startup(Context context) throws Throwable {
method waitForEngine (line 209) | public void waitForEngine() {
method isEngineLaunched (line 213) | public boolean isEngineLaunched() {
method getEngineProcessName (line 224) | public String getEngineProcessName() {
method initialize (line 228) | public void initialize(VirtualInitializer initializer) {
method detectProcessType (line 248) | private void detectProcessType() {
method getService (line 269) | private IAppManager getService() {
method isVAppProcess (line 276) | public boolean isVAppProcess() {
method isMainProcess (line 283) | public boolean isMainProcess() {
method isChildProcess (line 290) | public boolean isChildProcess() {
method isServerProcess (line 297) | public boolean isServerProcess() {
method getProcessName (line 304) | public String getProcessName() {
method getMainProcessName (line 311) | public String getMainProcessName() {
method preOpt (line 321) | @Deprecated
method isAppRunning (line 336) | public boolean isAppRunning(String packageName, int userId) {
method installPackage (line 340) | public InstallResult installPackage(String apkPath, int flags) {
method addVisibleOutsidePackage (line 348) | public void addVisibleOutsidePackage(String pkg) {
method removeVisibleOutsidePackage (line 356) | public void removeVisibleOutsidePackage(String pkg) {
method isOutsidePackageVisible (line 364) | public boolean isOutsidePackageVisible(String pkg) {
method isAppInstalled (line 372) | public boolean isAppInstalled(String pkg) {
method isPackageLaunchable (line 380) | public boolean isPackageLaunchable(String packageName) {
method getLaunchIntent (line 386) | public Intent getLaunchIntent(String packageName, int userId) {
method createShortcut (line 411) | public boolean createShortcut(int userId, String packageName, OnEmitSh...
method createShortcut (line 415) | public boolean createShortcut(int userId, String packageName, Intent s...
method removeShortcut (line 464) | public boolean removeShortcut(int userId, String packageName, Intent s...
class UiCallback (line 506) | public abstract static class UiCallback extends IUiCallback.Stub {
method setUiCallback (line 509) | public void setUiCallback(Intent intent, IUiCallback callback) {
method getInstalledAppInfo (line 517) | public InstalledAppInfo getInstalledAppInfo(String pkg, int flags) {
method getInstalledAppCount (line 525) | public int getInstalledAppCount() {
method isStartup (line 533) | public boolean isStartup() {
method uninstallPackageAsUser (line 537) | public boolean uninstallPackageAsUser(String pkgName, int userId) {
method uninstallPackage (line 546) | public boolean uninstallPackage(String pkgName) {
method getResources (line 555) | public Resources getResources(String pkg) throws Resources.NotFoundExc...
method resolveActivityInfo (line 566) | public synchronized ActivityInfo resolveActivityInfo(Intent intent, in...
method resolveActivityInfo (line 587) | public ActivityInfo resolveActivityInfo(ComponentName componentName, i...
method resolveServiceInfo (line 591) | public ServiceInfo resolveServiceInfo(Intent intent, int userId) {
method killApp (line 600) | public void killApp(String pkg, int userId) {
method killAllApps (line 604) | public void killAllApps() {
method getInstalledApps (line 608) | public List<InstalledAppInfo> getInstalledApps(int flags) {
method getInstalledAppsAsUser (line 616) | public List<InstalledAppInfo> getInstalledAppsAsUser(int userId, int f...
method clearAppRequestListener (line 624) | public void clearAppRequestListener() {
method scanApps (line 632) | public void scanApps() {
method getAppRequestListener (line 640) | public IAppRequestListener getAppRequestListener() {
method setAppRequestListener (line 648) | public void setAppRequestListener(final AppRequestListener listener) {
method isPackageLaunched (line 677) | public boolean isPackageLaunched(int userId, String packageName) {
method setPackageHidden (line 685) | public void setPackageHidden(int userId, String packageName, boolean h...
method installPackageAsUser (line 693) | public boolean installPackageAsUser(int userId, String packageName) {
method isAppInstalledAsUser (line 701) | public boolean isAppInstalledAsUser(int userId, String packageName) {
method getPackageInstalledUsers (line 709) | public int[] getPackageInstalledUsers(String packageName) {
class PackageObserver (line 717) | public abstract static class PackageObserver extends IPackageObserver....
method registerObserver (line 720) | public void registerObserver(IPackageObserver observer) {
method unregisterObserver (line 728) | public void unregisterObserver(IPackageObserver observer) {
method isOutsideInstalled (line 736) | public boolean isOutsideInstalled(String packageName) {
method getSystemPid (line 746) | public int getSystemPid() {
type ProcessType (line 753) | private enum ProcessType {
type AppRequestListener (line 772) | public interface AppRequestListener {
method onRequestInstall (line 773) | void onRequestInstall(String path);
method onRequestUninstall (line 775) | void onRequestUninstall(String pkg);
type OnEmitShortcutListener (line 778) | public interface OnEmitShortcutListener {
method getIcon (line 779) | Bitmap getIcon(Bitmap originIcon);
method getName (line 781) | String getName(String originName);
class VirtualInitializer (line 784) | public static abstract class VirtualInitializer {
method onMainProcess (line 785) | public void onMainProcess() {
method onVirtualProcess (line 788) | public void onVirtualProcess() {
method onServerProcess (line 791) | public void onServerProcess() {
method onChildProcess (line 794) | public void onChildProcess() {
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/env/Constants.java
class Constants (line 12) | 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 {
method isSpecSystemPackage (line 88) | public static boolean isSpecSystemPackage(String pkg) {
method isConflictingInstrumentation (line 92) | public static boolean isConflictingInstrumentation(String packageName) {
method isActionInBlackList (line 101) | public static boolean isActionInBlackList(String action) {
method addBlackAction (line 110) | public static void addBlackAction(String action) {
method protectIntentFilter (line 114) | public static void protectIntentFilter(IntentFilter filter) {
method protectIntent (line 135) | public static void protectIntent(Intent intent) {
method unprotectIntent (line 142) | public static void unprotectIntent(Intent intent) {
method protectAction (line 149) | public static String protectAction(String originAction) {
method unprotectAction (line 163) | public static String unprotectAction(String action) {
method isWhitePermission (line 179) | 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 23) | public class ContextFixer {
method fixContext (line 32) | public static void fixContext(Context context) {
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 29) | public final class AppInstrumentation extends InstrumentationDelegate im...
method AppInstrumentation (line 35) | private AppInstrumentation(Instrumentation base) {
method getDefault (line 39) | public static AppInstrumentation getDefault() {
method create (line 50) | private static AppInstrumentation create() {
method inject (line 59) | @Override
method isEnvBad (line 65) | @Override
method callActivityOnCreate (line 70) | @Override
method callActivityOnCreate (line 100) | @Override
method callActivityOnResume (line 108) | @Override
method callActivityOnDestroy (line 132) | @Override
method callActivityOnPause (line 139) | @Override
method callApplicationOnCreate (line 147) | @Override
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 15) | class DownloadProviderHook extends ExternalProviderHook {
method DownloadProviderHook (line 32) | DownloadProviderHook(Object base) {
method insert (line 36) | @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/ProviderHook.java
class ProviderHook (line 29) | public class ProviderHook implements InvocationHandler {
method fetch (line 42) | @Override
method fetch (line 48) | @Override
method ProviderHook (line 57) | public ProviderHook(Object base) {
method fetchHook (line 61) | private static HookFetcher fetchHook(String authority) {
method createProxy (line 77) | private static IInterface createProxy(IInterface provider, ProviderHoo...
method createProxy (line 86) | public static IInterface createProxy(boolean external, String authorit...
method call (line 101) | public Bundle call(MethodBox methodBox, String method, String arg, Bun...
method insert (line 105) | public Uri insert(MethodBox methodBox, Uri url, ContentValues initialV...
method query (line 110) | public Cursor query(MethodBox methodBox, Uri url, String[] projection,...
method getType (line 115) | public String getType(MethodBox methodBox, Uri url) throws InvocationT...
method bulkInsert (line 119) | public int bulkInsert(MethodBox methodBox, Uri url, ContentValues[] in...
method delete (line 123) | public int delete(MethodBox methodBox, Uri url, String selection, Stri...
method update (line 127) | public int update(MethodBox methodBox, Uri url, ContentValues values, ...
method openFile (line 132) | public ParcelFileDescriptor openFile(MethodBox methodBox, Uri url, Str...
method openAssetFile (line 136) | public AssetFileDescriptor openAssetFile(MethodBox methodBox, Uri url,...
method invoke (line 140) | @Override
method processArgs (line 216) | protected void processArgs(Method method, Object... args) {
type HookFetcher (line 220) | public interface HookFetcher {
method fetch (line 221) | ProviderHook fetch(boolean external, IInterface provider);
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 67) | private static class getPassword extends MethodProxy {
method getMethodName (line 68) | @Override
method call (line 73) | @Override
class getUserData (line 80) | private static class getUserData extends MethodProxy {
method getMethodName (line 81) | @Override
method call (line 86) | @Override
class getAuthenticatorTypes (line 94) | private static class getAuthenticatorTypes extends MethodProxy {
method getMethodName (line 95) | @Override
method call (line 100) | @Override
class getAccounts (line 106) | private static class getAccounts extends MethodProxy {
method getMethodName (line 107) | @Override
method call (line 112) | @Override
class getAccountsForPackage (line 119) | private static class getAccountsForPackage extends MethodProxy {
method getMethodName (line 120) | @Override
method call (line 125) | @Override
class getAccountsByTypeForPackage (line 132) | private static class getAccountsByTypeForPackage extends MethodProxy {
method getMethodName (line 133) | @Override
method call (line 138) | @Override
class getAccountsAsUser (line 146) | private static class getAccountsAsUser extends MethodProxy {
method getMethodName (line 147) | @Override
method call (line 152) | @Override
class hasFeatures (line 159) | private static class hasFeatures extends MethodProxy {
method getMethodName (line 160) | @Override
method call (line 165) | @Override
class getAccountsByFeatures (line 175) | private static class getAccountsByFeatures extends MethodProxy {
method getMethodName (line 176) | @Override
method call (line 181) | @Override
class addAccountExplicitly (line 191) | private static class addAccountExplicitly extends MethodProxy {
method getMethodName (line 192) | @Override
method call (line 197) | @Override
class removeAccount (line 206) | private static class removeAccount extends MethodProxy {
method getMethodName (line 207) | @Override
method call (line 212) | @Override
class removeAccountAsUser (line 222) | private static class removeAccountAsUser extends MethodProxy {
method getMethodName (line 223) | @Override
method call (line 228) | @Override
class removeAccountExplicitly (line 238) | private static class removeAccountExplicitly extends MethodProxy {
method getMethodName (line 239) | @Override
method call (line 244) | @Override
class copyAccountToUser (line 251) | private static class copyAccountToUser extends MethodProxy {
method getMethodName (line 252) | @Override
method call (line 257) | @Override
class invalidateAuthToken (line 268) | private static class invalidateAuthToken extends MethodProxy {
method getMethodName (line 269) | @Override
method call (line 274) | @Override
class peekAuthToken (line 283) | private static class peekAuthToken extends MethodProxy {
method getMethodName (line 284) | @Override
method call (line 289) | @Override
class setAuthToken (line 297) | private static class setAuthToken extends MethodProxy {
method getMethodName (line 298) | @Override
method call (line 303) | @Override
class setPassword (line 313) | private static class setPassword extends MethodProxy {
method getMethodName (line 314) | @Override
method call (line 319) | @Override
class clearPassword (line 328) | private static class clearPassword extends MethodProxy {
method getMethodName (line 329) | @Override
method call (line 334) | @Override
class setUserData (line 342) | private static class setUserData extends MethodProxy {
method getMethodName (line 343) | @Override
method call (line 348) | @Override
class updateAppPermission (line 358) | private static class updateAppPermission extends MethodProxy {
method getMethodName (line 359) | @Override
method call (line 364) | @Override
class getAuthToken (line 375) | private static class getAuthToken extends MethodProxy {
method getMethodName (line 376) | @Override
method call (line 381) | @Override
class addAccount (line 394) | private static class addAccount extends MethodProxy {
method getMethodName (line 395) | @Override
method call (line 400) | @Override
class addAccountAsUser (line 413) | private static class addAccountAsUser extends MethodProxy {
method getMethodName (line 414) | @Override
method call (line 419) | @Override
class updateCredentials (line 432) | private static class updateCredentials extends MethodProxy {
method getMethodName (line 433) | @Override
method call (line 438) | @Override
class editProperties (line 450) | private static class editProperties extends MethodProxy {
method getMethodName (line 451) | @Override
method call (line 456) | @Override
class confirmCredentialsAsUser (line 466) | private static class confirmCredentialsAsUser extends MethodProxy {
method getMethodName (line 467) | @Override
method call (line 472) | @Override
class accountAuthenticated (line 484) | private static class accountAuthenticated extends MethodProxy {
method getMethodName (line 485) | @Override
method call (line 490) | @Override
class getAuthTokenLabel (line 497) | private static class getAuthTokenLabel extends MethodProxy {
method getMethodName (line 498) | @Override
method call (line 503) | @Override
class addSharedAccountAsUser (line 513) | private static class addSharedAccountAsUser extends MethodProxy {
method getMethodName (line 514) | @Override
method call (line 519) | @Override
class getSharedAccountsAsUser (line 527) | private static class getSharedAccountsAsUser extends MethodProxy {
method getMethodName (line 528) | @Override
method call (line 533) | @Override
class removeSharedAccountAsUser (line 540) | private static class removeSharedAccountAsUser extends MethodProxy {
method getMethodName (line 541) | @Override
method call (line 546) | @Override
class renameAccount (line 554) | private static class renameAccount extends MethodProxy {
method getMethodName (line 555) | @Override
method call (line 560) | @Override
class getPreviousName (line 570) | private static class getPreviousName extends MethodProxy {
method getMethodName (line 571) | @Override
method call (line 576) | @Override
class renameSharedAccountAsUser (line 583) | private static class renameSharedAccountAsUser extends MethodProxy {
method getMethodName (line 584) | @Override
method call (line 589) | @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 40) | @Inject(MethodProxies.class)
method ActivityManagerStub (line 43) | public ActivityManagerStub() {
method inject (line 47) | @Override
method onBindMethods (line 66) | @Override
method isEnvBad (line 121) | @Override
class isUserRunning (line 126) | private class isUserRunning extends MethodProxy {
method getMethodName (line 127) | @Override
method call (line 132) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/HCallbackStub.java
class HCallbackStub (line 30) | public class HCallbackStub implements Handler.Callback, IInjector {
method HCallbackStub (line 46) | private HCallbackStub() {
method getDefault (line 49) | public static HCallbackStub getDefault() {
method getH (line 53) | private static Handler getH() {
method getHCallback (line 57) | private static Handler.Callback getHCallback() {
method handleMessage (line 67) | @Override
method handleLaunchActivity (line 99) | private boolean handleLaunchActivity(Message msg) {
method inject (line 137) | @Override
method isEnvBad (line 143) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java
class MethodProxies (line 88) | @SuppressWarnings("unused")
class ForceStopPackage (line 92) | static class ForceStopPackage extends MethodProxy {
method getMethodName (line 94) | @Override
method call (line 99) | @Override
method isEnable (line 107) | @Override
class CrashApplication (line 114) | static class CrashApplication extends MethodProxy {
method getMethodName (line 116) | @Override
method call (line 121) | @Override
method isEnable (line 126) | @Override
class AddPackageDependency (line 133) | static class AddPackageDependency extends MethodProxy {
method getMethodName (line 135) | @Override
method call (line 140) | @Override
method isEnable (line 146) | @Override
class GetPackageForToken (line 152) | static class GetPackageForToken extends MethodProxy {
method getMethodName (line 154) | @Override
method call (line 159) | @Override
class UnbindService (line 170) | static class UnbindService extends MethodProxy {
method getMethodName (line 172) | @Override
method call (line 177) | @Override
method isEnable (line 187) | @Override
class GetContentProviderExternal (line 193) | static class GetContentProviderExternal extends GetContentProvider {
method getMethodName (line 195) | @Override
method getProviderNameIndex (line 200) | @Override
method isEnable (line 205) | @Override
class StartVoiceActivity (line 211) | static class StartVoiceActivity extends StartActivity {
method getMethodName (line 212) | @Override
method call (line 217) | @Override
class UnstableProviderDied (line 224) | static class UnstableProviderDied extends MethodProxy {
method getMethodName (line 226) | @Override
method call (line 231) | @Override
class PeekService (line 241) | static class PeekService extends MethodProxy {
method getMethodName (line 243) | @Override
method call (line 248) | @Override
method isEnable (line 256) | @Override
class GetPackageAskScreenCompat (line 263) | static class GetPackageAskScreenCompat extends MethodProxy {
method getMethodName (line 265) | @Override
method call (line 270) | @Override
method isEnable (line 281) | @Override
class GetIntentSender (line 288) | static class GetIntentSender extends MethodProxy {
method getMethodName (line 290) | @Override
method call (line 295) | @Override
method redirectIntentSender (line 327) | private Intent redirectIntentSender(int type, String creator, Intent...
method isEnable (line 359) | @Override
class StartActivity (line 367) | static class StartActivity extends MethodProxy {
method getMethodName (line 373) | @Override
method call (line 378) | @Override
method handleInstallRequest (line 491) | private boolean handleInstallRequest(Intent intent) {
method handleUninstallRequest (line 535) | private boolean handleUninstallRequest(Intent intent) {
class StartActivities (line 555) | static class StartActivities extends MethodProxy {
method getMethodName (line 557) | @Override
method call (line 562) | @Override
method isEnable (line 575) | @Override
class FinishActivity (line 582) | static class FinishActivity extends MethodProxy {
method getMethodName (line 583) | @Override
method afterCall (line 588) | @Override
method isEnable (line 615) | @Override
class GetCallingPackage (line 622) | static class GetCallingPackage extends MethodProxy {
method getMethodName (line 624) | @Override
method call (line 629) | @Override
method isEnable (line 635) | @Override
class GetPackageForIntentSender (line 642) | static class GetPackageForIntentSender extends MethodProxy {
method getMethodName (line 643) | @Override
method call (line 648) | @Override
method isEnable (line 660) | @Override
class PublishContentProviders (line 667) | @SuppressWarnings("unchecked")
method getMethodName (line 670) | @Override
method call (line 675) | @Override
method isEnable (line 680) | @Override
class GetServices (line 687) | static class GetServices extends MethodProxy {
method getMethodName (line 688) | @Override
method call (line 693) | @Override
method isEnable (line 700) | @Override
class GrantUriPermissionFromOwner (line 706) | static class GrantUriPermissionFromOwner extends MethodProxy {
method getMethodName (line 708) | @Override
method call (line 713) | @Override
method isEnable (line 719) | @Override
class SetServiceForeground (line 725) | static class SetServiceForeground extends MethodProxy {
method getMethodName (line 727) | @Override
method call (line 732) | @Override
method isEnable (line 768) | @Override
class UpdateDeviceOwner (line 775) | static class UpdateDeviceOwner extends MethodProxy {
method getMethodName (line 777) | @Override
method call (line 782) | @Override
method isEnable (line 788) | @Override
class GetIntentForIntentSender (line 796) | static class GetIntentForIntentSender extends MethodProxy {
method getMethodName (line 798) | @Override
method afterCall (line 803) | @Override
class UnbindFinished (line 814) | static class UnbindFinished extends MethodProxy {
method getMethodName (line 816) | @Override
method call (line 821) | @Override
method isEnable (line 830) | @Override
class StartActivityIntentSender (line 836) | static class StartActivityIntentSender extends MethodProxy {
method getMethodName (line 837) | @Override
method call (line 842) | @Override
class BindService (line 850) | static class BindService extends MethodProxy {
method getMethodName (line 852) | @Override
method call (line 857) | @Override
method isEnable (line 884) | @Override
class StartService (line 891) | static class StartService extends MethodProxy {
method getMethodName (line 893) | @Override
method call (line 898) | @Override
method isEnable (line 925) | @Override
class StartActivityAndWait (line 931) | static class StartActivityAndWait extends StartActivity {
method getMethodName (line 932) | @Override
method call (line 937) | @Override
class PublishService (line 944) | static class PublishService extends MethodProxy {
method getMethodName (line 946) | @Override
method call (line 951) | @Override
method isEnable (line 963) | @Override
class GetRunningAppProcesses (line 970) | @SuppressWarnings("unchecked")
method getMethodName (line 973) | @Override
method call (line 978) | @Override
class SetPackageAskScreenCompat (line 1000) | static class SetPackageAskScreenCompat extends MethodProxy {
method getMethodName (line 1002) | @Override
method call (line 1007) | @Override
method isEnable (line 1018) | @Override
class GetCallingActivity (line 1025) | static class GetCallingActivity extends MethodProxy {
method getMethodName (line 1027) | @Override
method call (line 1032) | @Override
method isEnable (line 1038) | @Override
class GetCurrentUser (line 1045) | static class GetCurrentUser extends MethodProxy {
method getMethodName (line 1047) | @Override
method call (line 1052) | @Override
class KillApplicationProcess (line 1064) | static class KillApplicationProcess extends MethodProxy {
method getMethodName (line 1066) | @Override
method call (line 1071) | @Override
method isEnable (line 1082) | @Override
class StartActivityAsUser (line 1089) | static class StartActivityAsUser extends StartActivity {
method getMethodName (line 1091) | @Override
method call (line 1096) | @Override
class CheckPermission (line 1103) | static class CheckPermission extends MethodProxy {
method getMethodName (line 1105) | @Override
method call (line 1110) | @Override
method isEnable (line 1123) | @Override
class StartActivityAsCaller (line 1131) | static class StartActivityAsCaller extends StartActivity {
method getMethodName (line 1133) | @Override
class HandleIncomingUser (line 1140) | static class HandleIncomingUser extends MethodProxy {
method getMethodName (line 1142) | @Override
method call (line 1147) | @Override
method isEnable (line 1156) | @Override
class GetTasks (line 1164) | @SuppressWarnings("unchecked")
method getMethodName (line 1167) | @Override
method call (line 1172) | @Override
method isEnable (line 1186) | @Override
class GetPersistedUriPermissions (line 1193) | static class GetPersistedUriPermissions extends MethodProxy {
method getMethodName (line 1195) | @Override
method call (line 1200) | @Override
method isEnable (line 1206) | @Override
class RegisterReceiver (line 1213) | static class RegisterReceiver extends MethodProxy {
method getMethodName (line 1227) | @Override
method call (line 1232) | @Override
method isEnable (line 1267) | @Override
class IIntentReceiverProxy (line 1272) | private static class IIntentReceiverProxy extends IIntentReceiver.St...
method IIntentReceiverProxy (line 1276) | IIntentReceiverProxy(IInterface old) {
method performReceive (line 1280) | public void performReceive(Intent intent, int resultCode, String d...
method accept (line 1296) | private boolean accept(Intent intent) {
method performReceive (line 1305) | @SuppressWarnings("unused")
class StopService (line 1315) | static class StopService extends MethodProxy {
method getMethodName (line 1317) | @Override
method call (line 1322) | @Override
method isEnable (line 1342) | @Override
class GetContentProvider (line 1349) | static class GetContentProvider extends MethodProxy {
method getMethodName (line 1351) | @Override
method call (line 1356) | @Override
method getProviderNameIndex (line 1412) | public int getProviderNameIndex() {
method isEnable (line 1416) | @Override
class SetTaskDescription (line 1422) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
method getMethodName (line 1424) | @Override
method call (line 1429) | @Override
method isEnable (line 1466) | @Override
class StopServiceToken (line 1472) | static class StopServiceToken extends MethodProxy {
method getMethodName (line 1474) | @Override
method call (line 1479) | @Override
method isEnable (line 1493) | @Override
class StartActivityWithConfig (line 1499) | static class StartActivityWithConfig extends StartActivity {
method getMethodName (line 1500) | @Override
method call (line 1505) | @Override
class StartNextMatchingActivity (line 1511) | static class StartNextMatchingActivity extends StartActivity {
method getMethodName (line 1512) | @Override
method call (line 1517) | @Override
class BroadcastIntent (line 1524) | static class BroadcastIntent extends MethodProxy {
method getMethodName (line 1526) | @Override
method call (line 1531) | @Override
method handleIntent (line 1554) | private Intent handleIntent(final Intent intent) {
method handleInstallShortcutIntent (line 1573) | private Intent handleInstallShortcutIntent(Intent intent) {
method handleUninstallShortcutIntent (line 1611) | private void handleUninstallShortcutIntent(Intent intent) {
method isEnable (line 1625) | @Override
class GetActivityClassForToken (line 1632) | static class GetActivityClassForToken extends MethodProxy {
method getMethodName (line 1634) | @Override
method call (line 1639) | @Override
method isEnable (line 1645) | @Override
class CheckGrantUriPermission (line 1652) | static class CheckGrantUriPermission extends MethodProxy {
method getMethodName (line 1654) | @Override
method call (line 1659) | @Override
method isEnable (line 1665) | @Override
class ServiceDoneExecuting (line 1672) | static class ServiceDoneExecuting extends MethodProxy {
method getMethodName (line 1674) | @Override
method call (line 1679) | @Override
method isEnable (line 1692) | @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/bluetooth/BluetoothStub.java
class BluetoothStub (line 17) | public class BluetoothStub extends BinderInvocationProxy {
method BluetoothStub (line 22) | public BluetoothStub() {
method onBindMethods (line 27) | @Override
class GetAddress (line 33) | @FakeDeviceMark("fake MAC")
method GetAddress (line 36) | GetAddress() {
method call (line 40) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/clipboard/ClipBoardStub.java
class ClipBoardStub (line 19) | public class ClipBoardStub extends BinderInvocationProxy {
method ClipBoardStub (line 21) | public ClipBoardStub() {
method getInterface (line 25) | private static IInterface getInterface() {
method onBindMethods (line 35) | @Override
method inject (line 49) | @Override
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 13) | public class ContentServiceStub extends BinderInvocationProxy {
method ContentServiceStub (line 15) | public ContentServiceStub() {
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 schedule (line 48) | private class schedule extends MethodProxy {
method getMethodName (line 50) | @Override
method call (line 55) | @Override
class getAllPendingJobs (line 62) | private class getAllPendingJobs extends MethodProxy {
method getMethodName (line 64) | @Override
method call (line 69) | @Override
class cancelAll (line 75) | private class cancelAll extends MethodProxy {
method getMethodName (line 77) | @Override
method call (line 82) | @Override
class cancel (line 89) | private class cancel extends MethodProxy {
method getMethodName (line 91) | @Override
method call (line 96) | @Override
class getPendingJob (line 104) | private class getPendingJob extends MethodProxy {
method getPendingJob (line 105) | private getPendingJob() {
method call (line 108) | public Object call(Object who, Method method, Object... args) throws...
method getMethodName (line 112) | public String getMethodName() {
class enqueue (line 117) | private class enqueue extends MethodProxy {
method enqueue (line 118) | private enqueue() {
method call (line 121) | public Object call(Object who, Method method, Object... args) throws...
method getMethodName (line 128) | public String getMethodName() {
method redirect (line 133) | private Object redirect(Object item, String pkg) {
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 23) | @SuppressWarnings("ALL")
method fixLocationRequest (line 26) | private static void fixLocationRequest(LocationRequest request) {
class AddGpsStatusListener (line 37) | static class AddGpsStatusListener extends ReplaceLastPkgMethodProxy {
method AddGpsStatusListener (line 39) | public AddGpsStatusListener() {
method AddGpsStatusListener (line 43) | public AddGpsStatusListener(String name) {
method call (line 47) | @Override
class RequestLocationUpdates (line 66) | static class RequestLocationUpdates extends ReplaceLastPkgMethodProxy {
method RequestLocationUpdates (line 68) | public RequestLocationUpdates() {
method call (line 72) | @Override
class RemoveUpdates (line 91) | static class RemoveUpdates extends ReplaceLastPkgMethodProxy {
method RemoveUpdates (line 93) | public RemoveUpdates() {
method call (line 97) | @Override
class GetLastLocation (line 107) | static class GetLastLocation extends ReplaceLastPkgMethodProxy {
method GetLastLocation (line 109) | public GetLastLocation() {
method call (line 113) | @Override
class GetLastKnownLocation (line 131) | static class GetLastKnownLocation extends GetLastLocation {
method getMethodName (line 132) | @Override
class getProviders (line 138) | static class getProviders extends MethodProxy {
method getMethodName (line 146) | @Override
method call (line 151) | @Override
class IsProviderEnabled (line 157) | static class IsProviderEnabled extends MethodProxy {
method getMethodName (line 158) | @Override
method call (line 163) | @Override
class getAllProviders (line 183) | static class getAllProviders extends getProviders {
method getMethodName (line 185) | @Override
class GetBestProvider (line 191) | static class GetBestProvider extends MethodProxy {
method getMethodName (line 192) | @Override
method call (line 197) | @Override
class RemoveGpsStatusListener (line 207) | static class RemoveGpsStatusListener extends ReplaceLastPkgMethodProxy {
method RemoveGpsStatusListener (line 208) | public RemoveGpsStatusListener() {
method RemoveGpsStatusListener (line 212) | public RemoveGpsStatusListener(String name) {
method call (line 216) | @Override
class sendExtraCommand (line 225) | static class sendExtraCommand extends MethodProxy {
method getMethodName (line 227) | @Override
method call (line 232) | @Override
class UnregisterGnssStatusCallback (line 242) | static class UnregisterGnssStatusCallback extends RemoveGpsStatusListe...
method UnregisterGnssStatusCallback (line 243) | public UnregisterGnssStatusCallback() {
class RegisterGnssStatusCallback (line 248) | static class RegisterGnssStatusCallback extends MethodProxy {
method getMethodName (line 250) | @Override
method call (line 255) | @Override
class getProviderProperties (line 276) | static class getProviderProperties extends MethodProxy {
method getMethodName (line 278) | @Override
method afterCall (line 283) | @Override
class locationCallbackFinished (line 298) | static class locationCallbackFinished extends MethodProxy {
method call (line 300) | @Override
method getMethodName (line 308) | @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 122) | static class CancelAllNotifications extends MethodProxy {
method getMethodName (line 124) | @Override
method call (line 129) | @Override
class AreNotificationsEnabledForPackage (line 140) | static class AreNotificationsEnabledForPackage extends MethodProxy {
method getMethodName (line 141) | @Override
method call (line 146) | @Override
class SetNotificationsEnabledForPackage (line 156) | static class SetNotificationsEnabledForPackage extends MethodProxy {
method getMethodName (line 157) | @Override
method call (line 162) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/notification/NotificationManagerStub.java
class NotificationManagerStub (line 19) | @Inject(MethodProxies.class)
method NotificationManagerStub (line 22) | public NotificationManagerStub() {
method onBindMethods (line 26) | @Override
method inject (line 44) | @Override
method isEnvBad (line 50) | @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/MethodProxies.java
class MethodProxies (line 52) | @SuppressWarnings("unused")
class IsPackageAvailable (line 55) | static class IsPackageAvailable extends MethodProxy {
method getMethodName (line 57) | @Override
method call (line 62) | @Override
method isEnable (line 71) | @Override
class GetInstallerPackageName (line 78) | static class GetInstallerPackageName extends MethodProxy {
method getMethodName (line 80) | @Override
method call (line 85) | @Override
method isEnable (line 90) | @Override
class GetPreferredActivities (line 96) | static class GetPreferredActivities extends MethodProxy {
method getMethodName (line 98) | @Override
method call (line 103) | @Override
class GetComponentEnabledSetting (line 111) | static class GetComponentEnabledSetting extends MethodProxy {
method getMethodName (line 113) | @Override
method call (line 118) | @Override
class RemovePackageFromPreferred (line 130) | static class RemovePackageFromPreferred extends MethodProxy {
method getMethodName (line 132) | @Override
method call (line 137) | @Override
class GetServiceInfo (line 150) | static class GetServiceInfo extends MethodProxy {
method getMethodName (line 152) | @Override
method call (line 157) | @Override
method isEnable (line 173) | @Override
class GetPackageUid (line 180) | static class GetPackageUid extends MethodProxy {
method getMethodName (line 182) | @Override
method call (line 187) | @Override
method isEnable (line 197) | @Override
class GetActivityInfo (line 211) | static class GetActivityInfo extends MethodProxy {
method getMethodName (line 213) | @Override
method call (line 218) | @Override
method isEnable (line 236) | @Override
class GetPackageUidEtc (line 242) | static class GetPackageUidEtc extends GetPackageUid {
method getMethodName (line 243) | @Override
class GetPackageInstaller (line 249) | static class GetPackageInstaller extends MethodProxy {
method isEnable (line 251) | @Override
method getMethodName (line 256) | @Override
method call (line 261) | @Override
class FreeStorageAndNotify (line 337) | static class FreeStorageAndNotify extends MethodProxy {
method getMethodName (line 338) | @Override
method call (line 343) | @Override
class GetPackageGids (line 354) | static class GetPackageGids extends MethodProxy {
method getMethodName (line 356) | @Override
method call (line 361) | @Override
method isEnable (line 367) | @Override
class RevokeRuntimePermission (line 375) | static class RevokeRuntimePermission extends MethodProxy {
method getMethodName (line 377) | @Override
method call (line 382) | @Override
method isEnable (line 388) | @Override
class ClearPackagePreferredActivities (line 395) | static class ClearPackagePreferredActivities extends MethodProxy {
method getMethodName (line 397) | @Override
method call (line 402) | @Override
class ResolveContentProvider (line 410) | static class ResolveContentProvider extends MethodProxy {
method getMethodName (line 412) | @Override
method call (line 417) | @Override
class QueryIntentServices (line 434) | @SuppressWarnings("unchecked")
method getMethodName (line 437) | @Override
method call (line 442) | @Override
method isEnable (line 469) | @Override
class GetPermissions (line 476) | static class GetPermissions extends MethodProxy {
method getMethodName (line 478) | @Override
method call (line 483) | @Override
class IsPackageForzen (line 489) | static class IsPackageForzen extends MethodProxy {
method getMethodName (line 491) | @Override
method call (line 496) | @Override
method isEnable (line 501) | @Override
class GetPackageGidsEtc (line 508) | static class GetPackageGidsEtc extends GetPackageGids {
method getMethodName (line 510) | @Override
class QueryIntentActivities (line 517) | @SuppressWarnings("unchecked")
method getMethodName (line 520) | @Override
method call (line 525) | @Override
method isEnable (line 552) | @Override
class ResolveService (line 558) | static class ResolveService extends MethodProxy {
method getMethodName (line 560) | @Override
method call (line 565) | @Override
class ClearPackagePersistentPreferredActivities (line 580) | static class ClearPackagePersistentPreferredActivities extends MethodP...
method getMethodName (line 582) | @Override
method call (line 587) | @Override
class GetPermissionGroupInfo (line 594) | static class GetPermissionGroupInfo extends MethodProxy {
method getMethodName (line 596) | @Override
method call (line 601) | @Override
method isEnable (line 612) | @Override
class GetPackageInfo (line 619) | static final class GetPackageInfo extends MethodProxy {
method getMethodName (line 621) | @Override
method beforeCall (line 626) | @Override
method call (line 631) | @Override
class DeleteApplicationCacheFiles (line 652) | static class DeleteApplicationCacheFiles extends MethodProxy {
method getMethodName (line 654) | @Override
method call (line 659) | @Override
class SetApplicationBlockedSettingAsUser (line 667) | static class SetApplicationBlockedSettingAsUser extends MethodProxy {
method getMethodName (line 669) | @Override
method call (line 674) | @Override
method isEnable (line 680) | @Override
class GetApplicationEnabledSetting (line 687) | static class GetApplicationEnabledSetting extends MethodProxy {
method getMethodName (line 689) | @Override
method call (line 694) | @Override
class AddPackageToPreferred (line 701) | static class AddPackageToPreferred extends MethodProxy {
method getMethodName (line 703) | @Override
method call (line 708) | @Override
class CheckPermission (line 714) | static class CheckPermission extends MethodProxy {
method getMethodName (line 716) | @Override
method call (line 721) | @Override
method afterCall (line 729) | @Override
method isEnable (line 734) | @Override
class GetPackagesForUid (line 741) | static class GetPackagesForUid extends MethodProxy {
method getMethodName (line 744) | @Override
method call (line 749) | @Override
method isEnable (line 773) | @Override
class QueryContentProviders (line 780) | @SuppressWarnings("unchecked")
method getMethodName (line 783) | @Override
method call (line 788) | @Override
class SetApplicationEnabledSetting (line 801) | static class SetApplicationEnabledSetting extends MethodProxy {
method getMethodName (line 803) | @Override
method call (line 808) | @Override
method isEnable (line 814) | @Override
class CheckSignatures (line 820) | @SuppressLint("PackageManagerGetSignatures")
method getMethodName (line 823) | @Override
method call (line 828) | @Override
class checkUidSignatures (line 869) | static class checkUidSignatures extends MethodProxy {
method getMethodName (line 871) | @Override
method call (line 876) | @Override
class getNameForUid (line 885) | static class getNameForUid extends MethodProxy {
method getMethodName (line 887) | @Override
method call (line 892) | @Override
class DeletePackage (line 900) | static class DeletePackage extends MethodProxy {
method getMethodName (line 902) | @Override
method call (line 907) | @Override
class ActivitySupportsIntent (line 925) | static class ActivitySupportsIntent extends MethodProxy {
method getMethodName (line 926) | @Override
method call (line 931) | @Override
class ResolveIntent (line 941) | static class ResolveIntent extends MethodProxy {
method getMethodName (line 943) | @Override
method call (line 948) | @Override
class GetApplicationInfo (line 963) | static class GetApplicationInfo extends MethodProxy {
method getMethodName (line 965) | @Override
method call (line 970) | @Override
method isEnable (line 989) | @Override
class GetProviderInfo (line 996) | static class GetProviderInfo extends MethodProxy {
method getMethodName (line 998) | @Override
method call (line 1003) | @Override
class SetComponentEnabledSetting (line 1023) | static class SetComponentEnabledSetting extends MethodProxy {
method getMethodName (line 1025) | @Override
method call (line 1030) | @Override
method isEnable (line 1035) | @Override
class GetInstalledApplications (line 1041) | static class GetInstalledApplications extends MethodProxy {
method getMethodName (line 1043) | @Override
method call (line 1048) | @Override
class GetInstalledPackages (line 1061) | @SuppressWarnings({"unchecked", "WrongConstant"})
method getMethodName (line 1064) | @Override
method call (line 1069) | @Override
class QueryIntentReceivers (line 1088) | @SuppressWarnings("unchecked")
method getMethodName (line 1091) | @Override
method call (line 1096) | @Override
class GetReceiverInfo (line 1123) | static class GetReceiverInfo extends MethodProxy {
method getMethodName (line 1125) | @Override
method call (line 1130) | @Override
method isEnable (line 1147) | @Override
class GetPermissionFlags (line 1154) | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
method getMethodName (line 1157) | @Override
method call (line 1162) | @Override
class SetPackageStoppedState (line 1171) | static class SetPackageStoppedState extends MethodProxy {
method getMethodName (line 1173) | @Override
method call (line 1178) | @Override
method isEnable (line 1184) | @Override
class QueryIntentContentProviders (line 1191) | @SuppressWarnings("unchecked")
method getMethodName (line 1195) | @Override
method call (line 1200) | @Override
method isEnable (line 1225) | @Override
class GetApplicationBlockedSettingAsUser (line 1232) | static class GetApplicationBlockedSettingAsUser extends MethodProxy {
method getMethodName (line 1234) | @Override
method call (line 1239) | @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 11) | public class ShortcutServiceStub extends BinderInvocationProxy {
method ShortcutServiceStub (line 14) | public ShortcutServiceStub() {
method inject (line 18) | @Override
method onBindMethods (line 23) | @Override
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 13) | public class TelephonyRegistryStub extends BinderInvocationProxy {
method TelephonyRegistryStub (line 15) | public TelephonyRegistryStub() {
method onBindMethods (line 19) | @Override
FILE: VirtualApp/lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyStub.java
class TelephonyStub (line 15) | @Inject(MethodProxies.class)
method TelephonyStub (line 18) | public TelephonyStub() {
method onBindMethods (line 22) | @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 19) | public class AutoFillManagerStub extends BinderInvocationProxy {
method AutoFillManagerStub (line 24) | public AutoFillManagerStub() {
method inject (line 28) | @SuppressLint("WrongConstant")
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 28) | @Override
method isEnvBad (line 33) | @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 13) | public class MethodParameterUtils {
method getFirstParam (line 15) | public static <T> T getFirstParam(Object[] args, Class<T> tClass) {
method replaceFirstAppPkg (line 26) | public static String replaceFirstAppPkg(Object[] args) {
method replaceLastAppPkg (line 39) | public static String replaceLastAppPkg(Object[] args) {
method replaceSequenceAppPkg (line 49) | public static String replaceSequenceAppPkg(Object[] args, int sequence) {
method getAllInterface (line 59) | public static Class<?>[] getAllInterface(Class clazz){
method getAllInterfaces (line 68) | 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 getService (line 35) | public IAccountManager getService() {
method getAuthenticatorTypes (line 39) | public AuthenticatorDescription[] getAuthenticatorTypes() {
method removeAccount (line 47) | public void removeAccount(IAccountManagerResponse response, Account ac...
method getAuthToken (line 55) | public void getAuthToken(IAccountManagerResponse response, Account acc...
method addAccountExplicitly (line 63) | public boolean addAccountExplicitly(Account account, String password, ...
method getAccounts (line 71) | public Account[] getAccounts(int userId, String type) {
method getAccounts (line 79) | public Account[] getAccounts(String type) {
method peekAuthToken (line 87) | public String peekAuthToken(Account account, String authTokenType) {
method getPreviousName (line 95) | public String getPreviousName(Account account) {
method hasFeatures (line 103) | public void hasFeatures(IAccountManagerResponse response, Account acco...
method accountAuthenticated (line 111) | public boolean accountAuthenticated(Account account) {
method clearPassword (line 119) | public void clearPassword(Account account) {
method renameAccount (line 127) | public void renameAccount(IAccountManagerResponse response, Account ac...
method setPassword (line 135) | public void setPassword(Account account, String password) {
method addAccount (line 143) | public void addAccount(int userId, IAccountManagerResponse response, S...
method addAccount (line 151) | public void addAccount(IAccountManagerResponse response, String accoun...
method updateCredentials (line 159) | public void updateCredentials(IAccountManagerResponse response, Accoun...
method removeAccountExplicitly (line 167) | public boolean removeAccountExplicitly(Account account) {
method setUserData (line 175) | public void setUserData(Account account, String key, String value) {
method editProperties (line 183) | public void editProperties(IAccountManagerResponse response, String ac...
method getAuthTokenLabel (line 191) | public void getAuthTokenLabel(IAccountManagerResponse response, String...
method confirmCredentials (line 199) | public void confirmCredentials(IAccountManagerResponse response, Accou...
method invalidateAuthToken (line 207) | public void invalidateAuthToken(String accountType, String authToken) {
method getAccountsByFeatures (line 215) | public void getAccountsByFeatures(IAccountManagerResponse response, St...
method setAuthToken (line 223) | public void setAuthToken(Account account, String authTokenType, String...
method getPassword (line 231) | public Object getPassword(Account account) {
method getUserData (line 239) | public String getUserData(Account account, String key) {
method addAccount (line 257) | 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 startActivity (line 56) | public int startActivity(Intent intent, ActivityInfo info, IBinder res...
method startActivities (line 64) | public int startActivities(Intent[] intents, String[] resolvedTypes, I...
method startActivity (line 72) | public int startActivity(Intent intent, int userId) {
method onActivityCreate (line 83) | public ActivityClientRecord onActivityCreate(ComponentName component, ...
method getActivityRecord (line 95) | public ActivityClientRecord getActivityRecord(IBinder token) {
method onActivityResumed (line 101) | public void onActivityResumed(Activity activity) {
method onActivityDestroy (line 110) | public boolean onActivityDestroy(IBinder token) {
method getTaskInfo (line 119) | public AppTaskInfo getTaskInfo(int taskId) {
method getCallingActivity (line 127) | public ComponentName getCallingActivity(IBinder token) {
method getCallingPackage (line 135) | public String getCallingPackage(IBinder token) {
method getPackageForToken (line 143) | public String getPackageForToken(IBinder token) {
method getActivityForToken (line 151) | public ComponentName getActivityForToken(IBinder token) {
method startService (line 159) | public ComponentName startService(IInterface caller, Intent service, S...
method stopService (line 167) | public int stopService(IInterface caller, Intent service, String resol...
method stopServiceToken (line 175) | public boolean stopServiceToken(ComponentName className, IBinder token...
method setServiceForeground (line 183) | public void setServiceForeground(ComponentName className, IBinder toke...
method bindService (line 191) | public int bindService(Context context, Intent service, ServiceConnect...
method unbindService (line 200) | public boolean unbindService(Context context, ServiceConnection connec...
method bindService (line 209) | public int bindService(IBinder caller, IBinder token, Intent service, ...
method unbindService (line 217) | public boolean unbindService(IServiceConnection connection) {
method unbindFinished (line 225) | public void unbindFinished(IBinder token, Intent service, boolean doRe...
method serviceDoneExecuting (line 233) | public void serviceDoneExecuting(IBinder token, int type, int startId,...
method peekService (line 241) | public IBinder peekService(Inte
Condensed preview — 900 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,296K chars).
[
{
"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": "README.md",
"chars": 33370,
"preview": "\n[English Doc](README_eng.md \"English\")\n\n<h1><p align=\"center\">VA产品说明&开发指导</p></h1> \n\n## VA是什么? ##\nVirtualApp(简称:VA)是一款运"
},
{
"path": "README_eng.md",
"chars": 21860,
"preview": "\n[中文文档](README.md \"中文\")\n\n<h1><p align=\"center\">VA Product description & Development guidance</p></h1> \n\n## What is VA? #"
},
{
"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": 1759,
"preview": "apply plugin: 'com.android.application'\n\n\nandroid {\n compileSdkVersion 26\n buildToolsVersion '26.0.2'\n defaultC"
},
{
"path": "VirtualApp/app/proguard-rules.pro",
"chars": 1118,
"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/main/AndroidManifest.xml",
"chars": 1959,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n pa"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/VApp.java",
"chars": 3151,
"preview": "package io.virtualapp;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.support"
},
{
"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/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/Value.java",
"chars": 97,
"preview": "package io.virtualapp.abs;\n\n/**\n * @author Lody\n */\n\npublic class Value<T> {\n public T val;\n}\n"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/nestedadapter/RecyclerViewAdapterWrapper.java",
"chars": 3260,
"preview": "package io.virtualapp.abs.nestedadapter;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.ViewGroup;\n"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/nestedadapter/SmartRecyclerAdapter.java",
"chars": 4502,
"preview": "package io.virtualapp.abs.nestedadapter;\n\nimport android.support.annotation.NonNull;\nimport android.support.v7.widget.Gr"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/percent/PercentLinearLayout.java",
"chars": 2070,
"preview": "package io.virtualapp.abs.percent;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport androi"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/reflect/ReflectException.java",
"chars": 251,
"preview": "package io.virtualapp.abs.reflect;\n\n/**\n * @author Lody\n */\npublic class ReflectException extends RuntimeException {\n\n\tp"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/ui/BaseAdapterPlus.java",
"chars": 3804,
"preview": "package io.virtualapp.abs.ui;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.V"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/abs/ui/VActivity.java",
"chars": 1300,
"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/MyAppRequestListener.java",
"chars": 1519,
"preview": "package io.virtualapp.delegate;\n\nimport android.content.Context;\nimport android.widget.Toast;\n\nimport com.lody.virtual.c"
},
{
"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/MyTaskDescriptionDelegate.java",
"chars": 1146,
"preview": "package io.virtualapp.delegate;\n\nimport android.annotation.TargetApi;\nimport android.app.ActivityManager;\nimport android"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/effects/ExplosionAnimator.java",
"chars": 4262,
"preview": "package io.virtualapp.effects;\n\nimport java.util.Random;\n\nimport android.animation.ValueAnimator;\nimport android.graphic"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/effects/ExplosionField.java",
"chars": 5078,
"preview": "package io.virtualapp.effects;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java."
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/FlurryROMCollector.java",
"chars": 1917,
"preview": "package io.virtualapp.home;\n\nimport android.hardware.Camera;\nimport android.os.Build;\nimport android.util.Log;\n\nimport c"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/HomeActivity.java",
"chars": 18698,
"preview": "package io.virtualapp.home;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android."
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/HomeContract.java",
"chars": 963,
"preview": "package io.virtualapp.home;\n\n\nimport java.util.List;\n\nimport io.virtualapp.abs.BasePresenter;\nimport io.virtualapp.abs.B"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/HomePresenterImpl.java",
"chars": 7736,
"preview": "package io.virtualapp.home;\n\nimport android.app.Activity;\nimport android.graphics.Bitmap;\n\nimport com.lody.virtual.GmsSu"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/ListAppActivity.java",
"chars": 3068,
"preview": "package io.virtualapp.home;\n\nimport android.Manifest;\nimport android.app.Activity;\nimport android.content.Intent;\nimport"
},
{
"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": 5353,
"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/ListAppPresenterImpl.java",
"chars": 1008,
"preview": "package io.virtualapp.home;\n\nimport android.app.Activity;\nimport android.content.Intent;\n\nimport java.io.File;\n\nimport i"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/LoadingActivity.java",
"chars": 3246,
"preview": "package io.virtualapp.home;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nim"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppLocationAdapter.java",
"chars": 1598,
"preview": "package io.virtualapp.home.adapters;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.view.View"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/adapters/AppPagerAdapter.java",
"chars": 2348,
"preview": "package io.virtualapp.home.adapters;\n\nimport android.content.Context;\nimport android.os.Build;\nimport android.os.Environ"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/adapters/CloneAppListAdapter.java",
"chars": 4476,
"preview": "package io.virtualapp.home.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimp"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/adapters/LaunchpadAdapter.java",
"chars": 6299,
"preview": "package io.virtualapp.home.adapters;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimp"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/adapters/decorations/ItemOffsetDecoration.java",
"chars": 866,
"preview": "package io.virtualapp.home.adapters.decorations;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport a"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/location/MarkerActivity.java",
"chars": 8875,
"preview": "package io.virtualapp.home.location;\n\nimport android.app.Activity;\nimport android.app.AlertDialog;\nimport android.app.Pr"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/location/VirtualLocationSettings.java",
"chars": 4576,
"preview": "package io.virtualapp.home.location;\n\nimport android.app.ProgressDialog;\nimport android.content.Intent;\nimport android.o"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/models/AddAppButton.java",
"chars": 1071,
"preview": "package io.virtualapp.home.models;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\n\nimport i"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/models/AppData.java",
"chars": 349,
"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": 297,
"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": 1247,
"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/EmptyAppData.java",
"chars": 767,
"preview": "package io.virtualapp.home.models;\n\nimport android.graphics.drawable.Drawable;\n\n/**\n * @author Lody\n */\n\npublic class Em"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/models/LocationData.java",
"chars": 1567,
"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/models/MultiplePackageAppData.java",
"chars": 1543,
"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": 1901,
"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/platform/PlatformInfo.java",
"chars": 444,
"preview": "package io.virtualapp.home.platform;\n\nimport android.content.pm.PackageInfo;\n\nimport java.util.Collections;\nimport java."
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/home/platform/WechatPlatformInfo.java",
"chars": 624,
"preview": "package io.virtualapp.home.platform;\n\nimport android.content.pm.ActivityInfo;\nimport android.content.pm.PackageInfo;\n\n/*"
},
{
"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": 6123,
"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": 1649,
"preview": "package io.virtualapp.home.repo;\n\nimport com.lody.virtual.client.core.VirtualCore;\nimport com.lody.virtual.remote.Instal"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/splash/SplashActivity.java",
"chars": 1598,
"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/vs/VSManagerActivity.java",
"chars": 153,
"preview": "package io.virtualapp.vs;\n\nimport io.virtualapp.abs.ui.VActivity;\n\n/**\n * @author Lody\n *\n *\n *\n */\npublic class VSManag"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/BallGridBeatIndicator.java",
"chars": 2088,
"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/BallPulseIndicator.java",
"chars": 1722,
"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/BaseView.java",
"chars": 3838,
"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/CircularAnim.java",
"chars": 11899,
"preview": "package io.virtualapp.widgets;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimp"
},
{
"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": 3728,
"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/LauncherIconView.java",
"chars": 14139,
"preview": "package io.virtualapp.widgets;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimp"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/LoadingIndicatorView.java",
"chars": 13459,
"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/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/MaterialRippleLayout.java",
"chars": 28325,
"preview": "package io.virtualapp.widgets;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimp"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/RippleButton.java",
"chars": 7848,
"preview": "package io.virtualapp.widgets;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.c"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/ShadowProperty.java",
"chars": 1730,
"preview": "package io.virtualapp.widgets;\n\npublic class ShadowProperty {\n public static final int ALL = 0x1111;\n public stati"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/ShadowViewDrawable.java",
"chars": 3267,
"preview": "package io.virtualapp.widgets;\n\nimport android.graphics.Canvas;\nimport android.graphics.ColorFilter;\nimport android.grap"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/Shimmer.java",
"chars": 4734,
"preview": "package io.virtualapp.widgets;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport andro"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/ShimmerViewBase.java",
"chars": 479,
"preview": "package io.virtualapp.widgets;\n\npublic interface ShimmerViewBase {\n\n float getGradientX();\n\n void setGradientX(flo"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/ShimmerViewHelper.java",
"chars": 4913,
"preview": "package io.virtualapp.widgets;\n\nimport android.content.res.TypedArray;\nimport android.graphics.LinearGradient;\nimport an"
},
{
"path": "VirtualApp/app/src/main/java/io/virtualapp/widgets/TwoGearsView.java",
"chars": 8103,
"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/ViewHelper.java",
"chars": 299,
"preview": "package io.virtualapp.widgets;\n\nimport io.virtualapp.VApp;\n\n/**\n * @author Lody\n */\npublic class ViewHelper {\n\n publi"
},
{
"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/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_home.xml",
"chars": 5244,
"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/activity_install.xml",
"chars": 628,
"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_loading.xml",
"chars": 1492,
"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": 1192,
"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_clone_app.xml",
"chars": 2064,
"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_launcher_app.xml",
"chars": 2291,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView xmlns:android=\"http://schemas.android.com/apk"
},
{
"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_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/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/menu/user_menu.xml",
"chars": 376,
"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": 4175,
"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": 1193,
"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": 1157,
"preview": "<resources>\n <string name=\"app_name\">VirtualApp</string>\n <string name=\"wait\">Please wait…</string>\n <string na"
},
{
"path": "VirtualApp/app/src/main/res/values/styles.xml",
"chars": 1832,
"preview": "<resources>\n\n <!-- Base application theme. -->\n <style name=\"AppTheme\" parent=\"Theme.AppCompat.NoActionBar\">\n "
},
{
"path": "VirtualApp/app/src/main/res/values-zh-rCN/strings.xml",
"chars": 1017,
"preview": "<resources>\n <string name=\"app_name\">VirtualApp</string>\n <string name=\"desktop\">桌面</string>\n <string name=\"add"
},
{
"path": "VirtualApp/app/src/main/res/values-zh-rTW/strings.xml",
"chars": 1016,
"preview": "<resources>\n <string name=\"app_name\">VirtualApp</string>\n <string name=\"desktop\">桌面</string>\n <string name=\"add"
},
{
"path": "VirtualApp/build.gradle",
"chars": 823,
"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": "#Sun Nov 19 13:36:42 CST 2017\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": 812,
"preview": "apply plugin: 'com.android.library'\n\nandroid {\n compileSdkVersion 26\n buildToolsVersion '26.0.2'\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": 71843,
"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/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/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/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": 151,
"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;"
},
{
"path": "VirtualApp/lib/src/main/aidl/com/lody/virtual/server/pm/installer/SessionParams.aidl",
"chars": 94,
"preview": "// SessionParams.aidl\npackage com.lody.virtual.server.pm.installer;\n\nparcelable SessionParams;"
},
{
"path": "VirtualApp/lib/src/main/java/android/content/SyncStatusInfo.java",
"chars": 5912,
"preview": "package android.content;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport android.util.Log;\n\nimport java."
},
{
"path": "VirtualApp/lib/src/main/java/android/content/pm/PackageParser.java",
"chars": 3153,
"preview": "package android.content.pm;\n\nimport android.content.ComponentName;\nimport android.content.IntentFilter;\nimport android.o"
},
{
"path": "VirtualApp/lib/src/main/java/android/location/LocationRequest.java",
"chars": 681,
"preview": "package android.location;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\npublic final class LocationRequest i"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/Build.java",
"chars": 239,
"preview": "package com.lody.virtual;\n\n/**\n *\n * Version info of VirtualApp project.\n *\n * @author Lody\n *\n */\n\npublic class Build {"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/DelegateApplication64Bit.java",
"chars": 8291,
"preview": "package com.lody.virtual;\n\nimport android.annotation.TargetApi;\nimport android.app.Application;\nimport android.content.C"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/GmsSupport.java",
"chars": 2925,
"preview": "package com.lody.virtual;\n\nimport android.content.pm.ApplicationInfo;\nimport android.content.pm.PackageManager;\n\nimport "
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/NativeEngine.java",
"chars": 6748,
"preview": "package com.lody.virtual.client;\n\nimport android.os.Binder;\nimport android.os.Build;\nimport android.os.Process;\n\nimport "
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/VClientImpl.java",
"chars": 28869,
"preview": "package com.lody.virtual.client;\n\nimport android.annotation.SuppressLint;\nimport android.app.Application;\nimport android"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/badger/BadgerManager.java",
"chars": 1158,
"preview": "package com.lody.virtual.client.badger;\n\nimport android.content.Intent;\n\nimport com.lody.virtual.client.ipc.VActivityMan"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/badger/BroadcastBadger1.java",
"chars": 3263,
"preview": "package com.lody.virtual.client.badger;\n\nimport android.content.Intent;\n\nimport com.lody.virtual.remote.BadgerInfo;\n\n/**"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/badger/BroadcastBadger2.java",
"chars": 1363,
"preview": "package com.lody.virtual.client.badger;\n\nimport android.content.ComponentName;\nimport android.content.Intent;\n\nimport co"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/badger/IBadger.java",
"chars": 241,
"preview": "package com.lody.virtual.client.badger;\n\nimport android.content.Intent;\n\nimport com.lody.virtual.remote.BadgerInfo;\n\n/**"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/core/CrashHandler.java",
"chars": 157,
"preview": "package com.lody.virtual.client.core;\n\n/**\n * @author Lody\n */\n\npublic interface CrashHandler {\n\n void handleUncaught"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InstallStrategy.java",
"chars": 320,
"preview": "package com.lody.virtual.client.core;\n\n/**\n * @author Lody\n *\n *\n */\npublic interface InstallStrategy {\n\tint TERMINATE_I"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java",
"chars": 8466,
"preview": "package com.lody.virtual.client.core;\n\nimport android.os.Build;\n\nimport com.lody.virtual.client.hook.base.MethodInvocati"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java",
"chars": 26023,
"preview": "package com.lody.virtual.client.core;\n\nimport android.annotation.SuppressLint;\nimport android.app.ActivityManager;\nimpor"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/env/Constants.java",
"chars": 1717,
"preview": "package com.lody.virtual.client.env;\n\nimport android.app.PendingIntent;\nimport android.content.Intent;\n\nimport com.lody."
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/env/DeadServerException.java",
"chars": 628,
"preview": "package com.lody.virtual.client.env;\n\n/**\n * @author Lody\n */\n\npublic class DeadServerException extends RuntimeException"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/env/GPSStateline.java",
"chars": 1753,
"preview": "package com.lody.virtual.client.env;\n\n\nclass GPSStateline {\n private double mAzimuth;\n private double mElevation;\n"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/env/SpecialComponentList.java",
"chars": 7330,
"preview": "package com.lody.virtual.client.env;\n\nimport android.Manifest;\nimport android.app.DownloadManager;\nimport android.conten"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/env/VirtualGPSSatalines.java",
"chars": 5319,
"preview": "package com.lody.virtual.client.env;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class VirtualGPSSatalin"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/env/VirtualRuntime.java",
"chars": 1896,
"preview": "package com.lody.virtual.client.env;\n\nimport android.content.pm.ApplicationInfo;\nimport android.os.Build;\nimport android"
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ActivityFixer.java",
"chars": 1876,
"preview": "package com.lody.virtual.client.fixer;\n\nimport android.app.Activity;\nimport android.app.ActivityManager;\nimport android."
},
{
"path": "VirtualApp/lib/src/main/java/com/lody/virtual/client/fixer/ComponentFixer.java",
"chars": 978,
"preview": "package com.lody.virtual.client.fixer;\n\nimport android.content.pm.ComponentInfo;\nimport android.text.TextUtils;\n\nimport "
}
]
// ... and 700 more files (download for full content)
About this extraction
This page contains the full source code of the asLody/VirtualApp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 900 files (2.9 MB), approximately 832.0k tokens, and a symbol index with 6230 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.