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
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
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.