feat: Add app widget system with Glance, reader mode, and reading reminders

- Add Glance dependencies (glance-appwidget:1.1.0, glance-material3:1.1.0) for Compose-based widgets
- Implement RecentLinksWidget (4×2) and QuickStatsWidget (2×1) with Glance framework
- Add legacy RemoteViews widget (ShaarliWidgetProvider) for backward compatibility
- Create WidgetSearchActivity for widget configuration and WidgetUpdateWorker for periodic updates
- Add reader mode support with readerContent and readerContentFetchedAt
This commit is contained in:
2026-02-11 08:54:29 -05:00
parent ec0931134c
commit 1deac8850a
35 changed files with 3885 additions and 35 deletions
@@ -44,6 +44,10 @@ sealed class Screen(val route: String) {
object Help : Screen("help")
object DeadLinks : Screen("dead_links")
object Pinned : Screen("pinned")
object Reader : Screen("reader/{linkId}") {
fun createRoute(linkId: Int): String = "reader/$linkId"
}
object Reminders : Screen("reminders")
}
@Composable
@@ -153,6 +157,10 @@ fun AppNavGraph(
onNavigateToHelp = { navController.navigate(Screen.Help.route) },
onNavigateToDeadLinks = { navController.navigate(Screen.DeadLinks.route) },
onNavigateToPinned = { navController.navigate(Screen.Pinned.route) },
onNavigateToReader = { linkId ->
navController.navigate(Screen.Reader.createRoute(linkId))
},
onNavigateToReminders = { navController.navigate(Screen.Reminders.route) },
initialTagFilter = tag,
initialCollectionId = collectionId
)
@@ -306,5 +314,32 @@ fun AppNavGraph(
}
)
}
composable(
route = "reader/{linkId}",
arguments = listOf(
navArgument("linkId") {
type = NavType.IntType
}
),
deepLinks = listOf(
navDeepLink { uriPattern = "shaarit://reader/{linkId}" }
)
) {
com.shaarit.presentation.reader.ReaderModeScreen(
onNavigateBack = { navController.popBackStack() }
)
}
composable(
route = Screen.Reminders.route
) {
com.shaarit.presentation.reminders.RemindersScreen(
onNavigateBack = { navController.popBackStack() },
onNavigateToReader = { linkId ->
navController.navigate(Screen.Reader.createRoute(linkId))
}
)
}
}
}