Merge pull request #2467 from greenart7c3/claude/video-autoplay-setting-dY2Cd
Add separate autoplay videos setting independent of video loading
This commit is contained in:
@@ -31,6 +31,7 @@ data class UiSettings(
|
|||||||
val preferredLanguage: String? = null,
|
val preferredLanguage: String? = null,
|
||||||
val automaticallyShowImages: ConnectivityType = ConnectivityType.ALWAYS,
|
val automaticallyShowImages: ConnectivityType = ConnectivityType.ALWAYS,
|
||||||
val automaticallyStartPlayback: ConnectivityType = ConnectivityType.ALWAYS,
|
val automaticallyStartPlayback: ConnectivityType = ConnectivityType.ALWAYS,
|
||||||
|
val automaticallyPlayVideos: BooleanType = BooleanType.ALWAYS,
|
||||||
val automaticallyShowUrlPreview: ConnectivityType = ConnectivityType.ALWAYS,
|
val automaticallyShowUrlPreview: ConnectivityType = ConnectivityType.ALWAYS,
|
||||||
val automaticallyHideNavigationBars: BooleanType = BooleanType.ALWAYS,
|
val automaticallyHideNavigationBars: BooleanType = BooleanType.ALWAYS,
|
||||||
val automaticallyShowProfilePictures: ConnectivityType = ConnectivityType.ALWAYS,
|
val automaticallyShowProfilePictures: ConnectivityType = ConnectivityType.ALWAYS,
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ class UiSettingsFlow(
|
|||||||
val preferredLanguage: MutableStateFlow<String?> = MutableStateFlow(null),
|
val preferredLanguage: MutableStateFlow<String?> = MutableStateFlow(null),
|
||||||
val automaticallyShowImages: MutableStateFlow<ConnectivityType> = MutableStateFlow(ConnectivityType.ALWAYS),
|
val automaticallyShowImages: MutableStateFlow<ConnectivityType> = MutableStateFlow(ConnectivityType.ALWAYS),
|
||||||
val automaticallyStartPlayback: MutableStateFlow<ConnectivityType> = MutableStateFlow(ConnectivityType.ALWAYS),
|
val automaticallyStartPlayback: MutableStateFlow<ConnectivityType> = MutableStateFlow(ConnectivityType.ALWAYS),
|
||||||
|
val automaticallyPlayVideos: MutableStateFlow<BooleanType> = MutableStateFlow(BooleanType.ALWAYS),
|
||||||
val automaticallyShowUrlPreview: MutableStateFlow<ConnectivityType> = MutableStateFlow(ConnectivityType.ALWAYS),
|
val automaticallyShowUrlPreview: MutableStateFlow<ConnectivityType> = MutableStateFlow(ConnectivityType.ALWAYS),
|
||||||
val automaticallyHideNavigationBars: MutableStateFlow<BooleanType> = MutableStateFlow(BooleanType.ALWAYS),
|
val automaticallyHideNavigationBars: MutableStateFlow<BooleanType> = MutableStateFlow(BooleanType.ALWAYS),
|
||||||
val automaticallyShowProfilePictures: MutableStateFlow<ConnectivityType> = MutableStateFlow(ConnectivityType.ALWAYS),
|
val automaticallyShowProfilePictures: MutableStateFlow<ConnectivityType> = MutableStateFlow(ConnectivityType.ALWAYS),
|
||||||
@@ -46,6 +47,7 @@ class UiSettingsFlow(
|
|||||||
preferredLanguage,
|
preferredLanguage,
|
||||||
automaticallyShowImages,
|
automaticallyShowImages,
|
||||||
automaticallyStartPlayback,
|
automaticallyStartPlayback,
|
||||||
|
automaticallyPlayVideos,
|
||||||
automaticallyShowUrlPreview,
|
automaticallyShowUrlPreview,
|
||||||
automaticallyHideNavigationBars,
|
automaticallyHideNavigationBars,
|
||||||
automaticallyShowProfilePictures,
|
automaticallyShowProfilePictures,
|
||||||
@@ -64,14 +66,15 @@ class UiSettingsFlow(
|
|||||||
flows[1] as String?,
|
flows[1] as String?,
|
||||||
flows[2] as ConnectivityType,
|
flows[2] as ConnectivityType,
|
||||||
flows[3] as ConnectivityType,
|
flows[3] as ConnectivityType,
|
||||||
flows[4] as ConnectivityType,
|
flows[4] as BooleanType,
|
||||||
flows[5] as BooleanType,
|
flows[5] as ConnectivityType,
|
||||||
flows[6] as ConnectivityType,
|
flows[6] as BooleanType,
|
||||||
flows[7] as Boolean,
|
flows[7] as ConnectivityType,
|
||||||
flows[8] as Boolean,
|
flows[8] as Boolean,
|
||||||
flows[9] as FeatureSetType,
|
flows[9] as Boolean,
|
||||||
flows[10] as ProfileGalleryType,
|
flows[10] as FeatureSetType,
|
||||||
flows[11] as BooleanType,
|
flows[11] as ProfileGalleryType,
|
||||||
|
flows[12] as BooleanType,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,6 +84,7 @@ class UiSettingsFlow(
|
|||||||
preferredLanguage.value,
|
preferredLanguage.value,
|
||||||
automaticallyShowImages.value,
|
automaticallyShowImages.value,
|
||||||
automaticallyStartPlayback.value,
|
automaticallyStartPlayback.value,
|
||||||
|
automaticallyPlayVideos.value,
|
||||||
automaticallyShowUrlPreview.value,
|
automaticallyShowUrlPreview.value,
|
||||||
automaticallyHideNavigationBars.value,
|
automaticallyHideNavigationBars.value,
|
||||||
automaticallyShowProfilePictures.value,
|
automaticallyShowProfilePictures.value,
|
||||||
@@ -110,6 +114,10 @@ class UiSettingsFlow(
|
|||||||
automaticallyStartPlayback.tryEmit(torSettings.automaticallyStartPlayback)
|
automaticallyStartPlayback.tryEmit(torSettings.automaticallyStartPlayback)
|
||||||
any = true
|
any = true
|
||||||
}
|
}
|
||||||
|
if (automaticallyPlayVideos.value != torSettings.automaticallyPlayVideos) {
|
||||||
|
automaticallyPlayVideos.tryEmit(torSettings.automaticallyPlayVideos)
|
||||||
|
any = true
|
||||||
|
}
|
||||||
if (automaticallyShowUrlPreview.value != torSettings.automaticallyShowUrlPreview) {
|
if (automaticallyShowUrlPreview.value != torSettings.automaticallyShowUrlPreview) {
|
||||||
automaticallyShowUrlPreview.tryEmit(torSettings.automaticallyShowUrlPreview)
|
automaticallyShowUrlPreview.tryEmit(torSettings.automaticallyShowUrlPreview)
|
||||||
any = true
|
any = true
|
||||||
@@ -165,6 +173,7 @@ class UiSettingsFlow(
|
|||||||
MutableStateFlow(uiSettings.preferredLanguage),
|
MutableStateFlow(uiSettings.preferredLanguage),
|
||||||
MutableStateFlow(uiSettings.automaticallyShowImages),
|
MutableStateFlow(uiSettings.automaticallyShowImages),
|
||||||
MutableStateFlow(uiSettings.automaticallyStartPlayback),
|
MutableStateFlow(uiSettings.automaticallyStartPlayback),
|
||||||
|
MutableStateFlow(uiSettings.automaticallyPlayVideos),
|
||||||
MutableStateFlow(uiSettings.automaticallyShowUrlPreview),
|
MutableStateFlow(uiSettings.automaticallyShowUrlPreview),
|
||||||
MutableStateFlow(uiSettings.automaticallyHideNavigationBars),
|
MutableStateFlow(uiSettings.automaticallyHideNavigationBars),
|
||||||
MutableStateFlow(uiSettings.automaticallyShowProfilePictures),
|
MutableStateFlow(uiSettings.automaticallyShowProfilePictures),
|
||||||
|
|||||||
+3
@@ -95,6 +95,7 @@ class UiSharedPreferences(
|
|||||||
val UI_LANGUAGE = stringPreferencesKey("ui.language")
|
val UI_LANGUAGE = stringPreferencesKey("ui.language")
|
||||||
val UI_SHOW_IMAGES = stringPreferencesKey("ui.show_images")
|
val UI_SHOW_IMAGES = stringPreferencesKey("ui.show_images")
|
||||||
val UI_START_PLAYBACK = stringPreferencesKey("ui.start_playback")
|
val UI_START_PLAYBACK = stringPreferencesKey("ui.start_playback")
|
||||||
|
val UI_PLAY_VIDEOS = stringPreferencesKey("ui.play_videos")
|
||||||
val UI_SHOW_URL_PREVIEW = stringPreferencesKey("ui.show_url_preview")
|
val UI_SHOW_URL_PREVIEW = stringPreferencesKey("ui.show_url_preview")
|
||||||
val UI_HIDE_NAVIGATION_BARS = stringPreferencesKey("ui.hide_navigation_bars")
|
val UI_HIDE_NAVIGATION_BARS = stringPreferencesKey("ui.hide_navigation_bars")
|
||||||
val UI_SHOW_PROFILE_PICTURES = stringPreferencesKey("ui.show_profile_pictures")
|
val UI_SHOW_PROFILE_PICTURES = stringPreferencesKey("ui.show_profile_pictures")
|
||||||
@@ -114,6 +115,7 @@ class UiSharedPreferences(
|
|||||||
preferredLanguage = preferences[UI_LANGUAGE]?.ifBlank { null },
|
preferredLanguage = preferences[UI_LANGUAGE]?.ifBlank { null },
|
||||||
automaticallyShowImages = preferences[UI_SHOW_IMAGES]?.let { ConnectivityType.valueOf(it) } ?: ConnectivityType.ALWAYS,
|
automaticallyShowImages = preferences[UI_SHOW_IMAGES]?.let { ConnectivityType.valueOf(it) } ?: ConnectivityType.ALWAYS,
|
||||||
automaticallyStartPlayback = preferences[UI_START_PLAYBACK]?.let { ConnectivityType.valueOf(it) } ?: ConnectivityType.ALWAYS,
|
automaticallyStartPlayback = preferences[UI_START_PLAYBACK]?.let { ConnectivityType.valueOf(it) } ?: ConnectivityType.ALWAYS,
|
||||||
|
automaticallyPlayVideos = preferences[UI_PLAY_VIDEOS]?.let { BooleanType.valueOf(it) } ?: BooleanType.ALWAYS,
|
||||||
automaticallyShowUrlPreview = preferences[UI_SHOW_URL_PREVIEW]?.let { ConnectivityType.valueOf(it) } ?: ConnectivityType.ALWAYS,
|
automaticallyShowUrlPreview = preferences[UI_SHOW_URL_PREVIEW]?.let { ConnectivityType.valueOf(it) } ?: ConnectivityType.ALWAYS,
|
||||||
automaticallyHideNavigationBars = preferences[UI_HIDE_NAVIGATION_BARS]?.let { BooleanType.valueOf(it) } ?: BooleanType.ALWAYS,
|
automaticallyHideNavigationBars = preferences[UI_HIDE_NAVIGATION_BARS]?.let { BooleanType.valueOf(it) } ?: BooleanType.ALWAYS,
|
||||||
automaticallyShowProfilePictures = preferences[UI_SHOW_PROFILE_PICTURES]?.let { ConnectivityType.valueOf(it) } ?: ConnectivityType.ALWAYS,
|
automaticallyShowProfilePictures = preferences[UI_SHOW_PROFILE_PICTURES]?.let { ConnectivityType.valueOf(it) } ?: ConnectivityType.ALWAYS,
|
||||||
@@ -150,6 +152,7 @@ class UiSharedPreferences(
|
|||||||
preferences[UI_LANGUAGE] = sharedSettings.preferredLanguage ?: ""
|
preferences[UI_LANGUAGE] = sharedSettings.preferredLanguage ?: ""
|
||||||
preferences[UI_SHOW_IMAGES] = sharedSettings.automaticallyShowImages.name
|
preferences[UI_SHOW_IMAGES] = sharedSettings.automaticallyShowImages.name
|
||||||
preferences[UI_START_PLAYBACK] = sharedSettings.automaticallyStartPlayback.name
|
preferences[UI_START_PLAYBACK] = sharedSettings.automaticallyStartPlayback.name
|
||||||
|
preferences[UI_PLAY_VIDEOS] = sharedSettings.automaticallyPlayVideos.name
|
||||||
preferences[UI_SHOW_URL_PREVIEW] = sharedSettings.automaticallyShowUrlPreview.name
|
preferences[UI_SHOW_URL_PREVIEW] = sharedSettings.automaticallyShowUrlPreview.name
|
||||||
preferences[UI_HIDE_NAVIGATION_BARS] = sharedSettings.automaticallyHideNavigationBars.name
|
preferences[UI_HIDE_NAVIGATION_BARS] = sharedSettings.automaticallyHideNavigationBars.name
|
||||||
preferences[UI_SHOW_PROFILE_PICTURES] = sharedSettings.automaticallyShowProfilePictures.name
|
preferences[UI_SHOW_PROFILE_PICTURES] = sharedSettings.automaticallyShowProfilePictures.name
|
||||||
|
|||||||
+8
-8
@@ -102,12 +102,12 @@ fun VideoView(
|
|||||||
accountViewModel: AccountViewModel,
|
accountViewModel: AccountViewModel,
|
||||||
thumbhash: String? = null,
|
thumbhash: String? = null,
|
||||||
) {
|
) {
|
||||||
val automaticallyStartPlayback =
|
val initialAutoStart = if (alwaysShowVideo) true else accountViewModel.settings.startVideoPlayback()
|
||||||
remember {
|
val automaticallyStartPlayback = remember { mutableStateOf(initialAutoStart) }
|
||||||
mutableStateOf(
|
|
||||||
if (alwaysShowVideo) true else accountViewModel.settings.startVideoPlayback(),
|
// Once the video is being shown, only honor the user's autoplay preference when it was auto-loaded.
|
||||||
)
|
// If the user manually tapped the download button, they want it to play.
|
||||||
}
|
val autoplay = alwaysShowVideo || (initialAutoStart && accountViewModel.settings.autoPlayVideos()) || (!initialAutoStart && automaticallyStartPlayback.value)
|
||||||
|
|
||||||
if (blurhash == null && thumbhash == null) {
|
if (blurhash == null && thumbhash == null) {
|
||||||
val ratio = dimensions?.aspectRatio() ?: MediaAspectRatioCache.get(videoUri)
|
val ratio = dimensions?.aspectRatio() ?: MediaAspectRatioCache.get(videoUri)
|
||||||
@@ -137,7 +137,7 @@ fun VideoView(
|
|||||||
artworkUri = artworkUri,
|
artworkUri = artworkUri,
|
||||||
authorName = authorName,
|
authorName = authorName,
|
||||||
nostrUriCallback = nostrUriCallback,
|
nostrUriCallback = nostrUriCallback,
|
||||||
automaticallyStartPlayback = automaticallyStartPlayback.value,
|
automaticallyStartPlayback = autoplay,
|
||||||
onZoom = onDialog,
|
onZoom = onDialog,
|
||||||
hasBlurhash = false,
|
hasBlurhash = false,
|
||||||
accountViewModel = accountViewModel,
|
accountViewModel = accountViewModel,
|
||||||
@@ -185,7 +185,7 @@ fun VideoView(
|
|||||||
artworkUri = artworkUri,
|
artworkUri = artworkUri,
|
||||||
authorName = authorName,
|
authorName = authorName,
|
||||||
nostrUriCallback = nostrUriCallback,
|
nostrUriCallback = nostrUriCallback,
|
||||||
automaticallyStartPlayback = automaticallyStartPlayback.value,
|
automaticallyStartPlayback = autoplay,
|
||||||
onZoom = onDialog,
|
onZoom = onDialog,
|
||||||
hasBlurhash = true,
|
hasBlurhash = true,
|
||||||
accountViewModel = accountViewModel,
|
accountViewModel = accountViewModel,
|
||||||
|
|||||||
@@ -138,5 +138,7 @@ class UiSettingsState(
|
|||||||
|
|
||||||
fun startVideoPlayback() = startVideoPlayback.value
|
fun startVideoPlayback() = startVideoPlayback.value
|
||||||
|
|
||||||
|
fun autoPlayVideos() = uiSettingsFlow.automaticallyPlayVideos.value == BooleanType.ALWAYS
|
||||||
|
|
||||||
fun showImages() = showImages.value
|
fun showImages() = showImages.value
|
||||||
}
|
}
|
||||||
|
|||||||
+21
@@ -116,6 +116,7 @@ fun SettingsScreen(sharedPrefs: UiSettingsFlow) {
|
|||||||
ShowThemeChoice(sharedPrefs)
|
ShowThemeChoice(sharedPrefs)
|
||||||
ShowImagePreviewChoice(sharedPrefs)
|
ShowImagePreviewChoice(sharedPrefs)
|
||||||
ShowVideoPlaybackChoice(sharedPrefs)
|
ShowVideoPlaybackChoice(sharedPrefs)
|
||||||
|
AutoplayVideosChoice(sharedPrefs)
|
||||||
ShowUrlPreviewChoice(sharedPrefs)
|
ShowUrlPreviewChoice(sharedPrefs)
|
||||||
ShowProfilePictureChoice(sharedPrefs)
|
ShowProfilePictureChoice(sharedPrefs)
|
||||||
ImmersiveScrollingChoice(sharedPrefs)
|
ImmersiveScrollingChoice(sharedPrefs)
|
||||||
@@ -264,6 +265,26 @@ fun ShowVideoPlaybackChoice(sharedPrefs: UiSettingsFlow) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AutoplayVideosChoice(sharedPrefs: UiSettingsFlow) {
|
||||||
|
val autoplayIndex by sharedPrefs.automaticallyPlayVideos.collectAsState()
|
||||||
|
|
||||||
|
val booleanItems =
|
||||||
|
persistentListOf(
|
||||||
|
TitleExplainer(stringRes(ConnectivityType.ALWAYS.resourceId)),
|
||||||
|
TitleExplainer(stringRes(ConnectivityType.NEVER.resourceId)),
|
||||||
|
)
|
||||||
|
|
||||||
|
SettingsRow(
|
||||||
|
R.string.autoplay_videos,
|
||||||
|
R.string.autoplay_videos_description,
|
||||||
|
booleanItems,
|
||||||
|
autoplayIndex.screenCode,
|
||||||
|
) {
|
||||||
|
sharedPrefs.automaticallyPlayVideos.tryEmit(parseBooleanType(it))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ShowUrlPreviewChoice(sharedPrefs: UiSettingsFlow) {
|
fun ShowUrlPreviewChoice(sharedPrefs: UiSettingsFlow) {
|
||||||
val connectivityBasedOptions =
|
val connectivityBasedOptions =
|
||||||
|
|||||||
@@ -1093,6 +1093,7 @@
|
|||||||
<string name="theme">Theme</string>
|
<string name="theme">Theme</string>
|
||||||
<string name="automatically_load_images_gifs">Image Preview</string>
|
<string name="automatically_load_images_gifs">Image Preview</string>
|
||||||
<string name="automatically_play_videos">Video Playback</string>
|
<string name="automatically_play_videos">Video Playback</string>
|
||||||
|
<string name="autoplay_videos">Autoplay Videos</string>
|
||||||
<string name="automatically_show_url_preview">URL Preview</string>
|
<string name="automatically_show_url_preview">URL Preview</string>
|
||||||
<string name="automatically_hide_nav_bars">Immersive Scrolling</string>
|
<string name="automatically_hide_nav_bars">Immersive Scrolling</string>
|
||||||
<string name="automatically_hide_nav_bars_description">Hide Nav Bars when Scrolling</string>
|
<string name="automatically_hide_nav_bars_description">Hide Nav Bars when Scrolling</string>
|
||||||
@@ -1184,7 +1185,8 @@
|
|||||||
<string name="language_description">For the App\'s Interface</string>
|
<string name="language_description">For the App\'s Interface</string>
|
||||||
<string name="theme_description">Dark, Light or System theme</string>
|
<string name="theme_description">Dark, Light or System theme</string>
|
||||||
<string name="automatically_load_images_gifs_description">Automatically load images and GIFs</string>
|
<string name="automatically_load_images_gifs_description">Automatically load images and GIFs</string>
|
||||||
<string name="automatically_play_videos_description">Automatically plays videos and GIFs</string>
|
<string name="automatically_play_videos_description">Automatically load videos and GIFs</string>
|
||||||
|
<string name="autoplay_videos_description">Automatically play videos when visible on screen</string>
|
||||||
<string name="automatically_show_url_preview_description">Show URL previews</string>
|
<string name="automatically_show_url_preview_description">Show URL previews</string>
|
||||||
<string name="load_image_description">When to load images</string>
|
<string name="load_image_description">When to load images</string>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user