Skip to content

Commit

Permalink
Add local source (#122)
Browse files Browse the repository at this point in the history
  • Loading branch information
jocmp committed Jun 27, 2024
1 parent c98d46d commit aa9479d
Show file tree
Hide file tree
Showing 70 changed files with 9,507 additions and 85 deletions.
1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<img src="./site/capy.png" width="100px">

_A smallish RSS reader for Feedbin_
_A smallish RSS reader with support for Feedbin and local feeds._

[img_version]: https://img.shields.io/static/v1.svg?label=CalVer&message=v2024.06.1000&color=blue
[url_version]: https://github.com/jocmp/capyreader
2 changes: 1 addition & 1 deletion app/src/main/java/com/jocmp/capyreader/KoinSetupModules.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.jocmp.capyreader
import com.jocmp.capyreader.refresher.refresherModule
import com.jocmp.capyreader.sync.syncModule
import com.jocmp.capyreader.ui.articles.articlesModule
import com.jocmp.capyreader.ui.login.loginModule
import com.jocmp.capyreader.ui.accounts.loginModule
import com.jocmp.capyreader.ui.settings.settingsModule
import org.koin.core.KoinApplication
import org.koin.core.context.loadKoinModules
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/jocmp/capyreader/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class MainActivity : ComponentActivity() {
val accountID = appPreferences.accountID.get()

return if (accountID.isBlank()) {
Route.Login.path
Route.AddAccount.path
} else {
Route.Articles.path
}
Expand Down
7 changes: 5 additions & 2 deletions app/src/main/java/com/jocmp/capyreader/ui/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import androidx.compose.ui.Modifier
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import com.jocmp.capyreader.ui.articles.articleGraph
import com.jocmp.capyreader.ui.login.accountsGraph
import com.jocmp.capyreader.ui.accounts.accountsGraph
import com.jocmp.capyreader.ui.theme.CapyTheme
import com.jocmp.capyreader.unloadAccountModules

Expand All @@ -35,7 +35,10 @@ fun App(
) {
accountsGraph(
isCompactWindow = isCompactWindow,
onLoginSuccess = {
onNavigateToLogin = {
navController.navigate(Route.Login)
},
onAddSuccess = {
navController.navigate(Route.Articles) {
popUpTo(Route.Login.path) {
inclusive = true
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/com/jocmp/capyreader/ui/Route.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import androidx.navigation.NavOptionsBuilder
import androidx.navigation.navOptions

sealed class Route(val path: String) {
data object AddAccount : Route("add-account")

data object Login : Route("login")

data object Settings : Route("settings")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.jocmp.capyreader.ui.login
package com.jocmp.capyreader.ui.accounts

import androidx.compose.runtime.Composable
import androidx.compose.ui.window.DialogProperties
Expand All @@ -7,17 +7,25 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.dialog
import com.jocmp.capyreader.ui.Route
import com.jocmp.capyreader.ui.components.DialogCard
import com.jocmp.capyreader.ui.components.composable
import com.jocmp.capyreader.ui.settings.SettingsScreen

fun NavGraphBuilder.accountsGraph(
onLoginSuccess: () -> Unit,
onAddSuccess: () -> Unit,
onNavigateToLogin: () -> Unit,
onLogout: () -> Unit,
onNavigateBackFromSettings: () -> Unit,
isCompactWindow: Boolean,
) {
composable(Route.Login.path) {
composable(Route.AddAccount) {
AddAccountScreen(
onAddSuccess = onAddSuccess,
onNavigateToLogin = onNavigateToLogin
)
}
composable(Route.Login) {
LoginScreen(
onSuccess = onLoginSuccess,
onSuccess = onAddSuccess,
)
}
dynamicLayout(isCompactWindow) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.jocmp.capyreader.ui.accounts

import androidx.compose.runtime.Composable
import org.koin.compose.koinInject

@Composable
fun AddAccountScreen(
onAddSuccess: () -> Unit,
onNavigateToLogin: () -> Unit,
viewModel: AddAccountViewModel = koinInject()
) {
AddAccountView(
onSelectLocal = {
viewModel.addLocalAccount()
onAddSuccess()
},
onSelectFeedbin = onNavigateToLogin
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.jocmp.capyreader.ui.accounts

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.capitalize
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.jocmp.capy.accounts.Source

@Composable
fun AddAccountView(
onSelectLocal: () -> Unit,
onSelectFeedbin: () -> Unit,
) {
Column(
Modifier.verticalScroll(rememberScrollState())
) {
SourceRow(
source = Source.LOCAL,
onClick = onSelectLocal
)
SourceRow(
source = Source.FEEDBIN,
onClick = onSelectFeedbin
)
}
}

@Composable
private fun SourceRow(source: Source, onClick: () -> Unit) {
Row(
Modifier
.fillMaxWidth()
.padding(16.dp)
.clickable {
onClick()
}
) {
Text(text = source.value.capitalize())
}
}


@Preview
@Composable
private fun AddAccountViewPreview() {
AddAccountView(
onSelectLocal = {},
onSelectFeedbin = {}
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.jocmp.capyreader.ui.accounts

import androidx.lifecycle.ViewModel
import com.jocmp.capy.AccountManager
import com.jocmp.capy.accounts.Source
import com.jocmp.capyreader.common.AppPreferences
import com.jocmp.capyreader.loadAccountModules

class AddAccountViewModel(
private val accountManager: AccountManager,
private val appPreferences: AppPreferences,
) : ViewModel() {
fun addLocalAccount() {
val accountID = accountManager.createAccount(source = Source.LOCAL)

selectAccount(accountID)

loadAccountModules()
}

private fun selectAccount(id: String) {
appPreferences.accountID.set(id)
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.jocmp.capyreader.ui.login
package com.jocmp.capyreader.ui.accounts

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
Expand All @@ -11,15 +11,10 @@ import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Visibility
import androidx.compose.material.icons.filled.VisibilityOff
import androidx.compose.material3.AssistChip
import androidx.compose.material3.Badge
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MaterialTheme.colorScheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
Expand All @@ -36,7 +31,6 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.jocmp.capyreader.R
import com.jocmp.capyreader.ui.autofill
import com.jocmp.capyreader.ui.theme.CapyTheme
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package com.jocmp.capyreader.ui.login
package com.jocmp.capyreader.ui.accounts

import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module

val loginModule = module {
viewModel {
AddAccountViewModel(
accountManager = get(),
appPreferences = get()
)
}
viewModel { parameters ->
LoginViewModel(
account = parameters.getOrNull(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.jocmp.capyreader.ui.login
package com.jocmp.capyreader.ui.accounts

import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import org.koin.compose.koinInject

@Composable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.jocmp.capyreader.ui.login
package com.jocmp.capyreader.ui.accounts

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
Expand All @@ -18,14 +18,10 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.jocmp.capyreader.R
import com.jocmp.capyreader.common
import com.jocmp.capyreader.common.AppPreferences
import com.jocmp.capyreader.setupCommonModules
import com.jocmp.capyreader.ui.components.CrashReportingCheckbox
import org.koin.android.ext.koin.androidContext
import org.koin.compose.KoinApplication
import org.koin.dsl.module
import kotlin.math.sin

@Composable
fun LoginView(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.jocmp.capyreader.ui.login
package com.jocmp.capyreader.ui.accounts

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
Expand All @@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.jocmp.capy.Account
import com.jocmp.capy.AccountManager
import com.jocmp.capy.accounts.Source
import com.jocmp.capy.accounts.verifyCredentials
import com.jocmp.capyreader.common.AppPreferences
import com.jocmp.capyreader.common.Async
Expand Down Expand Up @@ -70,6 +71,7 @@ class LoginViewModel(
val accountID = accountManager.createAccount(
username = username,
password = password,
source = Source.FEEDBIN
)

selectAccount(accountID)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,12 @@ fun FeedOptions(
Text(
text = option.title,
style = typography.bodyLarge,
maxLines = 1
)
Text(
text = option.feedURL,
style = typography.bodySmall,
maxLines = 1
)
}
}
Expand Down
12 changes: 7 additions & 5 deletions app/src/main/java/com/jocmp/capyreader/ui/articles/ArticleRow.kt
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,13 @@ fun ArticleRow(
color = feedNameColor,
modifier = Modifier.padding(vertical = 4.dp)
)
Text(
text = article.summary,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
)
if (article.summary.isNotBlank()) {
Text(
text = article.summary,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
)
}
Text(
text = relativeTime(
time = article.publishedAt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import androidx.compose.ui.window.DialogProperties
import com.jocmp.capy.Account
import com.jocmp.capyreader.R
import com.jocmp.capyreader.ui.components.DialogCard
import com.jocmp.capyreader.ui.login.LoginViewModel
import com.jocmp.capyreader.ui.accounts.LoginViewModel
import org.koin.compose.koinInject
import org.koin.core.parameter.parametersOf

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.jocmp.capyreader.R
import com.jocmp.capyreader.ui.components.DialogCard
import com.jocmp.capyreader.ui.login.AuthFields
import com.jocmp.capyreader.ui.accounts.AuthFields
import com.jocmp.capyreader.ui.theme.CapyTheme

@OptIn(ExperimentalMaterial3Api::class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import com.jocmp.capyreader.R
import com.jocmp.capyreader.common.shareArticle
import com.jocmp.capyreader.ui.LocalWindowWidth
import com.jocmp.capyreader.ui.fixtures.ArticleSample
import java.net.URL

@OptIn(ExperimentalMaterial3Api::class)
@Composable
Expand Down Expand Up @@ -50,12 +51,15 @@ fun ArticleTopBar(
)
}

IconButton(onClick = { onToggleExtractContent() }) {
Icon(
painterResource(id = extractIcon(extractedContent)),
contentDescription = stringResource(R.string.extract_full_content)
)
if (article.extractedContentURL != null) {
IconButton(onClick = { onToggleExtractContent() }) {
Icon(
painterResource(id = extractIcon(extractedContent)),
contentDescription = stringResource(R.string.extract_full_content)
)
}
}

IconButton(onClick = { onToggleStar() }) {
Icon(
painterResource(id = starredIcon(article)),
Expand Down Expand Up @@ -121,7 +125,7 @@ fun ArticleNavigationIcon(onClick: () -> Unit) {
@Composable
private fun ArticleTopBarPreview(@PreviewParameter(ArticleSample::class) article: Article) {
ArticleTopBar(
article = article,
article = article.copy(extractedContentURL = URL("https://example.com")),
extractedContent = ExtractedContent(),
onToggleExtractContent = {},
onToggleRead = {},
Expand Down
Loading

0 comments on commit aa9479d

Please sign in to comment.