├── .gitignore ├── .idea ├── .gitignore ├── compiler.xml ├── copyright │ ├── Copyright.xml │ └── profiles_settings.xml ├── deploymentTargetDropDown.xml ├── detekt.xml ├── gradle.xml ├── inspectionProfiles │ └── Project_Default.xml ├── jarRepositories.xml ├── kotlinc.xml ├── ktlint.xml ├── migrations.xml ├── misc.xml └── vcs.xml ├── LICENSE ├── README.md ├── SECURITY.md ├── app ├── .gitignore ├── build.gradle.kts ├── debug │ ├── app-debug.apk │ └── output-metadata.json ├── proguard-rules.pro ├── release │ ├── app-release.apk │ ├── app-release.apk.idsig │ ├── baselineProfiles │ │ ├── 0 │ │ │ └── app-release.dm │ │ └── 1 │ │ │ └── app-release.dm │ └── output-metadata.json └── src │ ├── androidTest │ └── java │ │ └── ru │ │ └── aleshin │ │ └── timeplanner │ │ └── ExampleInstrumentedTest.kt │ ├── fdroid │ ├── AndroidManifest.xml │ └── java │ │ └── ru │ │ └── aleshin │ │ └── timeplanner │ │ ├── application │ │ └── BaseFlavorApplication.kt │ │ ├── data │ │ ├── AnalyticsServiceImpl.kt │ │ ├── AppServiceImpl.kt │ │ └── CrashlyticsServiceImpl.kt │ │ └── di │ │ └── PlatformServicesModule.kt │ ├── huawei │ ├── AndroidManifest.xml │ └── java │ │ └── ru │ │ └── aleshin │ │ └── timeplanner │ │ ├── application │ │ └── BaseFlavorApplication.kt │ │ ├── data │ │ ├── AnalyticsServiceImpl.kt │ │ ├── AppServiceImpl.kt │ │ └── CrashlyticsServiceImpl.kt │ │ └── di │ │ └── PlatformServicesModule.kt │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── database │ │ │ ├── categories_prepopulate.db │ │ │ └── settings_prepopulated.db │ ├── ic_launcher-playstore.png │ ├── ic_planner_launcher-playstore.png │ ├── java │ │ └── ru │ │ │ └── aleshin │ │ │ └── timeplanner │ │ │ ├── application │ │ │ └── TimePlannerApp.kt │ │ │ ├── di │ │ │ ├── annotation │ │ │ │ └── Navigations.kt │ │ │ ├── component │ │ │ │ └── AppComponent.kt │ │ │ └── modules │ │ │ │ ├── CoreModule.kt │ │ │ │ ├── DataBaseModule.kt │ │ │ │ ├── DataModule.kt │ │ │ │ ├── DependenciesModule.kt │ │ │ │ ├── DomainModules.kt │ │ │ │ ├── FeatureModule.kt │ │ │ │ ├── NavigationModule.kt │ │ │ │ └── PresentationModule.kt │ │ │ ├── domain │ │ │ ├── common │ │ │ │ ├── MainEitherWrapper.kt │ │ │ │ ├── MainErrorHandler.kt │ │ │ │ └── MainFailures.kt │ │ │ ├── entities │ │ │ │ └── TimeTasks.kt │ │ │ └── interactors │ │ │ │ ├── SettingsInteractor.kt │ │ │ │ └── TimeTaskInteractor.kt │ │ │ ├── navigation │ │ │ ├── GlobalNavigationManager.kt │ │ │ └── TabNavigationManager.kt │ │ │ └── presentation │ │ │ ├── mappers │ │ │ └── NotificationTimeTypeMapper.kt │ │ │ ├── receiver │ │ │ ├── AlarmReceiverProviderImpl.kt │ │ │ └── TimeTaskAlarmReceiver.kt │ │ │ ├── ui │ │ │ ├── main │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── contract │ │ │ │ │ ├── DeepLinkTarget.kt │ │ │ │ │ ├── MainContract.kt │ │ │ │ │ └── MainDeps.kt │ │ │ │ └── viewmodel │ │ │ │ │ ├── MainStateCommunicator.kt │ │ │ │ │ ├── MainViewModel.kt │ │ │ │ │ ├── NavigationWorkProcessor.kt │ │ │ │ │ └── SettingsWorkProcessor.kt │ │ │ ├── splash │ │ │ │ ├── SplashContent.kt │ │ │ │ └── SplashScreen.kt │ │ │ └── tabs │ │ │ │ ├── TabsScreen.kt │ │ │ │ ├── contract │ │ │ │ └── TabsContract.kt │ │ │ │ ├── screenmodel │ │ │ │ ├── TabScreenModel.kt │ │ │ │ └── TabsStateCommunicator.kt │ │ │ │ └── views │ │ │ │ ├── HomeNavigationDrawer.kt │ │ │ │ └── TabsBottomBar.kt │ │ │ └── widgets │ │ │ ├── WidgetGlanceColorScheme.kt │ │ │ ├── WidgetTheme.kt │ │ │ ├── common │ │ │ └── CompatScaffold.kt │ │ │ └── main │ │ │ ├── MainWidget.kt │ │ │ ├── MainWidgetContent.kt │ │ │ ├── MainWidgetReceiver.kt │ │ │ └── views │ │ │ ├── WidgetMonogram.kt │ │ │ └── WidgetTimeTasks.kt │ └── res │ │ ├── drawable │ │ ├── circular_background.xml │ │ ├── ic_launcher_foreground.xml │ │ ├── rouned_background_16_dp.xml │ │ ├── rouned_background_24_dp.xml │ │ ├── rouned_background_8_dp.xml │ │ └── stoke_rouned_background.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_background.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_background.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_background.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_background.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_background.webp │ │ └── ic_launcher_round.webp │ │ ├── values-night │ │ └── themes.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ ├── xml-v28 │ │ └── main_widget_info.xml │ │ └── xml │ │ ├── backup_rules.xml │ │ ├── data_extraction_rules.xml │ │ └── main_widget_info.xml │ └── rustore │ ├── AndroidManifest.xml │ └── java │ └── ru │ └── aleshin │ └── timeplanner │ ├── application │ └── BaseFlavorApplication.kt │ ├── data │ ├── AnalyticsServiceImpl.kt │ ├── AppServiceImpl.kt │ └── CrashlyticsServiceImpl.kt │ └── di │ └── PlatformServicesModule.kt ├── build.gradle.kts ├── config └── detekt │ └── detekt.yml ├── core ├── data │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ ├── schemas │ │ ├── ru.aleshin.core.data.datasources.schedules.SchedulesDataBase │ │ │ ├── 1.json │ │ │ ├── 10.json │ │ │ ├── 11.json │ │ │ ├── 12.json │ │ │ ├── 13.json │ │ │ ├── 2.json │ │ │ ├── 3.json │ │ │ ├── 4.json │ │ │ ├── 5.json │ │ │ ├── 6.json │ │ │ ├── 7.json │ │ │ ├── 8.json │ │ │ └── 9.json │ │ └── ru.aleshin.core.data.datasources.settings.SettingsDataBase │ │ │ ├── 1.json │ │ │ ├── 2.json │ │ │ ├── 3.json │ │ │ ├── 4.json │ │ │ ├── 5.json │ │ │ └── 6.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── core │ │ │ └── data │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── core │ │ │ └── data │ │ │ ├── datasources │ │ │ ├── categories │ │ │ │ ├── CategoriesLocalDataSource.kt │ │ │ │ └── MainCategoriesDao.kt │ │ │ ├── schedules │ │ │ │ ├── SchedulesDao.kt │ │ │ │ ├── SchedulesDataBase.kt │ │ │ │ └── SchedulesLocalDataSource.kt │ │ │ ├── settings │ │ │ │ ├── SettingsDataBase.kt │ │ │ │ ├── TasksSettingsDao.kt │ │ │ │ ├── TasksSettingsLocalDataSource.kt │ │ │ │ ├── ThemeSettingsDao.kt │ │ │ │ └── ThemeSettingsLocalDataSource.kt │ │ │ ├── subcategories │ │ │ │ ├── SubCategoriesDao.kt │ │ │ │ └── SubCategoriesLocalDataSource.kt │ │ │ ├── templates │ │ │ │ ├── TemplatesDao.kt │ │ │ │ └── TemplatesLocalDataSource.kt │ │ │ └── undefinedtasks │ │ │ │ ├── UndefinedTasksDao.kt │ │ │ │ └── UndefinedTasksLocalDataSource.kt │ │ │ ├── mappers │ │ │ ├── categories │ │ │ │ └── CategoriesDataMappers.kt │ │ │ ├── schedules │ │ │ │ ├── DailyScheduleDataMapper.kt │ │ │ │ ├── ScheduleDataToDomainMapper.kt │ │ │ │ ├── TimeTaskDataMappers.kt │ │ │ │ └── UndefinedTaskDataMapper.kt │ │ │ ├── settings │ │ │ │ ├── TasksSettingsDataMapper.kt │ │ │ │ └── ThemeSettingsDataMapper.kt │ │ │ └── template │ │ │ │ ├── RepeatTimeDataMapper.kt │ │ │ │ └── TemplatesDataMappers.kt │ │ │ ├── models │ │ │ ├── categories │ │ │ │ ├── MainCategoryDetails.kt │ │ │ │ ├── MainCategoryEntity.kt │ │ │ │ └── SubCategoryEntity.kt │ │ │ ├── schedules │ │ │ │ ├── DailyScheduleEntity.kt │ │ │ │ └── ScheduleDetails.kt │ │ │ ├── settings │ │ │ │ ├── TasksSettingsEntity.kt │ │ │ │ └── ThemeSettingsEntity.kt │ │ │ ├── tasks │ │ │ │ ├── TimeTaskDetails.kt │ │ │ │ ├── TimeTaskEntity.kt │ │ │ │ ├── UndefinedTaskDetails.kt │ │ │ │ └── UndefinedTaskEntity.kt │ │ │ └── template │ │ │ │ ├── RepeatTimeEntity.kt │ │ │ │ ├── TemplateCompound.kt │ │ │ │ ├── TemplateDetails.kt │ │ │ │ └── TemplateEntity.kt │ │ │ └── repository │ │ │ ├── CategoriesRepositoryImpl.kt │ │ │ ├── ScheduleRepositoryImpl.kt │ │ │ ├── SubCategoriesRepositoryImpl.kt │ │ │ ├── TasksSettingsRepositoryImpl.kt │ │ │ ├── TemplatesRepositoryImpl.kt │ │ │ ├── ThemeSettingsRepositoryImpl.kt │ │ │ ├── TimeTaskRepositoryImpl.kt │ │ │ └── UndefinedTasksRepositoryImpl.kt │ │ └── test │ │ └── java │ │ └── ru │ │ └── aleshin │ │ └── core │ │ └── data │ │ └── ExampleUnitTest.kt ├── domain │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── core │ │ │ └── domain │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── core │ │ │ └── domain │ │ │ ├── common │ │ │ ├── ScheduleStatusChecker.kt │ │ │ └── TimeTaskStatusChecker.kt │ │ │ ├── entities │ │ │ ├── categories │ │ │ │ ├── Categories.kt │ │ │ │ ├── DefaultCategoryType.kt │ │ │ │ ├── MainCategory.kt │ │ │ │ └── SubCategory.kt │ │ │ ├── schedules │ │ │ │ ├── DailyScheduleStatus.kt │ │ │ │ ├── Schedule.kt │ │ │ │ ├── TaskNotifications.kt │ │ │ │ ├── TaskPriority.kt │ │ │ │ ├── TimeTask.kt │ │ │ │ ├── TimeTaskStatus.kt │ │ │ │ └── UndefinedTask.kt │ │ │ ├── settings │ │ │ │ ├── CalendarButtonBehavior.kt │ │ │ │ ├── ColorsType.kt │ │ │ │ ├── LanguageType.kt │ │ │ │ ├── Settings.kt │ │ │ │ ├── TasksSettings.kt │ │ │ │ ├── ThemeSettings.kt │ │ │ │ ├── ThemeType.kt │ │ │ │ └── ViewToggleStatus.kt │ │ │ └── template │ │ │ │ ├── RepeatTime.kt │ │ │ │ ├── RepeatTimeType.kt │ │ │ │ └── Template.kt │ │ │ └── repository │ │ │ ├── CategoriesRepository.kt │ │ │ ├── ScheduleRepository.kt │ │ │ ├── SubCategoriesRepository.kt │ │ │ ├── TasksSettingsRepository.kt │ │ │ ├── TemplatesRepository.kt │ │ │ ├── ThemeSettingsRepository.kt │ │ │ ├── TimeTaskRepository.kt │ │ │ └── UndefinedTasksRepository.kt │ │ └── test │ │ └── java │ │ └── ru │ │ └── aleshin │ │ └── core │ │ └── domain │ │ └── ExampleUnitTest.kt ├── ui │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── core │ │ │ └── ui │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── core │ │ │ │ └── ui │ │ │ │ ├── mappers │ │ │ │ ├── CategoryTypeMappers.kt │ │ │ │ ├── MonthsResMapper.kt │ │ │ │ ├── PriorityMapper.kt │ │ │ │ ├── RepeatTimeMappers.kt │ │ │ │ └── WeekDayResMapper.kt │ │ │ │ ├── models │ │ │ │ └── NotificationTimeType.kt │ │ │ │ ├── notifications │ │ │ │ ├── AlarmReceiverProvider.kt │ │ │ │ ├── TemplatesAlarmManager.kt │ │ │ │ └── TimeTaskAlarmManager.kt │ │ │ │ ├── theme │ │ │ │ ├── TimePlannerRes.kt │ │ │ │ ├── TimePlannerTheme.kt │ │ │ │ ├── material │ │ │ │ │ ├── BlueColors.kt │ │ │ │ │ ├── ColorSchemes.kt │ │ │ │ │ ├── PinkColors.kt │ │ │ │ │ ├── PurpleColors.kt │ │ │ │ │ ├── RedColors.kt │ │ │ │ │ ├── Shapes.kt │ │ │ │ │ └── Typography.kt │ │ │ │ └── tokens │ │ │ │ │ ├── TimePlannerColorsType.kt │ │ │ │ │ ├── TimePlannerElevations.kt │ │ │ │ │ ├── TimePlannerIcons.kt │ │ │ │ │ ├── TimePlannerLanguage.kt │ │ │ │ │ └── TimePlannerStrings.kt │ │ │ │ └── views │ │ │ │ ├── BaseMenuItems.kt │ │ │ │ ├── BaseSelectorBottomSheet.kt │ │ │ │ ├── BaseSelectorDialog.kt │ │ │ │ ├── CategoryMonogram.kt │ │ │ │ ├── CustomTextFields.kt │ │ │ │ ├── DeleteWarningDialog.kt │ │ │ │ ├── Dialog.kt │ │ │ │ ├── DialogHost.kt │ │ │ │ ├── DurationPickerDialog.kt │ │ │ │ ├── DurationTemplate.kt │ │ │ │ ├── ErrorSnackbar.kt │ │ │ │ ├── ExpandedIcon.kt │ │ │ │ ├── ExtendedIconButton.kt │ │ │ │ ├── FilterChipColors.kt │ │ │ │ ├── HorizontalTabsPager.kt │ │ │ │ ├── MinutesAndHoursTitle.kt │ │ │ │ ├── NavigationDrawer.kt │ │ │ │ ├── NoneItemsView.kt │ │ │ │ ├── Placeholders.kt │ │ │ │ ├── Scaffold.kt │ │ │ │ ├── SegmentedButtons.kt │ │ │ │ ├── SwipeToDismissBackground.kt │ │ │ │ ├── SystemBarsColor.kt │ │ │ │ ├── TabNavigationBar.kt │ │ │ │ ├── TimeFormatSelector.kt │ │ │ │ ├── TimePickerDialog.kt │ │ │ │ ├── TopAppBar.kt │ │ │ │ ├── TopAppBarAction.kt │ │ │ │ └── ViewToggle.kt │ │ └── res │ │ │ └── drawable │ │ │ ├── ic_add.xml │ │ │ ├── ic_affairs.xml │ │ │ ├── ic_analytics.xml │ │ │ ├── ic_analytics_outline.xml │ │ │ ├── ic_arrow_drop_down.xml │ │ │ ├── ic_arrow_drop_up.xml │ │ │ ├── ic_arrow_right.xml │ │ │ ├── ic_calendar.xml │ │ │ ├── ic_cancel.xml │ │ │ ├── ic_car.xml │ │ │ ├── ic_categories.xml │ │ │ ├── ic_check.xml │ │ │ ├── ic_close.xml │ │ │ ├── ic_compact_view.xml │ │ │ ├── ic_culture.xml │ │ │ ├── ic_dashboard.xml │ │ │ ├── ic_eat.xml │ │ │ ├── ic_entertainments.xml │ │ │ ├── ic_expanded_view.xml │ │ │ ├── ic_face_retouching.xml │ │ │ ├── ic_home.xml │ │ │ ├── ic_home_outlined.xml │ │ │ ├── ic_interests.xml │ │ │ ├── ic_keyboard_outline.xml │ │ │ ├── ic_medicine.xml │ │ │ ├── ic_planned_task.xml │ │ │ ├── ic_reset.xml │ │ │ ├── ic_rest.xml │ │ │ ├── ic_schedule.xml │ │ │ ├── ic_settings.xml │ │ │ ├── ic_settings_outline.xml │ │ │ ├── ic_sleep.xml │ │ │ ├── ic_splash.png │ │ │ ├── ic_sport.xml │ │ │ ├── ic_store.xml │ │ │ ├── ic_study.xml │ │ │ ├── ic_template.xml │ │ │ ├── ic_time.xml │ │ │ ├── ic_time_planner.xml │ │ │ ├── ic_time_planner_circular.png │ │ │ └── ic_work.xml │ │ └── test │ │ └── java │ │ └── ru │ │ └── aleshin │ │ └── core │ │ └── ui │ │ └── ExampleUnitTest.kt └── utils │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ ├── androidTest │ └── java │ │ └── ru │ │ └── aleshin │ │ └── core │ │ └── utils │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── ru │ │ └── aleshin │ │ └── core │ │ └── utils │ │ ├── charts │ │ ├── BarChartColors.kt │ │ └── PieChartColors.kt │ │ ├── di │ │ ├── ApplicationContext.kt │ │ ├── FeatureScope.kt │ │ ├── ScreenKey.kt │ │ └── ScreenModelKey.kt │ │ ├── extensions │ │ ├── Common.kt │ │ ├── Compose.kt │ │ ├── Context.kt │ │ └── Date.kt │ │ ├── functional │ │ ├── Constants.kt │ │ ├── DateSerializer.kt │ │ ├── DomainFailures.kt │ │ ├── Either.kt │ │ ├── Mapper.kt │ │ ├── Month.kt │ │ ├── TimeFormat.kt │ │ ├── TimePeriod.kt │ │ ├── TimeRange.kt │ │ ├── TimeShiftException.kt │ │ └── WeekDay.kt │ │ ├── handlers │ │ └── ErrorHandler.kt │ │ ├── managers │ │ ├── CoroutineManager.kt │ │ ├── DateManager.kt │ │ ├── DrawerManager.kt │ │ └── TimeOverlayManager.kt │ │ ├── navigation │ │ ├── Command.kt │ │ ├── CommandBuffer.kt │ │ ├── CommandListenerManager.kt │ │ ├── NavigationProcessor.kt │ │ ├── Router.kt │ │ └── navigator │ │ │ ├── AppNavigator.kt │ │ │ ├── NavigatorManager.kt │ │ │ └── TabNavigator.kt │ │ ├── notifications │ │ ├── NotificationCreator.kt │ │ └── parameters │ │ │ ├── NotificationDefaults.kt │ │ │ ├── NotificationImportance.kt │ │ │ ├── NotificationPriority.kt │ │ │ ├── NotificationProgress.kt │ │ │ ├── NotificationStyles.kt │ │ │ └── NotificationVisibility.kt │ │ ├── platform │ │ ├── activity │ │ │ └── BaseActivity.kt │ │ ├── communications │ │ │ ├── Communicator.kt │ │ │ └── state │ │ │ │ ├── StateCommunicator.kt │ │ │ │ └── ViewStateCollect.kt │ │ ├── screen │ │ │ ├── RequestPermissions.kt │ │ │ ├── ScreenContent.kt │ │ │ └── ScreenScope.kt │ │ ├── screenmodel │ │ │ ├── Actor.kt │ │ │ ├── BaseScreenModel.kt │ │ │ ├── BaseViewModel.kt │ │ │ ├── ContractProviders.kt │ │ │ ├── Init.kt │ │ │ ├── Reducer.kt │ │ │ ├── ReetrantLock.kt │ │ │ ├── ScreenDependencies.kt │ │ │ ├── contract │ │ │ │ ├── BaseAction.kt │ │ │ │ ├── BaseEffect.kt │ │ │ │ ├── BaseEvent.kt │ │ │ │ └── BaseViewState.kt │ │ │ ├── store │ │ │ │ ├── BaseStore.kt │ │ │ │ ├── SharedStore.kt │ │ │ │ └── Store.kt │ │ │ └── work │ │ │ │ ├── FlowWorkProcessor.kt │ │ │ │ ├── WorkProcessor.kt │ │ │ │ ├── WorkResultHandler.kt │ │ │ │ └── WorkScope.kt │ │ └── services │ │ │ ├── AnalyticsService.kt │ │ │ ├── AppService.kt │ │ │ ├── BaseApplication.kt │ │ │ ├── CrashlyticsService.kt │ │ │ └── Flavor.kt │ │ ├── validation │ │ ├── ValidateError.kt │ │ ├── ValidateResult.kt │ │ └── Validator.kt │ │ └── wrappers │ │ └── EitherWrapper.kt │ └── test │ └── java │ └── ru │ └── aleshin │ └── core │ └── utils │ └── ExampleUnitTest.kt ├── fastlane └── metadata │ └── android │ ├── en-US │ ├── full_description.txt │ ├── images │ │ ├── featureGraphic.png │ │ ├── icon.png │ │ └── phoneScreenshots │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ └── 6.png │ └── short_description.txt │ └── ru │ ├── full_description.txt │ ├── images │ └── phoneScreenshots │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ └── 6.png │ └── short_description.txt ├── features ├── analytics │ ├── api │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── analytics │ │ │ │ └── api │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── analytics │ │ │ │ └── api │ │ │ │ ├── di │ │ │ │ └── AnalyticsFeatureApi.kt │ │ │ │ └── navigation │ │ │ │ └── AnalyticsFeatureStarter.kt │ │ │ └── test │ │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── analytics │ │ │ └── api │ │ │ └── ExampleUnitTest.kt │ └── impl │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── analytics │ │ │ └── impl │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── analytics │ │ │ │ └── impl │ │ │ │ ├── di │ │ │ │ ├── AnalyticsFeatureDependencies.kt │ │ │ │ ├── component │ │ │ │ │ └── AnalyticsComponent.kt │ │ │ │ ├── holder │ │ │ │ │ └── AnalyticsComponentHolder.kt │ │ │ │ └── modules │ │ │ │ │ ├── DomainModule.kt │ │ │ │ │ └── PresentationModule.kt │ │ │ │ ├── domain │ │ │ │ ├── common │ │ │ │ │ ├── AnalyticsEitherWrapper.kt │ │ │ │ │ └── AnalyticsErrorHandler.kt │ │ │ │ ├── entities │ │ │ │ │ ├── AnalyticsFailure.kt │ │ │ │ │ ├── CategoryAnalytic.kt │ │ │ │ │ ├── PlanningAnalytic.kt │ │ │ │ │ ├── ScheduleAnalytics.kt │ │ │ │ │ └── SubCategoryAnalytic.kt │ │ │ │ └── interactors │ │ │ │ │ ├── AnalyticsInteractor.kt │ │ │ │ │ └── SettingsInteractor.kt │ │ │ │ ├── navigation │ │ │ │ └── AnalyticsFeatureStarterImpl.kt │ │ │ │ └── presenatiton │ │ │ │ ├── mappers │ │ │ │ ├── AnalyticsFailureMapper.kt │ │ │ │ ├── AnalyticsUiMappers.kt │ │ │ │ ├── CategoriesUiMapper.kt │ │ │ │ ├── TimePeriodMapper.kt │ │ │ │ └── TimeTaskUiMapper.kt │ │ │ │ ├── models │ │ │ │ ├── analytics │ │ │ │ │ ├── CategoryAnalyticUi.kt │ │ │ │ │ ├── PlanningAnalyticUi.kt │ │ │ │ │ ├── ScheduleAnalyticsUi.kt │ │ │ │ │ └── SubCategoryAnalyticUi.kt │ │ │ │ ├── categories │ │ │ │ │ ├── MainCategoryUi.kt │ │ │ │ │ └── SubCategoryUi.kt │ │ │ │ └── timetask │ │ │ │ │ ├── TaskNotificationsUi.kt │ │ │ │ │ └── TimeTaskUi.kt │ │ │ │ ├── theme │ │ │ │ ├── AnalyticsTheme.kt │ │ │ │ ├── AnalyticsThemeRes.kt │ │ │ │ └── tokens │ │ │ │ │ ├── AnalyticsIcons.kt │ │ │ │ │ └── AnalyticsStrings.kt │ │ │ │ └── ui │ │ │ │ ├── AnalyticsScreen.kt │ │ │ │ ├── contract │ │ │ │ └── AnalyticsContract.kt │ │ │ │ ├── screenmodel │ │ │ │ ├── AnalyticsEffectCommunicator.kt │ │ │ │ ├── AnalyticsScreenModel.kt │ │ │ │ ├── AnalyticsStateCommunicator.kt │ │ │ │ └── AnalyticsWorkProcessor.kt │ │ │ │ ├── tabs │ │ │ │ ├── TimeTab.kt │ │ │ │ └── WorkLoadTab.kt │ │ │ │ └── views │ │ │ │ ├── AnalyticsTimeLegend.kt │ │ │ │ ├── AnalyticsTopAppBar.kt │ │ │ │ ├── CategoriesAnalyticsSection.kt │ │ │ │ ├── ExecutedAnalyticsSection.kt │ │ │ │ ├── PlanningAnalyticsSection.kt │ │ │ │ ├── StatisticsSection.kt │ │ │ │ ├── TimeSelectorSection.kt │ │ │ │ └── WorkLoadSection.kt │ │ └── res │ │ │ └── drawable │ │ │ ├── ic_bar_chart.xml │ │ │ ├── ic_list_numbered.xml │ │ │ ├── ic_numeric_1_circle.xml │ │ │ ├── ic_pie_chart.xml │ │ │ ├── ic_statistics.xml │ │ │ ├── ic_time_complete.xml │ │ │ └── ic_timer_check.xml │ │ └── test │ │ └── java │ │ └── ru │ │ └── aleshin │ │ └── features │ │ └── analytics │ │ └── impl │ │ └── ExampleUnitTest.kt ├── editor │ ├── api │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── editor │ │ │ │ └── api │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── editor │ │ │ │ └── api │ │ │ │ ├── di │ │ │ │ └── EditorFeatureApi.kt │ │ │ │ └── navigations │ │ │ │ ├── EditorFeatureStarter.kt │ │ │ │ └── EditorScreens.kt │ │ │ └── test │ │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── editor │ │ │ └── api │ │ │ └── ExampleUnitTest.kt │ └── impl │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── editor │ │ │ └── impl │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── editor │ │ │ │ └── impl │ │ │ │ ├── data │ │ │ │ ├── datasources │ │ │ │ │ └── EditorLocalDataSource.kt │ │ │ │ └── repositories │ │ │ │ │ └── EditorRepositoryImpl.kt │ │ │ │ ├── di │ │ │ │ ├── EditorFeatureDependencies.kt │ │ │ │ ├── component │ │ │ │ │ └── EditorComponent.kt │ │ │ │ ├── holder │ │ │ │ │ └── EditorComponentHolder.kt │ │ │ │ └── modules │ │ │ │ │ ├── DataModule.kt │ │ │ │ │ ├── DomainModule.kt │ │ │ │ │ └── PresentationModule.kt │ │ │ │ ├── domain │ │ │ │ ├── common │ │ │ │ │ ├── EditorEitherWrapper.kt │ │ │ │ │ ├── EditorErrorHandler.kt │ │ │ │ │ ├── TemplateConvertors.kt │ │ │ │ │ └── TimeTaskConvertors.kt │ │ │ │ ├── entites │ │ │ │ │ ├── EditModel.kt │ │ │ │ │ └── EditorFailures.kt │ │ │ │ ├── interactors │ │ │ │ │ ├── CategoriesInteractor.kt │ │ │ │ │ ├── EditorInteractor.kt │ │ │ │ │ ├── TemplatesInteractor.kt │ │ │ │ │ ├── TimeTaskInteractor.kt │ │ │ │ │ └── UndefinedTasksInteractor.kt │ │ │ │ └── repositories │ │ │ │ │ └── EditorRepository.kt │ │ │ │ ├── navigation │ │ │ │ ├── EditorFeatureStarterImpl.kt │ │ │ │ └── NavigationManager.kt │ │ │ │ └── presentation │ │ │ │ ├── mappers │ │ │ │ ├── CategoriesUiMapper.kt │ │ │ │ ├── EditorFailuresMapper.kt │ │ │ │ ├── EditorModelMappers.kt │ │ │ │ ├── PriorirtyMapper.kt │ │ │ │ ├── TemplateMapper.kt │ │ │ │ └── UndefinedTaskUiMapper.kt │ │ │ │ ├── models │ │ │ │ ├── PriorityParameters.kt │ │ │ │ ├── categories │ │ │ │ │ ├── CategoriesUi.kt │ │ │ │ │ ├── MainCategoryUi.kt │ │ │ │ │ └── SubCategoryUi.kt │ │ │ │ ├── editmodel │ │ │ │ │ ├── EditModelUi.kt │ │ │ │ │ ├── EditParameters.kt │ │ │ │ │ └── TaskNotifications.kt │ │ │ │ ├── tasks │ │ │ │ │ └── UndefinedTaskUi.kt │ │ │ │ └── template │ │ │ │ │ └── TemplateUi.kt │ │ │ │ ├── theme │ │ │ │ ├── EditorTheme.kt │ │ │ │ ├── EditorThemeRes.kt │ │ │ │ └── tokens │ │ │ │ │ ├── EditorIcons.kt │ │ │ │ │ └── EditorStrings.kt │ │ │ │ └── ui │ │ │ │ └── editor │ │ │ │ ├── EditorContent.kt │ │ │ │ ├── EditorScreen.kt │ │ │ │ ├── contract │ │ │ │ └── EditorContract.kt │ │ │ │ ├── processors │ │ │ │ ├── EditorWorkProcessor.kt │ │ │ │ └── TimeTaskWorkProcessor.kt │ │ │ │ ├── screenmodel │ │ │ │ ├── CategoryValidator.kt │ │ │ │ ├── EditorEffectCommunicator.kt │ │ │ │ ├── EditorScreenModel.kt │ │ │ │ ├── EditorStateCommunicator.kt │ │ │ │ └── TimeRangeValidator.kt │ │ │ │ └── views │ │ │ │ ├── CategoryChooser.kt │ │ │ │ ├── EditorTopAppBar.kt │ │ │ │ ├── ParameterChooser.kt │ │ │ │ ├── SubCategoryChooser.kt │ │ │ │ ├── TaskNotificationsMenu.kt │ │ │ │ ├── TemplatesBottomSheet.kt │ │ │ │ ├── TimeField.kt │ │ │ │ └── UndefinedTasksBottomSheet.kt │ │ └── res │ │ │ └── drawable │ │ │ ├── ic_add.xml │ │ │ ├── ic_arrow_righ.xml │ │ │ ├── ic_chart_check.xml │ │ │ ├── ic_close.xml │ │ │ ├── ic_delete.xml │ │ │ ├── ic_end_time.xml │ │ │ ├── ic_favorite.xml │ │ │ ├── ic_favorite_border.xml │ │ │ ├── ic_more.xml │ │ │ ├── ic_note_outline.xml │ │ │ ├── ic_notes.xml │ │ │ ├── ic_notifications_outline.xml │ │ │ ├── ic_priority_high.xml │ │ │ ├── ic_repeat.xml │ │ │ ├── ic_start_time.xml │ │ │ ├── ic_sub_category.xml │ │ │ ├── ic_task.xml │ │ │ └── ic_timer.xml │ │ └── test │ │ └── java │ │ └── ru │ │ └── aleshin │ │ └── features │ │ └── editor │ │ └── impl │ │ ├── domain │ │ ├── TemplatesInteractorTest.kt │ │ └── TimeTaskInteractorTest.kt │ │ └── ui │ │ └── EditorScreenModelTest.kt ├── home │ ├── api │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── home │ │ │ │ └── api │ │ │ │ └── ExampleInstrumentedTest.kt │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── home │ │ │ │ └── api │ │ │ │ ├── di │ │ │ │ └── HomeFeatureApi.kt │ │ │ │ └── navigation │ │ │ │ ├── HomeFeatureStarter.kt │ │ │ │ └── HomeScreens.kt │ │ │ └── test │ │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── home │ │ │ └── api │ │ │ └── ExampleUnitTest.kt │ └── impl │ │ ├── .gitignore │ │ ├── build.gradle.kts │ │ ├── consumer-rules.pro │ │ ├── proguard-rules.pro │ │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── home │ │ │ └── impl │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── ru │ │ │ │ └── aleshin │ │ │ │ └── features │ │ │ │ └── home │ │ │ │ └── impl │ │ │ │ ├── data │ │ │ │ ├── datasource │ │ │ │ │ ├── FeatureCategoryLocalDataSource.kt │ │ │ │ │ └── FeatureScheduleLocalDataSource.kt │ │ │ │ └── repositories │ │ │ │ │ ├── FeatureCategoryRepositoryImpl.kt │ │ │ │ │ └── FeatureScheduleRepositoryImpl.kt │ │ │ │ ├── di │ │ │ │ ├── HomeFeatureDependencies.kt │ │ │ │ ├── annontation │ │ │ │ │ └── Router.kt │ │ │ │ ├── component │ │ │ │ │ └── HomeComponent.kt │ │ │ │ ├── holder │ │ │ │ │ └── HomeComponentHolder.kt │ │ │ │ └── modules │ │ │ │ │ ├── DataModule.kt │ │ │ │ │ ├── DomainModule.kt │ │ │ │ │ ├── LocalNavigationModule.kt │ │ │ │ │ └── PresentationModule.kt │ │ │ │ ├── domain │ │ │ │ ├── common │ │ │ │ │ ├── HomeEitherWrapper.kt │ │ │ │ │ ├── HomeErrorHandler.kt │ │ │ │ │ └── TemplateConvertors.kt │ │ │ │ ├── entities │ │ │ │ │ ├── FoundedSchedule.kt │ │ │ │ │ ├── HomeFailures.kt │ │ │ │ │ └── TimeTaskImportanceException.kt │ │ │ │ ├── interactors │ │ │ │ │ ├── CategoriesInteractor.kt │ │ │ │ │ ├── RepeatTaskInteractor.kt │ │ │ │ │ ├── ScheduleInteractor.kt │ │ │ │ │ ├── SettingsInteractor.kt │ │ │ │ │ ├── SubCategoriesInteractor.kt │ │ │ │ │ ├── TemplatesInteractor.kt │ │ │ │ │ ├── TimeShiftInteractor.kt │ │ │ │ │ └── UndefinedTasksInteractor.kt │ │ │ │ └── repositories │ │ │ │ │ ├── FeatureCategoryRepository.kt │ │ │ │ │ └── FeatureScheduleRepository.kt │ │ │ │ ├── navigation │ │ │ │ ├── HomeFeatureStarterImpl.kt │ │ │ │ └── NavigationManager.kt │ │ │ │ └── presentation │ │ │ │ ├── common │ │ │ │ └── TimeTaskStatusController.kt │ │ │ │ ├── mapppers │ │ │ │ ├── HomeFailuresMapper.kt │ │ │ │ ├── PriorityMapper.kt │ │ │ │ ├── categories │ │ │ │ │ └── CategoriesUiMapper.kt │ │ │ │ ├── schedules │ │ │ │ │ ├── ScheduleDomainToUiMapper.kt │ │ │ │ │ ├── TimeTaskUiMapper.kt │ │ │ │ │ └── UndefinedTaskUiMapper.kt │ │ │ │ └── templates │ │ │ │ │ ├── SortedTypeMapper.kt │ │ │ │ │ └── TemplateUiMappers.kt │ │ │ │ ├── models │ │ │ │ ├── categories │ │ │ │ │ ├── CategoriesUi.kt │ │ │ │ │ ├── MainCategoryUi.kt │ │ │ │ │ └── SubCategoryUi.kt │ │ │ │ ├── schedules │ │ │ │ │ ├── ScheduleUi.kt │ │ │ │ │ ├── TaskNotificationsUi.kt │ │ │ │ │ ├── TimeTaskUi.kt │ │ │ │ │ └── UndefinedTaskUi.kt │ │ │ │ └── templates │ │ │ │ │ ├── TemplateUi.kt │ │ │ │ │ └── TemplatesSortedType.kt │ │ │ │ ├── theme │ │ │ │ ├── HomeTheme.kt │ │ │ │ ├── HomeThemeRes.kt │ │ │ │ └── tokens │ │ │ │ │ ├── HomeIcons.kt │ │ │ │ │ └── HomeStrings.kt │ │ │ │ └── ui │ │ │ │ ├── categories │ │ │ │ ├── CategoriesContent.kt │ │ │ │ ├── CategoriesScreen.kt │ │ │ │ ├── contract │ │ │ │ │ └── CategoriesContract.kt │ │ │ │ ├── screenmodel │ │ │ │ │ ├── CategoriesEffectCommunicator.kt │ │ │ │ │ ├── CategoriesScreenModel.kt │ │ │ │ │ ├── CategoriesStateCommunicator.kt │ │ │ │ │ └── CategoriesWorkProcessor.kt │ │ │ │ └── views │ │ │ │ │ ├── CategoriesTopAppBar.kt │ │ │ │ │ ├── MainCategoriesHorizontalList.kt │ │ │ │ │ ├── MainCategoryEditorDialog.kt │ │ │ │ │ ├── SubCategoriesList.kt │ │ │ │ │ └── SubCategoryEditorDialog.kt │ │ │ │ ├── common │ │ │ │ ├── CompactCategoriesChoosers.kt │ │ │ │ ├── OverviewScheduleItem.kt │ │ │ │ └── PriorityChooser.kt │ │ │ │ ├── details │ │ │ │ ├── DetailsContent.kt │ │ │ │ ├── DetailsScreen.kt │ │ │ │ ├── contract │ │ │ │ │ └── DetailsContract.kt │ │ │ │ ├── screenmodel │ │ │ │ │ ├── DetailsEffectCommunicator.kt │ │ │ │ │ ├── DetailsScreenModel.kt │ │ │ │ │ ├── DetailsStateCommunicator.kt │ │ │ │ │ └── DetailsWorkProcessor.kt │ │ │ │ └── views │ │ │ │ │ └── DetailsTopAppBar.kt │ │ │ │ ├── home │ │ │ │ ├── HomeContent.kt │ │ │ │ ├── HomeScreen.kt │ │ │ │ ├── contract │ │ │ │ │ └── HomeContract.kt │ │ │ │ ├── screenModel │ │ │ │ │ ├── HomeEffectCommunicator.kt │ │ │ │ │ ├── HomeScreenModel.kt │ │ │ │ │ ├── HomeStateCommunicator.kt │ │ │ │ │ ├── NavigationWorkProcessor.kt │ │ │ │ │ └── ScheduleWorkProcessor.kt │ │ │ │ └── views │ │ │ │ │ ├── DateChooser.kt │ │ │ │ │ ├── EmptyDateView.kt │ │ │ │ │ ├── HomeTopAppBar.kt │ │ │ │ │ ├── TimeTaskLazyItems.kt │ │ │ │ │ └── TimeTaskView.kt │ │ │ │ ├── nav │ │ │ │ └── NavScreen.kt │ │ │ │ ├── overview │ │ │ │ ├── OverviewContent.kt │ │ │ │ ├── OverviewScreen.kt │ │ │ │ ├── contract │ │ │ │ │ └── OverviewContract.kt │ │ │ │ ├── screenmodel │ │ │ │ │ ├── OverviewEffectCommunicator.kt │ │ │ │ │ ├── OverviewScreenModel.kt │ │ │ │ │ ├── OverviewStateCommunicator.kt │ │ │ │ │ └── OverviewWorkProcessor.kt │ │ │ │ └── views │ │ │ │ │ ├── CurrentTimeTaskSection.kt │ │ │ │ │ ├── DeadlineChooser.kt │ │ │ │ │ ├── OverviewTopAppBar.kt │ │ │ │ │ ├── SchedulesSection.kt │ │ │ │ │ ├── TaskDateChooserDialog.kt │ │ │ │ │ ├── UndefinedTaskEditorDialog.kt │ │ │ │ │ └── UndefinedTaskSection.kt │ │ │ │ └── templates │ │ │ │ ├── TemplatesContent.kt │ │ │ │ ├── TemplatesScreen.kt │ │ │ │ ├── contract │ │ │ │ └── TemplatesContract.kt │ │ │ │ ├── screenmodel │ │ │ │ ├── TemplatesEffectCommunicator.kt │ │ │ │ ├── TemplatesScreenModel.kt │ │ │ │ ├── TemplatesStateCommunicator.kt │ │ │ │ └── TemplatesWorkProcessor.kt │ │ │ │ └── views │ │ │ │ ├── RepeatTimeMenu.kt │ │ │ │ ├── TemplateEditorDialog.kt │ │ │ │ ├── TemplatesItem.kt │ │ │ │ └── TemplatesTopAppBar.kt │ │ └── res │ │ │ └── drawable │ │ │ ├── ic_add.xml │ │ │ ├── ic_bell_off.xml │ │ │ ├── ic_calendar.xml │ │ │ ├── ic_cancel.xml │ │ │ ├── ic_category.xml │ │ │ ├── ic_charts.xml │ │ │ ├── ic_check.xml │ │ │ ├── ic_complete_task.xml │ │ │ ├── ic_end_time.xml │ │ │ ├── ic_info.xml │ │ │ ├── ic_menu.xml │ │ │ ├── ic_more.xml │ │ │ ├── ic_next.xml │ │ │ ├── ic_not_complete_task.xml │ │ │ ├── ic_not_found.xml │ │ │ ├── ic_notes.xml │ │ │ ├── ic_notification.xml │ │ │ ├── ic_off_repeat.xml │ │ │ ├── ic_play.xml │ │ │ ├── ic_previous.xml │ │ │ ├── ic_priority_high.xml │ │ │ ├── ic_remove.xml │ │ │ ├── ic_repeat.xml │ │ │ ├── ic_repeat_variant.xml │ │ │ ├── ic_schedule.xml │ │ │ ├── ic_start_time.xml │ │ │ ├── ic_stop.xml │ │ │ ├── ic_subcategory.xml │ │ │ ├── ic_time.xml │ │ │ ├── ic_timer.xml │ │ │ └── ic_update_repeat.xml │ │ └── test │ │ └── java │ │ └── ru │ │ └── aleshin │ │ └── features │ │ └── home │ │ └── impl │ │ └── ExampleUnitTest.kt └── settings │ ├── api │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── settings │ │ │ └── api │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── settings │ │ │ └── api │ │ │ ├── di │ │ │ └── SettingsFeatureApi.kt │ │ │ └── navigation │ │ │ └── SettingsFeatureStarter.kt │ │ └── test │ │ └── java │ │ └── ru │ │ └── aleshin │ │ └── features │ │ └── settings │ │ └── api │ │ └── ExampleUnitTest.kt │ └── impl │ ├── .gitignore │ ├── build.gradle.kts │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ ├── androidTest │ └── java │ │ └── ru │ │ └── aleshin │ │ └── features │ │ └── settings │ │ └── impl │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── ru │ │ │ └── aleshin │ │ │ └── features │ │ │ └── settings │ │ │ └── impl │ │ │ ├── di │ │ │ ├── SettingsFeatureDependencies.kt │ │ │ ├── component │ │ │ │ └── SettingsComponent.kt │ │ │ ├── holder │ │ │ │ └── SettingsComponentHolder.kt │ │ │ └── modules │ │ │ │ ├── DomainModule.kt │ │ │ │ └── PresentationModule.kt │ │ │ ├── domain │ │ │ ├── common │ │ │ │ ├── SettingsEitherWrapper.kt │ │ │ │ ├── SettingsErrorHandler.kt │ │ │ │ └── SettingsFailures.kt │ │ │ └── interactors │ │ │ │ ├── CategoriesInteractor.kt │ │ │ │ ├── ScheduleInteractor.kt │ │ │ │ ├── SettingsInteractor.kt │ │ │ │ ├── TemplatesInteractor.kt │ │ │ │ └── UndefinedTasksInteractor.kt │ │ │ ├── navigation │ │ │ ├── NavigationManager.kt │ │ │ └── SettingsFeatureStarterImpl.kt │ │ │ └── presentation │ │ │ ├── mappers │ │ │ ├── CryptoMapper.kt │ │ │ ├── FailureMapper.kt │ │ │ ├── LanguageTypeMapper.kt │ │ │ ├── SettingsUiMapper.kt │ │ │ ├── TaskSettingsUiMapper.kt │ │ │ └── ThemeSettingsUiMapper.kt │ │ │ ├── models │ │ │ ├── BackupModel.kt │ │ │ ├── CryptoAddress.kt │ │ │ ├── SettingsUi.kt │ │ │ ├── TasksSettingsUi.kt │ │ │ └── ThemeSettingsUi.kt │ │ │ ├── theme │ │ │ ├── SettingsTheme.kt │ │ │ ├── SettingsThemeRes.kt │ │ │ └── tokens │ │ │ │ ├── SettingsIcons.kt │ │ │ │ └── SettingsStrings.kt │ │ │ └── ui │ │ │ ├── donate │ │ │ ├── DonateContent.kt │ │ │ ├── DonateScreen.kt │ │ │ ├── contract │ │ │ │ └── DonateContract.kt │ │ │ ├── screenmodel │ │ │ │ ├── DonateScreenModel.kt │ │ │ │ └── DonateStateCommunicator.kt │ │ │ └── views │ │ │ │ └── DonateTopAppBar.kt │ │ │ └── settings │ │ │ ├── SettingsContent.kt │ │ │ ├── SettingsScreen.kt │ │ │ ├── contract │ │ │ ├── BackupContract.kt │ │ │ └── SettingsContract.kt │ │ │ ├── managers │ │ │ └── BackupManager.kt │ │ │ ├── screensmodel │ │ │ ├── DataWorkProcessor.kt │ │ │ ├── SettingsEffectCommunicator.kt │ │ │ ├── SettingsScreenModel.kt │ │ │ ├── SettingsStateCommunicator.kt │ │ │ └── SettingsWorkProcessor.kt │ │ │ └── views │ │ │ ├── AboutAppSection.kt │ │ │ ├── CalendarButtonBehaviorChooser.kt │ │ │ ├── ColorsTypeChooser.kt │ │ │ ├── DonateSection.kt │ │ │ ├── DynamicColorChooser.kt │ │ │ ├── LanguageChooser.kt │ │ │ ├── SettingsTopAppBar.kt │ │ │ └── ThemeColorsChooser.kt │ └── res │ │ └── drawable │ │ ├── ic_avax.xml │ │ ├── ic_back.xml │ │ ├── ic_bitcoin.xml │ │ ├── ic_bnb.xml │ │ ├── ic_content_copy.xml │ │ ├── ic_crypto.xml │ │ ├── ic_ecash_xec.xml │ │ ├── ic_ethereum.xml │ │ ├── ic_fantom.xml │ │ ├── ic_github.xml │ │ ├── ic_litecoin.xml │ │ ├── ic_menu.xml │ │ └── ic_tron.xml │ └── test │ └── java │ └── ru │ └── aleshin │ └── features │ └── settings │ └── impl │ └── ExampleUnitTest.kt ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── module-injector ├── .gitignore ├── build.gradle.kts ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── ru │ │ └── aleshin │ │ └── module_injector │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── ru │ │ └── aleshin │ │ └── module_injector │ │ ├── BaseComponentHolder.kt │ │ ├── BaseFeatureApi.kt │ │ └── BaseFeatureDependencies.kt │ └── test │ └── java │ └── ru │ └── aleshin │ └── module_injector │ └── ExampleUnitTest.kt └── settings.gradle.kts /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | /buildSrc/build 11 | .DS_Store 12 | .kotlin 13 | /build 14 | /captures 15 | .externalNativeBuild 16 | .cxx 17 | local.properties 18 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/copyright/Copyright.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/deploymentTargetDropDown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /.idea/detekt.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 12 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /.idea/ktlint.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /release 3 | /debug -------------------------------------------------------------------------------- /app/debug/app-debug.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/debug/app-debug.apk -------------------------------------------------------------------------------- /app/debug/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "ru.aleshin.timeplanner.debug", 8 | "variantName": "debug", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "attributes": [], 14 | "versionCode": 29, 15 | "versionName": "0.9.0", 16 | "outputFile": "app-debug.apk" 17 | } 18 | ], 19 | "elementType": "File", 20 | "minSdkVersionForDexing": 24 21 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle.kts. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/release/app-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/release/app-release.apk -------------------------------------------------------------------------------- /app/release/app-release.apk.idsig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/release/app-release.apk.idsig -------------------------------------------------------------------------------- /app/release/baselineProfiles/0/app-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/release/baselineProfiles/0/app-release.dm -------------------------------------------------------------------------------- /app/release/baselineProfiles/1/app-release.dm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/release/baselineProfiles/1/app-release.dm -------------------------------------------------------------------------------- /app/release/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "ru.aleshin.timeplanner", 8 | "variantName": "release", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "attributes": [], 14 | "versionCode": 29, 15 | "versionName": "0.9.0", 16 | "outputFile": "app-release.apk" 17 | } 18 | ], 19 | "elementType": "File", 20 | "baselineProfiles": [ 21 | { 22 | "minApi": 28, 23 | "maxApi": 30, 24 | "baselineProfiles": [ 25 | "baselineProfiles/1/app-release.dm" 26 | ] 27 | }, 28 | { 29 | "minApi": 31, 30 | "maxApi": 34, 31 | "baselineProfiles": [ 32 | "baselineProfiles/0/app-release.dm" 33 | ] 34 | } 35 | ], 36 | "minSdkVersionForDexing": 24 37 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/ru/aleshin/timeplanner/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.timeplanner 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.timeplanner", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/fdroid/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/fdroid/java/ru/aleshin/timeplanner/data/AnalyticsServiceImpl.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.timeplanner.domain 17 | 18 | import ru.aleshin.core.utils.platform.services.AnalyticsService 19 | 20 | /** 21 | * @author Stanislav Aleshin on 13.04.2025. 22 | */ 23 | class AnalyticsServiceImpl : AnalyticsService { 24 | override fun trackEvent(name: String, eventParams: Map) = Unit 25 | override fun initializeService(context: Context) = Unit 26 | } -------------------------------------------------------------------------------- /app/src/huawei/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /app/src/main/assets/database/categories_prepopulate.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/assets/database/categories_prepopulate.db -------------------------------------------------------------------------------- /app/src/main/assets/database/settings_prepopulated.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/assets/database/settings_prepopulated.db -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/ic_planner_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/ic_planner_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/ru/aleshin/timeplanner/di/annotation/Navigations.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.timeplanner.di.annotation 17 | 18 | import javax.inject.Qualifier 19 | 20 | /** 21 | * @author Stanislav Aleshin on 18.02.2023. 22 | */ 23 | @Qualifier 24 | annotation class GlobalNavigation 25 | 26 | @Qualifier 27 | annotation class TabNavigation 28 | -------------------------------------------------------------------------------- /app/src/main/java/ru/aleshin/timeplanner/domain/common/MainFailures.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.timeplanner.domain.common 17 | 18 | import kotlinx.parcelize.Parcelize 19 | import ru.aleshin.core.utils.functional.DomainFailures 20 | 21 | /** 22 | * @author Stanislav Aleshin on 14.02.2023. 23 | */ 24 | @Parcelize 25 | sealed class MainFailures : DomainFailures { 26 | data class OtherError(val throwable: Throwable) : MainFailures() 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/ru/aleshin/timeplanner/domain/entities/TimeTasks.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.timeplanner.domain.entities 17 | 18 | import kotlinx.serialization.Serializable 19 | import ru.aleshin.core.domain.entities.schedules.TimeTask 20 | 21 | /** 22 | * @author Stanislav Aleshin on 28.04.2024. 23 | */ 24 | @Serializable 25 | data class TimeTasks(val tasks: List = emptyList()) -------------------------------------------------------------------------------- /app/src/main/java/ru/aleshin/timeplanner/presentation/ui/main/contract/MainDeps.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.timeplanner.presentation.ui.main.contract 17 | 18 | import kotlinx.parcelize.Parcelize 19 | import ru.aleshin.core.utils.platform.screenmodel.ScreenDependencies 20 | 21 | /** 22 | * @author Stanislav Aleshin on 16.11.2024. 23 | */ 24 | @Parcelize 25 | data class MainDeps(val screenTarget: DeepLinkTarget) : ScreenDependencies -------------------------------------------------------------------------------- /app/src/main/res/drawable/circular_background.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rouned_background_16_dp.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rouned_background_24_dp.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/rouned_background_8_dp.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/stoke_rouned_background.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-hdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-mdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /app/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 22 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | #FCFCFC 18 | #201A1B 19 | #0D91DA 20 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | TimePlanner 18 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 21 | -------------------------------------------------------------------------------- /app/src/rustore/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /config/detekt/detekt.yml: -------------------------------------------------------------------------------- 1 | naming: 2 | FunctionNaming: 3 | ignoreAnnotated: ['Composable'] 4 | MatchingDeclarationName: 5 | mustBeFirst: false 6 | complexity: 7 | LongMethod: 8 | threshold: 100 9 | LongParameterList: 10 | functionThreshold: 25 11 | constructorThreshold: 15 12 | TooManyFunctions: 13 | ignoreAnnotatedFunctions: ['Preview'] 14 | formatting: 15 | FinalNewline: 16 | insertFinalNewLine: false 17 | style: 18 | MagicNumber: 19 | ignorePropertyDeclaration: true 20 | ignoreCompanionObjectPropertyDeclaration: true 21 | UnusedPrivateMember: 22 | ignoreAnnotated: ['Preview'] 23 | NewLineAtEndOfFile: 24 | active: false -------------------------------------------------------------------------------- /core/data/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/data/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/core/data/consumer-rules.pro -------------------------------------------------------------------------------- /core/data/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core/data/src/androidTest/java/ru/aleshin/core/data/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.core.data 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("ru.aleshin.core.data.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /core/data/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core/data/src/main/java/ru/aleshin/core/data/mappers/schedules/DailyScheduleDataMapper.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.data.mappers.schedules 17 | 18 | import ru.aleshin.core.data.models.schedules.DailyScheduleEntity 19 | import ru.aleshin.core.domain.entities.schedules.Schedule 20 | 21 | /** 22 | * @author Stanislav Aleshin on 25.02.2023. 23 | */ 24 | fun Schedule.mapToData() = DailyScheduleEntity(date = date) 25 | -------------------------------------------------------------------------------- /core/data/src/main/java/ru/aleshin/core/data/models/schedules/DailyScheduleEntity.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.data.models.schedules 17 | 18 | import androidx.room.Entity 19 | import androidx.room.PrimaryKey 20 | 21 | /** 22 | * @author Stanislav Aleshin on 21.02.2023. 23 | */ 24 | @Entity(tableName = "dailySchedules") 25 | data class DailyScheduleEntity( 26 | @PrimaryKey val date: Long, 27 | ) 28 | -------------------------------------------------------------------------------- /core/data/src/test/java/ru/aleshin/core/data/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.core.data 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core/domain/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/domain/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/core/domain/consumer-rules.pro -------------------------------------------------------------------------------- /core/domain/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core/domain/src/androidTest/java/ru/aleshin/core/domain/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.core.domain 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("ru.aleshin.core.domain.test", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /core/domain/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/categories/DefaultCategoryType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.categories 17 | 18 | /** 19 | * @author Stanislav Aleshin on 15.04.2023. 20 | */ 21 | enum class DefaultCategoryType { 22 | WORK, 23 | REST, 24 | SPORT, 25 | SLEEP, 26 | CULTURE, 27 | AFFAIRS, 28 | TRANSPORT, 29 | STUDY, 30 | EAT, 31 | ENTERTAINMENTS, 32 | EMPTY, 33 | HYGIENE, 34 | HEALTH, 35 | SHOPPING, 36 | OTHER, 37 | } 38 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/categories/MainCategory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.categories 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | /** 21 | * @author Stanislav Aleshin on 23.02.2023. 22 | */ 23 | @Serializable 24 | data class MainCategory( 25 | val id: Int = 0, 26 | val customName: String? = null, 27 | val default: DefaultCategoryType? = DefaultCategoryType.EMPTY, 28 | ) 29 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/categories/SubCategory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.categories 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | /** 21 | * @author Stanislav Aleshin on 21.02.2023. 22 | */ 23 | @Serializable 24 | data class SubCategory( 25 | val id: Int = 0, 26 | val mainCategory: MainCategory = MainCategory(), 27 | val name: String? = null, 28 | val description: String? = null, 29 | ) 30 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/schedules/DailyScheduleStatus.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.schedules 17 | 18 | /** 19 | * @author Stanislav Aleshin on 21.02.2023. 20 | */ 21 | enum class DailyScheduleStatus { 22 | REALIZED, ACCOMPLISHMENT, PLANNED 23 | } 24 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/schedules/TaskPriority.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.schedules 17 | 18 | import kotlinx.serialization.Serializable 19 | 20 | /** 21 | * @author Stanislav Aleshin on 16.01.2024. 22 | */ 23 | @Serializable 24 | enum class TaskPriority { 25 | STANDARD, MEDIUM, MAX; 26 | 27 | fun isImportant() = this != STANDARD 28 | } -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/schedules/TimeTaskStatus.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.schedules 17 | 18 | /** 19 | * @author Stanislav Aleshin on 21.02.2023. 20 | */ 21 | enum class TimeTaskStatus { 22 | PLANNED, RUNNING, COMPLETED 23 | } 24 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/settings/CalendarButtonBehavior.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.settings 17 | 18 | /** 19 | * @author Stanislav Aleshin on 22.10.2023. 20 | */ 21 | enum class CalendarButtonBehavior { 22 | OPEN_CALENDAR, SET_CURRENT_DATE 23 | } 24 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/settings/ColorsType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.settings 17 | 18 | /** 19 | * @author Stanislav Aleshin on 06.10.2023. 20 | */ 21 | enum class ColorsType { 22 | PINK, PURPLE, RED, BLUE 23 | } 24 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/settings/LanguageType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.settings 17 | 18 | /** 19 | * @author Stanislav Aleshin on 17.02.2023. 20 | */ 21 | enum class LanguageType(val code: String?) { 22 | DEFAULT(null), EN("en"), RU("ru"), DE("de"), ES("es"), FA("fa"), FR("fr"), PT_BR("pt-br"), TR("tr"), VN("vn"), PL("pl") 23 | } 24 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/settings/Settings.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.settings 17 | 18 | /** 19 | * @author Stanislav Aleshin on 17.02.2023. 20 | */ 21 | data class Settings( 22 | val themeSettings: ThemeSettings, 23 | val tasksSettings: TasksSettings, 24 | ) 25 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/settings/ThemeSettings.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.settings 17 | 18 | /** 19 | * @author Stanislav Aleshin on 17.02.2023. 20 | */ 21 | data class ThemeSettings( 22 | val language: LanguageType = LanguageType.DEFAULT, 23 | val themeColors: ThemeType = ThemeType.DEFAULT, 24 | val colorsType: ColorsType = ColorsType.PINK, 25 | val isDynamicColorEnable: Boolean = false, 26 | ) 27 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/settings/ThemeType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.settings 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | enum class ThemeType { 22 | DEFAULT, LIGHT, DARK 23 | } 24 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/settings/ViewToggleStatus.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.settings 17 | 18 | /** 19 | * @author Stanislav Aleshin on 18.01.2024. 20 | */ 21 | enum class ViewToggleStatus { 22 | EXPANDED, COMPACT 23 | } -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/entities/template/RepeatTimeType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.entities.template 17 | 18 | /** 19 | * @author Stanislav Aleshin on 25.02.2023. 20 | */ 21 | enum class RepeatTimeType { 22 | WEEK_DAY, 23 | WEEK_DAY_IN_MONTH, 24 | MONTH_DAY, 25 | YEAR_DAY, 26 | } 27 | -------------------------------------------------------------------------------- /core/domain/src/main/java/ru/aleshin/core/domain/repository/TasksSettingsRepository.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.domain.repository 17 | 18 | import kotlinx.coroutines.flow.Flow 19 | import ru.aleshin.core.domain.entities.settings.TasksSettings 20 | 21 | /** 22 | * @author Stanislav Aleshin on 15.09.2023. 23 | */ 24 | interface TasksSettingsRepository { 25 | fun fetchSettings(): Flow 26 | suspend fun updateSettings(settings: TasksSettings) 27 | } 28 | -------------------------------------------------------------------------------- /core/domain/src/test/java/ru/aleshin/core/domain/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.core.domain 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /core/ui/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/ui/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/core/ui/consumer-rules.pro -------------------------------------------------------------------------------- /core/ui/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle.kts. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core/ui/src/androidTest/java/ru/aleshin/core/ui/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.core.ui 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.core.ui.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /core/ui/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /core/ui/src/main/java/ru/aleshin/core/ui/mappers/PriorityMapper.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.ui.mappers 17 | 18 | import ru.aleshin.core.domain.entities.schedules.TaskPriority 19 | import ru.aleshin.core.ui.views.MonogramPriority 20 | 21 | /** 22 | * @author Stanislav Aleshin on 16.01.2024. 23 | */ 24 | fun TaskPriority.mapToUi() = when (this) { 25 | TaskPriority.STANDARD -> MonogramPriority.STANDARD 26 | TaskPriority.MEDIUM -> MonogramPriority.MEDIUM 27 | TaskPriority.MAX -> MonogramPriority.MAX 28 | } -------------------------------------------------------------------------------- /core/ui/src/main/java/ru/aleshin/core/ui/theme/material/Shapes.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.ui.theme.material 17 | 18 | import androidx.compose.material3.Shapes 19 | 20 | /** 21 | * @author Stanislav Aleshin on 14.02.2023. 22 | */ 23 | val baseShapes = Shapes() 24 | -------------------------------------------------------------------------------- /core/ui/src/main/java/ru/aleshin/core/ui/views/DurationTemplate.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.ui.views 17 | 18 | /** 19 | * @author Stanislav Aleshin on 03.03.2023. 20 | */ 21 | enum class DurationTemplate(val hours: Int, val minutes: Int) { 22 | TEN_MINUTES(0, 10), 23 | THIRTY_MINUTES(0, 30), 24 | ONE_HOUR(1, 0), 25 | FOUR_HOUR(4, 0), 26 | } 27 | -------------------------------------------------------------------------------- /core/ui/src/main/java/ru/aleshin/core/ui/views/TopAppBarAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.ui.views 17 | 18 | import androidx.compose.runtime.Composable 19 | 20 | /** 21 | * @author Stanislav Aleshin on 28.02.2023. 22 | */ 23 | interface TopAppBarAction { 24 | val icon: Int? @Composable get 25 | val title: String @Composable get 26 | val isAlwaysShow: Boolean 27 | } 28 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_arrow_drop_down.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_arrow_drop_up.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_arrow_right.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_check.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_culture.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_dashboard.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_home.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_home_outlined.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_keyboard_outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_medicine.xml: -------------------------------------------------------------------------------- 1 | 6 | 11 | 16 | 21 | 22 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_reset.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_sleep.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/core/ui/src/main/res/drawable/ic_splash.png -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_store.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_study.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /core/ui/src/main/res/drawable/ic_time_planner_circular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/core/ui/src/main/res/drawable/ic_time_planner_circular.png -------------------------------------------------------------------------------- /core/ui/src/test/java/ru/aleshin/core/ui/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.ui 17 | 18 | import org.junit.Assert.* 19 | import org.junit.Test 20 | 21 | /** 22 | * Example local unit test, which will execute on the development machine (host). 23 | * 24 | * See [testing documentation](http://d.android.com/tools/testing). 25 | */ 26 | class ExampleUnitTest { 27 | @Test 28 | fun addition_isCorrect() { 29 | assertEquals(4, 2 + 2) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /core/utils/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /core/utils/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/core/utils/consumer-rules.pro -------------------------------------------------------------------------------- /core/utils/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle.kts. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /core/utils/src/androidTest/java/ru/aleshin/core/utils/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.core.utils 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.core.utils.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /core/utils/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/di/ApplicationContext.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.di 17 | 18 | import javax.inject.Qualifier 19 | 20 | /** 21 | * @author Stanislav Aleshin on 14.02.2023. 22 | */ 23 | @Qualifier 24 | annotation class ApplicationContext 25 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/di/FeatureScope.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.di 17 | 18 | import javax.inject.Scope 19 | 20 | /** 21 | * @author Stanislav Aleshin on 14.02.2023. 22 | */ 23 | @Scope 24 | annotation class FeatureScope 25 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/di/ScreenKey.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.di 17 | 18 | import cafe.adriel.voyager.core.screen.Screen 19 | import javax.inject.Qualifier 20 | import kotlin.reflect.KClass 21 | 22 | /** 23 | * @author Stanislav Aleshin on 19.02.2023. 24 | */ 25 | @Qualifier 26 | annotation class ScreenKey(val screen: KClass) 27 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/di/ScreenModelKey.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.di 17 | 18 | import cafe.adriel.voyager.core.model.ScreenModel 19 | import javax.inject.Qualifier 20 | import kotlin.reflect.KClass 21 | 22 | /** 23 | * @author Stanislav Aleshin on 18.02.2023. 24 | */ 25 | @Qualifier 26 | annotation class ScreenModelKey(val screenModel: KClass) 27 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/functional/DomainFailures.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.functional 17 | 18 | import android.os.Parcelable 19 | 20 | /** 21 | * @author Stanislav Aleshin on 14.02.2023. 22 | */ 23 | interface DomainFailures : Parcelable 24 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/functional/Mapper.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.functional 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | interface Mapper { 22 | fun map(input: I): O 23 | } 24 | 25 | interface ParameterizedMapper { 26 | fun map(input: I, parameter: P): O 27 | } 28 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/functional/TimeFormat.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.functional 17 | 18 | /** 19 | * @author Stanislav Aleshin on 09.06.2023. 20 | */ 21 | enum class TimeFormat { 22 | PM, AM 23 | } 24 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/functional/TimeShiftException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.functional 17 | 18 | /** 19 | * @author Stanislav Aleshin on 30.03.2023. 20 | */ 21 | class TimeShiftException : Exception() 22 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/handlers/ErrorHandler.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.handlers 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | interface ErrorHandler { 22 | fun handle(throwable: Throwable): E 23 | } 24 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/navigation/Command.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.navigation 17 | 18 | import cafe.adriel.voyager.core.screen.Screen 19 | 20 | /** 21 | * @author Stanislav Aleshin on 14.02.2023. 22 | */ 23 | sealed class Command { 24 | data class Forward(val screen: Screen) : Command() 25 | data class Replace(val screen: Screen) : Command() 26 | data class ReplaceAll(val screen: Screen) : Command() 27 | object Back : Command() 28 | } 29 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/navigation/CommandListenerManager.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.navigation 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | interface CommandListenerManager { 22 | fun setListener(listener: CommandListener) 23 | fun removeListener() 24 | } 25 | 26 | typealias CommandListener = (Command) -> Unit 27 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/notifications/parameters/NotificationDefaults.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.notifications.parameters 17 | 18 | /** 19 | * @author Stanislav Aleshin on 28.03.2023. 20 | */ 21 | data class NotificationDefaults( 22 | val isSound: Boolean = false, 23 | val isVibrate: Boolean = false, 24 | val isLights: Boolean = false, 25 | ) 26 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/notifications/parameters/NotificationProgress.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.notifications.parameters 17 | 18 | /** 19 | * @author Stanislav Aleshin on 28.03.2023. 20 | */ 21 | data class NotificationProgress(val value: Int, val max: Int, val isIndeterminate: Boolean) 22 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/communications/state/ViewStateCollect.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.communications.state 17 | 18 | import kotlinx.coroutines.flow.FlowCollector 19 | import ru.aleshin.core.utils.platform.screenmodel.contract.BaseViewState 20 | 21 | /** 22 | * @author Stanislav Aleshin on 14.02.2023. 23 | */ 24 | interface ViewStateCollect { 25 | suspend fun collectState(collector: FlowCollector) 26 | } 27 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/screenmodel/Init.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.screenmodel 17 | 18 | /** 19 | * @author Stanislav Aleshin on 01.06.2023. 20 | */ 21 | interface Init { 22 | fun init(deps: D) 23 | } 24 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/screenmodel/Reducer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.screenmodel 17 | 18 | import ru.aleshin.core.utils.platform.screenmodel.contract.BaseAction 19 | import ru.aleshin.core.utils.platform.screenmodel.contract.BaseViewState 20 | 21 | /** 22 | * @author Stanislav Aleshin on 18.03.2023. 23 | */ 24 | interface Reducer { 25 | suspend fun reduce(action: A, currentState: S): S 26 | } 27 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/screenmodel/ScreenDependencies.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package ru.aleshin.core.utils.platform.screenmodel 18 | 19 | import android.os.Parcelable 20 | import kotlinx.parcelize.Parcelize 21 | 22 | 23 | /** 24 | * @author Stanislav Aleshin on 14.04.2024. 25 | */ 26 | interface ScreenDependencies : Parcelable 27 | 28 | @Parcelize 29 | object EmptyDeps : ScreenDependencies -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/screenmodel/contract/BaseAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.screenmodel.contract 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | interface BaseAction 22 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/screenmodel/contract/BaseEffect.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.screenmodel.contract 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | interface BaseUiEffect 22 | 23 | interface EmptyUiEffect : BaseUiEffect 24 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/screenmodel/contract/BaseEvent.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.screenmodel.contract 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | interface BaseEvent 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/screenmodel/contract/BaseViewState.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.screenmodel.contract 17 | 18 | import android.os.Parcelable 19 | 20 | /** 21 | * @author Stanislav Aleshin on 14.02.2023. 22 | */ 23 | interface BaseViewState : Parcelable 24 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/services/AnalyticsService.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.services 17 | 18 | /** 19 | * @author Stanislav Aleshin on 13.04.2025. 20 | */ 21 | interface AnalyticsService { 22 | fun trackEvent(name: String, eventParams: Map) 23 | fun initializeService() 24 | } -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/services/AppService.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package ru.aleshin.core.utils.platform.services 18 | 19 | /** 20 | * @author Stanislav Aleshin on 11.09.2024. 21 | */ 22 | interface AppService { 23 | 24 | val flavor: Flavor 25 | 26 | val isAvailableServices: Boolean 27 | 28 | fun initializeApp() 29 | } -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/services/CrashlyticsService.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package ru.aleshin.core.utils.platform.services 18 | 19 | /** 20 | * @author Stanislav Aleshin on 11.09.2024. 21 | */ 22 | interface CrashlyticsService { 23 | fun sendLog(message: String) 24 | fun recordException(exception: Throwable, issueKey: String, ) 25 | fun initializeService() 26 | } -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/platform/services/Flavor.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.platform.services 17 | 18 | /** 19 | * @author Stanislav Aleshin on 13.04.2025. 20 | */ 21 | enum class Flavor { 22 | RUSTORE, FDROID, HUAWEI 23 | } -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/validation/ValidateError.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.validation 17 | 18 | import android.os.Parcelable 19 | 20 | /** 21 | * @author Stanislav Aleshin on 10.03.2023. 22 | */ 23 | interface ValidateError : Parcelable 24 | -------------------------------------------------------------------------------- /core/utils/src/main/java/ru/aleshin/core/utils/validation/Validator.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils.validation 17 | 18 | /** 19 | * @author Stanislav Aleshin on 26.03.2023. 20 | */ 21 | interface Validator { 22 | fun validate(data: D): ValidateResult 23 | } 24 | -------------------------------------------------------------------------------- /core/utils/src/test/java/ru/aleshin/core/utils/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.core.utils 17 | 18 | import org.junit.Assert.* 19 | import org.junit.Test 20 | 21 | /** 22 | * Example local unit test, which will execute on the development machine (host). 23 | * 24 | * See [testing documentation](http://d.android.com/tools/testing). 25 | */ 26 | class ExampleUnitTest { 27 | @Test 28 | fun addition_isCorrect() { 29 | assertEquals(4, 2 + 2) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | TimePlanner is an all-in-one app for creating and managing your daily schedule. With its intuitive interface, you can easily create a personalized schedule, track your tasks, and stay on top of your priorities. 2 | 3 | Key features of TimePlanner include: 4 | - Easy sorting of tasks by priority and category 5 | - Smart reminders for events and deadlines 6 | - Built-in note taking for tasks and reminders 7 | - Templates for recurring tasks 8 | - Automatic repetition of scheduled tasks 9 | - Prevention of overlapping events in your schedule 10 | - Detailed analytics and stats for tracking your productivity 11 | - Backup and sync of data across devices 12 | - Over 10 customizable color themes and widget options 13 | - Support for 10+ languages 14 | 15 | With TimePlanner, you can take control of your time and get more done in less time. Say goodbye to chaos and hello to organized productivity! 16 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | TimePlanner - plan your day with ease, speed, and pleasure! 2 | -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/full_description.txt: -------------------------------------------------------------------------------- 1 | TimePlanner — это универсальное приложение для удобного планирования расписаний и отслеживания повседневных задач. Создавайте чёткий распорядок, следите за делами и управляйте временем эффективно — всё в одном приложении. 2 | 3 | Возможности TimePlanner: 4 | • Удобная сортировка задач по приоритету, категориям и подкатегориям 5 | • Умные напоминания о начале и завершении событий 6 | • Встроенные заметки для задач 7 | • Шаблоны для повторяющихся дел 8 | • Автоматическое повторение задач по шаблонам 9 | • Предотвращение наложения задач во времени 10 | • Подробная аналитика и статистика 11 | • Резервное копирование и перенос данных 12 | • Более 10 цветовых тем и виджеты для рабочего стола 13 | • Поддержка 10+ языков 14 | 15 | Превратите хаос в порядок и возьмите управление временем в свои руки с TimePlanner! -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/ru/images/phoneScreenshots/1.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/ru/images/phoneScreenshots/2.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/ru/images/phoneScreenshots/3.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/ru/images/phoneScreenshots/4.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/ru/images/phoneScreenshots/5.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/images/phoneScreenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/fastlane/metadata/android/ru/images/phoneScreenshots/6.png -------------------------------------------------------------------------------- /fastlane/metadata/android/ru/short_description.txt: -------------------------------------------------------------------------------- 1 | TimePlanner — планируй день легко, быстро и с удовольствием! -------------------------------------------------------------------------------- /features/analytics/api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /features/analytics/api/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/features/analytics/api/consumer-rules.pro -------------------------------------------------------------------------------- /features/analytics/api/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /features/analytics/api/src/androidTest/java/ru/aleshin/features/analytics/api/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.features.analytics.api 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.features.analytics.api.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/analytics/api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/analytics/api/src/main/java/ru/aleshin/features/analytics/api/di/AnalyticsFeatureApi.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.analytics.api.di 17 | 18 | import ru.aleshin.features.analytics.api.navigation.AnalyticsFeatureStarter 19 | import ru.aleshin.module_injector.BaseFeatureApi 20 | 21 | /** 22 | * @author Stanislav Aleshin on 30.03.2023. 23 | */ 24 | interface AnalyticsFeatureApi : BaseFeatureApi { 25 | fun fetchStarter(): AnalyticsFeatureStarter 26 | } 27 | -------------------------------------------------------------------------------- /features/analytics/api/src/main/java/ru/aleshin/features/analytics/api/navigation/AnalyticsFeatureStarter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.analytics.api.navigation 17 | 18 | import cafe.adriel.voyager.core.screen.Screen 19 | 20 | /** 21 | * @author Stanislav Aleshin on 30.03.2023. 22 | */ 23 | interface AnalyticsFeatureStarter { 24 | fun provideMainScreen(): Screen 25 | } 26 | -------------------------------------------------------------------------------- /features/analytics/impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /features/analytics/impl/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/features/analytics/impl/consumer-rules.pro -------------------------------------------------------------------------------- /features/analytics/impl/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /features/analytics/impl/src/androidTest/java/ru/aleshin/features/analytics/impl/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.features.analytics.impl 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.features.analytics.impl.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/analytics/impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/analytics/impl/src/main/java/ru/aleshin/features/analytics/impl/domain/entities/AnalyticsFailure.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.analytics.impl.domain.entities 17 | 18 | import kotlinx.parcelize.Parcelize 19 | import ru.aleshin.core.utils.functional.DomainFailures 20 | 21 | /** 22 | * @author Stanislav Aleshin on 22.04.2023. 23 | */ 24 | @Parcelize 25 | internal sealed class AnalyticsFailure : DomainFailures { 26 | data class OtherError(val throwable: Throwable) : AnalyticsFailure() 27 | } 28 | -------------------------------------------------------------------------------- /features/analytics/impl/src/main/java/ru/aleshin/features/analytics/impl/domain/entities/PlanningAnalytic.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.analytics.impl.domain.entities 17 | 18 | import ru.aleshin.core.domain.entities.schedules.TimeTask 19 | import java.util.Date 20 | 21 | internal data class PlanningAnalytic( 22 | val date: Date, 23 | val timeTasks: List, 24 | ) 25 | -------------------------------------------------------------------------------- /features/analytics/impl/src/main/res/drawable/ic_time_complete.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /features/editor/api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /features/editor/api/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/features/editor/api/consumer-rules.pro -------------------------------------------------------------------------------- /features/editor/api/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /features/editor/api/src/androidTest/java/ru/aleshin/features/editor/api/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.features.editor.api 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.features.editor.api.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/editor/api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/editor/api/src/main/java/ru/aleshin/features/editor/api/di/EditorFeatureApi.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.editor.api.di 17 | 18 | import ru.aleshin.features.editor.api.navigations.EditorFeatureStarter 19 | import ru.aleshin.module_injector.BaseFeatureApi 20 | 21 | /** 22 | * @author Stanislav Aleshin on 08.03.2023. 23 | */ 24 | interface EditorFeatureApi : BaseFeatureApi { 25 | fun fetchStarter(): EditorFeatureStarter 26 | } 27 | -------------------------------------------------------------------------------- /features/editor/api/src/main/java/ru/aleshin/features/editor/api/navigations/EditorFeatureStarter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.editor.api.navigations 17 | 18 | import cafe.adriel.voyager.core.screen.Screen 19 | 20 | /** 21 | * @author Stanislav Aleshin on 08.03.2023. 22 | */ 23 | interface EditorFeatureStarter { 24 | fun provideEditorScreen(navScreen: EditorScreens): Screen 25 | } 26 | -------------------------------------------------------------------------------- /features/editor/api/src/test/java/ru/aleshin/features/editor/api/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.editor.api 17 | 18 | import org.junit.Assert.* 19 | import org.junit.Test 20 | 21 | /** 22 | * Example local unit test, which will execute on the development machine (host). 23 | * 24 | * See [testing documentation](http://d.android.com/tools/testing). 25 | */ 26 | class ExampleUnitTest { 27 | @Test 28 | fun addition_isCorrect() { 29 | assertEquals(4, 2 + 2) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /features/editor/impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /features/editor/impl/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/features/editor/impl/consumer-rules.pro -------------------------------------------------------------------------------- /features/editor/impl/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /features/editor/impl/src/androidTest/java/ru/aleshin/features/editor/impl/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.features.editor.impl 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.features.editor.impl.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/java/ru/aleshin/features/editor/impl/domain/repositories/EditorRepository.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.editor.impl.domain.repositories 17 | 18 | import ru.aleshin.features.editor.impl.domain.entites.EditModel 19 | 20 | /** 21 | * @author Stanislav Aleshin on 07.03.2023. 22 | */ 23 | internal interface EditorRepository { 24 | fun fetchEditModel(): EditModel 25 | fun saveEditModel(model: EditModel) 26 | } 27 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/java/ru/aleshin/features/editor/impl/presentation/models/categories/CategoriesUi.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.editor.impl.presentation.models.categories 17 | 18 | import android.os.Parcelable 19 | import kotlinx.parcelize.Parcelize 20 | 21 | /** 22 | * @author Stanislav Aleshin on 30.07.2023. 23 | */ 24 | @Parcelize 25 | internal data class CategoriesUi( 26 | val mainCategory: MainCategoryUi, 27 | val subCategories: List, 28 | ) : Parcelable 29 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_arrow_righ.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_chart_check.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_close.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_delete.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_favorite.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_favorite_border.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_note_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_notifications_outline.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_repeat.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /features/editor/impl/src/main/res/drawable/ic_sub_category.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/home/api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /features/home/api/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/features/home/api/consumer-rules.pro -------------------------------------------------------------------------------- /features/home/api/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /features/home/api/src/androidTest/java/ru/aleshin/features/home/api/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.features.home.api 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.features.home.api.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/home/api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/home/api/src/main/java/ru/aleshin/features/home/api/di/HomeFeatureApi.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.api.di 17 | 18 | import ru.aleshin.features.home.api.navigation.HomeFeatureStarter 19 | import ru.aleshin.module_injector.BaseFeatureApi 20 | 21 | /** 22 | * @author Stanislav Aleshin on 18.02.2023. 23 | */ 24 | interface HomeFeatureApi : BaseFeatureApi { 25 | fun fetchStarter(): HomeFeatureStarter 26 | } 27 | -------------------------------------------------------------------------------- /features/home/api/src/main/java/ru/aleshin/features/home/api/navigation/HomeFeatureStarter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.api.navigation 17 | 18 | import cafe.adriel.voyager.core.screen.Screen 19 | 20 | /** 21 | * @author Stanislav Aleshin on 18.02.2023. 22 | */ 23 | interface HomeFeatureStarter { 24 | fun provideHomeScreen(navScreen: HomeScreens?, isRoot: Boolean): Screen 25 | } 26 | -------------------------------------------------------------------------------- /features/home/api/src/test/java/ru/aleshin/features/home/api/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.api 17 | 18 | import org.junit.Assert.* 19 | import org.junit.Test 20 | 21 | /** 22 | * Example local unit test, which will execute on the development machine (host). 23 | * 24 | * See [testing documentation](http://d.android.com/tools/testing). 25 | */ 26 | class ExampleUnitTest { 27 | @Test 28 | fun addition_isCorrect() { 29 | assertEquals(4, 2 + 2) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /features/home/impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /features/home/impl/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/features/home/impl/consumer-rules.pro -------------------------------------------------------------------------------- /features/home/impl/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /features/home/impl/src/androidTest/java/ru/aleshin/features/home/impl/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.features.home.impl 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.features.home.impl.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/home/impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/home/impl/src/main/java/ru/aleshin/features/home/impl/di/annontation/Router.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.impl.di.annontation 17 | 18 | import javax.inject.Qualifier 19 | 20 | /** 21 | * @author Stanislav Aleshin on 08.03.2023. 22 | */ 23 | @Qualifier 24 | annotation class GlobalRouter 25 | 26 | @Qualifier 27 | annotation class LocalRouter 28 | -------------------------------------------------------------------------------- /features/home/impl/src/main/java/ru/aleshin/features/home/impl/domain/entities/TimeTaskImportanceException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.impl.domain.entities 17 | 18 | /** 19 | * @author Stanislav Aleshin on 16.05.2023. 20 | */ 21 | internal class TimeTaskImportanceException : Exception() 22 | -------------------------------------------------------------------------------- /features/home/impl/src/main/java/ru/aleshin/features/home/impl/domain/repositories/FeatureCategoryRepository.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.impl.domain.repositories 17 | 18 | /** 19 | * @author Stanislav Aleshin on 05.11.2023. 20 | */ 21 | internal interface FeatureCategoryRepository { 22 | suspend fun fetchMainCategoryId(): Int? 23 | fun setMainCategoryId(id: Int?) 24 | } 25 | -------------------------------------------------------------------------------- /features/home/impl/src/main/java/ru/aleshin/features/home/impl/domain/repositories/FeatureScheduleRepository.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.impl.domain.repositories 17 | 18 | import java.util.Date 19 | 20 | /** 21 | * @author Stanislav Aleshin on 05.11.2023. 22 | */ 23 | internal interface FeatureScheduleRepository { 24 | suspend fun fetchScheduleDate(): Date? 25 | fun setScheduleDate(date: Date?) 26 | } 27 | -------------------------------------------------------------------------------- /features/home/impl/src/main/java/ru/aleshin/features/home/impl/presentation/models/categories/CategoriesUi.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.impl.presentation.models.categories 17 | 18 | import android.os.Parcelable 19 | import kotlinx.parcelize.Parcelize 20 | 21 | /** 22 | * @author Stanislav Aleshin on 30.07.2023. 23 | */ 24 | @Parcelize 25 | internal data class CategoriesUi( 26 | val mainCategory: MainCategoryUi, 27 | val subCategories: List, 28 | ) : Parcelable 29 | -------------------------------------------------------------------------------- /features/home/impl/src/main/java/ru/aleshin/features/home/impl/presentation/models/templates/TemplatesSortedType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.impl.presentation.models.templates 17 | 18 | /** 19 | * @author Stanislav Aleshin on 08.05.2023. 20 | */ 21 | internal enum class TemplatesSortedType { 22 | CATEGORIES, DATE, DURATION 23 | } 24 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_add.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_bell_off.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_category.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_check.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_info.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_menu.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_next.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_notes.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_off_repeat.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_play.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_previous.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_remove.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_repeat.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_repeat_variant.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_schedule.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_stop.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_subcategory.xml: -------------------------------------------------------------------------------- 1 | 16 | 21 | 24 | 25 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_time.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/home/impl/src/main/res/drawable/ic_update_repeat.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /features/home/impl/src/test/java/ru/aleshin/features/home/impl/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.home.impl 17 | 18 | import org.junit.Assert.* 19 | import org.junit.Test 20 | 21 | /** 22 | * Example local unit test, which will execute on the development machine (host). 23 | * 24 | * See [testing documentation](http://d.android.com/tools/testing). 25 | */ 26 | class ExampleUnitTest { 27 | @Test 28 | fun addition_isCorrect() { 29 | assertEquals(4, 2 + 2) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /features/settings/api/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /features/settings/api/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/features/settings/api/consumer-rules.pro -------------------------------------------------------------------------------- /features/settings/api/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /features/settings/api/src/androidTest/java/ru/aleshin/features/settings/api/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.features.settings.api 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.features.settings.api.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/settings/api/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/settings/api/src/main/java/ru/aleshin/features/settings/api/di/SettingsFeatureApi.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.settings.api.di 17 | 18 | import ru.aleshin.features.settings.api.navigation.SettingsFeatureStarter 19 | import ru.aleshin.module_injector.BaseFeatureApi 20 | 21 | /** 22 | * @author Stanislav Aleshin on 17.02.2023. 23 | */ 24 | interface SettingsFeatureApi : BaseFeatureApi { 25 | fun fetchStarter(): SettingsFeatureStarter 26 | } 27 | -------------------------------------------------------------------------------- /features/settings/api/src/main/java/ru/aleshin/features/settings/api/navigation/SettingsFeatureStarter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.settings.api.navigation 17 | 18 | import cafe.adriel.voyager.core.screen.Screen 19 | 20 | /** 21 | * @author Stanislav Aleshin on 17.02.2023. 22 | */ 23 | interface SettingsFeatureStarter { 24 | fun provideMainScreen(): Screen 25 | } 26 | -------------------------------------------------------------------------------- /features/settings/api/src/test/java/ru/aleshin/features/settings/api/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.settings.api 17 | 18 | import org.junit.Assert.* 19 | import org.junit.Test 20 | 21 | /** 22 | * Example local unit test, which will execute on the development machine (host). 23 | * 24 | * See [testing documentation](http://d.android.com/tools/testing). 25 | */ 26 | class ExampleUnitTest { 27 | @Test 28 | fun addition_isCorrect() { 29 | assertEquals(4, 2 + 2) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /features/settings/impl/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /features/settings/impl/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/features/settings/impl/consumer-rules.pro -------------------------------------------------------------------------------- /features/settings/impl/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /features/settings/impl/src/androidTest/java/ru/aleshin/features/settings/impl/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.features.settings.impl 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.features.settings.api.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /features/settings/impl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /features/settings/impl/src/main/java/ru/aleshin/features/settings/impl/presentation/models/SettingsUi.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.features.settings.impl.presentation.models 17 | 18 | import android.os.Parcelable 19 | import kotlinx.parcelize.Parcelize 20 | 21 | /** 22 | * @author Stanislav Aleshin on 30.07.2023. 23 | */ 24 | @Parcelize 25 | internal data class SettingsUi( 26 | val themeSettings: ThemeSettingsUi, 27 | val tasksSettings: TasksSettingsUi, 28 | ) : Parcelable 29 | -------------------------------------------------------------------------------- /features/settings/impl/src/main/res/drawable/ic_back.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/settings/impl/src/main/res/drawable/ic_content_copy.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /features/settings/impl/src/main/res/drawable/ic_fantom.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | 12 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /features/settings/impl/src/main/res/drawable/ic_litecoin.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /features/settings/impl/src/main/res/drawable/ic_menu.xml: -------------------------------------------------------------------------------- 1 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /features/settings/impl/src/main/res/drawable/ic_tron.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright 2023 Stanislav Aleshin 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # 16 | #Sat Oct 14 17:42:31 MSK 2023 17 | distributionBase=GRADLE_USER_HOME 18 | distributionPath=wrapper/dists 19 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip 20 | zipStoreBase=GRADLE_USER_HOME 21 | zipStorePath=wrapper/dists 22 | -------------------------------------------------------------------------------- /module-injector/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /module-injector/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/v1tzor/TimePlanner/10168baed47abe50e1635f2644b3a1f551c45f64/module-injector/consumer-rules.pro -------------------------------------------------------------------------------- /module-injector/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle.kts. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /module-injector/src/androidTest/java/ru/aleshin/module_injector/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package ru.aleshin.module_injector 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.* 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("ru.aleshin.module_injector.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /module-injector/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /module-injector/src/main/java/ru/aleshin/module_injector/BaseFeatureApi.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.module_injector 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | interface BaseFeatureApi 22 | 23 | -------------------------------------------------------------------------------- /module-injector/src/main/java/ru/aleshin/module_injector/BaseFeatureDependencies.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.module_injector 17 | 18 | /** 19 | * @author Stanislav Aleshin on 14.02.2023. 20 | */ 21 | interface BaseFeatureDependencies 22 | -------------------------------------------------------------------------------- /module-injector/src/test/java/ru/aleshin/module_injector/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2023 Stanislav Aleshin 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package ru.aleshin.module_injector 17 | 18 | import org.junit.Assert.* 19 | import org.junit.Test 20 | 21 | /** 22 | * Example local unit test, which will execute on the development machine (host). 23 | * 24 | * See [testing documentation](http://d.android.com/tools/testing). 25 | */ 26 | class ExampleUnitTest { 27 | @Test 28 | fun addition_isCorrect() { 29 | assertEquals(4, 2 + 2) 30 | } 31 | } 32 | --------------------------------------------------------------------------------