Skip to content

Commit

Permalink
feat: add UI to show highlights.
Browse files Browse the repository at this point in the history
  • Loading branch information
plateaukao committed Dec 11, 2023
1 parent 5219dd8 commit f9b14d7
Show file tree
Hide file tree
Showing 39 changed files with 323 additions and 12 deletions.
5 changes: 3 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,9 @@
<activity
android:name=".activity.DataListActivity"
android:label="@string/setting_title_whitelist" />
<activity
android:name=".activity.GptActionsActivity"/>
<activity android:name=".activity.GptActionsActivity"/>
<activity android:name=".activity.HighlightsActivity" />


<service
android:name=".service.ClearService"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
package info.plateaukao.einkbro.activity

import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.annotation.StringRes
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import info.plateaukao.einkbro.R
import info.plateaukao.einkbro.database.Article
import info.plateaukao.einkbro.database.BookmarkManager
import info.plateaukao.einkbro.database.Highlight
import info.plateaukao.einkbro.preference.ConfigManager
import info.plateaukao.einkbro.view.compose.MyTheme
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

class HighlightsActivity : ComponentActivity(), KoinComponent {
private val config: ConfigManager by inject()
private val bookmarkManager: BookmarkManager by inject()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)


setContent {
val navController: NavHostController = rememberNavController()

val actionList = remember { mutableStateOf(config.gptActionList) }
var showDialog by remember { mutableStateOf(false) }

MyTheme {
val backStackEntry = navController.currentBackStackEntryAsState()
val currentScreen = HighlightsRoute.valueOf(
backStackEntry.value?.destination?.route?.split("/")?.first()
?: HighlightsRoute.RouteArticles.name
)

Scaffold(
topBar = {
HighlightsBar(
currentScreen = currentScreen,
navigateUp = {
if (navController.previousBackStackEntry != null) navController.navigateUp()
else finish()
}
)
}
) { innerPadding ->
NavHost(
navController = navController,
startDestination = HighlightsRoute.RouteArticles.name,
modifier = Modifier.padding(innerPadding)
) {
composable(HighlightsRoute.RouteArticles.name) {
ArticlesScreen(navController, bookmarkManager)
}
composable("${HighlightsRoute.RouteHighlights.name}/{articleId}") { backStackEntry ->
HighlightsScreen(backStackEntry.arguments?.getString("articleId")
?.toInt() ?: 0,
modifier = Modifier.padding(10.dp),
bookmarkManager,
deleteHighlight = {}
)
}
}
}
}
}
}

companion object {
fun createIntent(context: Context) = Intent(
context,
HighlightsActivity::class.java
)
}
}

enum class HighlightsRoute(@StringRes val titleId: Int) {
RouteArticles(R.string.articles),
RouteHighlights(R.string.highlights),
}

@Composable
fun ArticlesScreen(
navHostController: NavHostController,
bookmarkManager: BookmarkManager
) {
val articles by bookmarkManager.getAllArticles().collectAsState(emptyList())
LazyColumn(
modifier = Modifier.padding(10.dp),
reverseLayout = true
) {
items(articles.size) { index ->
val article = articles[index]
ArticleItem(
modifier = Modifier.padding(bottom = 10.dp)
.clickable {
navHostController.navigate("${HighlightsRoute.RouteHighlights.name}/${articles[index].id}")
},
article = article,
deleteArticle = {} // { a -> bookmarkManager.deleteArticle(a) }
)
}
}
}

@Composable
fun ArticleItem(
modifier: Modifier,
article: Article,
deleteArticle: (Article) -> Unit
) {
Text(
modifier = modifier,
text = article.title
)
}

@Composable
fun HighlightsScreen(
articleId: Int,
modifier: Modifier = Modifier,
bookmarkManager: BookmarkManager,
deleteHighlight: (Highlight) -> Unit,
) {
val highlights by bookmarkManager.getHighlightsForArticle(articleId).collectAsState(emptyList())
LazyColumn(
modifier = modifier.padding(10.dp),
) {
items(highlights.size) { index ->
HighlightItem(
highlight = highlights[index],
deleteHighlight = deleteHighlight,
)
}
}
}

@Composable
fun HighlightItem(
highlight: Highlight,
deleteHighlight: (Highlight) -> Unit
) {
Text(
modifier = Modifier.padding(bottom = 10.dp),
text = highlight.content
)
}

@Composable
fun HighlightsBar(
currentScreen: HighlightsRoute,
navigateUp: () -> Unit,
) {
TopAppBar(
title = {
Text(
stringResource(currentScreen.titleId),
color = MaterialTheme.colors.onPrimary
)
},
navigationIcon = {
IconButton(onClick = navigateUp) {
Icon(
tint = MaterialTheme.colors.onPrimary,
imageVector = Icons.Filled.ArrowBack,
contentDescription = stringResource(R.string.back)
)
}
}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ class SettingActivity : ComponentActivity(), KoinComponent {
testTagsAsResourceId = true
},
topBar = {
EinkBroAppBar(
SettingBar(
currentScreen = currentScreen,
navigateUp = {
if (navController.previousBackStackEntry != null) navController.navigateUp()
Expand Down Expand Up @@ -926,7 +926,7 @@ enum class SettingRoute(@StringRes val titleId: Int) {
}

@Composable
fun EinkBroAppBar(
fun SettingBar(
currentScreen: SettingRoute,
navigateUp: () -> Unit,
) {
Expand Down
20 changes: 13 additions & 7 deletions app/src/main/java/info/plateaukao/einkbro/database/BookmarkDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,10 @@ val MIGRATION_2_3: Migration = object : Migration(2, 3) {
@Dao
interface ArticleDao {
@Query("SELECT * FROM articles")
suspend fun getAllArticles(): List<Article>
fun getAllArticles(): Flow<List<Article>>

@Query("SELECT * FROM articles WHERE url = :url")
suspend fun getArticleByUrl(url: String): Article? =
getAllArticles().firstOrNull { it.url == url }
suspend fun getArticleByUrl(url: String): Article?

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(article: Article): Long
Expand All @@ -86,12 +85,13 @@ interface ArticleDao {
@Dao
interface HighlightDao {
@Query("SELECT * FROM highlights")
suspend fun getAllHighlights(): List<Highlight>
fun getAllHighlights(): Flow<List<Highlight>>

@Query("SELECT * FROM highlights WHERE articleId = :articleId")
suspend fun getHighlightsForArticle(articleId: Int): List<Highlight>
fun getHighlightsForArticle(articleId: Int): Flow<List<Highlight>>

suspend fun getHighlightsForArticle(article: Article): List<Highlight> =

fun getHighlightsForArticle(article: Article): Flow<List<Highlight>> =
getHighlightsForArticle(article.id)

@Insert(onConflict = OnConflictStrategy.REPLACE)
Expand Down Expand Up @@ -191,7 +191,13 @@ class BookmarkManager(context: Context) : KoinComponent {

suspend fun deleteArticle(article: Article) = articleDao.delete(article)

suspend fun getAllArticles(): List<Article> = articleDao.getAllArticles()
fun getAllArticles(): Flow<List<Article>> = articleDao.getAllArticles()

fun getHighlightsForArticle(article: Article): Flow<List<Highlight>> =
highlightDao.getHighlightsForArticle(article)

fun getHighlightsForArticle(articleId: Int): Flow<List<Highlight>> =
highlightDao.getHighlightsForArticle(articleId)

suspend fun getArticleByUrl(url: String): Article? = articleDao.getArticleByUrl(url)

Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/info/plateaukao/einkbro/unit/IntentUnit.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import info.plateaukao.einkbro.R
import info.plateaukao.einkbro.activity.ExtraBrowserActivity
import info.plateaukao.einkbro.activity.HighlightsActivity
import info.plateaukao.einkbro.activity.SettingActivity
import info.plateaukao.einkbro.view.NinjaToast
import info.plateaukao.einkbro.view.dialog.DialogManager
Expand Down Expand Up @@ -69,6 +70,12 @@ object IntentUnit {
})
}

fun gotoHighlights(activity: Activity) {
activity.startActivity(HighlightsActivity.createIntent(activity).apply {
addFlags(FLAG_ACTIVITY_NO_ANIMATION)
})
}

fun launchNewBrowser(activity: Activity, url: String) {
val intent = Intent(activity, ExtraBrowserActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ enum class MenuItemType {
ReceiveData, SendLink, ShareLink, OpenWith, CopyLink, Shortcut,
SetHome, SaveBookmark, OpenEpub, SaveEpub, SavePdf,
FontSize, WhiteBknd, BoldFont, Search, Download, Settings, BlackFont,
SaveArchive, AddToPocket
SaveArchive, AddToPocket, Highlights
}

@Composable
Expand Down Expand Up @@ -111,6 +111,7 @@ private fun MenuItems(
.horizontalScroll(rememberScrollState()),
horizontalArrangement = Arrangement.SpaceBetween,
) {
MenuItem(R.string.menu_highlights, R.drawable.icon_edit) { onClicked(MenuItemType.Highlights) }
MenuItem(R.string.menu_fav, R.drawable.ic_home_set) { onClicked(MenuItemType.SetHome) }
MenuItem(R.string.menu_openFav, R.drawable.ic_home) { onClicked(OpenHome) }
MenuItem(R.string.menu_closeTab, R.drawable.icon_close) { onClicked(CloseTab) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ class MenuActionHandler(
ninjaWebView.favicon
)

MenuItemType.Highlights -> IntentUnit.gotoHighlights(activity)
MenuItemType.SetHome -> config.favoriteUrl = ninjaWebView.url.orEmpty()
MenuItemType.SaveBookmark -> browserController.saveBookmark()
MenuItemType.OpenEpub -> openSavedEpub()
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-af/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<string name="highlight">Highlight</string>
<string name="menu_highlights">Highlights</string>
<string name="articles">Articles</string>
<string name="highlights">Highlights</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-ar/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<string name="highlight">Highlight</string>
<string name="menu_highlights">Highlights</string>
<string name="articles">Articles</string>
<string name="highlights">Highlights</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-ca/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<string name="highlight">Highlight</string>
<string name="menu_highlights">Highlights</string>
<string name="articles">Articles</string>
<string name="highlights">Highlights</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-cs/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,9 @@
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<string name="highlight">Highlight</string>
<string name="menu_highlights">Highlights</string>
<string name="articles">Articles</string>
<string name="highlights">Highlights</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-da/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<string name="highlight">Highlight</string>
<string name="menu_highlights">Highlights</string>
<string name="articles">Articles</string>
<string name="highlights">Highlights</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,9 @@ Dies zu deaktivieren ist sicherer, schneller und spart Datenvolumen. Manche Inha
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<string name="highlight">Highlight</string>
<string name="menu_highlights">Highlights</string>
<string name="articles">Articles</string>
<string name="highlights">Highlights</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/res/values-el/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@
<string name="use_it_on_tts">Use OpenAI TTS Api</string>
<string name="setting_summary_use_gpt_for_tts">Use OpenAI API to read web content</string>
<string name="highlight">Highlight</string>
<string name="menu_highlights">Highlights</string>
<string name="articles">Articles</string>
<string name="highlights">Highlights</string>
<!-- Dialog help -->
<!-- Dialog changelog -->
<!-- License changelog -->
Expand Down
Loading

0 comments on commit f9b14d7

Please sign in to comment.