diff --git a/modules/common_resource/src/main/res/values-ja/strings.xml b/modules/common_resource/src/main/res/values-ja/strings.xml index 85090323b4..d00ca2e723 100644 --- a/modules/common_resource/src/main/res/values-ja/strings.xml +++ b/modules/common_resource/src/main/res/values-ja/strings.xml @@ -646,4 +646,9 @@ 設定へ移動する セーフサーチを有効にしてお + メディア表示の確認 + 暴力的、性的なメディアが表示される恐れがあります。本当に表示しますか? + 表示 + 警告を非表示 + diff --git a/modules/common_resource/src/main/res/values-zh/strings.xml b/modules/common_resource/src/main/res/values-zh/strings.xml index b394bbbf94..240eac3072 100644 --- a/modules/common_resource/src/main/res/values-zh/strings.xml +++ b/modules/common_resource/src/main/res/values-zh/strings.xml @@ -635,4 +635,9 @@ 移动到设置 保持启用安全搜索 + 确认媒体显示 + 可能会显示暴力或性内容的媒体。您确定要查看吗? + 显示 + 不要警告 + \ No newline at end of file diff --git a/modules/common_resource/src/main/res/values/strings.xml b/modules/common_resource/src/main/res/values/strings.xml index 3fbf87c94f..39cc0b27a0 100644 --- a/modules/common_resource/src/main/res/values/strings.xml +++ b/modules/common_resource/src/main/res/values/strings.xml @@ -641,6 +641,11 @@ Safe Search has been enabled to comply with Google Play\'s User Content Policy. When Safe Search is enabled, posts containing sensitive media will not be displayed on your timeline. To disable Safe Search, go to Settings > Motion > Enable Safe Search and turn it off. Go to Settings Keep Safe Search enabled + + Confirm Media Display + There is a risk that violent or sexual media will be displayed. Are you sure you want to view it? + Display + Do not warn diff --git a/modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/settings/Config.kt b/modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/settings/Config.kt index 01507eb4ca..62c3008594 100644 --- a/modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/settings/Config.kt +++ b/modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/settings/Config.kt @@ -161,6 +161,9 @@ fun Config.Companion.from(map: Map): Config { Keys.IsConfirmedSafeSearchEnabled )?.value ?: DefaultConfig.config.isEnableSafeSearch.isConfirmed ), + isShowWarningDisplayingSensitiveMedia = map.getValue( + Keys.IsShowWarningDisplayingSensitiveMedia + )?.value ?: DefaultConfig.config.isShowWarningDisplayingSensitiveMedia, ) } @@ -316,6 +319,9 @@ fun Config.pref(key: Keys): PrefType { Keys.IsConfirmedSafeSearchEnabled -> { PrefType.BoolPref(isEnableSafeSearch.isConfirmed) } + Keys.IsShowWarningDisplayingSensitiveMedia -> { + PrefType.BoolPref(isShowWarningDisplayingSensitiveMedia) + } } } diff --git a/modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/ConfigKtTest.kt b/modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/ConfigKtTest.kt index 1df7c8d163..dc8adef6cf 100644 --- a/modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/ConfigKtTest.kt +++ b/modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/ConfigKtTest.kt @@ -181,6 +181,10 @@ class ConfigKtTest { config.isEnableSafeSearch.isConfirmed, (u as PrefType.BoolPref).value ) + Keys.IsShowWarningDisplayingSensitiveMedia -> Assertions.assertEquals( + config.isShowWarningDisplayingSensitiveMedia, + (u as PrefType.BoolPref).value + ) } } } diff --git a/modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/KeysKtTest.kt b/modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/KeysKtTest.kt index 4ba4799050..0bcf545b13 100644 --- a/modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/KeysKtTest.kt +++ b/modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/KeysKtTest.kt @@ -141,6 +141,10 @@ class KeysKtTest { "IsConfirmedSafeSearchEnabled", key.str() ) + Keys.IsShowWarningDisplayingSensitiveMedia -> Assertions.assertEquals( + "IsShowWarningDisplayingSensitiveMedia", + key.str() + ) } } } @@ -148,8 +152,8 @@ class KeysKtTest { @Test fun checkAllKeysCount() { - Assertions.assertEquals(36, Keys.allKeys.size) - Assertions.assertEquals(36, Keys.allKeys.map { it.str() }.toSet().size) + Assertions.assertEquals(37, Keys.allKeys.size) + Assertions.assertEquals(37, Keys.allKeys.map { it.str() }.toSet().size) } diff --git a/modules/features/note/src/main/java/net/pantasystem/milktea/note/media/MediaPreviewHelper.kt b/modules/features/note/src/main/java/net/pantasystem/milktea/note/media/MediaPreviewHelper.kt index 86e2f9d397..604da1f8f9 100644 --- a/modules/features/note/src/main/java/net/pantasystem/milktea/note/media/MediaPreviewHelper.kt +++ b/modules/features/note/src/main/java/net/pantasystem/milktea/note/media/MediaPreviewHelper.kt @@ -186,9 +186,6 @@ object MediaPreviewHelper { previewAbleList, noteCardActionListenerAdapter, ) - binding.baseFrame.setOnClickListener { - mediaViewData.show(index) - } binding.thumbnail.setPreview(previewAbleFile, mediaViewData.config) @@ -199,6 +196,17 @@ object MediaPreviewHelper { binding.toggleVisibilityButton.setOnClickListener { mediaViewData.toggleVisibility(index) } + binding.baseFrame.setOnClickListener { + if (previewAbleFile.visibleType == PreviewAbleFile.VisibleType.SensitiveHide) { + noteCardActionListenerAdapter?.onSensitiveMediaPreviewClicked( + mediaViewData, + index + ) + } else { + mediaViewData.show(index) + } + + } if (existsView == null) { this.addView(binding.root) diff --git a/modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionHandler.kt b/modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionHandler.kt index 4247d3b2cf..9da6fb9a4e 100644 --- a/modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionHandler.kt +++ b/modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionHandler.kt @@ -16,6 +16,7 @@ import net.pantasystem.milktea.model.note.reaction.Reaction import net.pantasystem.milktea.model.setting.ReactionPickerType import net.pantasystem.milktea.note.NoteDetailActivity import net.pantasystem.milktea.note.NoteEditorActivity +import net.pantasystem.milktea.note.R import net.pantasystem.milktea.note.option.NoteOptionDialog import net.pantasystem.milktea.note.reaction.ReactionSelectionDialog import net.pantasystem.milktea.note.reaction.RemoteReactionEmojiSuggestionDialog @@ -179,6 +180,27 @@ class NoteCardActionHandler( } } + is NoteCardAction.OnSensitiveMediaPreviewClicked -> { + if (settingStore.configState.value.isShowWarningDisplayingSensitiveMedia) { + val dialog = MaterialAlertDialogBuilder(activity) + .setTitle(R.string.confirm_display_sensitive_media_dialog_title) + .setMessage(R.string.confirm_display_sensitive_media_dialog_message) + .setNeutralButton(R.string.confirm_display_sensitive_media_dialog_neutral_button) { _, _ -> + notesViewModel.neverShowSensitiveMediaDialog() + } + .setPositiveButton(R.string.confirm_display_sensitive_media_dialog_positive_button) { _, _ -> + action.mediaViewData.show(action.targetIndex) + } + .setNegativeButton(android.R.string.cancel) { _, _ -> + // do nothing + } + .create() + dialog.show() + } else { + action.mediaViewData.show(action.targetIndex) + } + + } } } } \ No newline at end of file diff --git a/modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionListenerAdapter.kt b/modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionListenerAdapter.kt index 44761eb532..34ba06b51f 100644 --- a/modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionListenerAdapter.kt +++ b/modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionListenerAdapter.kt @@ -5,6 +5,7 @@ import net.pantasystem.milktea.model.channel.Channel import net.pantasystem.milktea.model.note.Note import net.pantasystem.milktea.model.note.poll.Poll import net.pantasystem.milktea.model.user.User +import net.pantasystem.milktea.note.media.viewmodel.MediaViewData import net.pantasystem.milktea.note.media.viewmodel.PreviewAbleFile import net.pantasystem.milktea.note.reaction.ReactionCountAction import net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData @@ -74,6 +75,10 @@ class NoteCardActionListenerAdapter( fun onMediaPreviewClicked(previewAbleFile: PreviewAbleFile?, files: List, index: Int, thumbnailView: ImageView) { onAction(NoteCardAction.OnMediaPreviewClicked(previewAbleFile, files, index, WeakReference(thumbnailView))) } + + fun onSensitiveMediaPreviewClicked(mediaViewData: MediaViewData, targetIndex: Int) { + onAction(NoteCardAction.OnSensitiveMediaPreviewClicked(mediaViewData, targetIndex)) + } } @@ -95,6 +100,8 @@ sealed interface NoteCardAction { data class OnMediaPreviewLongClicked(val previewAbleFile: PreviewAbleFile?) : NoteCardAction + data class OnSensitiveMediaPreviewClicked(val mediaViewData: MediaViewData, val targetIndex: Int) : NoteCardAction + data class OnMediaPreviewClicked( val previewAbleFile: PreviewAbleFile?, val files: List, diff --git a/modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/NotesViewModel.kt b/modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/NotesViewModel.kt index eec6d7dc3a..cc77a41d80 100644 --- a/modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/NotesViewModel.kt +++ b/modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/NotesViewModel.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.launch import net.pantasystem.milktea.app_store.notes.NoteTranslationStore import net.pantasystem.milktea.common.Logger +import net.pantasystem.milktea.common.mapCancellableCatching import net.pantasystem.milktea.common_android.resource.StringSource import net.pantasystem.milktea.model.note.DeleteAndEditUseCase import net.pantasystem.milktea.model.note.DeleteNoteUseCase @@ -26,6 +27,7 @@ import net.pantasystem.milktea.model.note.poll.VoteUseCase import net.pantasystem.milktea.model.note.reaction.DeleteReactionsUseCase import net.pantasystem.milktea.model.note.reaction.ToggleReactionUseCase import net.pantasystem.milktea.model.note.repost.QuoteRenoteData +import net.pantasystem.milktea.model.setting.LocalConfigRepository import net.pantasystem.milktea.model.user.report.Report import net.pantasystem.milktea.note.R import javax.inject.Inject @@ -45,6 +47,7 @@ class NotesViewModel @Inject constructor( private val deleteAndEditUseCase: DeleteAndEditUseCase, private val deleteReactionUseCase: DeleteReactionsUseCase, private val voteUseCase: VoteUseCase, + private val configRepository: LocalConfigRepository, loggerFactory: Logger.Factory ) : ViewModel() { private val logger by lazy { @@ -204,4 +207,15 @@ class NotesViewModel @Inject constructor( } } + fun neverShowSensitiveMediaDialog() { + viewModelScope.launch { + configRepository.get().mapCancellableCatching { + it.copy(isShowWarningDisplayingSensitiveMedia = false) + }.mapCancellableCatching { + configRepository.save(it) + }.onFailure { + logger.error("警告表示の抑制に失敗", it) + } + } + } } \ No newline at end of file diff --git a/modules/model/src/main/java/net/pantasystem/milktea/model/setting/Config.kt b/modules/model/src/main/java/net/pantasystem/milktea/model/setting/Config.kt index 83babd95f4..87fdc4e13b 100644 --- a/modules/model/src/main/java/net/pantasystem/milktea/model/setting/Config.kt +++ b/modules/model/src/main/java/net/pantasystem/milktea/model/setting/Config.kt @@ -94,6 +94,7 @@ data class Config( val avatarIconShapeType: AvatarIconShapeType, val mediaDisplayMode: MediaDisplayMode, val isEnableSafeSearch: IsSafeSearchEnabled, + val isShowWarningDisplayingSensitiveMedia: Boolean, ) { companion object @@ -115,14 +116,7 @@ data class Config( ) } - fun setSafeSearchEnabled(enabled: Boolean): Config { - return copy( - isEnableSafeSearch = IsSafeSearchEnabled( - isEnabled = enabled, - isConfirmed = true - ) - ) - } + } object DefaultConfig { @@ -169,6 +163,7 @@ object DefaultConfig { isEnabled = true, isConfirmed = false, ), + isShowWarningDisplayingSensitiveMedia = true, ) fun getRememberVisibilityConfig(accountId: Long): RememberVisibility.Remember { diff --git a/modules/model/src/main/java/net/pantasystem/milktea/model/setting/Keys.kt b/modules/model/src/main/java/net/pantasystem/milktea/model/setting/Keys.kt index 77238395cd..b8fccacc0f 100644 --- a/modules/model/src/main/java/net/pantasystem/milktea/model/setting/Keys.kt +++ b/modules/model/src/main/java/net/pantasystem/milktea/model/setting/Keys.kt @@ -38,6 +38,7 @@ val Keys.Companion.allKeys by lazy { Keys.MediaDisplayMode, Keys.IsSafeSearchEnabled, Keys.IsConfirmedSafeSearchEnabled, + Keys.IsShowWarningDisplayingSensitiveMedia, ) } @@ -109,6 +110,8 @@ sealed interface Keys { data object IsConfirmedSafeSearchEnabled : Keys + data object IsShowWarningDisplayingSensitiveMedia : Keys + companion object } @@ -150,5 +153,6 @@ fun Keys.str(): String { is Keys.MediaDisplayMode -> "MediaDisplayMode" is Keys.IsSafeSearchEnabled -> "ExcludeIfExistsSensitiveMedia" is Keys.IsConfirmedSafeSearchEnabled -> "IsConfirmedSafeSearchEnabled" + is Keys.IsShowWarningDisplayingSensitiveMedia -> "IsShowWarningDisplayingSensitiveMedia" } }