diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 11fb45d60..c0340448b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -110,6 +110,10 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> + maxLen) { + val split = remaining.lastIndexOf(' ', maxLen).takeIf { it > 0 } ?: maxLen + add(remaining.substring(0, split)) + remaining = remaining.substring(split).trimStart() + } + if (remaining.isNotBlank()) add(remaining) + } val total = textSegments.size state = State.Reading(0, total) diff --git a/app/src/main/java/me/ash/reader/ui/widget/ArticleWidgetContentProvider.kt b/app/src/main/java/me/ash/reader/ui/widget/ArticleWidgetContentProvider.kt new file mode 100644 index 000000000..fb27ab3a0 --- /dev/null +++ b/app/src/main/java/me/ash/reader/ui/widget/ArticleWidgetContentProvider.kt @@ -0,0 +1,51 @@ +package me.ash.reader.ui.widget + +import android.content.ContentProvider +import android.content.ContentValues +import android.content.UriMatcher +import android.database.Cursor +import android.database.MatrixCursor +import android.net.Uri +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.runBlocking + +class ArticleWidgetContentProvider : ContentProvider() { + + companion object { + const val AUTHORITY = "me.ash.reader.widget.articles" + val COLUMNS = arrayOf("id", "feed_name", "title", "date") + + private const val MATCH_ARTICLES = 1 + private val uriMatcher = UriMatcher(UriMatcher.NO_MATCH).apply { + addURI(AUTHORITY, "#", MATCH_ARTICLES) + } + } + + override fun onCreate(): Boolean = true + + override fun query( + uri: Uri, + projection: Array?, + selection: String?, + selectionArgs: Array?, + sortOrder: String?, + ): Cursor? { + if (uriMatcher.match(uri) != MATCH_ARTICLES) return null + val widgetId = uri.lastPathSegment?.toIntOrNull() ?: return null + + val repo = WidgetRepository.get(context!!) + val config = runBlocking { repo.getConfig(widgetId) } + val articles = runBlocking { repo.getData(config.dataSource).first() }.articles + + val cursor = MatrixCursor(COLUMNS) + articles.take(15).forEach { article -> + cursor.addRow(arrayOf(article.id, article.feedName, article.title, article.date)) + } + return cursor + } + + override fun getType(uri: Uri): String? = null + override fun insert(uri: Uri, values: ContentValues?): Uri? = null + override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int = 0 + override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int = 0 +} diff --git a/app/src/main/java/me/ash/reader/ui/widget/WidgetRepository.kt b/app/src/main/java/me/ash/reader/ui/widget/WidgetRepository.kt index fbc622b58..9e79207dd 100644 --- a/app/src/main/java/me/ash/reader/ui/widget/WidgetRepository.kt +++ b/app/src/main/java/me/ash/reader/ui/widget/WidgetRepository.kt @@ -116,6 +116,7 @@ constructor( imgUrl = article.img, feedName = feed.name, id = article.id, + date = article.date.time, ) } } @@ -179,4 +180,5 @@ data class Article( val title: String, val imgUrl: String? = null, val feedName: String, + val date: Long = 0L, )