Full Code of ganyao114/VA_Doc for AI

master 3b8284e005a4 cached
627 files
2.0 MB
550.8k tokens
4697 symbols
1 requests
Download .txt
Showing preview only (2,217K chars total). Download the full file or copy to clipboard to get everything.
Repository: ganyao114/VA_Doc
Branch: master
Commit: 3b8284e005a4
Files: 627
Total size: 2.0 MB

Directory structure:
gitextract_o4ouir9u/

├── .gitignore
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── 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/
│           │           │       ├── 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/
│           │           │   │   ├── AppPagerAdapter.java
│           │           │   │   ├── CloneAppListAdapter.java
│           │           │   │   ├── LaunchpadAdapter.java
│           │           │   │   └── decorations/
│           │           │   │       └── ItemOffsetDecoration.java
│           │           │   ├── ads/
│           │           │   │   └── AdScheduler.java
│           │           │   ├── models/
│           │           │   │   ├── AddAppButton.java
│           │           │   │   ├── AppData.java
│           │           │   │   ├── AppInfo.java
│           │           │   │   ├── AppInfoLite.java
│           │           │   │   ├── EmptyAppData.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
│           └── 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_splash.xml
│               │   ├── activity_users.xml
│               │   ├── fragment_list_app.xml
│               │   ├── item_app.xml
│               │   ├── item_clone_app.xml
│               │   ├── item_launcher_app.xml
│               │   └── item_user.xml
│               ├── menu/
│               │   └── user_menu.xml
│               ├── values/
│               │   ├── attrs.xml
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── ids.xml
│               │   ├── integers.xml
│               │   ├── strings.xml
│               │   └── styles.xml
│               └── values-zh-rCN/
│                   └── 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
│           │   │   └── net/
│           │   │       ├── IConnectivityManager.aidl
│           │   │       └── wifi/
│           │   │           └── IWifiScanner.aidl
│           │   └── com/
│           │       └── lody/
│           │           └── virtual/
│           │               ├── client/
│           │               │   └── IVClient.aidl
│           │               ├── os/
│           │               │   └── VUserInfo.aidl
│           │               ├── remote/
│           │               │   ├── AppTaskInfo.aidl
│           │               │   ├── InstallResult.aidl
│           │               │   ├── InstalledAppInfo.aidl
│           │               │   ├── PendingIntentData.aidl
│           │               │   ├── PendingResultData.aidl
│           │               │   ├── Problem.aidl
│           │               │   ├── ReceiverInfo.aidl
│           │               │   ├── VDeviceInfo.aidl
│           │               │   └── VParceledListSlice.aidl
│           │               └── server/
│           │                   ├── IAccountManager.aidl
│           │                   ├── IActivityManager.aidl
│           │                   ├── IAppManager.aidl
│           │                   ├── IBinderDelegateService.aidl
│           │                   ├── IDeviceInfoManager.aidl
│           │                   ├── IJobScheduler.aidl
│           │                   ├── INotificationManager.aidl
│           │                   ├── IPackageInstaller.aidl
│           │                   ├── IPackageInstallerSession.aidl
│           │                   ├── IPackageManager.aidl
│           │                   ├── IUserManager.aidl
│           │                   ├── IVirtualStorageService.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
│           │   ├── com/
│           │   │   └── lody/
│           │   │       └── virtual/
│           │   │           ├── Build.java
│           │   │           ├── GmsSupport.java
│           │   │           ├── client/
│           │   │           │   ├── NativeEngine.java
│           │   │           │   ├── VClientImpl.java
│           │   │           │   ├── core/
│           │   │           │   │   ├── CrashHandler.java
│           │   │           │   │   ├── InstallStrategy.java
│           │   │           │   │   ├── InvocationStubManager.java
│           │   │           │   │   └── VirtualCore.java
│           │   │           │   ├── env/
│           │   │           │   │   ├── Constants.java
│           │   │           │   │   ├── DeadServerException.java
│           │   │           │   │   ├── SpecialComponentList.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
│           │   │           │   │   │   ├── display/
│           │   │           │   │   │   │   └── DisplayStub.java
│           │   │           │   │   │   ├── dropbox/
│           │   │           │   │   │   │   └── DropBoxManagerStub.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/
│           │   │           │   │   │   │   └── LocationManagerStub.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
│           │   │           │   │   │   ├── user/
│           │   │           │   │   │   │   └── UserManagerStub.java
│           │   │           │   │   │   ├── vibrator/
│           │   │           │   │   │   │   └── VibratorStub.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
│           │   │           │   │   └── 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/
│           │   │           │   ├── ParcelHelper.java
│           │   │           │   ├── PersistenceLayer.java
│           │   │           │   ├── collection/
│           │   │           │   │   ├── ArrayMap.java
│           │   │           │   │   ├── ArraySet.java
│           │   │           │   │   ├── ContainerHelpers.java
│           │   │           │   │   ├── IntArray.java
│           │   │           │   │   ├── MapCollections.java
│           │   │           │   │   ├── SimpleArrayMap.java
│           │   │           │   │   └── SparseArray.java
│           │   │           │   ├── compat/
│           │   │           │   │   ├── AccountManagerCompat.java
│           │   │           │   │   ├── ActivityManagerCompat.java
│           │   │           │   │   ├── ApplicationThreadCompat.java
│           │   │           │   │   ├── BuildCompat.java
│           │   │           │   │   ├── BundleCompat.java
│           │   │           │   │   ├── ContentProviderCompat.java
│           │   │           │   │   ├── ContentResolverCompat.java
│           │   │           │   │   ├── IApplicationThreadCompat.java
│           │   │           │   │   ├── NativeLibraryHelperCompat.java
│           │   │           │   │   ├── ObjectsCompat.java
│           │   │           │   │   ├── PackageParserCompat.java
│           │   │           │   │   ├── ParceledListSliceCompat.java
│           │   │           │   │   ├── StorageManagerCompat.java
│           │   │           │   │   └── SystemPropertiesCompat.java
│           │   │           │   └── utils/
│           │   │           │       ├── ArrayUtils.java
│           │   │           │       ├── AtomicFile.java
│           │   │           │       ├── BitmapUtils.java
│           │   │           │       ├── ClassUtils.java
│           │   │           │       ├── ComponentUtils.java
│           │   │           │       ├── DrawableUtils.java
│           │   │           │       ├── FastXmlSerializer.java
│           │   │           │       ├── FileUtils.java
│           │   │           │       ├── MD5Utils.java
│           │   │           │       ├── Mark.java
│           │   │           │       ├── OSUtils.java
│           │   │           │       ├── Reflect.java
│           │   │           │       ├── ReflectException.java
│           │   │           │       ├── Singleton.java
│           │   │           │       ├── VLog.java
│           │   │           │       └── XmlSerializerAndParser.java
│           │   │           ├── os/
│           │   │           │   ├── VBinder.java
│           │   │           │   ├── VEnvironment.java
│           │   │           │   ├── VUserHandle.java
│           │   │           │   ├── VUserInfo.java
│           │   │           │   └── VUserManager.java
│           │   │           ├── remote/
│           │   │           │   ├── AppTaskInfo.java
│           │   │           │   ├── InstallResult.java
│           │   │           │   ├── InstalledAppInfo.java
│           │   │           │   ├── PendingIntentData.java
│           │   │           │   ├── PendingResultData.java
│           │   │           │   ├── Problem.java
│           │   │           │   ├── ReceiverInfo.java
│           │   │           │   ├── StubActivityRecord.java
│           │   │           │   ├── SyncInfo.java
│           │   │           │   ├── VDeviceInfo.java
│           │   │           │   └── VParceledListSlice.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
│           │   │               ├── job/
│           │   │               │   └── VJobSchedulerService.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
│           │       │   │   ├── LoadedApk.java
│           │       │   │   ├── LoadedApkHuaWei.java
│           │       │   │   ├── Notification.java
│           │       │   │   ├── NotificationL.java
│           │       │   │   ├── NotificationM.java
│           │       │   │   ├── NotificationManager.java
│           │       │   │   ├── PendingIntentJBMR2.java
│           │       │   │   ├── backup/
│           │       │   │   │   └── IBackupManager.java
│           │       │   │   └── job/
│           │       │   │       ├── IJobScheduler.java
│           │       │   │       ├── JobInfo.java
│           │       │   │       └── JobParameters.java
│           │       │   ├── bluetooth/
│           │       │   │   └── IBluetooth.java
│           │       │   ├── content/
│           │       │   │   ├── BroadcastReceiver.java
│           │       │   │   ├── ClipboardManager.java
│           │       │   │   ├── ClipboardManagerOreo.java
│           │       │   │   ├── ContentProviderClient.java
│           │       │   │   ├── ContentProviderHolderOreo.java
│           │       │   │   ├── ContentProviderNative.java
│           │       │   │   ├── ContentResolver.java
│           │       │   │   ├── ContentResolverJBMR2.java
│           │       │   │   ├── IClipboard.java
│           │       │   │   ├── IContentProvider.java
│           │       │   │   ├── IContentService.java
│           │       │   │   ├── IIntentReceiver.java
│           │       │   │   ├── IIntentReceiverJB.java
│           │       │   │   ├── IRestrictionsManager.java
│           │       │   │   ├── IntentFilter.java
│           │       │   │   ├── SyncAdapterType.java
│           │       │   │   ├── SyncAdapterTypeN.java
│           │       │   │   ├── SyncInfo.java
│           │       │   │   ├── SyncRequest.java
│           │       │   │   ├── pm/
│           │       │   │   │   ├── ApplicationInfoL.java
│           │       │   │   │   ├── ApplicationInfoN.java
│           │       │   │   │   ├── ILauncherApps.java
│           │       │   │   │   ├── IShortcutService.java
│           │       │   │   │   ├── LauncherApps.java
│           │       │   │   │   ├── PackageInstaller.java
│           │       │   │   │   ├── PackageParser.java
│           │       │   │   │   ├── PackageParserJellyBean.java
│           │       │   │   │   ├── PackageParserJellyBean17.java
│           │       │   │   │   ├── PackageParserLollipop.java
│           │       │   │   │   ├── PackageParserLollipop22.java
│           │       │   │   │   ├── PackageParserMarshmallow.java
│           │       │   │   │   ├── PackageParserNougat.java
│           │       │   │   │   ├── 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
│           │       │   │   └── location/
│           │       │   │       └── IContextHubService.java
│           │       │   ├── location/
│           │       │   │   ├── ILocationListener.java
│           │       │   │   ├── ILocationManager.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/
│           │       │   │   ├── Build.java
│           │       │   │   ├── Bundle.java
│           │       │   │   ├── Handler.java
│           │       │   │   ├── INetworkManagementService.java
│           │       │   │   ├── IPowerManager.java
│           │       │   │   ├── IUserManager.java
│           │       │   │   ├── Message.java
│           │       │   │   ├── Process.java
│           │       │   │   ├── ServiceManager.java
│           │       │   │   ├── StrictMode.java
│           │       │   │   └── mount/
│           │       │   │       └── IMountService.java
│           │       │   ├── providers/
│           │       │   │   └── Settings.java
│           │       │   ├── renderscript/
│           │       │   │   └── RenderScriptCacheDir.java
│           │       │   ├── rms/
│           │       │   │   └── resource/
│           │       │   │       ├── ReceiverResourceLP.java
│           │       │   │       ├── ReceiverResourceM.java
│           │       │   │       └── ReceiverResourceN.java
│           │       │   ├── service/
│           │       │   │   └── persistentdata/
│           │       │   │       └── IPersistentDataBlockService.java
│           │       │   ├── util/
│           │       │   │   └── Singleton.java
│           │       │   ├── view/
│           │       │   │   ├── Display.java
│           │       │   │   ├── HardwareRenderer.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
│           │   ├── Core.cpp
│           │   ├── Core.h
│           │   ├── Foundation/
│           │   │   ├── IOUniformer.cpp
│           │   │   ├── IOUniformer.h
│           │   │   ├── VMPatch.cpp
│           │   │   └── VMPatch.h
│           │   ├── GodinHook/
│           │   │   ├── godin_type.h
│           │   │   ├── hookinfo.h
│           │   │   ├── instruction/
│           │   │   │   ├── arm_instruction.cpp
│           │   │   │   ├── arm_instruction.h
│           │   │   │   ├── instruction_helper.cpp
│           │   │   │   ├── instruction_helper.h
│           │   │   │   ├── thumb_instruction.cpp
│           │   │   │   └── thumb_instruction.h
│           │   │   ├── mem_helper.cpp
│           │   │   ├── mem_helper.h
│           │   │   ├── native_hook.cpp
│           │   │   ├── native_hook.h
│           │   │   ├── thread_helper.cpp
│           │   │   └── thread_helper.h
│           │   ├── Helper.h
│           │   └── MSHook/
│           │       ├── ARM.cpp
│           │       ├── ARM.h
│           │       ├── CydiaSubstrate.h
│           │       ├── Debug.cpp
│           │       ├── Debug.h
│           │       ├── Hooker.cpp
│           │       ├── Hooker.h
│           │       ├── Log.h
│           │       ├── MSHook.cpp
│           │       ├── MSHook.h
│           │       ├── PosixMemory.cpp
│           │       ├── PosixMemory.h
│           │       ├── SubstrateStruct.h
│           │       ├── Thumb.cpp
│           │       ├── Thumb.h
│           │       ├── hde64.h
│           │       ├── util.cpp
│           │       ├── util.h
│           │       ├── x86.cpp
│           │       ├── x86.h
│           │       ├── x86_64.cpp
│           │       └── x86_64.h
│           ├── libs/
│           │   ├── android-art-interpret-3.0.0.jar
│           │   └── dalvik_hack-3.0.0.5.jar
│           └── 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

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

================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.idea
.DS_Store
/build
/captures


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


================================================
FILE: app/build.gradle
================================================
import java.security.acl.Group

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'


android {
    compileSdkVersion 25
    buildToolsVersion "25.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"
                }
            }
        }
    }
    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.1'
    compile 'com.android.support:appcompat-v7:25.0.1'
    compile 'com.melnykov:floatingactionbutton:1.3.0'
    compile 'com.android.support:recyclerview-v7:25.0.1'
    compile 'com.android.support:percent:25.0.1'
    compile 'com.android.support:design:25.0.1'
    compile 'com.android.support:cardview-v7:25.0.1'
    //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'
    compile ('com.google.android.gms:play-services-ads:11.0.0'){
        exclude group:'com.android.support'
    }

}


================================================
FILE: 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 *;
#}


================================================
FILE: 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">

        <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" />

    </application>


</manifest>


================================================
FILE: app/src/main/java/io/virtualapp/VApp.java
================================================
package io.virtualapp;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.support.multidex.MultiDexApplication;
import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;

import com.flurry.android.FlurryAgent;
import com.google.android.gms.ads.MobileAds;
import com.lody.virtual.client.core.VirtualCore;
import com.lody.virtual.client.stub.VASettings;
import com.lody.virtual.helper.utils.Reflect;

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
 */
// 这里的函数会被多次调用,特性来自于 process:
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);
                MobileAds.initialize(VApp.this, "ca-app-pub-1609791120068944~5426483711");
                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: 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: app/src/main/java/io/virtualapp/abs/BasePresenter.java
================================================
package io.virtualapp.abs;

/**
 * @author Lody
 */
public interface BasePresenter {
	void start();
}


================================================
FILE: 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: app/src/main/java/io/virtualapp/abs/Callback.java
================================================
package io.virtualapp.abs;

/**
 * @author Lody
 */

public interface Callback<T> {
    void callback(T result);
}


================================================
FILE: app/src/main/java/io/virtualapp/abs/Value.java
================================================
package io.virtualapp.abs;

/**
 * @author Lody
 */

public class Value<T> {
    public T val;
}


================================================
FILE: 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: 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: 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: 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: 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: 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: 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: 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: app/src/main/java/io/virtualapp/delegate/MyComponentDelegate.java
================================================
package io.virtualapp.delegate;

import android.app.Activity;
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 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: 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: app/src/main/java/io/virtualapp/delegate/MyTaskDescriptionDelegate.java
================================================
package io.virtualapp.delegate;

import android.annotation.TargetApi;
import android.app.ActivityManager;
import android.app.Application;
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) {

        String labelPrefix = "[" + VUserManager.get().getUserName() + "] ";

        if (!oldTaskDescription.getLabel().startsWith(labelPrefix)) {
            // Is it really necessary?
            return new ActivityManager.TaskDescription(labelPrefix + oldTaskDescription.getLabel(), oldTaskDescription.getIcon(), oldTaskDescription.getPrimaryColor());
        } else {
            return oldTaskDescription;
        }
    }
}


================================================
FILE: 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: 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: 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: 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.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.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("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) {
            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: 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: app/src/main/java/io/virtualapp/home/HomePresenterImpl.java
================================================
package io.virtualapp.home;

import android.app.Activity;
import android.graphics.Bitmap;

import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;
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.ads.AdScheduler;
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 InterstitialAd mInterstitialAd;
    private AdScheduler mScheduler = new AdScheduler(10000L);

    private AppData mTempAppData;


    HomePresenterImpl(HomeContract.HomeView view) {
        mView = view;
        mActivity = view.getActivity();
        mRepo = new AppRepository(mActivity);
        mView.setPresenter(this);
        mInterstitialAd = new InterstitialAd(mActivity);
        mInterstitialAd.setAdUnitId("ca-app-pub-1609791120068944/6903216910");
        mInterstitialAd.loadAd(new AdRequest.Builder().build());
        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdClosed() {
                if (mTempAppData != null) {
                    launchApp(mTempAppData);
                    mTempAppData = null;
                }
                mInterstitialAd.loadAd(new AdRequest.Builder().build());
            }
        });
    }

    @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) {
        if (mInterstitialAd.isLoaded() && mScheduler.shouldShowAd()) {
            mTempAppData = data;
            mInterstitialAd.show();
            mScheduler.adShowed();
        } else {
            launchAppNoAd(data);
        }
    }

    public void launchAppNoAd(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: 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: 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: 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(true, 0);
        mAdapter.setSelected(0, false);
        mProgressBar.setVisibility(View.GONE);
        mRecyclerView.setVisibility(View.VISIBLE);
    }

    @Override
    public void setPresenter(ListAppContract.ListAppPresenter presenter) {
        this.mPresenter = presenter;
    }

}


================================================
FILE: 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: 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(() -> {
            long startTime = System.currentTimeMillis();
            if (!appModel.fastOpen) {
                try {
                    VirtualCore.get().preOpt(appModel.packageName);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            long spend = System.currentTimeMillis() - startTime;
            if (spend < 500) {
                try {
                    Thread.sleep(500 - spend);
                } catch (InterruptedException 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: 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: 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: 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: 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: app/src/main/java/io/virtualapp/home/ads/AdScheduler.java
================================================
package io.virtualapp.home.ads;

/**
 * @author Lody
 */

public class AdScheduler {

    private long adDeltaTime;
    private long lastShowAdTime;

    public AdScheduler(long adDeltaTime) {
        this.adDeltaTime = adDeltaTime;
    }

    public void adShowed() {
        lastShowAdTime = System.currentTimeMillis();
    }

    public boolean shouldShowAd() {
        return System.currentTimeMillis() - lastShowAdTime >= adDeltaTime;
    }
}


================================================
FILE: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: app/src/main/java/io/virtualapp/splash/SplashActivity.java
================================================
package io.virtualapp.splash;

import android.os.Bundle;
import android.view.WindowManager;

import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
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 {

    private AdView mAdView;

    @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);
        showBanner();
        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 showBanner() {
        mAdView = (AdView) findViewById(R.id.splash_banner);
        AdRequest adRequest = new AdRequest.Builder().build();
        mAdView.loadAd(adRequest);
    }

    private void doActionInThread() {
        if (!VirtualCore.get().isEngineLaunched()) {
            VirtualCore.get().waitForEngine();
        }
    }
}


================================================
FILE: 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: 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: 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 static final float SCALE = 1.0f;

    //scale x ,y
    private float[] scaleFloats = new float[]{SCALE,
            SCALE,
            SCALE};


    @Override
    public void draw(Canvas canvas, Paint paint) {
        float circleSpacing = 4;
        float radius = (Math.min(getWidth(), getHeight()) - circleSpacing * 2) / 6;
        float x = getWidth() / 2 - (radius * 2 + circleSpacing);
        float y = getHeight() / 2;
        for (int i = 0; i < 3; i++) {
            canvas.save();
            float translateX = x + (radius * 2) * i + circleSpacing * i;
            canvas.translate(translateX, y);
            canvas.scale(scaleFloats[i], scaleFloats[i]);
            canvas.drawCircle(0, 0, radius, paint);
            canvas.restore();
        }
    }

    @Override
    public ArrayList<ValueAnimator> onCreateAnimators() {
        ArrayList<ValueAnimator> animators = new ArrayList<>();
        int[] delays = new int[]{120, 240, 360};
        for (int i = 0; i < 3; i++) {
            final int index = i;

            ValueAnimator scaleAnim = ValueAnimator.ofFloat(1, 0.3f, 1);

            scaleAnim.setDuration(750);
            scaleAnim.setRepeatCount(-1);
            scaleAnim.setStartDelay(delays[i]);

            addUpdateListener(scaleAnim, animation -> {
                scaleFloats[index] = (float) animation.getAnimatedValue();
                postInvalidate();
            });
            animators.add(scaleAnim);
        }
        return animators;
    }


}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/BaseView.java
================================================
package io.virtualapp.widgets;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;

public abstract class BaseView extends View {


    public ValueAnimator valueAnimator;

    public BaseView(Context context) {
        this(context, null);
    }

    public BaseView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public BaseView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        InitPaint();
    }

    public void startAnim() {
        stopAnim();
        startViewAnim(0f, 1f, 500);
    }

    public void startAnim(int time) {
        stopAnim();
        startViewAnim(0f, 1f, time);
    }

    public void stopAnim() {
        if (valueAnimator != null) {
            clearAnimation();

            valueAnimator.setRepeatCount(0);
            valueAnimator.cancel();
            valueAnimator.end();
            if (OnStopAnim() == 0) {
                valueAnimator.setRepeatCount(0);
                valueAnimator.cancel();
                valueAnimator.end();
            }

        }
    }

    private ValueAnimator startViewAnim(float startF, final float endF, long time) {
        valueAnimator = ValueAnimator.ofFloat(startF, endF);
        valueAnimator.setDuration(time);
        valueAnimator.setInterpolator(new LinearInterpolator());


        valueAnimator.setRepeatCount(SetAnimRepeatCount());


        if (ValueAnimator.RESTART == SetAnimRepeatMode()) {
            valueAnimator.setRepeatMode(ValueAnimator.RESTART);

        } else if (ValueAnimator.REVERSE == SetAnimRepeatMode()) {
            valueAnimator.setRepeatMode(ValueAnimator.REVERSE);

        }

        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                OnAnimationUpdate(valueAnimator);

            }
        });
        valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);

            }

            @Override
            public void onAnimationStart(Animator animation) {

                super.onAnimationStart(animation);
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                super.onAnimationRepeat(animation);
                OnAnimationRepeat(animation);
            }
        });
        if (!valueAnimator.isRunning()) {
            AnimIsRunning();
            valueAnimator.start();

        }

        return valueAnimator;
    }


    protected abstract void InitPaint();

    protected abstract void OnAnimationUpdate(ValueAnimator valueAnimator);

    protected abstract void OnAnimationRepeat(Animator animation);

    protected abstract int OnStopAnim();

    protected abstract int SetAnimRepeatMode();

    protected abstract int SetAnimRepeatCount();

    protected abstract void AnimIsRunning();


    public float getFontlength(Paint paint, String str) {
        Rect rect = new Rect();
        paint.getTextBounds(str, 0, str.length(), rect);
        return rect.width();
    }

    public float getFontHeight(Paint paint, String str) {
        Rect rect = new Rect();
        paint.getTextBounds(str, 0, str.length(), rect);
        return rect.height();

    }

    public float getFontHeight(Paint paint) {
        Paint.FontMetrics fm = paint.getFontMetrics();
        return fm.descent - fm.ascent;
    }
}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/CardStackAdapter.java
================================================
package io.virtualapp.widgets;

import java.util.ArrayList;
import java.util.List;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;

import io.virtualapp.R;

/**
 * This class acts as an adapter for the {@link CardStackLayout} view. This
 * adapter is intentionally made an abstract class with following abstract
 * methods -
 * <p>
 * <p>
 * {@link #getCount()} - Decides the number of views present in the view
 * <p>
 * {@link #createView(int, ViewGroup)} - Creates the view for all positions in
 * range [0, {@link #getCount()})
 * <p>
 * Contains the logic for touch events in {@link #onTouch(View, MotionEvent)}
 */
public abstract class CardStackAdapter implements View.OnTouchListener, View.OnClickListener {

	public static final int ANIM_DURATION = 600;
	public static final int DECELERATION_FACTOR = 2;

	public static final int INVALID_CARD_POSITION = -1;
	private final int mScreenHeight;
	private final int dp30;
	// Settings for the adapter from layout
	private float mCardGapBottom;
	private float mCardGap;
	private int mParallaxScale;
	private boolean mParallaxEnabled;
	private boolean mShowInitAnimation;
	private int fullCardHeight;
	private View[] mCardViews;
	private float dp8;
	private CardStackLayout mParent;

	private boolean mScreenTouchable = false;
	private float mTouchFirstY = -1;
	private float mTouchPrevY = -1;
	private float mTouchDistance = 0;
	private int mSelectedCardPosition = INVALID_CARD_POSITION;
	private float scaleFactorForElasticEffect;
	private int mParentPaddingTop = 0;
	private int mCardPaddingInternal = 0;

	public CardStackAdapter(Context context) {
		Resources resources = context.getResources();

		DisplayMetrics dm = Resources.getSystem().getDisplayMetrics();
		mScreenHeight = dm.heightPixels;
		dp30 = (int) resources.getDimension(R.dimen.dp30);
		scaleFactorForElasticEffect = (int) resources.getDimension(R.dimen.dp8);
		dp8 = (int) resources.getDimension(R.dimen.dp8);
	}

	protected float getCardGapBottom() {
		return mCardGapBottom;
	}

	/**
	 * Defines and initializes the view to be shown in the
	 * {@link CardStackLayout} Provides two parameters to the sub-class namely -
	 *
	 * @param position
	 * @param container
	 * @return View corresponding to the position and parent container
	 */
	public abstract View createView(int position, ViewGroup container);

	/**
	 * Defines the number of cards that are present in the
	 * {@link CardStackLayout}
	 *
	 * @return cardCount - Number of views in the related
	 *         {@link CardStackLayout}
	 */
	public abstract int getCount();

	/**
	 * Returns true if no animation is in progress currently. Can be used to
	 * disable any events if they are not allowed during an animation. Returns
	 * false if an animation is in progress.
	 *
	 * @return - true if animation in progress, false otherwise
	 */
	public boolean isScreenTouchable() {
		return mScreenTouchable;
	}

	private void setScreenTouchable(boolean screenTouchable) {
		this.mScreenTouchable = screenTouchable;
	}

	void addView(final int position) {
		View root = createView(position, mParent);
		root.setOnTouchListener(this);
		root.setTag(R.id.cardstack_internal_position_tag, position);
		root.setLayerType(View.LAYER_TYPE_HARDWARE, null);

		mCardPaddingInternal = root.getPaddingTop();

		FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, fullCardHeight);
		root.setLayoutParams(lp);
		if (mShowInitAnimation) {
			root.setY(getCardFinalY(position));
			setScreenTouchable(false);
		} else {
			root.setY(getCardOriginalY(position) - mParentPaddingTop);
			setScreenTouchable(true);
		}

		mCardViews[position] = root;

		mParent.addView(root);
	}

	protected float getCardFinalY(int position) {
		return mScreenHeight - dp30 - ((getCount() - position) * mCardGapBottom) - mCardPaddingInternal;
	}

	protected float getCardOriginalY(int position) {
		return mParentPaddingTop + mCardGap * position;
	}

	/**
	 * Resets all cards in {@link CardStackLayout} to their initial positions
	 *
	 * @param r
	 *            Execute r.run() once the reset animation is done
	 */
	public void resetCards(Runnable r) {
		List<Animator> animations = new ArrayList<>(getCount());
		for (int i = 0; i < getCount(); i++) {
			final View child = mCardViews[i];
			animations.add(ObjectAnimator.ofFloat(child, View.Y, (int) child.getY(), getCardOriginalY(i)));
		}
		startAnimations(animations, r, true);
	}

	/**
	 * Plays together all animations passed in as parameter. Once animation is
	 * completed, r.run() is executed. If parameter isReset is set to true,
	 * {@link #mSelectedCardPosition} is set to {@link #INVALID_CARD_POSITION}
	 *
	 * @param animations
	 * @param r
	 * @param isReset
	 */
	private void startAnimations(List<Animator> animations, final Runnable r, final boolean isReset) {
		AnimatorSet animatorSet = new AnimatorSet();
		animatorSet.playTogether(animations);
		animatorSet.setDuration(ANIM_DURATION);
		animatorSet.setInterpolator(new DecelerateInterpolator(DECELERATION_FACTOR));
		animatorSet.addListener(new AnimatorListenerAdapter() {
			@Override
			public void onAnimationEnd(Animator animation) {
				if (r != null)
					r.run();
				setScreenTouchable(true);
				if (isReset)
					mSelectedCardPosition = INVALID_CARD_POSITION;
			}
		});
		animatorSet.start();
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		if (!isScreenTouchable()) {
			return false;
		}

		float y = event.getRawY();
		int positionOfCardToMove = (int) v.getTag(R.id.cardstack_internal_position_tag);

		switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN :
				if (mTouchFirstY != -1) {
					return false;
				}
				mTouchPrevY = mTouchFirstY = y;
				mTouchDistance = 0;
				break;
			case MotionEvent.ACTION_MOVE :
				if (mSelectedCardPosition == INVALID_CARD_POSITION)
					moveCards(positionOfCardToMove, y - mTouchFirstY);
				mTouchDistance += Math.abs(y - mTouchPrevY);
				break;
			case MotionEvent.ACTION_CANCEL :
			case MotionEvent.ACTION_UP :
				if (mTouchDistance < dp8 && Math.abs(y - mTouchFirstY) < dp8
						&& mSelectedCardPosition == INVALID_CARD_POSITION) {
					onClick(v);
				} else {
					resetCards();
				}
				mTouchPrevY = mTouchFirstY = -1;
				mTouchDistance = 0;
				return false;
		}
		return true;
	}

	@Override
	public void onClick(final View v) {

		if (!isScreenTouchable()) {
			return;
		}
		setScreenTouchable(false);
		if (mSelectedCardPosition == INVALID_CARD_POSITION) {
			mSelectedCardPosition = (int) v.getTag(R.id.cardstack_internal_position_tag);

			List<Animator> animations = new ArrayList<>(getCount());
			for (int i = 0; i < getCount(); i++) {
				View child = mCardViews[i];
				animations.add(getAnimatorForView(child, i, mSelectedCardPosition));
			}
			startAnimations(animations, () -> {
				setScreenTouchable(true);
				if (mParent.getOnCardSelectedListener() != null) {
					mParent.getOnCardSelectedListener().onCardSelected(v, mSelectedCardPosition);
				}
			}, false);

		}
	}

	/**
	 * This method can be overridden to have different animations for each card
	 * when a click event happens on any card view. This method will be called
	 * for every
	 *
	 * @param view
	 *            The view for which this method needs to return an animator
	 * @param selectedCardPosition
	 *            Position of the card that was clicked
	 * @param currentCardPosition
	 *            Position of the current card
	 * @return animator which has to be applied on the current card
	 */
	protected Animator getAnimatorForView(View view, int currentCardPosition, int selectedCardPosition) {
		if (currentCardPosition != selectedCardPosition) {
			return ObjectAnimator.ofFloat(view, View.Y, (int) view.getY(), getCardFinalY(currentCardPosition));
		} else {
			return ObjectAnimator.ofFloat(view, View.Y, (int) view.getY(),
					getCardOriginalY(0) + (currentCardPosition * mCardGapBottom));
		}
	}

	private void moveCards(int positionOfCardToMove, float diff) {
		if (diff < 0 || positionOfCardToMove < 0 || positionOfCardToMove >= getCount())
			return;
		for (int i = positionOfCardToMove; i < getCount(); i++) {
			final View child = mCardViews[i];
			float diffCard = diff / scaleFactorForElasticEffect;
			if (mParallaxEnabled) {
				if (mParallaxScale > 0) {
					diffCard = diffCard * (mParallaxScale / 3) * (getCount() + 1 - i);
				} else {
					int scale = mParallaxScale * -1;
					diffCard = diffCard * (i * (scale / 3) + 1);
				}
			} else
				diffCard = diffCard * (getCount() * 2 + 1);
			child.setY(getCardOriginalY(i) + diffCard);
		}
	}

	/**
	 * Provides an API to {@link CardStackLayout} to set the parameters provided
	 * to it in its XML
	 *
	 * @param cardStackLayout
	 *            Parent of all cards
	 */
	void setAdapterParams(CardStackLayout cardStackLayout) {
		mParent = cardStackLayout;
		mCardViews = new View[getCount()];
		mCardGapBottom = cardStackLayout.getCardGapBottom();
		mCardGap = cardStackLayout.getCardGap();
		mParallaxScale = cardStackLayout.getParallaxScale();
		mParallaxEnabled = cardStackLayout.isParallaxEnabled();
		if (mParallaxEnabled && mParallaxScale == 0)
			mParallaxEnabled = false;
		mShowInitAnimation = cardStackLayout.isShowInitAnimation();
		mParentPaddingTop = cardStackLayout.getPaddingTop();
		fullCardHeight = (int) (mScreenHeight - dp30 - dp8 - getCount() * mCardGapBottom);
	}

	/**
	 * Resets all cards in {@link CardStackLayout} to their initial positions
	 */
	public void resetCards() {
		resetCards(null);
	}

	/**
	 * Returns false if all the cards are in their initial position i.e. no card
	 * is selected
	 * <p>
	 * Returns true if the {@link CardStackLayout} has a card selected and all
	 * other cards are at the bottom of the screen.
	 *
	 * @return true if any card is selected, false otherwise
	 */
	public boolean isCardSelected() {
		return mSelectedCardPosition != INVALID_CARD_POSITION;
	}

	/**
	 * Returns the position of selected card. If no card is selected, returns
	 * {@link #INVALID_CARD_POSITION}
	 */
	public int getSelectedCardPosition() {
		return mSelectedCardPosition;
	}

	/**
	 * Since there is no view recycling in {@link CardStackLayout}, we maintain
	 * an instance of every view that is set for every position. This method
	 * returns a view at the requested position.
	 *
	 * @param position
	 *            Position of card in {@link CardStackLayout}
	 * @return View at requested position
	 */
	public View getCardView(int position) {
		if (mCardViews == null)
			return null;

		return mCardViews[position];
	}
}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/CardStackLayout.java
================================================
package io.virtualapp.widgets;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;

import io.virtualapp.R;

/**
 * Displays a list of cards as a stack on the screen.
 * <p>
 * <b>XML attributes</b>
 * <p>
 * See {@link R.styleable#CardStackLayout CardStackLayout Attributes}
 * <p>
 * {@link R.styleable#CardStackLayout_showInitAnimation}
 * {@link R.styleable#CardStackLayout_card_gap}
 * {@link R.styleable#CardStackLayout_card_gap_bottom}
 * {@link R.styleable#CardStackLayout_parallax_enabled}
 * {@link R.styleable#CardStackLayout_parallax_scale}
 */
public class CardStackLayout extends FrameLayout {
	public static final boolean PARALLAX_ENABLED_DEFAULT = false;
	public static final boolean SHOW_INIT_ANIMATION_DEFAULT = true;

	private float mCardGapBottom;
	private float mCardGap;
	private boolean mShowInitAnimation;
	private boolean mParallaxEnabled;
	private int mParallaxScale;
	private OnCardSelected mOnCardSelectedListener = null;

	private CardStackAdapter mAdapter = null;

	public CardStackLayout(Context context) {
		super(context);
		resetDefaults();
	}

	public CardStackLayout(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public CardStackLayout(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		handleArgs(context, attrs, defStyleAttr, 0);
	}

	@TargetApi(Build.VERSION_CODES.LOLLIPOP)
	public CardStackLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
		super(context, attrs, defStyleAttr, defStyleRes);
		handleArgs(context, attrs, defStyleAttr, defStyleRes);
	}

	/**
	 * package restricted
	 */
	OnCardSelected getOnCardSelectedListener() {
		return mOnCardSelectedListener;
	}

	/**
	 * Listen on card selection events for {@link CardStackLayout}. Sends
	 * clicked view and it's corresponding position in the callback.
	 *
	 * @param onCardSelectedListener
	 *            listener
	 */
	public void setOnCardSelectedListener(OnCardSelected onCardSelectedListener) {
		this.mOnCardSelectedListener = onCardSelectedListener;
	}

	private void resetDefaults() {
		mOnCardSelectedListener = null;
	}

	private void handleArgs(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
		resetDefaults();

		final TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CardStackLayout, defStyleAttr,
				defStyleRes);
		mParallaxEnabled = a.getBoolean(R.styleable.CardStackLayout_parallax_enabled, PARALLAX_ENABLED_DEFAULT);
		mShowInitAnimation = a.getBoolean(R.styleable.CardStackLayout_showInitAnimation, SHOW_INIT_ANIMATION_DEFAULT);
		mParallaxScale = a.getInteger(R.styleable.CardStackLayout_parallax_scale,
				getResources().getInteger(R.integer.parallax_scale_default));
		mCardGap = a.getDimension(R.styleable.CardStackLayout_card_gap, getResources().getDimension(R.dimen.card_gap));
		mCardGapBottom = a.getDimension(R.styleable.CardStackLayout_card_gap_bottom,
				getResources().getDimension(R.dimen.card_gap_bottom));

		a.recycle();
	}

	/**
	 * @return adapter of type {@link CardStackAdapter} that is set for this
	 *         view.
	 */
	public CardStackAdapter getAdapter() {
		return mAdapter;
	}

	/**
	 * Set the adapter for this {@link CardStackLayout}
	 *
	 * @param adapter
	 *            Should extend {@link CardStackAdapter}
	 */
	public void setAdapter(CardStackAdapter adapter) {
		this.mAdapter = adapter;
		mAdapter.setAdapterParams(this);
		for (int i = 0; i < mAdapter.getCount(); i++) {
			mAdapter.addView(i);
		}

		if (mShowInitAnimation) {
			postDelayed(this::restoreCards, 500);
		}
	}

	/**
	 * @return currently set parallax scale value.
	 */
	public int getParallaxScale() {
		return mParallaxScale;
	}

	/**
	 * Sets the value of parallax scale. Parallax scale is the factor which
	 * decides how much distance a card will scroll when the user drags it down.
	 */
	public void setParallaxScale(int mParallaxScale) {
		this.mParallaxScale = mParallaxScale;
	}

	public boolean isParallaxEnabled() {
		return mParallaxEnabled;
	}

	public void setParallaxEnabled(boolean mParallaxEnabled) {
		this.mParallaxEnabled = mParallaxEnabled;
	}

	public boolean isShowInitAnimation() {
		return mShowInitAnimation;
	}

	public void setShowInitAnimation(boolean mShowInitAnimation) {
		this.mShowInitAnimation = mShowInitAnimation;
	}

	/**
	 * @return the gap (in pixels) between two consecutive cards
	 */
	public float getCardGap() {
		return mCardGap;
	}

	/**
	 * Set the gap (in pixels) between two consecutive cards
	 */
	public void setCardGap(float mCardGap) {
		this.mCardGap = mCardGap;
	}

	/**
	 * @return gap between the two consecutive cards when collapsed to the
	 *         bottom of the screen
	 */
	public float getCardGapBottom() {
		return mCardGapBottom;
	}

	public void setCardGapBottom(float mCardGapBottom) {
		this.mCardGapBottom = mCardGapBottom;
	}

	/**
	 * @return true if a card is selected, false otherwise
	 */
	public boolean isCardSelected() {
		return mAdapter.isCardSelected();
	}

	/**
	 * Removes the adapter that was previously set using
	 * {@link #setAdapter(CardStackAdapter)}
	 */
	public void removeAdapter() {
		if (getChildCount() > 0)
			removeAllViews();
		mAdapter = null;
		mOnCardSelectedListener = null;
	}

	/**
	 * Animates the cards to their initial position in the layout.
	 */
	public void restoreCards() {
		mAdapter.resetCards();
	}

	/**
	 * Intimates the implementing class about the selection of a card
	 */
	public interface OnCardSelected {
		void onCardSelected(View v, int position);
	}

}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/CircularAnim.java
================================================
package io.virtualapp.widgets;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup;
import android.widget.ImageView;


public class CircularAnim {

    public static final long PERFECT_MILLS = 618;
    public static final int MINI_RADIUS = 0;

    private static Long sPerfectMills;
    private static Long sFullActivityPerfectMills;
    private static Integer sColorOrImageRes;

    private static long getPerfectMills() {
        if (sPerfectMills != null)
            return sPerfectMills;
        else
            return PERFECT_MILLS;
    }

    private static long getFullActivityMills() {
        if (sFullActivityPerfectMills != null)
            return sFullActivityPerfectMills;
        else
            return PERFECT_MILLS;
    }

    private static int getColorOrImageRes() {
        if (sColorOrImageRes != null)
            return sColorOrImageRes;
        else
            return android.R.color.white;
    }

    public static VisibleBuilder show(View animView) {
        return new VisibleBuilder(animView, true);
    }

    public static VisibleBuilder hide(View animView) {
        return new VisibleBuilder(animView, false);
    }

    public static FullActivityBuilder fullActivity(Activity activity, View triggerView) {
        return new FullActivityBuilder(activity, triggerView);
    }

    public static void init(long perfectMills, long fullActivityPerfectMills, int colorOrImageRes) {
        sPerfectMills = perfectMills;
        sFullActivityPerfectMills = fullActivityPerfectMills;
        sColorOrImageRes = colorOrImageRes;
    }

    public interface OnAnimationEndListener {
        void onAnimationEnd();
    }

    @SuppressLint("NewApi")
    public static class VisibleBuilder {

        private View mAnimView, mTriggerView;

        private Float mStartRadius, mEndRadius;

        private long mDurationMills = getPerfectMills();

        private boolean isShow;

        private OnAnimationEndListener mOnAnimationEndListener;

        public VisibleBuilder(View animView, boolean isShow) {
            mAnimView = animView;
            this.isShow = isShow;

            if (isShow) {
                mStartRadius = MINI_RADIUS + 0F;
            } else {
                mEndRadius = MINI_RADIUS + 0F;
            }
        }

        public VisibleBuilder triggerView(View triggerView) {
            mTriggerView = triggerView;
            return this;
        }

        public VisibleBuilder startRadius(float startRadius) {
            mStartRadius = startRadius;
            return this;
        }

        public VisibleBuilder endRadius(float endRadius) {
            mEndRadius = endRadius;
            return this;
        }

        public VisibleBuilder duration(long durationMills) {
            mDurationMills = durationMills;
            return this;
        }

        @Deprecated //You can use method - go(OnAnimationEndListener onAnimationEndListener).
        public VisibleBuilder onAnimationEndListener(OnAnimationEndListener onAnimationEndListener) {
            mOnAnimationEndListener = onAnimationEndListener;
            return this;
        }

        public void go() {
            go(null);
        }

        public void go(OnAnimationEndListener onAnimationEndListener) {
            mOnAnimationEndListener = onAnimationEndListener;

            // 版本判断
            if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
                doOnEnd();
                return;
            }

            int rippleCX, rippleCY, maxRadius;
            if (mTriggerView != null) {
                int[] tvLocation = new int[2];
                mTriggerView.getLocationInWindow(tvLocation);
                final int tvCX = tvLocation[0] + mTriggerView.getWidth() / 2;
                final int tvCY = tvLocation[1] + mTriggerView.getHeight() / 2;

                int[] avLocation = new int[2];
                mAnimView.getLocationInWindow(avLocation);
                final int avLX = avLocation[0];
                final int avTY = avLocation[1];

                int triggerX = Math.max(avLX, tvCX);
                triggerX = Math.min(triggerX, avLX + mAnimView.getWidth());

                int triggerY = Math.max(avTY, tvCY);
                triggerY = Math.min(triggerY, avTY + mAnimView.getHeight());

                // 以上全为绝对坐标

                int avW = mAnimView.getWidth();
                int avH = mAnimView.getHeight();

                rippleCX = triggerX - avLX;
                rippleCY = triggerY - avTY;

                // 计算水波中心点至 @mAnimView 边界的最大距离
                int maxW = Math.max(rippleCX, avW - rippleCX);
                int maxH = Math.max(rippleCY, avH - rippleCY);
                maxRadius = (int) Math.sqrt(maxW * maxW + maxH * maxH) + 1;
            } else {
                rippleCX = (mAnimView.getLeft() + mAnimView.getRight()) / 2;
                rippleCY = (mAnimView.getTop() + mAnimView.getBottom()) / 2;

                int w = mAnimView.getWidth();
                int h = mAnimView.getHeight();

                // 勾股定理 & 进一法
                maxRadius = (int) Math.sqrt(w * w + h * h) + 1;
            }

            if (isShow && mEndRadius == null)
                mEndRadius = maxRadius + 0F;
            else if (!isShow && mStartRadius == null)
                mStartRadius = maxRadius + 0F;

            try {
                Animator anim = ViewAnimationUtils.createCircularReveal(
                        mAnimView, rippleCX, rippleCY, mStartRadius, mEndRadius);


                mAnimView.setVisibility(View.VISIBLE);
                anim.setDuration(mDurationMills);

                anim.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        doOnEnd();
                    }
                });

                anim.start();
            } catch (Exception e) {
                e.printStackTrace();
                doOnEnd();
            }
        }

        private void doOnEnd() {
            if (isShow)
                mAnimView.setVisibility(View.VISIBLE);
            else
                mAnimView.setVisibility(View.INVISIBLE);

            if (mOnAnimationEndListener != null)
                mOnAnimationEndListener.onAnimationEnd();
        }

    }

    @SuppressLint("NewApi")
    public static class FullActivityBuilder {
        private Activity mActivity;
        private View mTriggerView;
        private float mStartRadius = MINI_RADIUS;
        private int mColorOrImageRes = getColorOrImageRes();
        private Long mDurationMills;
        private OnAnimationEndListener mOnAnimationEndListener;
        private int mEnterAnim = android.R.anim.fade_in, mExitAnim = android.R.anim.fade_out;

        public FullActivityBuilder(Activity activity, View triggerView) {
            mActivity = activity;
            mTriggerView = triggerView;
        }

        public FullActivityBuilder startRadius(float startRadius) {
            mStartRadius = startRadius;
            return this;
        }

        public FullActivityBuilder colorOrImageRes(int colorOrImageRes) {
            mColorOrImageRes = colorOrImageRes;
            return this;
        }

        public FullActivityBuilder duration(long durationMills) {
            mDurationMills = durationMills;
            return this;
        }

        public FullActivityBuilder overridePendingTransition(int enterAnim, int exitAnim) {
            mEnterAnim = enterAnim;
            mExitAnim = exitAnim;
            return this;
        }

        public void go(OnAnimationEndListener onAnimationEndListener) {
            mOnAnimationEndListener = onAnimationEndListener;

            // 版本判断,小于5.0则无动画.
            if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
                doOnEnd();
                return;
            }

            int[] location = new int[2];
            mTriggerView.getLocationInWindow(location);
            final int cx = location[0] + mTriggerView.getWidth() / 2;
            final int cy = location[1] + mTriggerView.getHeight() / 2;
            final ImageView view = new ImageView(mActivity);
            view.setScaleType(ImageView.ScaleType.CENTER_CROP);
            view.setImageResource(mColorOrImageRes);
            final ViewGroup decorView = (ViewGroup) mActivity.getWindow().getDecorView();
            int w = decorView.getWidth();
            int h = decorView.getHeight();
            decorView.addView(view, w, h);

            int maxW = Math.max(cx, w - cx);
            int maxH = Math.max(cy, h - cy);
            final int finalRadius = (int) Math.sqrt(maxW * maxW + maxH * maxH) + 1;

            try {
                Animator anim = ViewAnimationUtils.createCircularReveal(view, cx, cy, mStartRadius, finalRadius);

                int maxRadius = (int) Math.sqrt(w * w + h * h) + 1;
                if (mDurationMills == null) {
                    double rate = 1d * finalRadius / maxRadius;
                    mDurationMills = (long) (getFullActivityMills() * Math.sqrt(rate));
                }
                final long finalDuration = mDurationMills;
                anim.setDuration((long) (finalDuration * 0.9));
                anim.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);

                        doOnEnd();

                        mActivity.overridePendingTransition(mEnterAnim, mExitAnim);

                        mTriggerView.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                if (mActivity.isFinishing()) return;
                                try {
                                    Animator anim = ViewAnimationUtils.createCircularReveal(view, cx, cy,
                                            finalRadius, mStartRadius);
                                    anim.setDuration(finalDuration);
                                    anim.addListener(new AnimatorListenerAdapter() {
                                        @Override
                                        public void onAnimationEnd(Animator animation) {
                                            super.onAnimationEnd(animation);
                                            try {
                                                decorView.removeView(view);
                                            } catch (Exception e) {
                                                e.printStackTrace();
                                            }
                                        }
                                    });
                                    anim.start();
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    try {
                                        decorView.removeView(view);
                                    } catch (Exception e1) {
                                        e1.printStackTrace();
                                    }
                                }
                            }
                        }, 1000);

                    }
                });
                anim.start();
            } catch (Exception e) {
                e.printStackTrace();
                doOnEnd();
            }
        }

        private void doOnEnd() {
            mOnAnimationEndListener.onAnimationEnd();
        }
    }
}


================================================
FILE: app/src/main/java/io/virtualapp/widgets/DragSelectRecyclerView.java
================================================
package io.virtualapp.widgets;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import io.virtualapp.R;

/**
 * @author Aidan Follestad (afollestad)
 */
public class DragSelectRecyclerView extends RecyclerView {

    private static final boolean LOGGING = false;
    private static final int AUTO_SCROLL_DELAY = 25;
    private int mLastDraggedIndex = -1;
    private DragSelectRecyclerViewAdapter<?> mAdapter;
    private int mInitialSelection;
    private boolean mDragSelectActive;
    private int mMinReached;
    private int mMaxReached;
    private int mHotspotHeight;
    private int mHotspotOffsetTop;
    private int mHotspotOffsetBottom;
    private int mHotspotTopBoundStart;
    private int mHotspotTopBoundEnd;
    private int mHotspotBottomBoundStart;
    private int mHotspotBottomBoundEnd;
    private int mAutoScrollVelocity;
    private FingerListener mFingerListener;
    private boolean mInTopHotspot;
    private boolean mInBottomHotspot;
    private Handler mAutoScrollHandler;
    private Runnable mAutoScrollRunnable = new Runnable() {
        @Override
        public void run() {
            if (mAutoScrollHandler == null)
                return;
            if (mInTopHotspot) {
                scrollBy(0, -mAutoScrollVelocity);
                mAutoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY);
            } else if (mInBottomHotspot) {
                scrollBy(0, mAutoScrollVelocity);
                mAutoScrollHandler.postDelayed(this, AUTO_SCROLL_DELAY);
            }
        }
    };
    private RectF mTopBoundRect;
    private RectF mBottomBoundRect;
    private Paint mDebugPaint;
    private boolean mDebugEnabled = false;

    public DragSelectRecyclerView(Context context) {
        super(context);
        init(context, null);
    }

    public DragSelectRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public DragSelectRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs);
    }

    private static void LOG(String message, Object... args) {
        //noinspection PointlessBooleanExpression
        if (!LOGGING) return;
        if (args != null) {
            Log.d("DragSelectRecyclerView", String.format(message, args));
        } else {
            Log.d("DragSelectRecyclerView", message);
        }
    }

    private void init(Context context, AttributeSet attrs) {
        mAutoScrollHandler = new Handler();
        final int defaultHotspotHeight = context.getResources().getDimensionPixelSize(R.dimen.dsrv_defaultHotspotHeight);

        if (attrs != null) {
            TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DragSelectRecyclerView, 0, 0);
            try {
                boolean autoScrollEnabled = a.getBoolean(R.styleable.DragSelectRecyclerView_dsrv_autoScrollEnabled, true);
                if (!autoScrollEnabled) {
                    mHotspotHeight = -1;
                    mHotspotOffsetTop = -1;
                    mHotspotOffsetBottom = -1;
                    LOG("Auto-scroll disabled");
                } else {
                    mHotspotHeight = a.getDimensionPixelSize(
                            R.styleable.DragSelectRecyclerView_dsrv_autoScrollHotspotHeight, defaultHotspotHeight);
                    mHotspotOffsetTop = a.getDimensionPixelSize(
                            R.styleable.DragSelectRecyclerView_dsrv_autoScrollHotspot_offsetTop, 0);
                    mHotspotOffsetBottom = a.getDimensionPixelSize(
                            R.styleable.DragSelectRecyclerView_dsrv_autoScrollHotspot_offsetBottom, 0);
                    LOG("Hotspot height = %d", mHotspotHeight);
                }
            } finally {
                a.recycle();
            }
        } else {
            mHotspotHeight = defaultHotspotHeight;
            LOG("Hotspot height = %d", mHotspotHeight);
        }
    }

    public void setFingerListener(@Nullable FingerListener listener) {
        this.mFingerListener = listener;
    }

    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        super.onMeasure(widthSpec, heightSpec);
        if (mHotspotHeight > -1) {
            mHotspotTopBoundStart = mHotspotOffsetTop;
            mHotspotTopBoundEnd = mHotspotOffsetTop + mHotspotHeight;
            mHotspotBottomBoundStart = (getMeasuredHeight() - mHotspotHeight) - mHotspotOffsetBottom;
            mHotspotBottomBoundEnd = getMeasuredHeight() - mHotspotOffsetBottom;
            LOG("RecyclerView height = %d", getMeasuredHeight());
            LOG("Hotspot top bound = %d to %d", mHotspotTopBoundStart, mHotspotTopBoundStart);
            LOG("Hotspot bottom bound = %d to %d", mHotspotBottomBoundStart, mHotspotBottomBoundEnd);
        }
    }

    public boolean setDragSelectActive(boolean active, int initialSelection) {
        if (active && mDragSelectActive) {
            LOG("Drag selection is already active.");
            return false;
        }
        mLastDraggedIndex = -1;
        mMinReached = -1;
        mMaxReached = -1;
        if (!mAdapter.isIndexSelectable(initialSelection)) {
            mDragSelectActive = false;
            mInitialSelection = -1;
            mLastDraggedIndex = -1;
            LOG("Index %d is not selectable.", initialSelection);
            return false;
        }
        mAdapter.setSelected(initialSelection, true);
        mDragSelectActive = active;
        mInitialSelection = initialSelection;
        mLastDraggedIndex = initialSelection;
        if (mFingerListener != null)
            mFingerListener.onDragSelectFingerAction(true);
        LOG("Drag selection initialized, starting at index %d.", initialSelection);
        return true;
    }

    /**
     * Use {@link #setAdapter(DragSelectRecyclerViewAdapter)} instead.
     */
    @Override
    @Deprecated
    public void setAdapter(Adapter adapter) {
        if (!(adapter instanceof DragSelectRecyclerViewAdapter<?>))
            throw new IllegalArgumentException("Adapter must be a DragSelectRecyclerViewAdapter.");
        setAdapter((DragSelectRecyclerViewAdapter<?>) adapter);
    }

    public void setAdapter(DragSelectRecyclerViewAdapter<?> adapter) {
        super.setAdapter(adapter);
        mAdapter = adapter;
    }

    private int getItemPosition(MotionEvent e) {
        final View v = findChildViewUnder(e.getX(), e.getY());
        if (v == null) return NO_POSITION;
        if (v.getTag() == null || !(v.getTag() instanceof ViewHolder))
            throw new IllegalStateException("Make sure your adapter makes a call to super.onBindViewHolder(), and doesn't override itemView tags.");
        final ViewHolder holder = (ViewHolder) v.getTag();
        return holder.getAdapterPosition();
    }

    public final void enableDebug() {
        mDebugEnabled = true;
        invalidate();
    }

    @Override
    public void onDraw(Canvas c) {
        super.onDraw(c);

        if (mDebugEnabled) {
            if (mDebugPaint == null) {
                mDebugPaint = new Paint();
                mDebugPaint.setColor(Color.BLACK);
                mDebugPaint.setAntiAlias(true);
                mDebugPaint.setStyle(Paint.Style.FILL);
                mTopBoundRect = new RectF(0, mHotspotTopBoundStart, getMeasuredWidth(), mHotspotTopBoundEnd);
                mBottomBoundRect = new RectF(0, mHotspotBottomBoundStart, getMeasuredWidth(), mHotspotBottomBoundEnd);
            }
            c.drawRect(mTopBoundRect, mDebugPaint);
            c.drawRect(mBottomBoundRect, mDebugPaint);
        }
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent e) {
        if (mAdapter.getItemCount() == 0)
            return super.dispatchTouchEvent(e);

        if (mDragSelectActive) {
            if (e.getAction() == MotionEvent.ACTION_UP) {
                mDragSelectActive = false;
                mInTopHotspot = false;
                mInBottomHotspot = false;
                mAutoScrollHandler.removeCallbacks(mAutoScrollRunnable);
                if (mFingerListener != null)
                    mFingerListener.onDragSelectFingerAction(false);
                return true;
            } else if (e.getAction() == MotionEvent.ACTION_MOVE) {
                // Check for auto-scroll hotspot
                if (mHotspotHeight > -1) {
                    if (e.getY() >= mHotspotTopBoundStart && e.getY() <= mHotspotTopBoundEnd) {
                        mInBottomHotspot = false;
                        if (!mInTopHotspot) {
                            mInTopHotspot = true;
                            LOG("Now in TOP hotspot");
                            mAutoScrollHandler.removeCallbacks(mAutoScrollRunnable);
                            mAutoScrollHandler.postDelayed(mAutoScrollRunnable, AUTO_SCROLL_DELAY);
                        }

                        final float simulatedFactor = mHotspotTopBoundEnd - mHotspotTopBoundStart;
                        final float simulatedY = e.getY() - mHotspotTopBoundStart;
                        mAutoScrollVelocity = (int) (simulatedFactor - simulatedY) / 2;

                        LOG("Auto scroll velocity = %d", mAutoScrollVelocity);
                    } else if (e.getY() >= mHotspotBottomBoundStart && e.getY() <= mHotspotBottomBoundEnd) {
                        mInTopHotspot = false;
                        if (!mInBottomHotspot) {
                            mInBottomHotspot = true;
                            LOG("Now in BOTTOM hotspot");
                            mAutoScrollHandler.removeCallbacks(mAutoScrollRunnable);
                            mAutoScrollHandler.postDelayed(mAutoScrollRunnable, AUTO_SCROLL_DELAY);
                        }

                        final float simulatedY = e.getY() + mHotspotBottomBoundEnd;
                        final float simulatedFactor = mHotspotBottomBoundStart + mHotspotBottomBoundEnd;
                        mAutoScrollVelocity = (int) (simulatedY - simulatedFactor) / 2;

                        LOG("Auto scroll velocity = %d", mAutoScrollVelocity);
                    } else if (mInTopHotspot || mInBottomHotspot) {
                        LOG("Left the hotspot");
                        mAutoScrollHandler.removeCallbacks(mAutoScrollRunnable);
                        mInTopHotspot = false;
                        mInBottomHotspot = false;
                    }
                }

                // Drag selection logic
                // NOTE: DISABLE IT
//                if (itemPosition != NO_POSITION && mLastDraggedIndex != itemPosition) {
//                    mLastDraggedIndex = itemPosition;
//                    if (mMinReached == -1) mMinReached = mLastDraggedIndex;
//                    if (mMaxReached == -1) mMaxReached = mLastDraggedIndex;
//                    if (mLastDraggedIndex > mMaxReached)
//                        mMaxReached = mLastDraggedIndex;
//                    if (mLastDraggedIndex < mMinReached)
//                        mMinReached = mLastDraggedIndex;
//                    if (mAdapter != null)
//                        mAdapter.selectRange(mInitialSelection, mLastDraggedIndex, mMinReached, mMaxReached);
//                    if (mInitialSelection == mLastDraggedIndex) {
//                        mMinReached = mLastDraggedIndex;
//                        mMaxReached = mLastDraggedIndex;
//                    }
//                }
                return true;
            }
        }
        return super.dispatchTouchEvent(e);
    }

    public interface FingerListener {
        void onDragSelectFingerAction(boolean fingerDown);
    }
}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/DragSelectRecyclerViewAdapter.java
================================================
package io.virtualapp.widgets;

import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;

/**
 * @author Aidan Follestad (afollestad)
 */
public abstract class DragSelectRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {

    private ArrayList<Integer> mSelectedIndices;
    private SelectionListener mSelectionListener;
    private int mLastCount = -1;
    private int mMaxSelectionCount = -1;
    protected DragSelectRecyclerViewAdapter() {
        mSelectedIndices = new ArrayList<>();
    }

    private void fireSelectionListener() {
        if (mLastCount == mSelectedIndices.size())
            return;
        mLastCount = mSelectedIndices.size();
        if (mSelectionListener != null)
            mSelectionListener.onDragSelectionChanged(mLastCount);
    }

    public void setMaxSelectionCount(int maxSelectionCount) {
        this.mMaxSelectionCount = maxSelectionCount;
    }

    public void setSelectionListener(SelectionListener selectionListener) {
        this.mSelectionListener = selectionListener;
    }

    public void saveInstanceState(Bundle out) {
        saveInstanceState("selected_indices", out);
    }

    public void saveInstanceState(String key, Bundle out) {
        out.putSerializable(key, mSelectedIndices);
    }

    public void restoreInstanceState(Bundle in) {
        restoreInstanceState("selected_indices", in);
    }

    public void restoreInstanceState(String key, Bundle in) {
        if (in != null && in.containsKey(key)) {
            //noinspection unchecked
            mSelectedIndices = (ArrayList<Integer>) in.getSerializable(key);
            if (mSelectedIndices == null) mSelectedIndices = new ArrayList<>();
            else fireSelectionListener();
        }
    }

    public final void setSelected(int index, boolean selected) {
        if (!isIndexSelectable(index))
            selected = false;
        if (selected) {
            if (!mSelectedIndices.contains(index) &&
                    (mMaxSelectionCount == -1 ||
                            mSelectedIndices.size() < mMaxSelectionCount)) {
                mSelectedIndices.add(index);
                notifyItemChanged(index);
            }
        } else if (mSelectedIndices.contains(index)) {
            mSelectedIndices.remove((Integer) index);
            notifyItemChanged(index);
        }
        fireSelectionListener();
    }

    public final boolean toggleSelected(int index) {
        boolean selectedNow = false;
        if (isIndexSelectable(index)) {
            if (mSelectedIndices.contains(index)) {
                mSelectedIndices.remove((Integer) index);
            } else if (mMaxSelectionCount == -1 ||
                    mSelectedIndices.size() < mMaxSelectionCount) {
                mSelectedIndices.add(index);
                selectedNow = true;
            }
            notifyItemChanged(index);
        }
        fireSelectionListener();
        return selectedNow;
    }

    protected boolean isIndexSelectable(int index) {
        return true;
    }

    @CallSuper
    @Override
    public void onBindViewHolder(VH holder, int position) {
        holder.itemView.setTag(holder);
    }

    public final void selectRange(int from, int to, int min, int max) {
        if (from == to) {
            // Finger is back on the initial item, unselect everything else
            for (int i = min; i <= max; i++) {
                if (i == from) continue;
                setSelected(i, false);
            }
            fireSelectionListener();
            return;
        }

        if (to < from) {
            // When selecting from one to previous items
            for (int i = to; i <= from; i++)
                setSelected(i, true);
            if (min > -1 && min < to) {
                // Unselect items that were selected during this drag but no longer are
                for (int i = min; i < to; i++) {
                    if (i == from) continue;
                    setSelected(i, false);
                }
            }
            if (max > -1) {
                for (int i = from + 1; i <= max; i++)
                    setSelected(i, false);
            }
        } else {
            // When selecting from one to next items
            for (int i = from; i <= to; i++)
                setSelected(i, true);
            if (max > -1 && max > to) {
                // Unselect items that were selected during this drag but no longer are
                for (int i = to + 1; i <= max; i++) {
                    if (i == from) continue;
                    setSelected(i, false);
                }
            }
            if (min > -1) {
                for (int i = min; i < from; i++)
                    setSelected(i, false);
            }
        }
        fireSelectionListener();
    }

    public final void selectAll() {
        int max = getItemCount();
        mSelectedIndices.clear();
        for (int i = 0; i < max; i++) {
            if (isIndexSelectable(i)) {
                mSelectedIndices.add(i);
            }
        }
        notifyDataSetChanged();
        fireSelectionListener();
    }

    public final void clearSelected() {
        mSelectedIndices.clear();
        notifyDataSetChanged();
        fireSelectionListener();
    }

    public final int getSelectedCount() {
        return mSelectedIndices.size();
    }

    public final Integer[] getSelectedIndices() {
        return mSelectedIndices.toArray(new Integer[mSelectedIndices.size()]);
    }

    public final boolean isIndexSelected(int index) {
        return mSelectedIndices.contains(index);
    }

    public interface SelectionListener {
        void onDragSelectionChanged(int count);
    }
}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/EatBeansView.java
================================================
package io.virtualapp.widgets;

import android.animation.Animator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;


public class EatBeansView extends BaseView {

    int eatSpeed = 5;
    private Paint mPaint, mPaintEye;
    private float mWidth = 0f;
    private float mHigh = 0f;
    private float mPadding = 5f;
    private float eatErWidth = 60f;
    private float eatErPositionX = 0f;
    private float beansWidth = 10f;


    private float mAngle = 34;
    private float eatErStartAngle = mAngle;
    private float eatErEndAngle = 360 - 2 * eatErStartAngle;

    public EatBeansView(Context context) {
        super(context);
    }

    public EatBeansView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EatBeansView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


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

        mWidth = getMeasuredWidth();
        mHigh = getMeasuredHeight();
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float eatRightX = mPadding + eatErWidth + eatErPositionX;
        RectF rectF = new RectF(mPadding + eatErPositionX, mHigh / 2 - eatErWidth / 2, eatRightX, mHigh / 2 + eatErWidth / 2);
        canvas.drawArc(rectF, eatErStartAngle, eatErEndAngle
                , true, mPaint);
        canvas.drawCircle(mPadding + eatErPositionX + eatErWidth / 2,
                mHigh / 2 - eatErWidth / 4,
                beansWidth / 2, mPaintEye);

        int beansCount = (int) ((mWidth - mPadding * 2 - eatErWidth) / beansWidth / 2);
        for (int i = 0; i < beansCount; i++) {

            float x = beansCount * i + beansWidth / 2 + mPadding + eatErWidth;
            if (x > eatRightX) {
                canvas.drawCircle(x,
                        mHigh / 2, beansWidth / 2, mPaint);
            }
        }


    }

    private void initPaint() {
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(Color.WHITE);

        mPaintEye = new Paint();
        mPaintEye.setAntiAlias(true);
        mPaintEye.setStyle(Paint.Style.FILL);
        mPaintEye.setColor(Color.BLACK);

    }


    public void setViewColor(int color) {
        mPaint.setColor(color);
        postInvalidate();
    }

    public void setEyeColor(int color) {
        mPaintEye.setColor(color);
        postInvalidate();
    }


    @Override
    protected void InitPaint() {
        initPaint();
    }

    @Override
    protected void OnAnimationUpdate(ValueAnimator valueAnimator) {
        float mAnimatedValue = (float) valueAnimator.getAnimatedValue();
        eatErPositionX = (mWidth - 2 * mPadding - eatErWidth) * mAnimatedValue;
        eatErStartAngle = mAngle * (1 - (mAnimatedValue * eatSpeed - (int) (mAnimatedValue * eatSpeed)));
        eatErEndAngle = 360 - eatErStartAngle * 2;
        invalidate();
    }

    @Override
    protected void OnAnimationRepeat(Animator animation) {

    }

    @Override
    protected int OnStopAnim() {
        eatErPositionX = 0;
        postInvalidate();
        return 1;
    }

    @Override
    protected int SetAnimRepeatMode() {
        return ValueAnimator.RESTART;
    }

    @Override
    protected void AnimIsRunning() {

    }

    @Override
    protected int SetAnimRepeatCount() {
        return ValueAnimator.INFINITE;
    }
}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/Indicator.java
================================================
package io.virtualapp.widgets;

import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;

import java.util.ArrayList;
import java.util.HashMap;


public abstract class Indicator extends Drawable implements Animatable {

    private static final Rect ZERO_BOUNDS_RECT = new Rect();
    protected Rect drawBounds = ZERO_BOUNDS_RECT;
    private HashMap<ValueAnimator, ValueAnimator.AnimatorUpdateListener> mUpdateListeners = new HashMap<>();
    private ArrayList<ValueAnimator> mAnimators;
    private int alpha = 255;
    private boolean mHasAnimators;

    private Paint mPaint = new Paint();

    public Indicator() {
        mPaint.setColor(Color.WHITE);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);
    }

    public int getColor() {
        return mPaint.getColor();
    }

    public void setColor(int color) {
        mPaint.setColor(color);
    }

    @Override
    public int getAlpha() {
        return alpha;
    }

    @Override
    public void setAlpha(int alpha) {
        this.alpha = alpha;
    }

    @Override
    public int getOpacity() {
        return PixelFormat.OPAQUE;
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {

    }

    @Override
    public void draw(Canvas canvas) {
        draw(canvas, mPaint);
    }

    public abstract void draw(Canvas canvas, Paint paint);

    public abstract ArrayList<ValueAnimator> onCreateAnimators();

    @Override
    public void start() {
        ensureAnimators();

        if (mAnimators == null) {
            return;
        }

        // If the animators has not ended, do nothing.
        if (isStarted()) {
            return;
        }
        startAnimators();
        invalidateSelf();
    }

    private void startAnimators() {
        for (int i = 0; i < mAnimators.size(); i++) {
            ValueAnimator animator = mAnimators.get(i);

            //when the animator restart , add the updateListener again because they
            // was removed by animator stop .
            ValueAnimator.AnimatorUpdateListener updateListener = mUpdateListeners.get(animator);
            if (updateListener != null) {
                animator.addUpdateListener(updateListener);
            }

            animator.start();
        }
    }

    private void stopAnimators() {
        if (mAnimators != null) {
            for (ValueAnimator animator : mAnimators) {
                if (animator != null && animator.isStarted()) {
                    animator.removeAllUpdateListeners();
                    animator.end();
                }
            }
        }
    }

    private void ensureAnimators() {
        if (!mHasAnimators) {
            mAnimators = onCreateAnimators();
            mHasAnimators = true;
        }
    }

    @Override
    public void stop() {
        stopAnimators();
    }

    private boolean isStarted() {
        for (ValueAnimator animator : mAnimators) {
            return animator.isStarted();
        }
        return false;
    }

    @Override
    public boolean isRunning() {
        for (ValueAnimator animator : mAnimators) {
            return animator.isRunning();
        }
        return false;
    }

    /**
     * Your should use this to add AnimatorUpdateListener when
     * create animator , otherwise , animator doesn't work when
     * the animation restart .
     *
     * @param updateListener
     */
    public void addUpdateListener(ValueAnimator animator, ValueAnimator.AnimatorUpdateListener updateListener) {
        mUpdateListeners.put(animator, updateListener);
    }

    @Override
    protected void onBoundsChange(Rect bounds) {
        super.onBoundsChange(bounds);
        setDrawBounds(bounds);
    }

    public void setDrawBounds(int left, int top, int right, int bottom) {
        this.drawBounds = new Rect(left, top, right, bottom);
    }

    public void postInvalidate() {
        invalidateSelf();
    }

    public Rect getDrawBounds() {
        return drawBounds;
    }

    public void setDrawBounds(Rect drawBounds) {
        setDrawBounds(drawBounds.left, drawBounds.top, drawBounds.right, drawBounds.bottom);
    }

    public int getWidth() {
        return drawBounds.width();
    }

    public int getHeight() {
        return drawBounds.height();
    }

    public int centerX() {
        return drawBounds.centerX();
    }

    public int centerY() {
        return drawBounds.centerY();
    }

    public float exactCenterX() {
        return drawBounds.exactCenterX();
    }

    public float exactCenterY() {
        return drawBounds.exactCenterY();
    }

}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/LabelView.java
================================================
package io.virtualapp.widgets;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;

import io.virtualapp.R;

public class LabelView extends View {
    private static final int DEFAULT_DEGREES = 45;
    private String mTextContent;
    private int mTextColor;
    private float mTextSize;
    private boolean mTextBold;
    private boolean mFillTriangle;
    private boolean mTextAllCaps;
    private int mBackgroundColor;
    private float mMinSize;
    private float mPadding;
    private int mGravity;
    private Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Path mPath = new Path();

    public LabelView(Context context) {
        this(context, null);
    }

    public LabelView(Context context, AttributeSet attrs) {
        super(context, attrs);

        obtainAttributes(context, attrs);
        mTextPaint.setTextAlign(Paint.Align.CENTER);
    }

    private void obtainAttributes(Context context, AttributeSet attrs) {
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.LabelView);
        mTextContent = ta.getString(R.styleable.LabelView_lv_text);
        mTextColor = ta.getColor(R.styleable.LabelView_lv_text_color, Color.parseColor("#ffffff"));
        mTextSize = ta.getDimension(R.styleable.LabelView_lv_text_size, sp2px(11));
        mTextBold = ta.getBoolean(R.styleable.LabelView_lv_text_bold, true);
        mTextAllCaps = ta.getBoolean(R.styleable.LabelView_lv_text_all_caps, true);
        mFillTriangle = ta.getBoolean(R.styleable.LabelView_lv_fill_triangle, false);
        mBackgroundColor = ta.getColor(R.styleable.LabelView_lv_background_color, Color.parseColor("#FF4081"));
        mMinSize = ta.getDimension(R.styleable.LabelView_lv_min_size, mFillTriangle ? dp2px(35) : dp2px(50));
        mPadding = ta.getDimension(R.styleable.LabelView_lv_padding, dp2px(3.5f));
        mGravity = ta.getInt(R.styleable.LabelView_lv_gravity, Gravity.TOP | Gravity.LEFT);
        ta.recycle();
    }

    public String getText() {
        return mTextContent;
    }

    public void setText(String text) {
        mTextContent = text;
        invalidate();
    }

    public int getTextColor() {
        return mTextColor;
    }

    public void setTextColor(int textColor) {
        mTextColor = textColor;
        invalidate();
    }

    public float getTextSize() {
        return mTextSize;
    }

    public void setTextSize(float textSize) {
        mTextSize = sp2px(textSize);
        invalidate();
    }

    public boolean isTextBold() {
        return mTextBold;
    }

    public void setTextBold(boolean textBold) {
        mTextBold = textBold;
        invalidate();
    }

    public boolean isFillTriangle() {
        return mFillTriangle;
    }

    public void setFillTriangle(boolean fillTriangle) {
        mFillTriangle = fillTriangle;
        invalidate();
    }

    public boolean isTextAllCaps() {
        return mTextAllCaps;
    }

    public void setTextAllCaps(boolean textAllCaps) {
        mTextAllCaps = textAllCaps;
        invalidate();
    }

    public int getBgColor() {
        return mBackgroundColor;
    }

    public void setBgColor(int backgroundColor) {
        mBackgroundColor = backgroundColor;
        invalidate();
    }

    public float getMinSize() {
        return mMinSize;
    }

    public void setMinSize(float minSize) {
        mMinSize = dp2px(minSize);
        invalidate();
    }

    public float getPadding() {
        return mPadding;
    }

    public void setPadding(float padding) {
        mPadding = dp2px(padding);
        invalidate();
    }

    public int getGravity() {
        return mGravity;
    }

    /**
     * Gravity.TOP | Gravity.LEFT
     * Gravity.TOP | Gravity.RIGHT
     * Gravity.BOTTOM | Gravity.LEFT
     * Gravity.BOTTOM | Gravity.RIGHT
     */
    public void setGravity(int gravity) {
        mGravity = gravity;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int size = getHeight();

        mTextPaint.setColor(mTextColor);
        mTextPaint.setTextSize(mTextSize);
        mTextPaint.setFakeBoldText(mTextBold);
        mBackgroundPaint.setColor(mBackgroundColor);

        float textHeight = mTextPaint.descent() - mTextPaint.ascent();
        if (mFillTriangle) {
            if (mGravity == (Gravity.TOP | Gravity.LEFT)) {
                mPath.reset();
                mPath.moveTo(0, 0);
                mPath.lineTo(0, size);
                mPath.lineTo(size, 0);
                mPath.close();
                canvas.drawPath(mPath, mBackgroundPaint);

                drawTextWhenFill(size, -DEFAULT_DEGREES, canvas, true);
            } else if (mGravity == (Gravity.TOP | Gravity.RIGHT)) {
                mPath.reset();
                mPath.moveTo(size, 0);
                mPath.lineTo(0, 0);
                mPath.lineTo(size, size);
                mPath.close();
                canvas.drawPath(mPath, mBackgroundPaint);

                drawTextWhenFill(size, DEFAULT_DEGREES, canvas, true);
            } else if (mGravity == (Gravity.BOTTOM | Gravity.LEFT)) {
                mPath.reset();
                mPath.moveTo(0, size);
                mPath.lineTo(0, 0);
                mPath.lineTo(size, size);
                mPath.close();
                canvas.drawPath(mPath, mBackgroundPaint);

                drawTextWhenFill(size, DEFAULT_DEGREES, canvas, false);
            } else if (mGravity == (Gravity.BOTTOM | Gravity.RIGHT)) {
                mPath.reset();
                mPath.moveTo(size, size);
                mPath.lineTo(0, size);
                mPath.lineTo(size, 0);
                mPath.close();
                canvas.drawPath(mPath, mBackgroundPaint);

                drawTextWhenFill(size, -DEFAULT_DEGREES, canvas, false);
            }
        } else {
            double delta = (textHeight + mPadding * 2) * Math.sqrt(2);
            if (mGravity == (Gravity.TOP | Gravity.LEFT)) {
                mPath.reset();
                mPath.moveTo(0, (float) (size - delta));
                mPath.lineTo(0, size);
                mPath.lineTo(size, 0);
                mPath.lineTo((float) (size - delta), 0);
                mPath.close();
                canvas.drawPath(mPath, mBackgroundPaint);

                drawText(size, -DEFAULT_DEGREES, canvas, textHeight, true);
            } else if (mGravity == (Gravity.TOP | Gravity.RIGHT)) {
                mPath.reset();
                mPath.moveTo(0, 0);
                mPath.lineTo((float) delta, 0);
                mPath.lineTo(size, (float) (size - delta));
                mPath.lineTo(size, size);
                mPath.close();
                canvas.drawPath(mPath, mBackgroundPaint);

                drawText(size, DEFAULT_DEGREES, canvas, textHeight, true);
            } else if (mGravity == (Gravity.BOTTOM | Gravity.LEFT)) {
                mPath.reset();
                mPath.moveTo(0, 0);
                mPath.lineTo(0, (float) delta);
                mPath.lineTo((float) (size - delta), size);
                mPath.lineTo(size, size);
                mPath.close();
                canvas.drawPath(mPath, mBackgroundPaint);

                drawText(size, DEFAULT_DEGREES, canvas, textHeight, false);
            } else if (mGravity == (Gravity.BOTTOM | Gravity.RIGHT)) {
                mPath.reset();
                mPath.moveTo(0, size);
                mPath.lineTo((float) delta, size);
                mPath.lineTo(size, (float) delta);
                mPath.lineTo(size, 0);
                mPath.close();
                canvas.drawPath(mPath, mBackgroundPaint);

                drawText(size, -DEFAULT_DEGREES, canvas, textHeight, false);
            }
        }
    }

    private void drawText(int size, float degrees, Canvas canvas, float textHeight, boolean isTop) {
        canvas.save();
        canvas.rotate(degrees, size / 2f, size / 2f);
        float delta = isTop ? -(textHeight + mPadding * 2) / 2 : (textHeight + mPadding * 2) / 2;
        float textBaseY = size / 2 - (mTextPaint.descent() + mTextPaint.ascent()) / 2 + delta;
        canvas.drawText(mTextAllCaps ? mTextContent.toUpperCase() : mTextContent,
                getPaddingLeft() + (size - getPaddingLeft() - getPaddingRight()) / 2, textBaseY, mTextPaint);
        canvas.restore();
    }

    private void drawTextWhenFill(int size, float degrees, Canvas canvas, boolean isTop) {
        canvas.save();
        canvas.rotate(degrees, size / 2f, size / 2f);
        float delta = isTop ? -size / 4 : size / 4;
        float textBaseY = size / 2 - (mTextPaint.descent() + mTextPaint.ascent()) / 2 + delta;
        canvas.drawText(mTextAllCaps ? mTextContent.toUpperCase() : mTextContent,
                getPaddingLeft() + (size - getPaddingLeft() - getPaddingRight()) / 2, textBaseY, mTextPaint);
        canvas.restore();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int measuredWidth = measureWidth(widthMeasureSpec);
        setMeasuredDimension(measuredWidth, measuredWidth);
    }

    /**
     * 确定View宽度大小
     */
    private int measureWidth(int widthMeasureSpec) {
        int result;
        int specMode = MeasureSpec.getMode(widthMeasureSpec);
        int specSize = MeasureSpec.getSize(widthMeasureSpec);
        if (specMode == MeasureSpec.EXACTLY) {//大小确定直接使用
            result = specSize;
        } else {
            int padding = getPaddingLeft() + getPaddingRight();
            mTextPaint.setColor(mTextColor);
            mTextPaint.setTextSize(mTextSize);
            float textWidth = mTextPaint.measureText(mTextContent + "");
            result = (int) ((padding + (int) textWidth) * Math.sqrt(2));
            //如果父视图的测量要求为AT_MOST,即限定了一个最大值,则再从系统建议值和自己计算值中去一个较小值
            if (specMode == MeasureSpec.AT_MOST) {
                result = Math.min(result, specSize);
            }

            result = Math.max((int) mMinSize, result);
        }

        return result;
    }

    protected int dp2px(float dp) {
        final float scale = getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }

    protected int sp2px(float sp) {
        final float scale = getResources().getDisplayMetrics().scaledDensity;
        return (int) (sp * scale + 0.5f);
    }
}

================================================
FILE: app/src/main/java/io/virtualapp/widgets/LauncherIconView.java
================================================
package io.virtualapp.widgets;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.animation.DecelerateInterpolator;

import io.virtualapp.R;

import static android.graphics.Canvas.ALL_SAVE_FLAG;

public class LauncherIconView extends AppCompatImageView implements ShimmerViewBase {
    private static final int SMOOTH_ANIM_THRESHOLD = 5;

    private static final String TAG = "LauncherIconView";

    private ShimmerViewHelper mShimmerViewHelper;
    private Shimmer mShimmer;

    private float mProgress;
    private int mHeight;
    private int mWidth;
    private int mStrokeWidth;
    private float mRadius;
    private float mInterDelta;
    private int mMaskColor;

    private float mMaxMaskRadius;
    private float mMaskAnimDelta;
    private boolean mIsSquare;
    private boolean mMaskAnimRunning;

    private long mMediumAnimTime;

    private Paint mShimmerPaint;
    private Paint mPaint;
    private RectF mProgressOval;
    private ValueAnimator mInterAnim;
    private ValueAnimator mProgressAnimator;

    public LauncherIconView(Context context) {
        super(context);
        init(context, null);
    }

    public LauncherIconView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public LauncherIconView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        mMediumAnimTime = getContext().getResources().getInteger(android.R.integer.config_mediumAnimTime);

        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProgressImageView);
        try {
            this.mProgress = a.getInteger(R.styleable.ProgressImageView_pi_progress, 0);
            this.mStrokeWidth = a.getDimensionPixelOffset(R.styleable.ProgressImageView_pi_stroke, 8);
            this.mRadius = a.getDimensionPixelOffset(R.styleable.ProgressImageView_pi_radius, 0);
            this.mIsSquare = a.getBoolean(R.styleable.ProgressImageView_pi_force_square, false);
            this.mMaskColor = a.getColor(R.styleable.ProgressImageView_pi_mask_color, Color.argb(180, 0, 0, 0));

            this.mPaint = new Paint();
            mPaint.setColor(mMaskColor);
            mPaint.setAntiAlias(true);

            this.mShimmerPaint = new Paint();
            mShimmerPaint.setColor(Color.WHITE);
        } finally {
            a.recycle();
        }
        mShimmerViewHelper = new ShimmerViewHelper(this, mShimmerPaint, attrs);
    }

    private void initParams() {
        if (mWidth == 0)
            mWidth = getWidth();

        if (mHeight == 0)
            mHeight = getHeight();

        if (mWidth != 0 && mHeight != 0) {
            if (mRadius == 0)
                mRadius = Math.min(mWidth, mHeight) / 4f;

            if (mMaxMaskRadius == 0)
                mMaxMaskRadius = (float) (0.5f * Math.sqrt(mWidth * mWidth + mHeight * mHeight));

            if (mProgressOval == null)
                mProgressOval = new RectF(
                        mWidth / 2f - mRadius + mStrokeWidth,
                        mHeight / 2f - mRadius + mStrokeWidth,
                        mWidth / 2f + mRadius - mStrokeWidth,
                        mHeight / 2f + mRadius - mStrokeWidth);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (mShimmerViewHelper != null) {
            mShimmerViewHelper.onDraw();
        }
        super.onDraw(canvas);
        int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, ALL_SAVE_FLAG);

        initParams();

        if (mProgress < 100) {
            dra
Download .txt
gitextract_o4ouir9u/

├── .gitignore
├── app/
│   ├── .gitignore
│   ├── build.gradle
│   ├── 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/
│           │           │       ├── 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/
│           │           │   │   ├── AppPagerAdapter.java
│           │           │   │   ├── CloneAppListAdapter.java
│           │           │   │   ├── LaunchpadAdapter.java
│           │           │   │   └── decorations/
│           │           │   │       └── ItemOffsetDecoration.java
│           │           │   ├── ads/
│           │           │   │   └── AdScheduler.java
│           │           │   ├── models/
│           │           │   │   ├── AddAppButton.java
│           │           │   │   ├── AppData.java
│           │           │   │   ├── AppInfo.java
│           │           │   │   ├── AppInfoLite.java
│           │           │   │   ├── EmptyAppData.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
│           └── 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_splash.xml
│               │   ├── activity_users.xml
│               │   ├── fragment_list_app.xml
│               │   ├── item_app.xml
│               │   ├── item_clone_app.xml
│               │   ├── item_launcher_app.xml
│               │   └── item_user.xml
│               ├── menu/
│               │   └── user_menu.xml
│               ├── values/
│               │   ├── attrs.xml
│               │   ├── colors.xml
│               │   ├── dimens.xml
│               │   ├── ids.xml
│               │   ├── integers.xml
│               │   ├── strings.xml
│               │   └── styles.xml
│               └── values-zh-rCN/
│                   └── 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
│           │   │   └── net/
│           │   │       ├── IConnectivityManager.aidl
│           │   │       └── wifi/
│           │   │           └── IWifiScanner.aidl
│           │   └── com/
│           │       └── lody/
│           │           └── virtual/
│           │               ├── client/
│           │               │   └── IVClient.aidl
│           │               ├── os/
│           │               │   └── VUserInfo.aidl
│           │               ├── remote/
│           │               │   ├── AppTaskInfo.aidl
│           │               │   ├── InstallResult.aidl
│           │               │   ├── InstalledAppInfo.aidl
│           │               │   ├── PendingIntentData.aidl
│           │               │   ├── PendingResultData.aidl
│           │               │   ├── Problem.aidl
│           │               │   ├── ReceiverInfo.aidl
│           │               │   ├── VDeviceInfo.aidl
│           │               │   └── VParceledListSlice.aidl
│           │               └── server/
│           │                   ├── IAccountManager.aidl
│           │                   ├── IActivityManager.aidl
│           │                   ├── IAppManager.aidl
│           │                   ├── IBinderDelegateService.aidl
│           │                   ├── IDeviceInfoManager.aidl
│           │                   ├── IJobScheduler.aidl
│           │                   ├── INotificationManager.aidl
│           │                   ├── IPackageInstaller.aidl
│           │                   ├── IPackageInstallerSession.aidl
│           │                   ├── IPackageManager.aidl
│           │                   ├── IUserManager.aidl
│           │                   ├── IVirtualStorageService.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
│           │   ├── com/
│           │   │   └── lody/
│           │   │       └── virtual/
│           │   │           ├── Build.java
│           │   │           ├── GmsSupport.java
│           │   │           ├── client/
│           │   │           │   ├── NativeEngine.java
│           │   │           │   ├── VClientImpl.java
│           │   │           │   ├── core/
│           │   │           │   │   ├── CrashHandler.java
│           │   │           │   │   ├── InstallStrategy.java
│           │   │           │   │   ├── InvocationStubManager.java
│           │   │           │   │   └── VirtualCore.java
│           │   │           │   ├── env/
│           │   │           │   │   ├── Constants.java
│           │   │           │   │   ├── DeadServerException.java
│           │   │           │   │   ├── SpecialComponentList.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
│           │   │           │   │   │   ├── display/
│           │   │           │   │   │   │   └── DisplayStub.java
│           │   │           │   │   │   ├── dropbox/
│           │   │           │   │   │   │   └── DropBoxManagerStub.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/
│           │   │           │   │   │   │   └── LocationManagerStub.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
│           │   │           │   │   │   ├── user/
│           │   │           │   │   │   │   └── UserManagerStub.java
│           │   │           │   │   │   ├── vibrator/
│           │   │           │   │   │   │   └── VibratorStub.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
│           │   │           │   │   └── 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/
│           │   │           │   ├── ParcelHelper.java
│           │   │           │   ├── PersistenceLayer.java
│           │   │           │   ├── collection/
│           │   │           │   │   ├── ArrayMap.java
│           │   │           │   │   ├── ArraySet.java
│           │   │           │   │   ├── ContainerHelpers.java
│           │   │           │   │   ├── IntArray.java
│           │   │           │   │   ├── MapCollections.java
│           │   │           │   │   ├── SimpleArrayMap.java
│           │   │           │   │   └── SparseArray.java
│           │   │           │   ├── compat/
│           │   │           │   │   ├── AccountManagerCompat.java
│           │   │           │   │   ├── ActivityManagerCompat.java
│           │   │           │   │   ├── ApplicationThreadCompat.java
│           │   │           │   │   ├── BuildCompat.java
│           │   │           │   │   ├── BundleCompat.java
│           │   │           │   │   ├── ContentProviderCompat.java
│           │   │           │   │   ├── ContentResolverCompat.java
│           │   │           │   │   ├── IApplicationThreadCompat.java
│           │   │           │   │   ├── NativeLibraryHelperCompat.java
│           │   │           │   │   ├── ObjectsCompat.java
│           │   │           │   │   ├── PackageParserCompat.java
│           │   │           │   │   ├── ParceledListSliceCompat.java
│           │   │           │   │   ├── StorageManagerCompat.java
│           │   │           │   │   └── SystemPropertiesCompat.java
│           │   │           │   └── utils/
│           │   │           │       ├── ArrayUtils.java
│           │   │           │       ├── AtomicFile.java
│           │   │           │       ├── BitmapUtils.java
│           │   │           │       ├── ClassUtils.java
│           │   │           │       ├── ComponentUtils.java
│           │   │           │       ├── DrawableUtils.java
│           │   │           │       ├── FastXmlSerializer.java
│           │   │           │       ├── FileUtils.java
│           │   │           │       ├── MD5Utils.java
│           │   │           │       ├── Mark.java
│           │   │           │       ├── OSUtils.java
│           │   │           │       ├── Reflect.java
│           │   │           │       ├── ReflectException.java
│           │   │           │       ├── Singleton.java
│           │   │           │       ├── VLog.java
│           │   │           │       └── XmlSerializerAndParser.java
│           │   │           ├── os/
│           │   │           │   ├── VBinder.java
│           │   │           │   ├── VEnvironment.java
│           │   │           │   ├── VUserHandle.java
│           │   │           │   ├── VUserInfo.java
│           │   │           │   └── VUserManager.java
│           │   │           ├── remote/
│           │   │           │   ├── AppTaskInfo.java
│           │   │           │   ├── InstallResult.java
│           │   │           │   ├── InstalledAppInfo.java
│           │   │           │   ├── PendingIntentData.java
│           │   │           │   ├── PendingResultData.java
│           │   │           │   ├── Problem.java
│           │   │           │   ├── ReceiverInfo.java
│           │   │           │   ├── StubActivityRecord.java
│           │   │           │   ├── SyncInfo.java
│           │   │           │   ├── VDeviceInfo.java
│           │   │           │   └── VParceledListSlice.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
│           │   │               ├── job/
│           │   │               │   └── VJobSchedulerService.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
│           │       │   │   ├── LoadedApk.java
│           │       │   │   ├── LoadedApkHuaWei.java
│           │       │   │   ├── Notification.java
│           │       │   │   ├── NotificationL.java
│           │       │   │   ├── NotificationM.java
│           │       │   │   ├── NotificationManager.java
│           │       │   │   ├── PendingIntentJBMR2.java
│           │       │   │   ├── backup/
│           │       │   │   │   └── IBackupManager.java
│           │       │   │   └── job/
│           │       │   │       ├── IJobScheduler.java
│           │       │   │       ├── JobInfo.java
│           │       │   │       └── JobParameters.java
│           │       │   ├── bluetooth/
│           │       │   │   └── IBluetooth.java
│           │       │   ├── content/
│           │       │   │   ├── BroadcastReceiver.java
│           │       │   │   ├── ClipboardManager.java
│           │       │   │   ├── ClipboardManagerOreo.java
│           │       │   │   ├── ContentProviderClient.java
│           │       │   │   ├── ContentProviderHolderOreo.java
│           │       │   │   ├── ContentProviderNative.java
│           │       │   │   ├── ContentResolver.java
│           │       │   │   ├── ContentResolverJBMR2.java
│           │       │   │   ├── IClipboard.java
│           │       │   │   ├── IContentProvider.java
│           │       │   │   ├── IContentService.java
│           │       │   │   ├── IIntentReceiver.java
│           │       │   │   ├── IIntentReceiverJB.java
│           │       │   │   ├── IRestrictionsManager.java
│           │       │   │   ├── IntentFilter.java
│           │       │   │   ├── SyncAdapterType.java
│           │       │   │   ├── SyncAdapterTypeN.java
│           │       │   │   ├── SyncInfo.java
│           │       │   │   ├── SyncRequest.java
│           │       │   │   ├── pm/
│           │       │   │   │   ├── ApplicationInfoL.java
│           │       │   │   │   ├── ApplicationInfoN.java
│           │       │   │   │   ├── ILauncherApps.java
│           │       │   │   │   ├── IShortcutService.java
│           │       │   │   │   ├── LauncherApps.java
│           │       │   │   │   ├── PackageInstaller.java
│           │       │   │   │   ├── PackageParser.java
│           │       │   │   │   ├── PackageParserJellyBean.java
│           │       │   │   │   ├── PackageParserJellyBean17.java
│           │       │   │   │   ├── PackageParserLollipop.java
│           │       │   │   │   ├── PackageParserLollipop22.java
│           │       │   │   │   ├── PackageParserMarshmallow.java
│           │       │   │   │   ├── PackageParserNougat.java
│           │       │   │   │   ├── 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
│           │       │   │   └── location/
│           │       │   │       └── IContextHubService.java
│           │       │   ├── location/
│           │       │   │   ├── ILocationListener.java
│           │       │   │   ├── ILocationManager.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/
│           │       │   │   ├── Build.java
│           │       │   │   ├── Bundle.java
│           │       │   │   ├── Handler.java
│           │       │   │   ├── INetworkManagementService.java
│           │       │   │   ├── IPowerManager.java
│           │       │   │   ├── IUserManager.java
│           │       │   │   ├── Message.java
│           │       │   │   ├── Process.java
│           │       │   │   ├── ServiceManager.java
│           │       │   │   ├── StrictMode.java
│           │       │   │   └── mount/
│           │       │   │       └── IMountService.java
│           │       │   ├── providers/
│           │       │   │   └── Settings.java
│           │       │   ├── renderscript/
│           │       │   │   └── RenderScriptCacheDir.java
│           │       │   ├── rms/
│           │       │   │   └── resource/
│           │       │   │       ├── ReceiverResourceLP.java
│           │       │   │       ├── ReceiverResourceM.java
│           │       │   │       └── ReceiverResourceN.java
│           │       │   ├── service/
│           │       │   │   └── persistentdata/
│           │       │   │       └── IPersistentDataBlockService.java
│           │       │   ├── util/
│           │       │   │   └── Singleton.java
│           │       │   ├── view/
│           │       │   │   ├── Display.java
│           │       │   │   ├── HardwareRenderer.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
│           │   ├── Core.cpp
│           │   ├── Core.h
│           │   ├── Foundation/
│           │   │   ├── IOUniformer.cpp
│           │   │   ├── IOUniformer.h
│           │   │   ├── VMPatch.cpp
│           │   │   └── VMPatch.h
│           │   ├── GodinHook/
│           │   │   ├── godin_type.h
│           │   │   ├── hookinfo.h
│           │   │   ├── instruction/
│           │   │   │   ├── arm_instruction.cpp
│           │   │   │   ├── arm_instruction.h
│           │   │   │   ├── instruction_helper.cpp
│           │   │   │   ├── instruction_helper.h
│           │   │   │   ├── thumb_instruction.cpp
│           │   │   │   └── thumb_instruction.h
│           │   │   ├── mem_helper.cpp
│           │   │   ├── mem_helper.h
│           │   │   ├── native_hook.cpp
│           │   │   ├── native_hook.h
│           │   │   ├── thread_helper.cpp
│           │   │   └── thread_helper.h
│           │   ├── Helper.h
│           │   └── MSHook/
│           │       ├── ARM.cpp
│           │       ├── ARM.h
│           │       ├── CydiaSubstrate.h
│           │       ├── Debug.cpp
│           │       ├── Debug.h
│           │       ├── Hooker.cpp
│           │       ├── Hooker.h
│           │       ├── Log.h
│           │       ├── MSHook.cpp
│           │       ├── MSHook.h
│           │       ├── PosixMemory.cpp
│           │       ├── PosixMemory.h
│           │       ├── SubstrateStruct.h
│           │       ├── Thumb.cpp
│           │       ├── Thumb.h
│           │       ├── hde64.h
│           │       ├── util.cpp
│           │       ├── util.h
│           │       ├── x86.cpp
│           │       ├── x86.h
│           │       ├── x86_64.cpp
│           │       └── x86_64.h
│           ├── libs/
│           │   ├── android-art-interpret-3.0.0.jar
│           │   └── dalvik_hack-3.0.0.5.jar
│           └── 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
Download .txt
Showing preview only (388K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4697 symbols across 496 files)

FILE: app/src/main/java/io/virtualapp/VApp.java
  class VApp (line 27) | public class VApp extends MultiDexApplication {
    method getApp (line 32) | public static VApp getApp() {
    method attachBaseContext (line 36) | @Override
    method onCreate (line 49) | @Override
    method getPreferences (line 93) | public static SharedPreferences getPreferences() {

FILE: app/src/main/java/io/virtualapp/VCommends.java
  class VCommends (line 6) | public class VCommends {

FILE: app/src/main/java/io/virtualapp/abs/BasePresenter.java
  type BasePresenter (line 6) | public interface BasePresenter {
    method start (line 7) | void start();

FILE: 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: 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: app/src/main/java/io/virtualapp/abs/Value.java
  class Value (line 7) | public class Value<T> {

FILE: 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: 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: 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: 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: 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: 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: 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: 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: app/src/main/java/io/virtualapp/delegate/MyComponentDelegate.java
  class MyComponentDelegate (line 12) | public class MyComponentDelegate implements 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

FILE: 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: app/src/main/java/io/virtualapp/delegate/MyTaskDescriptionDelegate.java
  class MyTaskDescriptionDelegate (line 15) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    method getTaskDescription (line 17) | @Override

FILE: 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: 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: 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: app/src/main/java/io/virtualapp/home/HomeActivity.java
  class HomeActivity (line 61) | public class HomeActivity extends VActivity implements HomeContract.Home...
    method goHome (line 79) | public static void goHome(Context context) {
    method onCreate (line 86) | @Override
    method initMenu (line 98) | private void initMenu() {
    method setIconEnable (line 137) | private static void setIconEnable(Menu menu, boolean enable) {
    method bindViews (line 148) | private void bindViews() {
    method initLaunchpad (line 159) | private void initLaunchpad() {
    method onAddAppButtonClick (line 183) | private void onAddAppButtonClick() {
    method deleteApp (line 187) | private void deleteApp(int position) {
    method createShortcut (line 199) | private void createShortcut(int position) {
    method setPresenter (line 206) | @Override
    method showBottomAction (line 211) | @Override
    method hideBottomAction (line 218) | @Override
    method showLoading (line 247) | @Override
    method hideLoading (line 253) | @Override
    method loadFinish (line 259) | @Override
    method loadError (line 266) | @Override
    method showGuide (line 272) | @Override
    method addAppToLauncher (line 277) | @Override
    method removeAppToLauncher (line 296) | @Override
    method refreshLauncherItem (line 301) | @Override
    method askInstallGms (line 306) | @Override
    method onActivityResult (line 324) | @Override
    class LauncherTouchCallback (line 337) | private class LauncherTouchCallback extends ItemTouchHelper.SimpleCall...
      method LauncherTouchCallback (line 344) | LauncherTouchCallback() {
      method interpolateOutOfBoundsScroll (line 348) | @Override
      method getMovementFlags (line 353) | @Override
      method onMove (line 366) | @Override
      method isLongPressDragEnabled (line 374) | @Override
      method isItemViewSwipeEnabled (line 379) | @Override
      method onSelectedChanged (line 384) | @Override
      method canDropOver (line 401) | @Override
      method clearView (line 415) | @Override
      method onSwiped (line 438) | @Override
      method onChildDraw (line 442) | @Override

FILE: 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: app/src/main/java/io/virtualapp/home/HomePresenterImpl.java
  class HomePresenterImpl (line 32) | class HomePresenterImpl implements HomeContract.HomePresenter {
    method HomePresenterImpl (line 43) | HomePresenterImpl(HomeContract.HomeView view) {
    method start (line 63) | @Override
    method launchApp (line 76) | @Override
    method launchAppNoAd (line 87) | public void launchAppNoAd(AppData data) {
    method dataChanged (line 103) | @Override
    method addApp (line 110) | @Override
    method handleOptApp (line 173) | private void handleOptApp(AppData data, String packageName, boolean ne...
    method deleteApp (line 203) | @Override
    method createShortcut (line 218) | @Override

FILE: 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: 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: 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: 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: 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 87) | @Override
    method onResume (line 93) | @Override
    method onPause (line 99) | @Override

FILE: 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: 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: 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: 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: app/src/main/java/io/virtualapp/home/ads/AdScheduler.java
  class AdScheduler (line 7) | public class AdScheduler {
    method AdScheduler (line 12) | public AdScheduler(long adDeltaTime) {
    method adShowed (line 16) | public void adShowed() {
    method shouldShowAd (line 20) | public boolean shouldShowAd() {

FILE: 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: 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: app/src/main/java/io/virtualapp/home/models/AppInfo.java
  class AppInfo (line 9) | public class AppInfo {

FILE: 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: 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: 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: 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: 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: 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: 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: 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: 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: app/src/main/java/io/virtualapp/splash/SplashActivity.java
  class SplashActivity (line 18) | public class SplashActivity extends VActivity {
    method onCreate (line 22) | @Override
    method showBanner (line 49) | private void showBanner() {
    method doActionInThread (line 55) | private void doActionInThread() {

FILE: app/src/main/java/io/virtualapp/vs/VSManagerActivity.java
  class VSManagerActivity (line 11) | public class VSManagerActivity extends VActivity {

FILE: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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 41) | public class Package {
    class Service (line 70) | public final class Service extends Component<ServiceIntentInfo> {
    class Provider (line 74) | public final class Provider extends Component<ProviderIntentInfo> {
    class Instrumentation (line 78) | public final class Instrumentation extends Component<IntentInfo> {
    class Permission (line 82) | public final class Permission extends Component<IntentInfo> {
    class PermissionGroup (line 86) | public final class PermissionGroup extends Component<IntentInfo> {
    class ActivityIntentInfo (line 90) | public class ActivityIntentInfo extends IntentInfo {
    class ServiceIntentInfo (line 95) | public class ServiceIntentInfo extends IntentInfo {
    class ProviderIntentInfo (line 99) | public class ProviderIntentInfo extends IntentInfo {

FILE: lib/src/main/java/com/lody/virtual/Build.java
  class Build (line 11) | public class Build {

FILE: 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: lib/src/main/java/com/lody/virtual/client/NativeEngine.java
  class NativeEngine (line 27) | public class NativeEngine {
    method startDexOverride (line 48) | public static void startDexOverride() {
    method getRedirectedPath (line 60) | public static String getRedirectedPath(String origPath) {
    method restoreRedirectedPath (line 69) | public static String restoreRedirectedPath(String origPath) {
    method redirectDirectory (line 78) | public static void redirectDirectory(String origPath, String newPath) {
    method redirectFile (line 92) | public static void redirectFile(String origPath, String newPath) {
    method readOnly (line 107) | public static void readOnly(String path) {
    method hook (line 115) | public static void hook() {
    method hookNative (line 128) | static void hookNative() {
    method onKillProcess (line 141) | public static void onKillProcess(int pid, int signal) {
    method onGetCallingUid (line 148) | public static int onGetCallingUid(int originUid) {
    method onOpenDexFileNative (line 165) | public static void onOpenDexFileNative(String[] params) {
    method nativeHookNative (line 182) | private static native void nativeHookNative(Object method, String host...
    method nativeMark (line 184) | private static native void nativeMark();
    method nativeRestoreRedirectedPath (line 186) | private static native String nativeRestoreRedirectedPath(String redire...
    method nativeGetRedirectedPath (line 188) | private static native String nativeGetRedirectedPath(String orgPath);
    method nativeRedirect (line 190) | private static native void nativeRedirect(String origPath, String newP...
    method nativeReadOnly (line 192) | private static native void nativeReadOnly(String path);
    method nativeStartUniformer (line 194) | private static native void nativeStartUniformer(String selfSoPath, int...
    method onGetUid (line 196) | public static int onGetUid(int uid) {

FILE: lib/src/main/java/com/lody/virtual/client/VClientImpl.java
  class VClientImpl (line 82) | public final class VClientImpl extends IVClient.Stub {
    method get (line 100) | public static VClientImpl get() {
    method isBound (line 104) | public boolean isBound() {
    method getDeviceInfo (line 108) | public VDeviceInfo getDeviceInfo() {
    method getCurrentApplication (line 112) | public Application getCurrentApplication() {
    method getCurrentPackage (line 116) | public String getCurrentPackage() {
    method getCurrentApplicationInfo (line 120) | public ApplicationInfo getCurrentApplicationInfo() {
    method getCrashHandler (line 124) | public CrashHandler getCrashHandler() {
    method setCrashHandler (line 128) | public void setCrashHandler(CrashHandler crashHandler) {
    method getVUid (line 132) | public int getVUid() {
    method getBaseVUid (line 136) | public int getBaseVUid() {
    method getClassLoader (line 140) | public ClassLoader getClassLoader(ApplicationInfo appInfo) {
    method sendMessage (line 145) | private void sendMessage(int what, Object obj) {
    method getAppThread (line 152) | @Override
    method getToken (line 157) | @Override
    method initProcess (line 162) | public void initProcess(IBinder token, int vuid) {
    method handleNewIntent (line 168) | private void handleNewIntent(NewIntentData data) {
    method bindApplication (line 190) | public void bindApplication(final String packageName, final String pro...
    method bindApplicationNoCheck (line 208) | private void bindApplicationNoCheck(String packageName, String process...
    method setupUncaughtHandler (line 354) | private void setupUncaughtHandler() {
    method startIOUniformer (line 390) | @SuppressLint("SdCardPath")
    method getMountPoints (line 425) | @SuppressLint("SdCardPath")
    method createPackageContext (line 438) | private Context createPackageContext(String packageName) {
    method fixBoundApp (line 449) | private Object fixBoundApp(AppBindData data) {
    method installContentProviders (line 462) | private void installContentProviders(Context app, List<ProviderInfo> p...
    method acquireProviderClient (line 476) | @Override
    method fixInstalledProviders (line 508) | private void fixInstalledProviders() {
    method clearSettingProvider (line 548) | private void clearSettingProvider() {
    method clearContentProvider (line 566) | private static void clearContentProvider(Object cache) {
    method finishActivity (line 577) | @Override
    method scheduleNewIntent (line 584) | @Override
    method scheduleReceiver (line 593) | @Override
    method handleReceiver (line 603) | private void handleReceiver(ReceiverData data) {
    method createProxyService (line 635) | @Override
    method getDebugInfo (line 640) | @Override
    class RootThreadGroup (line 647) | private static class RootThreadGroup extends ThreadGroup {
      method RootThreadGroup (line 649) | RootThreadGroup(ThreadGroup parent) {
      method uncaughtException (line 653) | @Override
    class NewIntentData (line 665) | private final class NewIntentData {
    class AppBindData (line 671) | private final class AppBindData {
    class ReceiverData (line 678) | private final class ReceiverData {
    class H (line 685) | private class H extends Handler {
      method H (line 687) | private H() {
      method handleMessage (line 691) | @Override

FILE: 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: lib/src/main/java/com/lody/virtual/client/core/InstallStrategy.java
  type InstallStrategy (line 8) | public interface InstallStrategy {

FILE: lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java
  class InvocationStubManager (line 67) | public final class InvocationStubManager {
    method InvocationStubManager (line 74) | private InvocationStubManager() {
    method getInstance (line 77) | public static InvocationStubManager getInstance() {
    method injectAll (line 81) | void injectAll() throws Throwable {
    method isInit (line 92) | public boolean isInit() {
    method init (line 97) | public void init() throws Throwable {
    method injectInternal (line 106) | private void injectInternal() throws Throwable {
    method addInjector (line 182) | private void addInjector(IInjector IInjector) {
    method findInjector (line 186) | public <T extends IInjector> T findInjector(Class<T> clazz) {
    method checkEnv (line 191) | public <T extends IInjector> void checkEnv(Class<T> clazz) {
    method getInvocationStub (line 202) | public <T extends IInjector, H extends MethodInvocationStub> H getInvo...

FILE: lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java
  class VirtualCore (line 57) | public final class VirtualCore {
    method VirtualCore (line 95) | private VirtualCore() {
    method get (line 98) | public static VirtualCore get() {
    method getPM (line 102) | public static PackageManager getPM() {
    method mainThread (line 106) | public static Object mainThread() {
    method getInitLock (line 110) | public ConditionVariable getInitLock() {
    method myUid (line 114) | public int myUid() {
    method myUserId (line 118) | public int myUserId() {
    method getComponentDelegate (line 122) | public ComponentDelegate getComponentDelegate() {
    method setComponentDelegate (line 126) | public void setComponentDelegate(ComponentDelegate delegate) {
    method getPhoneInfoDelegate (line 130) | public PhoneInfoDelegate getPhoneInfoDelegate() {
    method setPhoneInfoDelegate (line 134) | public void setPhoneInfoDelegate(PhoneInfoDelegate phoneInfoDelegate) {
    method setCrashHandler (line 138) | public void setCrashHandler(CrashHandler handler) {
    method getTaskDescriptionDelegate (line 142) | public TaskDescriptionDelegate getTaskDescriptionDelegate() {
    method setTaskDescriptionDelegate (line 146) | public void setTaskDescriptionDelegate(TaskDescriptionDelegate taskDes...
    method getGids (line 150) | public int[] getGids() {
    method getContext (line 154) | public Context getContext() {
    method getPackageManager (line 158) | public PackageManager getPackageManager() {
    method getHostPkg (line 162) | public String getHostPkg() {
    method getUnHookPackageManager (line 166) | public PackageManager getUnHookPackageManager() {
    method startup (line 171) | public void startup(Context context) throws Throwable {
    method waitForEngine (line 199) | public void waitForEngine() {
    method isEngineLaunched (line 203) | public boolean isEngineLaunched() {
    method getEngineProcessName (line 214) | public String getEngineProcessName() {
    method initialize (line 218) | public void initialize(VirtualInitializer initializer) {
    method detectProcessType (line 238) | private void detectProcessType() {
    method getService (line 259) | private IAppManager getService() {
    method getStubInterface (line 270) | private Object getStubInterface() {
    method isVAppProcess (line 278) | public boolean isVAppProcess() {
    method isMainProcess (line 285) | public boolean isMainProcess() {
    method isChildProcess (line 292) | public boolean isChildProcess() {
    method isServerProcess (line 299) | public boolean isServerProcess() {
    method getProcessName (line 306) | public String getProcessName() {
    method getMainProcessName (line 313) | public String getMainProcessName() {
    method preOpt (line 323) | public void preOpt(String pkg) throws IOException {
    method isAppRunning (line 337) | public boolean isAppRunning(String packageName, int userId) {
    method installPackage (line 341) | public InstallResult installPackage(String apkPath, int flags) {
    method addVisibleOutsidePackage (line 350) | public void addVisibleOutsidePackage(String pkg) {
    method removeVisibleOutsidePackage (line 358) | public void removeVisibleOutsidePackage(String pkg) {
    method isOutsidePackageVisible (line 366) | public boolean isOutsidePackageVisible(String pkg) {
    method isAppInstalled (line 374) | public boolean isAppInstalled(String pkg) {
    method isPackageLaunchable (line 382) | public boolean isPackageLaunchable(String packageName) {
    method getLaunchIntent (line 388) | public Intent getLaunchIntent(String packageName, int userId) {
    method createShortcut (line 413) | public boolean createShortcut(int userId, String packageName, OnEmitSh...
    method createShortcut (line 417) | public boolean createShortcut(int userId, String packageName, Intent s...
    method removeShortcut (line 466) | public boolean removeShortcut(int userId, String packageName, Intent s...
    class UiCallback (line 508) | public abstract static class UiCallback extends IUiCallback.Stub {
    method setUiCallback (line 511) | public void setUiCallback(Intent intent, IUiCallback callback) {
    method getInstalledAppInfo (line 519) | public InstalledAppInfo getInstalledAppInfo(String pkg, int flags) {
    method getInstalledAppCount (line 527) | public int getInstalledAppCount() {
    method isStartup (line 535) | public boolean isStartup() {
    method uninstallPackageAsUser (line 539) | public boolean uninstallPackageAsUser(String pkgName, int userId) {
    method uninstallPackage (line 548) | public boolean uninstallPackage(String pkgName) {
    method getResources (line 557) | public Resources getResources(String pkg) throws Resources.NotFoundExc...
    method resolveActivityInfo (line 568) | public synchronized ActivityInfo resolveActivityInfo(Intent intent, in...
    method resolveActivityInfo (line 589) | public ActivityInfo resolveActivityInfo(ComponentName componentName, i...
    method resolveServiceInfo (line 593) | public ServiceInfo resolveServiceInfo(Intent intent, int userId) {
    method killApp (line 602) | public void killApp(String pkg, int userId) {
    method killAllApps (line 606) | public void killAllApps() {
    method getInstalledApps (line 610) | public List<InstalledAppInfo> getInstalledApps(int flags) {
    method getInstalledAppsAsUser (line 618) | public List<InstalledAppInfo> getInstalledAppsAsUser(int userId, int f...
    method clearAppRequestListener (line 626) | public void clearAppRequestListener() {
    method scanApps (line 634) | public void scanApps() {
    method getAppRequestListener (line 642) | public IAppRequestListener getAppRequestListener() {
    method setAppRequestListener (line 650) | public void setAppRequestListener(final AppRequestListener listener) {
    method isPackageLaunched (line 679) | public boolean isPackageLaunched(int userId, String packageName) {
    method setPackageHidden (line 687) | public void setPackageHidden(int userId, String packageName, boolean h...
    method installPackageAsUser (line 695) | public boolean installPackageAsUser(int userId, String packageName) {
    method isAppInstalledAsUser (line 703) | public boolean isAppInstalledAsUser(int userId, String packageName) {
    method getPackageInstalledUsers (line 711) | public int[] getPackageInstalledUsers(String packageName) {
    class PackageObserver (line 719) | public abstract static class PackageObserver extends IPackageObserver....
    method registerObserver (line 722) | public void registerObserver(IPackageObserver observer) {
    method unregisterObserver (line 730) | public void unregisterObserver(IPackageObserver observer) {
    method isOutsideInstalled (line 739) | public boolean isOutsideInstalled(String packageName) {
    method getSystemPid (line 749) | public int getSystemPid() {
    type ProcessType (line 756) | private enum ProcessType {
    type AppRequestListener (line 775) | public interface AppRequestListener {
      method onRequestInstall (line 776) | void onRequestInstall(String path);
      method onRequestUninstall (line 778) | void onRequestUninstall(String pkg);
    type OnEmitShortcutListener (line 781) | public interface OnEmitShortcutListener {
      method getIcon (line 782) | Bitmap getIcon(Bitmap originIcon);
      method getName (line 784) | String getName(String originName);
    class VirtualInitializer (line 787) | public static abstract class VirtualInitializer {
      method onMainProcess (line 788) | public void onMainProcess() {
      method onVirtualProcess (line 791) | public void onVirtualProcess() {
      method onServerProcess (line 794) | public void onServerProcess() {
      method onChildProcess (line 797) | public void onChildProcess() {

FILE: lib/src/main/java/com/lody/virtual/client/env/Constants.java
  class Constants (line 12) | public class Constants {

FILE: 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: lib/src/main/java/com/lody/virtual/client/env/SpecialComponentList.java
  class SpecialComponentList (line 23) | public final class SpecialComponentList {
    method isSpecSystemPackage (line 89) | public static boolean isSpecSystemPackage(String pkg) {
    method isConflictingInstrumentation (line 93) | public static boolean isConflictingInstrumentation(String packageName) {
    method isActionInBlackList (line 102) | public static boolean isActionInBlackList(String action) {
    method addBlackAction (line 111) | public static void addBlackAction(String action) {
    method protectIntentFilter (line 115) | public static void protectIntentFilter(IntentFilter filter) {
    method protectIntent (line 136) | public static void protectIntent(Intent intent) {
    method unprotectIntent (line 143) | public static void unprotectIntent(Intent intent) {
    method protectAction (line 150) | public static String protectAction(String originAction) {
    method unprotectAction (line 164) | public static String unprotectAction(String action) {
    method isWhitePermission (line 180) | public static boolean isWhitePermission(String permission) {

FILE: lib/src/main/java/com/lody/virtual/client/env/VirtualRuntime.java
  class VirtualRuntime (line 23) | public class VirtualRuntime {
    method getUIHandler (line 30) | public static Handler getUIHandler() {
    method getProcessName (line 34) | public static String getProcessName() {
    method getInitialPackageName (line 38) | public static String getInitialPackageName() {
    method setupRuntime (line 42) | public static void setupRuntime(String processName, ApplicationInfo ap...
    method crash (line 57) | public static <T> T crash(RemoteException e) throws RuntimeException {
    method isArt (line 67) | public static boolean isArt() {

FILE: 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: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/base/BinderInvocationStub.java
  class BinderInvocationStub (line 24) | @SuppressWarnings("unchecked")
    method BinderInvocationStub (line 30) | public BinderInvocationStub(RefStaticMethod<IInterface> asInterfaceMet...
    method BinderInvocationStub (line 34) | public BinderInvocationStub(Class<?> stubClass, IBinder binder) {
    method BinderInvocationStub (line 39) | public BinderInvocationStub(IInterface mBaseInterface) {
    method asInterface (line 45) | private static IInterface asInterface(RefStaticMethod<IInterface> asIn...
    method asInterface (line 52) | private static IInterface asInterface(Class<?> stubClass, IBinder bind...
    method replaceService (line 65) | public void replaceService(String name) {
    class AsBinder (line 71) | private final class AsBinder extends MethodProxy {
      method getMethodName (line 73) | @Override
      method call (line 78) | @Override
    method getInterfaceDescriptor (line 85) | @Override
    method getContext (line 90) | public Context getContext() {
    method pingBinder (line 94) | @Override
    method isBinderAlive (line 99) | @Override
    method queryLocalInterface (line 104) | @Override
    method dump (line 109) | @Override
    method dumpAsync (line 114) | @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    method transact (line 120) | @Override
    method linkToDeath (line 125) | @Override
    method unlinkToDeath (line 130) | @Override
    method getBaseBinder (line 135) | public IBinder getBaseBinder() {

FILE: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/base/MethodInvocationProxy.java
  class MethodInvocationProxy (line 26) | public abstract class MethodInvocationProxy<T extends MethodInvocationSt...
    method MethodInvocationProxy (line 30) | public MethodInvocationProxy(T invocationStub) {
    method onBindMethods (line 41) | protected void onBindMethods() {
    method addMethodProxy (line 63) | private void addMethodProxy(Class<?> hookType) {
    method addMethodProxy (line 81) | public MethodProxy addMethodProxy(MethodProxy methodProxy) {
    method afterHookApply (line 85) | protected void afterHookApply(T delegate) {
    method inject (line 88) | @Override
    method getContext (line 91) | public Context getContext() {
    method getInvocationStub (line 95) | public T getInvocationStub() {

FILE: 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: 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 getHostContext (line 35) | protected static Context getHostContext() {
    method isAppProcess (line 39) | protected static boolean isAppProcess() {
    method isServerProcess (line 43) | protected static boolean isServerProcess() {
    method isMainProcess (line 47) | protected static boolean isMainProcess() {
    method getVUid (line 51) | protected static int getVUid() {
    method getAppUserId (line 55) | protected static int getAppUserId() {
    method getBaseVUid (line 59) | protected static int getBaseVUid() {
    method getRealUid (line 63) | protected static int getRealUid() {
    method getDeviceInfo (line 67) | protected static VDeviceInfo getDeviceInfo() {
    method isVisiblePackage (line 71) | public static boolean isVisiblePackage(ApplicationInfo info) {
    method getMethodName (line 77) | public abstract String getMethodName();
    method beforeCall (line 79) | public boolean beforeCall(Object who, Method method, Object... args) {
    method call (line 83) | public Object call(Object who, Method method, Object... args) throws T...
    method afterCall (line 87) | public Object afterCall(Object who, Method method, Object[] args, Obje...
    method isEnable (line 91) | public boolean isEnable() {
    method setEnable (line 95) | public void setEnable(boolean enable) {
    method getInvocationLoggingCondition (line 99) | public LogInvocation.Condition getInvocationLoggingCondition() {
    method setInvocationloggingCondition (line 103) | public void setInvocationloggingCondition(LogInvocation.Condition invo...
    method isAppPkg (line 107) | public boolean isAppPkg(String pkg) {
    method getPM (line 111) | protected PackageManager getPM() {
    method toString (line 115) | @Override

FILE: 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: 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: 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: 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: 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: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/delegate/AppInstrumentation.java
  class AppInstrumentation (line 28) | public final class AppInstrumentation extends InstrumentationDelegate im...
    method AppInstrumentation (line 34) | private AppInstrumentation(Instrumentation base) {
    method getDefault (line 38) | public static AppInstrumentation getDefault() {
    method create (line 49) | private static AppInstrumentation create() {
    method inject (line 58) | @Override
    method isEnvBad (line 64) | @Override
    method callActivityOnCreate (line 69) | @Override
    method callActivityOnResume (line 98) | @Override
    method callActivityOnDestroy (line 122) | @Override
    method callActivityOnPause (line 129) | @Override
    method callApplicationOnCreate (line 137) | @Override

FILE: lib/src/main/java/com/lody/virtual/client/hook/delegate/ComponentDelegate.java
  type ComponentDelegate (line 8) | public interface ComponentDelegate {
    method beforeActivityCreate (line 12) | @Override
    method beforeActivityResume (line 17) | @Override
    method beforeActivityPause (line 22) | @Override
    method beforeActivityDestroy (line 27) | @Override
    method afterActivityCreate (line 32) | @Override
    method afterActivityResume (line 37) | @Override
    method afterActivityPause (line 42) | @Override
    method afterActivityDestroy (line 47) | @Override
    method onSendBroadcast (line 52) | @Override
    method beforeActivityCreate (line 58) | void beforeActivityCreate(Activity activity);
    method beforeActivityResume (line 60) | void beforeActivityResume(Activity activity);
    method beforeActivityPause (line 62) | void beforeActivityPause(Activity activity);
    method beforeActivityDestroy (line 64) | void beforeActivityDestroy(Activity activity);
    method afterActivityCreate (line 66) | void afterActivityCreate(Activity activity);
    method afterActivityResume (line 68) | void afterActivityResume(Activity activity);
    method afterActivityPause (line 70) | void afterActivityPause(Activity activity);
    method afterActivityDestroy (line 72) | void afterActivityDestroy(Activity activity);
    method onSendBroadcast (line 74) | void onSendBroadcast(Intent intent);

FILE: 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: 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: 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: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/providers/ProviderHook.java
  class ProviderHook (line 29) | public class ProviderHook implements InvocationHandler {
    method fetch (line 35) | @Override
    method fetch (line 41) | @Override
    method ProviderHook (line 50) | public ProviderHook(Object base) {
    method fetchHook (line 54) | private static HookFetcher fetchHook(String authority) {
    method createProxy (line 70) | private static IInterface createProxy(IInterface provider, ProviderHoo...
    method createProxy (line 79) | public static IInterface createProxy(boolean external, String authorit...
    method call (line 94) | public Bundle call(MethodBox methodBox, String method, String arg, Bun...
    method insert (line 98) | public Uri insert(MethodBox methodBox, Uri url, ContentValues initialV...
    method query (line 103) | public Cursor query(MethodBox methodBox, Uri url, String[] projection,...
    method getType (line 108) | public String getType(MethodBox methodBox, Uri url) throws InvocationT...
    method bulkInsert (line 112) | public int bulkInsert(MethodBox methodBox, Uri url, ContentValues[] in...
    method delete (line 116) | public int delete(MethodBox methodBox, Uri url, String selection, Stri...
    method update (line 120) | public int update(MethodBox methodBox, Uri url, ContentValues values, ...
    method openFile (line 125) | public ParcelFileDescriptor openFile(MethodBox methodBox, Uri url, Str...
    method openAssetFile (line 129) | public AssetFileDescriptor openAssetFile(MethodBox methodBox, Uri url,...
    method invoke (line 133) | @Override
    method processArgs (line 196) | protected void processArgs(Method method, Object... args) {
    type HookFetcher (line 200) | public interface HookFetcher {
      method fetch (line 201) | ProviderHook fetch(boolean external, IInterface provider);

FILE: 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 79) | private Bundle wrapBundle(String name, String value) {
    method processArgs (line 90) | @Override

FILE: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/proxies/am/ActivityManagerStub.java
  class ActivityManagerStub (line 42) | @LogInvocation(LogInvocation.Condition.ALWAYS)
    method ActivityManagerStub (line 46) | public ActivityManagerStub() {
    method inject (line 50) | @Override
    method onBindMethods (line 69) | @Override
    method isEnvBad (line 124) | @Override
    class isUserRunning (line 129) | private class isUserRunning extends MethodProxy {
      method getMethodName (line 130) | @Override
      method call (line 135) | @Override

FILE: lib/src/main/java/com/lody/virtual/client/hook/proxies/am/HCallbackStub.java
  class HCallbackStub (line 29) | public class HCallbackStub implements Handler.Callback, IInjector {
    method HCallbackStub (line 45) | private HCallbackStub() {
    method getDefault (line 48) | public static HCallbackStub getDefault() {
    method getH (line 52) | private static Handler getH() {
    method getHCallback (line 56) | private static Handler.Callback getHCallback() {
    method handleMessage (line 66) | @Override
    method handleLaunchActivity (line 98) | private boolean handleLaunchActivity(Message msg) {
    method inject (line 144) | @Override
    method isEnvBad (line 150) | @Override

FILE: lib/src/main/java/com/lody/virtual/client/hook/proxies/am/MethodProxies.java
  class MethodProxies (line 78) | @SuppressWarnings("unused")
    class ForceStopPackage (line 82) | static class ForceStopPackage extends MethodProxy {
      method getMethodName (line 84) | @Override
      method call (line 89) | @Override
      method isEnable (line 97) | @Override
    class CrashApplication (line 104) | static class CrashApplication extends MethodProxy {
      method getMethodName (line 106) | @Override
      method call (line 111) | @Override
      method isEnable (line 116) | @Override
    class AddPackageDependency (line 123) | static class AddPackageDependency extends MethodProxy {
      method getMethodName (line 125) | @Override
      method call (line 130) | @Override
      method isEnable (line 136) | @Override
    class GetPackageForToken (line 142) | static class GetPackageForToken extends MethodProxy {
      method getMethodName (line 144) | @Override
      method call (line 149) | @Override
    class UnbindService (line 160) | static class UnbindService extends MethodProxy {
      method getMethodName (line 162) | @Override
      method call (line 167) | @Override
      method isEnable (line 177) | @Override
    class GetContentProviderExternal (line 183) | static class GetContentProviderExternal extends GetContentProvider {
      method getMethodName (line 185) | @Override
      method getProviderNameIndex (line 190) | @Override
      method isEnable (line 195) | @Override
    class StartVoiceActivity (line 201) | static class StartVoiceActivity extends StartActivity {
      method getMethodName (line 202) | @Override
      method call (line 207) | @Override
    class UnstableProviderDied (line 214) | static class UnstableProviderDied extends MethodProxy {
      method getMethodName (line 216) | @Override
      method call (line 221) | @Override
    class PeekService (line 231) | static class PeekService extends MethodProxy {
      method getMethodName (line 233) | @Override
      method call (line 238) | @Override
      method isEnable (line 246) | @Override
    class GetPackageAskScreenCompat (line 253) | static class GetPackageAskScreenCompat extends MethodProxy {
      method getMethodName (line 255) | @Override
      method call (line 260) | @Override
      method isEnable (line 271) | @Override
    class GetIntentSender (line 278) | static class GetIntentSender extends MethodProxy {
      method getMethodName (line 280) | @Override
      method call (line 285) | @Override
      method redirectIntentSender (line 317) | private Intent redirectIntentSender(int type, String creator, Intent...
      method isEnable (line 349) | @Override
    class StartActivity (line 357) | static class StartActivity extends MethodProxy {
      method getMethodName (line 362) | @Override
      method call (line 367) | @Override
      method handleInstallRequest (line 465) | private boolean handleInstallRequest(Intent intent) {
      method handleUninstallRequest (line 483) | private boolean handleUninstallRequest(Intent intent) {
    class StartActivities (line 503) | static class StartActivities extends MethodProxy {
      method getMethodName (line 505) | @Override
      method call (line 510) | @Override
      method isEnable (line 523) | @Override
    class FinishActivity (line 530) | static class FinishActivity extends MethodProxy {
      method getMethodName (line 531) | @Override
      method afterCall (line 536) | @Override
      method isEnable (line 563) | @Override
    class GetCallingPackage (line 570) | static class GetCallingPackage extends MethodProxy {
      method getMethodName (line 572) | @Override
      method call (line 577) | @Override
      method isEnable (line 583) | @Override
    class GetPackageForIntentSender (line 590) | static class GetPackageForIntentSender extends MethodProxy {
      method getMethodName (line 591) | @Override
      method call (line 596) | @Override
      method isEnable (line 608) | @Override
    class PublishContentProviders (line 615) | @SuppressWarnings("unchecked")
      method getMethodName (line 618) | @Override
      method call (line 623) | @Override
      method isEnable (line 628) | @Override
    class GetServices (line 635) | static class GetServices extends MethodProxy {
      method getMethodName (line 636) | @Override
      method call (line 641) | @Override
      method isEnable (line 648) | @Override
    class GrantUriPermissionFromOwner (line 654) | static class GrantUriPermissionFromOwner extends MethodProxy {
      method getMethodName (line 656) | @Override
      method call (line 661) | @Override
      method isEnable (line 667) | @Override
    class SetServiceForeground (line 673) | static class SetServiceForeground extends MethodProxy {
      method getMethodName (line 675) | @Override
      method call (line 680) | @Override
      method isEnable (line 699) | @Override
    class UpdateDeviceOwner (line 706) | static class UpdateDeviceOwner extends MethodProxy {
      method getMethodName (line 708) | @Override
      method call (line 713) | @Override
      method isEnable (line 719) | @Override
    class GetIntentForIntentSender (line 727) | static class GetIntentForIntentSender extends MethodProxy {
      method getMethodName (line 729) | @Override
      method afterCall (line 734) | @Override
    class UnbindFinished (line 745) | static class UnbindFinished extends MethodProxy {
      method getMethodName (line 747) | @Override
      method call (line 752) | @Override
      method isEnable (line 761) | @Override
    class StartActivityIntentSender (line 767) | static class StartActivityIntentSender extends MethodProxy {
      method getMethodName (line 768) | @Override
      method call (line 773) | @Override
    class BindService (line 781) | static class BindService extends MethodProxy {
      method getMethodName (line 783) | @Override
      method call (line 788) | @Override
      method isEnable (line 815) | @Override
    class StartService (line 822) | static class StartService extends MethodProxy {
      method getMethodName (line 824) | @Override
      method call (line 829) | @Override
      method isEnable (line 859) | @Override
    class StartActivityAndWait (line 865) | static class StartActivityAndWait extends StartActivity {
      method getMethodName (line 866) | @Override
      method call (line 871) | @Override
    class PublishService (line 878) | static class PublishService extends MethodProxy {
      method getMethodName (line 880) | @Override
      method call (line 885) | @Override
      method isEnable (line 897) | @Override
    class GetRunningAppProcesses (line 904) | @SuppressWarnings("unchecked")
      method getMethodName (line 907) | @Override
      method call (line 912) | @Override
    class SetPackageAskScreenCompat (line 934) | static class SetPackageAskScreenCompat extends MethodProxy {
      method getMethodName (line 936) | @Override
      method call (line 941) | @Override
      method isEnable (line 952) | @Override
    class GetCallingActivity (line 959) | static class GetCallingActivity extends MethodProxy {
      method getMethodName (line 961) | @Override
      method call (line 966) | @Override
      method isEnable (line 972) | @Override
    class GetCurrentUser (line 979) | static class GetCurrentUser extends MethodProxy {
      method getMethodName (line 981) | @Override
      method call (line 986) | @Override
    class KillApplicationProcess (line 998) | static class KillApplicationProcess extends MethodProxy {
      method getMethodName (line 1000) | @Override
      method call (line 1005) | @Override
      method isEnable (line 1016) | @Override
    class StartActivityAsUser (line 1023) | static class StartActivityAsUser extends StartActivity {
      method getMethodName (line 1025) | @Override
      method call (line 1030) | @Override
    class CheckPermission (line 1037) | static class CheckPermission extends MethodProxy {
      method getMethodName (line 1039) | @Override
      method call (line 1044) | @Override
      method isEnable (line 1057) | @Override
    class StartActivityAsCaller (line 1065) | static class StartActivityAsCaller extends StartActivity {
      method getMethodName (line 1067) | @Override
    class HandleIncomingUser (line 1074) | static class HandleIncomingUser extends MethodProxy {
      method getMethodName (line 1076) | @Override
      method call (line 1081) | @Override
      method isEnable (line 1090) | @Override
    class GetTasks (line 1098) | @SuppressWarnings("unchecked")
      method getMethodName (line 1101) | @Override
      method call (line 1106) | @Override
      method isEnable (line 1120) | @Override
    class GetPersistedUriPermissions (line 1127) | static class GetPersistedUriPermissions extends MethodProxy {
      method getMethodName (line 1129) | @Override
      method call (line 1134) | @Override
      method isEnable (line 1140) | @Override
    class RegisterReceiver (line 1147) | static class RegisterReceiver extends MethodProxy {
      method getMethodName (line 1161) | @Override
      method call (line 1166) | @Override
      method isEnable (line 1201) | @Override
      class IIntentReceiverProxy (line 1206) | private static class IIntentReceiverProxy extends IIntentReceiver.St...
        method IIntentReceiverProxy (line 1210) | IIntentReceiverProxy(IInterface old) {
        method performReceive (line 1214) | public void performReceive(Intent intent, int resultCode, String d...
        method accept (line 1230) | private boolean accept(Intent intent) {
        method performReceive (line 1239) | @SuppressWarnings("unused")
    class StopService (line 1249) | static class StopService extends MethodProxy {
      method getMethodName (line 1251) | @Override
      method call (line 1256) | @Override
      method isEnable (line 1276) | @Override
    class GetContentProvider (line 1283) | static class GetContentProvider extends MethodProxy {
      method getMethodName (line 1285) | @Override
      method call (line 1290) | @Override
      method getProviderNameIndex (line 1352) | public int getProviderNameIndex() {
      method isEnable (line 1356) | @Override
    class SetTaskDescription (line 1362) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
      method getMethodName (line 1364) | @Override
      method call (line 1369) | @Override
      method isEnable (line 1406) | @Override
    class StopServiceToken (line 1412) | static class StopServiceToken extends MethodProxy {
      method getMethodName (line 1414) | @Override
      method call (line 1419) | @Override
      method isEnable (line 1433) | @Override
    class StartActivityWithConfig (line 1439) | static class StartActivityWithConfig extends StartActivity {
      method getMethodName (line 1440) | @Override
      method call (line 1445) | @Override
    class StartNextMatchingActivity (line 1451) | static class StartNextMatchingActivity extends StartActivity {
      method getMethodName (line 1452) | @Override
      method call (line 1457) | @Override
    class BroadcastIntent (line 1464) | static class BroadcastIntent extends MethodProxy {
      method getMethodName (line 1466) | @Override
      method call (line 1471) | @Override
      method handleIntent (line 1494) | private Intent handleIntent(final Intent intent) {
      method handleInstallShortcutIntent (line 1511) | private Intent handleInstallShortcutIntent(Intent intent) {
      method handleUninstallShortcutIntent (line 1549) | private void handleUninstallShortcutIntent(Intent intent) {
      method isEnable (line 1563) | @Override
    class GetActivityClassForToken (line 1570) | static class GetActivityClassForToken extends MethodProxy {
      method getMethodName (line 1572) | @Override
      method call (line 1577) | @Override
      method isEnable (line 1583) | @Override
    class CheckGrantUriPermission (line 1590) | static class CheckGrantUriPermission extends MethodProxy {
      method getMethodName (line 1592) | @Override
      method call (line 1597) | @Override
      method isEnable (line 1603) | @Override
    class ServiceDoneExecuting (line 1610) | static class ServiceDoneExecuting extends MethodProxy {
      method getMethodName (line 1612) | @Override
      method call (line 1617) | @Override
      method isEnable (line 1630) | @Override

FILE: 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: 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: 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: 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: 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 26) | @Override
    class GetAddress (line 32) | @Mark("fake MAC")
      method GetAddress (line 35) | GetAddress() {
      method call (line 39) | @Override

FILE: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/proxies/context_hub/ContextHubServiceStub.java
  class ContextHubServiceStub (line 8) | public class ContextHubServiceStub extends BinderInvocationProxy {
    method ContextHubServiceStub (line 10) | public ContextHubServiceStub() {
    method onBindMethods (line 14) | @Override

FILE: 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: 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: 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: 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: 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: 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 MethodProxy {
      method getMethodName (line 18) | @Override
      method call (line 23) | @Override
    class WindowGainedFocus (line 34) | static class WindowGainedFocus extends MethodProxy {
      method getMethodName (line 39) | @Override
      method call (line 44) | @Override

FILE: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/proxies/job/JobServiceStub.java
  class JobServiceStub (line 21) | @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    method JobServiceStub (line 24) | public JobServiceStub() {
    method onBindMethods (line 28) | @Override
    class schedule (line 38) | private class schedule extends MethodProxy {
      method getMethodName (line 40) | @Override
      method call (line 45) | @Override
    class getAllPendingJobs (line 52) | private class getAllPendingJobs extends MethodProxy {
      method getMethodName (line 54) | @Override
      method call (line 59) | @Override
    class cancelAll (line 65) | private class cancelAll extends MethodProxy {
      method getMethodName (line 67) | @Override
      method call (line 72) | @Override
    class cancel (line 79) | private class cancel extends MethodProxy {
      method getMethodName (line 81) | @Override
      method call (line 86) | @Override

FILE: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/proxies/location/LocationManagerStub.java
  class LocationManagerStub (line 20) | public class LocationManagerStub extends BinderInvocationProxy {
    method LocationManagerStub (line 21) | public LocationManagerStub() {
    class BaseMethodProxy (line 25) | private static class BaseMethodProxy extends ReplaceLastPkgMethodProxy {
      method BaseMethodProxy (line 27) | public BaseMethodProxy(String name) {
      method call (line 30) | @Override
    method onBindMethods (line 45) | @Override

FILE: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/proxies/mount/MountServiceStub.java
  class MountServiceStub (line 11) | @Inject(MethodProxies.class)
    method MountServiceStub (line 14) | public MountServiceStub() {

FILE: 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: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/proxies/phonesubinfo/MethodProxies.java
  class MethodProxies (line 11) | @SuppressWarnings("ALL")
    class GetDeviceId (line 14) | @Mark("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) | @Mark("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: 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: 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: 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: 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: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/MethodProxies.java
  class MethodProxies (line 11) | class MethodProxies {
    class GetDeviceId (line 13) | @Mark("fake device id.")
      method GetDeviceId (line 16) | public GetDeviceId() {
      method call (line 20) | @Override

FILE: lib/src/main/java/com/lody/virtual/client/hook/proxies/telephony/TelephonyRegistryStub.java
  class TelephonyRegistryStub (line 9) | public class TelephonyRegistryStub extends BinderInvocationProxy {
    method TelephonyRegistryStub (line 11) | public TelephonyRegistryStub() {
    method onBindMethods (line 15) | @Override

FILE: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/proxies/wifi/WifiManagerStub.java
  class WifiManagerStub (line 23) | public class WifiManagerStub extends BinderInvocationProxy {
    class RemoveWorkSourceMethodProxy (line 25) | private class RemoveWorkSourceMethodProxy extends StaticMethodProxy {
      method RemoveWorkSourceMethodProxy (line 27) | RemoveWorkSourceMethodProxy(String name) {
      method call (line 31) | @Override
    method WifiManagerStub (line 42) | public WifiManagerStub() {
    method onBindMethods (line 46) | @Override
    class GetConnectionInfo (line 63) | @Mark("fake wifi MAC")
      method getMethodName (line 65) | @Override
      method call (line 70) | @Override

FILE: 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: 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: 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: 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: 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: 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: 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: 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: lib/src/main/java/com/lody/virtual/client/hook/secondary/ServiceConnectionDelegate.java
  class ServiceConnectionDelegate (line 16) | public class ServiceConnectionDelegate extends IServiceConnection.Stub {
    method ServiceConnectionDelegate (line 21) | private ServiceConnectionDelegate(IServiceConnection mConn) {
    method getDelegate (line 25) | public static ServiceConnectionDelegate getDelegate(IServiceConnection...
    method removeDelegate (line 38) | public static ServiceConnectionDelegate removeDelegate(IServiceConnect...
    method connected (line 42) | @Override

FILE: 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: lib/src/main/java/com/lody/virtual/client/hook/utils/MethodParameterUtils.java
  class MethodParameterUtils (line 13) | public class MethodParameterUtils {
    method replaceFirstAppPkg (line 15) | public static String replaceFirstAppPkg(Object[] args) {
    method replaceLastAppPkg (line 29) | public static String replaceLastAppPkg(Object[] args) {
    method replaceSequenceAppPkg (line 39) | public static String replaceSequenceAppPkg(Object[] args, int sequence) {
    method getAllInterface (line 49) | public static Class<?>[] getAllInterface(Class clazz){
    method getAllInterfaces (line 58) | public static void getAllInterfaces(Class clazz, HashSet<Class<?>> int...

FILE: 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: lib/src/main/java/com/lody/virtual/client/ipc/ActivityClientRecord.java
  class ActivityClientRecord (line 6) | public class ActivityClientRecord {

FILE: 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: 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: 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 74) | public static IBinder getService(String name) {
    method addService (line 92) | public static void addService(String name, IBinder service) {
    method removeService (line 104) | public static void removeService(String name) {

FILE: lib/src/main/java/com/lody/virtual/client/ipc/VAccountManager.java
  class VAccountManager (line 25) | public class VAccountManager {
    method get (line 31) | public static VAccountManager get() {
    method getRemote (line 35) | public IAccountManager getRemote() {
    method getStubInterface (line 46) | private Object getStubInterface() {
    method getAuthenticatorTypes (line 51) | public AuthenticatorDescription[] getAuthenticatorTypes() {
    method removeAccount (line 59) | public void removeAccount(IAccountManagerResponse response, Account ac...
    method getAuthToken (line 67) | public void getAuthToken(IAccountManagerResponse response, Account acc...
    method addAccountExplicitly (line 75) | public boolean addAccountExplicitly(Account account, String password, ...
    method getAccounts (line 83) | public Account[] getAccounts(int userId, String type) {
    method getAccounts (line 91) | public Account[] getAccounts(String type) {
    method peekAuthToken (line 99) | public String peekAuthToken(Account account, String authTokenType) {
    method getPreviousName (line 107) | public String getPreviousName(Account account) {
    method hasFeatures (line 115) | public void hasFeatures(IAccountManagerResponse response, Account acco...
    method accountAuthenticated (line 123) | public boolean accountAuthenticated(Account account) {
    method clearPassword (line 131) | public void clearPassword(Account account) {
    method renameAccount (line 139) | public void renameAccount(IAccountManagerResponse response, Account ac...
    method setPassword (line 147) | public void setPassword(Account account, String password) {
    method addAccount (line 155) | public void addAccount(int userId, IAccountManagerResponse response, S...
    method addAccount (line 163) | public void addAccount(IAccountManagerResponse response, String accoun...
    method updateCredentials (line 171) | public void updateCredentials(IAccountManagerResponse response, Accoun...
    method removeAccountExplicitly (line 179) | public boolean removeAccountExplicitly(Account account) {
    method setUserData (line 187) | public void setUserData(Account account, String key, String value) {
    method editProperties (line 195) | public void editProperties(IAccountManagerResponse response, String ac...
    method getAuthTokenLabel (line 203) | public void getAuthTokenLabel(IAccountManagerResponse response, String...
    method confirmCredentials (line 211) | public void confirmCredentials(IAccountManagerResponse response, Accou...
    method invalidateAuthToken (line 219) | public void invalidateAuthToken(String accountType, String authToken) {
    method getAccountsByFeatures (line 227) | public void getAccountsByFeatures(IAccountManagerResponse response, St...
    method setAuthToken (line 235) | public void setAuthToken(Account account, String authTokenType, String...
    method getPassword (line 243) | public Object getPassword(Account account) {
    method getUserData (line 251) | public String getUserData(Account account, String key) {
    method addAccount (line 270) | public AccountManagerFuture<Bundle> addAccount(final int userId, final...

FILE: lib/src/main/java/com/lody/virtual/client/ipc/VActivityManager.java
  class VActivityManager (line 37) | public class VActivityManager {
    method get (line 43) | public static VActivityManager get() {
    method getService (line 47) | public IActivityManager getService() {
    method getRemoteInterface (line 60) | private Object getRemoteInterface() {
    method startActivity (line 66) | public int startActivity(Intent intent, ActivityInfo info, IBinder res...
    method startActivities (line 75) | public int startActivities(Intent[] intents, String[] resolvedTypes, I...
    method startActivity (line 83) | public int startActivity(Intent intent, int userId) {
    method onActivityCreate (line 94) | public ActivityClientRecord onActivityCreate(ComponentName component, ...
    method getActivityRecord (line 107) | public ActivityClientRecord getActivityRecord(IBinder token) {
    method onActivityResumed (line 113) | public void onActivityResumed(Activity activity) {
    method onActivityDestroy (line 122) | public boolean onActivityDestroy(IBinder token) {
    method getTaskInfo (line 131) | public AppTaskInfo getTaskInfo(int taskId) {
    method getCallingActivity (line 139) | public ComponentName getCallingActivity(IBinder token) {
    method getCallingPackage (line 147) | public String getCallingPackage(IBinder token) {
    method getPackageForToken (line 155) | public String getPackageForToken(IBinder token) {
    method getActivityForToken (line 163) | public ComponentName getActivityForToken(IBinder token) {
    method startService (line 171) | public ComponentName startService(IInterface caller, Intent service, S...
    method stopService (line 179) | public int stopService(IInterface caller, Intent service, String resol...
    method stopServiceToken (line 187) | public boolean stopServiceToken(ComponentName className, IBinder token...
    method setServiceForeground (line 195) | public void setServiceForeground(ComponentName className, IBinder toke...
    method bindService (line 203) | public int bindService(IBinder caller, IBinder token, Intent service, ...
    method unbindService (line 211) | public boolean unbindService(IServiceConnection connection) {
    method unbindFinished (line 219) | public void unbindFinished(IBinder token, Intent service, boolean doRe...
    method serviceDoneExecuting (line 227) | public void serviceDoneExecuting(IBinder token, int type, int startId,...
    method peekService (line 235) | public IBinder peekService(Intent service, String resolvedType) {
    method publishService (line 243) | public void publishService(IBinder token, Intent intent, IBinder servi...
    method getServices (line 251) | public VParceledListSlice getServices(int maxNum, int flags) {
    method processRestarted (line 259) | public void processRestarted(String packageName, String processName, i...
    method getAppProcessName (line 267) | public String getAppProcessName(int pid) {
    method getInitialPackage (line 275) | public String getInitialPackage(int pid) {
    method isAppProcess (line 283) | public boolean isAppProcess(String processName) {
    method handleApplicationCrash (line 291) | public void handleApplicationCrash() {
    method killAllApps (line 299) | public void killAllApps() {
    method killApplicationProcess (line 307) | public void killApplicationProcess(String procName, int uid) {
    method registerProcessObserver (line 315) | public void registerProcessObserver(IProcessObserver observer) {
    method killAppByPkg (line 323) | public void killAppByPkg(String pkg, int userId) {
    method unregisterProcessObserver (line 331) | public void unregisterProcessObserver(IProcessObserver observer) {
    method appDoneExecuting (line 339) | public void appDoneExecuting() {
    method getProcessPkgList (line 347) | public List<String> getProcessPkgList(int pid) {
    method isAppPid (line 355) | public boolean isAppPid(int pid) {
    method getUidByPid (line 363) | public int getUidByPid(int pid) {
    method getSystemPid (line 371) | public int getSystemPid() {
    method sendActivityResult (line 380) | public void sendActivityResult(IBinder resultTo, String resultWho, int...
    method acquireProviderClient (line 388) | public IInterface acquireProviderClient(int userId, ProviderInfo info)...
    method getPendingIntent (line 392) | public PendingIntentData getPendingIntent(IBinder binder) throws Remot...
    method addPendingIntent (line 396) | public void addPendingIntent(IBinder binder, String creator) throws Re...
    method removePendingIntent (line 400) | public void removePendingIntent(IBinder binder) throws RemoteException {
    method finishActivity (line 404) | public void finishActivity(IBinder token) {
    method isAppRunning (line 428) | public boolean isAppRunning(String packageName, int userId) {
    method initProcess (line 436) | public int initProcess(String packageName, String processName, int use...
    method sendBroadcast (line 444) | public void sendBroadcast(Intent intent, int userId) {
    method isVAServiceToken (line 451) | public boolean isVAServiceToken(IBinder token) {
    method broadcastFinish (line 459) | public void broadcastFinish(PendingResultData res) {
    method getPackageForIntentSender (line 467) | public String getPackageForIntentSender(IBinder binder) {

FILE: lib/src/main/java/com/lody/virtual/client/ipc/VDeviceManager.java
  class VDeviceManager (line 15) | public class VDeviceManager {
    method get (line 21) | public static VDeviceManager get() {
    method getRemote (line 26) | public IDeviceInfoManager getRemote() {
    method getRemoteInterface (line 37) | private Object getRemoteInterface() {
    method getDeviceInfo (line 42) | public VDeviceInfo getDeviceInfo(int userId) {

FILE: lib/src/main/java/com/lody/virtual/client/ipc/VJobScheduler.java
  class VJobScheduler (line 17) | public class VJobScheduler {
    method get (line 23) | public static VJobScheduler get() {
    method getRemote (line 27) | public IJobScheduler getRemote() {
    method getRemoteInterface (line 38) | private Object getRemoteInterface() {
    method schedule (line 43) | public int schedule(JobInfo job) {
    method getAllPendingJobs (line 51) | public List<JobInfo> getAllPendingJobs() {
    method cancelAll (line 59) | public void cancelAll() {
    method cancel (line 67) | public void cancel(int jobId) {

FILE: lib/src/main/java/com/lody/virtual/client/ipc/VNotificationManager.java
  class VNotificationManager (line 14) | public class VNotificationManager {
    method VNotificationManager (line 19) | private VNotificationManager() {
    method get (line 23) | public static VNotificationManager get() {
    method getService (line 27) | public INotificationManager getService() {
    method dealNotification (line 38) | public boolean dealNotification(int id, Notification notification, Str...
    method dealNotificationId (line 43) | public int dealNotificationId(int id, String packageName, String tag, ...
    method dealNotificationTag (line 52) | public String dealNotificationTag(int id, String packageName, String t...
    method areNotificationsEnabledForPackage (line 61) | public boolean areNotificationsEnabledForPackage(String packageName, i...
    method setNotificationsEnabledForPackage (line 70) | public void setNotificationsEnabledForPackage(String packageName, bool...
    method addNotification (line 78) | public void addNotification(int id, String tag, String packageName, in...
    method cancelAllNotification (line 86) | public void cancelAllNotification(String packageName, int userId) {

FILE: lib/src/main/java/com/lody/virtual/client/ipc/VPackageManager.java
  class VPackageManager (line 26) | public class VPackageManager {
    method get (line 31) | public static VPackageManager get() {
    method getInterface (line 35) | public IPackageManager getInterface() {
    method getRemoteInterface (line 46) | private Object getRemoteInterface() {
    method checkPermission (line 51) | public int checkPermission(String permName, String pkgName, int userId) {
    method resolveService (line 59) | public ResolveInfo resolveService(Intent intent, String resolvedType, ...
    method getPermissionGroupInfo (line 67) | public PermissionGroupInfo getPermissionGroupInfo(String name, int fla...
    method getInstalledApplications (line 75) | public List<ApplicationInfo> getInstalledApplications(int flags, int u...
    method getPackageInfo (line 84) | public PackageInfo getPackageInfo(String packageName, int flags, int u...
    method resolveIntent (line 92) | public ResolveInfo resolveIntent(Intent intent, String resolvedType, i...
    method queryIntentContentProviders (line 100) | public List<ResolveInfo> queryIntentContentProviders(Intent intent, St...
    method getReceiverInfo (line 108) | public ActivityInfo getReceiverInfo(ComponentName componentName, int f...
    method getInstalledPackages (line 116) | public List<PackageInfo> getInstalledPackages(int flags, int userId) {
    method queryPermissionsByGroup (line 124) | public List<PermissionInfo> queryPermissionsByGroup(String group, int ...
    method getPermissionInfo (line 132) | public PermissionInfo getPermissionInfo(String name, int flags) {
    method getActivityInfo (line 140) | public ActivityInfo getActivityInfo(ComponentName componentName, int f...
    method queryIntentReceivers (line 148) | public List<ResolveInfo> queryIntentReceivers(Intent intent, String re...
    method getAllPermissionGroups (line 156) | public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
    method queryIntentActivities (line 164) | public List<ResolveInfo> queryIntentActivities(Intent intent, String r...
    method queryIntentServices (line 172) | public List<ResolveInfo> queryIntentServices(Intent intent, String res...
    method getApplicationInfo (line 180) | public ApplicationInfo getApplicationInfo(String packageName, int flag...
    method resolveContentProvider (line 188) | public ProviderInfo resolveContentProvider(String name, int flags, int...
    method getServiceInfo (line 196) | public ServiceInfo getServiceInfo(ComponentName componentName, int fla...
    method getProviderInfo (line 204) | public ProviderInfo getProviderInfo(ComponentName componentName, int f...
    method activitySupportsIntent (line 212) | public boolean activitySupportsIntent(ComponentName component, Intent ...
    method queryContentProviders (line 220) | public List<ProviderInfo> queryContentProviders(String processName, in...
    method querySharedPackages (line 229) | public List<String> querySharedPackages(String packageName) {
    method getPackagesForUid (line 237) | public String[] getPackagesForUid(int uid) {
    method getPackageUid (line 245) | public int getPackageUid(String packageName, int userId) {
    method getNameForUid (line 253) | public String getNameForUid(int uid) {
    method getPackageInstaller (line 262) | public IPackageInstaller getPackageInstaller() {

FILE: lib/src/main/java/com/lody/virtual/client/ipc/VirtualStorageManager.java
  class VirtualStorageManager (line 15) | public class VirtualStorageManager {
    method get (line 21) | public static VirtualStorageManager get() {
    method getRemote (line 26) | public IVirtualStorageService getRemote() {
    method getRemoteInterface (line 37) | private Object getRemoteInterface() {
    method setVirtualStorage (line 42) | public void setVirtualStorage(String packageName, int userId, String v...
    method getVirtualStorage (line 50) | public String getVirtualStorage(String packageName, int userId) {
    method setVirtualStorageState (line 58) | public void setVirtualStorageState(String packageName, int userId, boo...
    method isVirtualStorageEnable (line 66) | public boolean isVirtualStorageEnable(String packageName, int userId) {

FILE: lib/src/main/java/com/lody/virtual/client/natives/NativeMethods.java
  class NativeMethods (line 14) | public class NativeMethods {
    method init (line 23) | public static void init() {

FILE: lib/src/main/java/com/lody/virtual/client/stub/AmsTask.java
  class AmsTask (line 34) | public abstract class AmsTask extends FutureTask<Bundle> implements Acco...
    method AmsTask (line 40) | public AmsTask(Activity activity, Handler handler, AccountManagerCallb...
    method start (line 54) | public final AccountManagerFuture<Bundle> start() {
    method set (line 63) | @Override
    method doWork (line 75) | public abstract void doWork() throws RemoteException;
    method internalGetResult (line 77) | private Bundle internalGetResult(Long timeout, TimeUnit unit)
    method getResult (line 112) | @Override
    method getResult (line 118) | @Override
    method done (line 124) | @Override
    class Response (line 134) | private class Response extends IAccountManagerResponse.Stub {
      method onResult (line 135) | @Override
      method onError (line 154) | @Override
    method convertErrorToException (line 167) | private Exception convertErrorToException(int code, String message) {
    method postToHandler (line 187) | private void postToHandler(Handler handler, final AccountManagerCallba...

FILE: lib/src/main/java/com/lody/virtual/client/stub/ChooseAccountTypeActivity.java
  class ChooseAccountTypeActivity (line 35) | public class ChooseAccountTypeActivity extends Activity {
    method onCreate (line 41) | @Override
    method setResultAndFinish (line 98) | private void setResultAndFinish(final String type) {
    method buildTypeToAuthDescriptionMap (line 107) | private void buildTypeToAuthDescriptionMap() {
    class AuthInfo (line 126) | private static class AuthInfo {
      method AuthInfo (line 131) | AuthInfo(AuthenticatorDescription desc, String name, Drawable drawab...
    class ViewHolder (line 138) | private static class ViewHolder {
    class AccountArrayAdapter (line 143) | private static class AccountArrayAdapter extends ArrayAdapter<AuthInfo> {
      method AccountArrayAdapter (line 147) | AccountArrayAdapter(Context context, int textViewResourceId,
      method getView (line 155) | @Override

FILE: lib/src/main/java/com/lody/virtual/client/stub/ChooseTypeAndAccountActivity.java
  class ChooseTypeAndAccountActivity (line 35) | public class ChooseTypeAndAccountActivity extends Activity
    method onCreate (line 118) | @Override
    method onDestroy (line 191) | @Override
    method onSaveInstanceState (line 199) | @Override
    method onCancelButtonClicked (line 218) | public void onCancelButtonClicked(View view) {
    method onOkButtonClicked (line 222) | public void onOkButtonClicked(View view) {
    method onActivityResult (line 234) | @Override
    method runAddAccountForAuthenticator (line 307) | protected void runAddAccountForAuthenticator(String type) {
    method run (line 321) | @Override
    method setNonLabelThemeAndCallSuperCreate (line 353) | private void setNonLabelThemeAndCallSuperCreate(Bundle savedInstanceSt...
    method onAccountSelected (line 362) | private void onAccountSelected(Account account) {
    method setResultAndFinish (line 367) | private void setResultAndFinish(final String accountName, final String...
    method startChooseAccountTypeActivity (line 377) | private void startChooseAccountTypeActivity() {
    method getItemIndexToSelect (line 397) | private int getItemIndexToSelect(ArrayList<Account> accounts, String s...
    method getListOfDisplayableOptions (line 414) | private String[] getListOfDisplayableOptions(ArrayList<Account> accoun...
    method getAcceptableAccountChoices (line 431) | private ArrayList<Account> getAcceptableAccountChoices(VAccountManager...
    method getReleventAccountTypes (line 451) | private Set<String> getReleventAccountTypes(final Intent intent) {
    method getAllowableAccountSet (line 476) | private Set<Account> getAllowableAccountSet(final Intent intent) {
    method overrideDescriptionIfSupplied (line 493) | private void overrideDescriptionIfSupplied(String descriptionOverride) {
    method populateUIAccountList (line 506) | private void populateUIAccountList(String[] listItems) {

FILE: lib/src/main/java/com/lody/virtual/client/stub/ChooserActivity.java
  class ChooserActivity (line 14) | public class ChooserActivity extends ResolverActivity {
    method check (line 25) | public static boolean check(Intent intent) {
    method onCreate (line 35) | @SuppressLint("MissingSuperCall")

FILE: lib/src/main/java/com/lody/virtual/client/stub/DaemonService.java
  class DaemonService (line 14) | public class DaemonService extends Service {
    method startup (line 18) | public static void startup(Context context) {
    method onDestroy (line 22) | @Override
    method onBind (line 28) | @Override
    method onCreate (line 33) | @Override
    method onStartCommand (line 41) | @Override
    class InnerService (line 46) | public static final class InnerService extends Service {
      method onStartCommand (line 48) | @Override
      method onBind (line 56) | @Override

FILE: lib/src/main/java/com/lody/virtual/client/stub/ResolverActivity.java
  class ResolverActivity (line 50) | public class ResolverActivity extends Activity implements AdapterView.On...
    method makeMyIntent (line 71) | private Intent makeMyIntent() {
    method onCreate (line 78) | @SuppressLint("MissingSuperCall")
    method onCreate (line 97) | protected void onCreate(Bundle savedInstanceState, Intent intent,
    method onDestroy (line 169) | @Override
    method getIcon (line 177) | @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
    method loadIconForResolveInfo (line 189) | Drawable loadIconForResolveInfo(ResolveInfo ri) {
    method onRestart (line 211) | @Override
    method onStop (line 220) | @Override
    method onRestoreInstanceState (line 240) | @Override
    method onItemClick (line 255) | @Override
    method startSelected (line 271) | void startSelected(int which, boolean always) {
    method onIntentSelected (line 281) | protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean...
    method showAppDetails (line 404) | void showAppDetails(ResolveInfo ri) {
    class ViewHolder (line 411) | static class ViewHolder {
      method ViewHolder (line 416) | public ViewHolder(View view) {
    class DisplayResolveInfo (line 423) | private final class DisplayResolveInfo {
      method DisplayResolveInfo (line 430) | DisplayResolveInfo(ResolveInfo pri, CharSequence pLabel,
    class ResolveListAdapter (line 439) | private final class ResolveListAdapter extends BaseAdapter {
      method ResolveListAdapter (line 450) | public ResolveListAdapter(Context context, Intent intent,
      method handlePackagesChanged (line 461) | public void handlePackagesChanged() {
      method getInitialHighlight (line 472) | public int getInitialHighlight() {
      method rebuildList (line 476) | private void rebuildList() {
      method processGroup (line 601) | private void processGroup(List<ResolveInfo> rList, int start, int en...
      method resolveInfoForPosition (line 660) | public ResolveInfo resolveInfoForPosition(int position) {
      method intentForPosition (line 664) | public Intent intentForPosition(int position) {
      method getCount (line 677) | public int getCount() {
      method getItem (line 681) | public Object getItem(int position) {
      method getItemId (line 685) | public long getItemId(int position) {
      method getView (line 689) | public View getView(int position, View convertView, ViewGroup parent) {
      method bindView (line 707) | private final void bindView(View view, DisplayResolveInfo info) {
    class ItemLongClickListener (line 723) | class ItemLongClickListener implements AdapterView.OnItemLongClickList...
      method onItemLongClick (line 725) | @Override
    class LoadIconTask (line 734) | class LoadIconTask extends AsyncTask<DisplayResolveInfo, Void, Display...
      method doInBackground (line 735) | @Override
      method onPostExecute (line 744) | @Override

FILE: lib/src/main/java/com/lody/virtual/client/stub/ShortcutHandleActivity.java
  class ShortcutHandleActivity (line 16) | public class ShortcutHandleActivity extends Activity {
    method onCreate (line 19) | @Override

FILE: lib/src/main/java/com/lody/virtual/client/stub/StubActivity.java
  class StubActivity (line 19) | public abstract class StubActivity extends Activity {
    method onCreate (line 21) | @Override
    class C0 (line 43) | public static class C0 extends StubActivity {
    class C1 (line 46) | public static class C1 extends StubActivity {
    class C2 (line 49) | public static class C2 extends StubActivity {
    class C3 (line 52) | public static class C3 extends StubActivity {
    class C4 (line 55) | public static class C4 extends StubActivity {
    class C5 (line 58) | public static class C5 extends StubActivity {
    class C6 (line 61) | public static class C6 extends StubActivity {
    class C7 (line 64) | public static class C7 extends StubActivity {
    class C8 (line 67) | public static class C8 extends StubActivity {
    class C9 (line 70) | public static class C9 extends StubActivity {
    class C10 (line 73) | public static class C10 extends StubActivity {
    class C11 (line 76) | public static class C11 extends StubActivity {
    class C12 (line 79) | public static class C12 extends StubActivity {
    class C13 (line 82) | public static class C13 extends StubActivity {
    class C14 (line 85) | public static class C14 extends StubActivity {
    class C15 (line 88) | public static class C15 extends StubActivity {
    class C16 (line 91) | public static class C16 extends StubActivity {
    class C17 (line 94) | public static class C17 extends StubActivity {
    class C18 (line 97) | public static class C18 extends StubActivity {
    class C19 (line 100) | public static class C19 extends StubActivity {
    class C20 (line 103) | public static class C20 extends StubActivity {
    class C21 (line 106) | public static class C21 extends StubActivity {
    class C22 (line 109) | public static class C22 extends StubActivity {
    class C23 (line 112) | public static class C23 extends StubActivity {
    class C24 (line 115) | public static class C24 extends StubActivity {
    class C25 (line 118) | public static class C25 extends StubActivity {
    class C26 (line 121) | public static class C26 extends StubActivity {
    class C27 (line 124) | public static class C27 extends StubActivity {
    class C28 (line 127) | public static class C28 extends StubActivity {
    class C29 (line 130) | public static class C29 extends StubActivity {
    class C30 (line 133) | public static class C30 extends StubActivity {
    class C31 (line 136) | public static class C31 extends StubActivity {
    class C32 (line 139) | public static class C32 extends StubActivity {
    class C33 (line 142) | public static class C33 extends StubActivity {
    class C34 (line 145) | public static class C34 extends StubActivity {
    class C35 (line 148) | public static class C35 extends StubActivity {
    class C36 (line 151) | public static class C36 extends StubActivity {
    class C37 (line 154) | public static class C37 extends StubActivity {
    class C38 (line 157) | public static class C38 extends StubActivity {
    class C39 (line 160) | public static class C39 extends StubActivity {
    class C40 (line 163) | public static class C40 extends StubActivity {
    class C41 (line 166) | public static class C41 extends StubActivity {
    class C42 (line 169) | public static class C42 extends StubActivity {
    class C43 (line 172) | public static class C43 extends StubActivity {
    class C44 (line 175) | public static class C44 extends StubActivity {
    class C45 (line 178) | public static class C45 extends StubActivity {
    class C46 (line 181) | public static class C46 extends StubActivity {
    class C47 (line 184) | public static class C47 extends StubActivity {
    class C48 (line 187) | public static class C48 extends StubActivity {
    class C49 (line 190) | public static class C49 extends StubActivity {
    class C50 (line 193) | public static class C50 extends StubActivity {
    class C51 (line 196) | public static class C51 extends StubActivity {
    class C52 (line 199) | public static class C52 extends StubActivity {
    class C53 (line 202) | public static class C53 extends StubActivity {
    class C54 (line 205) | public static class C54 extends StubActivity {
    class C55 (line 208) | public static class C55 extends StubActivity {
    class C56 (line 211) | public static class C56 extends StubActivity {
    class C57 (line 214) | public static class C57 extends StubActivity {
    class C58 (line 217) | public static class C58 extends StubActivity {
    class C59 (line 220) | public static class C59 extends StubActivity {
    class C60 (line 223) | public static class C60 extends StubActivity {
    class C61 (line 226) | public static class C61 extends StubActivity {
    class C62 (line 229) | public static class C62 extends StubActivity {
    class C63 (line 232) | public static class C63 extends StubActivity {
    class C64 (line 235) | public static class C64 extends StubActivity {
    class C65 (line 238) | public static class C65 extends StubActivity {
    class C66 (line 241) | public static class C66 extends StubActivity {
    class C67 (line 244) | public static class C67 extends StubActivity {
    class C68 (line 247) | public static class C68 extends StubActivity {
    class C69 (line 250) | public static class C69 extends StubActivity {
    class C70 (line 253) | public static class C70 extends StubActivity {
    class C71 (line 256) | public static class C71 extends StubActivity {
    class C72 (line 259) | public static class C72 extends StubActivity {
    class C73 (line 262) | public static class C73 extends StubActivity {
    class C74 (line 265) | public static class C74 extends StubActivity {
    class C75 (line 268) | public static class C75 extends StubActivity {
    class C76 (line 271) | public static class C76 extends StubActivity {
    class C77 (line 274) | public static class C77 extends StubActivity {
    class C78 (line 277) | public static class C78 extends StubActivity {
    class C79 (line 280) | public static class C79 extends StubActivity {
    class C80 (line 283) | public static class C80 extends StubActivity {
    class C81 (line 286) | public static class C81 extends StubActivity {
    class C82 (line 289) | public static class C82 extends StubActivity {
    class C83 (line 292) | public static class C83 extends StubActivity {
    class C84 (line 295) | public static class C84 extends StubActivity {
    class C85 (line 298) | public static class C85 extends StubActivity {
    class C86 (line 301) | public static class C86 extends StubActivity {
    class C87 (line 304) | public static class C87 extends StubActivity {
    class C88 (line 307) | public static class C88 extends StubActivity {
    class C89 (line 310) | public static class C89 extends StubActivity {
    class C90 (line 313) | public static class C90 extends StubActivity {
    class C91 (line 316) | public static class C91 extends StubActivity {
    class C92 (line 319) | public static class C92 extends StubActivity {
    class C93 (line 322) | public static class C93 extends StubActivity {
    class C94 (line 325) | public static class C94 extends StubActivity {
    class C95 (line 328) | public static class C95 extends StubActivity {
    class C96 (line 331) | public static class C96 extends StubActivity {
    class C97 (line 334) | public static class C97 extends StubActivity {
    class C98 (line 337) | public static class C98 extends StubActivity {
    class C99 (line 340) | public static class C99 extends StubActivity {

FILE: lib/src/main/java/com/lody/virtual/client/stub/StubContentProvider.java
  class StubContentProvider (line 20) | public class StubContentProvider extends ContentProvider {
    method onCreate (line 22) | @Override
    method call (line 27) | @Override
    method initProcess (line 35) | private Bundle initProcess(Bundle extras) {
    method query (line 50) | @Override
    method getType (line 55) | @Override
    method insert (line 60) | @Override
    method delete (line 65) | @Override
    method update (line 70) | @Override
    class C0 (line 76) | public static class C0 extends StubContentProvider {
    class C1 (line 79) | public static class C1 extends StubContentProvider {
    class C2 (line 82) | public static class C2 extends StubContentProvider {
    class C3 (line 85) | public static class C3 extends StubContentProvider {
    class C4 (line 88) | public static class C4 extends StubContentProvider {
    class C5 (line 91) | public static class C5 extends StubContentProvider {
    class C6 (line 94) | public static class C6 extends StubContentProvider {
    class C7 (line 97) | public static class C7 extends StubContentProvider {
    class C8 (line 100) | public static class C8 extends StubContentProvider {
    class C9 (line 103) | public static class C9 extends StubContentProvider {
    class C10 (line 106) | public static class C10 extends StubContentProvider {
    class C11 (line 109) | public static class C11 extends StubContentProvider {
    class C12 (line 112) | public static class C12 extends StubContentProvider {
    class C13 (line 115) | public static class C13 extends StubContentProvider {
    class C14 (line 118) | public static class C14 extends StubContentProvider {
    class C15 (line 121) | public static class C15 extends StubContentProvider {
    class C16 (line 124) | public static class C16 extends StubContentProvider {
    class C17 (line 127) | public static class C17 extends StubContentProvider {
    class C18 (line 130) | public static class C18 extends StubContentProvider {
    class C19 (line 133) | public static class C19 extends StubContentProvider {
    class C20 (line 136) | public static class C20 extends StubContentProvider {
    class C21 (line 139) | public static class C21 extends StubContentProvider {
    class C22 (line 142) | public static class C22 extends StubContentProvider {
    class C23 (line 145) | public static class C23 extends StubContentProvider {
    class C24 (line 148) | public static class C24 extends StubContentProvider {
    class C25 (line 151) | public static class C25 extends StubContentProvider {
    class C26 (line 154) | public static class C26 extends StubContentProvider {
    class C27 (line 157) | public static class C27 extends StubContentProvider {
    class C28 (line 160) | public static class C28 extends StubContentProvider {
    class C29 (line 163) | public static class C29 extends StubContentProvider {
    class C30 (line 166) | public static class C30 extends StubContentProvider {
    class C31 (line 169) | public static class C31 extends StubContentProvider {
    class C32 (line 172) | public static class C32 extends StubContentProvider {
    class C33 (line 175) | public static class C33 extends StubContentProvider {
    class C34 (line 178) | public static class C34 extends StubContentProvider {
    class C35 (line 181) | public static class C35 extends StubContentProvider {
    class C36 (line 184) | public static class C36 extends StubContentProvider {
    class C37 (line 187) | public static class C37 extends StubContentProvider {
    class C38 (line 190) | public static class C38 extends StubContentProvider {
    class C39 (line 193) | public static class C39 extends StubContentProvider {
    class C40 (line 196) | public static class C40 extends StubContentProvider {
    class C41 (line 199) | public static class C41 extends StubContentProvider {
    class C42 (line 202) | public static class C42 extends StubContentProvider {
    class C43 (line 205) | public static class C43 extends StubContentProvider {
    class C44 (line 208) | public static class C44 extends StubContentProvider {
    class C45 (line 211) | public static class C45 extends StubContentProvider {
    class C46 (line 214) | public static class C46 extends StubContentProvider {
    class C47 (line 217) | public static class C47 extends StubContentProvider {
    class C48 (line 
Condensed preview — 627 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,197K chars).
[
  {
    "path": ".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": "app/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "chars": 1858,
    "preview": "import java.security.acl.Group\n\napply plugin: 'com.android.application'\napply plugin: 'me.tatarka.retrolambda'\n\n\nandroid"
  },
  {
    "path": "app/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": "app/src/main/AndroidManifest.xml",
    "chars": 1460,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "app/src/main/java/io/virtualapp/VApp.java",
    "chars": 3473,
    "preview": "package io.virtualapp;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.os.Buil"
  },
  {
    "path": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "app/src/main/java/io/virtualapp/delegate/MyComponentDelegate.java",
    "chars": 1000,
    "preview": "package io.virtualapp.delegate;\n\nimport android.app.Activity;\nimport android.content.Intent;\n\nimport com.lody.virtual.cl"
  },
  {
    "path": "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": "app/src/main/java/io/virtualapp/delegate/MyTaskDescriptionDelegate.java",
    "chars": 1021,
    "preview": "package io.virtualapp.delegate;\n\nimport android.annotation.TargetApi;\nimport android.app.ActivityManager;\nimport android"
  },
  {
    "path": "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": "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": "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": "app/src/main/java/io/virtualapp/home/HomeActivity.java",
    "chars": 18315,
    "preview": "package io.virtualapp.home;\n\nimport android.animation.Animator;\nimport android.animation.ObjectAnimator;\nimport android."
  },
  {
    "path": "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": "app/src/main/java/io/virtualapp/home/HomePresenterImpl.java",
    "chars": 8881,
    "preview": "package io.virtualapp.home;\n\nimport android.app.Activity;\nimport android.graphics.Bitmap;\n\nimport com.google.android.gms"
  },
  {
    "path": "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": "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": "app/src/main/java/io/virtualapp/home/ListAppFragment.java",
    "chars": 5352,
    "preview": "package io.virtualapp.home;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimpor"
  },
  {
    "path": "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": "app/src/main/java/io/virtualapp/home/LoadingActivity.java",
    "chars": 3592,
    "preview": "package io.virtualapp.home;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nim"
  },
  {
    "path": "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": "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": "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": "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": "app/src/main/java/io/virtualapp/home/ads/AdScheduler.java",
    "chars": 448,
    "preview": "package io.virtualapp.home.ads;\n\n/**\n * @author Lody\n */\n\npublic class AdScheduler {\n\n    private long adDeltaTime;\n    "
  },
  {
    "path": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "app/src/main/java/io/virtualapp/splash/SplashActivity.java",
    "chars": 1932,
    "preview": "package io.virtualapp.splash;\n\nimport android.os.Bundle;\nimport android.view.WindowManager;\n\nimport com.google.android.g"
  },
  {
    "path": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "app/src/main/res/layout/activity_splash.xml",
    "chars": 1049,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "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": "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": "app/src/main/res/layout/item_app.xml",
    "chars": 877,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "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": "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": "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": "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": "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": "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": "app/src/main/res/values/dimens.xml",
    "chars": 745,
    "preview": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal"
  },
  {
    "path": "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": "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": "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": "app/src/main/res/values/styles.xml",
    "chars": 1661,
    "preview": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.NoActionBar\">\n     "
  },
  {
    "path": "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": "build.gradle",
    "chars": 686,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    r"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 230,
    "preview": "#Sun Jan 15 17:29:32 CST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "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": "gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "gradlew.bat",
    "chars": 2314,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
  },
  {
    "path": "lib/.gitignore",
    "chars": 34,
    "preview": "/build\n.externalNativeBuild/\nobj/\n"
  },
  {
    "path": "lib/build.gradle",
    "chars": 999,
    "preview": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 24\n    buildToolsVersion \"25.0.2\"\n\n    defaultConfi"
  },
  {
    "path": "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": "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": "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": "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": "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": "lib/src/main/aidl/android/app/IActivityManager/ContentProviderHolder.aidl",
    "chars": 102,
    "preview": "// ContentProviderHolder.aidl\npackage android.app.IActivityManager;\n\nparcelable ContentProviderHolder;"
  },
  {
    "path": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "lib/src/main/aidl/com/lody/virtual/os/VUserInfo.aidl",
    "chars": 69,
    "preview": "// VUserInfo.aidl\npackage com.lody.virtual.os;\n\nparcelable VUserInfo;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/AppTaskInfo.aidl",
    "chars": 77,
    "preview": "// AppTaskInfo.aidl\npackage com.lody.virtual.remote;\n\nparcelable AppTaskInfo;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/InstallResult.aidl",
    "chars": 81,
    "preview": "// InstallResult.aidl\npackage com.lody.virtual.remote;\n\nparcelable InstallResult;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/InstalledAppInfo.aidl",
    "chars": 81,
    "preview": "// AppSetting.aidl\npackage com.lody.virtual.remote;\n\nparcelable InstalledAppInfo;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/PendingIntentData.aidl",
    "chars": 89,
    "preview": "// PendingIntentData.aidl\npackage com.lody.virtual.remote;\n\nparcelable PendingIntentData;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/PendingResultData.aidl",
    "chars": 89,
    "preview": "// PendingResultData.aidl\npackage com.lody.virtual.remote;\n\nparcelable PendingResultData;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/Problem.aidl",
    "chars": 69,
    "preview": "// Problem.aidl\npackage com.lody.virtual.remote;\n\nparcelable Problem;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/ReceiverInfo.aidl",
    "chars": 79,
    "preview": "// ReceiverInfo.aidl\npackage com.lody.virtual.remote;\n\nparcelable ReceiverInfo;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/VDeviceInfo.aidl",
    "chars": 77,
    "preview": "// VDeviceInfo.aidl\npackage com.lody.virtual.remote;\n\nparcelable VDeviceInfo;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/remote/VParceledListSlice.aidl",
    "chars": 91,
    "preview": "// VParceledListSlice.aidl\npackage com.lody.virtual.remote;\n\nparcelable VParceledListSlice;"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/server/IAccountManager.aidl",
    "chars": 2918,
    "preview": "package com.lody.virtual.server;\n\nimport android.accounts.IAccountManagerResponse;\nimport android.accounts.Account;\nimpo"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/server/IActivityManager.aidl",
    "chars": 3870,
    "preview": "// IActivityManager.aidl\npackage com.lody.virtual.server;\n\nimport com.lody.virtual.remote.VParceledListSlice;\nimport com"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/server/IAppManager.aidl",
    "chars": 1503,
    "preview": "// IAppManager.aidl\npackage com.lody.virtual.server;\n\nimport com.lody.virtual.server.interfaces.IPackageObserver;\nimport"
  },
  {
    "path": "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": "lib/src/main/aidl/com/lody/virtual/server/IDeviceInfoManager.aidl",
    "chars": 184,
    "preview": "// IDeviceInfoManager.aidl\npackage com.lody.virtual.server;\n\nimport com.lody.virtual.remote.VDeviceInfo;\n\ninterface IDev"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/server/IJobScheduler.aidl",
    "chars": 302,
    "preview": "package com.lody.virtual.server;\n\nimport android.app.job.JobInfo;\n\n /**\n  * IPC interface that supports the app-facing {"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/server/INotificationManager.aidl",
    "chars": 670,
    "preview": "// INotificationManager.aidl\npackage com.lody.virtual.server;\n\n// Declare any non-default types here with import stateme"
  },
  {
    "path": "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": "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": "lib/src/main/aidl/com/lody/virtual/server/IPackageManager.aidl",
    "chars": 3086,
    "preview": "// IPackageManager.aidl\npackage com.lody.virtual.server;\n\nimport android.content.ComponentName;\nimport android.content.I"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/server/IUserManager.aidl",
    "chars": 712,
    "preview": "package com.lody.virtual.server;\n\nimport android.os.ParcelFileDescriptor;\nimport com.lody.virtual.os.VUserInfo;\nimport a"
  },
  {
    "path": "lib/src/main/aidl/com/lody/virtual/server/IVirtualStorageService.aidl",
    "chars": 420,
    "preview": "// IVirtualStorageService.aidl\npackage com.lody.virtual.server;\n\n\ninterface IVirtualStorageService {\n\n   void setVirtual"
  },
  {
    "path": "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": "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": "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": "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": "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": "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": "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": "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": "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": "lib/src/main/java/android/content/pm/PackageParser.java",
    "chars": 3204,
    "preview": "package android.content.pm;\n\nimport android.content.ComponentName;\nimport android.content.IntentFilter;\nimport android.o"
  },
  {
    "path": "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": "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": "lib/src/main/java/com/lody/virtual/client/NativeEngine.java",
    "chars": 6533,
    "preview": "package com.lody.virtual.client;\n\nimport android.annotation.SuppressLint;\nimport android.os.Binder;\nimport android.os.Bu"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/VClientImpl.java",
    "chars": 28465,
    "preview": "package com.lody.virtual.client;\n\nimport android.annotation.SuppressLint;\nimport android.app.Application;\nimport android"
  },
  {
    "path": "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": "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": "lib/src/main/java/com/lody/virtual/client/core/InvocationStubManager.java",
    "chars": 8029,
    "preview": "package com.lody.virtual.client.core;\n\nimport android.os.Build;\n\nimport com.lody.virtual.client.hook.base.MethodInvocati"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/core/VirtualCore.java",
    "chars": 26047,
    "preview": "package com.lody.virtual.client.core;\n\nimport android.annotation.SuppressLint;\nimport android.app.ActivityManager;\nimpor"
  },
  {
    "path": "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": "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": "lib/src/main/java/com/lody/virtual/client/env/SpecialComponentList.java",
    "chars": 7338,
    "preview": "package com.lody.virtual.client.env;\n\nimport android.Manifest;\nimport android.app.DownloadManager;\nimport android.conten"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/env/VirtualRuntime.java",
    "chars": 1985,
    "preview": "package com.lody.virtual.client.env;\n\nimport android.content.pm.ApplicationInfo;\nimport android.os.Build;\nimport android"
  },
  {
    "path": "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": "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 "
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/fixer/ContextFixer.java",
    "chars": 2574,
    "preview": "package com.lody.virtual.client.fixer;\n\nimport android.content.Context;\nimport android.content.ContextWrapper;\nimport an"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/BinderInvocationProxy.java",
    "chars": 1315,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport android.os.IBinder;\nimport android.os.IInterface;\n\nimport mirror.RefS"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/BinderInvocationStub.java",
    "chars": 3978,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport "
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/Inject.java",
    "chars": 343,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retenti"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/LogInvocation.java",
    "chars": 1703,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport android.util.Log;\n\nimport java.lang.annotation.Retention;\nimport java"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/MethodBox.java",
    "chars": 975,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.reflect.InvocationTargetException;\nimport java.lang.reflect"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/MethodInvocationProxy.java",
    "chars": 3463,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport android.content.Context;\n\nimport com.lody.virtual.client.core.Invocat"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/MethodInvocationStub.java",
    "chars": 8083,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport com.lody.vir"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/MethodProxy.java",
    "chars": 3285,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\ni"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceCallingPkgMethodProxy.java",
    "chars": 493,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.reflect.Method;\n\nimport com.lody.virtual.client.hook.utils."
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceLastPkgMethodProxy.java",
    "chars": 512,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.reflect.Method;\n\nimport com.lody.virtual.client.hook.utils."
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceLastUidMethodProxy.java",
    "chars": 695,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport android.os.Process;\n\nimport com.lody.virtual.helper.utils.ArrayUtils;"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceSequencePkgMethodProxy.java",
    "chars": 574,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.reflect.Method;\n\nimport com.lody.virtual.client.hook.utils."
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceSpecPkgMethodProxy.java",
    "chars": 612,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.reflect.Method;\n\n/**\n * @author Lody\n */\n\npublic class Repl"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/ReplaceUidMethodProxy.java",
    "chars": 597,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.reflect.Method;\n\npublic class ReplaceUidMethodProxy extends"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/ResultStaticMethodProxy.java",
    "chars": 455,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.reflect.Method;\n\n/**\n * @author Lody\n */\n\npublic class Resu"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/SkipInject.java",
    "chars": 329,
    "preview": "package com.lody.virtual.client.hook.base;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retenti"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/base/StaticMethodProxy.java",
    "chars": 278,
    "preview": "package com.lody.virtual.client.hook.base;\n\n/**\n * @author Lody\n */\n\npublic class StaticMethodProxy extends MethodProxy "
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/delegate/AppInstrumentation.java",
    "chars": 5129,
    "preview": "package com.lody.virtual.client.hook.delegate;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport andr"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/delegate/ComponentDelegate.java",
    "chars": 1655,
    "preview": "package com.lody.virtual.client.hook.delegate;\n\n\nimport android.content.Intent;\n\nimport android.app.Activity;\n\npublic in"
  },
  {
    "path": "lib/src/main/java/com/lody/virtual/client/hook/delegate/InstrumentationDelegate.java",
    "chars": 8418,
    "preview": "package com.lody.virtual.client.hook.delegate;\n\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimpor"
  }
]

// ... and 427 more files (download for full content)

About this extraction

This page contains the full source code of the ganyao114/VA_Doc GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 627 files (2.0 MB), approximately 550.8k tokens, and a symbol index with 4697 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!