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,
)