├── .github ├── FUNDING.yml └── workflows │ ├── build-nightly.yml │ ├── deploy-docs.yml │ └── trigger-fdroid-repo-rebuild.yml ├── .gitignore ├── .idea ├── AndroidProjectSystem.xml ├── appInsightsSettings.xml ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── gradle.properties ├── inspectionProfiles │ └── Project_Default.xml ├── kotlinc.xml └── migrations.xml ├── LICENSE.txt ├── app ├── app │ ├── .gitignore │ ├── build.gradle.kts │ ├── proguard-rules.pro │ └── src │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── de │ │ │ │ └── mm20 │ │ │ │ └── launcher2 │ │ │ │ ├── LauncherApplication.kt │ │ │ │ ├── activity │ │ │ │ └── AddItemActivity.kt │ │ │ │ ├── content │ │ │ │ └── GenericFileProvider.kt │ │ │ │ └── debug │ │ │ │ └── Debug.kt │ │ └── res │ │ │ ├── drawable-hdpi │ │ │ └── ic_wikipedia.webp │ │ │ ├── drawable-mdpi │ │ │ └── ic_wikipedia.webp │ │ │ ├── drawable-xhdpi │ │ │ └── ic_wikipedia.webp │ │ │ ├── drawable-xxhdpi │ │ │ └── ic_wikipedia.webp │ │ │ ├── drawable-xxxhdpi │ │ │ └── ic_wikipedia.webp │ │ │ ├── resources.properties │ │ │ ├── values │ │ │ ├── attrs.xml │ │ │ ├── bools.xml │ │ │ ├── donottranslate.xml │ │ │ ├── integers.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── provider_paths.xml │ │ └── release │ │ └── AndroidManifest.xml └── ui │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ ├── debug │ └── res │ │ └── xml │ │ └── shortcuts.xml │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── ui │ │ │ ├── animation │ │ │ ├── Alignment.kt │ │ │ ├── TextStyle.kt │ │ │ └── TextUnit.kt │ │ │ ├── assistant │ │ │ └── AssistantActivity.kt │ │ │ ├── base │ │ │ ├── AppWidgetHost.kt │ │ │ ├── BaseActivity.kt │ │ │ ├── ProvideCurrentTime.kt │ │ │ ├── ProvideLocals.kt │ │ │ └── ProvideSettings.kt │ │ │ ├── common │ │ │ ├── FavoritesTagSelector.kt │ │ │ ├── FavoritesVM.kt │ │ │ ├── IconPicker.kt │ │ │ ├── IconPickerVM.kt │ │ │ ├── ImportThemeSheet.kt │ │ │ ├── ImportThemeSheetVM.kt │ │ │ ├── RestoreBackupSheet.kt │ │ │ ├── RestoreBackupSheetVM.kt │ │ │ ├── SearchablePicker.kt │ │ │ ├── SearchablePickerVM.kt │ │ │ ├── TagChip.kt │ │ │ ├── WeatherLocationSearchDialog.kt │ │ │ └── WeatherLocationSearchDialogVM.kt │ │ │ ├── component │ │ │ ├── Badges.kt │ │ │ ├── Banner.kt │ │ │ ├── BottomSheetDialog.kt │ │ │ ├── Chip.kt │ │ │ ├── DragResizeHandle.kt │ │ │ ├── FakeSplashScreen.kt │ │ │ ├── InnerCard.kt │ │ │ ├── LargeMessage.kt │ │ │ ├── LauncherCard.kt │ │ │ ├── MarqueeText.kt │ │ │ ├── MissingPermissionBanner.kt │ │ │ ├── NavBarEffects.kt │ │ │ ├── OutlinedTagsInputField.kt │ │ │ ├── RatingBar.kt │ │ │ ├── SearchActionIcon.kt │ │ │ ├── SearchBar.kt │ │ │ ├── ShapedLauncherIcon.kt │ │ │ ├── SmallMessage.kt │ │ │ ├── Toolbar.kt │ │ │ ├── Tooltip.kt │ │ │ ├── colorpicker │ │ │ │ ├── HctColorPicker.kt │ │ │ │ └── HsvColorPicker.kt │ │ │ ├── dragndrop │ │ │ │ ├── DragAndDropGrid.kt │ │ │ │ └── DragAndDropList.kt │ │ │ ├── emojipicker │ │ │ │ └── EmojiPicker.kt │ │ │ ├── markdown │ │ │ │ ├── MarkdownEditor.kt │ │ │ │ ├── MarkdownText.kt │ │ │ │ └── StringAnnotations.kt │ │ │ ├── preferences │ │ │ │ ├── CheckboxPreference.kt │ │ │ │ ├── ColorPreference.kt │ │ │ │ ├── ListPreference.kt │ │ │ │ ├── Preference.kt │ │ │ │ ├── PreferenceCategory.kt │ │ │ │ ├── PreferenceScreen.kt │ │ │ │ ├── PreferenceWithSwitch.kt │ │ │ │ ├── SliderPreference.kt │ │ │ │ ├── SwitchPreference.kt │ │ │ │ └── TextPreference.kt │ │ │ ├── view │ │ │ │ ├── AndroidView.kt │ │ │ │ ├── FrameLayout.kt │ │ │ │ ├── ImageButton.kt │ │ │ │ ├── ImageView.kt │ │ │ │ ├── LinearLayout.kt │ │ │ │ ├── ListView.kt │ │ │ │ ├── ProgressBar.kt │ │ │ │ ├── RelativeLayout.kt │ │ │ │ └── TextView.kt │ │ │ └── weather │ │ │ │ ├── AnimatedWeatherIcon.kt │ │ │ │ ├── WeatherIcon.kt │ │ │ │ └── WeatherIconColors.kt │ │ │ ├── ktx │ │ │ ├── ButtonDefaults.kt │ │ │ ├── Color.kt │ │ │ ├── ColorMatrix.kt │ │ │ ├── ContentDrawState.kt │ │ │ ├── CornerBasedShape.kt │ │ │ ├── Deferred.kt │ │ │ ├── Dp.kt │ │ │ ├── Float.kt │ │ │ ├── Int.kt │ │ │ ├── IntRange.kt │ │ │ ├── LazyListLayoutInfo.kt │ │ │ ├── Modifier.kt │ │ │ ├── MutableState.kt │ │ │ ├── Offset.kt │ │ │ └── String.kt │ │ │ ├── launcher │ │ │ ├── ImportThemeActivity.kt │ │ │ ├── LauncherActivity.kt │ │ │ ├── LauncherScaffoldVM.kt │ │ │ ├── SharedLauncherActivity.kt │ │ │ ├── helper │ │ │ │ └── WallpaperBlur.kt │ │ │ ├── scaffold │ │ │ │ ├── ClockAndWidgetsHomeComponent.kt │ │ │ │ ├── ClockHomeComponent.kt │ │ │ │ ├── DismissComponent.kt │ │ │ │ ├── LaunchComponent.kt │ │ │ │ ├── LauncherScaffold.kt │ │ │ │ ├── NotificationsComponent.kt │ │ │ │ ├── PowerMenuComponent.kt │ │ │ │ ├── QuickSettingsComponent.kt │ │ │ │ ├── RecentsComponent.kt │ │ │ │ ├── ScaffoldComponent.kt │ │ │ │ ├── ScreenOffComponent.kt │ │ │ │ ├── SearchComponent.kt │ │ │ │ ├── SecretComponent.kt │ │ │ │ └── WidgetsComponent.kt │ │ │ ├── search │ │ │ │ ├── ListItemViewModel.kt │ │ │ │ ├── SearchColumn.kt │ │ │ │ ├── SearchVM.kt │ │ │ │ ├── apps │ │ │ │ │ ├── AppItem.kt │ │ │ │ │ └── AppResults.kt │ │ │ │ ├── calculator │ │ │ │ │ ├── CalculatorItem.kt │ │ │ │ │ └── CalculatorResults.kt │ │ │ │ ├── calendar │ │ │ │ │ ├── CalendarItem.kt │ │ │ │ │ └── CalendarResults.kt │ │ │ │ ├── common │ │ │ │ │ ├── SearchableItemVM.kt │ │ │ │ │ ├── ShowAllButton.kt │ │ │ │ │ ├── grid │ │ │ │ │ │ ├── GridItem.kt │ │ │ │ │ │ ├── GridResults.kt │ │ │ │ │ │ └── SearchResultGrid.kt │ │ │ │ │ └── list │ │ │ │ │ │ ├── ListItem.kt │ │ │ │ │ │ ├── ListResults.kt │ │ │ │ │ │ └── SearchResultList.kt │ │ │ │ ├── contacts │ │ │ │ │ ├── ContactItem.kt │ │ │ │ │ └── ContactResults.kt │ │ │ │ ├── favorites │ │ │ │ │ ├── SearchFavorites.kt │ │ │ │ │ └── SearchFavoritesVM.kt │ │ │ │ ├── files │ │ │ │ │ ├── FileItem.kt │ │ │ │ │ └── FileResults.kt │ │ │ │ ├── filters │ │ │ │ │ ├── KeyboardFilterBar.kt │ │ │ │ │ ├── KeyboardFilterBarItem.kt │ │ │ │ │ ├── SearchFilters.kt │ │ │ │ │ └── SearchFiltersExt.kt │ │ │ │ ├── location │ │ │ │ │ ├── LocationItem.kt │ │ │ │ │ ├── LocationResults.kt │ │ │ │ │ └── MapTiles.kt │ │ │ │ ├── shortcut │ │ │ │ │ ├── ShortcutItem.kt │ │ │ │ │ └── ShortcutResults.kt │ │ │ │ ├── unitconverter │ │ │ │ │ ├── UnitConverterItem.kt │ │ │ │ │ └── UnitConverterResults.kt │ │ │ │ ├── website │ │ │ │ │ ├── WebsiteItem.kt │ │ │ │ │ └── WebsiteResults.kt │ │ │ │ └── wikipedia │ │ │ │ │ ├── ArticleItem.kt │ │ │ │ │ └── ArticleResults.kt │ │ │ ├── searchbar │ │ │ │ ├── LauncherSearchBar.kt │ │ │ │ ├── SearchBarActions.kt │ │ │ │ └── SearchBarMenu.kt │ │ │ ├── sheets │ │ │ │ ├── ConfigureWidgetSheet.kt │ │ │ │ ├── CustomizeSearchableSheet.kt │ │ │ │ ├── CustomizeSearchableSheetVM.kt │ │ │ │ ├── EditFavoritesSheet.kt │ │ │ │ ├── EditFavoritesSheetVM.kt │ │ │ │ ├── EditTagSheet.kt │ │ │ │ ├── EditTagSheetVM.kt │ │ │ │ ├── FailedGestureSheet.kt │ │ │ │ ├── FailedGestureSheetVM.kt │ │ │ │ ├── HiddenItemsSheet.kt │ │ │ │ ├── HiddenItemsSheetVM.kt │ │ │ │ ├── LauncherBottomSheetManager.kt │ │ │ │ ├── LauncherBottomSheets.kt │ │ │ │ ├── WidgetPickerSheet.kt │ │ │ │ └── WidgetPickerSheetVM.kt │ │ │ ├── transitions │ │ │ │ ├── EnterHomeTransition.kt │ │ │ │ ├── EnterHomeTransitionHandler.kt │ │ │ │ ├── EnterHomeTransitionManager.kt │ │ │ │ └── EnterHomeTransitionParams.kt │ │ │ └── widgets │ │ │ │ ├── WidgetColumn.kt │ │ │ │ ├── WidgetItem.kt │ │ │ │ ├── WidgetsVM.kt │ │ │ │ ├── calendar │ │ │ │ ├── CalendarWidget.kt │ │ │ │ └── CalendarWidgetVM.kt │ │ │ │ ├── clock │ │ │ │ ├── ClockWidget.kt │ │ │ │ ├── ClockWidgetVM.kt │ │ │ │ ├── WatchFaceSelector.kt │ │ │ │ ├── clocks │ │ │ │ │ ├── AnalogClock.kt │ │ │ │ │ ├── BinaryClock.kt │ │ │ │ │ ├── CustomClock.kt │ │ │ │ │ ├── DigitalClock1.kt │ │ │ │ │ ├── DigitalClock2.kt │ │ │ │ │ ├── OrbitClock.kt │ │ │ │ │ └── SegmentClock.kt │ │ │ │ └── parts │ │ │ │ │ ├── AlarmPartProvider.kt │ │ │ │ │ ├── BatteryPartProvider.kt │ │ │ │ │ ├── DatePartProvider.kt │ │ │ │ │ ├── FavoritesPartProvider.kt │ │ │ │ │ ├── MusicPartProvider.kt │ │ │ │ │ └── PartProvider.kt │ │ │ │ ├── external │ │ │ │ ├── AppWidget.kt │ │ │ │ └── AppWidgetHost.kt │ │ │ │ ├── favorites │ │ │ │ ├── FavoritesWidget.kt │ │ │ │ └── FavoritesWidgetVM.kt │ │ │ │ ├── music │ │ │ │ ├── MusicWidget.kt │ │ │ │ └── MusicWidgetVM.kt │ │ │ │ ├── notes │ │ │ │ ├── NotesWidget.kt │ │ │ │ └── NotesWidgetVM.kt │ │ │ │ └── weather │ │ │ │ ├── WeatherWidget.kt │ │ │ │ └── WeatherWidgetVM.kt │ │ │ ├── layout │ │ │ └── Arrangement.kt │ │ │ ├── locals │ │ │ └── CompositionLocals.kt │ │ │ ├── modifier │ │ │ ├── FadingEdges.kt │ │ │ ├── Modifiers.kt │ │ │ ├── Scrims.kt │ │ │ └── Scrolling.kt │ │ │ ├── overlays │ │ │ ├── Overlay.kt │ │ │ ├── OverlayHost.kt │ │ │ └── OverlayManager.kt │ │ │ ├── settings │ │ │ ├── SettingsActivity.kt │ │ │ ├── about │ │ │ │ ├── AboutSettingsScreen.kt │ │ │ │ └── AboutSettingsScreenVM.kt │ │ │ ├── appearance │ │ │ │ ├── AppearanceSettingsScreen.kt │ │ │ │ └── AppearanceSettingsScreenVM.kt │ │ │ ├── backup │ │ │ │ ├── BackupSettingsScreen.kt │ │ │ │ ├── BackupSettingsScreenVM.kt │ │ │ │ ├── CreateBackupSheet.kt │ │ │ │ └── CreateBackupSheetVM.kt │ │ │ ├── breezyweather │ │ │ │ ├── BreezyWeatherSettingsScreen.kt │ │ │ │ └── BreezyWeatherSettingsScreenVM.kt │ │ │ ├── buildinfo │ │ │ │ ├── BuildInfoSettingsScreen.kt │ │ │ │ └── BuildInfoSettingsScreenVM.kt │ │ │ ├── calendarsearch │ │ │ │ ├── CalendarProviderSettingsScreen.kt │ │ │ │ ├── CalendarProviderSettingsScreenVM.kt │ │ │ │ ├── CalendarSearchSettingsScreen.kt │ │ │ │ └── CalendarSearchSettingsScreenVM.kt │ │ │ ├── cards │ │ │ │ ├── CardsSettingsScreen.kt │ │ │ │ └── CardsSettingsScreenVM.kt │ │ │ ├── clockwidget │ │ │ │ └── ClockWidgetSettingsScreenVM.kt │ │ │ ├── colorscheme │ │ │ │ ├── ColorSchemePreferenceCategory.kt │ │ │ │ ├── ColorSchemeSettingsScreen.kt │ │ │ │ ├── ColorSchemesSettingsScreen.kt │ │ │ │ ├── ColorSchemesSettingsScreenVM.kt │ │ │ │ ├── ColorSwatch.kt │ │ │ │ ├── CorePaletteColorPreference.kt │ │ │ │ └── ThemeColorPreference.kt │ │ │ ├── contacts │ │ │ │ ├── ContactsSettingsScreen.kt │ │ │ │ └── ContactsSettingsScreenVM.kt │ │ │ ├── crashreporter │ │ │ │ ├── CrashReportScreen.kt │ │ │ │ ├── CrashReportScreenVM.kt │ │ │ │ ├── CrashReporterScreen.kt │ │ │ │ └── CrashReporterScreenVM.kt │ │ │ ├── debug │ │ │ │ ├── DebugSettingsScreen.kt │ │ │ │ └── DebugSettingsScreenVM.kt │ │ │ ├── easteregg │ │ │ │ ├── EasterEggSettingsScreen.kt │ │ │ │ └── EasterEggSettingsScreenVM.kt │ │ │ ├── favorites │ │ │ │ ├── FavoritesSettingsScreen.kt │ │ │ │ └── FavoritesSettingsScreenVM.kt │ │ │ ├── filesearch │ │ │ │ ├── FileSearchSettingsScreen.kt │ │ │ │ └── FileSearchSettingsScreenVM.kt │ │ │ ├── filterbar │ │ │ │ ├── FilterBarSettingsScreen.kt │ │ │ │ └── FilterBarSettingsScreenVM.kt │ │ │ ├── gestures │ │ │ │ ├── GestureSettingsScreen.kt │ │ │ │ └── GestureSettingsScreenVM.kt │ │ │ ├── hiddenitems │ │ │ │ ├── HiddenItemsSettingsScreen.kt │ │ │ │ └── HiddenItemsSettingsScreenVM.kt │ │ │ ├── homescreen │ │ │ │ ├── HomescreenSettingsScreen.kt │ │ │ │ └── HomescreenSettingsScreenVM.kt │ │ │ ├── icons │ │ │ │ ├── IconsSettingsScreen.kt │ │ │ │ └── IconsSettingsScreenVM.kt │ │ │ ├── integrations │ │ │ │ ├── IntegrationsSettingsScreen.kt │ │ │ │ └── IntegrationsSettingsScreenVM.kt │ │ │ ├── license │ │ │ │ ├── LicenseScreen.kt │ │ │ │ └── LicenseScreenVM.kt │ │ │ ├── locations │ │ │ │ ├── LocationsSettingsScreen.kt │ │ │ │ └── LocationsSettingsScreenVM.kt │ │ │ ├── log │ │ │ │ └── LogScreen.kt │ │ │ ├── main │ │ │ │ └── MainSettingsScreen.kt │ │ │ ├── media │ │ │ │ ├── MediaIntegrationSettingsScreen.kt │ │ │ │ └── MediaIntegrationSettingsScreenVM.kt │ │ │ ├── nextcloud │ │ │ │ ├── NextcloudSettingsScreen.kt │ │ │ │ └── NextcloudSettingsScreenVM.kt │ │ │ ├── osm │ │ │ │ ├── OsmSettingsScreen.kt │ │ │ │ └── OsmSettingsScreenVM.kt │ │ │ ├── owncloud │ │ │ │ ├── OwncloudSettingsScreen.kt │ │ │ │ └── OwncloudSettingsScreenVM.kt │ │ │ ├── plugins │ │ │ │ ├── PluginSettingsScreen.kt │ │ │ │ ├── PluginSettingsScreenVM.kt │ │ │ │ ├── PluginsSettingsScreen.kt │ │ │ │ └── PluginsSettingsScreenVM.kt │ │ │ ├── search │ │ │ │ ├── SearchSettingsScreen.kt │ │ │ │ └── SearchSettingsScreenVM.kt │ │ │ ├── searchactions │ │ │ │ ├── EditSearchActionSheet.kt │ │ │ │ ├── EditSearchActionSheetVM.kt │ │ │ │ ├── SearchActionsSettingsScreen.kt │ │ │ │ └── SearchActionsSettingsScreenVM.kt │ │ │ ├── shapes │ │ │ │ ├── ShapeSchemeSettingsScreen.kt │ │ │ │ ├── ShapeSchemesSettingsScreen.kt │ │ │ │ └── ShapeSchemesSettingsScreenVM.kt │ │ │ ├── tags │ │ │ │ ├── TagsSettingsScreen.kt │ │ │ │ └── TagsSettingsScreenVM.kt │ │ │ ├── tasks │ │ │ │ ├── TasksSettingsScreen.kt │ │ │ │ └── TasksSettingsScreenVM.kt │ │ │ ├── unitconverter │ │ │ │ ├── UnitConverterHelpSettingsScreen.kt │ │ │ │ ├── UnitConverterSettingsScreen.kt │ │ │ │ └── UnitConverterSettingsScreenVM.kt │ │ │ ├── weather │ │ │ │ ├── WeatherIntegrationSettingsScreen.kt │ │ │ │ └── WeatherIntegrationSettingsScreenVM.kt │ │ │ └── wikipedia │ │ │ │ ├── WikipediaSettingsScreen.kt │ │ │ │ └── WikipediaSettingsScreenVM.kt │ │ │ ├── theme │ │ │ ├── ContentAlpha.kt │ │ │ ├── LauncherTheme.kt │ │ │ ├── WallpaperColors.kt │ │ │ ├── colorscheme │ │ │ │ └── ColorScheme.kt │ │ │ ├── shapes │ │ │ │ └── Shapes.kt │ │ │ ├── transparency │ │ │ │ └── TransparencyScheme.kt │ │ │ └── typography │ │ │ │ ├── Common.kt │ │ │ │ ├── Default.kt │ │ │ │ ├── SystemDefault.kt │ │ │ │ └── fontfamily │ │ │ │ ├── DeviceDefault.kt │ │ │ │ └── Outfit.kt │ │ │ └── utils │ │ │ ├── NotificationShadeController.kt │ │ │ ├── TimeFormat.kt │ │ │ └── htmlToAnnotatedString.kt │ └── res │ │ ├── values-night │ │ └── weather_colors.xml │ │ ├── values │ │ ├── AspectRatioImageView.xml │ │ ├── BottomSheet.xml │ │ ├── LauncherCardView.xml │ │ ├── SearchGridView.xml │ │ ├── dimens.xml │ │ └── weather_colors.xml │ │ └── xml │ │ └── shortcuts.xml │ ├── nightly │ └── res │ │ └── xml │ │ └── shortcuts.xml │ └── release │ └── res │ └── xml │ └── shortcuts.xml ├── assets └── icons │ ├── Kvaesitso Debug.svg │ ├── Kvaesitso Monochrome.svg │ ├── Kvaesitso Nightly.png │ ├── Kvaesitso Nightly.svg │ ├── Kvaesitso Plugin.png │ ├── Kvaesitso Plugin.svg │ ├── Kvaesitso.svg │ ├── ic_launcher.png │ └── ic_launcher_debug.png ├── build.gradle.kts ├── core ├── base │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── res │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ └── values │ │ │ ├── ic_launcher_background.xml │ │ │ └── strings.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ ├── com │ │ │ │ └── android │ │ │ │ │ └── launcher3 │ │ │ │ │ └── GestureNavContract.kt │ │ │ └── de │ │ │ │ └── mm20 │ │ │ │ └── launcher2 │ │ │ │ ├── Module.kt │ │ │ │ ├── Tuples.kt │ │ │ │ ├── backup │ │ │ │ └── Backupable.kt │ │ │ │ ├── coroutines │ │ │ │ └── Deferred.kt │ │ │ │ ├── debug │ │ │ │ └── DebugInformationDumper.kt │ │ │ │ ├── graphics │ │ │ │ └── BadgeDrawable.kt │ │ │ │ ├── helper │ │ │ │ └── NetworkUtils.kt │ │ │ │ ├── icons │ │ │ │ ├── BatteryIcons.kt │ │ │ │ ├── Icons.kt │ │ │ │ ├── LauncherIcon.kt │ │ │ │ └── LauncherIconLayer.kt │ │ │ │ ├── licenses │ │ │ │ ├── AppLicense.kt │ │ │ │ ├── OpenSourceLibrary.kt │ │ │ │ └── OpenSourceLicenses.kt │ │ │ │ ├── lifecycle │ │ │ │ └── BroadcastReceiverLiveData.kt │ │ │ │ ├── plugin │ │ │ │ ├── Plugin.kt │ │ │ │ ├── PluginApi.kt │ │ │ │ ├── PluginPackage.kt │ │ │ │ ├── PluginRepository.kt │ │ │ │ ├── PluginState.kt │ │ │ │ ├── QueryPluginApi.kt │ │ │ │ └── config │ │ │ │ │ ├── SearchPluginConfig.kt │ │ │ │ │ └── WeatherPluginConfig.kt │ │ │ │ ├── profiles │ │ │ │ └── Profile.kt │ │ │ │ ├── search │ │ │ │ ├── AppShortcut.kt │ │ │ │ ├── Application.kt │ │ │ │ ├── Article.kt │ │ │ │ ├── CalendarEvent.kt │ │ │ │ ├── Contact.kt │ │ │ │ ├── File.kt │ │ │ │ ├── Location.kt │ │ │ │ ├── ResultScore.kt │ │ │ │ ├── SavableSearchable.kt │ │ │ │ ├── SearchFilters.kt │ │ │ │ ├── Searchable.kt │ │ │ │ ├── SearchableDeserializer.kt │ │ │ │ ├── SearchableRepository.kt │ │ │ │ ├── SearchableSerializer.kt │ │ │ │ ├── Tag.kt │ │ │ │ ├── TagSerialization.kt │ │ │ │ ├── UpdatableSearchable.kt │ │ │ │ └── Website.kt │ │ │ │ └── settings │ │ │ │ └── BaseSettings.kt │ │ └── res │ │ │ ├── drawable-xhdpi │ │ │ └── ic_badge_gdrive.webp │ │ │ ├── drawable-xxhdpi │ │ │ └── ic_badge_gdrive.webp │ │ │ ├── drawable-xxxhdpi │ │ │ └── ic_badge_gdrive.webp │ │ │ ├── drawable │ │ │ ├── anim_ic_edit_add.xml │ │ │ ├── anim_ic_menu_clear.xml │ │ │ ├── anim_ic_play_pause.xml │ │ │ ├── anim_weather_sun_moon.xml │ │ │ ├── ic_badge_nextcloud.xml │ │ │ ├── ic_badge_owncloud.xml │ │ │ ├── ic_file_android.xml │ │ │ ├── ic_file_archive.xml │ │ │ ├── ic_file_backup.xml │ │ │ ├── ic_file_code.xml │ │ │ ├── ic_file_document.xml │ │ │ ├── ic_file_folder.xml │ │ │ ├── ic_file_form.xml │ │ │ ├── ic_file_generic.xml │ │ │ ├── ic_file_markup.xml │ │ │ ├── ic_file_music.xml │ │ │ ├── ic_file_pdf.xml │ │ │ ├── ic_file_picture.xml │ │ │ ├── ic_file_presentation.xml │ │ │ ├── ic_file_spreadsheet.xml │ │ │ ├── ic_file_theme.xml │ │ │ ├── ic_file_video.xml │ │ │ └── ic_launcher_monochrome.xml │ │ │ ├── font │ │ │ ├── outfit_100.otf │ │ │ ├── outfit_200.otf │ │ │ ├── outfit_300.otf │ │ │ ├── outfit_400.otf │ │ │ ├── outfit_500.otf │ │ │ ├── outfit_600.otf │ │ │ ├── outfit_700.otf │ │ │ ├── outfit_800.otf │ │ │ └── outfit_900.otf │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher_foreground.png │ │ │ ├── raw │ │ │ ├── license_apache_2.txt │ │ │ ├── license_bsd_2clause.txt │ │ │ ├── license_bsd_3clause.txt │ │ │ ├── license_gpl_3.txt │ │ │ ├── license_mit.txt │ │ │ └── license_ofl.txt │ │ │ ├── values-night │ │ │ ├── bools.xml │ │ │ └── colors.xml │ │ │ ├── values-w264dp │ │ │ └── integers.xml │ │ │ ├── values-w348dp │ │ │ └── integers.xml │ │ │ ├── values-w400dp │ │ │ └── integers.xml │ │ │ ├── values-w480dp │ │ │ └── integers.xml │ │ │ ├── values-w504dp │ │ │ └── integers.xml │ │ │ ├── values-w600dp │ │ │ └── integers.xml │ │ │ └── values │ │ │ ├── attrs.xml │ │ │ ├── color-schemes.xml │ │ │ ├── colors.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── integers.xml │ │ │ ├── licenses.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ ├── nightly │ │ └── res │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher_background.png │ │ │ └── ic_launcher_foreground.png │ │ │ └── values │ │ │ └── strings.xml │ │ └── test │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── search │ │ └── OpeningScheduleTest.kt ├── compat │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── compat │ │ └── PackageManagerCompat.kt ├── crashreporter │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ ├── com │ │ │ └── balsikandar │ │ │ │ └── crashreporter │ │ │ │ ├── CrashReporter.java │ │ │ │ ├── CrashReporterInitProvider.java │ │ │ │ └── utils │ │ │ │ ├── AppUtils.java │ │ │ │ ├── AppUtils.kt │ │ │ │ ├── Constants.java │ │ │ │ ├── CrashReporterException.java │ │ │ │ ├── CrashReporterExceptionHandler.java │ │ │ │ ├── CrashReporterNotInitializedException.java │ │ │ │ ├── CrashUtil.java │ │ │ │ ├── FileUtils.java │ │ │ │ └── SimplePageChangeListener.java │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── crashreporter │ │ │ ├── CrashReport.kt │ │ │ └── CrashReporter.kt │ │ └── res │ │ ├── drawable │ │ └── ic_warning_black_24dp.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── devicepose │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── devicepose │ │ ├── DevicePoseProvider.kt │ │ └── Module.kt ├── i18n │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── res │ │ ├── values-ar │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-arq │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-az │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-be │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-bn │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-ca │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-cs │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-da │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-de │ │ ├── defaults.xml │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-el │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-en-rUS │ │ └── defaults.xml │ │ ├── values-eo │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-es │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-eu │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-fa │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-fi │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-fr │ │ ├── defaults.xml │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-hu │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-ia │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-in │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-it │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-ja │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-ko │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-lt │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-ms │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-nb-rNO │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-nl │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-pl │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-pt-rBR │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-pt │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-ro │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-ru │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-sv │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-th │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-tr │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-uk │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-vi │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-zh-rCN │ │ ├── strings.xml │ │ └── units.xml │ │ ├── values-zh-rTW │ │ ├── strings.xml │ │ └── units.xml │ │ └── values │ │ ├── defaults.xml │ │ ├── strings.xml │ │ └── units.xml ├── ktx │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── ktx │ │ │ ├── Address.kt │ │ │ ├── Boolean.kt │ │ │ ├── Context.kt │ │ │ ├── Double.kt │ │ │ ├── Drawable.kt │ │ │ ├── Extensions.kt │ │ │ ├── Float.kt │ │ │ ├── InputStream.kt │ │ │ ├── Int.kt │ │ │ ├── Iterable.kt │ │ │ ├── Json.kt │ │ │ ├── LayerDrawable.kt │ │ │ ├── List.kt │ │ │ ├── Notification.kt │ │ │ ├── Nullable.kt │ │ │ ├── PackageManager.kt │ │ │ ├── Pair.kt │ │ │ ├── PendingIntent.kt │ │ │ ├── Rect.kt │ │ │ ├── RectF.kt │ │ │ ├── Resources.kt │ │ │ ├── Result.kt │ │ │ ├── SharedPreferences.kt │ │ │ ├── String.kt │ │ │ ├── TextView.kt │ │ │ ├── UUID.kt │ │ │ ├── UserHandle.kt │ │ │ ├── View.kt │ │ │ └── XmlPullParser.kt │ │ └── test │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── ktx │ │ └── StringKtTest.kt ├── permissions │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── permissions │ │ ├── Module.kt │ │ └── PermissionsManager.kt ├── preferences │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── preferences │ │ ├── LauncherDataStore.kt │ │ ├── LauncherSettingsData.kt │ │ ├── LauncherSettingsDataSerializer.kt │ │ ├── LegacyDataStore.kt │ │ ├── Module.kt │ │ ├── media │ │ └── MediaSettings.kt │ │ ├── migrations │ │ ├── Migration2.kt │ │ ├── Migration3.kt │ │ ├── Migration4.kt │ │ └── Migration5.kt │ │ ├── search │ │ ├── CalculatorSearchSettings.kt │ │ ├── CalendarSearchSettings.kt │ │ ├── ContactSearchSettings.kt │ │ ├── FavoritesSettings.kt │ │ ├── FileSearchSettings.kt │ │ ├── LocationSearchSettings.kt │ │ ├── RankingSettings.kt │ │ ├── SearchFilterSettings.kt │ │ ├── ShortcutSearchSettings.kt │ │ ├── UnitConverterSettings.kt │ │ ├── WebsiteSearchSettings.kt │ │ └── WikipediaSearchSettings.kt │ │ ├── ui │ │ ├── BadgeSettings.kt │ │ ├── ClockWidgetSettings.kt │ │ ├── GestureSettings.kt │ │ ├── IconSettings.kt │ │ ├── SearchUiSettings.kt │ │ ├── UiSettings.kt │ │ └── UiState.kt │ │ └── weather │ │ └── WeatherSettings.kt ├── profiles │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── profiles │ │ ├── Module.kt │ │ └── ProfileManager.kt └── shared │ ├── .gitignore │ ├── LICENSE.txt │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ ├── readme.md │ └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── de │ └── mm20 │ └── launcher2 │ ├── plugin │ ├── PluginType.kt │ ├── config │ │ ├── QueryPluginConfig.kt │ │ ├── StorageStrategy.kt │ │ └── WeatherPluginConfig.kt │ ├── contracts │ │ ├── CalendarPluginContract.kt │ │ ├── Columns.kt │ │ ├── ContactPluginContract.kt │ │ ├── FilePluginContract.kt │ │ ├── LocationPluginContract.kt │ │ ├── PluginContract.kt │ │ ├── SearchPluginContract.kt │ │ └── WeatherPluginContract.kt │ └── data │ │ ├── Bundle.kt │ │ └── Cursor.kt │ ├── search │ ├── calendar │ │ ├── CalendarListType.kt │ │ └── CalendarQuery.kt │ ├── contact │ │ └── ContactInfo.kt │ └── location │ │ ├── Address.kt │ │ ├── Attribution.kt │ │ ├── Departure.kt │ │ ├── LocationIcon.kt │ │ ├── OpeningSchedule.kt │ │ └── PaymentMethod.kt │ ├── serialization │ ├── ColorSerializer.kt │ ├── DayOfWeekSerializer.kt │ ├── DurationSerializer.kt │ ├── Json.kt │ ├── LocalTimeSerializer.kt │ ├── OpeningScheduleSerializer.kt │ ├── UriSerializer.kt │ └── ZonedDateTimeSerializer.kt │ └── weather │ └── WeatherIcon.kt ├── data ├── applications │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── java │ │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── applications │ │ │ ├── FakeApp.kt │ │ │ └── FakeAppRepository.kt │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── applications │ │ ├── AppRepository.kt │ │ ├── AppSerialization.kt │ │ ├── LauncherApp.kt │ │ ├── LockedPrivateProfileApp.kt │ │ └── Module.kt ├── appshortcuts │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── appshortcuts │ │ ├── AppShortcut.kt │ │ ├── AppShortcutConfigActivity.kt │ │ ├── AppShortcutRepository.kt │ │ ├── AppShortcutSerialization.kt │ │ ├── LauncherShortcut.kt │ │ ├── LegacyShortcut.kt │ │ ├── Module.kt │ │ └── UnavailableShortcut.kt ├── calculator │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ ├── calculator │ │ ├── CalculatorRepository.kt │ │ └── Module.kt │ │ └── search │ │ └── data │ │ └── Calculator.kt ├── calendar │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── calendar │ │ ├── CalendarRepository.kt │ │ ├── CalendarSerialization.kt │ │ ├── Module.kt │ │ └── providers │ │ ├── AndroidCalendarEvent.kt │ │ ├── AndroidCalendarProvider.kt │ │ ├── CalendarList.kt │ │ ├── CalendarProvider.kt │ │ ├── PluginCalendarEvent.kt │ │ ├── PluginCalendarProvider.kt │ │ ├── TasksCalendarEvent.kt │ │ └── TasksCalendarProvider.kt ├── contacts │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── contacts │ │ ├── ContactRepository.kt │ │ ├── ContactSerialization.kt │ │ ├── Module.kt │ │ └── providers │ │ ├── AndroidContact.kt │ │ ├── AndroidContactProvider.kt │ │ ├── ContactProvider.kt │ │ ├── PluginContact.kt │ │ └── PluginContactProvider.kt ├── currencies │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── currencies │ │ ├── Currency.kt │ │ ├── CurrencyRepository.kt │ │ └── ExchangeRateWorker.kt ├── customattrs │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── data │ │ └── customattrs │ │ ├── CustomAttribute.kt │ │ ├── CustomAttributeType.kt │ │ ├── CustomAttributesRepository.kt │ │ ├── Module.kt │ │ └── utils │ │ └── Utils.kt ├── database │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ ├── schemas │ │ └── de.mm20.launcher2.database.AppDatabase │ │ │ ├── 0.json │ │ │ ├── 1.json │ │ │ ├── 10.json │ │ │ ├── 11.json │ │ │ ├── 12.json │ │ │ ├── 13.json │ │ │ ├── 14.json │ │ │ ├── 15.json │ │ │ ├── 16.json │ │ │ ├── 17.json │ │ │ ├── 18.json │ │ │ ├── 19.json │ │ │ ├── 2.json │ │ │ ├── 20.json │ │ │ ├── 21.json │ │ │ ├── 22.json │ │ │ ├── 23.json │ │ │ ├── 24.json │ │ │ ├── 3.json │ │ │ ├── 4.json │ │ │ ├── 5.json │ │ │ ├── 6.json │ │ │ ├── 7.json │ │ │ ├── 8.json │ │ │ └── 9.json │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── database │ │ ├── AppDatabase.kt │ │ ├── BackupRestoreDao.kt │ │ ├── Converters.kt │ │ ├── CurrencyDao.kt │ │ ├── CustomAttrsDao.kt │ │ ├── IconDao.kt │ │ ├── Module.kt │ │ ├── SearchActionDao.kt │ │ ├── SearchableDao.kt │ │ ├── WeatherDao.kt │ │ ├── WidgetDao.kt │ │ ├── daos │ │ ├── PluginDao.kt │ │ └── ThemeDao.kt │ │ ├── entities │ │ ├── ColorsEntity.kt │ │ ├── CurrencyEntity.kt │ │ ├── CustomAttributeEntity.kt │ │ ├── ForecastEntity.kt │ │ ├── IconEntity.kt │ │ ├── IconPackEntity.kt │ │ ├── PluginEntity.kt │ │ ├── SavedSearchableEntity.kt │ │ ├── SearchActionEntity.kt │ │ ├── ShapesEntity.kt │ │ ├── WebsearchEntity.kt │ │ └── WidgetEntity.kt │ │ └── migrations │ │ ├── Migration_10_11.kt │ │ ├── Migration_11_12.kt │ │ ├── Migration_12_13.kt │ │ ├── Migration_13_14.kt │ │ ├── Migration_14_15.kt │ │ ├── Migration_15_16.kt │ │ ├── Migration_16_17.kt │ │ ├── Migration_17_18.kt │ │ ├── Migration_18_19.kt │ │ ├── Migration_19_20.kt │ │ ├── Migration_20_21.kt │ │ ├── Migration_21_22.kt │ │ ├── Migration_22_23.kt │ │ ├── Migration_23_24.kt │ │ ├── Migration_24_25.kt │ │ ├── Migration_25_26.kt │ │ ├── Migration_26_27.kt │ │ ├── Migration_27_28.kt │ │ ├── Migration_6_7.kt │ │ ├── Migration_7_8.kt │ │ ├── Migration_8_9.kt │ │ └── Migration_9_10.kt ├── files │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ ├── files │ │ ├── FileSerialization.kt │ │ ├── FilesRepository.kt │ │ ├── Module.kt │ │ └── providers │ │ │ ├── DeferredFile.kt │ │ │ ├── FileProvider.kt │ │ │ ├── LocalFile.kt │ │ │ ├── LocalFileProvider.kt │ │ │ ├── NextcloudFile.kt │ │ │ ├── NextcloudFileProvider.kt │ │ │ ├── OwncloudFile.kt │ │ │ ├── OwncloudFileProvider.kt │ │ │ ├── PluginFile.kt │ │ │ └── PluginFileProvider.kt │ │ └── media │ │ └── ThumbnailUtilsCompat.kt ├── locations │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── locations │ │ │ ├── LocationSerialization.kt │ │ │ ├── LocationsRepository.kt │ │ │ ├── Module.kt │ │ │ └── providers │ │ │ ├── LocationProvider.kt │ │ │ ├── PluginLocation.kt │ │ │ ├── PluginLocationProvider.kt │ │ │ └── openstreetmaps │ │ │ ├── OsmLocation.kt │ │ │ ├── OsmLocationProvider.kt │ │ │ └── OverpassApi.kt │ │ └── test │ │ └── kotlin │ │ └── OpeningHoursTest.kt ├── notifications │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── notifications │ │ ├── Module.kt │ │ ├── Notification.kt │ │ ├── NotificationRepository.kt │ │ └── NotificationService.kt ├── plugins │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── data │ │ └── plugins │ │ ├── Module.kt │ │ ├── Plugin.kt │ │ └── PluginRepositoryImpl.kt ├── search-actions │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── searchactions │ │ ├── KnownWebsearchEngines.kt │ │ ├── Module.kt │ │ ├── SearchActionRepository.kt │ │ ├── SearchActionService.kt │ │ ├── TextClassifier.kt │ │ ├── actions │ │ ├── AppSearchAction.kt │ │ ├── CallAction.kt │ │ ├── CreateContactAction.kt │ │ ├── CustomIntentAction.kt │ │ ├── EmailAction.kt │ │ ├── MessageAction.kt │ │ ├── OpenUrlAction.kt │ │ ├── ScheduleEventAction.kt │ │ ├── SearchAction.kt │ │ ├── SetAlarmAction.kt │ │ ├── ShareAction.kt │ │ ├── TimerAction.kt │ │ └── WebsearchAction.kt │ │ └── builders │ │ ├── AppSearchActionBuilder.kt │ │ ├── CallActionBuilder.kt │ │ ├── CreateContactActionBuilder.kt │ │ ├── CustomIntentActionBuilder.kt │ │ ├── CustomWebsearchActionBuilder.kt │ │ ├── CustomizableSearchActionBuilder.kt │ │ ├── EmailActionBuilder.kt │ │ ├── MessageActionBuilder.kt │ │ ├── OpenUrlActionBuilder.kt │ │ ├── ScheduleEventActionBuilder.kt │ │ ├── SearchActionBuilder.kt │ │ ├── SetAlarmActionBuilder.kt │ │ ├── ShareActionBuilder.kt │ │ ├── TimerActionBuilder.kt │ │ └── WebsearchActionBuilder.kt ├── searchable │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── searchable │ │ ├── Module.kt │ │ ├── PinnedLevel.kt │ │ ├── SavableSearchableRepository.kt │ │ ├── SavedSearchable.kt │ │ ├── SavedSearchableRankInfo.kt │ │ ├── Serialization.kt │ │ └── VisibilityLevel.kt ├── themes │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── themes │ │ ├── Colors.kt │ │ ├── DefaultThemes.kt │ │ ├── LegacySerialization.kt │ │ ├── Module.kt │ │ ├── Serialization.kt │ │ ├── Shapes.kt │ │ └── ThemeRepository.kt ├── unitconverter │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ ├── search │ │ └── data │ │ │ ├── CurrencyUnitConverter.kt │ │ │ └── UnitConverter.kt │ │ └── unitconverter │ │ ├── ConverterUtils.kt │ │ ├── Dimension.kt │ │ ├── MeasureUnit.kt │ │ ├── Module.kt │ │ ├── UnitConverterRepository.kt │ │ ├── UnitValue.kt │ │ └── converters │ │ ├── AreaConverter.kt │ │ ├── Converter.kt │ │ ├── CurrencyConverter.kt │ │ ├── DataConverter.kt │ │ ├── LengthConverter.kt │ │ ├── MassConverter.kt │ │ ├── SimpleFactorConverter.kt │ │ ├── TemperatureConverter.kt │ │ ├── TimeConverter.kt │ │ └── VelocityConverter.kt ├── weather │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── weather │ │ │ ├── DailyForecast.kt │ │ │ ├── Forecast.kt │ │ │ ├── GeocoderWeatherProvider.kt │ │ │ ├── Module.kt │ │ │ ├── Weather.kt │ │ │ ├── WeatherLocation.kt │ │ │ ├── WeatherProvider.kt │ │ │ ├── WeatherProviderInfo.kt │ │ │ ├── WeatherRepository.kt │ │ │ ├── breezy │ │ │ ├── BreezyWeatherData.kt │ │ │ ├── BreezyWeatherProvider.kt │ │ │ └── BreezyWeatherReceiver.kt │ │ │ ├── brightsky │ │ │ ├── BrightSkyApi.kt │ │ │ └── BrightSkyProvider.kt │ │ │ ├── here │ │ │ ├── HereGeocodeApi.kt │ │ │ ├── HereProvider.kt │ │ │ └── HereWeatherApi.kt │ │ │ ├── metno │ │ │ └── MetNoProvider.kt │ │ │ ├── openweathermap │ │ │ ├── OpenWeatherMapApi.kt │ │ │ └── OpenWeatherMapProvider.kt │ │ │ └── plugin │ │ │ └── PluginWeatherProvider.kt │ │ └── res │ │ └── values │ │ └── config_example.xml ├── websites │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── websites │ │ │ ├── Module.kt │ │ │ ├── Website.kt │ │ │ ├── WebsiteRepository.kt │ │ │ └── WebsiteSerialization.kt │ │ └── res │ │ └── drawable │ │ └── ic_website.xml ├── widgets │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── widgets │ │ ├── AppWidget.kt │ │ ├── CalendarWidget.kt │ │ ├── FavoritesWidget.kt │ │ ├── Module.kt │ │ ├── NotesWidget.kt │ │ ├── WeatherWidget.kt │ │ ├── Widget.kt │ │ └── WidgetRepository.kt └── wikipedia │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── wikipedia │ │ ├── Module.kt │ │ ├── Wikipedia.kt │ │ ├── WikipediaApi.kt │ │ ├── WikipediaRepository.kt │ │ └── WikipediaSerialization.kt │ └── res │ ├── drawable-hdpi │ └── ic_wikipedia.webp │ ├── drawable-mdpi │ └── ic_wikipedia.webp │ ├── drawable-xhdpi │ └── ic_wikipedia.webp │ ├── drawable-xxhdpi │ └── ic_wikipedia.webp │ └── drawable-xxxhdpi │ └── ic_wikipedia.webp ├── docs ├── .gitignore ├── .vitepress │ ├── config.mts │ └── theme │ │ ├── Footer.vue │ │ ├── Layout.vue │ │ ├── custom.css │ │ ├── index.ts │ │ └── style.css ├── docs │ ├── contributor-guide │ │ ├── feature-requests.md │ │ ├── i18n.md │ │ ├── index.md │ │ ├── pull-requests.md │ │ ├── report-bugs.md │ │ ├── sidebar.ts │ │ └── sponsor.md │ ├── developer-guide │ │ ├── external-apis │ │ │ ├── exchange-rates.md │ │ │ ├── index.md │ │ │ ├── weather.md │ │ │ └── wikipedia.md │ │ ├── index.md │ │ ├── integrations │ │ │ └── icon-packs.md │ │ ├── plugins │ │ │ ├── access-control.md │ │ │ ├── get-started.md │ │ │ ├── metadata.md │ │ │ ├── migrations │ │ │ │ └── v2.md │ │ │ ├── plugin-types │ │ │ │ ├── common │ │ │ │ │ ├── _get_params.md │ │ │ │ │ ├── _plugin_state.md │ │ │ │ │ ├── _query_plugin_config.md │ │ │ │ │ ├── _refresh_params.md │ │ │ │ │ └── _search_params.md │ │ │ │ ├── contact-search.md │ │ │ │ ├── file-search.md │ │ │ │ ├── places-search.md │ │ │ │ └── weather.md │ │ │ └── settings.md │ │ ├── project-structure │ │ │ ├── libraries.md │ │ │ └── modules.md │ │ ├── setup.md │ │ └── sidebar.ts │ └── user-guide │ │ ├── concepts │ │ ├── favorites.md │ │ ├── plugins.md │ │ └── tags.md │ │ ├── customization │ │ ├── color-schemes.md │ │ ├── per-item-customization.md │ │ └── themed-icons.md │ │ ├── faq.md │ │ ├── index.md │ │ ├── integrations │ │ ├── mediacontrol.md │ │ └── weather.md │ │ ├── search │ │ ├── calculator.md │ │ ├── filters.md │ │ ├── online-results.md │ │ ├── quickactions.md │ │ └── unit-converter.md │ │ ├── sidebar.ts │ │ ├── troubleshooting │ │ ├── crashreporter.md │ │ ├── granted-permissions.md │ │ ├── restricted-settings.md │ │ └── update-not-installed.md │ │ └── widgets │ │ ├── calendar-widget.md │ │ ├── clock.md │ │ ├── favorites-widget.md │ │ ├── music-widget.md │ │ ├── notes-widget.md │ │ └── weather-widget.md ├── in-app.md ├── index.md ├── license.md ├── package-lock.json ├── package.json ├── privacy-policy.md ├── public │ ├── .well-known │ │ ├── assetlinks.json │ │ └── microsoft-identity-association.json │ ├── CNAME │ ├── fonts │ │ ├── outfit │ │ │ ├── outfit-v6-latin-700.woff │ │ │ ├── outfit-v6-latin-700.woff2 │ │ │ ├── outfit-v6-latin-regular.woff │ │ │ └── outfit-v6-latin-regular.woff2 │ │ ├── roboto-mono │ │ │ ├── roboto-mono-v22-latin-700.woff │ │ │ ├── roboto-mono-v22-latin-700.woff2 │ │ │ ├── roboto-mono-v22-latin-700italic.woff │ │ │ ├── roboto-mono-v22-latin-700italic.woff2 │ │ │ ├── roboto-mono-v22-latin-italic.woff │ │ │ ├── roboto-mono-v22-latin-italic.woff2 │ │ │ ├── roboto-mono-v22-latin-regular.woff │ │ │ └── roboto-mono-v22-latin-regular.woff2 │ │ └── roboto │ │ │ ├── roboto-v30-latin-500.woff │ │ │ ├── roboto-v30-latin-500.woff2 │ │ │ ├── roboto-v30-latin-700.woff │ │ │ ├── roboto-v30-latin-700.woff2 │ │ │ ├── roboto-v30-latin-700italic.woff │ │ │ ├── roboto-v30-latin-700italic.woff2 │ │ │ ├── roboto-v30-latin-italic.woff │ │ │ ├── roboto-v30-latin-italic.woff2 │ │ │ ├── roboto-v30-latin-regular.woff │ │ │ └── roboto-v30-latin-regular.woff2 │ ├── icon.png │ └── img │ │ ├── accessibility-service-1.png │ │ ├── accessibility-service-2.png │ │ ├── ic_launcher.png │ │ ├── notification-access-1.png │ │ ├── notification-access-2.png │ │ ├── notification-access-3.png │ │ ├── notification-access-4.png │ │ ├── plugin-configuration.png │ │ ├── screenshot-1.png │ │ ├── screenshot-2.png │ │ ├── screenshot-3.png │ │ ├── screenshot-4.png │ │ ├── screenshot-5.png │ │ ├── screenshot-6.png │ │ ├── themed-icon-pack.png │ │ ├── themed-icons-off.png │ │ └── themed-icons-on.png └── shims.d.ts ├── fastlane └── metadata │ └── android │ └── en-US │ ├── changelogs │ ├── 2023052200.txt │ ├── 2023062300.txt │ ├── 2023062400.txt │ ├── 2023062500.txt │ ├── 2023071200.txt │ ├── 2023071201.txt │ ├── 2023090800.txt │ ├── 2023101300.txt │ ├── 2024022000.txt │ ├── 2024050700.txt │ ├── 2024050800.txt │ ├── 2024050801.txt │ ├── 2024050900.txt │ ├── 2024051000.txt │ ├── 2024063000.txt │ ├── 2024070100.txt │ ├── 2024070300.txt │ ├── 2024071900.txt │ ├── 2024072200.txt │ ├── 2024081700.txt │ ├── 2024090300.txt │ ├── 2024120500.txt │ ├── 2024122400.txt │ ├── 2025040200.txt │ ├── 2025040300.txt │ ├── 2025040301.txt │ ├── 2025042100.txt │ ├── 2025050300.txt │ └── 2025050301.txt │ ├── full_description.txt │ ├── images │ ├── icon.png │ └── phoneScreenshots │ │ ├── screenshot01.jpg │ │ ├── screenshot02.jpg │ │ ├── screenshot03.jpg │ │ ├── screenshot04.jpg │ │ ├── screenshot05.jpg │ │ └── screenshot06.jpg │ └── short_description.txt ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libs ├── address-formatter │ ├── LICENSE │ ├── Readme.md │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── woheller69 │ │ │ └── AndroidAddressFormatter │ │ │ ├── Kt.kt │ │ │ ├── OsmAddressFormatter.java │ │ │ ├── RegexPatternCache.java │ │ │ └── Templates.java │ │ └── resources │ │ ├── abbreviations.json │ │ ├── aliases.json │ │ ├── country2lang.json │ │ ├── countrynames.json │ │ ├── countycodes.json │ │ ├── statecodes.json │ │ └── worldwide.json ├── material-color-utilities │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ ├── blend │ │ └── Blend.java │ │ ├── hct │ │ ├── Cam16.java │ │ ├── Hct.java │ │ ├── HctSolver.java │ │ └── ViewingConditions.java │ │ ├── palettes │ │ ├── CorePalette.java │ │ └── TonalPalette.java │ │ ├── scheme │ │ └── Scheme.java │ │ └── utils │ │ ├── ColorUtils.java │ │ └── MathUtils.java ├── nextcloud │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── nextcloud │ │ │ ├── LoginActivity.kt │ │ │ ├── LoginFlow.kt │ │ │ ├── NcUser.kt │ │ │ └── NextcloudApiHelper.kt │ │ └── res │ │ └── drawable │ │ └── ic_nextcloud_logo.xml ├── owncloud │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── owncloud │ │ │ ├── LoginActivity.kt │ │ │ ├── OcUser.kt │ │ │ └── OwncloudClient.kt │ │ └── res │ │ ├── drawable-night │ │ └── ic_owncloud_logo.xml │ │ └── drawable │ │ └── ic_owncloud_logo.xml ├── tinypinyin │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── github │ │ └── promeg │ │ ├── pinyinhelper │ │ ├── Engine.java │ │ ├── ForwardLongestSelector.java │ │ ├── Pinyin.java │ │ ├── PinyinCode1.java │ │ ├── PinyinCode2.java │ │ ├── PinyinCode3.java │ │ ├── PinyinData.java │ │ ├── PinyinDict.java │ │ ├── PinyinMapDict.java │ │ ├── PinyinRules.java │ │ ├── SegmentationSelector.java │ │ └── Utils.java │ │ └── tinypinyin │ │ ├── android │ │ └── asset │ │ │ └── lexicons │ │ │ └── AndroidAssetDict.java │ │ └── lexicons │ │ └── android │ │ └── cncity │ │ └── CnCityDict.java └── webdav │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── de │ └── mm20 │ └── launcher2 │ └── webdav │ ├── WebDavApi.kt │ └── WebDavFile.kt ├── plugins └── sdk │ ├── .gitignore │ ├── LICENSE.txt │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ ├── readme.md │ └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── sdk │ │ ├── PluginState.kt │ │ ├── base │ │ ├── BasePluginProvider.kt │ │ ├── QueryPluginProvider.kt │ │ └── StringPluginProvider.kt │ │ ├── calendar │ │ ├── CalendarEvent.kt │ │ ├── CalendarList.kt │ │ └── CalendarProvider.kt │ │ ├── config │ │ ├── SearchPluginConfig.kt │ │ └── WeatherPluginConfig.kt │ │ ├── contacts │ │ ├── Contact.kt │ │ └── ContactProvider.kt │ │ ├── files │ │ ├── File.kt │ │ └── FileProvider.kt │ │ ├── ktx │ │ └── Address.kt │ │ ├── locations │ │ ├── Location.kt │ │ ├── LocationProvider.kt │ │ └── LocationQuery.kt │ │ ├── permissions │ │ ├── DataStore.kt │ │ ├── PermissionData.kt │ │ ├── PluginPermissionManager.kt │ │ └── RequestPermissionActivity.kt │ │ ├── utils │ │ └── Coroutines.kt │ │ └── weather │ │ ├── Forecast.kt │ │ ├── WeatherLocation.kt │ │ └── WeatherProvider.kt │ └── res │ ├── layout │ └── activity_request_permission.xml │ ├── values-ar │ └── strings.xml │ ├── values-arq │ └── strings.xml │ ├── values-az │ └── strings.xml │ ├── values-be │ └── strings.xml │ ├── values-bn │ └── strings.xml │ ├── values-ca │ └── strings.xml │ ├── values-cs │ └── strings.xml │ ├── values-da │ └── strings.xml │ ├── values-de │ └── strings.xml │ ├── values-el │ └── strings.xml │ ├── values-eo │ └── strings.xml │ ├── values-es │ └── strings.xml │ ├── values-eu │ └── strings.xml │ ├── values-fa │ └── strings.xml │ ├── values-fi │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-hu │ └── strings.xml │ ├── values-ia │ └── strings.xml │ ├── values-in │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values-ja │ └── strings.xml │ ├── values-ko │ └── strings.xml │ ├── values-lt │ └── strings.xml │ ├── values-ms │ └── strings.xml │ ├── values-nb-rNO │ └── strings.xml │ ├── values-nl │ └── strings.xml │ ├── values-pl │ └── strings.xml │ ├── values-pt-rBR │ └── strings.xml │ ├── values-pt │ └── strings.xml │ ├── values-ro │ └── strings.xml │ ├── values-ru │ └── strings.xml │ ├── values-sv │ └── strings.xml │ ├── values-th │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-uk │ └── strings.xml │ ├── values-vi │ └── strings.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ └── values │ └── strings.xml ├── readme.md ├── services ├── accounts │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── accounts │ │ ├── Account.kt │ │ ├── AccountType.kt │ │ ├── AccountsRepository.kt │ │ └── Module.kt ├── backup │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── backup │ │ ├── BackupManager.kt │ │ ├── BackupMetadata.kt │ │ └── Module.kt ├── badges │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── badges │ │ ├── Badge.kt │ │ ├── BadgeService.kt │ │ ├── Module.kt │ │ └── providers │ │ ├── AppShortcutBadgeProvider.kt │ │ ├── BadgeProvider.kt │ │ ├── CloudBadgeProvider.kt │ │ ├── HiddenItemBadgeProvider.kt │ │ ├── NotificationBadgeProvider.kt │ │ ├── PluginBadgeProvider.kt │ │ ├── ProfileBadgeProvider.kt │ │ └── SuspendedAppsBadgeProvider.kt ├── favorites │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── services │ │ └── favorites │ │ ├── FavoritesService.kt │ │ └── Module.kt ├── global-actions │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── globalactions │ │ │ ├── GlobalActionsService.kt │ │ │ ├── LauncherAccessibilityService.kt │ │ │ └── Module.kt │ │ └── res │ │ └── xml │ │ └── accessibility_service.xml ├── icons │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── icons │ │ ├── DynamicCalendarIcon.kt │ │ ├── IconPack.kt │ │ ├── IconPackIcon.kt │ │ ├── IconPackManager.kt │ │ ├── IconService.kt │ │ ├── Module.kt │ │ ├── ThemedDynamicCalendarIcon.kt │ │ ├── TransformableDynamicLauncherIcon.kt │ │ ├── compat │ │ └── AdaptiveIconDrawableCompat.kt │ │ ├── loaders │ │ ├── AppFilterIconPackInstaller.kt │ │ ├── GrayscaleMapIconPackInstaller.kt │ │ └── IconPackInstaller.kt │ │ ├── providers │ │ ├── CalendarIconProvider.kt │ │ ├── CompatIconProvider.kt │ │ ├── CustomIconPackIconProvider.kt │ │ ├── CustomTextIconProvider.kt │ │ ├── CustomThemedIconProvider.kt │ │ ├── DynamicClockIconProvider.kt │ │ ├── IconPackIconProvider.kt │ │ ├── IconProvider.kt │ │ ├── LegacyCustomIconPackIconProvider.kt │ │ ├── PlaceholderIconProvider.kt │ │ ├── SystemIconProvider.kt │ │ └── ThemedPlaceholderIconProvider.kt │ │ └── transformations │ │ ├── ForceThemedIconTransformation.kt │ │ ├── LauncherIconTransformation.kt │ │ └── LegacyToAdaptiveTransformation.kt ├── music │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── de │ │ │ └── mm20 │ │ │ └── launcher2 │ │ │ └── music │ │ │ ├── Module.kt │ │ │ ├── MusicService.kt │ │ │ └── SupportedActions.kt │ │ └── res │ │ └── values │ │ └── dimens.xml ├── plugins │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── plugins │ │ ├── Module.kt │ │ ├── PluginScanner.kt │ │ └── PluginService.kt ├── search │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── search │ │ ├── Module.kt │ │ └── SearchService.kt ├── tags │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── de │ │ └── mm20 │ │ └── launcher2 │ │ └── services │ │ └── tags │ │ ├── Module.kt │ │ ├── TagsService.kt │ │ └── impl │ │ └── TagsServiceImpl.kt └── widgets │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── de │ └── mm20 │ └── launcher2 │ └── services │ └── widgets │ ├── BuiltInWidgetInfo.kt │ ├── Module.kt │ └── WidgetsService.kt └── settings.gradle.kts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [MM2-0] 4 | -------------------------------------------------------------------------------- /.github/workflows/trigger-fdroid-repo-rebuild.yml: -------------------------------------------------------------------------------- 1 | name: Trigger F-Droid repository rebuild 2 | on: 3 | workflow_dispatch: 4 | release: 5 | types: 6 | - published 7 | - unpublished 8 | - edited 9 | workflow_run: 10 | workflows: 11 | - Build Nightly APK 12 | types: 13 | - completed 14 | 15 | permissions: 16 | contents: write 17 | 18 | jobs: 19 | trigger: 20 | runs-on: ubuntu-latest 21 | steps: 22 | - name: Trigger F-Droid repository rebuild 23 | run: | 24 | curl -X POST -H "Authorization: Bearer ${{ secrets.FDROID_REPO_GH_PAT }}" https://api.github.com/repos/MM2-0/fdroid/dispatches --data '{"event_type": "rebuild-repository"}' 25 | -------------------------------------------------------------------------------- /.idea/AndroidProjectSystem.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/.idea/gradle.properties -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/app/src/main/java/de/mm20/launcher2/content/GenericFileProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.content 2 | 3 | import androidx.core.content.FileProvider 4 | 5 | class GenericFileProvider: FileProvider() -------------------------------------------------------------------------------- /app/app/src/main/java/de/mm20/launcher2/debug/Debug.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.debug 2 | 3 | import android.os.StrictMode 4 | import android.util.Log 5 | 6 | // This class does nothing in release builds 7 | fun initDebugMode() { 8 | Log.d("MM20", "MM20Launcher2 is running in debug mode.") 9 | StrictMode.setThreadPolicy( 10 | StrictMode.ThreadPolicy.Builder() 11 | .detectAll() 12 | .penaltyLog() 13 | .build() 14 | ) 15 | StrictMode.setVmPolicy( 16 | StrictMode.VmPolicy.Builder() 17 | .detectAll() 18 | .penaltyLog() 19 | .build() 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /app/app/src/main/res/drawable-hdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/app/app/src/main/res/drawable-hdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /app/app/src/main/res/drawable-mdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/app/app/src/main/res/drawable-mdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /app/app/src/main/res/drawable-xhdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/app/app/src/main/res/drawable-xhdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /app/app/src/main/res/drawable-xxhdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/app/app/src/main/res/drawable-xxhdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /app/app/src/main/res/drawable-xxxhdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/app/app/src/main/res/drawable-xxxhdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /app/app/src/main/res/resources.properties: -------------------------------------------------------------------------------- 1 | unqualifiedResLocale=en-US -------------------------------------------------------------------------------- /app/app/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/app/src/main/res/values/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/app/src/main/res/values/donottranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/app/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 1 5 | -------------------------------------------------------------------------------- /app/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/app/src/main/res/xml/provider_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /app/app/src/release/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/ui/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/ui/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/app/ui/consumer-rules.pro -------------------------------------------------------------------------------- /app/ui/src/debug/res/xml/shortcuts.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/assistant/AssistantActivity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.assistant 2 | 3 | import de.mm20.launcher2.ui.launcher.SharedLauncherActivity 4 | 5 | class AssistantActivity: SharedLauncherActivity(LauncherActivityMode.Assistant) -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/base/ProvideLocals.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.base 2 | 3 | import androidx.compose.runtime.Composable 4 | 5 | @Composable 6 | fun ProvideCompositionLocals(content: @Composable () -> Unit) { 7 | ProvideCurrentTime { 8 | ProvideSettings { 9 | ProvideAppWidgetHost { 10 | content() 11 | } 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/ktx/ButtonDefaults.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.ktx 2 | 3 | import androidx.compose.foundation.layout.PaddingValues 4 | import androidx.compose.material3.ButtonDefaults 5 | import androidx.compose.ui.unit.dp 6 | 7 | val ButtonDefaults.TextButtonWithTrailingIconContentPadding 8 | get() = PaddingValues( 9 | start = 16.dp, 10 | top = ContentPadding.calculateTopPadding(), 11 | end = 12.dp, 12 | bottom = ContentPadding.calculateBottomPadding() 13 | ) -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/ktx/Deferred.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.ktx 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.runtime.State 5 | import androidx.compose.runtime.produceState 6 | import kotlinx.coroutines.Deferred 7 | 8 | @Composable 9 | fun Deferred?.asState(initialValue: T): State { 10 | return produceState(initialValue) { 11 | if (this@asState != null) { 12 | value = await() 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/ktx/Dp.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.ktx 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.ui.platform.LocalDensity 5 | import androidx.compose.ui.unit.Dp 6 | 7 | @Composable 8 | fun Dp.toPixels(): Float { 9 | return value * LocalDensity.current.density 10 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/ktx/Int.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.ktx 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.ui.platform.LocalDensity 5 | import androidx.compose.ui.unit.Dp 6 | import androidx.compose.ui.unit.dp 7 | 8 | /** 9 | * Converts the given pixel size to a Dp value based on the current density 10 | */ 11 | @Composable 12 | fun Int.toDp(): Dp { 13 | return (this / LocalDensity.current.density).dp 14 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/ktx/IntRange.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.ktx 2 | 3 | inline operator fun IntRange.inc(): IntRange { 4 | return start + 1..endInclusive + 1 5 | } 6 | 7 | inline operator fun IntRange.dec(): IntRange { 8 | return start - 1..endInclusive - 1 9 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/ktx/Modifier.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.ktx 2 | 3 | import androidx.compose.ui.Modifier 4 | 5 | fun Modifier.conditional(condition: Boolean, other: Modifier): Modifier { 6 | if (condition) { 7 | return this then other 8 | } 9 | return this 10 | } 11 | -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/ktx/Offset.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.ktx 2 | 3 | import androidx.compose.ui.geometry.Offset 4 | import androidx.compose.ui.unit.IntOffset 5 | import kotlin.math.roundToInt 6 | 7 | fun Offset.toIntOffset(): IntOffset { 8 | return IntOffset(x.roundToInt(), y.roundToInt()) 9 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/launcher/sheets/HiddenItemsSheetVM.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.launcher.sheets 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import androidx.lifecycle.ViewModel 6 | import de.mm20.launcher2.ui.settings.SettingsActivity 7 | 8 | class HiddenItemsSheetVM: ViewModel() { 9 | 10 | fun showHiddenItems(context: Context) { 11 | context.startActivity( 12 | Intent(context, SettingsActivity::class.java).apply { 13 | putExtra(SettingsActivity.EXTRA_ROUTE, "settings/search/hiddenitems") 14 | } 15 | ) 16 | } 17 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/launcher/transitions/EnterHomeTransition.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.launcher.transitions 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.ui.geometry.Offset 5 | import androidx.compose.ui.geometry.Rect 6 | import androidx.compose.ui.unit.IntOffset 7 | import androidx.compose.ui.unit.IntRect 8 | 9 | data class EnterHomeTransition( 10 | val startBounds: IntRect? = null, 11 | val targetBounds: IntRect? = null, 12 | val icon: (@Composable (animVector: IntOffset, progress: () -> Float) -> Unit)? = null 13 | ) -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/launcher/transitions/EnterHomeTransitionParams.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.launcher.transitions 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.runtime.Stable 5 | import androidx.compose.ui.geometry.Offset 6 | import androidx.compose.ui.unit.IntOffset 7 | import androidx.compose.ui.unit.IntRect 8 | 9 | @Stable 10 | data class EnterHomeTransitionParams( 11 | val targetBounds: IntRect, 12 | val icon: (@Composable (animVector: IntOffset, progress: () -> Float) -> Unit)? = null 13 | ) -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/clock/parts/PartProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.launcher.widgets.clock.parts 2 | 3 | import android.content.Context 4 | import androidx.compose.runtime.Composable 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | interface PartProvider { 8 | 9 | fun getRanking(context: Context): Flow 10 | 11 | fun setTime(time: Long) {} 12 | 13 | @Composable 14 | fun Component(compactLayout: Boolean) 15 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/overlays/Overlay.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.overlays 2 | 3 | import androidx.compose.runtime.Composable 4 | import androidx.compose.runtime.DisposableEffect 5 | 6 | @Composable 7 | fun Overlay( 8 | zIndex: Float = LocalZIndex.current + 1f, 9 | overlay: @Composable () -> Unit 10 | ) { 11 | val overlayManager = LocalOverlayManager.current 12 | DisposableEffect(Unit) { 13 | overlayManager.addOverlay(overlay, zIndex) 14 | onDispose { 15 | overlayManager.removeOverlay(overlay) 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/settings/about/AboutSettingsScreenVM.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.settings.about 2 | 3 | import androidx.lifecycle.ViewModel 4 | 5 | class AboutSettingsScreenVM : ViewModel() -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/settings/backup/BackupSettingsScreenVM.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.settings.backup 2 | 3 | import android.net.Uri 4 | import androidx.compose.runtime.mutableStateOf 5 | import androidx.lifecycle.ViewModel 6 | import org.koin.core.component.KoinComponent 7 | 8 | class BackupSettingsScreenVM : ViewModel(), KoinComponent { 9 | 10 | val showBackupSheet = mutableStateOf(false) 11 | 12 | val restoreUri = mutableStateOf(null) 13 | 14 | fun setShowBackupSheet(show: Boolean) { 15 | showBackupSheet.value = show 16 | } 17 | 18 | fun setRestoreUri(uri: Uri?) { 19 | restoreUri.value = uri 20 | } 21 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/settings/integrations/IntegrationsSettingsScreenVM.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.settings.integrations 2 | 3 | import androidx.lifecycle.ViewModel 4 | import de.mm20.launcher2.accounts.AccountType 5 | import de.mm20.launcher2.accounts.AccountsRepository 6 | import org.koin.core.component.KoinComponent 7 | import org.koin.core.component.inject 8 | 9 | class IntegrationsSettingsScreenVM : ViewModel(), KoinComponent { 10 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/theme/ContentAlpha.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.theme 2 | 3 | import androidx.compose.material.ContentAlpha 4 | import androidx.compose.runtime.Composable 5 | 6 | val ContentAlpha.divider: Float 7 | @Composable 8 | get() = 0.12f -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/theme/transparency/TransparencyScheme.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.theme.transparency 2 | 3 | import androidx.compose.runtime.compositionLocalOf 4 | 5 | data class TransparencyScheme( 6 | val background: Float, 7 | val surface: Float, 8 | ) 9 | 10 | val LocalTransparencyScheme = compositionLocalOf { TransparencyScheme(0.85f, 1f) } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/theme/typography/Default.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.theme.typography 2 | 3 | import de.mm20.launcher2.ui.theme.typography.fontfamily.Outfit 4 | 5 | val DefaultTypography = makeTypography(headlineFamily = Outfit) -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/theme/typography/SystemDefault.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.theme.typography 2 | 3 | import android.content.Context 4 | import androidx.compose.material3.Typography 5 | import androidx.compose.ui.text.font.* 6 | import de.mm20.launcher2.ui.theme.typography.fontfamily.getDeviceHeadlineFontFamily 7 | 8 | fun getDeviceDefaultTypography(context: Context): Typography { 9 | return makeTypography(headlineFamily = getDeviceHeadlineFontFamily(context)) 10 | } -------------------------------------------------------------------------------- /app/ui/src/main/java/de/mm20/launcher2/ui/utils/TimeFormat.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ui.utils 2 | 3 | import android.content.Context 4 | import android.text.format.DateFormat 5 | import de.mm20.launcher2.preferences.TimeFormat 6 | import de.mm20.launcher2.preferences.TimeFormat.TwentyFourHour 7 | 8 | fun TimeFormat.isTwentyFourHours(context: Context): Boolean { 9 | return this == TimeFormat.TwentyFourHour || this == TimeFormat.System && DateFormat.is24HourFormat(context) 10 | } -------------------------------------------------------------------------------- /app/ui/src/main/res/values/AspectRatioImageView.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/ui/src/main/res/values/BottomSheet.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/ui/src/main/res/values/LauncherCardView.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/ui/src/main/res/values/SearchGridView.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/ui/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/ui/src/main/res/xml/shortcuts.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /assets/icons/Kvaesitso Nightly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/assets/icons/Kvaesitso Nightly.png -------------------------------------------------------------------------------- /assets/icons/Kvaesitso Plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/assets/icons/Kvaesitso Plugin.png -------------------------------------------------------------------------------- /assets/icons/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/assets/icons/ic_launcher.png -------------------------------------------------------------------------------- /assets/icons/ic_launcher_debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/assets/icons/ic_launcher_debug.png -------------------------------------------------------------------------------- /build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | alias(libs.plugins.kotlin.android) apply false 3 | alias(libs.plugins.kotlin.plugin.serialization) apply false 4 | alias(libs.plugins.ksp) apply false 5 | alias(libs.plugins.android.application) apply false 6 | alias(libs.plugins.android.library) apply false 7 | alias(libs.plugins.dokka) apply true 8 | } -------------------------------------------------------------------------------- /core/base/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/base/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/consumer-rules.pro -------------------------------------------------------------------------------- /core/base/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/debug/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #E5EEFE 4 | -------------------------------------------------------------------------------- /core/base/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Kvaesitso Debug 3 | 4 | -------------------------------------------------------------------------------- /core/base/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2 2 | 3 | import android.content.pm.PackageManager 4 | import de.mm20.launcher2.search.SearchableDeserializer 5 | import de.mm20.launcher2.search.Tag 6 | import de.mm20.launcher2.search.TagDeserializer 7 | import org.koin.android.ext.koin.androidContext 8 | import org.koin.core.qualifier.named 9 | import org.koin.dsl.module 10 | 11 | val baseModule = module { 12 | factory { androidContext().packageManager } 13 | factory(named(Tag.Domain)) { TagDeserializer() } 14 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/Tuples.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2 2 | 3 | data class Quadruple( 4 | val first: A, 5 | val second: B, 6 | val third: C, 7 | val fourth: D 8 | ) 9 | 10 | data class Quintuple( 11 | val first: A, 12 | val second: B, 13 | val third: C, 14 | val fourth: D, 15 | val fifth: E, 16 | ) -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/backup/Backupable.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.backup 2 | 3 | import java.io.File 4 | 5 | interface Backupable { 6 | suspend fun backup(toDir: File) 7 | suspend fun restore(fromDir: File) 8 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLibrary.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.licenses 2 | 3 | import androidx.annotation.RawRes 4 | import androidx.annotation.StringRes 5 | 6 | data class OpenSourceLibrary( 7 | val name: String, 8 | val description: String? = null, 9 | @StringRes val licenseName: Int, 10 | val copyrightNote: String? = null, 11 | @RawRes val licenseText: Int, 12 | val url: String 13 | ) -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/plugin/Plugin.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin 2 | 3 | data class Plugin( 4 | val enabled: Boolean, 5 | val label: String, 6 | val description: String? = null, 7 | val packageName: String, 8 | val className: String, 9 | val type: PluginType, 10 | val authority: String, 11 | ) -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/plugin/PluginPackage.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin 2 | 3 | import android.content.Intent 4 | 5 | 6 | data class PluginPackage( 7 | val packageName: String, 8 | val label: String, 9 | val description: String? = null, 10 | val author: String? = null, 11 | val settings: Intent? = null, 12 | val plugins: List, 13 | val isVerified: Boolean = false, 14 | ) { 15 | val enabled: Boolean = plugins.all { it.enabled } 16 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/plugin/PluginRepository.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin 2 | 3 | import kotlinx.coroutines.Deferred 4 | import kotlinx.coroutines.Job 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | interface PluginRepository { 8 | fun findMany( 9 | type: PluginType? = null, 10 | enabled: Boolean? = null, 11 | packageName: String? = null, 12 | ): Flow> 13 | fun get(authority: String): Flow 14 | 15 | fun insertMany(plugins: List): Job 16 | fun insert(plugin: Plugin): Job 17 | fun update(plugin: Plugin): Job 18 | fun updateMany(plugins: List): Job 19 | fun deleteMany(): Job 20 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/plugin/config/WeatherPluginConfig.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin.config 2 | 3 | import android.os.Bundle 4 | 5 | fun WeatherPluginConfig(bundle: Bundle): WeatherPluginConfig { 6 | return WeatherPluginConfig( 7 | minUpdateInterval = bundle.getLong( 8 | "minUpdateInterval", 9 | 60 * 60 * 1000L 10 | ), 11 | managedLocation = bundle.getBoolean("managedLocation", false) 12 | ) 13 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/search/Article.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search 2 | 3 | import android.content.Context 4 | 5 | interface Article: SavableSearchable { 6 | 7 | val text: String 8 | val imageUrl: String? 9 | val sourceUrl: String 10 | val sourceName: String 11 | 12 | val canShare: Boolean 13 | fun share(context: Context) {} 14 | 15 | override val preferDetailsOverLaunch: Boolean 16 | get() = false 17 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/search/Searchable.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search 2 | 3 | interface Searchable { 4 | val score: ResultScore 5 | get() = ResultScore.Unspecified 6 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/search/SearchableDeserializer.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search 2 | 3 | interface SearchableDeserializer { 4 | suspend fun deserialize(serialized: String): SavableSearchable? 5 | } 6 | 7 | class NullDeserializer: SearchableDeserializer { 8 | override suspend fun deserialize(serialized: String): SavableSearchable? { 9 | return null 10 | } 11 | 12 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/search/SearchableRepository.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search 2 | 3 | import kotlinx.coroutines.flow.Flow 4 | 5 | interface SearchableRepository { 6 | fun search(query: String, allowNetwork: Boolean): Flow> 7 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/search/SearchableSerializer.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search 2 | 3 | interface SearchableSerializer { 4 | fun serialize(searchable: SavableSearchable): String? 5 | val typePrefix: String 6 | } 7 | 8 | class NullSerializer : SearchableSerializer{ 9 | override fun serialize(searchable: SavableSearchable): String? { 10 | return null 11 | } 12 | 13 | override val typePrefix: String 14 | get() = "null" 15 | 16 | } -------------------------------------------------------------------------------- /core/base/src/main/java/de/mm20/launcher2/search/Website.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search 2 | 3 | import android.content.Context 4 | 5 | interface Website: SavableSearchable { 6 | 7 | val url: String 8 | val description: String? 9 | val imageUrl: String? 10 | val faviconUrl: String? 11 | val color: Int? 12 | 13 | override val preferDetailsOverLaunch: Boolean 14 | get() = false 15 | 16 | val canShare: Boolean 17 | fun share(context: Context) {} 18 | } -------------------------------------------------------------------------------- /core/base/src/main/res/drawable-xhdpi/ic_badge_gdrive.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/drawable-xhdpi/ic_badge_gdrive.webp -------------------------------------------------------------------------------- /core/base/src/main/res/drawable-xxhdpi/ic_badge_gdrive.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/drawable-xxhdpi/ic_badge_gdrive.webp -------------------------------------------------------------------------------- /core/base/src/main/res/drawable-xxxhdpi/ic_badge_gdrive.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/drawable-xxxhdpi/ic_badge_gdrive.webp -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_archive.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_backup.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_code.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_document.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_folder.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_generic.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_music.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_picture.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_presentation.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/main/res/drawable/ic_file_spreadsheet.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_100.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_100.otf -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_200.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_200.otf -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_300.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_300.otf -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_400.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_400.otf -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_500.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_500.otf -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_600.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_600.otf -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_700.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_700.otf -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_800.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_800.otf -------------------------------------------------------------------------------- /core/base/src/main/res/font/outfit_900.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/font/outfit_900.otf -------------------------------------------------------------------------------- /core/base/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/main/res/values-night/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/base/src/main/res/values-w264dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 2 4 | -------------------------------------------------------------------------------- /core/base/src/main/res/values-w348dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 3 4 | -------------------------------------------------------------------------------- /core/base/src/main/res/values-w400dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | -------------------------------------------------------------------------------- /core/base/src/main/res/values-w480dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 4 | -------------------------------------------------------------------------------- /core/base/src/main/res/values-w504dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | -------------------------------------------------------------------------------- /core/base/src/main/res/values-w600dp/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 4 | -------------------------------------------------------------------------------- /core/base/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/base/src/main/res/values/color-schemes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /core/base/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #04327D 4 | -------------------------------------------------------------------------------- /core/base/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1 4 | -------------------------------------------------------------------------------- /core/base/src/main/res/values/licenses.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MIT license 4 | Simplified BSD license 5 | Modified BSD license 6 | Apache license 2.0 7 | GNU General Public License Version 3 8 | SIL OPEN FONT LICENSE 9 | -------------------------------------------------------------------------------- /core/base/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Kvaesitso 3 | 4 | -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/base/src/nightly/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /core/base/src/nightly/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Kvaesitso Nightly 3 | 4 | -------------------------------------------------------------------------------- /core/compat/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/compat/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/compat/consumer-rules.pro -------------------------------------------------------------------------------- /core/compat/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core/crashreporter/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/crashreporter/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/crashreporter/consumer-rules.pro -------------------------------------------------------------------------------- /core/crashreporter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /core/crashreporter/src/main/java/com/balsikandar/crashreporter/utils/Constants.java: -------------------------------------------------------------------------------- 1 | package com.balsikandar.crashreporter.utils; 2 | 3 | /** 4 | * Created by bali on 15/08/17. 5 | */ 6 | 7 | public class Constants { 8 | public static final String EXCEPTION_SUFFIX = "_exception"; 9 | public static final String CRASH_SUFFIX = "_crash"; 10 | public static final String FILE_EXTENSION = ".txt"; 11 | public static final String CRASH_REPORT_DIR = "crashReports"; 12 | public static final int NOTIFICATION_ID = 1; 13 | public static final String CHANNEL_NOTIFICATION_ID = "crashreporter_channel_id"; 14 | public static final String LANDING = "landing"; 15 | } 16 | -------------------------------------------------------------------------------- /core/crashreporter/src/main/java/com/balsikandar/crashreporter/utils/CrashReporterExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.balsikandar.crashreporter.utils; 2 | 3 | public class CrashReporterExceptionHandler implements Thread.UncaughtExceptionHandler { 4 | 5 | private Thread.UncaughtExceptionHandler exceptionHandler; 6 | 7 | public CrashReporterExceptionHandler() { 8 | this.exceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); 9 | } 10 | 11 | @Override 12 | public void uncaughtException(Thread thread, Throwable throwable) { 13 | 14 | CrashUtil.saveCrashReport(throwable); 15 | 16 | exceptionHandler.uncaughtException(thread, throwable); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /core/crashreporter/src/main/java/com/balsikandar/crashreporter/utils/SimplePageChangeListener.java: -------------------------------------------------------------------------------- 1 | package com.balsikandar.crashreporter.utils; 2 | 3 | 4 | import androidx.viewpager.widget.ViewPager; 5 | 6 | /** 7 | * Created by bali on 11/08/17. 8 | */ 9 | 10 | public abstract class SimplePageChangeListener implements ViewPager.OnPageChangeListener { 11 | @Override 12 | public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 13 | @Override 14 | public abstract void onPageSelected(int position); 15 | @Override 16 | public void onPageScrollStateChanged(int state) {} 17 | } 18 | -------------------------------------------------------------------------------- /core/crashreporter/src/main/res/drawable/ic_warning_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /core/crashreporter/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #cf1162 4 | -------------------------------------------------------------------------------- /core/crashreporter/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | View Crash Report 3 | Crash Reporter notifications 4 | Check your crashes and exceptions here. 5 | OK 6 | 7 | -------------------------------------------------------------------------------- /core/crashreporter/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core/devicepose/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/devicepose/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/devicepose/consumer-rules.pro -------------------------------------------------------------------------------- /core/devicepose/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /core/devicepose/src/main/java/de/mm20/launcher2/devicepose/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.devicepose 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val devicePoseModule = module { 7 | single { DevicePoseProvider(androidContext()) } 8 | } -------------------------------------------------------------------------------- /core/i18n/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/i18n/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/i18n/consumer-rules.pro -------------------------------------------------------------------------------- /core/i18n/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-arq/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-arq/units.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-az/units.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-de/defaults.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-en-rUS/defaults.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-eo/units.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-fr/defaults.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-ia/units.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-ms/units.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values-vi/units.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mét 5 | 6 | -------------------------------------------------------------------------------- /core/i18n/src/main/res/values/defaults.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | false 4 | -------------------------------------------------------------------------------- /core/ktx/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/ktx/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/ktx/consumer-rules.pro -------------------------------------------------------------------------------- /core/ktx/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Address.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.location.Address 4 | 5 | fun Address.formatToString( 6 | ): String { 7 | val sb = StringBuilder() 8 | if (locality != null) sb.append(locality).append(", ") 9 | if (countryCode != null) sb.append(countryCode) 10 | return sb.toString() 11 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Boolean.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | inline fun Boolean.toInt(): Int { 4 | return if (this) 1 else 0 5 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Double.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import kotlin.math.ceil 4 | 5 | fun Double.ceilToInt(): Int { 6 | return ceil(this).toInt() 7 | } 8 | -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Float.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import kotlin.math.PI 4 | import kotlin.math.ceil 5 | 6 | fun Float.ceilToInt(): Int { 7 | return ceil(this).toInt() 8 | } 9 | 10 | private const val TWO_PI_F = (2.0 * PI).toFloat() 11 | val Float.Companion.TWO_PI: Float 12 | get() = TWO_PI_F 13 | 14 | private const val PI_F = PI.toFloat() 15 | val Float.Companion.PI: Float 16 | get() = PI_F 17 | -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/InputStream.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.graphics.Bitmap 4 | import android.graphics.BitmapFactory 5 | import java.io.InputStream 6 | 7 | fun InputStream.asBitmap(options : BitmapFactory.Options? = null): Bitmap? { 8 | return BitmapFactory.decodeStream(this, null, options) 9 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Int.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import androidx.core.graphics.ColorUtils 4 | import androidx.core.graphics.blue 5 | import androidx.core.graphics.green 6 | import androidx.core.graphics.red 7 | 8 | fun Int.isBrightColor(): Boolean { 9 | val darkness = 1 - (0.299 * red + 0.587 * green + 0.114 * blue) / 255 10 | return darkness < 0.5 11 | } 12 | 13 | val Int.sat : Float 14 | get() { 15 | FloatArray(3).also { 16 | ColorUtils.RGBToHSL(red, green, blue, it) 17 | return it[1] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Json.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import kotlinx.serialization.SerializationException 4 | import kotlinx.serialization.json.Json 5 | 6 | inline fun Json.decodeFromStringOrNull(json: String?): T? { 7 | if (json == null) return null 8 | return try { 9 | decodeFromString(json) 10 | } catch (e: SerializationException) { 11 | null 12 | } 13 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/LayerDrawable.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.graphics.drawable.Drawable 4 | import android.graphics.drawable.LayerDrawable 5 | 6 | fun LayerDrawable.getDrawableOrNull(index: Int): Drawable? { 7 | return try { 8 | this.getDrawable(index) 9 | } catch (e: IndexOutOfBoundsException) { 10 | return null 11 | } 12 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Notification.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.app.Notification 4 | import android.content.Context 5 | import android.graphics.drawable.Drawable 6 | 7 | fun Notification.getBadgeIcon(context: Context, packageName: String): Drawable? { 8 | return smallIcon.loadDrawable(context) 9 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Nullable.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | inline fun T?.or(block: () -> T?): T? = this ?: block() 4 | -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Pair.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | fun Pair.map(transform: (A) -> B): Pair = transform(first) to transform(second) 4 | 5 | fun Pair.into(transform: (A, B) -> C): C = transform(first, second) 6 | -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/PendingIntent.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.app.ActivityOptions 4 | import android.app.PendingIntent 5 | import android.content.Context 6 | 7 | fun PendingIntent.sendWithBackgroundPermission(context: Context) { 8 | if (isAtLeastApiLevel(34)) { 9 | val options = ActivityOptions.makeBasic() 10 | .setPendingIntentBackgroundActivityStartMode( 11 | ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED 12 | ) 13 | .toBundle() 14 | send(context, 0, null, null, null, null, options) 15 | } else { 16 | send(context, 0, null) 17 | } 18 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Rect.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.graphics.Rect 4 | import android.graphics.RectF 5 | 6 | fun Rect.translate(x: Int, y: Int): Rect { 7 | top += y 8 | bottom += y 9 | left += x 10 | right += x 11 | return this 12 | } 13 | 14 | fun Rect.toRectF(other: RectF) { 15 | other.left = left.toFloat() 16 | other.bottom = bottom.toFloat() 17 | other.right = right.toFloat() 18 | other.top = top.toFloat() 19 | } 20 | -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/RectF.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.graphics.RectF 4 | 5 | fun RectF.scale(factor: Float) { 6 | val newWidth = width() * factor 7 | val newHeight = height() * factor 8 | bottom += newHeight - height() 9 | right += newWidth - width() 10 | } 11 | 12 | fun RectF.translate(x: Float, y: Float): RectF { 13 | top += y 14 | bottom += y 15 | left += x 16 | right += x 17 | return this 18 | } 19 | 20 | infix fun RectF.copyTo(other: RectF) { 21 | other.top = top 22 | other.left = left 23 | other.right = right 24 | other.bottom = bottom 25 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/Result.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | inline fun Result.orRunCatching(block: () -> T): Result = this.fold( 4 | onSuccess = { this }, 5 | onFailure = { runCatching { block() } } 6 | ) 7 | -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/SharedPreferences.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.content.SharedPreferences 4 | 5 | fun SharedPreferences.Editor.putDouble(key: String, value: Double) { 6 | putLong(key, value.toBits()) 7 | } 8 | 9 | fun SharedPreferences.getDouble(key: String): Double? { 10 | if (contains(key)) return Double.fromBits(getLong(key, 0)) 11 | return null 12 | } 13 | 14 | fun SharedPreferences.getDouble(key: String, defValue: Double): Double { 15 | if (contains(key)) return Double.fromBits(getLong(key, 0)) 16 | return defValue 17 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/TextView.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.graphics.drawable.Drawable 4 | import android.widget.TextView 5 | import androidx.annotation.DrawableRes 6 | 7 | fun TextView.setStartCompoundDrawable(drawable: Drawable?) { 8 | setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null) 9 | } 10 | 11 | fun TextView.setStartCompoundDrawable(@DrawableRes drawableRes: Int) { 12 | setCompoundDrawablesRelativeWithIntrinsicBounds(drawableRes, 0, 0, 0) 13 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/UUID.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import java.nio.ByteBuffer 4 | import java.util.UUID 5 | 6 | fun UUID.toBytes(): ByteArray { 7 | val bytes = ByteArray(16) 8 | val buffer = ByteBuffer.wrap(bytes) 9 | buffer.putLong(mostSignificantBits) 10 | buffer.putLong(leastSignificantBits) 11 | return buffer.array() 12 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/UserHandle.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.content.Context 4 | import android.os.Process 5 | import android.os.UserHandle 6 | import android.os.UserManager 7 | 8 | fun UserHandle.getSerialNumber(context: Context): Long { 9 | val userManager = context.getSystemService(Context.USER_SERVICE) as UserManager 10 | return userManager.getSerialNumberForUser(this) 11 | } -------------------------------------------------------------------------------- /core/ktx/src/main/java/de/mm20/launcher2/ktx/XmlPullParser.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.ktx 2 | 3 | import android.util.Log 4 | import org.xmlpull.v1.XmlPullParser 5 | 6 | fun XmlPullParser.skipToNextTag(): Boolean { 7 | while (next() != XmlPullParser.END_DOCUMENT) { 8 | if (eventType == XmlPullParser.START_TAG) { 9 | return true 10 | } 11 | } 12 | return false 13 | } -------------------------------------------------------------------------------- /core/permissions/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/permissions/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/permissions/consumer-rules.pro -------------------------------------------------------------------------------- /core/permissions/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core/permissions/src/main/java/de/mm20/launcher2/permissions/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.permissions 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val permissionsModule = module { 7 | single { PermissionsManagerImpl(androidContext()) } 8 | } -------------------------------------------------------------------------------- /core/preferences/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/preferences/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -keepclassmembers class de.mm20.launcher2.preferences.LegacySettings { 2 | ; 3 | } 4 | 5 | -keepclassmembers class de.mm20.launcher2.preferences.LegacySettings$* { 6 | ; 7 | } 8 | -------------------------------------------------------------------------------- /core/preferences/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /core/preferences/src/main/java/de/mm20/launcher2/preferences/LegacyDataStore.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.preferences 2 | 3 | internal const val SchemaVersion = 18 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/preferences/src/main/java/de/mm20/launcher2/preferences/search/CalculatorSearchSettings.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.preferences.search 2 | 3 | import de.mm20.launcher2.preferences.LauncherDataStore 4 | import kotlinx.coroutines.flow.distinctUntilChanged 5 | import kotlinx.coroutines.flow.map 6 | 7 | class CalculatorSearchSettings internal constructor( 8 | private val dataStore: LauncherDataStore, 9 | ){ 10 | val enabled 11 | get() = dataStore.data.map { it.calculatorEnabled }.distinctUntilChanged() 12 | 13 | fun setEnabled(enabled: Boolean) { 14 | dataStore.update { 15 | it.copy(calculatorEnabled = enabled) 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /core/preferences/src/main/java/de/mm20/launcher2/preferences/search/ShortcutSearchSettings.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.preferences.search 2 | 3 | import de.mm20.launcher2.preferences.LauncherDataStore 4 | import kotlinx.coroutines.flow.distinctUntilChanged 5 | import kotlinx.coroutines.flow.map 6 | 7 | class ShortcutSearchSettings internal constructor( 8 | private val dataStore: LauncherDataStore 9 | ) { 10 | val enabled 11 | get() = dataStore.data.map { it.shortcutSearchEnabled }.distinctUntilChanged() 12 | 13 | fun setEnabled(enabled: Boolean) { 14 | dataStore.update { 15 | it.copy(shortcutSearchEnabled = enabled) 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /core/preferences/src/main/java/de/mm20/launcher2/preferences/search/WebsiteSearchSettings.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.preferences.search 2 | 3 | import de.mm20.launcher2.preferences.LauncherDataStore 4 | import kotlinx.coroutines.flow.map 5 | 6 | class WebsiteSearchSettings internal constructor( 7 | private val dataStore: LauncherDataStore, 8 | ){ 9 | val enabled 10 | get() = dataStore.data.map { it.websiteSearchEnabled } 11 | 12 | fun setEnabled(enabled: Boolean) { 13 | dataStore.update { 14 | it.copy(websiteSearchEnabled = enabled) 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /core/profiles/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/profiles/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/core/profiles/consumer-rules.pro -------------------------------------------------------------------------------- /core/profiles/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core/profiles/src/main/java/de/mm20/launcher2/profiles/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.profiles 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val profilesModule = module { 7 | single { ProfileManager(androidContext(), get()) } 8 | } -------------------------------------------------------------------------------- /core/shared/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/shared/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -keepclassmembers class de.mm20.launcher2.preferences.Settings { 2 | ; 3 | } 4 | 5 | -keepclassmembers class de.mm20.launcher2.preferences.Settings$* { 6 | ; 7 | } 8 | -------------------------------------------------------------------------------- /core/shared/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/plugin/PluginType.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin 2 | 3 | enum class PluginType { 4 | FileSearch, 5 | Weather, 6 | LocationSearch, 7 | Calendar, 8 | ContactSearch, 9 | } -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/plugin/config/QueryPluginConfig.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin.config 2 | 3 | data class QueryPluginConfig( 4 | /** 5 | * Strategy to store items from this provider in the launcher database 6 | * @see [StorageStrategy] 7 | */ 8 | val storageStrategy: StorageStrategy = StorageStrategy.StoreCopy, 9 | ) -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/plugin/config/WeatherPluginConfig.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin.config 2 | 3 | data class WeatherPluginConfig( 4 | /** 5 | * Minimum time (in ms) that needs to pass before the provider can be queried again. 6 | * Note that updates can be triggered sooner if the user manually changes their location 7 | * or weather provider. 8 | */ 9 | val minUpdateInterval: Long = 60 * 60 * 1000L, 10 | /** 11 | * Whether the location is managed by the plugin. If true, the user cannot change the location 12 | * in the launcher settings. 13 | */ 14 | val managedLocation: Boolean = false, 15 | ) -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/plugin/contracts/PluginContract.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin.contracts 2 | 3 | object PluginContract { 4 | object Methods { 5 | const val GetType = "getType" 6 | const val GetState = "getState" 7 | const val GetConfig = "getConfig" 8 | } 9 | } -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/plugin/data/Bundle.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugin.data 2 | 3 | import android.os.Bundle 4 | import de.mm20.launcher2.plugin.contracts.Column 5 | 6 | operator fun Bundle.get(column: Column): T? { 7 | return with(column) { 8 | if (!containsKey(column.name)) return null 9 | get() 10 | } 11 | } 12 | 13 | operator fun Bundle.set(column: Column, value: T?) { 14 | with(column) { 15 | put(value) 16 | } 17 | } -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/search/calendar/CalendarListType.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search.calendar 2 | 3 | enum class CalendarListType { 4 | Calendar, 5 | Tasks, 6 | } 7 | -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/search/calendar/CalendarQuery.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search.calendar 2 | 3 | data class CalendarQuery( 4 | val query: String?, 5 | val start: Long?, 6 | val end: Long?, 7 | /** 8 | * List of calendar list ids that should be excluded from the search results. 9 | */ 10 | val excludedCalendars: List, 11 | ) -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/search/location/Attribution.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search.location 2 | 3 | import android.net.Uri 4 | import de.mm20.launcher2.serialization.UriSerializer 5 | import kotlinx.serialization.Serializable 6 | 7 | @Serializable 8 | data class Attribution( 9 | val text: String? = null, 10 | @Serializable(with = UriSerializer::class) 11 | val iconUrl: Uri? = null, 12 | val url: String? = null, 13 | ) -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/search/location/PaymentMethod.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search.location 2 | 3 | enum class PaymentMethod { 4 | Cash, 5 | Card 6 | } -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/serialization/Json.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.serialization 2 | 3 | /** 4 | * Default Json serializer configurations 5 | */ 6 | object Json { 7 | /** 8 | * A Json serializer configuration that aims to be as forgiving as possible. 9 | * Suitable for external data sources, and legacy data that may not be fully compliant with the current schema. 10 | */ 11 | val Lenient = kotlinx.serialization.json.Json { 12 | ignoreUnknownKeys = true 13 | explicitNulls = false 14 | isLenient = true 15 | coerceInputValues = true 16 | } 17 | } -------------------------------------------------------------------------------- /core/shared/src/main/java/de/mm20/launcher2/weather/WeatherIcon.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.weather 2 | 3 | enum class WeatherIcon(val id: Int) { 4 | Unknown(-1), 5 | Clear(0), 6 | Cloudy(1), 7 | Cold(2), 8 | Drizzle(3), 9 | Haze(4), 10 | Fog(5), 11 | Hail(6), 12 | HeavyThunderstorm(7), 13 | HeavyThunderstormWithRain(8), 14 | Hot(9), 15 | MostlyCloudy(10), 16 | PartlyCloudy(11), 17 | Showers(12), 18 | Sleet(13), 19 | Snow(14), 20 | Storm(15), 21 | Thunderstorm(16), 22 | ThunderstormWithRain(17), 23 | Wind(18), 24 | BrokenClouds(19), 25 | } -------------------------------------------------------------------------------- /data/applications/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/applications/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/applications/consumer-rules.pro -------------------------------------------------------------------------------- /data/applications/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /data/appshortcuts/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/appshortcuts/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/appshortcuts/consumer-rules.pro -------------------------------------------------------------------------------- /data/appshortcuts/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/AppShortcut.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.appshortcuts 2 | 3 | import android.content.Context 4 | import android.content.Intent 5 | import de.mm20.launcher2.search.AppShortcut 6 | 7 | 8 | fun AppShortcut(context: Context, pinRequestIntent: Intent): AppShortcut? { 9 | return LauncherShortcut.fromPinRequestIntent(context, pinRequestIntent) 10 | ?: LegacyShortcut.fromPinRequestIntent(context, pinRequestIntent) 11 | } -------------------------------------------------------------------------------- /data/calculator/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/calculator/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/calculator/consumer-rules.pro -------------------------------------------------------------------------------- /data/calculator/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /data/calculator/src/main/java/de/mm20/launcher2/calculator/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.calculator 2 | 3 | import org.koin.dsl.module 4 | 5 | val calculatorModule = module { 6 | single { CalculatorRepositoryImpl(get()) } 7 | } -------------------------------------------------------------------------------- /data/calendar/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/calendar/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/calendar/consumer-rules.pro -------------------------------------------------------------------------------- /data/calendar/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/calendar/src/main/java/de/mm20/launcher2/calendar/providers/CalendarList.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.calendar.providers 2 | 3 | import de.mm20.launcher2.search.calendar.CalendarListType 4 | 5 | data class CalendarList( 6 | val id: String, 7 | val name: String, 8 | val owner: String?, 9 | val color: Int, 10 | val types: List, 11 | val providerId: String, 12 | ) -------------------------------------------------------------------------------- /data/calendar/src/main/java/de/mm20/launcher2/calendar/providers/CalendarProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.calendar.providers 2 | 3 | import de.mm20.launcher2.search.CalendarEvent 4 | 5 | internal interface CalendarProvider { 6 | suspend fun search( 7 | query: String? = null, 8 | from: Long = System.currentTimeMillis(), 9 | to: Long = from + 14 * 24 * 60 * 60 * 1000L, 10 | excludedCalendars: List = emptyList(), 11 | excludeAllDayEvents: Boolean = false, 12 | allowNetwork: Boolean = false, 13 | ): List 14 | 15 | suspend fun getCalendarLists(): List 16 | 17 | val namespace: String 18 | } -------------------------------------------------------------------------------- /data/contacts/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/contacts/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/contacts/consumer-rules.pro -------------------------------------------------------------------------------- /data/contacts/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /data/contacts/src/main/java/de/mm20/launcher2/contacts/providers/ContactProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.contacts.providers 2 | 3 | import de.mm20.launcher2.search.Contact 4 | 5 | internal interface ContactProvider { 6 | suspend fun search(query: String, allowNetwork: Boolean): List 7 | } -------------------------------------------------------------------------------- /data/currencies/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/currencies/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/currencies/consumer-rules.pro -------------------------------------------------------------------------------- /data/currencies/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /data/currencies/src/main/java/de/mm20/launcher2/currencies/Currency.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.currencies 2 | 3 | import de.mm20.launcher2.database.entities.CurrencyEntity 4 | 5 | data class Currency( 6 | val symbol: String, 7 | val value: Double, 8 | val lastUpdate: Long 9 | ) { 10 | constructor(entity: CurrencyEntity) : this( 11 | symbol = entity.symbol, 12 | value = entity.value, 13 | lastUpdate = entity.lastUpdate 14 | ) 15 | 16 | fun toDatabaseEntity(): CurrencyEntity { 17 | return CurrencyEntity(symbol, value, lastUpdate) 18 | } 19 | } -------------------------------------------------------------------------------- /data/customattrs/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/customattrs/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/customattrs/consumer-rules.pro -------------------------------------------------------------------------------- /data/customattrs/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/customattrs/src/main/java/de/mm20/launcher2/data/customattrs/CustomAttributeType.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.data.customattrs 2 | 3 | enum class CustomAttributeType(val value: String) { 4 | Icon("icon"), 5 | Label("label"), 6 | Tag("tag"); 7 | 8 | companion object { 9 | internal fun fromValue(value: String): CustomAttributeType { 10 | return values().first { it.value == value } 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /data/customattrs/src/main/java/de/mm20/launcher2/data/customattrs/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.data.customattrs 2 | 3 | import de.mm20.launcher2.backup.Backupable 4 | import org.koin.core.qualifier.named 5 | import org.koin.dsl.module 6 | 7 | val customAttrsModule = module { 8 | factory(named()) { CustomAttributesRepositoryImpl(get(), get()) } 9 | factory { CustomAttributesRepositoryImpl(get(), get()) } 10 | } -------------------------------------------------------------------------------- /data/database/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/database/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/database/consumer-rules.pro -------------------------------------------------------------------------------- /data/database/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database 2 | import org.koin.dsl.module 3 | 4 | val databaseModule = module { 5 | single { AppDatabase.getInstance(get()) } 6 | } -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/entities/CurrencyEntity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity(tableName = "Currency") 7 | data class CurrencyEntity( 8 | @PrimaryKey val symbol: String, 9 | val value: Double, 10 | val lastUpdate: Long 11 | ) -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/entities/CustomAttributeEntity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity(tableName = "CustomAttributes") 7 | data class CustomAttributeEntity( 8 | val key: String, 9 | val type: String, 10 | val value: String, 11 | @PrimaryKey(autoGenerate = true) val id: Int? = null, 12 | ) -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/entities/IconEntity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity(tableName = "Icons") 7 | data class IconEntity( 8 | val type: String, 9 | val packageName: String? = null, 10 | val activityName: String? = null, 11 | val drawable: String?, 12 | val extras: String? = null, 13 | val iconPack: String, 14 | val name: String? = null, 15 | val themed: Boolean = false, 16 | @PrimaryKey(autoGenerate = true) val id : Long? = null 17 | ) -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/entities/IconPackEntity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity(tableName = "IconPack") 7 | data class IconPackEntity( 8 | val name: String, 9 | @PrimaryKey val packageName: String, 10 | val version: String, 11 | var scale: Float = 1f, 12 | val themed: Boolean = false, 13 | ) -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/entities/PluginEntity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity(tableName = "Plugins") 7 | data class PluginEntity( 8 | @PrimaryKey val authority: String, 9 | val label: String, 10 | val description: String?, 11 | val packageName: String, 12 | val className: String, 13 | val type: String, 14 | val settingsActivity: String?, 15 | val enabled: Boolean, 16 | ) -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/entities/SearchActionEntity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity(tableName = "SearchAction") 7 | data class SearchActionEntity( 8 | @PrimaryKey val position: Int, 9 | val type: String, 10 | val data: String? = null, 11 | val label: String? = null, 12 | val icon: Int? = null, 13 | val color: Int? = null, 14 | val customIcon: String? = null, 15 | val options: String? = null, 16 | ) -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/entities/WebsearchEntity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | 6 | @Entity(tableName = "Websearch") 7 | data class WebsearchEntity( 8 | var urlTemplate: String, 9 | var label: String, 10 | var color: Int, 11 | var icon: String?, 12 | var encoding: Int?, 13 | @PrimaryKey(autoGenerate = true) val id: Long? 14 | ) -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/entities/WidgetEntity.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.entities 2 | 3 | import androidx.room.Entity 4 | import androidx.room.PrimaryKey 5 | import java.util.UUID 6 | 7 | 8 | @Entity(tableName = "Widget") 9 | data class WidgetEntity( 10 | val type: String, 11 | var config: String?, 12 | var position: Int, 13 | @PrimaryKey val id: UUID, 14 | val parentId: UUID? = null, 15 | ) 16 | 17 | /** 18 | * Partial entity for updating and deleting 19 | */ 20 | data class PartialWidgetEntity( 21 | val type: String, 22 | var config: String?, 23 | @PrimaryKey val id: UUID, 24 | ) -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/migrations/Migration_11_12.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.migrations 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | class Migration_11_12 : Migration(11, 12) { 7 | override fun migrate(database: SupportSQLiteDatabase) { 8 | database.execSQL("CREATE TABLE IF NOT EXISTS `Currency` (`symbol` TEXT NOT NULL, `value` REAL NOT NULL, `lastUpdate` INTEGER NOT NULL, PRIMARY KEY(`symbol`))") 9 | } 10 | } -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/migrations/Migration_12_13.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.migrations 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | class Migration_12_13 : Migration(12, 13) { 7 | override fun migrate(database: SupportSQLiteDatabase) { 8 | database.execSQL("CREATE TABLE IF NOT EXISTS `Plugin` (`packageName` TEXT NOT NULL, `data` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`packageName`, `data`))") 9 | } 10 | } -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/migrations/Migration_13_14.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.migrations 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | class Migration_13_14 : Migration(13, 14) { 7 | override fun migrate(database: SupportSQLiteDatabase) { 8 | database.execSQL("DROP TABLE IF EXISTS `Plugins`;") 9 | } 10 | } -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/migrations/Migration_14_15.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.migrations 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | class Migration_14_15 : Migration(14, 15) { 7 | override fun migrate(database: SupportSQLiteDatabase) { 8 | } 9 | } -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/migrations/Migration_16_17.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.migrations 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | class Migration_16_17 : Migration(16, 17) { 7 | override fun migrate(database: SupportSQLiteDatabase) { 8 | database.execSQL("ALTER TABLE Websearch ADD COLUMN encoding INTEGER") 9 | } 10 | } -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/migrations/Migration_24_25.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.migrations 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | import org.koin.core.component.KoinComponent 6 | 7 | class Migration_24_25 : Migration(24, 25), KoinComponent { 8 | 9 | override fun migrate(database: SupportSQLiteDatabase) { 10 | // removed 11 | } 12 | } -------------------------------------------------------------------------------- /data/database/src/main/java/de/mm20/launcher2/database/migrations/Migration_9_10.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.database.migrations 2 | 3 | import androidx.room.migration.Migration 4 | import androidx.sqlite.db.SupportSQLiteDatabase 5 | 6 | class Migration_9_10 : Migration(9, 10) { 7 | override fun migrate(database: SupportSQLiteDatabase) { 8 | database.execSQL("CREATE TABLE IF NOT EXISTS `Plugins` (`packageName` TEXT NOT NULL, `label` TEXT NOT NULL, `description` TEXT NOT NULL, `pluginClassName` TEXT NOT NULL, `enabled` INTEGER NOT NULL, PRIMARY KEY(`packageName`) );") 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /data/files/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/files/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/files/consumer-rules.pro -------------------------------------------------------------------------------- /data/files/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /data/files/src/main/java/de/mm20/launcher2/files/providers/DeferredFile.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.files.providers 2 | 3 | import de.mm20.launcher2.search.File 4 | import de.mm20.launcher2.search.SavableSearchable 5 | import de.mm20.launcher2.search.UpdatableSearchable 6 | import de.mm20.launcher2.search.UpdateResult 7 | 8 | class DeferredFile( 9 | cachedFile: File, 10 | override val timestamp: Long, 11 | override var updatedSelf: (suspend (SavableSearchable) -> UpdateResult)? = null, 12 | ) : File by cachedFile, UpdatableSearchable -------------------------------------------------------------------------------- /data/files/src/main/java/de/mm20/launcher2/files/providers/FileProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.files.providers 2 | 3 | import de.mm20.launcher2.search.File 4 | 5 | internal interface FileProvider { 6 | suspend fun search(query: String, allowNetwork: Boolean): List 7 | } -------------------------------------------------------------------------------- /data/locations/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/locations/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class de.mm20.launcher2.locations.** { *; } 2 | -keep class kotlin.coroutines.Continuation -------------------------------------------------------------------------------- /data/locations/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/locations/src/main/java/de/mm20/launcher2/locations/providers/LocationProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.locations.providers 2 | 3 | import de.mm20.launcher2.search.Location 4 | import de.mm20.launcher2.search.UpdateResult 5 | 6 | internal typealias AndroidLocation = android.location.Location 7 | 8 | internal interface LocationProvider { 9 | suspend fun search( 10 | query: String, 11 | userLocation: AndroidLocation, 12 | allowNetwork: Boolean, 13 | searchRadiusMeters: Int, 14 | hideUncategorized: Boolean 15 | ): List 16 | } -------------------------------------------------------------------------------- /data/notifications/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/notifications/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/notifications/consumer-rules.pro -------------------------------------------------------------------------------- /data/notifications/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /data/notifications/src/main/java/de/mm20/launcher2/notifications/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.notifications 2 | 3 | import org.koin.dsl.module 4 | 5 | val notificationsModule = module { 6 | single { NotificationRepository() } 7 | } -------------------------------------------------------------------------------- /data/plugins/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/plugins/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/plugins/consumer-rules.pro -------------------------------------------------------------------------------- /data/plugins/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/plugins/src/main/java/de/mm20/launcher2/data/plugins/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.data.plugins 2 | 3 | import de.mm20.launcher2.database.AppDatabase 4 | import de.mm20.launcher2.plugin.PluginRepository 5 | import org.koin.dsl.module 6 | 7 | val dataPluginsModule = module { 8 | factory { PluginRepositoryImpl(get().pluginDao()) } 9 | } -------------------------------------------------------------------------------- /data/search-actions/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/search-actions/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/search-actions/consumer-rules.pro -------------------------------------------------------------------------------- /data/search-actions/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /data/search-actions/src/main/java/de/mm20/launcher2/searchactions/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.searchactions 2 | 3 | import de.mm20.launcher2.backup.Backupable 4 | import org.koin.android.ext.koin.androidContext 5 | import org.koin.core.qualifier.named 6 | import org.koin.dsl.module 7 | 8 | val searchActionsModule = module { 9 | factory(named()) { SearchActionRepositoryImpl(androidContext(), get()) } 10 | factory { SearchActionRepositoryImpl(androidContext(), get()) } 11 | single { SearchActionServiceImpl(androidContext(), get(), TextClassifierImpl()) } 12 | } -------------------------------------------------------------------------------- /data/search-actions/src/main/java/de/mm20/launcher2/searchactions/builders/CustomizableSearchActionBuilder.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.searchactions.builders 2 | 3 | sealed interface CustomizableSearchActionBuilder: SearchActionBuilder -------------------------------------------------------------------------------- /data/searchable/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/searchable/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/searchable/consumer-rules.pro -------------------------------------------------------------------------------- /data/searchable/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/searchable/src/main/java/de/mm20/launcher2/searchable/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.searchable 2 | 3 | import de.mm20.launcher2.backup.Backupable 4 | import de.mm20.launcher2.search.SearchableDeserializer 5 | import de.mm20.launcher2.search.Tag 6 | import org.koin.core.qualifier.named 7 | import org.koin.dsl.module 8 | 9 | val searchableModule = module { 10 | factory (named()) { SavableSearchableRepositoryImpl( 11 | get(), 12 | get() 13 | ) } 14 | factory { SavableSearchableRepositoryImpl(get(), get()) } 15 | } -------------------------------------------------------------------------------- /data/searchable/src/main/java/de/mm20/launcher2/searchable/PinnedLevel.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.searchable 2 | 3 | enum class PinnedLevel { 4 | NotPinned, 5 | FrequentlyUsed, 6 | AutomaticallySorted, 7 | ManuallySorted, 8 | } -------------------------------------------------------------------------------- /data/searchable/src/main/java/de/mm20/launcher2/searchable/SavedSearchableRankInfo.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.searchable 2 | 3 | data class SavedSearchableRankInfo( 4 | val key: String, 5 | val type: String, 6 | var launchCount: Int 7 | ) -------------------------------------------------------------------------------- /data/searchable/src/main/java/de/mm20/launcher2/searchable/Serialization.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.searchable 2 | 3 | import de.mm20.launcher2.search.SavableSearchable 4 | 5 | internal fun SavableSearchable.serialize(): String? { 6 | val serializer = getSerializer() 7 | return serializer.serialize(this) 8 | } 9 | -------------------------------------------------------------------------------- /data/themes/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/themes/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/themes/consumer-rules.pro -------------------------------------------------------------------------------- /data/themes/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/themes/src/main/java/de/mm20/launcher2/themes/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.themes 2 | 3 | import de.mm20.launcher2.backup.Backupable 4 | import org.koin.core.qualifier.named 5 | import org.koin.dsl.module 6 | 7 | val themesModule = module { 8 | factory(named()) { ThemeRepository(get(), get()) } 9 | factory { ThemeRepository(get(), get()) } 10 | } -------------------------------------------------------------------------------- /data/unitconverter/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/unitconverter/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/unitconverter/consumer-rules.pro -------------------------------------------------------------------------------- /data/unitconverter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /data/unitconverter/src/main/java/de/mm20/launcher2/search/data/CurrencyUnitConverter.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search.data 2 | 3 | import de.mm20.launcher2.unitconverter.Dimension 4 | import de.mm20.launcher2.unitconverter.UnitValue 5 | 6 | class CurrencyUnitConverter(dimension: Dimension, inputValue: UnitValue, values: List, val updateTimestamp: Long) 7 | : UnitConverter(dimension, inputValue, values) -------------------------------------------------------------------------------- /data/unitconverter/src/main/java/de/mm20/launcher2/search/data/UnitConverter.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.search.data 2 | 3 | import de.mm20.launcher2.search.Searchable 4 | import de.mm20.launcher2.unitconverter.Dimension 5 | import de.mm20.launcher2.unitconverter.UnitValue 6 | 7 | open class UnitConverter( 8 | val dimension: Dimension, 9 | val inputValue: UnitValue, 10 | val values: List 11 | ): Searchable 12 | -------------------------------------------------------------------------------- /data/unitconverter/src/main/java/de/mm20/launcher2/unitconverter/MeasureUnit.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.unitconverter 2 | 3 | import android.content.Context 4 | 5 | interface MeasureUnit { 6 | val symbol: String 7 | fun formatName(context: Context, value: Double): String 8 | } 9 | -------------------------------------------------------------------------------- /data/unitconverter/src/main/java/de/mm20/launcher2/unitconverter/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.unitconverter 2 | 3 | import de.mm20.launcher2.currencies.CurrencyRepository 4 | import org.koin.android.ext.koin.androidContext 5 | import org.koin.dsl.module 6 | 7 | val unitConverterModule = module { 8 | single { CurrencyRepository(androidContext()) } 9 | single { UnitConverterRepositoryImpl(androidContext(), get(), get()) } 10 | } -------------------------------------------------------------------------------- /data/unitconverter/src/main/java/de/mm20/launcher2/unitconverter/UnitValue.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.unitconverter 2 | 3 | data class UnitValue( 4 | val value: Double, 5 | val symbol: String, 6 | val formattedName: String, 7 | val formattedValue: String 8 | ) -------------------------------------------------------------------------------- /data/weather/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | src/main/res/values/config.xml 3 | -------------------------------------------------------------------------------- /data/weather/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class de.mm20.launcher2.weather.** { *; } 2 | -keep class kotlin.coroutines.Continuation 3 | -dontwarn edu.umd.cs.findbugs.annotations.Nullable -------------------------------------------------------------------------------- /data/weather/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /data/weather/src/main/java/de/mm20/launcher2/weather/WeatherLocation.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.weather 2 | 3 | -------------------------------------------------------------------------------- /data/weather/src/main/java/de/mm20/launcher2/weather/WeatherProviderInfo.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.weather 2 | 3 | data class WeatherProviderInfo( 4 | val id: String, 5 | val name: String, 6 | val managedLocation: Boolean = false, 7 | ) -------------------------------------------------------------------------------- /data/weather/src/main/res/values/config_example.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /data/websites/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/websites/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/websites/consumer-rules.pro -------------------------------------------------------------------------------- /data/websites/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /data/websites/src/main/java/de/mm20/launcher2/websites/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.websites 2 | 3 | import de.mm20.launcher2.search.SearchableDeserializer 4 | import de.mm20.launcher2.search.SearchableRepository 5 | import de.mm20.launcher2.search.Website 6 | import org.koin.android.ext.koin.androidContext 7 | import org.koin.core.qualifier.named 8 | import org.koin.dsl.module 9 | 10 | val websitesModule = module { 11 | single>(named()) { WebsiteRepository(androidContext(), get()) } 12 | factory(named(WebsiteImpl.Domain)) { WebsiteDeserializer() } 13 | } -------------------------------------------------------------------------------- /data/widgets/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/widgets/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/widgets/consumer-rules.pro -------------------------------------------------------------------------------- /data/widgets/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /data/widgets/src/main/java/de/mm20/launcher2/widgets/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.widgets 2 | 3 | import de.mm20.launcher2.backup.Backupable 4 | import org.koin.core.qualifier.named 5 | import org.koin.dsl.module 6 | 7 | val widgetsModule = module { 8 | factory(named()) { WidgetRepositoryImpl(get()) } 9 | factory { WidgetRepositoryImpl(get()) } 10 | } -------------------------------------------------------------------------------- /data/wikipedia/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /data/wikipedia/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class de.mm20.launcher2.wikipedia.** { *; } 2 | -keep class kotlin.coroutines.Continuation -------------------------------------------------------------------------------- /data/wikipedia/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /data/wikipedia/src/main/java/de/mm20/launcher2/wikipedia/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.wikipedia 2 | 3 | import de.mm20.launcher2.search.Article 4 | import de.mm20.launcher2.search.SearchableDeserializer 5 | import de.mm20.launcher2.search.SearchableRepository 6 | import org.koin.android.ext.koin.androidContext 7 | import org.koin.core.qualifier.named 8 | import org.koin.dsl.module 9 | 10 | val wikipediaModule = module { 11 | single>(named
()) { WikipediaRepository(androidContext(), get()) } 12 | factory(named(Wikipedia.Domain)) { WikipediaDeserializer(androidContext()) } 13 | } -------------------------------------------------------------------------------- /data/wikipedia/src/main/res/drawable-hdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/wikipedia/src/main/res/drawable-hdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /data/wikipedia/src/main/res/drawable-mdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/wikipedia/src/main/res/drawable-mdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /data/wikipedia/src/main/res/drawable-xhdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/wikipedia/src/main/res/drawable-xhdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /data/wikipedia/src/main/res/drawable-xxhdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/wikipedia/src/main/res/drawable-xxhdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /data/wikipedia/src/main/res/drawable-xxxhdpi/ic_wikipedia.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/data/wikipedia/src/main/res/drawable-xxxhdpi/ic_wikipedia.webp -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .vitepress/cache 4 | .vitepress/build 5 | public/reference -------------------------------------------------------------------------------- /docs/.vitepress/theme/Layout.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | -------------------------------------------------------------------------------- /docs/.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | // https://vitepress.dev/guide/custom-theme 2 | import { h } from 'vue' 3 | import type { Theme } from 'vitepress' 4 | import DefaultTheme from 'vitepress/theme' 5 | import './style.css' 6 | import './custom.css' 7 | import 'material-symbols' 8 | import Layout from './Layout.vue' 9 | 10 | export default { 11 | extends: DefaultTheme, 12 | Layout: Layout, 13 | enhanceApp({ app, router, siteData }) { 14 | // ... 15 | }, 16 | } satisfies Theme 17 | -------------------------------------------------------------------------------- /docs/docs/contributor-guide/feature-requests.md: -------------------------------------------------------------------------------- 1 | # Feature Requests 2 | 3 | If you have an idea for a new feature, just create a new issue. Please be as descriptive as possible, this will greatly enhance your chances of not simply being ignored. 4 | 5 | Approved requests will be marked with the [enhancement](https://github.com/MM2-0/Kvaesitso/labels/enhancement) label. However this does not give any information about how soon the feature will be implemented. 6 | -------------------------------------------------------------------------------- /docs/docs/contributor-guide/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 0 3 | --- 4 | 5 | # Get Involved 6 | 7 | You want to get involved and support the development? Whether you can code or not, there are a lot of ways you can support the development. 8 | -------------------------------------------------------------------------------- /docs/docs/contributor-guide/sponsor.md: -------------------------------------------------------------------------------- 1 | # Donate 2 | 3 | If you like my work and you want to support the project financially, you can sponsor me on [GitHub sponsors](https://github.com/sponsors/MM2-0). 4 | -------------------------------------------------------------------------------- /docs/docs/developer-guide/external-apis/exchange-rates.md: -------------------------------------------------------------------------------- 1 | # Currency Exchange Rates 2 | 3 | Currency exchange rates are fetched from the following API endpoint: 4 | 5 | ``` 6 | https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml 7 | ``` 8 | 9 | This endpoint does not require any authentication, thus no configuration is required in order to enable the currency conversion feature in the unit converter. 10 | -------------------------------------------------------------------------------- /docs/docs/developer-guide/external-apis/index.md: -------------------------------------------------------------------------------- 1 | # External APIs 2 | 3 | Kvaesitso integrates with a number of external APIs. Most of them require some sort of authentication, like an API key. These API keys are not part of the GitHub repository. If you want to build Kvaesitso from source with all features enabled, follow the steps in this chapter. 4 | 5 | > [!INFO] 6 | > Kvaesitso is still buildable even without these steps, but some features will be disabled in the resulting APK. If all you need is a debug build for testing purposes, you can probably skip this chapter. 7 | -------------------------------------------------------------------------------- /docs/docs/developer-guide/external-apis/wikipedia.md: -------------------------------------------------------------------------------- 1 | # Wikipedia 2 | 3 | Kvaesitso uses the [Mediawiki API](https://www.mediawiki.org/wiki/API:Main_page) to load data from Wikipedia. No further configuration is required. The default Mediawiki installation URL is language-dependend and can be configured with `wikipedia_url` string resource in the `:i18n` module. 4 | -------------------------------------------------------------------------------- /docs/docs/developer-guide/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 0 3 | --- 4 | 5 | # Developer Guide 6 | 7 | You want to build Kvaesitso from source? Fix some bugs, develop new features or simply explore Kvaesitso's source code? Read this guide to learn how to setup the build environment and source code and to learn about the structure and organization of the source code. 8 | -------------------------------------------------------------------------------- /docs/docs/developer-guide/plugins/plugin-types/common/_get_params.md: -------------------------------------------------------------------------------- 1 | - `params` provides additional parameters: 2 | - `lang` is the current language of the launcher. This can differ from the system language, as 3 | the user can set a different language per app. This value should be used to localize the 4 | result. 5 | -------------------------------------------------------------------------------- /docs/docs/developer-guide/plugins/plugin-types/common/_refresh_params.md: -------------------------------------------------------------------------------- 1 | - `params` provides additional parameters: 2 | - `lang` is the current language of the launcher. This can differ from the system language, as 3 | the user can set a different language per app. This value should be used to localize the 4 | result. 5 | - `lastUpdated` the timestamp (in milliseconds) when `item` was last updated. This should be 6 | used to determine if the item needs to be refreshed again. If you decide not to refresh the 7 | item, you should return the original `item` parameter. -------------------------------------------------------------------------------- /docs/docs/developer-guide/plugins/settings.md: -------------------------------------------------------------------------------- 1 | # Plugin Settings 2 | 3 | To add a plugin settings activity, create an activity with the following intent filter: 4 | 5 | ```xml 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ``` 16 | 17 | Users can launch this activity by pressing the settings on the plugin settings screen. 18 | -------------------------------------------------------------------------------- /docs/docs/developer-guide/project-structure/libraries.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 4 3 | --- 4 | 5 | # Libraries 6 | 7 | The following libraries are commonly used: 8 | 9 | - **Jetpack Compose and Accompanist** for UI 10 | - **Koin** for dependency injection 11 | - **Coil** to load and transform images 12 | - **KotlinX coroutines** for asynchronous operations 13 | - **KotlinX serialization** for JSON serialization 14 | - **AndroidX Room** to store launcher data in an SQLite database 15 | - **AndroidX Datastore** to store additional user preferences 16 | - **OkHttp and Retrofit** for HTTP requests 17 | - Several other **AndroidX** libraries (Work, Lifecycle, AppCompat, …) 18 | -------------------------------------------------------------------------------- /docs/docs/developer-guide/setup.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Setup 6 | 7 | ## Setup the build environment 8 | 9 | - Download and install the latest canary version of Android Studio and the Android SDK: https://developer.android.com/studio/preview. 10 | - Clone the Git repository: `git clone https://github.com/MM2-0/Kvaesitso` 11 | - Open the project in Android Studio 12 | -------------------------------------------------------------------------------- /docs/docs/user-guide/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 0 3 | --- 4 | 5 | # Get Started 6 | 7 | Kvaesitso is available for Android devices running Android 8.0 or higher. 8 | 9 | ## Installation 10 | 11 | The latest APK can be downloaded from [GitHub](https://github.com/MM2-0/Kvaesitso/releases). 12 | 13 | To make sure that you get always notified about the latest updates, it's recommended that you add my F-Droid repo: 14 | https://fdroid.mm20.de 15 | 16 | You can also download it from the [IzzyOnDroid](https://apt.izzysoft.de/fdroid/index/apk/de.mm20.launcher2.release) F-Droid repo but keep in mind that updates are usually delayed for a day when using that repo. 17 | -------------------------------------------------------------------------------- /docs/docs/user-guide/search/online-results.md: -------------------------------------------------------------------------------- 1 | # Online Results 2 | 3 | Kvaesitso integrates with several online services, for example Wikipedia and OpenStreetMap. 4 | Additional online services can be integrated via plugins. 5 | 6 | In order to protect your privacy and to avoid unnecessary network traffic, online results are 7 | disabled by default. 8 | 9 | To enable online results, you need to enable the "Online results" filter. 10 | You can customize the default filter to always include online results, but keep in mind that this 11 | may have an impact on your privacy, since *all* search queries are sent to external services then. 12 | See [Filters](filters) for more information. -------------------------------------------------------------------------------- /docs/docs/user-guide/widgets/favorites-widget.md: -------------------------------------------------------------------------------- 1 | # Favorites Widget 2 | 3 | A widget that displays your [favorites](/docs/user-guide/concepts/favorites). This mirrors the favorites grid that is shown above the app grid but brings them to the widget page. 4 | -------------------------------------------------------------------------------- /docs/docs/user-guide/widgets/music-widget.md: -------------------------------------------------------------------------------- 1 | # Music Widget 2 | 3 | The music widget is one of the launcher's built-in widgets. It can be used to control media sessions 4 | on the device. The general usage is pretty self-explanatory: control the playback with the skip 5 | previous, skip next and toggle pause buttons. Tap on the album cover to open the current media 6 | player app. Long-press the album cover to open a player chooser. 7 | 8 | It is backed by the [media control integration](/docs/user-guide/integrations/mediacontrol) which 9 | can be configured at Settings > Integrations > Media control. -------------------------------------------------------------------------------- /docs/docs/user-guide/widgets/weather-widget.md: -------------------------------------------------------------------------------- 1 | # Weather Widget 2 | 3 | A widget that displays current and future weather data. 4 | 5 | ## Configuration 6 | 7 | The weather widget can be configured by tapping "Edit widgets" and then selecting the tune icon 8 | on the weather widget. 9 | 10 | - **Compact mode**: If enabled, the widget will only display the current weather data. Forecast data will be hidden. 11 | - **Weather integration settings**: A shortcut to [Settings > Integrations > Weather](/docs/user-guide/integrations/weather). This is where you can configure 12 | which weather provider to use and which location to get weather data for. 13 | -------------------------------------------------------------------------------- /docs/in-app.md: -------------------------------------------------------------------------------- 1 | 19 | 20 | # Open settings page 21 | 22 | Scan this code to view the linked settings page in Kvaesitso. 23 | 24 | 25 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "docs:dev": "vitepress dev .", 4 | "docs:build": "vitepress build .", 5 | "docs:preview": "vitepress preview ." 6 | }, 7 | "devDependencies": { 8 | "qrcode": "^1.5.4", 9 | "sass": "^1.86.0", 10 | "vitepress": "^1.6.3", 11 | "vue": "^3.5.13" 12 | }, 13 | "dependencies": { 14 | "material-symbols": "^0.14.7" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /docs/public/.well-known/microsoft-identity-association.json: -------------------------------------------------------------------------------- 1 | { 2 | "associatedApplications": [ 3 | { 4 | "applicationId": "d03ad486-753b-416c-8e33-62c64d1b525d" 5 | } 6 | ] 7 | } -------------------------------------------------------------------------------- /docs/public/CNAME: -------------------------------------------------------------------------------- 1 | kvaesitso.mm20.de -------------------------------------------------------------------------------- /docs/public/fonts/outfit/outfit-v6-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/outfit/outfit-v6-latin-700.woff -------------------------------------------------------------------------------- /docs/public/fonts/outfit/outfit-v6-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/outfit/outfit-v6-latin-700.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/outfit/outfit-v6-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/outfit/outfit-v6-latin-regular.woff -------------------------------------------------------------------------------- /docs/public/fonts/outfit/outfit-v6-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/outfit/outfit-v6-latin-regular.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto-mono/roboto-mono-v22-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto-mono/roboto-mono-v22-latin-700.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto-mono/roboto-mono-v22-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto-mono/roboto-mono-v22-latin-700.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto-mono/roboto-mono-v22-latin-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto-mono/roboto-mono-v22-latin-700italic.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto-mono/roboto-mono-v22-latin-700italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto-mono/roboto-mono-v22-latin-700italic.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto-mono/roboto-mono-v22-latin-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto-mono/roboto-mono-v22-latin-italic.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto-mono/roboto-mono-v22-latin-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto-mono/roboto-mono-v22-latin-italic.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto-mono/roboto-mono-v22-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto-mono/roboto-mono-v22-latin-regular.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto-mono/roboto-mono-v22-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto-mono/roboto-mono-v22-latin-regular.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-500.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-500.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-700.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-700.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-700italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-700italic.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-700italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-700italic.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-italic.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-italic.woff2 -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-regular.woff -------------------------------------------------------------------------------- /docs/public/fonts/roboto/roboto-v30-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/fonts/roboto/roboto-v30-latin-regular.woff2 -------------------------------------------------------------------------------- /docs/public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/icon.png -------------------------------------------------------------------------------- /docs/public/img/accessibility-service-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/accessibility-service-1.png -------------------------------------------------------------------------------- /docs/public/img/accessibility-service-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/accessibility-service-2.png -------------------------------------------------------------------------------- /docs/public/img/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/ic_launcher.png -------------------------------------------------------------------------------- /docs/public/img/notification-access-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/notification-access-1.png -------------------------------------------------------------------------------- /docs/public/img/notification-access-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/notification-access-2.png -------------------------------------------------------------------------------- /docs/public/img/notification-access-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/notification-access-3.png -------------------------------------------------------------------------------- /docs/public/img/notification-access-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/notification-access-4.png -------------------------------------------------------------------------------- /docs/public/img/plugin-configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/plugin-configuration.png -------------------------------------------------------------------------------- /docs/public/img/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/screenshot-1.png -------------------------------------------------------------------------------- /docs/public/img/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/screenshot-2.png -------------------------------------------------------------------------------- /docs/public/img/screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/screenshot-3.png -------------------------------------------------------------------------------- /docs/public/img/screenshot-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/screenshot-4.png -------------------------------------------------------------------------------- /docs/public/img/screenshot-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/screenshot-5.png -------------------------------------------------------------------------------- /docs/public/img/screenshot-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/screenshot-6.png -------------------------------------------------------------------------------- /docs/public/img/themed-icon-pack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/themed-icon-pack.png -------------------------------------------------------------------------------- /docs/public/img/themed-icons-off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/themed-icons-off.png -------------------------------------------------------------------------------- /docs/public/img/themed-icons-on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/docs/public/img/themed-icons-on.png -------------------------------------------------------------------------------- /docs/shims.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2023052200.txt: -------------------------------------------------------------------------------- 1 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2023062300.txt: -------------------------------------------------------------------------------- 1 | - Note linking: you can now link note widgets to files to keep their content in sync 2 | - Added home button as gesture trigger 3 | - Added support for dynamic clock icons in icon packs 4 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2023062400.txt: -------------------------------------------------------------------------------- 1 | - Fix crash -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2023062500.txt: -------------------------------------------------------------------------------- 1 | - Fix swipe gestures not working -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2023071200.txt: -------------------------------------------------------------------------------- 1 | - Improve bidirectional scroll handling in pager layout 2 | - Change themed icons scaling to match platform style 3 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2023071201.txt: -------------------------------------------------------------------------------- 1 | - Hotfix -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2023090800.txt: -------------------------------------------------------------------------------- 1 | - Fix bottom sheet / popup related issues -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2023101300.txt: -------------------------------------------------------------------------------- 1 | - Clock widget can now be configured from home screen, like every other widget 2 | - Added several new variants of the default watch face 3 | - Added preference to set clock widget vertical alignment 4 | - Fix adding widgets on Android 14 5 | - Other bug fixes and improvements -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024063000.txt: -------------------------------------------------------------------------------- 1 | - Add support for places search plugins 2 | - Apps can now be hidden from the app drawer without being removed from search results 3 | - Redesigned search results 4 | - Bug fixes 5 | 6 | Full changelog at https://github.com/MM2-0/Kvaesitso/releases/tag/v1.31.0 -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024070100.txt: -------------------------------------------------------------------------------- 1 | - Add support for places search plugins 2 | - Apps can now be hidden from the app drawer without being removed from search results 3 | - Redesigned search results 4 | - Bug fixes 5 | 6 | Full changelog at https://github.com/MM2-0/Kvaesitso/releases/tag/v1.31.0 -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024070300.txt: -------------------------------------------------------------------------------- 1 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024071900.txt: -------------------------------------------------------------------------------- 1 | - Added support for private spaces (Android 15+) 2 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024072200.txt: -------------------------------------------------------------------------------- 1 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024081700.txt: -------------------------------------------------------------------------------- 1 | - Added support for calendar plugins 2 | - Added a preference to exclude calendar lists from search 3 | - Restored the tab based layout for profiles 4 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024090300.txt: -------------------------------------------------------------------------------- 1 | - Fix build error 2 | - No other changes since version 1.33.0, see https://github.com/MM2-0/Kvaesitso/releases/tag/v1.33.0 for the full changelog. -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024120500.txt: -------------------------------------------------------------------------------- 1 | - Improved search result ranking: the order of the search results is now more relevant to the search query 2 | - The option to sort search results alphabetically has been removed 3 | - Custom icons for tags: you can now use any emoji or icon from an icon pack as tag icon 4 | - Compact tags: pinned tags can now be displayed in a more compact way. 5 | - You can now long-press tags to edit them 6 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2024122400.txt: -------------------------------------------------------------------------------- 1 | - Fix filters not working 2 | - Fix pinning apps to favorites in secondary user profiles 3 | - Fix some potential crashes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2025040200.txt: -------------------------------------------------------------------------------- 1 | Full changelog: https://github.com/MM2-0/Kvaesitso/releases/tag/v1.35.0 2 | 3 | - Improve OSM search performance (thanks to @leekleak) and results (thanks to @shtrophic) 4 | - Add preference to clock widget to choose between 12h and 24h format 5 | - Add option to call contacts directly, skipping the dialer screen (thanks to @shtrophic) 6 | - Add option to show apps in a list instead of a grid (thanks to @KorigamiK) 7 | - Remove Google Drive support 8 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2025040300.txt: -------------------------------------------------------------------------------- 1 | Full changelog: https://github.com/MM2-0/Kvaesitso/releases/tag/v1.35.1 2 | 3 | - Improve OSM search performance (thanks to @leekleak) and results (thanks to @shtrophic) 4 | - Add preference to clock widget to choose between 12h and 24h format 5 | - Add option to call contacts directly, skipping the dialer screen (thanks to @shtrophic) 6 | - Add option to show apps in a list instead of a grid (thanks to @KorigamiK) 7 | - Remove Google Drive support 8 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2025040301.txt: -------------------------------------------------------------------------------- 1 | Full changelog: https://github.com/MM2-0/Kvaesitso/releases/tag/v1.35.2 2 | 3 | - Improve OSM search performance (thanks to @leekleak) and results (thanks to @shtrophic) 4 | - Add preference to clock widget to choose between 12h and 24h format 5 | - Add option to call contacts directly, skipping the dialer screen (thanks to @shtrophic) 6 | - Add option to show apps in a list instead of a grid (thanks to @KorigamiK) 7 | - Remove Google Drive support 8 | - Bug fixes -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2025042100.txt: -------------------------------------------------------------------------------- 1 | - Crash fixes 2 | - Fix weather not updating 3 | - Migrate Nextcloud login to use standard browser; should fix WebAuthn issues 4 | - Add support for contact plugins -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2025050300.txt: -------------------------------------------------------------------------------- 1 | - Add Tasks integration 2 | - The plugin is now deprecated 3 | - Add Breezy Weather integration 4 | - The plugin is now deprecated -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/changelogs/2025050301.txt: -------------------------------------------------------------------------------- 1 | - Add Tasks integration 2 | - The plugin is now deprecated 3 | - Add Breezy Weather integration 4 | - The plugin is now deprecated -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot01.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot02.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot03.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot04.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot05.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/fastlane/metadata/android/en-US/images/phoneScreenshots/screenshot06.jpg -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | A search-focused, free and open source launcher for Android -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun Feb 09 12:41:42 CET 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /libs/address-formatter/Readme.md: -------------------------------------------------------------------------------- 1 | Fork of https://github.com/woheller69/AndroidAddressFormatter by woheller69, licensed under the MIT 2 | License. 3 | -------------------------------------------------------------------------------- /libs/address-formatter/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -dontwarn java.beans.ConstructorProperties 2 | -dontwarn java.beans.Transient -------------------------------------------------------------------------------- /libs/address-formatter/src/main/java/org/woheller69/AndroidAddressFormatter/Kt.kt: -------------------------------------------------------------------------------- 1 | package org.woheller69.AndroidAddressFormatter 2 | 3 | /** 4 | * Make Kotlin functions accessible from Java. 5 | */ 6 | internal object Kt { 7 | @JvmStatic 8 | inline fun toIntOrNull(string: String): Int? { 9 | return string.toIntOrNull() 10 | } 11 | } -------------------------------------------------------------------------------- /libs/material-color-utilities/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /libs/material-color-utilities/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/libs/material-color-utilities/consumer-rules.pro -------------------------------------------------------------------------------- /libs/material-color-utilities/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /libs/nextcloud/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /libs/nextcloud/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/libs/nextcloud/consumer-rules.pro -------------------------------------------------------------------------------- /libs/nextcloud/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /libs/nextcloud/src/main/java/de/mm20/launcher2/nextcloud/LoginFlow.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.nextcloud 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | internal data class LoginFlowResponse( 7 | val poll: LoginFlowResponsePoll, 8 | val login: String, 9 | ) 10 | 11 | @Serializable 12 | internal data class LoginFlowResponsePoll( 13 | val token: String, 14 | val endpoint: String, 15 | ) 16 | 17 | @Serializable 18 | internal data class LoginPollResponse( 19 | val server: String, 20 | val loginName: String, 21 | val appPassword: String, 22 | ) -------------------------------------------------------------------------------- /libs/nextcloud/src/main/java/de/mm20/launcher2/nextcloud/NcUser.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.nextcloud 2 | 3 | data class NcUser( 4 | val displayName: String, 5 | val username: String 6 | ) 7 | -------------------------------------------------------------------------------- /libs/owncloud/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /libs/owncloud/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/libs/owncloud/consumer-rules.pro -------------------------------------------------------------------------------- /libs/owncloud/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /libs/owncloud/src/main/java/de/mm20/launcher2/owncloud/OcUser.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.owncloud 2 | 3 | data class OcUser( 4 | val displayName: String, 5 | val username: String 6 | ) 7 | -------------------------------------------------------------------------------- /libs/tinypinyin/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /libs/tinypinyin/README.md: -------------------------------------------------------------------------------- 1 | # TinyPinyin 2 | 3 | Fork of https://github.com/promeG/TinyPinyin. 4 | 5 | Original library by promeG, licensed under the Apache License 2.0 6 | 7 | This library has been forked because it was no longer available in one of the F-Droid permitted 8 | Maven repositories after the JCenter shutdown in August 2024. 9 | -------------------------------------------------------------------------------- /libs/tinypinyin/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/libs/tinypinyin/consumer-rules.pro -------------------------------------------------------------------------------- /libs/tinypinyin/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /libs/webdav/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /libs/webdav/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/libs/webdav/consumer-rules.pro -------------------------------------------------------------------------------- /libs/webdav/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /libs/webdav/src/main/java/de/mm20/launcher2/webdav/WebDavFile.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.webdav 2 | 3 | data class WebDavFile( 4 | val name: String, 5 | val id: Long, 6 | val url: String, 7 | val isDirectory: Boolean, 8 | val mimeType: String, 9 | val size: Long, 10 | val owner: String? 11 | ) -------------------------------------------------------------------------------- /plugins/sdk/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /plugins/sdk/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -keepclassmembers class de.mm20.launcher2.preferences.Settings { 2 | ; 3 | } 4 | 5 | -keepclassmembers class de.mm20.launcher2.preferences.Settings$* { 6 | ; 7 | } 8 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/java/de/mm20/launcher2/sdk/base/StringPluginProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.sdk.base 2 | 3 | import android.net.Uri 4 | import de.mm20.launcher2.plugin.config.QueryPluginConfig 5 | import de.mm20.launcher2.plugin.contracts.SearchPluginContract 6 | 7 | abstract class StringPluginProvider( 8 | config: QueryPluginConfig, 9 | ) : QueryPluginProvider(config) { 10 | 11 | override fun getQuery(uri: Uri): String? { 12 | return uri.getQueryParameter(SearchPluginContract.Paths.QueryParam) 13 | } 14 | } -------------------------------------------------------------------------------- /plugins/sdk/src/main/java/de/mm20/launcher2/sdk/config/SearchPluginConfig.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.sdk.config 2 | 3 | import android.os.Bundle 4 | import de.mm20.launcher2.plugin.config.QueryPluginConfig 5 | 6 | internal fun QueryPluginConfig.toBundle(): Bundle { 7 | return Bundle().apply { 8 | putString("storageStrategy", storageStrategy.name) 9 | } 10 | } -------------------------------------------------------------------------------- /plugins/sdk/src/main/java/de/mm20/launcher2/sdk/config/WeatherPluginConfig.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.sdk.config 2 | 3 | import android.os.Bundle 4 | import de.mm20.launcher2.plugin.config.WeatherPluginConfig 5 | 6 | internal fun WeatherPluginConfig.toBundle(): Bundle { 7 | return Bundle().apply { 8 | putLong("minUpdateInterval", minUpdateInterval) 9 | putBoolean("managedLocation", managedLocation) 10 | } 11 | } -------------------------------------------------------------------------------- /plugins/sdk/src/main/java/de/mm20/launcher2/sdk/ktx/Address.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.sdk.ktx 2 | 3 | import android.location.Address 4 | 5 | internal fun Address.formatToString( 6 | ): String { 7 | val sb = StringBuilder() 8 | if (locality != null) sb.append(locality).append(", ") 9 | if (countryCode != null) sb.append(countryCode) 10 | return sb.toString() 11 | } -------------------------------------------------------------------------------- /plugins/sdk/src/main/java/de/mm20/launcher2/sdk/locations/LocationQuery.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.sdk.locations 2 | 3 | data class LocationQuery( 4 | val query: String, 5 | val userLatitude: Double, 6 | val userLongitude: Double, 7 | val searchRadius: Long, 8 | ) 9 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PermissionData.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.sdk.permissions 2 | 3 | import kotlinx.serialization.Serializable 4 | 5 | @Serializable 6 | internal data class PermissionData( 7 | val granted: Set = emptySet(), 8 | ) -------------------------------------------------------------------------------- /plugins/sdk/src/main/java/de/mm20/launcher2/sdk/utils/Coroutines.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.sdk.utils 2 | 3 | import android.os.CancellationSignal 4 | import kotlinx.coroutines.CoroutineScope 5 | import kotlinx.coroutines.async 6 | import kotlinx.coroutines.runBlocking 7 | 8 | internal fun launchWithCancellationSignal( 9 | cancellationSignal: CancellationSignal?, 10 | block: suspend CoroutineScope.() -> T 11 | ): T { 12 | return runBlocking { 13 | val deferred = async(block = block) 14 | cancellationSignal?.setOnCancelListener { 15 | deferred.cancel() 16 | } 17 | deferred.await() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/java/de/mm20/launcher2/sdk/weather/WeatherLocation.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.sdk.weather 2 | 3 | sealed interface WeatherLocation { 4 | val name: String 5 | 6 | data class Id(override val name: String, val id: String) : WeatherLocation 7 | 8 | data class LatLon(override val name: String, val lat: Double, val lon: Double) : 9 | WeatherLocation 10 | 11 | data object Managed: WeatherLocation { 12 | override val name: String = "" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-ar/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s يريد ان يحصل على معلومات من %2$s. 4 | رفض 5 | اسمح 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-arq/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-az/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | İnkar et 4 | İcazə ver 5 | %1$s buradan məlumat əldə etmək istəyir 6 | \n%2$s. 7 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-be/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s хоча атрымаць даныя з %2$s. 4 | Адмовіць 5 | Прыняць 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-bn/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-ca/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s necessita accedir a les dades de %2$s. 4 | Denega 5 | Permetre 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-cs/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Zamítnout 4 | %1$s požaduje přístup k údajům z %2$s. 5 | Povolit 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-da/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Nægt 4 | Tillad 5 | %1$s vil gerne have adgang til data fra %2$s. 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-de/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Verweigern 4 | %1$s möchte auf Daten von %2$s zugreifen. 5 | Zulassen 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-el/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s θέλει να αποκτήσει πρόσβαση σε δεδομένα από %2$s. 4 | Άρνηση 5 | Αποδοχή 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-eo/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-es/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s solicita acceso a los datos de %2$s. 4 | Denegar 5 | Permitir 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-eu/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Ukatu 4 | Baimendu 5 | %1$s-ek %2$s-ko datuak atzitu nahi ditu. 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-fa/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | انکار 4 | مجاز کردن 5 | %1$s میخواهد به داده های %2$s دسترسی داشته باشد. 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-fi/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-fr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s souhaite accéder aux données de %2$s. 4 | Refuser 5 | Autoriser 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-hu/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | A(z) %1$s hozzá szeretne férni a(z) %2$s adataidhoz. 4 | Elutasítás 5 | Engedélyezés 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-ia/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Permitter 4 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-in/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s ingin mengakses data dari %2$s. 4 | Tolak 5 | Izinkan 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-it/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Nega 4 | %1$s vuole accedere ai dati da %2$s. 5 | Consenti 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-ko/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 거부 4 | 허용 5 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-lt/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s nori duomenų iß %2$s. 4 | Atmesti 5 | Leisti 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-ms/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-nb-rNO/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s ønsker tilgang til data fra %2$s. 4 | Avslå 5 | Tillat 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-nl/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Afwijzen 4 | Toestaan 5 | %1$s wenst toegang tot gegevens van %2$s. 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-pl/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s chce uzyskać dane z %2$s. 4 | Odmów 5 | Zezwól 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-pt-rBR/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s quer acessar dados do %2$s. 4 | Negar 5 | Permitir 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-pt/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s pretende aceder aos dados de %2$s. 4 | Recusar 5 | Permitir 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-ro/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Refuzați 4 | Permiteți 5 | %1$s doreşte să acceseze date din %2$s. 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-ru/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s хочет получить доступ к данным из %2$s. 4 | Запретить 5 | Разрешить 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-sv/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-th/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s ต้องการเข้าถึงข้อมูลของ %2$s 4 | ปฏิเสธ 5 | ยินยอม 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-tr/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s buradan verilere erişmek istiyor %2$s. 4 | Reddet 5 | İzin ver 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-uk/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-vi/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-zh-rCN/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s想要从%2$s获取数据. 4 | 拒绝 5 | 允许 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values-zh-rTW/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 拒絕 4 | 允許 5 | %1$s 想要從 %2$s 存取資料。 6 | -------------------------------------------------------------------------------- /plugins/sdk/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | %1$s wants to access data from %2$s.]]> 4 | Deny 5 | Allow 6 | -------------------------------------------------------------------------------- /services/accounts/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/accounts/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/accounts/consumer-rules.pro -------------------------------------------------------------------------------- /services/accounts/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /services/accounts/src/main/java/de/mm20/launcher2/accounts/Account.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.accounts 2 | 3 | data class Account( 4 | val userName: String, 5 | val type: AccountType, 6 | ) 7 | -------------------------------------------------------------------------------- /services/accounts/src/main/java/de/mm20/launcher2/accounts/AccountType.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.accounts 2 | 3 | enum class AccountType { 4 | Nextcloud, 5 | Owncloud, 6 | } -------------------------------------------------------------------------------- /services/accounts/src/main/java/de/mm20/launcher2/accounts/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.accounts 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val accountsModule = module { 7 | factory { AccountsRepositoryImpl(androidContext()) } 8 | } -------------------------------------------------------------------------------- /services/backup/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/backup/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/backup/consumer-rules.pro -------------------------------------------------------------------------------- /services/backup/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /services/backup/src/main/java/de/mm20/launcher2/backup/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.backup 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val backupModule = module { 7 | single { BackupManager(androidContext(), getAll()) } 8 | } -------------------------------------------------------------------------------- /services/badges/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/badges/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/badges/consumer-rules.pro -------------------------------------------------------------------------------- /services/badges/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /services/badges/src/main/java/de/mm20/launcher2/badges/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.badges 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val badgesModule = module { 7 | single { BadgeServiceImpl(androidContext(), get()) } 8 | } -------------------------------------------------------------------------------- /services/badges/src/main/java/de/mm20/launcher2/badges/providers/BadgeProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.badges.providers 2 | 3 | import de.mm20.launcher2.badges.Badge 4 | import de.mm20.launcher2.search.Searchable 5 | import kotlinx.coroutines.flow.Flow 6 | 7 | interface BadgeProvider { 8 | /** 9 | * This must emit a value as soon as possible because the 10 | * BadgeRepository is waiting for values from every provider. 11 | * null must be emitted if no badge should be shown. 12 | */ 13 | fun getBadge(searchable: Searchable): Flow 14 | } -------------------------------------------------------------------------------- /services/favorites/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/favorites/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/favorites/consumer-rules.pro -------------------------------------------------------------------------------- /services/favorites/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /services/favorites/src/main/java/de/mm20/launcher2/services/favorites/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.services.favorites 2 | 3 | import org.koin.dsl.module 4 | 5 | val favoritesModule = module { 6 | factory { FavoritesService(get()) } 7 | } -------------------------------------------------------------------------------- /services/global-actions/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/global-actions/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/global-actions/consumer-rules.pro -------------------------------------------------------------------------------- /services/global-actions/src/main/java/de/mm20/launcher2/globalactions/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.globalactions 2 | 3 | import org.koin.dsl.module 4 | 5 | val globalActionsModule = module { 6 | single { GlobalActionsService() } 7 | } -------------------------------------------------------------------------------- /services/global-actions/src/main/res/xml/accessibility_service.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /services/icons/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/icons/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/icons/consumer-rules.pro -------------------------------------------------------------------------------- /services/icons/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /services/icons/src/main/java/de/mm20/launcher2/icons/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.icons 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val iconsModule = module { 7 | single { IconPackManager(androidContext(), get()) } 8 | single { IconService(androidContext(), get(), get(), get()) } 9 | } -------------------------------------------------------------------------------- /services/icons/src/main/java/de/mm20/launcher2/icons/TransformableDynamicLauncherIcon.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.icons 2 | 3 | import de.mm20.launcher2.icons.transformations.LauncherIconTransformation 4 | 5 | internal interface TransformableDynamicLauncherIcon { 6 | fun setTransformations(transformations: List) 7 | } -------------------------------------------------------------------------------- /services/icons/src/main/java/de/mm20/launcher2/icons/providers/IconProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.icons.providers 2 | 3 | import de.mm20.launcher2.icons.LauncherIcon 4 | import de.mm20.launcher2.search.SavableSearchable 5 | 6 | interface IconProvider { 7 | suspend fun getIcon(searchable: SavableSearchable, size: Int): LauncherIcon? 8 | } 9 | 10 | internal suspend fun Iterable.getFirstIcon( 11 | searchable: SavableSearchable, 12 | size: Int 13 | ): LauncherIcon? { 14 | for (provider in this) { 15 | val icon = provider.getIcon(searchable, size) 16 | if (icon != null) { 17 | return icon 18 | } 19 | } 20 | return null 21 | } -------------------------------------------------------------------------------- /services/icons/src/main/java/de/mm20/launcher2/icons/providers/PlaceholderIconProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.icons.providers 2 | 3 | import android.content.Context 4 | import de.mm20.launcher2.icons.LauncherIcon 5 | import de.mm20.launcher2.search.SavableSearchable 6 | 7 | class PlaceholderIconProvider(val context: Context) : IconProvider { 8 | override suspend fun getIcon(searchable: SavableSearchable, size: Int): LauncherIcon { 9 | return searchable.getPlaceholderIcon(context) 10 | } 11 | } -------------------------------------------------------------------------------- /services/icons/src/main/java/de/mm20/launcher2/icons/providers/SystemIconProvider.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.icons.providers 2 | 3 | import android.content.Context 4 | import de.mm20.launcher2.icons.LauncherIcon 5 | import de.mm20.launcher2.search.SavableSearchable 6 | 7 | class SystemIconProvider( 8 | private val context: Context, 9 | private val themedIcons: Boolean, 10 | ) : IconProvider { 11 | override suspend fun getIcon(searchable: SavableSearchable, size: Int): LauncherIcon? { 12 | return searchable.loadIcon(context, size, themedIcons) 13 | } 14 | } -------------------------------------------------------------------------------- /services/music/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/music/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/music/consumer-rules.pro -------------------------------------------------------------------------------- /services/music/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | / 4 | -------------------------------------------------------------------------------- /services/music/src/main/java/de/mm20/launcher2/music/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.music 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val musicModule = module { 7 | single { MusicServiceImpl(androidContext(), get(), get()) } 8 | } -------------------------------------------------------------------------------- /services/music/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 144dp 3 | 4 | -------------------------------------------------------------------------------- /services/plugins/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/plugins/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/plugins/consumer-rules.pro -------------------------------------------------------------------------------- /services/plugins/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /services/plugins/src/main/java/de/mm20/launcher2/plugins/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.plugins 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val servicesPluginsModule = module { 7 | single { PluginServiceImpl(androidContext(), get()) } 8 | } -------------------------------------------------------------------------------- /services/search/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/search/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/search/consumer-rules.pro -------------------------------------------------------------------------------- /services/search/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /services/tags/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/tags/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/tags/consumer-rules.pro -------------------------------------------------------------------------------- /services/tags/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /services/tags/src/main/java/de/mm20/launcher2/services/tags/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.services.tags 2 | 3 | import de.mm20.launcher2.services.tags.impl.TagsServiceImpl 4 | import org.koin.dsl.module 5 | 6 | val servicesTagsModule = module { 7 | single { TagsServiceImpl(get(), get()) } 8 | } -------------------------------------------------------------------------------- /services/widgets/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /services/widgets/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MM2-0/Kvaesitso/6d8723028188c47e60d782b68a6910202387bc3c/services/widgets/consumer-rules.pro -------------------------------------------------------------------------------- /services/widgets/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /services/widgets/src/main/java/de/mm20/launcher2/services/widgets/BuiltInWidgetInfo.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.services.widgets 2 | 3 | 4 | data class BuiltInWidgetInfo( 5 | val type: String, 6 | val label: String, 7 | ) -------------------------------------------------------------------------------- /services/widgets/src/main/java/de/mm20/launcher2/services/widgets/Module.kt: -------------------------------------------------------------------------------- 1 | package de.mm20.launcher2.services.widgets 2 | 3 | import org.koin.android.ext.koin.androidContext 4 | import org.koin.dsl.module 5 | 6 | val widgetsServiceModule = module { 7 | single { WidgetsService(androidContext(), get()) } 8 | } --------------------------------------------------------------------------------