├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── custom.md │ └── feature_request.md └── workflows │ └── android.yml ├── .gitignore ├── AndroidManifest-common.xml ├── AndroidManifest.xml ├── LICENSE ├── README.md ├── REMARKS.md ├── _config.yml ├── build.gradle ├── effectivecard ├── build.gradle ├── consumer-rules.pro ├── libs │ └── launcher_client.jar ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── codemx │ │ └── effectivecard │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── aidl │ │ └── com │ │ │ └── codemx │ │ │ └── effectivecard │ │ │ └── launcherclient │ │ │ ├── ILauncherOverlay.aidl │ │ │ ├── ILauncherOverlayCallback.aidl │ │ │ ├── MxLayoutParams.aidl │ │ │ └── MxMessage.aidl │ ├── java │ │ └── com │ │ │ └── codemx │ │ │ └── effectivecard │ │ │ ├── CardService.java │ │ │ ├── CardWindowManager.java │ │ │ ├── IWindowCallback.java │ │ │ ├── LauncherOverlayView.java │ │ │ └── launcherclient │ │ │ ├── Constant.java │ │ │ ├── LauncherClient.java │ │ │ ├── LauncherClientCallback.java │ │ │ ├── LauncherClientCallbackAdapter.java │ │ │ ├── LauncherOverlayCallbacks.java │ │ │ ├── MxLayoutParams.java │ │ │ └── MxMessage.java │ └── res │ │ ├── drawable │ │ └── plus.png │ │ └── layout │ │ └── layout_card.xml │ └── test │ └── java │ └── com │ └── codemx │ └── effectivecard │ └── ExampleUnitTest.java ├── fill_screens.py ├── floatwindow ├── build.gradle ├── consumer-rules.pro ├── floatwindow.iml ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── codemx │ │ └── floatwindow │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── codemx │ │ └── floatwindow │ │ ├── FloatActivity.java │ │ ├── FloatLifecycle.java │ │ ├── FloatPhone.java │ │ ├── FloatToast.java │ │ ├── FloatView.java │ │ ├── FloatWindow.java │ │ ├── IFloatWindow.java │ │ ├── IFloatWindowImpl.java │ │ ├── LifecycleListener.java │ │ ├── LogUtil.java │ │ ├── MIUICompat.java │ │ ├── MoveType.java │ │ ├── PermissionListener.java │ │ ├── PermissionUtil.java │ │ ├── ResumedListener.java │ │ ├── Rom.java │ │ ├── Screen.java │ │ ├── Util.java │ │ ├── ViewStateListener.java │ │ ├── effect │ │ └── AnchorToSideEffect.java │ │ └── permission │ │ ├── AVCallFloatView.java │ │ ├── FloatWindowManager.java │ │ ├── RomUtil.java │ │ └── compat │ │ ├── AndroidMSettingCompat.java │ │ ├── DefaultSettingCompat.java │ │ ├── EMUISettingCompat.java │ │ ├── FlymeSettingCompat.java │ │ ├── GioneeSettingCompat.java │ │ ├── MiUISettingCompat.java │ │ ├── OppoSettingCompat.java │ │ ├── QikuSettingCompat.java │ │ ├── SettingCompat.java │ │ ├── SmartisanSettingCompat.java │ │ └── VivoSettingCompat.java │ └── test │ └── java │ └── com │ └── codemx │ └── floatwindow │ └── ExampleUnitTest.java ├── go ├── AndroidManifest.xml ├── res │ ├── drawable │ │ └── ic_widget.xml │ ├── layout │ │ └── widget_cell_content.xml │ ├── values-af │ │ └── strings.xml │ ├── values-am │ │ └── strings.xml │ ├── values-ar │ │ └── strings.xml │ ├── values-as │ │ └── strings.xml │ ├── values-az-rAZ │ │ └── strings.xml │ ├── values-az │ │ └── strings.xml │ ├── values-b+sr+Latn │ │ └── strings.xml │ ├── values-be-rBY │ │ └── strings.xml │ ├── values-be │ │ └── strings.xml │ ├── values-bg │ │ └── strings.xml │ ├── values-bn-rBD │ │ └── strings.xml │ ├── values-bn │ │ └── strings.xml │ ├── values-bs-rBA │ │ └── strings.xml │ ├── values-bs │ │ └── strings.xml │ ├── values-ca │ │ └── strings.xml │ ├── values-cs │ │ └── strings.xml │ ├── values-da │ │ └── strings.xml │ ├── values-de │ │ └── strings.xml │ ├── values-el │ │ └── strings.xml │ ├── values-en-rAU │ │ └── strings.xml │ ├── values-en-rGB │ │ └── strings.xml │ ├── values-en-rIN │ │ └── strings.xml │ ├── values-es-rUS │ │ └── strings.xml │ ├── values-es │ │ └── strings.xml │ ├── values-et-rEE │ │ └── strings.xml │ ├── values-et │ │ └── strings.xml │ ├── values-eu-rES │ │ └── strings.xml │ ├── values-eu │ │ └── strings.xml │ ├── values-fa │ │ └── strings.xml │ ├── values-fi │ │ └── strings.xml │ ├── values-fr-rCA │ │ └── strings.xml │ ├── values-fr │ │ └── strings.xml │ ├── values-gl-rES │ │ └── strings.xml │ ├── values-gl │ │ └── strings.xml │ ├── values-gu-rIN │ │ └── strings.xml │ ├── values-gu │ │ └── strings.xml │ ├── values-hi │ │ └── strings.xml │ ├── values-hr │ │ └── strings.xml │ ├── values-hu │ │ └── strings.xml │ ├── values-hy-rAM │ │ └── strings.xml │ ├── values-hy │ │ └── strings.xml │ ├── values-in │ │ └── strings.xml │ ├── values-is-rIS │ │ └── strings.xml │ ├── values-is │ │ └── strings.xml │ ├── values-it │ │ └── strings.xml │ ├── values-iw │ │ └── strings.xml │ ├── values-ja │ │ └── strings.xml │ ├── values-ka-rGE │ │ └── strings.xml │ ├── values-ka │ │ └── strings.xml │ ├── values-kk-rKZ │ │ └── strings.xml │ ├── values-kk │ │ └── strings.xml │ ├── values-km-rKH │ │ └── strings.xml │ ├── values-km │ │ └── strings.xml │ ├── values-kn-rIN │ │ └── strings.xml │ ├── values-kn │ │ └── strings.xml │ ├── values-ko │ │ └── strings.xml │ ├── values-ky-rKG │ │ └── strings.xml │ ├── values-ky │ │ └── strings.xml │ ├── values-lo-rLA │ │ └── strings.xml │ ├── values-lo │ │ └── strings.xml │ ├── values-lt │ │ └── strings.xml │ ├── values-lv │ │ └── strings.xml │ ├── values-mk-rMK │ │ └── strings.xml │ ├── values-mk │ │ └── strings.xml │ ├── values-ml-rIN │ │ └── strings.xml │ ├── values-ml │ │ └── strings.xml │ ├── values-mn-rMN │ │ └── strings.xml │ ├── values-mn │ │ └── strings.xml │ ├── values-mr-rIN │ │ └── strings.xml │ ├── values-mr │ │ └── strings.xml │ ├── values-ms-rMY │ │ └── strings.xml │ ├── values-ms │ │ └── strings.xml │ ├── values-my-rMM │ │ └── strings.xml │ ├── values-my │ │ └── strings.xml │ ├── values-nb │ │ └── strings.xml │ ├── values-ne-rNP │ │ └── strings.xml │ ├── values-ne │ │ └── strings.xml │ ├── values-nl │ │ └── strings.xml │ ├── values-or │ │ └── strings.xml │ ├── values-pa-rIN │ │ └── strings.xml │ ├── values-pa │ │ └── strings.xml │ ├── values-pl │ │ └── strings.xml │ ├── values-pt-rPT │ │ └── strings.xml │ ├── values-pt │ │ └── strings.xml │ ├── values-ro │ │ └── strings.xml │ ├── values-ru │ │ └── strings.xml │ ├── values-si-rLK │ │ └── strings.xml │ ├── values-si │ │ └── strings.xml │ ├── values-sk │ │ └── strings.xml │ ├── values-sl │ │ └── strings.xml │ ├── values-sq-rAL │ │ └── strings.xml │ ├── values-sq │ │ └── strings.xml │ ├── values-sr │ │ └── strings.xml │ ├── values-sv │ │ └── strings.xml │ ├── values-sw │ │ └── strings.xml │ ├── values-ta-rIN │ │ └── strings.xml │ ├── values-ta │ │ └── strings.xml │ ├── values-te-rIN │ │ └── strings.xml │ ├── values-te │ │ └── strings.xml │ ├── values-th │ │ └── strings.xml │ ├── values-tl │ │ └── strings.xml │ ├── values-tr │ │ └── strings.xml │ ├── values-uk │ │ └── strings.xml │ ├── values-ur-rPK │ │ └── strings.xml │ ├── values-ur │ │ └── strings.xml │ ├── values-uz-rUZ │ │ └── strings.xml │ ├── values-uz │ │ └── strings.xml │ ├── values-v26 │ │ └── bools.xml │ ├── values-vi │ │ └── strings.xml │ ├── values-zh-rCN │ │ └── strings.xml │ ├── values-zh-rHK │ │ └── strings.xml │ ├── values-zh-rTW │ │ └── strings.xml │ ├── values-zu │ │ └── strings.xml │ ├── values │ │ ├── dimens.xml │ │ ├── override.xml │ │ └── strings.xml │ └── xml │ │ └── device_profiles.xml └── src_flags │ └── com │ └── android │ └── launcher3 │ └── config │ └── FeatureFlags.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── image ├── launcher01.png ├── launcher02.png ├── launcher03.png ├── launcher04.png ├── launcher05.png ├── launcher06.png ├── launcher07.png ├── launcher08.png ├── launcher09.png └── launcher10.png ├── launcherclient ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── google │ │ └── android │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── google │ │ └── android │ │ ├── launcherclient │ │ ├── BaseProxy.java │ │ ├── BaseStub.java │ │ ├── Codecs.java │ │ ├── Constant.java │ │ └── TransactionInterceptor.java │ │ └── libraries │ │ ├── gsa │ │ └── launcherclient │ │ │ ├── AbsServiceStatusChecker.java │ │ │ ├── AppServiceConnection.java │ │ │ ├── BuildInfo.java │ │ │ ├── EventLogArray.java │ │ │ ├── HotwordServiceChecker.java │ │ │ ├── HotwordServiceConnection.java │ │ │ ├── LauncherClient.java │ │ │ ├── LauncherClientCallbacks.java │ │ │ ├── LauncherClientCallbacksAdapter.java │ │ │ ├── LogInfo.java │ │ │ ├── NotifyStatusRunnable.java │ │ │ ├── OverlayContentChecker.java │ │ │ ├── PrivateCallbacks.java │ │ │ ├── ServiceStatusRunnable.java │ │ │ ├── SimpleServiceConnection.java │ │ │ └── UpdateReceiver.java │ │ └── launcherclient │ │ ├── ILauncherOverlay.java │ │ ├── ILauncherOverlayCallback.java │ │ ├── ILauncherOverlayCallbackSub.java │ │ ├── ILauncherOverlayStub.java │ │ └── LauncherOverlayProxy.java │ └── test │ └── java │ └── com │ └── google │ └── android │ └── ExampleUnitTest.java ├── mxlibrary ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── android │ │ └── mxlibrary │ │ ├── util │ │ ├── DeviceInfoUtil.java │ │ ├── DisplayUtil.java │ │ ├── IoUtil.java │ │ ├── MxHandler.java │ │ ├── PermissionUtil.java │ │ ├── XLog.java │ │ └── XLogSave.java │ │ └── view │ │ ├── CircleImageView.java │ │ ├── RingEffectView.java │ │ └── ViewUtil.java │ └── res │ ├── drawable │ ├── ic_close_black_24dp.png │ ├── ic_home_white_24dp.png │ ├── ic_menu_black_24dp.png │ ├── ic_notifications_white_24dp.png │ ├── ic_place_white_24dp.png │ ├── ic_search_white_24dp.png │ └── ic_settings_white_24dp.png │ └── values │ ├── array.xml │ ├── attrs.xml │ ├── colors.xml │ └── strings.xml ├── mxtheme ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── android │ │ └── mxtheme │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── aidl │ │ └── com │ │ │ └── android │ │ │ └── mxtheme │ │ │ ├── IRemoteCallback.aidl │ │ │ ├── IThemeService.aidl │ │ │ └── bean │ │ │ ├── ThemeBean.aidl │ │ │ └── WallpaperBean.aidl │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── mxtheme │ │ │ ├── IThemeClient.java │ │ │ ├── ThemeActivity.java │ │ │ ├── ThemeClient.java │ │ │ └── bean │ │ │ ├── ThemeBean.java │ │ │ └── WallpaperBean.java │ └── res │ │ ├── layout │ │ └── theme_activity.xml │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── android │ └── mxtheme │ └── ExampleUnitTest.java ├── print_db.py ├── proguard.flags ├── proto_overrides └── launcher_log_extension.proto ├── protos ├── launcher_dump.proto └── launcher_log.proto ├── quickstep ├── AndroidManifest.xml ├── libs │ └── sysui_shared.jar ├── res │ ├── drawable │ │ ├── bg_workspace_card_button.xml │ │ ├── ic_empty_recents.xml │ │ ├── ic_pin.xml │ │ └── ic_split_screen.xml │ ├── layout │ │ ├── fallback_recents_activity.xml │ │ ├── overview_clear_all_button.xml │ │ ├── overview_panel.xml │ │ ├── scrim_view.xml │ │ ├── task.xml │ │ └── task_menu.xml │ ├── values-af │ │ └── strings.xml │ ├── values-am │ │ └── strings.xml │ ├── values-ar │ │ └── strings.xml │ ├── values-as │ │ └── strings.xml │ ├── values-az-rAZ │ │ └── strings.xml │ ├── values-az │ │ └── strings.xml │ ├── values-b+sr+Latn │ │ └── strings.xml │ ├── values-be-rBY │ │ └── strings.xml │ ├── values-be │ │ └── strings.xml │ ├── values-bg │ │ └── strings.xml │ ├── values-bn-rBD │ │ └── strings.xml │ ├── values-bn │ │ └── strings.xml │ ├── values-bs-rBA │ │ └── strings.xml │ ├── values-bs │ │ └── strings.xml │ ├── values-ca │ │ └── strings.xml │ ├── values-cs │ │ └── strings.xml │ ├── values-da │ │ └── strings.xml │ ├── values-de │ │ └── strings.xml │ ├── values-el │ │ └── strings.xml │ ├── values-en-rAU │ │ └── strings.xml │ ├── values-en-rGB │ │ └── strings.xml │ ├── values-en-rIN │ │ └── strings.xml │ ├── values-es-rUS │ │ └── strings.xml │ ├── values-es │ │ └── strings.xml │ ├── values-et-rEE │ │ └── strings.xml │ ├── values-et │ │ └── strings.xml │ ├── values-eu-rES │ │ └── strings.xml │ ├── values-eu │ │ └── strings.xml │ ├── values-fa │ │ └── strings.xml │ ├── values-fi │ │ └── strings.xml │ ├── values-fr-rCA │ │ └── strings.xml │ ├── values-fr │ │ └── strings.xml │ ├── values-gl-rES │ │ └── strings.xml │ ├── values-gl │ │ └── strings.xml │ ├── values-gu-rIN │ │ └── strings.xml │ ├── values-gu │ │ └── strings.xml │ ├── values-hi │ │ └── strings.xml │ ├── values-hr │ │ └── strings.xml │ ├── values-hu │ │ └── strings.xml │ ├── values-hy-rAM │ │ └── strings.xml │ ├── values-hy │ │ └── strings.xml │ ├── values-in │ │ └── strings.xml │ ├── values-is-rIS │ │ └── strings.xml │ ├── values-is │ │ └── strings.xml │ ├── values-it │ │ └── strings.xml │ ├── values-iw │ │ └── strings.xml │ ├── values-ja │ │ └── strings.xml │ ├── values-ka-rGE │ │ └── strings.xml │ ├── values-ka │ │ └── strings.xml │ ├── values-kk-rKZ │ │ └── strings.xml │ ├── values-kk │ │ └── strings.xml │ ├── values-km-rKH │ │ └── strings.xml │ ├── values-km │ │ └── strings.xml │ ├── values-kn-rIN │ │ └── strings.xml │ ├── values-kn │ │ └── strings.xml │ ├── values-ko │ │ └── strings.xml │ ├── values-ky-rKG │ │ └── strings.xml │ ├── values-ky │ │ └── strings.xml │ ├── values-lo-rLA │ │ └── strings.xml │ ├── values-lo │ │ └── strings.xml │ ├── values-lt │ │ └── strings.xml │ ├── values-lv │ │ └── strings.xml │ ├── values-mk-rMK │ │ └── strings.xml │ ├── values-mk │ │ └── strings.xml │ ├── values-ml-rIN │ │ └── strings.xml │ ├── values-ml │ │ └── strings.xml │ ├── values-mn-rMN │ │ └── strings.xml │ ├── values-mn │ │ └── strings.xml │ ├── values-mr-rIN │ │ └── strings.xml │ ├── values-mr │ │ └── strings.xml │ ├── values-ms-rMY │ │ └── strings.xml │ ├── values-ms │ │ └── strings.xml │ ├── values-my-rMM │ │ └── strings.xml │ ├── values-my │ │ └── strings.xml │ ├── values-nb │ │ └── strings.xml │ ├── values-ne-rNP │ │ └── strings.xml │ ├── values-ne │ │ └── strings.xml │ ├── values-nl │ │ └── strings.xml │ ├── values-or │ │ └── strings.xml │ ├── values-pa-rIN │ │ └── strings.xml │ ├── values-pa │ │ └── strings.xml │ ├── values-pl │ │ └── strings.xml │ ├── values-pt-rPT │ │ └── strings.xml │ ├── values-pt │ │ └── strings.xml │ ├── values-ro │ │ └── strings.xml │ ├── values-ru │ │ └── strings.xml │ ├── values-si-rLK │ │ └── strings.xml │ ├── values-si │ │ └── strings.xml │ ├── values-sk │ │ └── strings.xml │ ├── values-sl │ │ └── strings.xml │ ├── values-sq-rAL │ │ └── strings.xml │ ├── values-sq │ │ └── strings.xml │ ├── values-sr │ │ └── strings.xml │ ├── values-sv │ │ └── strings.xml │ ├── values-sw │ │ └── strings.xml │ ├── values-ta-rIN │ │ └── strings.xml │ ├── values-ta │ │ └── strings.xml │ ├── values-te-rIN │ │ └── strings.xml │ ├── values-te │ │ └── strings.xml │ ├── values-th │ │ └── strings.xml │ ├── values-tl │ │ └── strings.xml │ ├── values-tr │ │ └── strings.xml │ ├── values-uk │ │ └── strings.xml │ ├── values-ur-rPK │ │ └── strings.xml │ ├── values-ur │ │ └── strings.xml │ ├── values-uz-rUZ │ │ └── strings.xml │ ├── values-uz │ │ └── strings.xml │ ├── values-vi │ │ └── strings.xml │ ├── values-zh-rCN │ │ └── strings.xml │ ├── values-zh-rHK │ │ └── strings.xml │ ├── values-zh-rTW │ │ └── strings.xml │ ├── values-zu │ │ └── strings.xml │ ├── values │ │ ├── config.xml │ │ ├── dimens.xml │ │ ├── override.xml │ │ └── strings.xml │ └── xml │ │ └── indexable_launcher_prefs.xml └── src │ └── com │ └── android │ ├── launcher3 │ ├── LauncherAnimationRunner.java │ ├── LauncherAppTransitionManagerImpl.java │ ├── LauncherInitListener.java │ └── uioverrides │ │ ├── AllAppsState.java │ │ ├── BackButtonAlphaHandler.java │ │ ├── DisplayRotationListener.java │ │ ├── FastOverviewState.java │ │ ├── LandscapeEdgeSwipeController.java │ │ ├── OverviewState.java │ │ ├── OverviewToAllAppsTouchController.java │ │ ├── PortraitStatesTouchController.java │ │ ├── RecentsViewStateController.java │ │ ├── TaskViewTouchController.java │ │ ├── UiFactory.java │ │ └── WallpaperColorInfo.java │ └── quickstep │ ├── ActivityControlHelper.java │ ├── AnimatedFloat.java │ ├── DeferredTouchConsumer.java │ ├── InstantAppResolverImpl.java │ ├── LauncherSearchIndexablesProvider.java │ ├── LongSwipeHelper.java │ ├── MotionEventQueue.java │ ├── MultiStateCallback.java │ ├── NormalizedIconLoader.java │ ├── OtherActivityTouchConsumer.java │ ├── OverviewCallbacks.java │ ├── OverviewCommandHelper.java │ ├── OverviewInteractionState.java │ ├── QuickScrubController.java │ ├── QuickstepProcessInitializer.java │ ├── RecentsActivity.java │ ├── RecentsActivityTracker.java │ ├── RecentsAnimationWrapper.java │ ├── RecentsModel.java │ ├── RemoteRunnable.java │ ├── TaskOverlayFactory.java │ ├── TaskSystemShortcut.java │ ├── TaskUtils.java │ ├── TouchConsumer.java │ ├── TouchInteractionService.java │ ├── WindowTransformSwipeHandler.java │ ├── fallback │ ├── FallbackRecentsView.java │ ├── RecentsRootView.java │ └── RecentsTaskController.java │ ├── logging │ └── UserEventDispatcherExtension.java │ ├── util │ ├── ClipAnimationHelper.java │ ├── LayoutUtils.java │ ├── MultiValueUpdateListener.java │ ├── RemoteAnimationProvider.java │ ├── RemoteAnimationTargetSet.java │ ├── RemoteFadeOutAnimationListener.java │ ├── TaskViewDrawable.java │ └── TransformedRect.java │ └── views │ ├── ClearAllButton.java │ ├── IconView.java │ ├── LauncherLayoutListener.java │ ├── LauncherRecentsView.java │ ├── RecentsView.java │ ├── RecentsViewContainer.java │ ├── ShelfScrimView.java │ ├── TaskMenuView.java │ ├── TaskThumbnailView.java │ └── TaskView.java ├── res ├── anim │ ├── anim_menu_in.xml │ ├── no_anim.xml │ └── task_open_enter.xml ├── animator-v23 │ └── discovery_bounce.xml ├── animator │ ├── all_apps_fastscroll_icon_anim.xml │ ├── discovery_bounce.xml │ └── overview_button_anim.xml ├── color-v24 │ ├── all_apps_bg_hand_fill.xml │ └── all_apps_bg_hand_fill_dark.xml ├── color │ └── all_apps_tab_text.xml ├── drawable-hdpi │ ├── cross.png │ ├── cube_in.png │ ├── cube_out.png │ ├── effect_cross.png │ ├── effect_cube_in.png │ ├── effect_cube_out.png │ ├── effect_normals.png │ ├── effect_page.png │ ├── effect_scale.png │ ├── effect_windmill.png │ ├── ic_allapps.png │ ├── ic_allapps_pressed.png │ ├── ic_widget_resize_handle.png │ ├── in_use.png │ ├── menu_effect_item.png │ ├── menu_effect_item_normal.png │ ├── menu_effect_item_press.png │ ├── menu_effect_item_pressed.png │ ├── menu_theme_item.png │ ├── menu_theme_item_pressed.png │ ├── menu_widget_item.png │ ├── menu_widget_item_press.png │ ├── widget_resize_frame.9.png │ ├── widget_resize_shadow.9.png │ ├── work_tab_user_education.png │ └── workspace_bg.9.png ├── drawable-mdpi │ ├── ic_allapps.png │ ├── ic_allapps_pressed.png │ ├── ic_widget_resize_handle.png │ ├── widget_resize_frame.9.png │ ├── widget_resize_shadow.9.png │ ├── work_tab_user_education.png │ └── workspace_bg.9.png ├── drawable-v24 │ ├── ic_remove_shadow.xml │ ├── ic_setup_shadow.xml │ └── ic_uninstall_shadow.xml ├── drawable-v26 │ ├── adaptive_icon_drawable_wrapper.xml │ └── ic_launcher_home.xml ├── drawable-xhdpi │ ├── ic_allapps.png │ ├── ic_allapps_pressed.png │ ├── ic_uninstall.png │ ├── ic_widget_resize_handle.png │ ├── widget_resize_frame.9.png │ ├── widget_resize_shadow.9.png │ ├── work_tab_user_education.png │ └── workspace_bg.9.png ├── drawable-xxhdpi │ ├── effect.png │ ├── ic_allapps.png │ ├── ic_allapps_pressed.png │ ├── ic_widget_resize_handle.png │ ├── plus.png │ ├── setting.png │ ├── theme.png │ ├── wallpapaer.png │ ├── widget.png │ ├── widget_resize_frame.9.png │ ├── widget_resize_shadow.9.png │ ├── work_tab_user_education.png │ └── workspace_bg.9.png ├── drawable-xxxhdpi │ ├── ic_widget_resize_handle.png │ ├── widget_resize_frame.9.png │ ├── widget_resize_shadow.9.png │ └── workspace_bg.9.png ├── drawable │ ├── all_apps_button_icon.xml │ ├── all_apps_divider.xml │ ├── all_apps_search_hint.xml │ ├── bg_all_apps_searchbox.xml │ ├── bg_celllayout.xml │ ├── bg_deferred_app_widget.xml │ ├── bg_notification_content.xml │ ├── deep_shortcuts_drag_handle.xml │ ├── drag_handle_indicator.xml │ ├── gutter_horizontal.xml │ ├── horizontal_ellipsis.xml │ ├── ic_all_apps_bg_hand.xml │ ├── ic_all_apps_bg_icon_1.xml │ ├── ic_all_apps_bg_icon_2.xml │ ├── ic_all_apps_bg_icon_3.xml │ ├── ic_all_apps_bg_icon_4.xml │ ├── ic_allapps_search.xml │ ├── ic_close.xml │ ├── ic_corp.xml │ ├── ic_info_no_shadow.xml │ ├── ic_install_no_shadow.xml │ ├── ic_instant_app_badge.xml │ ├── ic_launcher_home.xml │ ├── ic_remove_no_shadow.xml │ ├── ic_setting.xml │ ├── ic_uninstall_no_shadow.xml │ ├── ic_wallpaper.xml │ ├── ic_warning.xml │ ├── ic_widget.xml │ ├── pending_widget_bg.xml │ ├── round_rect_primary.xml │ ├── selector_effect_cross.xml │ ├── selector_effect_cube_in.xml │ ├── selector_effect_cube_out.xml │ ├── selector_effect_noraml.xml │ ├── selector_effect_scale.xml │ ├── selector_effect_windmill.xml │ ├── selector_menu_effect.xml │ ├── selector_menu_theme.xml │ ├── selector_menu_widget.xml │ ├── shape_menu_item_bg.xml │ ├── tooltip_frame.xml │ ├── top_round_rect_primary.xml │ └── widget_internal_focus_bg.xml ├── interpolator │ ├── decelerate_quart.xml │ ├── decelerate_quint.xml │ ├── disco_bounce.xml │ ├── folder_interpolator.xml │ ├── large_folder_preview_item_close_interpolator.xml │ └── large_folder_preview_item_open_interpolator.xml ├── layout │ ├── add_item_confirmation_activity.xml │ ├── app_icon.xml │ ├── app_widget_resize_frame.xml │ ├── appwidget_error.xml │ ├── appwidget_not_ready.xml │ ├── circle_menu.xml │ ├── custom_content.xml │ ├── deep_shortcut.xml │ ├── drop_target_bar.xml │ ├── drop_target_tool_tip.xml │ ├── folder_application.xml │ ├── folder_icon.xml │ ├── folder_page.xml │ ├── hotseat.xml │ ├── launcher.xml │ ├── longpress_options_menu.xml │ ├── menu_item_layout.xml │ ├── menu_layout.xml │ ├── notification_content.xml │ ├── notification_gutter.xml │ ├── notification_pref_warning.xml │ ├── overview_panel.xml │ ├── popup_container.xml │ ├── popup_widget.xml │ ├── qsb_default_view.xml │ ├── search_container_all_apps.xml │ ├── search_container_workspace.xml │ ├── system_shortcut.xml │ ├── system_shortcut_icon_only.xml │ ├── system_shortcut_icons.xml │ ├── user_folder_icon_normalized.xml │ ├── widget_cell.xml │ ├── widget_cell_content.xml │ ├── widget_list_divider.xml │ ├── widgets_bottom_sheet.xml │ ├── widgets_full_sheet.xml │ ├── widgets_list_row_view.xml │ ├── widgets_scroll_container.xml │ ├── work_tab_bottom_user_education_view.xml │ ├── work_tab_footer.xml │ └── workspace_screen.xml ├── mipmap-hdpi │ ├── ic_launcher_home.png │ └── ic_launcher_home_foreground.png ├── mipmap-mdpi │ ├── ic_launcher_home.png │ └── ic_launcher_home_foreground.png ├── mipmap-xhdpi │ ├── ic_launcher_home.png │ └── ic_launcher_home_foreground.png ├── mipmap-xxhdpi │ ├── ic_launcher_home.png │ └── ic_launcher_home_foreground.png ├── raw │ └── downgrade_schema.json ├── values-af │ └── strings.xml ├── values-am │ └── strings.xml ├── values-ar │ └── strings.xml ├── values-as │ └── strings.xml ├── values-az-rAZ │ └── strings.xml ├── values-az │ └── strings.xml ├── values-b+sr+Latn │ └── strings.xml ├── values-be-rBY │ └── strings.xml ├── values-be │ └── strings.xml ├── values-bg │ └── strings.xml ├── values-bn-rBD │ └── strings.xml ├── values-bn │ └── strings.xml ├── values-bs-rBA │ └── strings.xml ├── values-bs │ └── strings.xml ├── values-ca │ └── strings.xml ├── values-cs │ └── strings.xml ├── values-da │ └── strings.xml ├── values-de │ └── strings.xml ├── values-el │ └── strings.xml ├── values-en-rAU │ └── strings.xml ├── values-en-rGB │ └── strings.xml ├── values-en-rIN │ └── strings.xml ├── values-es-rUS │ └── strings.xml ├── values-es │ └── strings.xml ├── values-et-rEE │ └── strings.xml ├── values-et │ └── strings.xml ├── values-eu-rES │ └── strings.xml ├── values-eu │ └── strings.xml ├── values-fa │ └── strings.xml ├── values-fi │ └── strings.xml ├── values-fr-rCA │ └── strings.xml ├── values-fr │ └── strings.xml ├── values-gl-rES │ └── strings.xml ├── values-gl │ └── strings.xml ├── values-gu-rIN │ └── strings.xml ├── values-gu │ └── strings.xml ├── values-hi │ └── strings.xml ├── values-hr │ └── strings.xml ├── values-hu │ └── strings.xml ├── values-hy-rAM │ └── strings.xml ├── values-hy │ └── strings.xml ├── values-in │ └── strings.xml ├── values-is-rIS │ └── strings.xml ├── values-is │ └── strings.xml ├── values-it │ └── strings.xml ├── values-iw │ └── strings.xml ├── values-ja │ └── strings.xml ├── values-ka-rGE │ └── strings.xml ├── values-ka │ └── strings.xml ├── values-kk-rKZ │ └── strings.xml ├── values-kk │ └── strings.xml ├── values-km-rKH │ └── strings.xml ├── values-km │ └── strings.xml ├── values-kn-rIN │ └── strings.xml ├── values-kn │ └── strings.xml ├── values-ko │ └── strings.xml ├── values-ky-rKG │ └── strings.xml ├── values-ky │ └── strings.xml ├── values-land │ └── dimens.xml ├── values-lo-rLA │ └── strings.xml ├── values-lo │ └── strings.xml ├── values-lt │ └── strings.xml ├── values-lv │ └── strings.xml ├── values-mk-rMK │ └── strings.xml ├── values-mk │ └── strings.xml ├── values-ml-rIN │ └── strings.xml ├── values-ml │ └── strings.xml ├── values-mn-rMN │ └── strings.xml ├── values-mn │ └── strings.xml ├── values-mr-rIN │ └── strings.xml ├── values-mr │ └── strings.xml ├── values-ms-rMY │ └── strings.xml ├── values-ms │ └── strings.xml ├── values-my-rMM │ └── strings.xml ├── values-my │ └── strings.xml ├── values-nb │ └── strings.xml ├── values-ne-rNP │ └── strings.xml ├── values-ne │ └── strings.xml ├── values-nl │ └── strings.xml ├── values-or │ └── strings.xml ├── values-pa-rIN │ └── strings.xml ├── values-pa │ └── strings.xml ├── values-pl │ └── strings.xml ├── values-pt-rPT │ └── strings.xml ├── values-pt │ └── strings.xml ├── values-rm │ └── strings.xml ├── values-ro │ └── strings.xml ├── values-ru │ └── strings.xml ├── values-si-rLK │ └── strings.xml ├── values-si │ └── strings.xml ├── values-sk │ └── strings.xml ├── values-sl │ └── strings.xml ├── values-sq-rAL │ └── strings.xml ├── values-sq │ └── strings.xml ├── values-sr │ └── strings.xml ├── values-sv │ └── strings.xml ├── values-sw │ └── strings.xml ├── values-sw340dp │ └── dimens.xml ├── values-sw600dp │ ├── config.xml │ └── dimens.xml ├── values-sw720dp │ ├── config.xml │ ├── dimens.xml │ └── styles.xml ├── values-ta-rIN │ └── strings.xml ├── values-ta │ └── strings.xml ├── values-te-rIN │ └── strings.xml ├── values-te │ └── strings.xml ├── values-th │ └── strings.xml ├── values-tl │ └── strings.xml ├── values-tr │ └── strings.xml ├── values-uk │ └── strings.xml ├── values-ur-rPK │ └── strings.xml ├── values-ur │ └── strings.xml ├── values-uz-rUZ │ └── strings.xml ├── values-uz │ └── strings.xml ├── values-v19 │ └── styles.xml ├── values-v21 │ └── styles.xml ├── values-v26 │ ├── bools.xml │ └── styles.xml ├── values-vi │ └── strings.xml ├── values-zh-rCN │ └── strings.xml ├── values-zh-rHK │ └── strings.xml ├── values-zh-rTW │ └── strings.xml ├── values-zu │ └── strings.xml ├── values │ ├── attrs.xml │ ├── bools.xml │ ├── colors.xml │ ├── config.xml │ ├── dimens.xml │ ├── drawables.xml │ ├── integers.xml │ ├── strings.xml │ └── styles.xml └── xml │ ├── backupscheme.xml │ ├── custom_widgets.xml │ ├── default_workspace_3x3.xml │ ├── default_workspace_4x4.xml │ ├── default_workspace_5x5.xml │ ├── default_workspace_5x6.xml │ ├── device_profiles.xml │ ├── dw_phone_hotseat.xml │ ├── dw_tablet_hotseat.xml │ └── launcher_preferences.xml ├── settings.gradle ├── src └── com │ └── android │ └── launcher3 │ ├── AbstractFloatingView.java │ ├── Alarm.java │ ├── AllAppsList.java │ ├── AppFilter.java │ ├── AppWidgetResizeFrame.java │ ├── AppWidgetsRestoredReceiver.java │ ├── AutoInstallsLayout.java │ ├── BaseActivity.java │ ├── BaseDraggingActivity.java │ ├── BaseRecyclerView.java │ ├── BubbleTextView.java │ ├── ButtonDropTarget.java │ ├── CellLayout.java │ ├── CheckLongPressHelper.java │ ├── CircularSlidePagedView.java │ ├── DefaultLayoutParser.java │ ├── DeleteDropTarget.java │ ├── DeviceProfile.java │ ├── DragSource.java │ ├── DropTarget.java │ ├── DropTargetBar.java │ ├── ExtendedEditText.java │ ├── FastBitmapDrawable.java │ ├── FirstFrameAnimatorHelper.java │ ├── FocusHelper.java │ ├── FolderInfo.java │ ├── FullscreenKeyEventListener.java │ ├── Hotseat.java │ ├── IconCache.java │ ├── IconProvider.java │ ├── Insettable.java │ ├── InsettableFrameLayout.java │ ├── InstallShortcutReceiver.java │ ├── InterruptibleInOutAnimator.java │ ├── InvariantDeviceProfile.java │ ├── ItemInfo.java │ ├── ItemInfoWithIcon.java │ ├── Launcher.java │ ├── LauncherAnimUtils.java │ ├── LauncherAppState.java │ ├── LauncherAppTransitionManager.java │ ├── LauncherAppWidgetHost.java │ ├── LauncherAppWidgetInfo.java │ ├── LauncherAppWidgetProviderInfo.java │ ├── LauncherBackupAgent.java │ ├── LauncherCallbacks.java │ ├── LauncherCallbacksImpl.java │ ├── LauncherExterns.java │ ├── LauncherFiles.java │ ├── LauncherModel.java │ ├── LauncherOverlayImpl.java │ ├── LauncherPlus.java │ ├── LauncherProvider.java │ ├── LauncherProviderChangeListener.java │ ├── LauncherRootView.java │ ├── LauncherScroller.java │ ├── LauncherSettings.java │ ├── LauncherState.java │ ├── LauncherStateManager.java │ ├── LogAccelerateInterpolator.java │ ├── LogDecelerateInterpolator.java │ ├── MainProcessInitializer.java │ ├── MainThreadExecutor.java │ ├── OnAlarmListener.java │ ├── OverviewButtonClickListener.java │ ├── PagedView.java │ ├── Partner.java │ ├── PendingAddItemInfo.java │ ├── PromiseAppInfo.java │ ├── SecondaryDropTarget.java │ ├── SessionCommitReceiver.java │ ├── SettingsActivity.java │ ├── ShortcutAndWidgetContainer.java │ ├── ShortcutInfo.java │ ├── SimpleOnStylusPressListener.java │ ├── StylusEventHelper.java │ ├── TransitionStates.java │ ├── Utilities.java │ ├── WidgetPreviewLoader.java │ ├── Workspace.java │ ├── WorkspaceStateTransitionAnimation.java │ ├── accessibility │ ├── AccessibleDragListenerAdapter.java │ ├── DragAndDropAccessibilityDelegate.java │ ├── DragViewStateAnnouncer.java │ ├── FolderAccessibilityHelper.java │ ├── LauncherAccessibilityDelegate.java │ ├── ShortcutMenuAccessibilityDelegate.java │ └── WorkspaceAccessibilityHelper.java │ ├── allapps │ ├── AllAppsBackgroundDrawable.java │ ├── DiscoveryBounce.java │ ├── MenuTransitionController.java │ ├── WorkModeSwitch.java │ └── search │ │ ├── AllAppsSearchBarController.java │ │ ├── DefaultAppSearchAlgorithm.java │ │ └── SearchAlgorithm.java │ ├── anim │ ├── AlphaUpdateListener.java │ ├── AnimationLayerSet.java │ ├── AnimationSuccessListener.java │ ├── AnimatorPlaybackController.java │ ├── AnimatorSetBuilder.java │ ├── Interpolators.java │ ├── PropertyListBuilder.java │ ├── PropertyResetListener.java │ ├── PropertySetter.java │ ├── RevealOutlineAnimation.java │ └── RoundedRectRevealOutlineProvider.java │ ├── badge │ ├── BadgeInfo.java │ ├── BadgeRenderer.java │ └── FolderBadgeInfo.java │ ├── compat │ ├── AccessibilityManagerCompat.java │ ├── AlphabeticIndexCompat.java │ ├── AppWidgetManagerCompat.java │ ├── AppWidgetManagerCompatVL.java │ ├── AppWidgetManagerCompatVO.java │ ├── LauncherAppsCompat.java │ ├── LauncherAppsCompatVL.java │ ├── LauncherAppsCompatVO.java │ ├── PackageInstallerCompat.java │ ├── PackageInstallerCompatVL.java │ ├── ShortcutConfigActivityInfo.java │ ├── UserManagerCompat.java │ ├── UserManagerCompatVL.java │ ├── UserManagerCompatVM.java │ ├── UserManagerCompatVN.java │ ├── UserManagerCompatVNMr1.java │ └── UserManagerCompatVP.java │ ├── config │ └── BaseFlags.java │ ├── customcontent │ ├── CustomContent.java │ └── CustomContentCallbacks.java │ ├── dragndrop │ ├── AddItemActivity.java │ ├── BaseItemDragListener.java │ ├── DragController.java │ ├── DragDriver.java │ ├── DragLayer.java │ ├── DragOptions.java │ ├── DragView.java │ ├── FlingToDeleteHelper.java │ ├── FolderAdaptiveIcon.java │ ├── LivePreviewWidgetCell.java │ ├── PinItemDragListener.java │ ├── PinShortcutRequestActivityInfo.java │ ├── PinWidgetFlowHandler.java │ └── SpringLoadedDragController.java │ ├── effect │ └── TransitionEffect.java │ ├── folder │ ├── ClippedFolderIconLayoutRule.java │ ├── Folder.java │ ├── FolderAnimationManager.java │ ├── FolderIcon.java │ ├── FolderIconPreviewVerifier.java │ ├── FolderPagedView.java │ ├── FolderPreviewItemAnim.java │ ├── PreviewBackground.java │ ├── PreviewItemDrawingParams.java │ └── PreviewItemManager.java │ ├── graphics │ ├── BitmapInfo.java │ ├── BitmapRenderer.java │ ├── ColorExtractor.java │ ├── ColorScrim.java │ ├── DragPreviewProvider.java │ ├── DrawableFactory.java │ ├── FastScrollThumbDrawable.java │ ├── FixedScaleDrawable.java │ ├── IconNormalizer.java │ ├── IconPalette.java │ ├── IconShapeOverride.java │ ├── LauncherIcons.java │ ├── NinePatchDrawHelper.java │ ├── PreloadIconDrawable.java │ ├── ShadowDrawable.java │ ├── ShadowGenerator.java │ ├── TintedDrawableSpan.java │ ├── TriangleShape.java │ ├── ViewScrim.java │ └── WorkspaceAndHotseatScrim.java │ ├── imp │ └── ImpUninstallIconShowListener.java │ ├── keyboard │ ├── CustomActionsPopup.java │ ├── FocusIndicatorHelper.java │ ├── FocusedItemDecorator.java │ └── ViewGroupFocusHelper.java │ ├── logging │ ├── DumpTargetWrapper.java │ ├── FileLog.java │ ├── LoggerUtils.java │ └── UserEventDispatcher.java │ ├── menu │ ├── CircleMenuModel.java │ ├── CircleMenuView.java │ ├── MenuDataModel.java │ ├── MenuDeviceProfile.java │ ├── MenuSweeper.java │ ├── MenuView.java │ ├── adapter │ │ ├── BaseMenuAdapter.java │ │ ├── MenuAdapter.java │ │ ├── MenuEffectAdapter.java │ │ ├── MenuWidgetAdapter.java │ │ └── MenuWidgetMinorAdapter.java │ ├── anim │ │ ├── MenuStateTransitionAnimation.java │ │ └── TransitionStates.java │ ├── bean │ │ ├── MenuItem.java │ │ └── WidgetItem.java │ ├── controller │ │ ├── MenuController.java │ │ ├── MenuEffectController.java │ │ ├── MenuWidgetController.java │ │ ├── MenuWidgetMinorController.java │ │ └── SupperMenuController.java │ ├── imp │ │ ├── IMenuAdapter.java │ │ ├── IMenuControllerListener.java │ │ ├── IMenuManager.java │ │ ├── IMenuSelectListener.java │ │ ├── IMenuWidgetPreviewLoader.java │ │ ├── OnMenuClickListener.java │ │ └── OnMenuLongClickListener.java │ └── view │ │ ├── CircleMenuItemView.java │ │ ├── HorizontalPageScrollView.java │ │ ├── MenuEffectItemView.java │ │ ├── MenuItemView.java │ │ ├── MenuLayout.java │ │ └── MenuWidgetItemView.java │ ├── model │ ├── AddWorkspaceItemsNoPositionTask.java │ ├── AddWorkspaceItemsTask.java │ ├── BaseModelUpdateTask.java │ ├── BgDataModel.java │ ├── CacheDataUpdatedTask.java │ ├── DbDowngradeHelper.java │ ├── FirstScreenBroadcast.java │ ├── GridSizeMigrationTask.java │ ├── LoaderCursor.java │ ├── LoaderResults.java │ ├── LoaderTask.java │ ├── ModelPreload.java │ ├── ModelWriter.java │ ├── PackageInstallStateChangedTask.java │ ├── PackageItemInfo.java │ ├── PackageUpdatedTask.java │ ├── SdCardAvailableReceiver.java │ ├── ShortcutsChangedTask.java │ ├── UserLockStateChangedTask.java │ ├── WidgetItem.java │ └── WidgetsModel.java │ ├── notification │ ├── NotificationFooterLayout.java │ ├── NotificationGroup.java │ ├── NotificationInfo.java │ ├── NotificationItemView.java │ ├── NotificationKeyData.java │ ├── NotificationListener.java │ └── NotificationMainView.java │ ├── pageindicators │ ├── PageIndicator.java │ ├── PageIndicatorDots.java │ └── WorkspacePageIndicator.java │ ├── pinch │ ├── PinchAnimationManager.java │ ├── PinchThresholdManager.java │ └── PinchToOverviewListener.java │ ├── popup │ ├── ArrowPopup.java │ ├── PopupContainerWithArrow.java │ ├── PopupDataProvider.java │ ├── PopupPopulator.java │ ├── PopupWidgetWithArrow.java │ └── SystemShortcut.java │ ├── provider │ ├── ImportDataTask.java │ ├── LauncherDbUtils.java │ ├── LossyScreenMigrationTask.java │ └── RestoreDbTask.java │ ├── qsb │ ├── QsbContainerView.java │ └── QsbWidgetHostView.java │ ├── setting │ └── MxSettings.java │ ├── shortcuts │ ├── DeepShortcutManager.java │ ├── DeepShortcutTextView.java │ ├── DeepShortcutView.java │ ├── ShortcutCache.java │ ├── ShortcutDragPreviewProvider.java │ ├── ShortcutInfoCompat.java │ └── ShortcutKey.java │ ├── states │ ├── EditingState.java │ ├── InternalStateHandler.java │ ├── MenuState.java │ ├── OverViewClipState.java │ ├── OverViewCreateFolderState.java │ ├── OverViewMultipleUninstallState.java │ ├── OverViewSpringLoadedState.java │ ├── RotationHelper.java │ └── SpringLoadedState.java │ ├── theme │ └── ThemeService.java │ ├── touch │ ├── AbstractStateChangeTouchController.java │ ├── ItemClickHandler.java │ ├── ItemLongClickListener.java │ ├── OverScroll.java │ ├── SwipeDetector.java │ └── WorkspaceTouchListener.java │ ├── uninstall │ ├── UninstallIconAnimUtil.java │ └── UninstallOrDeleteUtil.java │ ├── util │ ├── AbstractHandler.java │ ├── ActivityResultInfo.java │ ├── CellAndSpan.java │ ├── ComponentKey.java │ ├── ConfigMonitor.java │ ├── ContentWriter.java │ ├── DrawEditIcons.java │ ├── FlagOp.java │ ├── FlingAnimation.java │ ├── FlingBlockCheck.java │ ├── FloatRange.java │ ├── FocusLogic.java │ ├── GridOccupancy.java │ ├── IOUtils.java │ ├── InstantAppResolver.java │ ├── ItemInfoMatcher.java │ ├── LabelComparator.java │ ├── LauncherSpUtil.java │ ├── ListViewHighlighter.java │ ├── LogConfig.java │ ├── LongArrayMap.java │ ├── LooperExecutor.java │ ├── LooperIdleLock.java │ ├── MultiHashMap.java │ ├── MultiValueAlpha.java │ ├── NoLocaleSQLiteHelper.java │ ├── PackageManagerHelper.java │ ├── PackageUserKey.java │ ├── ParcelableSparseArray.java │ ├── PendingAnimation.java │ ├── PendingRequestArgs.java │ ├── Preconditions.java │ ├── Provider.java │ ├── SQLiteCacheHelper.java │ ├── SettingUtil.java │ ├── SettingsObserver.java │ ├── SystemUiController.java │ ├── Themes.java │ ├── Thunk.java │ ├── TouchController.java │ ├── TraceHelper.java │ ├── TransformingTouchDelegate.java │ ├── UiThreadHelper.java │ ├── ViewOnDrawExecutor.java │ └── WallpaperOffsetInterpolator.java │ ├── views │ ├── AbstractSlideInView.java │ ├── BaseDragLayer.java │ ├── BottomUserEducationView.java │ ├── ButtonPreference.java │ ├── DoubleShadowBubbleTextView.java │ ├── OptionsPopupView.java │ ├── RecyclerViewFastScroller.java │ ├── SpringRelativeLayout.java │ ├── TopRoundedCornerView.java │ └── WorkFooterContainer.java │ └── widget │ ├── BaseWidgetSheet.java │ ├── DeferredAppWidgetHostView.java │ ├── LauncherAppWidgetHostView.java │ ├── PendingAddShortcutInfo.java │ ├── PendingAddWidgetInfo.java │ ├── PendingAppWidgetHostView.java │ ├── PendingItemDragHelper.java │ ├── WidgetAddFlowHandler.java │ ├── WidgetCell.java │ ├── WidgetHostViewLoader.java │ ├── WidgetImageView.java │ ├── WidgetItemComparator.java │ ├── WidgetListRowEntry.java │ ├── WidgetsBottomSheet.java │ ├── WidgetsDiffReporter.java │ ├── WidgetsFullSheet.java │ ├── WidgetsListAdapter.java │ ├── WidgetsRecyclerView.java │ ├── WidgetsRowViewHolder.java │ └── custom │ ├── CustomAppWidgetProviderInfo.java │ └── CustomWidgetParser.java ├── src_flags └── com │ └── android │ └── launcher3 │ └── config │ └── FeatureFlags.java ├── src_ui_overrides └── com │ └── android │ └── launcher3 │ └── uioverrides │ ├── AllAppsSwipeController.java │ ├── DisplayRotationListener.java │ ├── FastOverviewState.java │ ├── OverviewState.java │ ├── UiFactory.java │ ├── WallpaperColorInfo.java │ └── dynamicui │ ├── ColorExtractionAlgorithm.java │ ├── WallpaperColorsCompat.java │ ├── WallpaperManagerCompat.java │ ├── WallpaperManagerCompatVL.java │ └── WallpaperManagerCompatVOMR1.java ├── tests ├── AndroidManifest-common.xml ├── AndroidManifest.xml └── res │ ├── drawable │ └── test_drawable_pin_item.xml │ ├── layout │ ├── test_layout_appwidget_blue.xml │ ├── test_layout_appwidget_red.xml │ └── test_layout_appwidget_view.xml │ ├── raw │ ├── cache_data_updated_task_data.txt │ ├── db_schema_v10.json │ └── package_install_state_change_task_data.txt │ └── xml │ ├── appwidget_hidden.xml │ ├── appwidget_no_config.xml │ └── appwidget_with_config.xml └── uml └── Launcher3.mdj /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | 5 | --- 6 | 7 | **Describe the bug** 8 | A clear and concise description of what the bug is. 9 | 10 | **To Reproduce** 11 | Steps to reproduce the behavior: 12 | 1. Go to '...' 13 | 2. Click on '....' 14 | 3. Scroll down to '....' 15 | 4. See error 16 | 17 | **Expected behavior** 18 | A clear and concise description of what you expected to happen. 19 | 20 | **Screenshots** 21 | If applicable, add screenshots to help explain your problem. 22 | 23 | **Desktop (please complete the following information):** 24 | - OS: [e.g. iOS] 25 | - Browser [e.g. chrome, safari] 26 | - Version [e.g. 22] 27 | 28 | **Smartphone (please complete the following information):** 29 | - Device: [e.g. iPhone6] 30 | - OS: [e.g. iOS8.1] 31 | - Browser [e.g. stock browser, safari] 32 | - Version [e.g. 22] 33 | 34 | **Additional context** 35 | Add any other context about the problem here. 36 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/custom.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Custom issue template 3 | about: Describe this issue template's purpose here. 4 | 5 | --- 6 | 7 | 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. 18 | -------------------------------------------------------------------------------- /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android CI - Build and Release 2 | 3 | on: 4 | push: 5 | branches: [ "develop" ] 6 | pull_request: 7 | branches: [ "develop" ] 8 | 9 | jobs: 10 | apk: 11 | name: Generate APK 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v2.4.0 16 | - name: Branch name 17 | run: echo running on branch ${GITHUB_REF##*/} 18 | - name: Setup JDK 19 | uses: actions/setup-java@v2.5.0 20 | with: 21 | distribution: temurin 22 | java-version: "11" 23 | - name: Set execution flag for gradlew 24 | run: chmod +x gradlew 25 | - name: Build APK 26 | run: bash ./gradlew assembleDebug --stacktrace 27 | - name: Upload APK 28 | uses: actions/upload-artifact@v1 29 | with: 30 | name: apk 31 | path: app/build/outputs/apk/debug/app-debug.apk 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | .gitignore 3 | .gradle/ 4 | .idea/ 5 | build/ 6 | mxlibrary/mxlibrary.iml 7 | mxtheme/mxtheme.iml 8 | Launcher3-master.iml 9 | 10 | effectivecard/effectivecard.iml 11 | launcherclient/launcherclient.iml 12 | local.properties 13 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-architect -------------------------------------------------------------------------------- /effectivecard/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion rootProject.compileSdkVersion 5 | 6 | defaultConfig { 7 | minSdkVersion rootProject.minSdkVersion 8 | targetSdkVersion rootProject.targetSdkVersion 9 | 10 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 11 | consumerProguardFiles 'consumer-rules.pro' 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | 21 | } 22 | 23 | dependencies { 24 | implementation fileTree(dir: 'libs', include: ['*.jar']) 25 | implementation project(':mxlibrary') 26 | implementation project(':floatwindow') 27 | implementation 'androidx.appcompat:appcompat:1.2.0' 28 | testImplementation 'junit:junit:4.13.2' 29 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 30 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 31 | } 32 | -------------------------------------------------------------------------------- /effectivecard/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/effectivecard/consumer-rules.pro -------------------------------------------------------------------------------- /effectivecard/libs/launcher_client.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/effectivecard/libs/launcher_client.jar -------------------------------------------------------------------------------- /effectivecard/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /effectivecard/src/androidTest/java/com/codemx/effectivecard/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.codemx.effectivecard; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("com.codemx.effectivecard.test", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /effectivecard/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /effectivecard/src/main/aidl/com/codemx/effectivecard/launcherclient/ILauncherOverlayCallback.aidl: -------------------------------------------------------------------------------- 1 | // ILauncherOverlayCallback.aidl 2 | package com.codemx.effectivecard.launcherclient; 3 | 4 | // Declare any non-default types here with import statements 5 | // 负一屏返回给Launcher的回调函数 6 | 7 | interface ILauncherOverlayCallback { 8 | 9 | // 负一屏滑动时通知桌面 10 | void overlayScrollChanged(float progress); 11 | 12 | // 负一屏状态回调 13 | void overlayStatusChanged(int overlayAttached); 14 | 15 | // 状态栏回调,需要Launcher去处理 16 | void requestStatusBarState(int state); 17 | 18 | // 请求调用搜索栏 19 | void requestSearchActivity(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /effectivecard/src/main/aidl/com/codemx/effectivecard/launcherclient/MxLayoutParams.aidl: -------------------------------------------------------------------------------- 1 | // LayoutParams.aidl 2 | package com.codemx.effectivecard.launcherclient; 3 | 4 | parcelable MxLayoutParams; 5 | -------------------------------------------------------------------------------- /effectivecard/src/main/aidl/com/codemx/effectivecard/launcherclient/MxMessage.aidl: -------------------------------------------------------------------------------- 1 | // MxMessage.aidl 2 | package com.codemx.effectivecard.launcherclient; 3 | 4 | // Declare any non-default types here with import statements 5 | 6 | parcelable MxMessage; 7 | -------------------------------------------------------------------------------- /effectivecard/src/main/java/com/codemx/effectivecard/launcherclient/Constant.java: -------------------------------------------------------------------------------- 1 | package com.codemx.effectivecard.launcherclient; 2 | 3 | /** 4 | * Created by yuchuan 5 | * DATE 2020/4/17 6 | * TIME 14:58 7 | */ 8 | public final class Constant { 9 | 10 | public static final String GSA_PACKAGE = "com.codemx.effectcard";// 负一屏包名 11 | public static final String ACTION = "com.codemx.launcher3.WINDOW_OVERLAY"; 12 | 13 | } 14 | -------------------------------------------------------------------------------- /effectivecard/src/main/java/com/codemx/effectivecard/launcherclient/LauncherClientCallback.java: -------------------------------------------------------------------------------- 1 | package com.codemx.effectivecard.launcherclient; 2 | 3 | /** 4 | * Created by yuchuan 5 | * DATE 2020/4/28 6 | * TIME 16:17 7 | */ 8 | public interface LauncherClientCallback { 9 | 10 | void onOverlayScrollChanged(float progress); 11 | 12 | void onServiceStateChanged(boolean connected, boolean connecting); 13 | 14 | void requestStatusBarState(int state); 15 | 16 | void requestSearchActivity(); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /effectivecard/src/main/java/com/codemx/effectivecard/launcherclient/LauncherClientCallbackAdapter.java: -------------------------------------------------------------------------------- 1 | package com.codemx.effectivecard.launcherclient; 2 | 3 | /** 4 | * Created by yuchuan 5 | * DATE 2020/4/28 6 | * TIME 16:18 7 | */ 8 | public class LauncherClientCallbackAdapter implements LauncherClientCallback { 9 | @Override 10 | public void onOverlayScrollChanged(float progress) { 11 | 12 | } 13 | 14 | @Override 15 | public void onServiceStateChanged(boolean connected, boolean connecting) { 16 | 17 | } 18 | 19 | @Override 20 | public void requestStatusBarState(int state) { 21 | 22 | } 23 | 24 | @Override 25 | public void requestSearchActivity() { 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /effectivecard/src/main/java/com/codemx/effectivecard/launcherclient/MxLayoutParams.java: -------------------------------------------------------------------------------- 1 | package com.codemx.effectivecard.launcherclient; 2 | 3 | import android.os.Parcel; 4 | import android.os.Parcelable; 5 | import android.view.WindowManager; 6 | 7 | public class MxLayoutParams extends WindowManager.LayoutParams implements Parcelable{ 8 | 9 | MxLayoutParams() { 10 | super(); 11 | } 12 | 13 | private MxLayoutParams(Parcel in) { 14 | super(in); 15 | } 16 | 17 | @Override 18 | public void writeToParcel(Parcel dest, int flags) { 19 | super.writeToParcel(dest, flags); 20 | } 21 | 22 | @Override 23 | public int describeContents() { 24 | return 0; 25 | } 26 | 27 | public static final Creator CREATOR = new Creator() { 28 | @Override 29 | public MxLayoutParams createFromParcel(Parcel in) { 30 | return new MxLayoutParams(in); 31 | } 32 | 33 | @Override 34 | public MxLayoutParams[] newArray(int size) { 35 | return new MxLayoutParams[size]; 36 | } 37 | }; 38 | } 39 | -------------------------------------------------------------------------------- /effectivecard/src/main/res/drawable/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/effectivecard/src/main/res/drawable/plus.png -------------------------------------------------------------------------------- /effectivecard/src/main/res/layout/layout_card.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /effectivecard/src/test/java/com/codemx/effectivecard/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.codemx.effectivecard; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /floatwindow/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion rootProject.compileSdkVersion 5 | 6 | defaultConfig { 7 | minSdkVersion rootProject.minSdkVersion 8 | targetSdkVersion rootProject.targetSdkVersion 9 | 10 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 11 | consumerProguardFiles 'consumer-rules.pro' 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | 21 | } 22 | 23 | dependencies { 24 | implementation fileTree(dir: 'libs', include: ['*.jar']) 25 | 26 | implementation 'androidx.appcompat:appcompat:1.2.0' 27 | implementation project(path: ':mxlibrary') 28 | 29 | testImplementation 'junit:junit:4.13.2' 30 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 31 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 32 | } 33 | -------------------------------------------------------------------------------- /floatwindow/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/floatwindow/consumer-rules.pro -------------------------------------------------------------------------------- /floatwindow/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /floatwindow/src/androidTest/java/com/codemx/floatwindow/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("com.codemx.floatwindow.test", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /floatwindow/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 10 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/FloatView.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * Created by yhao on 17-11-14. 7 | * https://github.com/yhaolpz 8 | */ 9 | 10 | interface FloatView { 11 | 12 | void setSize(int width, int height); 13 | 14 | void setView(View view); 15 | 16 | void setGravity(int gravity, int xOffset, int yOffset); 17 | 18 | void init(); 19 | 20 | void dismiss(); 21 | 22 | void updateXY(int x, int y); 23 | 24 | void updateX(int x); 25 | 26 | void updateY(int y); 27 | 28 | int getX(); 29 | 30 | int getY(); 31 | } 32 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/IFloatWindow.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * Created by yhao on 2017/12/22. 7 | * https://github.com/yhaolpz 8 | */ 9 | 10 | public interface IFloatWindow { 11 | 12 | void show(); 13 | 14 | void hide(); 15 | 16 | boolean isShowing(); 17 | 18 | int getX(); 19 | 20 | int getY(); 21 | 22 | void updateX(int x); 23 | 24 | void updateX(@Screen.screenType int screenType, float ratio); 25 | 26 | void updateY(int y); 27 | 28 | void updateY(@Screen.screenType int screenType, float ratio); 29 | 30 | View getView(); 31 | 32 | void dismiss(); 33 | } 34 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/LifecycleListener.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | interface LifecycleListener { 4 | 5 | void onShow(); 6 | 7 | void onHide(); 8 | 9 | void onBackToDesktop(); 10 | } 11 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/LogUtil.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | import android.util.Log; 4 | 5 | 6 | /** 7 | * Created by yhao on 2017/12/29. 8 | * https://github.com/yhaolpz 9 | */ 10 | 11 | class LogUtil { 12 | 13 | private static final String TAG = "FloatWindow"; 14 | 15 | 16 | static void e(String message) { 17 | 18 | Log.e(TAG, message); 19 | } 20 | 21 | 22 | static void d(String message) { 23 | 24 | Log.d(TAG, message); 25 | } 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/MoveType.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import androidx.annotation.IntDef; 8 | 9 | /** 10 | * Created by yhao on 2017/12/22. 11 | * https://github.com/yhaolpz 12 | */ 13 | 14 | public class MoveType { 15 | 16 | static final int fixed = 0; 17 | public static final int inactive = 1; 18 | public static final int active = 2; 19 | public static final int slide = 3; 20 | public static final int back = 4; 21 | 22 | @IntDef({fixed, inactive, active, slide, back}) 23 | @Retention(RetentionPolicy.SOURCE) 24 | @interface MOVE_TYPE { 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/PermissionListener.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | /** 4 | * Created by yhao on 2017/11/14. 5 | * https://github.com/yhaolpz 6 | */ 7 | public interface PermissionListener { 8 | void onSuccess(); 9 | 10 | void onFail(); 11 | } 12 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/ResumedListener.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | /** 4 | * Created by yhao on 2017/12/30. 5 | * https://github.com/yhaolpz 6 | */ 7 | 8 | interface ResumedListener { 9 | void onResumed(); 10 | } 11 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/Screen.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | 7 | import androidx.annotation.IntDef; 8 | 9 | public class Screen { 10 | public static final int width = 0; 11 | public static final int height = 1; 12 | 13 | @IntDef({width, height}) 14 | @Retention(RetentionPolicy.SOURCE) 15 | @interface screenType { 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/ViewStateListener.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | /** 4 | * Created by yhao on 2018/5/5 5 | * https://github.com/yhaolpz 6 | */ 7 | public interface ViewStateListener { 8 | 9 | void onPositionUpdate(int x, int y); 10 | 11 | void onShow(); 12 | 13 | void onHide(); 14 | 15 | void onDismiss(); 16 | 17 | void onMoveAnimStart(); 18 | 19 | void onMoveAnimEnd(); 20 | 21 | void onBackToDesktop(); 22 | } 23 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/effect/AnchorToSideEffect.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow.effect; 2 | 3 | /** 4 | * Created by yuchuan 5 | * DATE 2020/3/10 6 | * TIME 17:40 7 | */ 8 | public class AnchorToSideEffect { 9 | 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/permission/compat/DefaultSettingCompat.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow.permission.compat; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * Created by yuchuan 7 | * DATE 2020/4/28 8 | * TIME 19:49 9 | */ 10 | public class DefaultSettingCompat extends SettingCompat { 11 | 12 | @Override 13 | public boolean manageDrawOverlays(Context context) { 14 | 15 | return false; 16 | } 17 | 18 | @Override 19 | public void startPermissionActivity(Context context) { 20 | 21 | } 22 | 23 | @Override 24 | public String getVersionCode(Context context) { 25 | return null; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/permission/compat/GioneeSettingCompat.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow.permission.compat; 2 | 3 | import android.content.Context; 4 | 5 | import com.codemx.floatwindow.permission.RomUtil; 6 | 7 | /** 8 | * Created by yuchuan 9 | * DATE 2020/4/29 10 | * TIME 15:33 11 | */ 12 | public class GioneeSettingCompat extends SettingCompat { 13 | @Override 14 | public boolean manageDrawOverlays(Context context) { 15 | return false; 16 | } 17 | 18 | @Override 19 | public void startPermissionActivity(Context context) { 20 | 21 | } 22 | 23 | @Override 24 | public String getVersionCode(Context context) { 25 | try { 26 | String gioneeVersion = RomUtil.getPropS("ro.gn.gnznvernuber"); 27 | // String gioneeVersion = RomUtil.getPropS("ro.build.version.release"); 28 | return gioneeVersion.substring(gioneeVersion.indexOf("_") + 1); 29 | } catch (Exception e) { 30 | e.printStackTrace(); 31 | } 32 | return ""; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /floatwindow/src/main/java/com/codemx/floatwindow/permission/compat/VivoSettingCompat.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow.permission.compat; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | /** 7 | * Created by yuchuan 8 | * DATE 2020/4/28 9 | * TIME 19:47 10 | */ 11 | public class VivoSettingCompat extends SettingCompat { 12 | @Override 13 | public boolean manageDrawOverlays(Context context) { 14 | // 不支持直接到达悬浮窗设置页,只能到 i管家 首页 15 | Intent intent = new Intent("com.iqoo.secure"); 16 | intent.setClassName("com.iqoo.secure", "com.iqoo.secure.MainActivity"); 17 | // com.iqoo.secure.ui.phoneoptimize.SoftwareManagerActivity 18 | // com.iqoo.secure.ui.phoneoptimize.FloatWindowManager 19 | return startSafely(context, intent); 20 | } 21 | 22 | @Override 23 | public void startPermissionActivity(Context context) { 24 | 25 | } 26 | 27 | @Override 28 | public String getVersionCode(Context context) { 29 | return null; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /floatwindow/src/test/java/com/codemx/floatwindow/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.codemx.floatwindow; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /go/res/drawable/ic_widget.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 25 | 26 | -------------------------------------------------------------------------------- /go/res/values-v26/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | 18 | 19 | 20 | false 21 | -------------------------------------------------------------------------------- /go/res/values-zh-rHK/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 22 | "按住捷徑即可選取捷徑。" 23 | "扲兩下然後扲住就可以揀選捷徑,或者用自訂嘅操作。" 24 | "捷徑" 25 | "%1$s 捷徑" 26 | 27 | -------------------------------------------------------------------------------- /go/res/values-zh-rTW/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 22 | "按住捷徑即可選取。" 23 | "輕觸兩下並按住捷徑即可選取,你也可以使用自訂動作。" 24 | "捷徑" 25 | "「%1$s」捷徑" 26 | 27 | -------------------------------------------------------------------------------- /go/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | 19 | 60dp 20 | -------------------------------------------------------------------------------- /go/res/values/override.xml: -------------------------------------------------------------------------------- 1 | 2 | 19 | 20 | 21 | #Intent;action=android.intent.action.DELETE;launchFlags=0x10800000;B.android.intent.extra.RETURN_RESULT=true;end 22 | -------------------------------------------------------------------------------- /go/src_flags/com/android/launcher3/config/FeatureFlags.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.android.launcher3.config; 18 | 19 | /** 20 | * Defines a set of flags used to control various launcher behaviors 21 | */ 22 | public final class FeatureFlags extends BaseFlags { 23 | 24 | private FeatureFlags() { 25 | } 26 | 27 | // Features to control Launcher3Go behavior 28 | public static final boolean GO_DISABLE_WIDGETS = true; 29 | public static final boolean LAUNCHER3_SPRING_ICONS = false; 30 | } 31 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | android.enableJetifier=true 2 | android.useAndroidX=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Apr 16 19:15:57 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip 7 | -------------------------------------------------------------------------------- /image/launcher01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher01.png -------------------------------------------------------------------------------- /image/launcher02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher02.png -------------------------------------------------------------------------------- /image/launcher03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher03.png -------------------------------------------------------------------------------- /image/launcher04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher04.png -------------------------------------------------------------------------------- /image/launcher05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher05.png -------------------------------------------------------------------------------- /image/launcher06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher06.png -------------------------------------------------------------------------------- /image/launcher07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher07.png -------------------------------------------------------------------------------- /image/launcher08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher08.png -------------------------------------------------------------------------------- /image/launcher09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher09.png -------------------------------------------------------------------------------- /image/launcher10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/image/launcher10.png -------------------------------------------------------------------------------- /launcherclient/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion rootProject.compileSdkVersion 5 | 6 | defaultConfig { 7 | minSdkVersion rootProject.minSdkVersion 8 | targetSdkVersion rootProject.targetSdkVersion 9 | 10 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 11 | consumerProguardFiles 'consumer-rules.pro' 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | 21 | } 22 | 23 | dependencies { 24 | implementation fileTree(dir: 'libs', include: ['*.jar']) 25 | 26 | implementation 'androidx.appcompat:appcompat:1.2.0' 27 | testImplementation 'junit:junit:4.13.2' 28 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 29 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 30 | } 31 | -------------------------------------------------------------------------------- /launcherclient/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/launcherclient/consumer-rules.pro -------------------------------------------------------------------------------- /launcherclient/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /launcherclient/src/androidTest/java/com/google/android/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.google.android; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("com.google.android.test", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /launcherclient/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/launcherclient/BaseStub.java: -------------------------------------------------------------------------------- 1 | package com.google.android.launcherclient; 2 | 3 | import android.os.Binder; 4 | import android.os.IBinder; 5 | import android.os.IInterface; 6 | import android.os.Parcel; 7 | import android.os.RemoteException; 8 | 9 | public class BaseStub extends Binder implements IInterface { 10 | 11 | private static TransactionInterceptor interceptor = null; 12 | 13 | protected BaseStub(String str) { 14 | attachInterface(this, str); 15 | } 16 | 17 | public IBinder asBinder() { 18 | return this; 19 | } 20 | 21 | public boolean onTransact(int i, Parcel parcel, Parcel parcel2, int i2) throws RemoteException { 22 | boolean z; 23 | if (i > 16777215) { 24 | z = super.onTransact(i, parcel, parcel2, i2); 25 | } else { 26 | parcel.enforceInterface(getInterfaceDescriptor()); 27 | z = false; 28 | } 29 | if (z) { 30 | return true; 31 | } 32 | return mo5a(i, parcel); 33 | } 34 | 35 | public boolean mo5a(int i, Parcel parcel) throws RemoteException { 36 | return false; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/launcherclient/Codecs.java: -------------------------------------------------------------------------------- 1 | package com.google.android.launcherclient; 2 | 3 | import android.os.IInterface; 4 | import android.os.Parcel; 5 | import android.os.Parcelable; 6 | 7 | public class Codecs { 8 | private Codecs() { 9 | } 10 | 11 | public static boolean check(Parcel parcel) { 12 | return parcel.readInt() != 0; 13 | } 14 | 15 | public static void writeChangingConfiguration(Parcel parcel, boolean changingConfigurations) { 16 | parcel.writeInt(changingConfigurations ? 1 : 0); 17 | } 18 | 19 | public static void writeParcelable(Parcel parcel, Parcelable parcelable) { 20 | if (parcelable == null) { 21 | parcel.writeInt(0); 22 | return; 23 | } 24 | parcel.writeInt(1); 25 | parcelable.writeToParcel(parcel, 0); 26 | } 27 | 28 | public static void writeInterfaceToken(Parcel parcel, IInterface iInterface) { 29 | if (iInterface == null) { 30 | parcel.writeStrongBinder(null); 31 | } else { 32 | parcel.writeStrongBinder(iInterface.asBinder()); 33 | } 34 | } 35 | 36 | static { 37 | Codecs.class.getClassLoader(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/launcherclient/Constant.java: -------------------------------------------------------------------------------- 1 | package com.google.android.launcherclient; 2 | 3 | /** 4 | * Created by yuchuan 5 | * DATE 2020/4/17 6 | * TIME 14:58 7 | */ 8 | public final class Constant { 9 | 10 | public static final String GSA_PACKAGE = "com.codemx.effectcard";// 负一屏包名 11 | // public static final String GSA_PACKAGE = "com.google.android.googlequicksearchbox";// 负一屏包名(谷歌负一屏) 12 | public static final String ACTION = "com.android.launcher3.WINDOW_OVERLAY"; 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/launcherclient/TransactionInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.google.android.launcherclient; 2 | 3 | public interface TransactionInterceptor { 4 | } 5 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/BuildInfo.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | public class BuildInfo { 4 | public static final int CLIENT_VERSION_CODE = 14; 5 | public static final int SERVER_VERSION_CODE = 9; 6 | } 7 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/HotwordServiceChecker.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | import android.content.Context; 4 | import android.os.IBinder; 5 | import android.os.RemoteException; 6 | 7 | import com.google.android.libraries.launcherclient.ILauncherOverlayStub; 8 | 9 | public class HotwordServiceChecker extends AbsServiceStatusChecker { 10 | public HotwordServiceChecker(Context context) { 11 | super(context); 12 | } 13 | 14 | public void checkHotwordService(AbsServiceStatusChecker.StatusCallback statusCallback) { 15 | checkStatusService(statusCallback, LauncherClient.getIntent(this.mContext)); 16 | } 17 | 18 | public final boolean getStatus(IBinder iBinder) throws RemoteException { 19 | return ILauncherOverlayStub.asInterface(iBinder).isVoiceDetectionRunning(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/LauncherClientCallbacks.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | public interface LauncherClientCallbacks { 4 | void onOverlayScrollChanged(float f); 5 | 6 | void onServiceStateChanged(boolean z, boolean z2); 7 | } 8 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/LauncherClientCallbacksAdapter.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | public class LauncherClientCallbacksAdapter implements LauncherClientCallbacks { 4 | public void onOverlayScrollChanged(float f) { 5 | } 6 | 7 | public void onServiceStateChanged(boolean z, boolean z2) { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/LogInfo.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | final class LogInfo { 4 | public int f37a; 5 | public String f38b; 6 | public float f39c; 7 | public long f40d; 8 | public int f41e; 9 | 10 | private LogInfo() { 11 | } 12 | 13 | public final void mo68a(int i, String str, float f) { 14 | this.f37a = i; 15 | this.f38b = str; 16 | this.f39c = f; 17 | this.f40d = System.currentTimeMillis(); 18 | this.f41e = 0; 19 | } 20 | 21 | static int m83a(LogInfo eVar) { 22 | int i = eVar.f41e; 23 | eVar.f41e = i + 1; 24 | return i; 25 | } 26 | 27 | LogInfo(byte b) { 28 | this(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/NotifyStatusRunnable.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | final class NotifyStatusRunnable implements Runnable { 4 | 5 | private final LauncherClient launcherClient; 6 | 7 | NotifyStatusRunnable(LauncherClient launcherClient) { 8 | this.launcherClient = launcherClient; 9 | } 10 | 11 | public final void run() { 12 | this.launcherClient.notifyStatusChanged(0); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/OverlayContentChecker.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | import android.content.Context; 4 | import android.os.IBinder; 5 | import android.os.RemoteException; 6 | 7 | import com.google.android.libraries.launcherclient.ILauncherOverlayStub; 8 | 9 | public class OverlayContentChecker extends AbsServiceStatusChecker { 10 | public OverlayContentChecker(Context context) { 11 | super(context); 12 | } 13 | 14 | public void checkOverlayContent(AbsServiceStatusChecker.StatusCallback statusCallback) { 15 | checkStatusService(statusCallback, LauncherClient.getIntent(this.mContext)); 16 | } 17 | 18 | public final boolean getStatus(IBinder iBinder) throws RemoteException { 19 | return ILauncherOverlayStub.asInterface(iBinder).mo21f(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/PrivateCallbacks.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | public interface PrivateCallbacks extends LauncherClientCallbacks { 4 | void mo71a(); 5 | } 6 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/ServiceStatusRunnable.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | final class ServiceStatusRunnable implements Runnable { 4 | 5 | private final AbsServiceStatusChecker.StatusCallback statusCallback; 6 | 7 | private final AbsServiceStatusChecker f27b; 8 | 9 | ServiceStatusRunnable(AbsServiceStatusChecker absServiceStatusChecker, AbsServiceStatusChecker.StatusCallback statusCallback) { 10 | this.f27b = absServiceStatusChecker; 11 | this.statusCallback = statusCallback; 12 | } 13 | 14 | public final void run() { 15 | AbsServiceStatusChecker.assertMainThread(); 16 | this.statusCallback.isRunning(false); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/gsa/launcherclient/UpdateReceiver.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.gsa.launcherclient; 2 | 3 | import android.content.BroadcastReceiver; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.net.Uri; 7 | import android.os.Build; 8 | 9 | import com.google.android.launcherclient.Constant; 10 | 11 | final class UpdateReceiver extends BroadcastReceiver { 12 | 13 | private final LauncherClient mClient; 14 | 15 | UpdateReceiver(LauncherClient launcherClient) { 16 | this.mClient = launcherClient; 17 | } 18 | 19 | public final void onReceive(Context context, Intent intent) { 20 | Uri data = intent.getData(); 21 | if (Build.VERSION.SDK_INT >= 19 || (data != null && Constant.GSA_PACKAGE.equals(data.getSchemeSpecificPart()))) { 22 | this.mClient.mSimpleServiceConnection.unbindService(); 23 | this.mClient.sApplicationConnection.unbindService(); 24 | LauncherClient.loadApiVersion(context); 25 | if ((this.mClient.mState & 2) != 0) { 26 | this.mClient.reconnect(); 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/launcherclient/ILauncherOverlayCallback.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.launcherclient; 2 | 3 | import android.os.IInterface; 4 | import android.os.RemoteException; 5 | 6 | public interface ILauncherOverlayCallback extends IInterface { 7 | void overlayScrollChanged(float f) throws RemoteException; 8 | 9 | void overlayStatusChanged(int i) throws RemoteException; 10 | } 11 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/launcherclient/ILauncherOverlayCallbackSub.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.launcherclient; 2 | 3 | import android.os.Parcel; 4 | import android.os.RemoteException; 5 | import com.google.android.launcherclient.BaseStub; 6 | 7 | public abstract class ILauncherOverlayCallbackSub extends BaseStub implements ILauncherOverlayCallback { 8 | 9 | public ILauncherOverlayCallbackSub() { 10 | super("com.google.android.libraries.launcherclient.ILauncherOverlayCallback"); 11 | } 12 | 13 | public final boolean mo5a(int i, Parcel parcel) throws RemoteException { 14 | switch (i) { 15 | case 1: 16 | overlayScrollChanged(parcel.readFloat()); 17 | break; 18 | case 2: 19 | overlayStatusChanged(parcel.readInt()); 20 | break; 21 | default: 22 | return false; 23 | } 24 | return true; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /launcherclient/src/main/java/com/google/android/libraries/launcherclient/ILauncherOverlayStub.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.launcherclient; 2 | 3 | import android.os.IBinder; 4 | import android.os.IInterface; 5 | import com.google.android.launcherclient.BaseStub; 6 | 7 | public abstract class ILauncherOverlayStub extends BaseStub implements ILauncherOverlay { 8 | 9 | protected ILauncherOverlayStub(String str) { 10 | super(str); 11 | } 12 | 13 | public static ILauncherOverlay asInterface(IBinder iBinder) { 14 | if (iBinder == null) { 15 | return null; 16 | } 17 | IInterface queryLocalInterface = iBinder.queryLocalInterface("com.google.android.libraries.launcherclient.ILauncherOverlay"); 18 | if (queryLocalInterface instanceof ILauncherOverlay) { 19 | return (ILauncherOverlay) queryLocalInterface; 20 | } 21 | return new LauncherOverlayProxy(iBinder); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /launcherclient/src/test/java/com/google/android/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package com.google.android; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.*; 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * @see Testing documentation 11 | */ 12 | public class ExampleUnitTest { 13 | @Test 14 | public void addition_isCorrect() { 15 | assertEquals(4, 2 + 2); 16 | } 17 | } -------------------------------------------------------------------------------- /mxlibrary/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion rootProject.compileSdkVersion 5 | 6 | defaultConfig { 7 | minSdkVersion rootProject.minSdkVersion 8 | targetSdkVersion rootProject.targetSdkVersion 9 | 10 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 11 | 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | 21 | } 22 | 23 | dependencies { 24 | implementation fileTree(include: ['*.jar'], dir: 'libs') 25 | implementation 'androidx.appcompat:appcompat:1.2.0' 26 | testImplementation 'junit:junit:4.13.2' 27 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 28 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 29 | } 30 | -------------------------------------------------------------------------------- /mxlibrary/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /mxlibrary/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /mxlibrary/src/main/java/com/android/mxlibrary/util/DeviceInfoUtil.java: -------------------------------------------------------------------------------- 1 | package com.android.mxlibrary.util; 2 | 3 | import android.os.Build; 4 | 5 | public final class DeviceInfoUtil { 6 | 7 | public static String getPhoneModel() { 8 | return Build.MODEL; 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /mxlibrary/src/main/java/com/android/mxlibrary/util/IoUtil.java: -------------------------------------------------------------------------------- 1 | package com.android.mxlibrary.util; 2 | 3 | import java.io.Closeable; 4 | import java.io.IOException; 5 | 6 | /** 7 | * Created by yuchuan 8 | * DATE 2020/4/28 9 | * TIME 22:25 10 | */ 11 | public final class IoUtil { 12 | 13 | public static void closeSafely(Closeable closeable){ 14 | if (closeable != null) { 15 | try { 16 | closeable.close(); 17 | } catch (IOException e) { 18 | e.printStackTrace(); 19 | } 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /mxlibrary/src/main/java/com/android/mxlibrary/util/MxHandler.java: -------------------------------------------------------------------------------- 1 | package com.android.mxlibrary.util; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | 6 | import java.lang.ref.WeakReference; 7 | 8 | /** 9 | * 防止内存泄漏的Handler 10 | * 11 | * @param 12 | */ 13 | public abstract class MxHandler extends Handler { 14 | 15 | private WeakReference weakReference; 16 | 17 | public MxHandler(T t) { 18 | weakReference = new WeakReference(t); 19 | } 20 | 21 | @Override 22 | public void handleMessage(Message msg) { 23 | if (weakReference == null || weakReference.get() == null) { 24 | return; 25 | } 26 | handleMessage(weakReference.get(), msg); 27 | super.handleMessage(msg); 28 | } 29 | 30 | protected abstract void handleMessage(T t, Message msg); 31 | } 32 | -------------------------------------------------------------------------------- /mxlibrary/src/main/java/com/android/mxlibrary/view/ViewUtil.java: -------------------------------------------------------------------------------- 1 | package com.android.mxlibrary.view; 2 | 3 | import android.graphics.Rect; 4 | import android.view.View; 5 | 6 | public final class ViewUtil { 7 | 8 | /** 9 | * add by codemx 10 | * 判断是否滑动(上下滑动)到屏幕中 11 | *

12 | * 在onScrollChanged方法中调用 13 | * 14 | * @param view 视图 15 | * 16 | * @return 是否显示在屏幕中 17 | */ 18 | public static boolean isViewVerticalScrollToScreen(View view) { 19 | Rect rect = new Rect(); 20 | view.getLocalVisibleRect(rect); 21 | int top = rect.top; 22 | int bottom = rect.bottom; 23 | return top >= 0 && bottom > 0 && top < bottom; 24 | } 25 | 26 | /** 27 | * add by codemx 28 | * 判断是否滑动(上下滑动)到屏幕中 29 | *

30 | * 在onScrollChanged方法中调用 31 | * 32 | * @param view 视图 33 | * 34 | * @return 是否显示在屏幕中 35 | */ 36 | public static boolean isViewHorizontalScrollToScreen(View view) { 37 | Rect rect = new Rect(); 38 | view.getLocalVisibleRect(rect); 39 | int left = rect.left; 40 | int right = rect.right; 41 | return left >= 0 && right > 0 && left < right; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /mxlibrary/src/main/res/drawable/ic_close_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/mxlibrary/src/main/res/drawable/ic_close_black_24dp.png -------------------------------------------------------------------------------- /mxlibrary/src/main/res/drawable/ic_home_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/mxlibrary/src/main/res/drawable/ic_home_white_24dp.png -------------------------------------------------------------------------------- /mxlibrary/src/main/res/drawable/ic_menu_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/mxlibrary/src/main/res/drawable/ic_menu_black_24dp.png -------------------------------------------------------------------------------- /mxlibrary/src/main/res/drawable/ic_notifications_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/mxlibrary/src/main/res/drawable/ic_notifications_white_24dp.png -------------------------------------------------------------------------------- /mxlibrary/src/main/res/drawable/ic_place_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/mxlibrary/src/main/res/drawable/ic_place_white_24dp.png -------------------------------------------------------------------------------- /mxlibrary/src/main/res/drawable/ic_search_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/mxlibrary/src/main/res/drawable/ic_search_white_24dp.png -------------------------------------------------------------------------------- /mxlibrary/src/main/res/drawable/ic_settings_white_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Launcher3-dev/Launcher3-mx/668dc2f0b40a6f8926d2828812d406aa1da037fb/mxlibrary/src/main/res/drawable/ic_settings_white_24dp.png -------------------------------------------------------------------------------- /mxlibrary/src/main/res/values/array.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @drawable/ic_home_white_24dp 5 | @drawable/ic_search_white_24dp 6 | @drawable/ic_notifications_white_24dp 7 | @drawable/ic_settings_white_24dp 8 | @drawable/ic_place_white_24dp 9 | 10 | 11 | @android:color/holo_blue_light 12 | @android:color/holo_green_dark 13 | @android:color/holo_red_light 14 | @android:color/holo_purple 15 | @android:color/holo_orange_light 16 | 17 | -------------------------------------------------------------------------------- /mxlibrary/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 20 | 21 | #3F51B5 22 | #303F9F 23 | #FF4081 24 | 25 | -------------------------------------------------------------------------------- /mxlibrary/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MXLibrary 3 | 4 | -------------------------------------------------------------------------------- /mxtheme/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion rootProject.compileSdkVersion 5 | 6 | defaultConfig { 7 | minSdkVersion rootProject.minSdkVersion 8 | targetSdkVersion rootProject.targetSdkVersion 9 | 10 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 11 | 12 | } 13 | 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | 21 | } 22 | 23 | dependencies { 24 | implementation fileTree(include: ['*.jar'], dir: 'libs') 25 | implementation 'androidx.appcompat:appcompat:1.2.0' 26 | implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' 27 | 28 | testImplementation 'junit:junit:4.13.2' 29 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 30 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 31 | 32 | implementation project(':mxlibrary') 33 | } 34 | -------------------------------------------------------------------------------- /mxtheme/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /mxtheme/src/androidTest/java/com/android/mxtheme/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.android.mxtheme; 2 | 3 | import android.content.Context; 4 | import androidx.test.platform.app.InstrumentationRegistry; 5 | import androidx.test.ext.junit.runners.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.android.mxtheme.test", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /mxtheme/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /mxtheme/src/main/aidl/com/android/mxtheme/IRemoteCallback.aidl: -------------------------------------------------------------------------------- 1 | // IRemoteCallback.aidl 2 | package com.android.mxtheme; 3 | 4 | import com.android.mxtheme.bean.ThemeBean; 5 | import com.android.mxtheme.bean.WallpaperBean; 6 | 7 | interface IRemoteCallback { 8 | 9 | /** 10 | * 设置主题成功回调 11 | * 12 | * @param bean 设置的主题对象 13 | */ 14 | void onThemeSuccess(in ThemeBean bean); 15 | 16 | /** 17 | * 设置主题失败回调 18 | * 19 | * @param errMsg 错误信息 20 | * @param bean 设置失败的主题 21 | */ 22 | void onThemeFail(in String errMsg, in ThemeBean bean); 23 | 24 | /** 25 | * 设置壁纸成功回调 26 | * 27 | * @param bean 设置的壁纸对象 28 | */ 29 | void onWallpaperSuccess(in WallpaperBean bean); 30 | 31 | /** 32 | * 设置壁纸失败回调 33 | * 34 | * @param errMsg 错误信息 35 | * @param bean 设置失败的壁纸 36 | */ 37 | void onWallpaperFail(in String errMsg, in WallpaperBean bean); 38 | 39 | } 40 | -------------------------------------------------------------------------------- /mxtheme/src/main/aidl/com/android/mxtheme/IThemeService.aidl: -------------------------------------------------------------------------------- 1 | // IThemeLife.aidl 2 | package com.android.mxtheme; 3 | 4 | import com.android.mxtheme.IRemoteCallback; 5 | import com.android.mxtheme.bean.ThemeBean; 6 | import com.android.mxtheme.bean.WallpaperBean; 7 | 8 | interface IThemeService { 9 | 10 | /** 11 | * 注册回调 12 | * 13 | * @param callback 回调 14 | */ 15 | void register(IRemoteCallback callback); 16 | 17 | /** 18 | * 取消注册回调 19 | * 20 | * @param callback 回调 21 | */ 22 | void unRegister(IRemoteCallback callback); 23 | 24 | /** 25 | * 除了基本数据类型,其他类型的参数都需要标上方向类型:in(输入), out(输出), inout(输入输出) 26 | */ 27 | boolean setTheme(in ThemeBean themeBean); 28 | 29 | /** 30 | * 除了基本数据类型,其他类型的参数都需要标上方向类型:in(输入), out(输出), inout(输入输出) 31 | */ 32 | boolean setWallpaper(in WallpaperBean wallpaperBean); 33 | 34 | } 35 | -------------------------------------------------------------------------------- /mxtheme/src/main/aidl/com/android/mxtheme/bean/ThemeBean.aidl: -------------------------------------------------------------------------------- 1 | // ThemeBean.aidl(包名和实体类包名一样) 2 | package com.android.mxtheme.bean; 3 | 4 | // 主题 5 | parcelable ThemeBean; 6 | -------------------------------------------------------------------------------- /mxtheme/src/main/aidl/com/android/mxtheme/bean/WallpaperBean.aidl: -------------------------------------------------------------------------------- 1 | // WallpaperBean.aidl(包名和实体类包名一样) 2 | package com.android.mxtheme.bean; 3 | 4 | // 壁纸 5 | parcelable WallpaperBean; 6 | -------------------------------------------------------------------------------- /mxtheme/src/main/java/com/android/mxtheme/IThemeClient.java: -------------------------------------------------------------------------------- 1 | package com.android.mxtheme; 2 | 3 | import android.content.Context; 4 | import android.os.IBinder; 5 | 6 | import com.android.mxtheme.bean.ThemeBean; 7 | import com.android.mxtheme.bean.WallpaperBean; 8 | 9 | public interface IThemeClient { 10 | 11 | void bindService(Context context); 12 | 13 | void unbindService(Context context); 14 | 15 | void changeTheme(ThemeBean themeBean); 16 | 17 | void changeWallpaper(WallpaperBean wallpaperBean); 18 | 19 | void registerRemoteCallback(); 20 | 21 | void unRegisterRemoteCallback(); 22 | 23 | void linkToDeath(IBinder service); 24 | 25 | void unlinkToDeath(); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /mxtheme/src/main/res/layout/theme_activity.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |