Reorganize Searchable data types

This commit is contained in:
MM20
2022-10-12 20:36:39 +02:00
parent a01b0aa03d
commit bcda89c211
98 changed files with 817 additions and 738 deletions
@@ -7,8 +7,12 @@ import androidx.core.database.getStringOrNull
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.search.SearchableRepository
import de.mm20.launcher2.search.data.CalendarEvent
import de.mm20.launcher2.search.data.UserCalendar
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.withContext
@@ -16,9 +20,7 @@ import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import java.util.*
interface CalendarRepository {
fun search(query: String): Flow<List<CalendarEvent>>
interface CalendarRepository: SearchableRepository<CalendarEvent> {
fun getUpcomingEvents(): Flow<List<CalendarEvent>>
suspend fun getCalendars(): List<UserCalendar>
@@ -31,10 +33,10 @@ internal class CalendarRepositoryImpl(
private val dataStore: LauncherDataStore by inject()
private val permissionsManager: PermissionsManager by inject()
override fun search(query: String): Flow<List<CalendarEvent>> {
override fun search(query: String): Flow<ImmutableList<CalendarEvent>> {
if (query.isBlank() || query.length < 3) {
return flow {
emit(emptyList())
emit(persistentListOf())
}
}
@@ -49,9 +51,9 @@ internal class CalendarRepositoryImpl(
query,
intervalStart = now,
intervalEnd = now + 14 * 24 * 60 * 60 * 1000L,
)
).toImmutableList()
} else {
emptyList()
persistentListOf()
}
}
@@ -7,15 +7,16 @@ import android.content.pm.PackageManager
import android.provider.CalendarContract
import androidx.core.content.ContextCompat
import androidx.core.database.getStringOrNull
import de.mm20.launcher2.search.PinnableSearchable
import de.mm20.launcher2.search.SearchableDeserializer
import de.mm20.launcher2.search.SearchableSerializer
import de.mm20.launcher2.search.data.CalendarEvent
import de.mm20.launcher2.search.data.Searchable
import de.mm20.launcher2.search.Searchable
import org.json.JSONObject
import java.util.*
class CalendarEventSerializer: SearchableSerializer {
override fun serialize(searchable: Searchable): String {
override fun serialize(searchable: PinnableSearchable): String {
searchable as CalendarEvent
val json = JSONObject()
json.put("id", searchable.id)
@@ -27,7 +28,7 @@ class CalendarEventSerializer: SearchableSerializer {
}
class CalendarEventDeserializer(val context: Context): SearchableDeserializer {
override fun deserialize(serialized: String): Searchable? {
override fun deserialize(serialized: String): PinnableSearchable? {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) return null
val json = JSONObject(serialized)
val id = json.getLong("id")
@@ -3,13 +3,17 @@ package de.mm20.launcher2.search.data
import android.content.ContentUris
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.provider.CalendarContract
import de.mm20.launcher2.icons.ColorLayer
import de.mm20.launcher2.icons.StaticLauncherIcon
import de.mm20.launcher2.icons.TextLayer
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.search.PinnableSearchable
import de.mm20.launcher2.search.Searchable
import java.text.SimpleDateFormat
class CalendarEvent(
data class CalendarEvent(
override val label: String,
val id: Long,
val color: Int,
@@ -19,12 +23,20 @@ class CalendarEvent(
val location: String,
val attendees: List<String>,
val description: String,
val calendar: Long
) : Searchable() {
val calendar: Long,
override val labelOverride: String? = null,
) : PinnableSearchable {
override val domain: String = Domain
override val key: String
get() = "calendar://$id"
get() = "$domain://$id"
override val preferDetailsOverLaunch: Boolean = true
override fun overrideLabel(label: String): CalendarEvent {
return this.copy(labelOverride = label)
}
override fun getPlaceholderIcon(context: Context): StaticLauncherIcon {
val df = SimpleDateFormat("dd")
@@ -37,10 +49,18 @@ class CalendarEvent(
)
}
override fun getLaunchIntent(context: Context): Intent {
private fun getLaunchIntent(): Intent {
val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, id)
return Intent(Intent.ACTION_VIEW).setData(uri).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
override fun launch(context: Context, options: Bundle?): Boolean {
return context.tryStartActivity(getLaunchIntent(), options)
}
companion object {
const val Domain = "calendar"
}
}
data class UserCalendar(