From 28071a6ca7e718d913991c03786949c9c3f38c86 Mon Sep 17 00:00:00 2001 From: Yamin Siahmargooei Date: Thu, 5 Sep 2024 18:48:47 +0330 Subject: [PATCH] closes #137 --- app/build.gradle.kts | 5 +- app/src/main/AndroidManifest.xml | 2 +- .../github/yamin8000/owl/ui/MainActivity.kt | 2 + ...FloatingActivity.kt => OverlayActivity.kt} | 47 ++-- common/consumer-rules.pro | 0 .../owl/common/ui/components/Texts.kt | 5 +- datastore/consumer-rules.pro | 0 .../metadata/android/en-US/changelogs/44.txt | 1 + .../en-US/images/phoneScreenshots/4.jpg | Bin 0 -> 62544 bytes .../en-US/images/phoneScreenshots/5.jpg | Bin 0 -> 52135 bytes .../en-US/images/phoneScreenshots/6.jpg | Bin 0 -> 82355 bytes feature_favourites/consumer-rules.pro | 0 feature_history/consumer-rules.pro | 0 feature_home/build.gradle.kts | 15 +- feature_home/consumer-rules.pro | 0 .../repository/TermSuggesterRepositoryImpl.kt | 6 +- .../owl/feature_home/di/HomeModule.kt | 44 ++++ .../owl/feature_home/di/HomeUseCases.kt | 31 +-- .../domain/usecase/GetRandomWord.kt | 2 +- .../yamin8000/owl/feature_home/ui/Home.kt | 7 +- .../owl/feature_home/ui/HomeState.kt | 2 +- .../owl/feature_home/ui/HomeViewModel.kt | 8 +- .../ui/components/HomeComponents.kt | 185 -------------- .../owl/feature_home/ui/util/ShareUtils.kt | 2 +- feature_overlay/.gitignore | 1 + feature_overlay/build.gradle.kts | 51 ++++ feature_overlay/proguard-rules.pro | 21 ++ feature_overlay/src/main/AndroidManifest.xml | 2 + .../di/OverlayViewModelFactory.kt | 33 +++ .../owl/feature_overlay/ui/OverlayWindow.kt | 190 ++++++++++++++ .../feature_overlay/ui/OverlayWindowState.kt | 32 +++ .../ui/OverlayWindowViewModel.kt | 90 +++++++ feature_settings/consumer-rules.pro | 0 search/.gitignore | 1 + search/build.gradle.kts | 65 +++++ search/proguard-rules.pro | 21 ++ .../1.json | 0 .../2.json | 0 .../3.json | 0 .../4.json | 0 .../5.json | 0 .../6.json | 0 .../7.json | 0 .../8.json | 0 search/src/main/AndroidManifest.xml | 2 + .../data/datasource/local/AppDatabase.kt | 49 ++-- .../data/datasource/local/dao/AdvancedDao.kt | 14 +- .../data/datasource/local/dao/BaseDao.kt | 2 +- .../search}/data/datasource/local/dao/DAOs.kt | 28 +- .../datasource/local/entity/AntonymEntity.kt | 14 +- .../local/entity/DefinitionEntity.kt | 14 +- .../datasource/local/entity/EntryEntity.kt | 2 +- .../datasource/local/entity/MeaningEntity.kt | 14 +- .../datasource/local/entity/PhoneticEntity.kt | 14 +- .../datasource/local/entity/SynonymEntity.kt | 14 +- .../datasource/local/entity/TermEntity.kt | 2 +- .../datasource/remote/FreeDictionaryAPI.kt | 16 +- .../repository/local/BaseRoomRepository.kt | 16 +- .../local/DefinitionRoomRepository.kt | 22 +- .../repository/local/EntryRoomRepository.kt | 26 +- .../repository/local/MeaningRoomRepository.kt | 26 +- .../local/PhoneticRoomRepository.kt | 22 +- .../repository/local/TermRoomRepository.kt | 20 +- .../FreeDictionaryRetrofitApiRepository.kt | 20 +- .../yamin8000/owl/search/di/SearchDb.kt | 51 ++-- .../yamin8000/owl/search/di/SearchUseCases.kt | 61 +++++ .../yamin8000/owl/search/di/SearchWeb.kt | 24 +- .../owl/search}/domain/model/Definition.kt | 2 +- .../owl/search}/domain/model/Entry.kt | 14 +- .../owl/search}/domain/model/License.kt | 2 +- .../owl/search}/domain/model/Meaning.kt | 14 +- .../owl/search}/domain/model/Phonetic.kt | 14 +- .../repository/local/DefinitionRepository.kt | 18 +- .../repository/local/EntryRepository.kt | 18 +- .../repository/local/MeaningRepository.kt | 20 +- .../repository/local/PhoneticRepository.kt | 20 +- .../domain/repository/local/TermRepository.kt | 14 +- .../repository/local/util/BaseRepository.kt | 2 +- .../domain/repository/local/util/HasEntry.kt | 2 +- .../remote/FreeDictionaryApiRepository.kt | 17 +- .../owl/search}/domain/usecase/CacheWord.kt | 14 +- .../search}/domain/usecase/CacheWordData.kt | 8 +- .../search}/domain/usecase/GetCachedWord.kt | 6 +- .../domain/usecase/SearchFreeDictionary.kt | 6 +- .../domain/usecase/WordCacheUseCases.kt | 14 +- .../search/ui/components/SearchComponents.kt | 239 ++++++++++++++++++ settings.gradle.kts | 2 + strings/consumer-rules.pro | 0 strings/src/main/res/values/strings.xml | 2 + 89 files changed, 1200 insertions(+), 592 deletions(-) rename app/src/main/java/io/github/yamin8000/owl/ui/{FloatingActivity.kt => OverlayActivity.kt} (62%) delete mode 100644 common/consumer-rules.pro delete mode 100644 datastore/consumer-rules.pro create mode 100644 fastlane/metadata/android/en-US/changelogs/44.txt create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg delete mode 100644 feature_favourites/consumer-rules.pro delete mode 100644 feature_history/consumer-rules.pro delete mode 100644 feature_home/consumer-rules.pro create mode 100644 feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeModule.kt create mode 100644 feature_overlay/.gitignore create mode 100644 feature_overlay/build.gradle.kts create mode 100644 feature_overlay/proguard-rules.pro create mode 100644 feature_overlay/src/main/AndroidManifest.xml create mode 100644 feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/di/OverlayViewModelFactory.kt create mode 100644 feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindow.kt create mode 100644 feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindowState.kt create mode 100644 feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindowViewModel.kt delete mode 100644 feature_settings/consumer-rules.pro create mode 100644 search/.gitignore create mode 100644 search/build.gradle.kts create mode 100644 search/proguard-rules.pro rename {feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase => search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase}/1.json (100%) rename {feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase => search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase}/2.json (100%) rename {feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase => search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase}/3.json (100%) rename {feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase => search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase}/4.json (100%) rename {feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase => search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase}/5.json (100%) rename {feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase => search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase}/6.json (100%) rename {feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase => search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase}/7.json (100%) rename {feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase => search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase}/8.json (100%) create mode 100644 search/src/main/AndroidManifest.xml rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/AppDatabase.kt (52%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/dao/AdvancedDao.kt (86%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/dao/BaseDao.kt (95%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/dao/DAOs.kt (55%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/entity/AntonymEntity.kt (73%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/entity/DefinitionEntity.kt (73%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/entity/EntryEntity.kt (94%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/entity/MeaningEntity.kt (73%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/entity/PhoneticEntity.kt (73%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/entity/SynonymEntity.kt (73%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/local/entity/TermEntity.kt (94%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/datasource/remote/FreeDictionaryAPI.kt (63%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/repository/local/BaseRoomRepository.kt (70%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/repository/local/DefinitionRoomRepository.kt (74%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/repository/local/EntryRoomRepository.kt (68%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/repository/local/MeaningRoomRepository.kt (69%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/repository/local/PhoneticRoomRepository.kt (71%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/repository/local/TermRoomRepository.kt (69%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/data/repository/remote/FreeDictionaryRetrofitApiRepository.kt (61%) rename feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeDb.kt => search/src/main/java/io/github/yamin8000/owl/search/di/SearchDb.kt (63%) create mode 100644 search/src/main/java/io/github/yamin8000/owl/search/di/SearchUseCases.kt rename feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeWeb.kt => search/src/main/java/io/github/yamin8000/owl/search/di/SearchWeb.kt (67%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/model/Definition.kt (95%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/model/Entry.kt (66%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/model/License.kt (95%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/model/Meaning.kt (66%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/model/Phonetic.kt (66%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/repository/local/DefinitionRepository.kt (58%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/repository/local/EntryRepository.kt (58%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/repository/local/MeaningRepository.kt (54%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/repository/local/PhoneticRepository.kt (54%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/repository/local/TermRepository.kt (63%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/repository/local/util/BaseRepository.kt (94%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/repository/local/util/HasEntry.kt (94%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/repository/remote/FreeDictionaryApiRepository.kt (60%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/usecase/CacheWord.kt (82%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/usecase/CacheWordData.kt (89%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/usecase/GetCachedWord.kt (86%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/usecase/SearchFreeDictionary.kt (85%) rename {feature_home/src/main/java/io/github/yamin8000/owl/feature_home => search/src/main/java/io/github/yamin8000/owl/search}/domain/usecase/WordCacheUseCases.kt (66%) create mode 100644 search/src/main/java/io/github/yamin8000/owl/search/ui/components/SearchComponents.kt delete mode 100644 strings/consumer-rules.pro diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c2aade28..cacc61e1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -38,8 +38,8 @@ android { applicationId = appId minSdk = 21 targetSdk = 35 - versionCode = 43 - versionName = "1.7.0" + versionCode = 44 + versionName = "1.7.1" vectorDrawables.useSupportLibrary = true base.archivesName = "$applicationId-v$versionCode-n$versionName" } @@ -96,6 +96,7 @@ dependencies { implementation(project(":feature_settings")) implementation(project(":feature_history")) implementation(project(":feature_favourites")) + implementation(project(":feature_overlay")) //core android/kotlin coreLibraryDesugaring(libs.desugar.jdk.libs) implementation(libs.androidx.core.ktx) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a00e269f..84575fc6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,7 +43,7 @@ ( + creationCallback = { factory -> + factory.create(intentSearch = data) + } + ) ) } } diff --git a/common/consumer-rules.pro b/common/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/common/src/main/java/io/github/yamin8000/owl/common/ui/components/Texts.kt b/common/src/main/java/io/github/yamin8000/owl/common/ui/components/Texts.kt index 900303ae..b4221781 100644 --- a/common/src/main/java/io/github/yamin8000/owl/common/ui/components/Texts.kt +++ b/common/src/main/java/io/github/yamin8000/owl/common/ui/components/Texts.kt @@ -40,7 +40,6 @@ import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.text.selection.LocalTextSelectionColors import androidx.compose.foundation.text.selection.SelectionContainer import androidx.compose.foundation.text.selection.TextSelectionColors -import androidx.compose.material.ripple.rememberRipple import androidx.compose.material3.ElevatedSuggestionChip import androidx.compose.material3.Icon import androidx.compose.material3.LocalTextStyle @@ -222,7 +221,7 @@ fun CopyAbleRippleText( onLongClick = onLongClick ) ) - if (isDialogShown) { + if (isDialogShown && onDoubleClick != null) { Dialog( onDismissRequest = onDismissDialog, content = { @@ -240,7 +239,7 @@ fun CopyAbleRippleText( items(words) { item -> val onItemClick = remember(onDoubleClick, item) { { - onDoubleClick?.invoke(item) + onDoubleClick(item) isDialogShown = false } } diff --git a/datastore/consumer-rules.pro b/datastore/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/fastlane/metadata/android/en-US/changelogs/44.txt b/fastlane/metadata/android/en-US/changelogs/44.txt new file mode 100644 index 00000000..495be5d8 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/44.txt @@ -0,0 +1 @@ +- Added Overlay/Floating Window feature \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7b3d25663913065b2a24795b2fad6bee2c6077fb GIT binary patch literal 62544 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..592d2520c0f1f2a81a5ca6f83cfee95a1657df5e GIT binary patch literal 82355 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 <>4<^g36|7M7#!)>eBugAd~j`dg+OnaLc}c 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 R7<4BcQi-4+P2}g({{Ye(siOb@ literal 0 HcmV?d00001 diff --git a/feature_favourites/consumer-rules.pro b/feature_favourites/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature_history/consumer-rules.pro b/feature_history/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature_home/build.gradle.kts b/feature_home/build.gradle.kts index 3d7b3a70..ec0e3281 100644 --- a/feature_home/build.gradle.kts +++ b/feature_home/build.gradle.kts @@ -3,7 +3,6 @@ plugins { alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.google.ksp) alias(libs.plugins.jetbrains.compose.plugin) - id("org.jetbrains.kotlin.kapt") alias(libs.plugins.hilt) } @@ -13,7 +12,6 @@ android { defaultConfig { minSdk = 21 - ksp.arg("room.schemaLocation", "$projectDir/schemas") } compileOptions { @@ -31,6 +29,7 @@ dependencies { implementation(project(":common")) implementation(project(":strings")) implementation(project(":datastore")) + implementation(project(":search")) //core android/kotlin coreLibraryDesugaring(libs.desugar.jdk.libs) implementation(libs.androidx.core.ktx) @@ -50,16 +49,4 @@ dependencies { implementation(libs.hilt.android) ksp(libs.hilt.android.compiler) implementation(libs.androidx.hilt.navigation.compose) - //room - implementation(libs.androidx.room.runtime) - annotationProcessor(libs.androidx.room.compiler) - ksp(libs.androidx.room.compiler) - api(libs.androidx.room.ktx) - //retrofit - api(libs.retrofit.main) - implementation(libs.retrofit.converter.moshi) - kapt(libs.retrofit.type.keeper) - //moshi - implementation(libs.moshi.kotlin) - ksp(libs.moshi.kotlin.codegen) } \ No newline at end of file diff --git a/feature_home/consumer-rules.pro b/feature_home/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/TermSuggesterRepositoryImpl.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/TermSuggesterRepositoryImpl.kt index 4b3f85d2..7e289715 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/TermSuggesterRepositoryImpl.kt +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/TermSuggesterRepositoryImpl.kt @@ -24,7 +24,7 @@ package io.github.yamin8000.owl.feature_home.data.repository import android.app.Application import android.content.res.Resources.NotFoundException import io.github.yamin8000.owl.feature_home.R -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.DAOs +import io.github.yamin8000.owl.search.data.datasource.local.dao.DAOs import io.github.yamin8000.owl.feature_home.domain.repository.TermSuggesterRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -37,8 +37,8 @@ class TermSuggesterRepositoryImpl( private val dao: DAOs.TermDao, private val app: Application ) : TermSuggesterRepository { - val DEFAULT_N_GRAM_SIZE = 3 - val NOT_WORD_CHARS_REGEX = Regex("\\W+") + private val DEFAULT_N_GRAM_SIZE = 3 + private val NOT_WORD_CHARS_REGEX = Regex("\\W+") override suspend fun suggestTerms(searchTerm: String): List { items = items.plus(getOldSearchData()) diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeModule.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeModule.kt new file mode 100644 index 00000000..59676e9a --- /dev/null +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeModule.kt @@ -0,0 +1,44 @@ +/* + * freeDictionaryApp/freeDictionaryApp.feature_home.main + * HomeModule.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * HomeModule.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * Copyright (C) 2024 Yamin Siahmargooei + * + * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with freeDictionaryApp. If not, see . + */ + +package io.github.yamin8000.owl.feature_home.di + +import android.app.Application +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import io.github.yamin8000.owl.feature_home.data.repository.TermSuggesterRepositoryImpl +import io.github.yamin8000.owl.feature_home.domain.repository.TermSuggesterRepository +import io.github.yamin8000.owl.search.data.datasource.local.AppDatabase +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object HomeModule { + + @Provides + @Singleton + fun providesTermSuggesterRepository( + db: AppDatabase, + app: Application + ): TermSuggesterRepository = TermSuggesterRepositoryImpl(db.termDao(), app) +} \ No newline at end of file diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeUseCases.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeUseCases.kt index b6acb9da..c12edea4 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeUseCases.kt +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeUseCases.kt @@ -25,43 +25,14 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.TermEntity -import io.github.yamin8000.owl.feature_home.data.repository.local.BaseRoomRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.DefinitionRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.EntryRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.MeaningRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.PhoneticRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.TermRepository -import io.github.yamin8000.owl.feature_home.domain.usecase.CacheWord -import io.github.yamin8000.owl.feature_home.domain.usecase.CacheWordData -import io.github.yamin8000.owl.feature_home.domain.usecase.GetCachedWord import io.github.yamin8000.owl.feature_home.domain.usecase.GetRandomWord -import io.github.yamin8000.owl.feature_home.domain.usecase.WordCacheUseCases +import io.github.yamin8000.owl.search.domain.repository.local.TermRepository import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) object HomeUseCases { - @Provides - @Singleton - fun providesWordCacheUseCases( - entryRepository: EntryRepository, - phoneticRepository: PhoneticRepository, - meaningRepository: MeaningRepository, - definitionRepository: DefinitionRepository, - termRepository: TermRepository - ) = WordCacheUseCases( - getCachedWord = GetCachedWord(entryRepository), - cacheWord = CacheWord( - entryRepository = entryRepository, - meaningRepository = meaningRepository, - definitionRepository = definitionRepository, - phoneticRepository = phoneticRepository - ), - cacheWordData = CacheWordData(termRepository) - ) - @Provides @Singleton fun providesRandomWordUseCase( diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/GetRandomWord.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/GetRandomWord.kt index 9461ffee..ef33720f 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/GetRandomWord.kt +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/GetRandomWord.kt @@ -21,7 +21,7 @@ package io.github.yamin8000.owl.feature_home.domain.usecase -import io.github.yamin8000.owl.feature_home.domain.repository.local.TermRepository +import io.github.yamin8000.owl.search.domain.repository.local.TermRepository class GetRandomWord( private val repository: TermRepository diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/Home.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/Home.kt index 4117a258..e5395091 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/Home.kt +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/Home.kt @@ -42,7 +42,6 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.Immutable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.remember @@ -66,13 +65,13 @@ import io.github.yamin8000.owl.common.ui.components.LockScreenOrientation import io.github.yamin8000.owl.common.ui.components.MySnackbar import io.github.yamin8000.owl.common.ui.components.PersianText import io.github.yamin8000.owl.common.ui.util.LocalTTS -import io.github.yamin8000.owl.feature_home.domain.model.Meaning import io.github.yamin8000.owl.feature_home.ui.components.MainBottomBar import io.github.yamin8000.owl.feature_home.ui.components.MainTopBar -import io.github.yamin8000.owl.feature_home.ui.components.MeaningCard import io.github.yamin8000.owl.feature_home.ui.components.SuggestionsChips -import io.github.yamin8000.owl.feature_home.ui.components.WordCard import io.github.yamin8000.owl.feature_home.ui.util.ShareUtils.handleShareIntent +import io.github.yamin8000.owl.search.domain.model.Meaning +import io.github.yamin8000.owl.search.ui.components.MeaningCard +import io.github.yamin8000.owl.search.ui.components.WordCard import io.github.yamin8000.owl.strings.R import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.Dispatchers diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/HomeState.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/HomeState.kt index 312a38a0..17625ed7 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/HomeState.kt +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/HomeState.kt @@ -22,7 +22,7 @@ package io.github.yamin8000.owl.feature_home.ui import androidx.compose.material3.SnackbarHostState -import io.github.yamin8000.owl.feature_home.domain.model.Entry +import io.github.yamin8000.owl.search.domain.model.Entry data class HomeState( val isOnline: Boolean = false, diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/HomeViewModel.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/HomeViewModel.kt index 39d7c165..a66b65e2 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/HomeViewModel.kt +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/HomeViewModel.kt @@ -34,11 +34,11 @@ import io.github.yamin8000.owl.datastore.domain.usecase.favourites.FavouriteUseC import io.github.yamin8000.owl.datastore.domain.usecase.history.HistoryUseCases import io.github.yamin8000.owl.datastore.domain.usecase.settings.SettingUseCases import io.github.yamin8000.owl.feature_home.di.HomeViewModelFactory -import io.github.yamin8000.owl.feature_home.domain.model.Entry +import io.github.yamin8000.owl.search.domain.model.Entry import io.github.yamin8000.owl.feature_home.domain.repository.TermSuggesterRepository import io.github.yamin8000.owl.feature_home.domain.usecase.GetRandomWord -import io.github.yamin8000.owl.feature_home.domain.usecase.SearchFreeDictionary -import io.github.yamin8000.owl.feature_home.domain.usecase.WordCacheUseCases +import io.github.yamin8000.owl.search.domain.usecase.SearchFreeDictionary +import io.github.yamin8000.owl.search.domain.usecase.WordCacheUseCases import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -122,7 +122,7 @@ class HomeViewModel @AssistedInject constructor( init { scope.launch { _state.update { it.copy(isVibrating = settingsUseCases.getVibration()) } - if (!settingsUseCases.getStartingBlank()) { + if (!settingsUseCases.getStartingBlank() && searchTerm.value.isBlank()) { savedState["Search"] = "free" } if (searchTerm.value.isNotBlank()) { diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/components/HomeComponents.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/components/HomeComponents.kt index c5791800..ad3b5001 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/components/HomeComponents.kt +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/components/HomeComponents.kt @@ -31,8 +31,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.twotone.ShortText -import androidx.compose.material.icons.automirrored.twotone.TextSnippet -import androidx.compose.material.icons.twotone.Category import androidx.compose.material.icons.twotone.Favorite import androidx.compose.material.icons.twotone.RecordVoiceOver import androidx.compose.material.icons.twotone.Share @@ -46,190 +44,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import io.github.yamin8000.owl.common.ui.components.ClickableIcon -import io.github.yamin8000.owl.common.ui.components.HighlightText import io.github.yamin8000.owl.common.ui.components.SpeakableRippleTextWithIcon import io.github.yamin8000.owl.common.ui.theme.DefaultCutShape -import io.github.yamin8000.owl.common.ui.theme.defaultGradientBorder -import io.github.yamin8000.owl.feature_home.domain.model.Meaning import io.github.yamin8000.owl.strings.R -@Composable -internal fun WordCard( - modifier: Modifier = Modifier, - word: String, - pronunciation: String?, - onAddToFavourite: () -> Unit, - onShareWord: () -> Unit -) { - OutlinedCard( - shape = DefaultCutShape, - border = BorderStroke(1.dp, MaterialTheme.colorScheme.tertiary), - modifier = modifier - .fillMaxWidth() - .indication( - interactionSource = remember { MutableInteractionSource() }, - indication = ripple(), - ), - content = { - Row( - modifier = Modifier.fillMaxWidth(), - content = { - Column( - modifier = Modifier - .weight(2f) - .padding(16.dp), - verticalArrangement = Arrangement.spacedBy(4.dp), - horizontalAlignment = Alignment.Start, - content = { - WordText(word) - if (!pronunciation.isNullOrBlank()) { - PronunciationText( - word = word, - pronunciation = pronunciation, - ) - } - } - ) - Column( - modifier = Modifier - .weight(1f) - .padding(16.dp), - verticalArrangement = Arrangement.spacedBy(8.dp), - horizontalAlignment = Alignment.End, - content = { - ClickableIcon( - imageVector = Icons.TwoTone.Favorite, - contentDescription = stringResource(R.string.favourites), - onClick = onAddToFavourite - ) - ClickableIcon( - imageVector = Icons.TwoTone.Share, - contentDescription = stringResource(R.string.share), - onClick = onShareWord - ) - } - ) - } - ) - } - ) -} - -@Composable -internal fun WordText( - word: String -) { - SpeakableRippleTextWithIcon( - text = word, - imageVector = Icons.AutoMirrored.TwoTone.ShortText, - ) -} - -@Composable -internal fun PronunciationText( - pronunciation: String, - word: String, -) { - SpeakableRippleTextWithIcon( - text = pronunciation, - ttsText = word, - imageVector = Icons.TwoTone.RecordVoiceOver, - ) -} - -@Composable -internal fun WordExampleText( - word: String, - example: String, - onDoubleClick: ((String) -> Unit)? = null -) { - SpeakableRippleTextWithIcon( - text = example, - imageVector = Icons.AutoMirrored.TwoTone.TextSnippet, - title = stringResource(R.string.example), - content = { HighlightText(fullText = example, highlightedText = word) }, - onDoubleClick = onDoubleClick, - ) -} - -@Composable -internal fun WordDefinitionText( - word: String, - definition: String, - onDoubleClick: ((String) -> Unit)? = null -) { - SpeakableRippleTextWithIcon( - text = definition, - imageVector = Icons.AutoMirrored.TwoTone.ShortText, - title = stringResource(R.string.definition), - content = { HighlightText(fullText = definition, highlightedText = word) }, - onDoubleClick = onDoubleClick, - ) -} - -@Composable -internal fun WordTypeText( - type: String, - onDoubleClick: ((String) -> Unit)? = null -) { - SpeakableRippleTextWithIcon( - text = type, - imageVector = Icons.TwoTone.Category, - title = stringResource(R.string.type), - onDoubleClick = onDoubleClick, - ) -} - -@Composable -internal fun MeaningCard( - modifier: Modifier = Modifier, - word: String, - meaning: Meaning, - onWordChipClick: (String) -> Unit -) { - OutlinedCard( - shape = DefaultCutShape, - modifier = modifier.fillMaxWidth(), - border = defaultGradientBorder(), - content = { - Column( - modifier = Modifier.padding(16.dp), - verticalArrangement = Arrangement.spacedBy(16.dp), - content = { - WordTypeText( - meaning.partOfSpeech, - onDoubleClick = onWordChipClick - ) - meaning.definitions.forEach { (definition, example, synonyms, antonyms) -> - WordDefinitionText( - word = word, - definition = definition, - onDoubleClick = onWordChipClick - ) - if (example != null) { - WordExampleText( - word = word, - example = example, - onDoubleClick = onWordChipClick - ) - } - antonyms.forEach { antonym -> - SpeakableRippleTextWithIcon( - text = antonym, - imageVector = Icons.AutoMirrored.TwoTone.TextSnippet, - title = stringResource(R.string.antonym), - ) - } - synonyms.forEach { synonym -> - SpeakableRippleTextWithIcon( - text = synonym, - imageVector = Icons.AutoMirrored.TwoTone.TextSnippet, - title = stringResource(R.string.synonym), - ) - } - } - } - ) - } - ) -} \ No newline at end of file diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/util/ShareUtils.kt b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/util/ShareUtils.kt index 15b5f099..6de28784 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/util/ShareUtils.kt +++ b/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/ui/util/ShareUtils.kt @@ -23,7 +23,7 @@ package io.github.yamin8000.owl.feature_home.ui.util import android.content.Context import android.content.Intent -import io.github.yamin8000.owl.feature_home.domain.model.Entry +import io.github.yamin8000.owl.search.domain.model.Entry import io.github.yamin8000.owl.strings.R object ShareUtils { diff --git a/feature_overlay/.gitignore b/feature_overlay/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/feature_overlay/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/feature_overlay/build.gradle.kts b/feature_overlay/build.gradle.kts new file mode 100644 index 00000000..53dbe08e --- /dev/null +++ b/feature_overlay/build.gradle.kts @@ -0,0 +1,51 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.google.ksp) + alias(libs.plugins.jetbrains.compose.plugin) + alias(libs.plugins.hilt) +} + +android { + namespace = "io.github.yamin8000.owl.feature_overlay" + compileSdk = 34 + + defaultConfig { + minSdk = 21 + } + + compileOptions { + isCoreLibraryDesugaringEnabled = true + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } +} + +dependencies { + implementation(project(":common")) + implementation(project(":strings")) + implementation(project(":search")) + //core android/kotlin + coreLibraryDesugaring(libs.desugar.jdk.libs) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.jetbrains.kotlinx.immutable) + //compose + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.material) + implementation(libs.androidx.compose.ui.tooling.preview) + debugImplementation(libs.androidx.compose.ui.tooling) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.compose.material.icons.extended) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material3.window.size) + implementation(libs.androidx.lifecycle.runtime.compose) + //hilt + implementation(libs.hilt.android) + ksp(libs.hilt.android.compiler) + implementation(libs.androidx.hilt.navigation.compose) +} \ No newline at end of file diff --git a/feature_overlay/proguard-rules.pro b/feature_overlay/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/feature_overlay/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature_overlay/src/main/AndroidManifest.xml b/feature_overlay/src/main/AndroidManifest.xml new file mode 100644 index 00000000..568741e5 --- /dev/null +++ b/feature_overlay/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/di/OverlayViewModelFactory.kt b/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/di/OverlayViewModelFactory.kt new file mode 100644 index 00000000..dfa8d195 --- /dev/null +++ b/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/di/OverlayViewModelFactory.kt @@ -0,0 +1,33 @@ +/* + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main + * OverlayViewModelFactory.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * OverlayViewModelFactory.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.feature_overlay.main. + * Copyright (C) 2024 Yamin Siahmargooei + * + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with freeDictionaryApp. If not, see . + */ + +package io.github.yamin8000.owl.feature_overlay.di + +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import io.github.yamin8000.owl.feature_overlay.ui.OverlayWindowViewModel + +@AssistedFactory +interface OverlayViewModelFactory { + fun create( + @Assisted("intent") intentSearch: String?, + ): OverlayWindowViewModel +} \ No newline at end of file diff --git a/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindow.kt b/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindow.kt new file mode 100644 index 00000000..91d63698 --- /dev/null +++ b/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindow.kt @@ -0,0 +1,190 @@ +/* + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main + * OverlayWindow.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * OverlayWindow.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.feature_overlay.main. + * Copyright (C) 2024 Yamin Siahmargooei + * + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with freeDictionaryApp. If not, see . + */ + +package io.github.yamin8000.owl.feature_overlay.ui + +import android.content.res.Configuration +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.BasicAlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import io.github.yamin8000.owl.common.ui.theme.DefaultCutShape +import io.github.yamin8000.owl.common.ui.theme.defaultGradientBorder +import io.github.yamin8000.owl.search.domain.model.Meaning +import io.github.yamin8000.owl.search.ui.components.MeaningCard +import io.github.yamin8000.owl.search.ui.components.WordCard +import io.github.yamin8000.owl.strings.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun OverlayScreen( + modifier: Modifier = Modifier, + vm: OverlayWindowViewModel = hiltViewModel(), + onDismissRequest: () -> Unit, + navigateToApp: (String) -> Unit +) { + val state = vm.state.collectAsStateWithLifecycle().value + + val configuration = LocalConfiguration.current + val isPortrait = remember(configuration) { + configuration.orientation == Configuration.ORIENTATION_PORTRAIT + } + val screenHeight = remember(configuration) { + configuration.screenHeightDp.dp + } + val buttonsOffset = 64.dp + val windowHeight = remember(isPortrait, screenHeight) { + if (isPortrait) screenHeight / 2 else screenHeight - buttonsOffset + } + BasicAlertDialog( + modifier = modifier, + onDismissRequest = onDismissRequest, + properties = DialogProperties( + dismissOnClickOutside = false, + usePlatformDefaultWidth = false + ), + content = { + Box( + modifier = Modifier.height(windowHeight + buttonsOffset), + content = { + Surface( + modifier = Modifier + .height(windowHeight) + .padding(horizontal = 16.dp), + shape = DefaultCutShape, + border = defaultGradientBorder(), + content = { + SearchList( + isSearching = state.isSearching, + word = state.word, + phonetic = state.phonetic, + meanings = state.meanings + ) + } + ) + ButtonsRow( + modifier = Modifier + .padding(top = buttonsOffset) + .align(Alignment.BottomCenter), + onDismissRequest = onDismissRequest, + navigateToApp = { navigateToApp(state.word) } + ) + } + ) + } + ) +} + +@Preview(showBackground = true) +@Composable +private fun Preview() { + SearchList( + isSearching = true, + word = "duh", + phonetic = "duh", + meanings = emptyList() + ) +} + +@Composable +private fun SearchList( + modifier: Modifier = Modifier, + isSearching: Boolean, + word: String, + phonetic: String, + meanings: List +) { + LazyColumn( + modifier = modifier.padding(16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + horizontalAlignment = Alignment.CenterHorizontally, + content = { + if (isSearching) { + item { + LinearProgressIndicator( + modifier = Modifier.fillMaxWidth() + ) + } + } + item { + WordCard( + word = word, + pronunciation = phonetic + ) + } + items(meanings) { meaning -> + MeaningCard( + word = word, + meaning = meaning + ) + } + /*item { + ButtonsRow( + onDismissRequest = onDismissRequest, + navigateToApp = navigateToApp + ) + }*/ + } + ) +} + +@Composable +private fun ButtonsRow( + modifier: Modifier = Modifier, + onDismissRequest: () -> Unit, + navigateToApp: () -> Unit +) { + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(16.dp), + content = { + Button( + onClick = onDismissRequest, + content = { Text(stringResource(R.string.close)) } + ) + Button( + onClick = navigateToApp, + content = { Text(stringResource(R.string.more_in_app)) } + ) + } + ) +} \ No newline at end of file diff --git a/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindowState.kt b/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindowState.kt new file mode 100644 index 00000000..898e5cda --- /dev/null +++ b/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindowState.kt @@ -0,0 +1,32 @@ +/* + * freeDictionaryApp/freeDictionaryApp.feature_floating.main + * OverlayWindowState.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * OverlayWindowState.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.feature_floating.main. + * Copyright (C) 2024 Yamin Siahmargooei + * + * freeDictionaryApp/freeDictionaryApp.feature_floating.main is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * freeDictionaryApp/freeDictionaryApp.feature_floating.main is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with freeDictionaryApp. If not, see . + */ + +package io.github.yamin8000.owl.feature_overlay.ui + +import io.github.yamin8000.owl.search.domain.model.Meaning + +data class OverlayWindowState( + val isSearching: Boolean = false, + val searchTerm: String = "", + val meanings: List = emptyList(), + val word: String = "", + val phonetic: String = "" +) diff --git a/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindowViewModel.kt b/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindowViewModel.kt new file mode 100644 index 00000000..5ec3ec39 --- /dev/null +++ b/feature_overlay/src/main/java/io/github/yamin8000/owl/feature_overlay/ui/OverlayWindowViewModel.kt @@ -0,0 +1,90 @@ +/* + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main + * OverlayWindowViewModel.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * OverlayWindowViewModel.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.feature_overlay.main. + * Copyright (C) 2024 Yamin Siahmargooei + * + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * freeDictionaryApp/freeDictionaryApp.feature_overlay.main is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with freeDictionaryApp. If not, see . + */ + +package io.github.yamin8000.owl.feature_overlay.ui + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.assisted.Assisted +import dagger.assisted.AssistedInject +import dagger.hilt.android.lifecycle.HiltViewModel +import io.github.yamin8000.owl.feature_overlay.di.OverlayViewModelFactory +import io.github.yamin8000.owl.search.domain.model.Phonetic +import io.github.yamin8000.owl.search.domain.usecase.SearchFreeDictionary +import io.github.yamin8000.owl.search.domain.usecase.WordCacheUseCases +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +@HiltViewModel(assistedFactory = OverlayViewModelFactory::class) +class OverlayWindowViewModel @AssistedInject constructor( + @Assisted("intent") private val intentSearch: String?, + private val searchFreeDictionaryUseCase: SearchFreeDictionary, + private val cacheUseCases: WordCacheUseCases, +) : ViewModel() { + + private val exceptionHandler = CoroutineExceptionHandler { _, throwable -> + println(throwable.stackTraceToString()) + } + + private val scope = CoroutineScope(viewModelScope.coroutineContext + exceptionHandler) + + private var _state = MutableStateFlow(OverlayWindowState(searchTerm = intentSearch ?: "")) + val state = _state.asStateFlow() + + init { + val term = state.value.searchTerm + if (term.isNotBlank()) { + scope.launch { + _state.update { it.copy(isSearching = true) } + val cached = cacheUseCases.getCachedWord(term) + if (cached != null) { + _state.update { + it.copy( + meanings = cached.meanings, + word = cached.word, + phonetic = getFirstPhonetic(cached.phonetics) + ) + } + } else { + val result = searchFreeDictionaryUseCase(term).firstOrNull() + if (result != null) { + _state.update { + it.copy( + meanings = result.meanings, + word = result.word, + phonetic = getFirstPhonetic(result.phonetics) + ) + } + } + } + _state.update { it.copy(isSearching = false) } + } + } + } + + private fun getFirstPhonetic(phonetics: List): String { + return phonetics.firstOrNull { it.text != null }?.text ?: "" + } +} \ No newline at end of file diff --git a/feature_settings/consumer-rules.pro b/feature_settings/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/search/.gitignore b/search/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/search/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/search/build.gradle.kts b/search/build.gradle.kts new file mode 100644 index 00000000..d43eeb6b --- /dev/null +++ b/search/build.gradle.kts @@ -0,0 +1,65 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.google.ksp) + alias(libs.plugins.jetbrains.compose.plugin) + id("org.jetbrains.kotlin.kapt") + alias(libs.plugins.hilt) +} + +android { + namespace = "io.github.yamin8000.owl.search" + compileSdk = 34 + + defaultConfig { + minSdk = 21 + ksp.arg("room.schemaLocation", "$projectDir/schemas") + } + + compileOptions { + isCoreLibraryDesugaringEnabled = true + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = "17" + } +} + +dependencies { + implementation(project(":common")) + implementation(project(":strings")) + implementation(project(":datastore")) + //core android/kotlin + coreLibraryDesugaring(libs.desugar.jdk.libs) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.jetbrains.kotlinx.immutable) + //compose + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.material) + implementation(libs.androidx.compose.ui.tooling.preview) + debugImplementation(libs.androidx.compose.ui.tooling) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.compose.material.icons.extended) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material3.window.size) + implementation(libs.androidx.lifecycle.runtime.compose) + //hilt + implementation(libs.hilt.android) + ksp(libs.hilt.android.compiler) + implementation(libs.androidx.hilt.navigation.compose) + //room + implementation(libs.androidx.room.runtime) + annotationProcessor(libs.androidx.room.compiler) + ksp(libs.androidx.room.compiler) + api(libs.androidx.room.ktx) + //retrofit + api(libs.retrofit.main) + implementation(libs.retrofit.converter.moshi) + kapt(libs.retrofit.type.keeper) + //moshi + implementation(libs.moshi.kotlin) + ksp(libs.moshi.kotlin.codegen) +} \ No newline at end of file diff --git a/search/proguard-rules.pro b/search/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/search/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/1.json b/search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/1.json similarity index 100% rename from feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/1.json rename to search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/1.json diff --git a/feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/2.json b/search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/2.json similarity index 100% rename from feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/2.json rename to search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/2.json diff --git a/feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/3.json b/search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/3.json similarity index 100% rename from feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/3.json rename to search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/3.json diff --git a/feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/4.json b/search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/4.json similarity index 100% rename from feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/4.json rename to search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/4.json diff --git a/feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/5.json b/search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/5.json similarity index 100% rename from feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/5.json rename to search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/5.json diff --git a/feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/6.json b/search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/6.json similarity index 100% rename from feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/6.json rename to search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/6.json diff --git a/feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/7.json b/search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/7.json similarity index 100% rename from feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/7.json rename to search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/7.json diff --git a/feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/8.json b/search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/8.json similarity index 100% rename from feature_home/schemas/io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase/8.json rename to search/schemas/io.github.yamin8000.owl.search.data.datasource.local.AppDatabase/8.json diff --git a/search/src/main/AndroidManifest.xml b/search/src/main/AndroidManifest.xml new file mode 100644 index 00000000..568741e5 --- /dev/null +++ b/search/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/AppDatabase.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/AppDatabase.kt similarity index 52% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/AppDatabase.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/AppDatabase.kt index 956248c0..3784cb6b 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/AppDatabase.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/AppDatabase.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * AppDatabase.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * AppDatabase.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * AppDatabase.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * AppDatabase.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,22 +19,21 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local +package io.github.yamin8000.owl.search.data.datasource.local import androidx.room.AutoMigration import androidx.room.Database import androidx.room.RoomDatabase import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -import io.github.yamin8000.owl.common.util.DateTimeUtils -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.DAOs -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.AntonymEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.DefinitionEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.EntryEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.MeaningEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.PhoneticEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.SynonymEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.TermEntity +import io.github.yamin8000.owl.search.data.datasource.local.dao.DAOs +import io.github.yamin8000.owl.search.data.datasource.local.entity.AntonymEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.DefinitionEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.EntryEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.MeaningEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.PhoneticEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.SynonymEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.TermEntity @Database( version = 8, @@ -59,18 +58,16 @@ abstract class AppDatabase : RoomDatabase() { val MIGRATION_7_8 = object : Migration(7, 8) { override fun migrate(db: SupportSQLiteDatabase) { - val now = DateTimeUtils.epoch() - db.execSQL(addDateColumn("AntonymEntity", now)) - db.execSQL(addDateColumn("DefinitionEntity", now)) - db.execSQL(addDateColumn("EntryEntity", now)) - db.execSQL(addDateColumn("MeaningEntity", now)) - db.execSQL(addDateColumn("PhoneticEntity", now)) - db.execSQL(addDateColumn("SynonymEntity", now)) - db.execSQL(addDateColumn("TermEntity", now)) + db.execSQL(addDateColumn("AntonymEntity")) + db.execSQL(addDateColumn("DefinitionEntity")) + db.execSQL(addDateColumn("EntryEntity")) + db.execSQL(addDateColumn("MeaningEntity")) + db.execSQL(addDateColumn("PhoneticEntity")) + db.execSQL(addDateColumn("SynonymEntity")) + db.execSQL(addDateColumn("TermEntity")) } } private fun addDateColumn( - tableName: String, - epoch: Long + tableName: String ): String = "ALTER TABLE `$tableName` ADD COLUMN createdAt INTEGER NOT NULL DEFAULT 0" \ No newline at end of file diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/AdvancedDao.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/AdvancedDao.kt similarity index 86% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/AdvancedDao.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/AdvancedDao.kt index 29c23020..a8a97853 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/AdvancedDao.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/AdvancedDao.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.data.main - * AdvancedDao.kt Copyrighted by Yamin Siahmargooei at 2024/5/9 - * AdvancedDao.kt Last modified at 2024/3/23 - * This file is part of freeDictionaryApp/freeDictionaryApp.data.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * AdvancedDao.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * AdvancedDao.kt Last modified at 2024/8/25 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.data.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.data.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.dao +package io.github.yamin8000.owl.search.data.datasource.local.dao import androidx.room.RawQuery import androidx.sqlite.db.SimpleSQLiteQuery diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/BaseDao.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/BaseDao.kt similarity index 95% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/BaseDao.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/BaseDao.kt index a0e6251c..e80e503d 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/BaseDao.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/BaseDao.kt @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.dao +package io.github.yamin8000.owl.search.data.datasource.local.dao import androidx.room.Delete import androidx.room.Insert diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/DAOs.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/DAOs.kt similarity index 55% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/DAOs.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/DAOs.kt index 86e57b36..84ea3b32 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/dao/DAOs.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/dao/DAOs.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.data.main - * DAOs.kt Copyrighted by Yamin Siahmargooei at 2024/5/9 - * DAOs.kt Last modified at 2024/3/23 - * This file is part of freeDictionaryApp/freeDictionaryApp.data.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * DAOs.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * DAOs.kt Last modified at 2024/8/18 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.data.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.data.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,16 +19,16 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.dao +package io.github.yamin8000.owl.search.data.datasource.local.dao import androidx.room.Dao -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.AntonymEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.DefinitionEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.EntryEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.MeaningEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.PhoneticEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.SynonymEntity -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.TermEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.AntonymEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.DefinitionEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.EntryEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.MeaningEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.PhoneticEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.SynonymEntity +import io.github.yamin8000.owl.search.data.datasource.local.entity.TermEntity object DAOs { @Dao diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/AntonymEntity.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/AntonymEntity.kt similarity index 73% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/AntonymEntity.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/AntonymEntity.kt index 8534d3bb..3952f6fc 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/AntonymEntity.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/AntonymEntity.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * AntonymEntity.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * AntonymEntity.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * AntonymEntity.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * AntonymEntity.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.entity +package io.github.yamin8000.owl.search.data.datasource.local.entity import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/DefinitionEntity.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/DefinitionEntity.kt similarity index 73% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/DefinitionEntity.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/DefinitionEntity.kt index ecd8159a..4f4b8c56 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/DefinitionEntity.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/DefinitionEntity.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * DefinitionEntity.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * DefinitionEntity.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * DefinitionEntity.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * DefinitionEntity.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.entity +package io.github.yamin8000.owl.search.data.datasource.local.entity import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/EntryEntity.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/EntryEntity.kt similarity index 94% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/EntryEntity.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/EntryEntity.kt index 88c749e4..e64bef50 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/EntryEntity.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/EntryEntity.kt @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.entity +package io.github.yamin8000.owl.search.data.datasource.local.entity import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/MeaningEntity.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/MeaningEntity.kt similarity index 73% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/MeaningEntity.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/MeaningEntity.kt index 9b34bfbd..aba0155e 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/MeaningEntity.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/MeaningEntity.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * MeaningEntity.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * MeaningEntity.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * MeaningEntity.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * MeaningEntity.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.entity +package io.github.yamin8000.owl.search.data.datasource.local.entity import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/PhoneticEntity.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/PhoneticEntity.kt similarity index 73% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/PhoneticEntity.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/PhoneticEntity.kt index ffd8345a..6fa08c5b 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/PhoneticEntity.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/PhoneticEntity.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * PhoneticEntity.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * PhoneticEntity.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * PhoneticEntity.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * PhoneticEntity.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.entity +package io.github.yamin8000.owl.search.data.datasource.local.entity import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/SynonymEntity.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/SynonymEntity.kt similarity index 73% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/SynonymEntity.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/SynonymEntity.kt index ba5933bc..721cf23b 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/SynonymEntity.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/SynonymEntity.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * SynonymEntity.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * SynonymEntity.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * SynonymEntity.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * SynonymEntity.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.entity +package io.github.yamin8000.owl.search.data.datasource.local.entity import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/TermEntity.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/TermEntity.kt similarity index 94% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/TermEntity.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/TermEntity.kt index 79410f62..d59aef5b 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/local/entity/TermEntity.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/local/entity/TermEntity.kt @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.local.entity +package io.github.yamin8000.owl.search.data.datasource.local.entity import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/remote/FreeDictionaryAPI.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/remote/FreeDictionaryAPI.kt similarity index 63% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/remote/FreeDictionaryAPI.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/datasource/remote/FreeDictionaryAPI.kt index 47e843db..5e04357d 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/datasource/remote/FreeDictionaryAPI.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/datasource/remote/FreeDictionaryAPI.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * APIs.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * APIs.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * FreeDictionaryAPI.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * FreeDictionaryAPI.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,9 +19,9 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.datasource.remote +package io.github.yamin8000.owl.search.data.datasource.remote -import io.github.yamin8000.owl.feature_home.domain.model.Entry +import io.github.yamin8000.owl.search.domain.model.Entry import retrofit2.http.GET import retrofit2.http.Path diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/BaseRoomRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/BaseRoomRepository.kt similarity index 70% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/BaseRoomRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/BaseRoomRepository.kt index ef192917..03c27889 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/BaseRoomRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/BaseRoomRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * BaseRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/30 + * freeDictionaryApp/freeDictionaryApp.search.main + * BaseRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 * BaseRoomRepository.kt Last modified at 2024/8/30 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,10 +19,10 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.repository.local +package io.github.yamin8000.owl.search.data.repository.local -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.AdvancedDao -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.BaseRepository +import io.github.yamin8000.owl.search.data.datasource.local.dao.AdvancedDao +import io.github.yamin8000.owl.search.domain.repository.local.util.BaseRepository abstract class BaseRoomRepository( private val dao: AdvancedDao diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/DefinitionRoomRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/DefinitionRoomRepository.kt similarity index 74% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/DefinitionRoomRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/DefinitionRoomRepository.kt index aef5ad10..864af825 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/DefinitionRoomRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/DefinitionRoomRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * DefinitionRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * DefinitionRoomRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * DefinitionRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * DefinitionRoomRepository.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,13 +19,13 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.repository.local +package io.github.yamin8000.owl.search.data.repository.local import io.github.yamin8000.owl.common.util.DateTimeUtils.epoch -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.DAOs -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.DefinitionEntity -import io.github.yamin8000.owl.feature_home.domain.model.Definition -import io.github.yamin8000.owl.feature_home.domain.repository.local.DefinitionRepository +import io.github.yamin8000.owl.search.data.datasource.local.dao.DAOs +import io.github.yamin8000.owl.search.data.datasource.local.entity.DefinitionEntity +import io.github.yamin8000.owl.search.domain.model.Definition +import io.github.yamin8000.owl.search.domain.repository.local.DefinitionRepository class DefinitionRoomRepository( private val definitionDao: DAOs.DefinitionDao, diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/EntryRoomRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/EntryRoomRepository.kt similarity index 68% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/EntryRoomRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/EntryRoomRepository.kt index 335e85d2..3bff0907 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/EntryRoomRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/EntryRoomRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * EntryRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * EntryRoomRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * EntryRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * EntryRoomRepository.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,16 +19,16 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.repository.local +package io.github.yamin8000.owl.search.data.repository.local import io.github.yamin8000.owl.common.ui.util.StringUtils.sanitizeWord import io.github.yamin8000.owl.common.util.DateTimeUtils.epoch -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.DAOs -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.EntryEntity -import io.github.yamin8000.owl.feature_home.domain.model.Entry -import io.github.yamin8000.owl.feature_home.domain.repository.local.EntryRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.MeaningRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.PhoneticRepository +import io.github.yamin8000.owl.search.data.datasource.local.dao.DAOs +import io.github.yamin8000.owl.search.data.datasource.local.entity.EntryEntity +import io.github.yamin8000.owl.search.domain.model.Entry +import io.github.yamin8000.owl.search.domain.repository.local.EntryRepository +import io.github.yamin8000.owl.search.domain.repository.local.MeaningRepository +import io.github.yamin8000.owl.search.domain.repository.local.PhoneticRepository class EntryRoomRepository( private val dao: DAOs.EntryDao, diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/MeaningRoomRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/MeaningRoomRepository.kt similarity index 69% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/MeaningRoomRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/MeaningRoomRepository.kt index 57987193..d8cf1187 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/MeaningRoomRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/MeaningRoomRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * MeaningRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * MeaningRoomRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * MeaningRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * MeaningRoomRepository.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,15 +19,15 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.repository.local +package io.github.yamin8000.owl.search.data.repository.local import io.github.yamin8000.owl.common.util.DateTimeUtils.epoch -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.DAOs -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.MeaningEntity -import io.github.yamin8000.owl.feature_home.domain.model.Meaning -import io.github.yamin8000.owl.feature_home.domain.repository.local.DefinitionRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.MeaningRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.HasEntry +import io.github.yamin8000.owl.search.data.datasource.local.dao.DAOs +import io.github.yamin8000.owl.search.data.datasource.local.entity.MeaningEntity +import io.github.yamin8000.owl.search.domain.model.Meaning +import io.github.yamin8000.owl.search.domain.repository.local.DefinitionRepository +import io.github.yamin8000.owl.search.domain.repository.local.MeaningRepository +import io.github.yamin8000.owl.search.domain.repository.local.util.HasEntry class MeaningRoomRepository( private val meaningDao: DAOs.MeaningDao, diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/PhoneticRoomRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/PhoneticRoomRepository.kt similarity index 71% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/PhoneticRoomRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/PhoneticRoomRepository.kt index 56e475f5..e7d23f9f 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/PhoneticRoomRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/PhoneticRoomRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * PhoneticRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * PhoneticRoomRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * PhoneticRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * PhoneticRoomRepository.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,13 +19,13 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.repository.local +package io.github.yamin8000.owl.search.data.repository.local import io.github.yamin8000.owl.common.util.DateTimeUtils.epoch -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.DAOs -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.PhoneticEntity -import io.github.yamin8000.owl.feature_home.domain.model.Phonetic -import io.github.yamin8000.owl.feature_home.domain.repository.local.PhoneticRepository +import io.github.yamin8000.owl.search.data.datasource.local.dao.DAOs +import io.github.yamin8000.owl.search.data.datasource.local.entity.PhoneticEntity +import io.github.yamin8000.owl.search.domain.model.Phonetic +import io.github.yamin8000.owl.search.domain.repository.local.PhoneticRepository class PhoneticRoomRepository( private val phoneticDao: DAOs.PhoneticDao diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/TermRoomRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/TermRoomRepository.kt similarity index 69% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/TermRoomRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/TermRoomRepository.kt index f185f15f..ed30ecd1 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/local/TermRoomRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/local/TermRoomRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * TermRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * TermRoomRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * TermRoomRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * TermRoomRepository.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,13 +19,13 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.repository.local +package io.github.yamin8000.owl.search.data.repository.local import io.github.yamin8000.owl.common.ui.util.StringUtils.sanitizeWord import io.github.yamin8000.owl.common.util.DateTimeUtils.epoch -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.DAOs -import io.github.yamin8000.owl.feature_home.data.datasource.local.entity.TermEntity -import io.github.yamin8000.owl.feature_home.domain.repository.local.TermRepository +import io.github.yamin8000.owl.search.data.datasource.local.dao.DAOs +import io.github.yamin8000.owl.search.data.datasource.local.entity.TermEntity +import io.github.yamin8000.owl.search.domain.repository.local.TermRepository class TermRoomRepository( private val dao: DAOs.TermDao diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/remote/FreeDictionaryRetrofitApiRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/remote/FreeDictionaryRetrofitApiRepository.kt similarity index 61% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/remote/FreeDictionaryRetrofitApiRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/data/repository/remote/FreeDictionaryRetrofitApiRepository.kt index b709607f..7e596feb 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/data/repository/remote/FreeDictionaryRetrofitApiRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/data/repository/remote/FreeDictionaryRetrofitApiRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * FreeDictionaryRetrofitApiRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * FreeDictionaryRetrofitApiRepository.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * FreeDictionaryRetrofitApiRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * FreeDictionaryRetrofitApiRepository.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,11 +19,11 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.data.repository.remote +package io.github.yamin8000.owl.search.data.repository.remote -import io.github.yamin8000.owl.feature_home.data.datasource.remote.FreeDictionaryAPI -import io.github.yamin8000.owl.feature_home.domain.model.Entry -import io.github.yamin8000.owl.feature_home.domain.repository.remote.FreeDictionaryApiRepository +import io.github.yamin8000.owl.search.data.datasource.remote.FreeDictionaryAPI +import io.github.yamin8000.owl.search.domain.model.Entry +import io.github.yamin8000.owl.search.domain.repository.remote.FreeDictionaryApiRepository import javax.inject.Inject class FreeDictionaryRetrofitApiRepository @Inject constructor( diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeDb.kt b/search/src/main/java/io/github/yamin8000/owl/search/di/SearchDb.kt similarity index 63% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeDb.kt rename to search/src/main/java/io/github/yamin8000/owl/search/di/SearchDb.kt index a06d3e47..b8d6641e 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeDb.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/di/SearchDb.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * HomeModule.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * HomeModule.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * HomeDb.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * HomeDb.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.di +package io.github.yamin8000.owl.search.di import android.app.Application import androidx.room.Room @@ -27,26 +27,24 @@ import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import io.github.yamin8000.owl.feature_home.data.datasource.local.AppDatabase -import io.github.yamin8000.owl.feature_home.data.datasource.local.MIGRATION_7_8 -import io.github.yamin8000.owl.feature_home.data.datasource.local.dao.DAOs -import io.github.yamin8000.owl.feature_home.data.repository.TermSuggesterRepositoryImpl -import io.github.yamin8000.owl.feature_home.data.repository.local.DefinitionRoomRepository -import io.github.yamin8000.owl.feature_home.data.repository.local.EntryRoomRepository -import io.github.yamin8000.owl.feature_home.data.repository.local.MeaningRoomRepository -import io.github.yamin8000.owl.feature_home.data.repository.local.PhoneticRoomRepository -import io.github.yamin8000.owl.feature_home.data.repository.local.TermRoomRepository -import io.github.yamin8000.owl.feature_home.domain.repository.TermSuggesterRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.DefinitionRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.EntryRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.MeaningRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.PhoneticRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.TermRepository +import io.github.yamin8000.owl.search.data.datasource.local.AppDatabase +import io.github.yamin8000.owl.search.data.datasource.local.MIGRATION_7_8 +import io.github.yamin8000.owl.search.data.datasource.local.dao.DAOs +import io.github.yamin8000.owl.search.data.repository.local.DefinitionRoomRepository +import io.github.yamin8000.owl.search.data.repository.local.EntryRoomRepository +import io.github.yamin8000.owl.search.data.repository.local.MeaningRoomRepository +import io.github.yamin8000.owl.search.data.repository.local.PhoneticRoomRepository +import io.github.yamin8000.owl.search.data.repository.local.TermRoomRepository +import io.github.yamin8000.owl.search.domain.repository.local.DefinitionRepository +import io.github.yamin8000.owl.search.domain.repository.local.EntryRepository +import io.github.yamin8000.owl.search.domain.repository.local.MeaningRepository +import io.github.yamin8000.owl.search.domain.repository.local.PhoneticRepository +import io.github.yamin8000.owl.search.domain.repository.local.TermRepository import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object HomeDb { +object SearchDb { @Provides @Singleton @@ -143,11 +141,4 @@ object HomeDb { fun providesPhoneticRepository(dao: DAOs.PhoneticDao): PhoneticRepository { return PhoneticRoomRepository(dao) } - - @Provides - @Singleton - fun providesTermSuggesterRepository( - db: AppDatabase, - app: Application - ): TermSuggesterRepository = TermSuggesterRepositoryImpl(db.termDao(), app) } \ No newline at end of file diff --git a/search/src/main/java/io/github/yamin8000/owl/search/di/SearchUseCases.kt b/search/src/main/java/io/github/yamin8000/owl/search/di/SearchUseCases.kt new file mode 100644 index 00000000..922cbd5e --- /dev/null +++ b/search/src/main/java/io/github/yamin8000/owl/search/di/SearchUseCases.kt @@ -0,0 +1,61 @@ +/* + * freeDictionaryApp/freeDictionaryApp.search.main + * SearchUseCases.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * SearchUseCases.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. + * Copyright (C) 2024 Yamin Siahmargooei + * + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with freeDictionaryApp. If not, see . + */ + +package io.github.yamin8000.owl.search.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import io.github.yamin8000.owl.search.domain.repository.local.DefinitionRepository +import io.github.yamin8000.owl.search.domain.repository.local.EntryRepository +import io.github.yamin8000.owl.search.domain.repository.local.MeaningRepository +import io.github.yamin8000.owl.search.domain.repository.local.PhoneticRepository +import io.github.yamin8000.owl.search.domain.repository.local.TermRepository +import io.github.yamin8000.owl.search.domain.usecase.CacheWord +import io.github.yamin8000.owl.search.domain.usecase.CacheWordData +import io.github.yamin8000.owl.search.domain.usecase.GetCachedWord +import io.github.yamin8000.owl.search.domain.usecase.WordCacheUseCases +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object SearchUseCases { + + @Provides + @Singleton + fun providesWordCacheUseCases( + entryRepository: EntryRepository, + phoneticRepository: PhoneticRepository, + meaningRepository: MeaningRepository, + definitionRepository: DefinitionRepository, + termRepository: TermRepository + ) = WordCacheUseCases( + getCachedWord = GetCachedWord(entryRepository), + cacheWord = CacheWord( + entryRepository = entryRepository, + meaningRepository = meaningRepository, + definitionRepository = definitionRepository, + phoneticRepository = phoneticRepository + ), + cacheWordData = CacheWordData(termRepository) + ) +} \ No newline at end of file diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeWeb.kt b/search/src/main/java/io/github/yamin8000/owl/search/di/SearchWeb.kt similarity index 67% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeWeb.kt rename to search/src/main/java/io/github/yamin8000/owl/search/di/SearchWeb.kt index 228037f4..478ebdf6 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/di/HomeWeb.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/di/SearchWeb.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * HomeWebModule.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * HomeWebModule.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * SearchWeb.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * SearchWeb.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,16 +19,16 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.di +package io.github.yamin8000.owl.search.di import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import io.github.yamin8000.owl.feature_home.data.datasource.remote.FreeDictionaryAPI -import io.github.yamin8000.owl.feature_home.data.repository.remote.FreeDictionaryRetrofitApiRepository -import io.github.yamin8000.owl.feature_home.domain.repository.remote.FreeDictionaryApiRepository -import io.github.yamin8000.owl.feature_home.domain.usecase.SearchFreeDictionary +import io.github.yamin8000.owl.search.data.datasource.remote.FreeDictionaryAPI +import io.github.yamin8000.owl.search.data.repository.remote.FreeDictionaryRetrofitApiRepository +import io.github.yamin8000.owl.search.domain.repository.remote.FreeDictionaryApiRepository +import io.github.yamin8000.owl.search.domain.usecase.SearchFreeDictionary import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory import retrofit2.create @@ -36,7 +36,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object HomeWeb { +object SearchWeb { @Provides @Singleton diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Definition.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/Definition.kt similarity index 95% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Definition.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/model/Definition.kt index c96964ac..a6a44cdc 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Definition.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/Definition.kt @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.model +package io.github.yamin8000.owl.search.domain.model import com.squareup.moshi.JsonClass diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Entry.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/Entry.kt similarity index 66% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Entry.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/model/Entry.kt index a4879d43..6351e492 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Entry.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/Entry.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * Entry.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * Entry.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * Entry.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * Entry.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.model +package io.github.yamin8000.owl.search.domain.model import com.squareup.moshi.JsonClass diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/License.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/License.kt similarity index 95% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/License.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/model/License.kt index 62728c8c..fd5e56a3 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/License.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/License.kt @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.model +package io.github.yamin8000.owl.search.domain.model import com.squareup.moshi.JsonClass diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Meaning.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/Meaning.kt similarity index 66% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Meaning.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/model/Meaning.kt index 10417ef9..1ff1e433 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Meaning.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/Meaning.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * Meaning.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * Meaning.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * Meaning.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * Meaning.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.model +package io.github.yamin8000.owl.search.domain.model import com.squareup.moshi.JsonClass diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Phonetic.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/Phonetic.kt similarity index 66% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Phonetic.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/model/Phonetic.kt index 7621a87b..14112ad6 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/model/Phonetic.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/model/Phonetic.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * Phonetic.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * Phonetic.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * Phonetic.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * Phonetic.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.model +package io.github.yamin8000.owl.search.domain.model import com.squareup.moshi.JsonClass diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/DefinitionRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/DefinitionRepository.kt similarity index 58% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/DefinitionRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/DefinitionRepository.kt index e34859f0..d078594c 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/DefinitionRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/DefinitionRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * DefinitionRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * DefinitionRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * DefinitionRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * DefinitionRepository.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,10 +19,10 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.repository.local +package io.github.yamin8000.owl.search.domain.repository.local -import io.github.yamin8000.owl.feature_home.domain.model.Definition -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.BaseRepository +import io.github.yamin8000.owl.search.domain.model.Definition +import io.github.yamin8000.owl.search.domain.repository.local.util.BaseRepository interface DefinitionRepository : BaseRepository { suspend fun findAllByMeaningId(meaningId: Long): List diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/EntryRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/EntryRepository.kt similarity index 58% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/EntryRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/EntryRepository.kt index 93ba88fe..762fa98e 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/EntryRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/EntryRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * EntryRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * EntryRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * EntryRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * EntryRepository.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,10 +19,10 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.repository.local +package io.github.yamin8000.owl.search.domain.repository.local -import io.github.yamin8000.owl.feature_home.domain.model.Entry -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.BaseRepository +import io.github.yamin8000.owl.search.domain.model.Entry +import io.github.yamin8000.owl.search.domain.repository.local.util.BaseRepository interface EntryRepository : BaseRepository { suspend fun findByTerm(term: String): Entry? diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/MeaningRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/MeaningRepository.kt similarity index 54% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/MeaningRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/MeaningRepository.kt index 87a61a04..113e5171 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/MeaningRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/MeaningRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * MeaningRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * MeaningRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * MeaningRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * MeaningRepository.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,10 +19,10 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.repository.local +package io.github.yamin8000.owl.search.domain.repository.local -import io.github.yamin8000.owl.feature_home.domain.model.Meaning -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.BaseRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.HasEntry +import io.github.yamin8000.owl.search.domain.model.Meaning +import io.github.yamin8000.owl.search.domain.repository.local.util.BaseRepository +import io.github.yamin8000.owl.search.domain.repository.local.util.HasEntry interface MeaningRepository : BaseRepository, HasEntry \ No newline at end of file diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/PhoneticRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/PhoneticRepository.kt similarity index 54% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/PhoneticRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/PhoneticRepository.kt index d494d458..dc6ec429 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/PhoneticRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/PhoneticRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * PhoneticRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * PhoneticRepository.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * PhoneticRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * PhoneticRepository.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,10 +19,10 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.repository.local +package io.github.yamin8000.owl.search.domain.repository.local -import io.github.yamin8000.owl.feature_home.domain.model.Phonetic -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.BaseRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.HasEntry +import io.github.yamin8000.owl.search.domain.model.Phonetic +import io.github.yamin8000.owl.search.domain.repository.local.util.BaseRepository +import io.github.yamin8000.owl.search.domain.repository.local.util.HasEntry interface PhoneticRepository : BaseRepository, HasEntry \ No newline at end of file diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/TermRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/TermRepository.kt similarity index 63% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/TermRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/TermRepository.kt index e7eb5f0e..534c75ef 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/TermRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/TermRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * TermRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/30 + * freeDictionaryApp/freeDictionaryApp.search.main + * TermRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 * TermRepository.kt Last modified at 2024/8/30 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,8 +19,8 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.repository.local +package io.github.yamin8000.owl.search.domain.repository.local -import io.github.yamin8000.owl.feature_home.domain.repository.local.util.BaseRepository +import io.github.yamin8000.owl.search.domain.repository.local.util.BaseRepository interface TermRepository : BaseRepository \ No newline at end of file diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/util/BaseRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/util/BaseRepository.kt similarity index 94% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/util/BaseRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/util/BaseRepository.kt index 99da595d..72298107 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/util/BaseRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/util/BaseRepository.kt @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.repository.local.util +package io.github.yamin8000.owl.search.domain.repository.local.util interface BaseRepository { suspend fun add(item: T): Long diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/util/HasEntry.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/util/HasEntry.kt similarity index 94% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/util/HasEntry.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/util/HasEntry.kt index 2d2eea61..d0c061a1 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/local/util/HasEntry.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/local/util/HasEntry.kt @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.repository.local.util +package io.github.yamin8000.owl.search.domain.repository.local.util interface HasEntry { suspend fun findAllByEntryId(entryId: Long): List diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/remote/FreeDictionaryApiRepository.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/remote/FreeDictionaryApiRepository.kt similarity index 60% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/remote/FreeDictionaryApiRepository.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/repository/remote/FreeDictionaryApiRepository.kt index 0eb8ab1f..0f5e7e35 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/repository/remote/FreeDictionaryApiRepository.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/repository/remote/FreeDictionaryApiRepository.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * FreeDictionaryApiRepository.kt Copyrighted by Yamin Siahmargooei at 2024/8/18 - * FreeDictionaryApiRepository.kt Last modified at 2024/8/18 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * FreeDictionaryApiRepository.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * FreeDictionaryApiRepository.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,10 +19,9 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.repository.remote - -import io.github.yamin8000.owl.feature_home.domain.model.Entry +package io.github.yamin8000.owl.search.domain.repository.remote +import io.github.yamin8000.owl.search.domain.model.Entry interface FreeDictionaryApiRepository { suspend fun searchWord(word: String): List diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/CacheWord.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/CacheWord.kt similarity index 82% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/CacheWord.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/CacheWord.kt index dee7debc..1f65c8f4 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/CacheWord.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/CacheWord.kt @@ -19,14 +19,14 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.usecase +package io.github.yamin8000.owl.search.domain.usecase -import io.github.yamin8000.owl.feature_home.domain.model.Entry -import io.github.yamin8000.owl.feature_home.domain.model.Meaning -import io.github.yamin8000.owl.feature_home.domain.repository.local.DefinitionRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.EntryRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.MeaningRepository -import io.github.yamin8000.owl.feature_home.domain.repository.local.PhoneticRepository +import io.github.yamin8000.owl.search.domain.model.Entry +import io.github.yamin8000.owl.search.domain.model.Meaning +import io.github.yamin8000.owl.search.domain.repository.local.DefinitionRepository +import io.github.yamin8000.owl.search.domain.repository.local.EntryRepository +import io.github.yamin8000.owl.search.domain.repository.local.MeaningRepository +import io.github.yamin8000.owl.search.domain.repository.local.PhoneticRepository import kotlinx.collections.immutable.persistentListOf class CacheWord( diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/CacheWordData.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/CacheWordData.kt similarity index 89% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/CacheWordData.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/CacheWordData.kt index fe2ebf9e..66c4e8a1 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/CacheWordData.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/CacheWordData.kt @@ -19,12 +19,12 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.usecase +package io.github.yamin8000.owl.search.domain.usecase import io.github.yamin8000.owl.common.ui.util.StringUtils.sanitizeWords -import io.github.yamin8000.owl.feature_home.domain.model.Entry -import io.github.yamin8000.owl.feature_home.domain.model.Meaning -import io.github.yamin8000.owl.feature_home.domain.repository.local.TermRepository +import io.github.yamin8000.owl.search.domain.model.Entry +import io.github.yamin8000.owl.search.domain.model.Meaning +import io.github.yamin8000.owl.search.domain.repository.local.TermRepository class CacheWordData( private val termRepository: TermRepository diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/GetCachedWord.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/GetCachedWord.kt similarity index 86% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/GetCachedWord.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/GetCachedWord.kt index cc28d9b9..1a08e2f4 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/GetCachedWord.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/GetCachedWord.kt @@ -19,10 +19,10 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.usecase +package io.github.yamin8000.owl.search.domain.usecase -import io.github.yamin8000.owl.feature_home.domain.model.Entry -import io.github.yamin8000.owl.feature_home.domain.repository.local.EntryRepository +import io.github.yamin8000.owl.search.domain.model.Entry +import io.github.yamin8000.owl.search.domain.repository.local.EntryRepository class GetCachedWord( private val entryRepository: EntryRepository diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/SearchFreeDictionary.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/SearchFreeDictionary.kt similarity index 85% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/SearchFreeDictionary.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/SearchFreeDictionary.kt index 830d5d5f..365abcd2 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/SearchFreeDictionary.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/SearchFreeDictionary.kt @@ -19,10 +19,10 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.usecase +package io.github.yamin8000.owl.search.domain.usecase -import io.github.yamin8000.owl.feature_home.domain.model.Entry -import io.github.yamin8000.owl.feature_home.domain.repository.remote.FreeDictionaryApiRepository +import io.github.yamin8000.owl.search.domain.model.Entry +import io.github.yamin8000.owl.search.domain.repository.remote.FreeDictionaryApiRepository class SearchFreeDictionary( private val repository: FreeDictionaryApiRepository diff --git a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/WordCacheUseCases.kt b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/WordCacheUseCases.kt similarity index 66% rename from feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/WordCacheUseCases.kt rename to search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/WordCacheUseCases.kt index 78046012..70994b0a 100644 --- a/feature_home/src/main/java/io/github/yamin8000/owl/feature_home/domain/usecase/WordCacheUseCases.kt +++ b/search/src/main/java/io/github/yamin8000/owl/search/domain/usecase/WordCacheUseCases.kt @@ -1,16 +1,16 @@ /* - * freeDictionaryApp/freeDictionaryApp.feature_home.main - * WordCacheUseCases.kt Copyrighted by Yamin Siahmargooei at 2024/8/25 - * WordCacheUseCases.kt Last modified at 2024/8/25 - * This file is part of freeDictionaryApp/freeDictionaryApp.feature_home.main. + * freeDictionaryApp/freeDictionaryApp.search.main + * WordCacheUseCases.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * WordCacheUseCases.kt Last modified at 2024/8/30 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. * Copyright (C) 2024 Yamin Siahmargooei * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is free software: you can redistribute it and/or modify + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * freeDictionaryApp/freeDictionaryApp.feature_home.main is distributed in the hope that it will be useful, + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. @@ -19,7 +19,7 @@ * along with freeDictionaryApp. If not, see . */ -package io.github.yamin8000.owl.feature_home.domain.usecase +package io.github.yamin8000.owl.search.domain.usecase data class WordCacheUseCases( val getCachedWord: GetCachedWord, diff --git a/search/src/main/java/io/github/yamin8000/owl/search/ui/components/SearchComponents.kt b/search/src/main/java/io/github/yamin8000/owl/search/ui/components/SearchComponents.kt new file mode 100644 index 00000000..7abac092 --- /dev/null +++ b/search/src/main/java/io/github/yamin8000/owl/search/ui/components/SearchComponents.kt @@ -0,0 +1,239 @@ +/* + * freeDictionaryApp/freeDictionaryApp.search.main + * SearchComponents.kt Copyrighted by Yamin Siahmargooei at 2024/9/5 + * SearchComponents.kt Last modified at 2024/9/5 + * This file is part of freeDictionaryApp/freeDictionaryApp.search.main. + * Copyright (C) 2024 Yamin Siahmargooei + * + * freeDictionaryApp/freeDictionaryApp.search.main is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * freeDictionaryApp/freeDictionaryApp.search.main is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with freeDictionaryApp. If not, see . + */ + +package io.github.yamin8000.owl.search.ui.components + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.indication +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.twotone.ShortText +import androidx.compose.material.icons.automirrored.twotone.TextSnippet +import androidx.compose.material.icons.twotone.Category +import androidx.compose.material.icons.twotone.Favorite +import androidx.compose.material.icons.twotone.RecordVoiceOver +import androidx.compose.material.icons.twotone.Share +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedCard +import androidx.compose.material3.ripple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import io.github.yamin8000.owl.common.ui.components.ClickableIcon +import io.github.yamin8000.owl.common.ui.components.HighlightText +import io.github.yamin8000.owl.common.ui.components.SpeakableRippleTextWithIcon +import io.github.yamin8000.owl.common.ui.theme.DefaultCutShape +import io.github.yamin8000.owl.common.ui.theme.defaultGradientBorder +import io.github.yamin8000.owl.search.domain.model.Meaning +import io.github.yamin8000.owl.strings.R + +@Composable +fun WordCard( + modifier: Modifier = Modifier, + word: String, + pronunciation: String?, + onAddToFavourite: (() -> Unit)? = null, + onShareWord: (() -> Unit)? = null +) { + OutlinedCard( + shape = DefaultCutShape, + border = BorderStroke(1.dp, MaterialTheme.colorScheme.tertiary), + modifier = modifier + .fillMaxWidth() + .indication( + interactionSource = remember { MutableInteractionSource() }, + indication = ripple(), + ), + content = { + Row( + modifier = Modifier.fillMaxWidth(), + content = { + Column( + modifier = Modifier + .weight(2f) + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + horizontalAlignment = Alignment.Start, + content = { + WordText(word) + if (!pronunciation.isNullOrBlank()) { + PronunciationText( + word = word, + pronunciation = pronunciation, + ) + } + } + ) + Column( + modifier = Modifier + .weight(1f) + .padding(16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + horizontalAlignment = Alignment.End, + content = { + if (onAddToFavourite != null) { + ClickableIcon( + imageVector = Icons.TwoTone.Favorite, + contentDescription = stringResource(R.string.favourites), + onClick = onAddToFavourite + ) + } + if (onShareWord != null) { + ClickableIcon( + imageVector = Icons.TwoTone.Share, + contentDescription = stringResource(R.string.share), + onClick = onShareWord + ) + } + } + ) + } + ) + } + ) +} + +@Composable +internal fun WordText( + word: String +) { + SpeakableRippleTextWithIcon( + text = word, + imageVector = Icons.AutoMirrored.TwoTone.ShortText, + ) +} + +@Composable +internal fun PronunciationText( + pronunciation: String, + word: String, +) { + SpeakableRippleTextWithIcon( + text = pronunciation, + ttsText = word, + imageVector = Icons.TwoTone.RecordVoiceOver, + ) +} + +@Composable +fun MeaningCard( + modifier: Modifier = Modifier, + word: String, + meaning: Meaning, + onWordChipClick: ((String) -> Unit)? = null +) { + OutlinedCard( + shape = DefaultCutShape, + modifier = modifier.fillMaxWidth(), + border = defaultGradientBorder(), + content = { + Column( + modifier = Modifier.padding(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + content = { + WordTypeText( + meaning.partOfSpeech, + onDoubleClick = onWordChipClick + ) + meaning.definitions.forEach { (definition, example, synonyms, antonyms) -> + WordDefinitionText( + word = word, + definition = definition, + onDoubleClick = onWordChipClick + ) + if (example != null) { + WordExampleText( + word = word, + example = example, + onDoubleClick = onWordChipClick + ) + } + antonyms.forEach { antonym -> + SpeakableRippleTextWithIcon( + text = antonym, + imageVector = Icons.AutoMirrored.TwoTone.TextSnippet, + title = stringResource(R.string.antonym), + ) + } + synonyms.forEach { synonym -> + SpeakableRippleTextWithIcon( + text = synonym, + imageVector = Icons.AutoMirrored.TwoTone.TextSnippet, + title = stringResource(R.string.synonym), + ) + } + } + } + ) + } + ) +} + +@Composable +internal fun WordExampleText( + word: String, + example: String, + onDoubleClick: ((String) -> Unit)? = null +) { + SpeakableRippleTextWithIcon( + text = example, + imageVector = Icons.AutoMirrored.TwoTone.TextSnippet, + title = stringResource(R.string.example), + content = { HighlightText(fullText = example, highlightedText = word) }, + onDoubleClick = onDoubleClick, + ) +} + +@Composable +internal fun WordDefinitionText( + word: String, + definition: String, + onDoubleClick: ((String) -> Unit)? = null +) { + SpeakableRippleTextWithIcon( + text = definition, + imageVector = Icons.AutoMirrored.TwoTone.ShortText, + title = stringResource(R.string.definition), + content = { HighlightText(fullText = definition, highlightedText = word) }, + onDoubleClick = onDoubleClick, + ) +} + +@Composable +internal fun WordTypeText( + type: String, + onDoubleClick: ((String) -> Unit)? = null +) { + SpeakableRippleTextWithIcon( + text = type, + imageVector = Icons.TwoTone.Category, + title = stringResource(R.string.type), + onDoubleClick = onDoubleClick, + ) +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index dc52b44f..d4b244b0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -42,3 +42,5 @@ include(":feature_home") include(":feature_settings") include(":feature_history") include(":feature_favourites") +include(":feature_overlay") +include(":search") diff --git a/strings/consumer-rules.pro b/strings/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/strings/src/main/res/values/strings.xml b/strings/src/main/res/values/strings.xml index f2d3acd5..4e869def 100644 --- a/strings/src/main/res/values/strings.xml +++ b/strings/src/main/res/values/strings.xml @@ -71,4 +71,6 @@ Back Do you want to remove all? Cancelled + Close + More in app... \ No newline at end of file