Skip to content

Commit 6c3ff98

Browse files
committed
Add possibility to hide the article image
1 parent d770de6 commit 6c3ff98

File tree

12 files changed

+111
-2
lines changed

12 files changed

+111
-2
lines changed

androidApp/src/main/kotlin/com/prof18/feedflow/android/settings/SettingsScreen.kt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import androidx.compose.material.icons.automirrored.outlined.PlaylistAddCheck
1919
import androidx.compose.material.icons.outlined.AddCircleOutline
2020
import androidx.compose.material.icons.outlined.BugReport
2121
import androidx.compose.material.icons.outlined.DeleteSweep
22+
import androidx.compose.material.icons.outlined.HideImage
2223
import androidx.compose.material.icons.outlined.HideSource
2324
import androidx.compose.material.icons.outlined.Info
2425
import androidx.compose.material.icons.outlined.MarkAsUnread
@@ -95,6 +96,7 @@ fun SettingsScreen(
9596
isReaderModeEnabled = settingState.isReaderModeEnabled,
9697
isRemoveTitleFromDescriptionEnabled = settingState.isRemoveTitleFromDescriptionEnabled,
9798
isHideDescriptionEnabled = settingState.isHideDescriptionEnabled,
99+
isHideImagesEnabled = settingState.isHideImagesEnabled,
98100
showAccounts = appConfig.isDropboxSyncEnabled,
99101
fontSizes = fontSizesState,
100102
autoDeletePeriod = settingState.autoDeletePeriod,
@@ -130,6 +132,9 @@ fun SettingsScreen(
130132
setHideDescription = { enabled ->
131133
settingsViewModel.updateHideDescription(enabled)
132134
},
135+
setHideImages = { enabled ->
136+
settingsViewModel.updateHideImages(enabled)
137+
},
133138
updateFontScale = { newFontSize ->
134139
settingsViewModel.updateFontScale(newFontSize)
135140
},
@@ -147,6 +152,7 @@ private fun SettingsScreenContent(
147152
isReaderModeEnabled: Boolean,
148153
isRemoveTitleFromDescriptionEnabled: Boolean,
149154
isHideDescriptionEnabled: Boolean,
155+
isHideImagesEnabled: Boolean,
150156
showAccounts: Boolean,
151157
fontSizes: FeedFontSizes,
152158
autoDeletePeriod: AutoDeletePeriod,
@@ -163,6 +169,7 @@ private fun SettingsScreenContent(
163169
setReaderMode: (Boolean) -> Unit,
164170
setRemoveTitleFromDescription: (Boolean) -> Unit,
165171
setHideDescription: (Boolean) -> Unit,
172+
setHideImages: (Boolean) -> Unit,
166173
updateFontScale: (Int) -> Unit,
167174
onAutoDeletePeriodSelected: (AutoDeletePeriod) -> Unit,
168175
) {
@@ -276,6 +283,11 @@ private fun SettingsScreenContent(
276283
isHideDescriptionEnabled = isHideDescriptionEnabled,
277284
setHideDescription = setHideDescription,
278285
)
286+
287+
HideImagesSwitch(
288+
isHideImagesEnabled = isHideImagesEnabled,
289+
setHideImages = setHideImages,
290+
)
279291
}
280292

281293
item {
@@ -561,6 +573,43 @@ private fun HideDescriptionSwitch(
561573
}
562574
}
563575

576+
@Composable
577+
private fun HideImagesSwitch(
578+
isHideImagesEnabled: Boolean,
579+
setHideImages: (Boolean) -> Unit,
580+
) {
581+
val interactionSource = remember { MutableInteractionSource() }
582+
583+
Row(
584+
verticalAlignment = Alignment.CenterVertically,
585+
modifier = Modifier
586+
.clickable {
587+
setHideImages(!isHideImagesEnabled)
588+
}
589+
.fillMaxWidth()
590+
.padding(vertical = Spacing.xsmall)
591+
.padding(horizontal = Spacing.regular),
592+
horizontalArrangement = Arrangement.spacedBy(Spacing.regular),
593+
) {
594+
Icon(
595+
Icons.Outlined.HideImage,
596+
contentDescription = null,
597+
)
598+
599+
Text(
600+
text = LocalFeedFlowStrings.current.settingsHideImages,
601+
style = MaterialTheme.typography.bodyLarge,
602+
modifier = Modifier
603+
.weight(1f),
604+
)
605+
Switch(
606+
interactionSource = interactionSource,
607+
checked = isHideImagesEnabled,
608+
onCheckedChange = setHideImages,
609+
)
610+
}
611+
}
612+
564613
@Composable
565614
private fun SettingsNavBar(navigateBack: () -> Unit) {
566615
TopAppBar(
@@ -595,6 +644,7 @@ private fun SettingsScreenPreview() {
595644
isReaderModeEnabled = false,
596645
isRemoveTitleFromDescriptionEnabled = false,
597646
isHideDescriptionEnabled = false,
647+
isHideImagesEnabled = false,
598648
showAccounts = true,
599649
fontSizes = FeedFontSizes(),
600650
autoDeletePeriod = AutoDeletePeriod.DISABLED,
@@ -611,6 +661,7 @@ private fun SettingsScreenPreview() {
611661
setReaderMode = {},
612662
setRemoveTitleFromDescription = {},
613663
setHideDescription = {},
664+
setHideImages = {},
614665
updateFontScale = {},
615666
onAutoDeletePeriodSelected = {},
616667
)

desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/Main.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ fun main() = application {
273273
isRemoveTitleFromDescriptionEnabled = settingsState.isRemoveTitleFromDescriptionEnabled,
274274
autoDeletePeriod = settingsState.autoDeletePeriod,
275275
isHideDescriptionEnabled = settingsState.isHideDescriptionEnabled,
276+
isHideImagesEnabled = settingsState.isHideImagesEnabled,
276277
feedFilter = currentFeedFilter,
277278
onRefreshClick = {
278279
scope.launch {
@@ -332,6 +333,9 @@ fun main() = application {
332333
setHideDescription = { enabled ->
333334
settingsViewModel.updateHideDescription(enabled)
334335
},
336+
setHideImages = { enabled ->
337+
settingsViewModel.updateHideImages(enabled)
338+
},
335339
)
336340

337341
ScaleTransition(navigator)

desktopApp/src/jvmMain/kotlin/com/prof18/feedflow/desktop/home/MenuBar.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ fun FrameWindowScope.FeedFlowMenuBar(
2323
isReaderModeEnabled: Boolean,
2424
isRemoveTitleFromDescriptionEnabled: Boolean,
2525
isHideDescriptionEnabled: Boolean,
26+
isHideImagesEnabled: Boolean,
2627
autoDeletePeriod: AutoDeletePeriod,
2728
feedFilter: FeedFilter,
2829
onRefreshClick: () -> Unit,
@@ -38,6 +39,7 @@ fun FrameWindowScope.FeedFlowMenuBar(
3839
setReaderMode: (Boolean) -> Unit,
3940
setRemoveTitleFromDescription: (Boolean) -> Unit,
4041
setHideDescription: (Boolean) -> Unit,
42+
setHideImages: (Boolean) -> Unit,
4143
onFeedFontScaleClick: () -> Unit,
4244
onAutoDeletePeriodSelected: (AutoDeletePeriod) -> Unit,
4345
) {
@@ -147,6 +149,12 @@ fun FrameWindowScope.FeedFlowMenuBar(
147149
onCheckedChange = setHideDescription,
148150
)
149151

152+
CheckboxItem(
153+
text = LocalFeedFlowStrings.current.settingsHideImages,
154+
checked = isHideImagesEnabled,
155+
onCheckedChange = setHideImages,
156+
)
157+
150158
Menu(LocalFeedFlowStrings.current.settingsAutoDelete) {
151159
RadioButtonItem(
152160
text = LocalFeedFlowStrings.current.settingsAutoDeletePeriodDisabled,

i18n/src/commonMain/kotlin/com/prof18/feedflow/i18n/Locales.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,4 @@ expect fun String.format(vararg args: Any): String
3939

4040
@Suppress("UnusedPrivateProperty")
4141
// This is a trick to be sure that KSP re-generates the strings when there's no code updates
42-
private const val StringsVersion = 85
42+
private const val StringsVersion = 86

i18n/src/commonMain/resources/locale/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
<string name="no_icloud_sync_yet">Data are not synced yet with iCloud. Click the backup button to trigger a sync</string>
119119
<string name="settings_hide_duplicated_title_from_desc">Hide title from article description</string>
120120
<string name="settings_hide_description">Hide article description</string>
121+
<string name="settings_hide_images">Hide article image</string>
121122
<string name="reader_mode_font_size">Font Size</string>
122123
<string name="edit_feed_source_name_button">Edit</string>
123124
<string name="edit_feed">Edit feed</string>

iosApp/Source/Settings/SettingsScreen.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct SettingsScreen: View {
2323
@State private var isReaderModeEnabled = false
2424
@State private var isRemoveTitleFromDescriptionEnabled = false
2525
@State private var isHideDescriptionEnabled = false
26+
@State private var isHideImagesEnabled = false
2627
@State private var autoDeletePeriod: AutoDeletePeriod = .disabled
2728
@State private var feedFontSizes: FeedFontSizes = defaultFeedFontSizes()
2829
@State private var scaleFactor = 0.0
@@ -36,6 +37,7 @@ struct SettingsScreen: View {
3637
isReaderModeEnabled = state.isReaderModeEnabled
3738
isRemoveTitleFromDescriptionEnabled = state.isRemoveTitleFromDescriptionEnabled
3839
isHideDescriptionEnabled = state.isHideDescriptionEnabled
40+
isHideImagesEnabled = state.isHideImagesEnabled
3941
autoDeletePeriod = state.autoDeletePeriod
4042
}
4143
}
@@ -61,6 +63,9 @@ struct SettingsScreen: View {
6163
.onChange(of: isHideDescriptionEnabled) {
6264
vmStoreOwner.instance.updateHideDescription(value: isHideDescriptionEnabled)
6365
}
66+
.onChange(of: isHideImagesEnabled) {
67+
vmStoreOwner.instance.updateHideImages(value: isHideImagesEnabled)
68+
}
6469
.onChange(of: autoDeletePeriod) {
6570
vmStoreOwner.instance.updateAutoDeletePeriod(period: autoDeletePeriod)
6671
}
@@ -174,6 +179,12 @@ struct SettingsScreen: View {
174179
}.onTapGesture {
175180
isHideDescriptionEnabled.toggle()
176181
}
182+
183+
Toggle(isOn: $isHideImagesEnabled) {
184+
Label(feedFlowStrings.settingsHideImages, systemImage: "square.slash")
185+
}.onTapGesture {
186+
isHideImagesEnabled.toggle()
187+
}
177188
}
178189
}
179190

shared/src/commonMain/kotlin/com/prof18/feedflow/shared/data/SettingsHelper.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ internal class SettingsHelper(
6868
fun setAutoDeletePeriod(period: AutoDeletePeriod) =
6969
settings.set(SettingsFields.AUTO_DELETE_PERIOD.name, period.name)
7070

71+
fun getHideImages(): Boolean =
72+
settings.getBoolean(SettingsFields.HIDE_IMAGES.name, false)
73+
74+
fun setHideImages(value: Boolean) =
75+
settings.set(SettingsFields.HIDE_IMAGES.name, value)
76+
7177
private companion object {
7278
const val DEFAULT_READER_MODE_FONT_SIZE = 16
7379
const val DEFAULT_FEED_LIST_FONT_SCALE_FACTOR = 0
@@ -85,4 +91,5 @@ internal enum class SettingsFields {
8591
READER_MODE_FONT_SIZE,
8692
FEED_LIST_FONT_SCALE_FACTOR,
8793
AUTO_DELETE_PERIOD,
94+
HIDE_IMAGES,
8895
}

shared/src/commonMain/kotlin/com/prof18/feedflow/shared/domain/feed/retriever/FeedRetrieverRepository.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ internal class FeedRetrieverRepository(
124124
currentPage = 1
125125
val removeTitleFromDesc = settingsHelper.getRemoveTitleFromDescription()
126126
val hideDesc = settingsHelper.getHideDescription()
127+
val hideImages = settingsHelper.getHideImages()
127128
if (feeds.isNotEmpty()) {
128129
updateMutableState.update { FinishedFeedUpdateStatus }
129130
}
@@ -133,6 +134,7 @@ internal class FeedRetrieverRepository(
133134
dateFormatter = dateFormatter,
134135
removeTitleFromDesc = removeTitleFromDesc,
135136
hideDescription = hideDesc,
137+
hideImages = hideImages,
136138
)
137139
}.toImmutableList()
138140
}
@@ -159,12 +161,14 @@ internal class FeedRetrieverRepository(
159161
currentPage += 1
160162
val removeTitleFromDesc = settingsHelper.getRemoveTitleFromDescription()
161163
val hideDesc = settingsHelper.getHideDescription()
164+
val hideImages = settingsHelper.getHideImages()
162165
mutableFeedState.update { currentItems ->
163166
val newList = feeds.map {
164167
it.toFeedItem(
165168
dateFormatter,
166169
removeTitleFromDesc,
167170
hideDesc,
171+
hideImages,
168172
)
169173
}.toImmutableList()
170174
(currentItems + newList).toImmutableList()

shared/src/commonMain/kotlin/com/prof18/feedflow/shared/domain/mappers/SelectedFeedsMapper.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ internal fun SelectFeeds.toFeedItem(
1212
dateFormatter: DateFormatter,
1313
removeTitleFromDesc: Boolean,
1414
hideDescription: Boolean,
15+
hideImages: Boolean,
1516
) = FeedItem(
1617
id = url_hash,
1718
url = sanitizeUrl(url),
@@ -25,7 +26,7 @@ internal fun SelectFeeds.toFeedItem(
2526
}
2627
}.takeIf { !hideDescription },
2728
content = null,
28-
imageUrl = image_url,
29+
imageUrl = image_url.takeIf { !hideImages },
2930
feedSource = FeedSource(
3031
id = feed_source_id,
3132
url = feed_source_url,

shared/src/commonMain/kotlin/com/prof18/feedflow/shared/domain/settings/SettingsRepository.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ class SettingsRepository internal constructor(
5353
settingsHelper.setHideDescription(value)
5454
}
5555

56+
fun isHideImagesEnabled(): Boolean =
57+
settingsHelper.getHideImages()
58+
59+
fun setHideImages(value: Boolean) {
60+
settingsHelper.setHideImages(value)
61+
}
62+
5663
fun getReaderModeFontSize(): Int =
5764
settingsHelper.getReaderModeFontSize()
5865

0 commit comments

Comments
 (0)