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"
}
}