From 5ae0ec42b70d8f3730babd931480c88eacfd4236 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sun, 12 Jun 2022 13:28:02 +0200 Subject: [PATCH] Filter hidden items in UI layer --- app/build.gradle.kts | 1 - .../de/mm20/launcher2/LauncherApplication.kt | 2 - applications/build.gradle.kts | 1 - .../launcher2/applications/AppRepository.kt | 29 +++-------- .../de/mm20/launcher2/applications/Module.kt | 2 +- appshortcuts/build.gradle.kts | 1 - .../appshortcuts/AppShortcutRepository.kt | 32 ++++++------ .../de/mm20/launcher2/appshortcuts/Module.kt | 2 +- calendar/build.gradle.kts | 1 - .../launcher2/calendar/CalendarRepository.kt | 49 +++++++------------ .../java/de/mm20/launcher2/calendar/Module.kt | 2 +- contacts/build.gradle.kts | 1 - .../launcher2/contacts/ContactRepository.kt | 18 ++----- .../java/de/mm20/launcher2/contacts/Module.kt | 2 +- .../de/mm20/launcher2/database/SearchDao.kt | 3 ++ .../favorites/FavoritesRepository.kt | 10 ++++ files/build.gradle.kts | 1 - .../mm20/launcher2/files/FilesRepository.kt | 14 ++---- .../java/de/mm20/launcher2/files/Module.kt | 2 +- hiddenitems/.gitignore | 1 - hiddenitems/build.gradle.kts | 46 ----------------- hiddenitems/consumer-rules.pro | 0 hiddenitems/proguard-rules.pro | 21 -------- hiddenitems/src/main/AndroidManifest.xml | 4 -- .../hiddenitems/HiddenItemsRepository.kt | 38 -------------- .../de/mm20/launcher2/hiddenitems/Module.kt | 9 ---- settings.gradle.kts | 1 - .../launcher2/ui/launcher/search/SearchVM.kt | 40 +++++++++------ .../widgets/calendar/CalendarWidgetVM.kt | 6 ++- .../HiddenItemsSettingsScreenVM.kt | 2 +- 30 files changed, 96 insertions(+), 245 deletions(-) delete mode 100644 hiddenitems/.gitignore delete mode 100644 hiddenitems/build.gradle.kts delete mode 100644 hiddenitems/consumer-rules.pro delete mode 100644 hiddenitems/proguard-rules.pro delete mode 100644 hiddenitems/src/main/AndroidManifest.xml delete mode 100644 hiddenitems/src/main/java/de/mm20/launcher2/hiddenitems/HiddenItemsRepository.kt delete mode 100644 hiddenitems/src/main/java/de/mm20/launcher2/hiddenitems/Module.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 68f7fab0..ba3563dd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -120,7 +120,6 @@ dependencies { implementation(project(":favorites")) implementation(project(":files")) implementation(project(":g-services")) - implementation(project(":hiddenitems")) implementation(project(":i18n")) implementation(project(":icons")) implementation(project(":ktx")) diff --git a/app/src/main/java/de/mm20/launcher2/LauncherApplication.kt b/app/src/main/java/de/mm20/launcher2/LauncherApplication.kt index 160b8d57..dc2850e4 100644 --- a/app/src/main/java/de/mm20/launcher2/LauncherApplication.kt +++ b/app/src/main/java/de/mm20/launcher2/LauncherApplication.kt @@ -15,7 +15,6 @@ import de.mm20.launcher2.contacts.contactsModule import de.mm20.launcher2.debug.Debug import de.mm20.launcher2.favorites.favoritesModule import de.mm20.launcher2.files.filesModule -import de.mm20.launcher2.hiddenitems.hiddenItemsModule import de.mm20.launcher2.icons.iconsModule import de.mm20.launcher2.music.musicModule import de.mm20.launcher2.search.searchModule @@ -61,7 +60,6 @@ class LauncherApplication : Application(), CoroutineScope, ImageLoaderFactory { databaseModule, favoritesModule, filesModule, - hiddenItemsModule, iconsModule, musicModule, notificationsModule, diff --git a/applications/build.gradle.kts b/applications/build.gradle.kts index c5947322..1450c223 100644 --- a/applications/build.gradle.kts +++ b/applications/build.gradle.kts @@ -51,7 +51,6 @@ dependencies { implementation(project(":base")) implementation(project(":preferences")) implementation(project(":ktx")) - implementation(project(":hiddenitems")) implementation(project(":compat")) } \ No newline at end of file diff --git a/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt b/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt index f2849f8c..f1032cf0 100644 --- a/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt +++ b/applications/src/main/java/de/mm20/launcher2/applications/AppRepository.kt @@ -11,7 +11,6 @@ import android.os.Process import android.os.UserHandle import android.util.Log import com.github.promeg.pinyinhelper.Pinyin -import de.mm20.launcher2.hiddenitems.HiddenItemsRepository import de.mm20.launcher2.search.data.AppInstallation import de.mm20.launcher2.search.data.Application import de.mm20.launcher2.search.data.LauncherApp @@ -23,13 +22,12 @@ import java.util.* interface AppRepository { fun search(query: String): Flow> - fun getAllInstalledApps(includeHidden: Boolean = false): Flow> + fun getAllInstalledApps(): Flow> fun getSuspendedPackages(): Flow> } internal class AppRepositoryImpl( private val context: Context, - hiddenItemsRepository: HiddenItemsRepository, ) : AppRepository { private val launcherApps = @@ -37,7 +35,6 @@ internal class AppRepositoryImpl( private val installedApps = MutableStateFlow>(emptyList()) private val installations = MutableStateFlow>(mutableListOf()) - private val hiddenItems = hiddenItemsRepository.hiddenItemsKeys private val suspendedPackages = MutableStateFlow>(emptyList()) @@ -191,7 +188,7 @@ internal class AppRepositoryImpl( override fun search(query: String): Flow> = channelFlow { - merge(installedApps, hiddenItems, installations).collectLatest { + merge(installedApps, installations).collectLatest { withContext(Dispatchers.Default) { val appResults = mutableListOf() if (query.isEmpty()) { @@ -204,13 +201,11 @@ internal class AppRepositoryImpl( appResults.addAll(installations.value.filter { matches(it.label, query) }) + + val componentName = ComponentName.unflattenFromString(query) + getActivityByComponentName(componentName)?.let { appResults.add(it) } } - val componentName = ComponentName.unflattenFromString(query) - getActivityByComponentName(componentName)?.let { appResults.add(it) } - - appResults.removeAll { hiddenItems.value.contains(it.key) } - appResults.sort() send(appResults) @@ -218,18 +213,8 @@ internal class AppRepositoryImpl( } } - override fun getAllInstalledApps(includeHidden: Boolean): Flow> { - return if (!includeHidden) { - channelFlow { - hiddenItems.collectLatest { hidden -> - installedApps.collectLatest { apps -> - send(apps.filter { !hidden.contains(it.key) }) - } - } - } - } else { - installedApps - } + override fun getAllInstalledApps(): Flow> { + return installedApps } private fun matches(label: String, query: String): Boolean { diff --git a/applications/src/main/java/de/mm20/launcher2/applications/Module.kt b/applications/src/main/java/de/mm20/launcher2/applications/Module.kt index 1bb7be8f..c3131e48 100644 --- a/applications/src/main/java/de/mm20/launcher2/applications/Module.kt +++ b/applications/src/main/java/de/mm20/launcher2/applications/Module.kt @@ -5,5 +5,5 @@ import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val applicationsModule = module { - single { AppRepositoryImpl(androidContext(), get()) } + single { AppRepositoryImpl(androidContext()) } } \ No newline at end of file diff --git a/appshortcuts/build.gradle.kts b/appshortcuts/build.gradle.kts index 57c552e4..274b44dd 100644 --- a/appshortcuts/build.gradle.kts +++ b/appshortcuts/build.gradle.kts @@ -46,7 +46,6 @@ dependencies { implementation(project(":search")) implementation(project(":permissions")) - implementation(project(":hiddenitems")) implementation(project(":base")) implementation(project(":preferences")) implementation(project(":ktx")) diff --git a/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/AppShortcutRepository.kt b/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/AppShortcutRepository.kt index 33983261..f704c8ec 100644 --- a/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/AppShortcutRepository.kt +++ b/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/AppShortcutRepository.kt @@ -7,7 +7,6 @@ import android.content.pm.PackageManager import android.os.Process import androidx.core.content.getSystemService import com.github.promeg.pinyinhelper.Pinyin -import de.mm20.launcher2.hiddenitems.HiddenItemsRepository import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherDataStore @@ -33,7 +32,6 @@ interface AppShortcutRepository { internal class AppShortcutRepositoryImpl( private val context: Context, private val permissionsManager: PermissionsManager, - private val hiddenItemsRepository: HiddenItemsRepository, private val dataStore: LauncherDataStore, ) : AppShortcutRepository { @@ -110,22 +108,20 @@ internal class AppShortcutRepositoryImpl( val pm = context.packageManager - hiddenItemsRepository.hiddenItemsKeys.collectLatest { hidden -> - send( - shortcuts.mapNotNull { - val label = try { - pm.getApplicationInfo(it.`package`, 0).loadLabel(pm).toString() - } catch (e: PackageManager.NameNotFoundException) { - "" - } - AppShortcut( - context, - it, - label - ).takeIf { !hidden.contains(it.key) } - }.sorted() - ) - } + send( + shortcuts.mapNotNull { + val label = try { + pm.getApplicationInfo(it.`package`, 0).loadLabel(pm).toString() + } catch (e: PackageManager.NameNotFoundException) { + "" + } + AppShortcut( + context, + it, + label + ) + }.sorted() + ) } } } diff --git a/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/Module.kt b/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/Module.kt index ecedc77c..e3b727dd 100644 --- a/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/Module.kt +++ b/appshortcuts/src/main/java/de/mm20/launcher2/appshortcuts/Module.kt @@ -4,5 +4,5 @@ import org.koin.android.ext.koin.androidContext import org.koin.dsl.module val appShortcutsModule = module { - single { AppShortcutRepositoryImpl(androidContext(), get(), get(), get()) } + single { AppShortcutRepositoryImpl(androidContext(), get(), get()) } } \ No newline at end of file diff --git a/calendar/build.gradle.kts b/calendar/build.gradle.kts index 3ef4a695..bbcecef4 100644 --- a/calendar/build.gradle.kts +++ b/calendar/build.gradle.kts @@ -46,7 +46,6 @@ dependencies { implementation(project(":preferences")) implementation(project(":ktx")) implementation(project(":base")) - implementation(project(":hiddenitems")) implementation(project(":permissions")) implementation(project(":material-color-utilities")) diff --git a/calendar/src/main/java/de/mm20/launcher2/calendar/CalendarRepository.kt b/calendar/src/main/java/de/mm20/launcher2/calendar/CalendarRepository.kt index 97d7bb78..c4fe168c 100644 --- a/calendar/src/main/java/de/mm20/launcher2/calendar/CalendarRepository.kt +++ b/calendar/src/main/java/de/mm20/launcher2/calendar/CalendarRepository.kt @@ -1,12 +1,9 @@ package de.mm20.launcher2.calendar -import android.Manifest import android.content.ContentUris import android.content.Context import android.provider.CalendarContract import androidx.core.database.getStringOrNull -import de.mm20.launcher2.hiddenitems.HiddenItemsRepository -import de.mm20.launcher2.ktx.checkPermission import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherDataStore @@ -29,23 +26,21 @@ interface CalendarRepository { internal class CalendarRepositoryImpl( private val context: Context, - hiddenItemsRepository: HiddenItemsRepository ) : CalendarRepository, KoinComponent { private val dataStore: LauncherDataStore by inject() private val permissionsManager: PermissionsManager by inject() - private val hiddenItems = hiddenItemsRepository.hiddenItemsKeys - - override fun search(query: String): Flow> = channelFlow { + override fun search(query: String): Flow> { if (query.isBlank() || query.length < 3) { - send(emptyList()) - return@channelFlow + return flow { + emit(emptyList()) + } } val hasPermission = permissionsManager.hasPermission(PermissionGroup.Calendar) val searchCalendar = dataStore.data.map { it.calendarSearch.enabled } - combine(hasPermission, searchCalendar) { permission, search -> + return combine(hasPermission, searchCalendar) { permission, search -> permission && search }.map { if (it) { @@ -58,12 +53,6 @@ internal class CalendarRepositoryImpl( } else { emptyList() } - }.flatMapLatest { events -> - hiddenItems.map { hidden -> - events.filter { !hidden.contains(it.key) } - } - }.collectLatest { - send(it) } } @@ -160,23 +149,19 @@ internal class CalendarRepositoryImpl( hasPermission.collectLatest { if (it) { dataStore.data.map { it.calendarWidget }.collectLatest { settings -> - hiddenItems.collectLatest { hidden -> - val now = System.currentTimeMillis() - val end = now + 14 * 24 * 60 * 60 * 1000L - val events = withContext(Dispatchers.IO) { - queryCalendarEvents( - query = "", - intervalStart = now, - intervalEnd = end, - limit = 700, - excludeAllDayEvents = settings.hideAlldayEvents, - excludeCalendars = settings.excludeCalendarsList - ).filter { - !hiddenItems.value.contains(it.key) - } - } - send(events) + val now = System.currentTimeMillis() + val end = now + 14 * 24 * 60 * 60 * 1000L + val events = withContext(Dispatchers.IO) { + queryCalendarEvents( + query = "", + intervalStart = now, + intervalEnd = end, + limit = 700, + excludeAllDayEvents = settings.hideAlldayEvents, + excludeCalendars = settings.excludeCalendarsList + ) } + send(events) } } else { send(emptyList()) diff --git a/calendar/src/main/java/de/mm20/launcher2/calendar/Module.kt b/calendar/src/main/java/de/mm20/launcher2/calendar/Module.kt index f03c78b6..56b6b377 100644 --- a/calendar/src/main/java/de/mm20/launcher2/calendar/Module.kt +++ b/calendar/src/main/java/de/mm20/launcher2/calendar/Module.kt @@ -5,5 +5,5 @@ import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val calendarModule = module { - single { CalendarRepositoryImpl(androidContext(), get()) } + single { CalendarRepositoryImpl(androidContext()) } } \ No newline at end of file diff --git a/contacts/build.gradle.kts b/contacts/build.gradle.kts index d4ca2e94..449b23bc 100644 --- a/contacts/build.gradle.kts +++ b/contacts/build.gradle.kts @@ -46,7 +46,6 @@ dependencies { implementation(project(":preferences")) implementation(project(":ktx")) implementation(project(":base")) - implementation(project(":hiddenitems")) implementation(project(":permissions")) } \ No newline at end of file diff --git a/contacts/src/main/java/de/mm20/launcher2/contacts/ContactRepository.kt b/contacts/src/main/java/de/mm20/launcher2/contacts/ContactRepository.kt index 01b5d3f3..8d2237ab 100644 --- a/contacts/src/main/java/de/mm20/launcher2/contacts/ContactRepository.kt +++ b/contacts/src/main/java/de/mm20/launcher2/contacts/ContactRepository.kt @@ -2,7 +2,6 @@ package de.mm20.launcher2.contacts import android.content.Context import android.provider.ContactsContract -import de.mm20.launcher2.hiddenitems.HiddenItemsRepository import de.mm20.launcher2.permissions.PermissionGroup import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherDataStore @@ -19,23 +18,22 @@ interface ContactRepository { internal class ContactRepositoryImpl( private val context: Context, - hiddenItemsRepository: HiddenItemsRepository ) : ContactRepository, KoinComponent { private val permissionsManager: PermissionsManager by inject() private val dataStore: LauncherDataStore by inject() - private val hiddenItems = hiddenItemsRepository.hiddenItemsKeys - override fun search(query: String): Flow> = channelFlow { + override fun search(query: String): Flow> { val searchContacts = dataStore.data.map { it.contactsSearch.enabled } val hasPermission = permissionsManager.hasPermission(PermissionGroup.Contacts) if (query.length < 3) { - send(emptyList()) - return@channelFlow + return flow { + emit(emptyList()) + } } - combine(searchContacts, hasPermission) { search, permission -> + return combine(searchContacts, hasPermission) { search, permission -> search && permission }.map { if (it) { @@ -43,12 +41,6 @@ internal class ContactRepositoryImpl( } else { emptyList() } - }.flatMapLatest { contacts -> - hiddenItems.map { hidden -> - contacts.filter { !hidden.contains(it.key) } - } - }.collectLatest { - send(it) } } diff --git a/contacts/src/main/java/de/mm20/launcher2/contacts/Module.kt b/contacts/src/main/java/de/mm20/launcher2/contacts/Module.kt index a94ea095..80dc4aea 100644 --- a/contacts/src/main/java/de/mm20/launcher2/contacts/Module.kt +++ b/contacts/src/main/java/de/mm20/launcher2/contacts/Module.kt @@ -5,5 +5,5 @@ import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val contactsModule = module { - single { ContactRepositoryImpl(androidContext(), get()) } + single { ContactRepositoryImpl(androidContext()) } } \ No newline at end of file diff --git a/database/src/main/java/de/mm20/launcher2/database/SearchDao.kt b/database/src/main/java/de/mm20/launcher2/database/SearchDao.kt index baad5026..ecd562a7 100644 --- a/database/src/main/java/de/mm20/launcher2/database/SearchDao.kt +++ b/database/src/main/java/de/mm20/launcher2/database/SearchDao.kt @@ -24,6 +24,9 @@ interface SearchDao { @Query("SELECT * FROM Searchable WHERE pinned > 0 AND `key` LIKE 'calendar://%' ORDER BY pinned DESC, launchCount DESC") fun getPinnedCalendarEvents(): Flow> + @Query("SELECT `key` FROM Searchable WHERE hidden = 1 AND `key` LIKE 'calendar://%'") + fun getHiddenCalendarEventKeys(): Flow> + @Query("SELECT COUNT(key) as count FROM Searchable WHERE pinned = 1;") fun getPinCount(): Int diff --git a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt index 777c6e3a..3327458e 100644 --- a/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt +++ b/favorites/src/main/java/de/mm20/launcher2/favorites/FavoritesRepository.kt @@ -27,6 +27,7 @@ interface FavoritesRepository { ): Flow> fun getPinnedCalendarEvents(): Flow> + fun getHiddenCalendarEventKeys(): Flow> fun isPinned(searchable: Searchable): Flow fun pinItem(searchable: Searchable) fun unpinItem(searchable: Searchable) @@ -37,6 +38,7 @@ interface FavoritesRepository { suspend fun getAllFavoriteItems(): List fun saveFavorites(favorites: List) fun getHiddenItems(): Flow> + fun getHiddenItemKeys(): Flow> suspend fun export(toDir: File) suspend fun import(fromDir: File) @@ -91,6 +93,10 @@ internal class FavoritesRepositoryImpl( } } + override fun getHiddenCalendarEventKeys(): Flow> { + return database.searchDao().getHiddenCalendarEventKeys() + } + override fun isPinned(searchable: Searchable): Flow { return AppDatabase.getInstance(context).searchDao().isPinned(searchable.key) } @@ -184,6 +190,10 @@ internal class FavoritesRepositoryImpl( } } + override fun getHiddenItemKeys(): Flow> { + return database.searchDao().getHiddenItemKeys() + } + private fun fromDatabaseEntity(entity: FavoritesItemEntity): FavoritesItem { val deserializer: SearchableDeserializer = diff --git a/files/build.gradle.kts b/files/build.gradle.kts index 95e133f7..3abf2408 100644 --- a/files/build.gradle.kts +++ b/files/build.gradle.kts @@ -45,7 +45,6 @@ dependencies { implementation(libs.koin.android) implementation(project(":search")) - implementation(project(":hiddenitems")) implementation(project(":preferences")) implementation(project(":base")) implementation(project(":ktx")) diff --git a/files/src/main/java/de/mm20/launcher2/files/FilesRepository.kt b/files/src/main/java/de/mm20/launcher2/files/FilesRepository.kt index f804cca2..cbfb6b2c 100644 --- a/files/src/main/java/de/mm20/launcher2/files/FilesRepository.kt +++ b/files/src/main/java/de/mm20/launcher2/files/FilesRepository.kt @@ -1,9 +1,7 @@ package de.mm20.launcher2.files import android.content.Context -import android.util.Log import de.mm20.launcher2.files.providers.* -import de.mm20.launcher2.hiddenitems.HiddenItemsRepository import de.mm20.launcher2.nextcloud.NextcloudApiHelper import de.mm20.launcher2.owncloud.OwncloudClient import de.mm20.launcher2.permissions.PermissionsManager @@ -22,14 +20,12 @@ interface FileRepository { internal class FileRepositoryImpl( private val context: Context, - hiddenItemsRepository: HiddenItemsRepository, private val dataStore: LauncherDataStore, private val permissionsManager: PermissionsManager, ) : FileRepository { private val scope = CoroutineScope(Job() + Dispatchers.Default) - private val hiddenItems = hiddenItemsRepository.hiddenItemsKeys private val providers = MutableStateFlow>(emptyList()) @@ -75,12 +71,10 @@ internal class FileRepositoryImpl( send(emptyList()) return@collectLatest } - hiddenItems.collectLatest { hiddenItems -> - val results = mutableListOf() - for (provider in providers) { - results.addAll(provider.search(query)) - send(results.toList()) - } + val results = mutableListOf() + for (provider in providers) { + results.addAll(provider.search(query)) + send(results.toList()) } } } diff --git a/files/src/main/java/de/mm20/launcher2/files/Module.kt b/files/src/main/java/de/mm20/launcher2/files/Module.kt index aada5204..5e8660ea 100644 --- a/files/src/main/java/de/mm20/launcher2/files/Module.kt +++ b/files/src/main/java/de/mm20/launcher2/files/Module.kt @@ -5,5 +5,5 @@ import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.module val filesModule = module { - single { FileRepositoryImpl(androidContext(), get(), get(), get()) } + single { FileRepositoryImpl(androidContext(), get(), get()) } } \ No newline at end of file diff --git a/hiddenitems/.gitignore b/hiddenitems/.gitignore deleted file mode 100644 index 42afabfd..00000000 --- a/hiddenitems/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/hiddenitems/build.gradle.kts b/hiddenitems/build.gradle.kts deleted file mode 100644 index 80d1de51..00000000 --- a/hiddenitems/build.gradle.kts +++ /dev/null @@ -1,46 +0,0 @@ -plugins { - id("com.android.library") - id("kotlin-android") -} - -android { - compileSdk = sdk.versions.compileSdk.get().toInt() - - defaultConfig { - minSdk = sdk.versions.minSdk.get().toInt() - targetSdk = sdk.versions.targetSdk.get().toInt() - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - kotlinOptions { - jvmTarget = "1.8" - } - namespace = "de.mm20.launcher2.hiddenitems" -} - -dependencies { - implementation(libs.bundles.kotlin) - implementation(libs.androidx.core) - implementation(libs.androidx.appcompat) - - implementation(libs.koin.android) - - implementation(project(":database")) - implementation(project(":search")) -} \ No newline at end of file diff --git a/hiddenitems/consumer-rules.pro b/hiddenitems/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/hiddenitems/proguard-rules.pro b/hiddenitems/proguard-rules.pro deleted file mode 100644 index 01639a19..00000000 --- a/hiddenitems/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle.kts.kts.kts. -# -# 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/hiddenitems/src/main/AndroidManifest.xml b/hiddenitems/src/main/AndroidManifest.xml deleted file mode 100644 index a5c40216..00000000 --- a/hiddenitems/src/main/AndroidManifest.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - / - \ No newline at end of file diff --git a/hiddenitems/src/main/java/de/mm20/launcher2/hiddenitems/HiddenItemsRepository.kt b/hiddenitems/src/main/java/de/mm20/launcher2/hiddenitems/HiddenItemsRepository.kt deleted file mode 100644 index 967d1850..00000000 --- a/hiddenitems/src/main/java/de/mm20/launcher2/hiddenitems/HiddenItemsRepository.kt +++ /dev/null @@ -1,38 +0,0 @@ -package de.mm20.launcher2.hiddenitems - -import android.content.Context -import androidx.lifecycle.LiveData -import androidx.lifecycle.MediatorLiveData -import de.mm20.launcher2.database.AppDatabase -import de.mm20.launcher2.search.data.Searchable -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch - -/** - * A low level repository for hidden items. This can only be used to retrieve keys and to check - * whether an item is hidden. To retrieve actual Searchable objects, use FavoritesRepository. - */ -class HiddenItemsRepository(val context: Context, database: AppDatabase) { - - val scope = CoroutineScope(Job() + Dispatchers.Default) - val hiddenItemsKeys = MutableStateFlow>(emptyList()) - - init { - scope.launch { - AppDatabase.getInstance(context).searchDao().getHiddenItemKeys().collectLatest { - hiddenItemsKeys.value = it - } - } - } - - - fun isHidden(item: Searchable): Flow { - return AppDatabase.getInstance(context).searchDao().isHidden(item.key) - } -} \ No newline at end of file diff --git a/hiddenitems/src/main/java/de/mm20/launcher2/hiddenitems/Module.kt b/hiddenitems/src/main/java/de/mm20/launcher2/hiddenitems/Module.kt deleted file mode 100644 index 24afc517..00000000 --- a/hiddenitems/src/main/java/de/mm20/launcher2/hiddenitems/Module.kt +++ /dev/null @@ -1,9 +0,0 @@ -package de.mm20.launcher2.hiddenitems - -import org.koin.android.ext.koin.androidContext -import org.koin.androidx.viewmodel.dsl.viewModel -import org.koin.dsl.module - -val hiddenItemsModule = module { - single { HiddenItemsRepository(androidContext(), get()) } -} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index f213a320..8b271066 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,7 +11,6 @@ include(":contacts") include(":g-services") include(":files") include(":calculator") -include(":hiddenitems") include(":badges") include(":applications") include(":ms-services") diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt index 598e5ecd..2ff43856 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/search/SearchVM.kt @@ -1,5 +1,6 @@ package de.mm20.launcher2.ui.launcher.search +import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -21,10 +22,7 @@ import de.mm20.launcher2.websites.WebsiteRepository import de.mm20.launcher2.widgets.WidgetRepository import de.mm20.launcher2.wikipedia.WikipediaRepository import kotlinx.coroutines.* -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.* import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -65,6 +63,10 @@ class SearchVM : ViewModel(), KoinComponent { val hideFavorites = MutableLiveData(false) + private val hiddenItemKeys = favoritesRepository + .getHiddenItemKeys() + .shareIn(viewModelScope, SharingStarted.WhileSubscribed(), replay = 1) + init { search("") viewModelScope.launch { @@ -100,18 +102,24 @@ class SearchVM : ViewModel(), KoinComponent { isSearching.postValue(true) val jobs = mutableListOf>() jobs += async { - appRepository.search(query).collectLatest { - appResults.postValue(it) + appRepository.search(query).collectLatest { apps -> + hiddenItemKeys.collectLatest { hidden -> + appResults.postValue(apps.filter { !hidden.contains(it.key) }) + } } } jobs += async { - contactRepository.search(query).collectLatest { - contactResults.postValue(it) + contactRepository.search(query).collectLatest { contacts -> + hiddenItemKeys.collectLatest { hidden -> + contactResults.postValue(contacts.filter { !hidden.contains(it.key) }) + } } } jobs += async { - calendarRepository.search(query).collectLatest { - calendarResults.postValue(it) + calendarRepository.search(query).collectLatest { events -> + hiddenItemKeys.collectLatest { hidden -> + calendarResults.postValue(events.filter { !hidden.contains(it.key) }) + } } } jobs += async { @@ -135,8 +143,10 @@ class SearchVM : ViewModel(), KoinComponent { } } jobs += async { - fileRepository.search(query).collectLatest { - fileResults.postValue(it) + fileRepository.search(query).collectLatest { files -> + hiddenItemKeys.collectLatest { hidden -> + fileResults.postValue(files.filter { !hidden.contains(it.key) }) + } } } jobs += async { @@ -145,8 +155,10 @@ class SearchVM : ViewModel(), KoinComponent { } } jobs += async { - appShortcutRepository.search(query).collectLatest { - appShortcutResults.postValue(it) + appShortcutRepository.search(query).collectLatest { shortcuts -> + hiddenItemKeys.collectLatest { hidden -> + appShortcutResults.postValue(shortcuts.filter { !hidden.contains(it.key) }) + } } } jobs.map { it.await() } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/calendar/CalendarWidgetVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/calendar/CalendarWidgetVM.kt index 45eedfe9..33888dc2 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/calendar/CalendarWidgetVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/calendar/CalendarWidgetVM.kt @@ -143,8 +143,10 @@ class CalendarWidgetVM : ViewModel(), KoinComponent { } suspend fun onActive() { - calendarRepository.getUpcomingEvents().collectLatest { - upcomingEvents = it + calendarRepository.getUpcomingEvents().collectLatest { events -> + favoritesRepository.getHiddenCalendarEventKeys().collectLatest { hidden -> + upcomingEvents = events.filter { !hidden.contains(it.key) } + } } } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreenVM.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreenVM.kt index b677e856..bcc704d8 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreenVM.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/hiddenitems/HiddenItemsSettingsScreenVM.kt @@ -34,7 +34,7 @@ class HiddenItemsSettingsScreenVM : ViewModel(), KoinComponent { private val favoritesRepository: FavoritesRepository by inject() private val iconRepository: IconRepository by inject() - val allApps = appRepository.getAllInstalledApps(true).map { + val allApps = appRepository.getAllInstalledApps().map { withContext(Dispatchers.Default) { it.sorted() } }.asLiveData() val hiddenItems: LiveData> = liveData {