Skip to content

Commit

Permalink
Add option to disable swipe to next feed (#870)
Browse files Browse the repository at this point in the history
* Improve next filter selection

Only go to the next filter feed if the parent folder is open.

If the folder is not expanded, go to the next folder. This ensures that
the selected item is always visible when opening the drawer.

* Add option to disable 'next feed' swipe
  • Loading branch information
jocmp authored Feb 17, 2025
1 parent 6b3bb1a commit 16fce06
Show file tree
Hide file tree
Showing 60 changed files with 185 additions and 115 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.setupCommonModules
import com.capyreader.app.ui.theme.CapyTheme
import org.koin.android.ext.koin.androidContext
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
package com.capyreader.app.ui.settings

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.capyreader.app.R
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.setupCommonModules
import com.capyreader.app.ui.components.TextSwitch
import com.capyreader.app.ui.theme.CapyTheme
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/capyreader/app/AccountModule.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.capyreader.app

import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.notifications.NotificationHelper
import com.jocmp.capy.Account
import com.jocmp.capy.AccountManager
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/capyreader/app/CommonModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.capyreader.app

import com.capyreader.app.common.AndroidDatabaseProvider
import com.capyreader.app.common.AppFaviconFetcher
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.common.SharedPreferenceStoreProvider
import com.jocmp.capy.AccountManager
import com.jocmp.capy.DatabaseProvider
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/capyreader/app/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.notifications.NotificationHelper
import com.capyreader.app.ui.App
import com.capyreader.app.ui.Route
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/capyreader/app/MainApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.decode.ImageDecoderDecoder
import coil.decode.SvgDecoder
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.google.android.material.color.DynamicColors
import com.jocmp.capy.UserAgentInterceptor
import okhttp3.OkHttpClient
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.browser.customtabs.CustomTabsIntent
import com.capyreader.app.preferences.AppPreferences
import com.jocmp.capy.logging.CapyLog
import java.net.URL

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import androidx.core.app.NotificationManagerCompat
import com.capyreader.app.ArticleStatusBroadcastReceiver
import com.capyreader.app.MainActivity
import com.capyreader.app.R
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.notifications.NotificationHelper.Companion.ARTICLE_ID_KEY
import com.capyreader.app.notifications.NotificationHelper.Companion.FEED_ID_KEY
import com.jocmp.capy.Account
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.capyreader.app.common
package com.capyreader.app.preferences

import com.capyreader.app.R

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package com.capyreader.app.common
package com.capyreader.app.preferences

import android.content.Context
import androidx.preference.PreferenceManager
import com.capyreader.app.common.ImagePreview
import com.capyreader.app.refresher.RefreshInterval
import com.capyreader.app.ui.articles.ArticleListFontScale
import com.capyreader.app.ui.settings.panels.ArticleVerticalSwipe
import com.capyreader.app.ui.settings.panels.RowSwipeOption
import com.jocmp.capy.ArticleFilter
import com.jocmp.capy.articles.FontOption
import com.jocmp.capy.articles.FontSize
Expand Down Expand Up @@ -140,6 +139,9 @@ class AppPreferences(context: Context) {
val swipeEnd: Preference<RowSwipeOption>
get() = preferenceStore.getEnum("article_list_swipe_end", RowSwipeOption.default)

val swipeBottom: Preference<ArticleListVerticalSwipe>
get() = preferenceStore.getEnum("article_list_swipe_bottom", ArticleListVerticalSwipe.default)

val confirmMarkAllRead: Preference<Boolean>
get() = preferenceStore.getBoolean("article_list_confirm_mark_all_read", true)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.capyreader.app.preferences

import com.capyreader.app.R

enum class ArticleListVerticalSwipe {
DISABLED,
NEXT_FEED;

val translationKey: Int
get() = when (this) {
DISABLED -> R.string.article_list_swipe_disabled
NEXT_FEED -> R.string.article_list_swipe_next_feed
}

companion object {
val default = NEXT_FEED
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.capyreader.app.ui.settings.panels
package com.capyreader.app.preferences

import com.capyreader.app.R

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.capyreader.app.common
package com.capyreader.app.preferences

import com.capyreader.app.R

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.capyreader.app.common
package com.capyreader.app.preferences

import com.capyreader.app.R

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.capyreader.app.common
package com.capyreader.app.preferences

import com.capyreader.app.R

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.capyreader.app.ui.settings.panels
package com.capyreader.app.preferences

import com.capyreader.app.R

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.capyreader.app.common
package com.capyreader.app.preferences

import com.capyreader.app.R

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences

class RefreshScheduler(
private val context: Context,
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/com/capyreader/app/ui/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.rememberNavController
import com.capyreader.app.common.ThemeOption
import com.capyreader.app.preferences.ThemeOption
import com.capyreader.app.ui.accounts.accountsGraph
import com.capyreader.app.ui.articles.articleGraph
import com.capyreader.app.ui.theme.CapyTheme
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/capyreader/app/ui/LayoutHelpers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.window.core.layout.WindowWidthSizeClass.Companion.EXPANDED
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.common.LayoutPreference
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.preferences.LayoutPreference
import com.capyreader.app.common.asState
import org.koin.compose.koinInject

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.capyreader.app.ui.accounts
import androidx.lifecycle.ViewModel
import com.jocmp.capy.AccountManager
import com.jocmp.capy.accounts.Source
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.loadAccountModules

class AddAccountViewModel(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.toRoute
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.loadAccountModules
import com.capyreader.app.ui.Route
import com.jocmp.capy.AccountManager
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,11 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.selection.selectableGroup
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.Card
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme.typography
Expand Down Expand Up @@ -97,9 +95,9 @@ fun AddFeedView(
.fillMaxWidth()
.padding(horizontal = 16.dp),
keyboardOptions = KeyboardOptions(
autoCorrect = false,
autoCorrectEnabled = false,
keyboardType = KeyboardType.Uri,
imeAction = ImeAction.Done,
imeAction = ImeAction.Done
),
keyboardActions = KeyboardActions(
onDone = { addFeed() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.capyreader.app.ui.articles

import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.jocmp.capy.Article
import org.koin.compose.koinInject

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource
import androidx.paging.compose.LazyPagingItems
import com.capyreader.app.R
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.common.Media
import com.capyreader.app.common.Saver
import com.capyreader.app.refresher.RefreshInterval
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.paging.compose.LazyPagingItems
import com.capyreader.app.R
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.jocmp.capy.Article
import com.jocmp.capy.MarkRead
import kotlinx.coroutines.FlowPreview
Expand All @@ -45,7 +45,6 @@ fun ArticleList(
onMarkAllRead: (range: MarkRead) -> Unit = {},
enableMarkReadOnScroll: Boolean = false,
) {
val composableScope = rememberCoroutineScope()
val articleOptions = rememberArticleOptions()
val currentTime = rememberCurrentTime()
val localDensity = LocalDensity.current
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package com.capyreader.app.ui.articles
import androidx.activity.compose.BackHandler
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.common.BackAction
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.preferences.BackAction
import com.capyreader.app.common.asState
import org.koin.compose.koinInject

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.capyreader.app.common.LayoutPreference
import com.capyreader.app.preferences.LayoutPreference
import com.capyreader.app.ui.isAtMostMedium
import com.capyreader.app.ui.rememberLayoutPreference
import com.capyreader.app.ui.theme.CapyTheme
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.paging.compose.collectAsLazyPagingItems
import com.capyreader.app.common.AfterReadAllBehavior
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AfterReadAllBehavior
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.ui.LocalConnectivity
import com.capyreader.app.ui.articles.feeds.FolderActions
import com.capyreader.app.ui.articles.feeds.LocalFolderActions
Expand Down Expand Up @@ -40,13 +40,14 @@ fun ArticleScreen(
val searchQuery by viewModel.searchQuery.collectAsStateWithLifecycle("")
val searchState by viewModel.searchState.collectAsStateWithLifecycle(SearchState.INACTIVE)
val nextFilter by viewModel.nextFilter.collectAsStateWithLifecycle(initialValue = null)
val canSwipeToNextFeed = nextFilter != null
val afterReadAll by viewModel.afterReadAll.collectAsStateWithLifecycle()
val scope = rememberCoroutineScope()
val refreshInterval by appPreferences
.refreshInterval
.collectChangesWithDefault(appPreferences.refreshInterval.get())

val canSwipeToNextFeed = nextFilter != null

val fullContent = rememberFullContent(viewModel)
val articleActions = rememberArticleActions(viewModel)
val folderActions = rememberFolderActions(viewModel)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@ import androidx.compose.runtime.setValue
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.capyreader.app.R
import com.capyreader.app.common.AfterReadAllBehavior
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.common.toast
import com.capyreader.app.notifications.NotificationHelper
import com.capyreader.app.preferences.AfterReadAllBehavior
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.preferences.ArticleListVerticalSwipe
import com.capyreader.app.sync.Sync
import com.capyreader.app.ui.components.SearchState
import com.jocmp.capy.Account
Expand Down Expand Up @@ -55,6 +56,8 @@ class ArticleScreenViewModel(

val filter = appPreferences.filter.stateIn(viewModelScope)

private val listSwipeBottom = appPreferences.articleListOptions.swipeBottom.stateIn(viewModelScope)

private val _searchQuery = MutableStateFlow("")

private val _searchState = MutableStateFlow(SearchState.INACTIVE)
Expand Down Expand Up @@ -112,7 +115,17 @@ class ArticleScreenViewModel(
}

private val nextFilterListener: Flow<NextFilter?> =
combine(savedSearches, feeds, folders, filter) { savedSearches, feeds, folders, filter ->
combine(
listSwipeBottom,
savedSearches,
feeds,
folders,
filter
) { swipeBottom, savedSearches, feeds, folders, filter ->
if (swipeBottom == ArticleListVerticalSwipe.DISABLED) {
return@combine null
}

NextFilter.findSwipeDestination(
filter,
searches = savedSearches,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.capyreader.app.ui.articles

import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.jocmp.capy.Account
import com.jocmp.capy.articles.ArticleRenderer
import org.koin.androidx.viewmodel.dsl.viewModel
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.capyreader.app.ui.articles

import androidx.lifecycle.ViewModel
import com.capyreader.app.common.AppPreferences
import com.capyreader.app.preferences.AppPreferences
import com.jocmp.capy.Account
import com.jocmp.capy.ArticleFilter
import com.jocmp.capy.EditFeedFormEntry
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
import com.capyreader.app.R
import com.capyreader.app.common.ThemeOption
import com.capyreader.app.preferences.ThemeOption
import com.capyreader.app.ui.theme.CapyTheme
import com.jocmp.capy.logging.CapyLog

Expand Down
Loading

0 comments on commit 16fce06

Please sign in to comment.