Annual refactor
This commit is contained in:
@@ -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()) }
|
||||
}
|
||||
+17
-15
@@ -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),
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user