Annual refactor

This commit is contained in:
MM20
2023-10-28 14:20:16 +02:00
parent 4f64652aae
commit 957358c79a
110 changed files with 1786 additions and 1663 deletions
@@ -1,8 +1,13 @@
package de.mm20.launcher2.wikipedia
import de.mm20.launcher2.search.Article
import de.mm20.launcher2.search.SearchableDeserializer
import de.mm20.launcher2.search.SearchableRepository
import org.koin.android.ext.koin.androidContext
import org.koin.core.qualifier.named
import org.koin.dsl.module
val wikipediaModule = module {
single<WikipediaRepository> { WikipediaRepositoryImpl(androidContext(), get()) }
single<SearchableRepository<Article>>(named<Article>()) { WikipediaRepository(androidContext(), get()) }
factory<SearchableDeserializer>(named(Wikipedia.Domain)) { WikipediaDeserializer(androidContext()) }
}
@@ -1,34 +1,31 @@
package de.mm20.launcher2.search.data
package de.mm20.launcher2.wikipedia
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat
import androidx.core.text.HtmlCompat
import de.mm20.launcher2.icons.ColorLayer
import de.mm20.launcher2.icons.StaticLauncherIcon
import de.mm20.launcher2.icons.TintedIconLayer
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.search.SavableSearchable
import de.mm20.launcher2.wikipedia.R
import de.mm20.launcher2.search.Article
import de.mm20.launcher2.search.SearchableSerializer
data class Wikipedia(
internal data class Wikipedia(
override val label: String,
val id: Long,
val text: String,
val image: String?,
val url: String,
override val text: String,
override val imageUrl: String?,
override val sourceUrl: String,
override val sourceName: String,
val wikipediaUrl: String,
override val labelOverride: String? = null,
) : SavableSearchable {
) : Article {
override val domain: String = Domain
override val preferDetailsOverLaunch: Boolean = false
override fun overrideLabel(label: String): Wikipedia {
return this.copy(labelOverride = label)
}
@@ -47,25 +44,30 @@ data class Wikipedia(
}
private fun getLaunchIntent(): Intent {
return Intent(Intent.ACTION_VIEW, Uri.parse(url))
return Intent(Intent.ACTION_VIEW, Uri.parse(sourceUrl))
}
override fun launch(context: Context, options: Bundle?): Boolean {
return context.tryStartActivity(getLaunchIntent(), options)
}
fun share(context: Context) {
override val canShare: Boolean = true
override fun share(context: Context) {
val text = HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_LEGACY).toString()
val shareIntent = Intent(Intent.ACTION_SEND)
shareIntent.putExtra(
Intent.EXTRA_TEXT, "${label}\n\n" +
"${text.substring(0, 200)}\n\n" +
url
sourceUrl
)
shareIntent.type = "text/plain"
context.startActivity(Intent.createChooser(shareIntent, null))
}
override fun getSerializer(): SearchableSerializer {
return WikipediaSerializer()
}
companion object {
const val Domain = "wikipedia"
}
@@ -3,7 +3,10 @@ package de.mm20.launcher2.wikipedia
import android.content.Context
import de.mm20.launcher2.crashreporter.CrashReporter
import de.mm20.launcher2.preferences.LauncherDataStore
import de.mm20.launcher2.search.data.Wikipedia
import de.mm20.launcher2.search.Article
import de.mm20.launcher2.search.SearchableRepository
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import okhttp3.OkHttpClient
@@ -12,14 +15,11 @@ import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
interface WikipediaRepository {
fun search(query: String, loadImages: Boolean = false): Flow<Wikipedia?>
}
internal class WikipediaRepositoryImpl(
internal class WikipediaRepository(
private val context: Context,
private val dataStore: LauncherDataStore
) : WikipediaRepository, KoinComponent {
) : SearchableRepository<Article> {
private val scope = CoroutineScope(Job() + Dispatchers.Default)
@@ -55,8 +55,8 @@ internal class WikipediaRepositoryImpl(
private lateinit var wikipediaService: WikipediaApi
override fun search(query: String, loadImages: Boolean): Flow<Wikipedia?> = channelFlow {
send(null)
override fun search(query: String): Flow<ImmutableList<Wikipedia>> = channelFlow {
send(persistentListOf())
withContext(Dispatchers.IO) {
httpClient.dispatcher.cancelAll()
}
@@ -66,7 +66,10 @@ internal class WikipediaRepositoryImpl(
if (!::wikipediaService.isInitialized) return@channelFlow
if (query.isBlank()) return@channelFlow
send(queryWikipedia(query, loadImages))
dataStore.data.map { it.wikipediaSearch.images }.collectLatest {
val wikipedia = queryWikipedia(query, false)
send(wikipedia?.let { persistentListOf(it) } ?: persistentListOf())
}
}
private suspend fun queryWikipedia(query: String, loadImages: Boolean): Wikipedia? {
@@ -92,9 +95,10 @@ internal class WikipediaRepositoryImpl(
label = page.title,
id = page.pageid,
text = page.extract,
image = image,
url = page.fullurl,
wikipediaUrl = wikipediaUrl
imageUrl = image,
sourceUrl = page.fullurl,
wikipediaUrl = wikipediaUrl,
sourceName = context.getString(R.string.wikipedia_source),
)
}
@@ -4,7 +4,6 @@ import android.content.Context
import de.mm20.launcher2.search.SavableSearchable
import de.mm20.launcher2.search.SearchableDeserializer
import de.mm20.launcher2.search.SearchableSerializer
import de.mm20.launcher2.search.data.Wikipedia
import org.json.JSONObject
class WikipediaSerializer : SearchableSerializer {
@@ -14,9 +13,9 @@ class WikipediaSerializer : SearchableSerializer {
json.put("label", searchable.label)
json.put("text", searchable.text)
json.put("id", searchable.id)
json.put("image", searchable.image)
json.put("image", searchable.imageUrl)
json.put("wikipedia_url", searchable.wikipediaUrl)
json.put("url", searchable.url)
json.put("url", searchable.sourceUrl)
return json.toString()
}
@@ -25,7 +24,7 @@ class WikipediaSerializer : SearchableSerializer {
}
class WikipediaDeserializer(val context: Context) : SearchableDeserializer {
override fun deserialize(serialized: String): SavableSearchable? {
override suspend fun deserialize(serialized: String): SavableSearchable? {
val json = JSONObject(serialized)
val wikipediaUrl = json.optString("wikipedia_url").takeIf { !it.isNullOrBlank() } ?: return null
val id = json.getLong("id")
@@ -33,9 +32,10 @@ class WikipediaDeserializer(val context: Context) : SearchableDeserializer {
label = json.getString("label"),
text = json.getString("text"),
id = id,
image = json.optString("image"),
url = json.optString("url").takeIf { !it.isNullOrBlank() } ?: "${wikipediaUrl.padEnd(1, '/')}wiki?curid=$id",
wikipediaUrl = wikipediaUrl
imageUrl = json.optString("image"),
sourceUrl = json.optString("url").takeIf { !it.isNullOrBlank() } ?: "${wikipediaUrl.padEnd(1, '/')}wiki?curid=$id",
wikipediaUrl = wikipediaUrl,
sourceName = context.getString(R.string.wikipedia_source),
)
}
}