Skip to content

Commit

Permalink
Bring in upstream updates
Browse files Browse the repository at this point in the history
  • Loading branch information
KotlinGeekDev committed Feb 24, 2025
2 parents 4d974ec + 178ccf5 commit 80bb361
Show file tree
Hide file tree
Showing 66 changed files with 883 additions and 393 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/android_prod_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
steps:
- name: Configure Tramline
id: tramline
uses: tramlinehq/[email protected].6
uses: tramlinehq/[email protected].7
with:
input: ${{ github.event.inputs.tramline-input }}

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ios_prod_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
steps:
- name: Configure Tramline
id: tramline
uses: tramlinehq/[email protected].6
uses: tramlinehq/[email protected].7
with:
input: ${{ github.event.inputs.tramline-input }}

Expand Down
4 changes: 4 additions & 0 deletions .idea/runConfigurations.xml

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

2 changes: 1 addition & 1 deletion .idea/studiobot.xml

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

2 changes: 2 additions & 0 deletions androidApp/src/androidMain/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
android:fullBackupContent="false"
android:dataExtractionRules="@xml/data_extraction_rules"
android:enableOnBackInvokedCallback="true"
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config"
tools:targetApi="tiramisu"
android:largeHeap="true">

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,19 @@ import androidx.work.WorkerParameters
import co.touchlab.crashkios.bugsnag.BugsnagKotlin
import com.bugsnag.android.Bugsnag
import dev.sasikanth.rss.reader.data.repository.RssRepository
import dev.sasikanth.rss.reader.data.repository.SettingsRepository
import dev.sasikanth.rss.reader.refresh.LastUpdatedAt
import java.lang.Exception
import java.time.Duration
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.flow.first

class FeedsRefreshWorker(
context: Context,
workerParameters: WorkerParameters,
private val rssRepository: RssRepository,
private val lastUpdatedAt: LastUpdatedAt
private val lastUpdatedAt: LastUpdatedAt,
private val settingsRepository: SettingsRepository,
) : CoroutineWorker(context, workerParameters) {

companion object {
Expand All @@ -55,6 +58,8 @@ class FeedsRefreshWorker(
}

override suspend fun doWork(): Result {
if (settingsRepository.enableAutoSync.first().not()) return Result.failure()

return if (lastUpdatedAt.hasExpired()) {
try {
rssRepository.updateFeeds()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ class ReaderApplication : Application(), Configuration.Provider {
context = appContext,
workerParameters = workerParameters,
rssRepository = appComponent.rssRepository,
lastUpdatedAt = appComponent.lastUpdatedAt
lastUpdatedAt = appComponent.lastUpdatedAt,
settingsRepository = appComponent.settingsRepository,
)
}
PostsCleanUpWorker::class.qualifiedName -> {
Expand Down
23 changes: 23 additions & 0 deletions androidApp/src/androidMain/res/xml/network_security_config.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright 2025 Sasikanth Miriyampalli
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<network-security-config xmlns:tools="http://schemas.android.com/tools">
<base-config cleartextTrafficPermitted="true"
tools:ignore="InsecureBaseConfiguration">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,9 @@ class RssRepository(
feedLink: String,
title: String? = null,
feedLastCleanUpAt: Instant? = null,
transformUrl: Boolean = true,
): FeedAddResult {
return withContext(ioDispatcher) {
when (val feedFetchResult = feedFetcher.fetch(url = feedLink, transformUrl = transformUrl)) {
when (val feedFetchResult = feedFetcher.fetch(url = feedLink)) {
is FeedFetchResult.Success -> {
return@withContext try {
val feedPayload = feedFetchResult.feedPayload
Expand Down Expand Up @@ -140,13 +139,7 @@ class RssRepository(
val feedsChunk = feedQueries.feeds().executeAsList().chunked(UPDATE_CHUNKS)
feedsChunk.map { feeds ->
feeds.map { feed ->
launch {
addFeed(
feedLink = feed.link,
transformUrl = false,
feedLastCleanUpAt = feed.lastCleanUpAt
)
}
launch { addFeed(feedLink = feed.link, feedLastCleanUpAt = feed.lastCleanUpAt) }
}
}
}
Expand All @@ -158,7 +151,7 @@ class RssRepository(
withContext(ioDispatcher) {
val feed = feedQueries.feed(selectedFeedId).executeAsOneOrNull()
if (feed != null) {
addFeed(feedLink = feed.link, transformUrl = false, feedLastCleanUpAt = feed.lastCleanUpAt)
addFeed(feedLink = feed.link, feedLastCleanUpAt = feed.lastCleanUpAt)
}
}
}
Expand All @@ -168,11 +161,7 @@ class RssRepository(
feedIds.forEach { feedId ->
val feed = feedQueries.feed(feedId).executeAsOneOrNull()
if (feed != null) {
addFeed(
feedLink = feed.link,
transformUrl = false,
feedLastCleanUpAt = feed.lastCleanUpAt
)
addFeed(feedLink = feed.link, feedLastCleanUpAt = feed.lastCleanUpAt)
}
}
}
Expand Down Expand Up @@ -252,7 +241,8 @@ class RssRepository(
pinnedAt: Instant?,
lastCleanUpAt: Instant?,
alwaysFetchSourceArticle: Boolean,
pinnedPosition: Double ->
pinnedPosition: Double,
showFeedFavIcon: Boolean ->
Feed(
id = id,
name = name,
Expand All @@ -264,7 +254,8 @@ class RssRepository(
pinnedAt = pinnedAt,
lastCleanUpAt = lastCleanUpAt,
alwaysFetchSourceArticle = alwaysFetchSourceArticle,
pinnedPosition = pinnedPosition
pinnedPosition = pinnedPosition,
showFeedFavIcon = showFeedFavIcon,
)
}
)
Expand All @@ -281,6 +272,7 @@ class RssRepository(
name: String,
feedIds: List<String>,
feedHomepageLinks: String,
feedIconLinks: String,
createdAt: Instant,
updatedAt: Instant,
pinnedAt: Instant?,
Expand All @@ -290,6 +282,7 @@ class RssRepository(
name = name,
feedIds = feedIds.filterNot { it.isBlank() },
feedHomepageLinks = feedHomepageLinks.split(",").filterNot { it.isBlank() },
feedIconLinks = feedIconLinks.split(",").filterNot { it.isBlank() },
createdAt = createdAt,
updatedAt = updatedAt,
pinnedAt = pinnedAt,
Expand Down Expand Up @@ -345,7 +338,8 @@ class RssRepository(
pinnedAt: Instant?,
lastCleanUpAt: Instant?,
alwaysFetchSourceArticle: Boolean,
numberOfUnreadPosts: Long ->
numberOfUnreadPosts: Long,
showFeedFavIcon: Boolean ->
Feed(
id = id,
name = name,
Expand All @@ -357,7 +351,8 @@ class RssRepository(
pinnedAt = pinnedAt,
lastCleanUpAt = lastCleanUpAt,
alwaysFetchSourceArticle = alwaysFetchSourceArticle,
numberOfUnreadPosts = numberOfUnreadPosts
numberOfUnreadPosts = numberOfUnreadPosts,
showFeedFavIcon = showFeedFavIcon,
)
}
)
Expand All @@ -383,7 +378,8 @@ class RssRepository(
pinnedAt: Instant?,
lastCleanUpAt: Instant?,
alwaysFetchSourceArticle: Boolean,
numberOfUnreadPosts: Long ->
numberOfUnreadPosts: Long,
showFeedFavIcon: Boolean ->
Feed(
id = id,
name = name,
Expand All @@ -395,7 +391,8 @@ class RssRepository(
pinnedAt = pinnedAt,
lastCleanUpAt = lastCleanUpAt,
alwaysFetchSourceArticle = alwaysFetchSourceArticle,
numberOfUnreadPosts = numberOfUnreadPosts
numberOfUnreadPosts = numberOfUnreadPosts,
showFeedFavIcon = showFeedFavIcon,
)
}
)
Expand Down Expand Up @@ -627,6 +624,7 @@ class RssRepository(
numberOfUnreadPosts: Long,
feedIds: List<String>?,
feedHomepageLinks: String?,
feedIcons: String?,
updatedAt: Instant?,
pinnedPosition: Double ->
if (type == "group") {
Expand All @@ -636,6 +634,7 @@ class RssRepository(
feedIds = feedIds?.filterNot { it.isBlank() }.orEmpty(),
feedHomepageLinks =
feedHomepageLinks?.split(",")?.filterNot { it.isBlank() }.orEmpty(),
feedIconLinks = feedIcons?.split(",")?.filterNot { it.isBlank() }.orEmpty(),
createdAt = createdAt!!,
updatedAt = updatedAt!!,
pinnedAt = pinnedAt,
Expand Down Expand Up @@ -691,6 +690,7 @@ class RssRepository(
numberOfUnreadPosts: Long,
feedIds: List<String>?,
feedHomepageLinks: String?,
feedIcons: String?,
updatedAt: Instant? ->
if (type == "group") {
FeedGroup(
Expand All @@ -699,6 +699,7 @@ class RssRepository(
feedIds = feedIds?.filterNot { it.isBlank() }.orEmpty(),
feedHomepageLinks =
feedHomepageLinks?.split(",")?.filterNot { it.isBlank() }.orEmpty(),
feedIconLinks = feedIcons?.split(",")?.filterNot { it.isBlank() }.orEmpty(),
createdAt = createdAt,
updatedAt = updatedAt!!,
pinnedAt = pinnedAt,
Expand Down Expand Up @@ -738,6 +739,7 @@ class RssRepository(
name: String,
feedIds: List<String>,
feedHomepageLinks: String,
feedIcons: String,
createdAt: Instant,
updatedAt: Instant,
pinnedAt: Instant?,
Expand All @@ -747,6 +749,7 @@ class RssRepository(
name = name,
feedIds = feedIds.filterNot { it.isBlank() },
feedHomepageLinks = feedHomepageLinks.split(",").filterNot { it.isBlank() },
feedIconLinks = feedIcons.split(",").filterNot { it.isBlank() },
createdAt = createdAt,
updatedAt = updatedAt,
pinnedAt = pinnedAt,
Expand All @@ -772,6 +775,7 @@ class RssRepository(
name: String,
feedIds: List<String>,
feedHomepageLinks: String,
feedIcons: String,
createdAt: Instant,
updatedAt: Instant,
pinnedAt: Instant? ->
Expand All @@ -780,6 +784,7 @@ class RssRepository(
name = name,
feedIds = feedIds.filterNot { it.isBlank() },
feedHomepageLinks = feedHomepageLinks.split(",").filterNot { it.isBlank() },
feedIconLinks = feedIcons.split(",").filterNot { it.isBlank() },
createdAt = createdAt,
updatedAt = updatedAt,
pinnedAt = pinnedAt,
Expand All @@ -799,6 +804,7 @@ class RssRepository(
name: String,
feedIds: List<String>,
feedHomepageLinks: String,
feedIcons: String,
createdAt: Instant,
updatedAt: Instant,
pinnedAt: Instant? ->
Expand All @@ -807,6 +813,7 @@ class RssRepository(
name = name,
feedIds = feedIds.filterNot { it.isBlank() },
feedHomepageLinks = feedHomepageLinks.split(",").filterNot { it.isBlank() },
feedIconLinks = feedIcons.split(",").filterNot { it.isBlank() },
createdAt = createdAt,
updatedAt = updatedAt,
pinnedAt = pinnedAt,
Expand Down Expand Up @@ -841,7 +848,8 @@ class RssRepository(
createdAt: Instant,
pinnedAt: Instant?,
lastCleanUpAt: Instant?,
numberOfUnreadPosts: Long ->
numberOfUnreadPosts: Long,
showFeedFavIcon: Boolean ->
Feed(
id = id,
name = name,
Expand All @@ -853,6 +861,7 @@ class RssRepository(
pinnedAt = pinnedAt,
lastCleanUpAt = lastCleanUpAt,
numberOfUnreadPosts = numberOfUnreadPosts,
showFeedFavIcon = showFeedFavIcon,
)
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ class SettingsRepository(private val dataStore: DataStore<Preferences>) {
private val feedsViewModeKey = stringPreferencesKey("pref_feeds_view_mode")
private val feedsSortOrderKey = stringPreferencesKey("pref_feeds_sort_order")
private val appThemeModeKey = stringPreferencesKey("pref_app_theme_mode_v2")
private val enableAutoSyncKey = booleanPreferencesKey("enable_auto_sync")
private val showFeedFavIconKey = booleanPreferencesKey("show_feed_fav_icon")

val browserType: Flow<BrowserType> =
dataStore.data.map { preferences ->
Expand Down Expand Up @@ -75,6 +77,16 @@ class SettingsRepository(private val dataStore: DataStore<Preferences>) {
mapToAppThemeMode(preferences[appThemeModeKey]) ?: AppThemeMode.Dark
}

val enableAutoSync: Flow<Boolean> =
dataStore.data.map { preferences -> preferences[enableAutoSyncKey] ?: true }

val showFeedFavIcon: Flow<Boolean> =
dataStore.data.map { preferences -> preferences[showFeedFavIconKey] ?: true }

suspend fun enableAutoSyncImmediate(): Boolean {
return enableAutoSync.first()
}

suspend fun updateFeedsSortOrder(value: FeedsOrderBy) {
dataStore.edit { preferences -> preferences[feedsSortOrderKey] = value.name }
}
Expand Down Expand Up @@ -111,6 +123,14 @@ class SettingsRepository(private val dataStore: DataStore<Preferences>) {
dataStore.edit { preferences -> preferences[appThemeModeKey] = value.name }
}

suspend fun toggleAutoSync(value: Boolean) {
dataStore.edit { preferences -> preferences[enableAutoSyncKey] = value }
}

suspend fun toggleShowFeedFavIcon(value: Boolean) {
dataStore.edit { preferences -> preferences[showFeedFavIconKey] = value }
}

private fun mapToAppThemeMode(pref: String?): AppThemeMode? {
if (pref.isNullOrBlank()) return null
return AppThemeMode.valueOf(pref)
Expand Down
Binary file not shown.
Loading

0 comments on commit 80bb361

Please sign in to comment.