Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

センシティブなメディアを表示する時は警告ダイアログを表示するようにした #1978

Merged
merged 7 commits into from
Nov 19, 2023
5 changes: 5 additions & 0 deletions modules/common_resource/src/main/res/values-ja/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -646,4 +646,9 @@
<string name="safe_search_description_dialog_positive_button">設定へ移動する</string>
<string name="safe_search_description_dialog_negative_button">セーフサーチを有効にしてお</string>

<string name="confirm_display_sensitive_media_dialog_title">メディア表示の確認</string>
<string name="confirm_display_sensitive_media_dialog_message">暴力的、性的なメディアが表示される恐れがあります。本当に表示しますか?</string>
<string name="confirm_display_sensitive_media_dialog_positive_button">表示</string>
<string name="confirm_display_sensitive_media_dialog_neutral_button">警告を非表示</string>

</resources>
5 changes: 5 additions & 0 deletions modules/common_resource/src/main/res/values-zh/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -635,4 +635,9 @@
<string name="safe_search_description_dialog_positive_button">移动到设置</string>
<string name="safe_search_description_dialog_negative_button">保持启用安全搜索</string>

<string name="confirm_display_sensitive_media_dialog_title">确认媒体显示</string>
<string name="confirm_display_sensitive_media_dialog_message">可能会显示暴力或性内容的媒体。您确定要查看吗?</string>
<string name="confirm_display_sensitive_media_dialog_positive_button">显示</string>
<string name="confirm_display_sensitive_media_dialog_neutral_button">不要警告</string>

</resources>
5 changes: 5 additions & 0 deletions modules/common_resource/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,11 @@
<string name="safe_search_description_dialog_message">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.</string>
<string name="safe_search_description_dialog_positive_button">Go to Settings</string>
<string name="safe_search_description_dialog_negative_button">Keep Safe Search enabled</string>

<string name="confirm_display_sensitive_media_dialog_title">Confirm Media Display</string>
<string name="confirm_display_sensitive_media_dialog_message">There is a risk that violent or sexual media will be displayed. Are you sure you want to view it?</string>
<string name="confirm_display_sensitive_media_dialog_positive_button">Display</string>
<string name="confirm_display_sensitive_media_dialog_neutral_button">Do not warn</string>
<!-- reaction-acceptance -->

</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,9 @@ fun Config.Companion.from(map: Map<Keys, PrefType?>): Config {
Keys.IsConfirmedSafeSearchEnabled
)?.value ?: DefaultConfig.config.isEnableSafeSearch.isConfirmed
),
isShowWarningDisplayingSensitiveMedia = map.getValue<PrefType.BoolPref>(
Keys.IsShowWarningDisplayingSensitiveMedia
)?.value ?: DefaultConfig.config.isShowWarningDisplayingSensitiveMedia,
)
}

Expand Down Expand Up @@ -316,6 +319,9 @@ fun Config.pref(key: Keys): PrefType {
Keys.IsConfirmedSafeSearchEnabled -> {
PrefType.BoolPref(isEnableSafeSearch.isConfirmed)
}
Keys.IsShowWarningDisplayingSensitiveMedia -> {
PrefType.BoolPref(isShowWarningDisplayingSensitiveMedia)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,15 +141,19 @@ class KeysKtTest {
"IsConfirmedSafeSearchEnabled",
key.str()
)
Keys.IsShowWarningDisplayingSensitiveMedia -> Assertions.assertEquals(
"IsShowWarningDisplayingSensitiveMedia",
key.str()
)
}
}
}


@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)
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,9 +186,6 @@ object MediaPreviewHelper {
previewAbleList,
noteCardActionListenerAdapter,
)
binding.baseFrame.setOnClickListener {
mediaViewData.show(index)
}

binding.thumbnail.setPreview(previewAbleFile, mediaViewData.config)

Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}

}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -74,6 +75,10 @@ class NoteCardActionListenerAdapter(
fun onMediaPreviewClicked(previewAbleFile: PreviewAbleFile?, files: List<PreviewAbleFile>, index: Int, thumbnailView: ImageView) {
onAction(NoteCardAction.OnMediaPreviewClicked(previewAbleFile, files, index, WeakReference(thumbnailView)))
}

fun onSensitiveMediaPreviewClicked(mediaViewData: MediaViewData, targetIndex: Int) {
onAction(NoteCardAction.OnSensitiveMediaPreviewClicked(mediaViewData, targetIndex))
}
}


Expand All @@ -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<PreviewAbleFile>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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 {
Expand Down Expand Up @@ -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)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ data class Config(
val avatarIconShapeType: AvatarIconShapeType,
val mediaDisplayMode: MediaDisplayMode,
val isEnableSafeSearch: IsSafeSearchEnabled,
val isShowWarningDisplayingSensitiveMedia: Boolean,
) {
companion object

Expand All @@ -115,14 +116,7 @@ data class Config(
)
}

fun setSafeSearchEnabled(enabled: Boolean): Config {
return copy(
isEnableSafeSearch = IsSafeSearchEnabled(
isEnabled = enabled,
isConfirmed = true
)
)
}

}

object DefaultConfig {
Expand Down Expand Up @@ -169,6 +163,7 @@ object DefaultConfig {
isEnabled = true,
isConfirmed = false,
),
isShowWarningDisplayingSensitiveMedia = true,
)

fun getRememberVisibilityConfig(accountId: Long): RememberVisibility.Remember {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ val Keys.Companion.allKeys by lazy {
Keys.MediaDisplayMode,
Keys.IsSafeSearchEnabled,
Keys.IsConfirmedSafeSearchEnabled,
Keys.IsShowWarningDisplayingSensitiveMedia,
)
}

Expand Down Expand Up @@ -109,6 +110,8 @@ sealed interface Keys {

data object IsConfirmedSafeSearchEnabled : Keys

data object IsShowWarningDisplayingSensitiveMedia : Keys

companion object
}

Expand Down Expand Up @@ -150,5 +153,6 @@ fun Keys.str(): String {
is Keys.MediaDisplayMode -> "MediaDisplayMode"
is Keys.IsSafeSearchEnabled -> "ExcludeIfExistsSensitiveMedia"
is Keys.IsConfirmedSafeSearchEnabled -> "IsConfirmedSafeSearchEnabled"
is Keys.IsShowWarningDisplayingSensitiveMedia -> "IsShowWarningDisplayingSensitiveMedia"
}
}