Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add local source #122

Merged
merged 2 commits into from
Jun 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading