diff --git a/app/src/main/java/app/pachli/components/compose/ComposeActivity.kt b/app/src/main/java/app/pachli/components/compose/ComposeActivity.kt index 244ac70a7c..05455b51b8 100644 --- a/app/src/main/java/app/pachli/components/compose/ComposeActivity.kt +++ b/app/src/main/java/app/pachli/components/compose/ComposeActivity.kt @@ -974,7 +974,7 @@ class ComposeActivity : } private fun onSendClicked() = lifecycleScope.launch { - confirmStatusLanguage() + if (viewModel.confirmStatusLanguage) confirmStatusLanguage() if (verifyScheduledTime()) { sendStatus() @@ -1049,6 +1049,7 @@ class ComposeActivity : .await( getString(R.string.compose_warn_language_dialog_change_language_fmt, detectedDisplayLang), getString(R.string.compose_warn_language_dialog_accept_language_fmt, currentDisplayLang), + getString(R.string.compose_warn_language_dialog_accept_and_dont_ask_fmt, currentDisplayLang), ) if (dialog == AlertDialog.BUTTON_POSITIVE) { @@ -1057,6 +1058,8 @@ class ComposeActivity : binding.composePostLanguageButton.setSelection(it) } } + + if (dialog == AlertDialog.BUTTON_NEUTRAL) viewModel.confirmStatusLanguage = false } /** This is for the fancy keyboards which can insert images and stuff, and drag&drop etc */ diff --git a/app/src/main/java/app/pachli/components/compose/ComposeViewModel.kt b/app/src/main/java/app/pachli/components/compose/ComposeViewModel.kt index 95f8eb8cc7..6ae198b08c 100644 --- a/app/src/main/java/app/pachli/components/compose/ComposeViewModel.kt +++ b/app/src/main/java/app/pachli/components/compose/ComposeViewModel.kt @@ -43,6 +43,7 @@ import app.pachli.core.network.model.Attachment import app.pachli.core.network.model.NewPoll import app.pachli.core.network.model.Status import app.pachli.core.network.retrofit.MastodonApi +import app.pachli.core.preferences.SharedPreferencesRepository import app.pachli.core.ui.MentionSpan import app.pachli.service.MediaToSend import app.pachli.service.ServiceClient @@ -80,7 +81,8 @@ class ComposeViewModel @Inject constructor( private val serviceClient: ServiceClient, private val draftHelper: DraftHelper, instanceInfoRepo: InstanceInfoRepository, - private val serverRepository: ServerRepository, + serverRepository: ServerRepository, + private val sharedPreferencesRepository: SharedPreferencesRepository, ) : ViewModel() { /** The current content */ @@ -153,6 +155,17 @@ class ComposeViewModel @Inject constructor( it.get()?.can(ServerOperation.ORG_JOINMASTODON_STATUSES_SCHEDULED, ">= 1.0.0".toConstraint()) == true }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), false) + /** + * True if the post's language should be checked before posting. + * + * Modifications are persisted back to shared preferences. + */ + var confirmStatusLanguage: Boolean + get() = sharedPreferencesRepository.confirmStatusLanguage + set(value) { + sharedPreferencesRepository.confirmStatusLanguage = value + } + private lateinit var composeKind: ComposeKind // Used in ComposeActivity to pass state to result function when cropImage contract inflight diff --git a/app/src/main/java/app/pachli/components/preference/PreferencesFragment.kt b/app/src/main/java/app/pachli/components/preference/PreferencesFragment.kt index 9c4e06211e..12bc2ef2a9 100644 --- a/app/src/main/java/app/pachli/components/preference/PreferencesFragment.kt +++ b/app/src/main/java/app/pachli/components/preference/PreferencesFragment.kt @@ -278,6 +278,13 @@ class PreferencesFragment : PreferenceFragmentCompat() { setTitle(R.string.pref_title_show_stat_inline) isSingleLineTitle = false } + + switchPreference { + setDefaultValue(true) + key = PrefKeys.CONFIRM_STATUS_LANGUAGE + setTitle(R.string.pref_title_confirm_status_language) + isSingleLineTitle = false + } } preferenceCategory(app.pachli.core.preferences.R.string.pref_category_tabs) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 399be864c5..151e9d6ac8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -572,6 +572,7 @@ Show link previews in timelines Show confirmation before boosting Show confirmation before favoriting + Check post\'s language setting before posting Hide the title of the top toolbar Wellbeing Your private note about this account @@ -717,6 +718,7 @@ The post\'s language is set to %1$s but you might have written it in %2$s. Change language to "%1$s" and post Post as-is (%1$s) + Post as-is (%1$s) and don\'t ask again media upload with ID %1$s not found %1$s diff --git a/core/preferences/src/main/kotlin/app/pachli/core/preferences/SettingsConstants.kt b/core/preferences/src/main/kotlin/app/pachli/core/preferences/SettingsConstants.kt index 183d978ec1..b527bc0351 100644 --- a/core/preferences/src/main/kotlin/app/pachli/core/preferences/SettingsConstants.kt +++ b/core/preferences/src/main/kotlin/app/pachli/core/preferences/SettingsConstants.kt @@ -125,6 +125,12 @@ object PrefKeys { const val DOWNLOAD_LOCATION = "downloadLocation" const val TAB_TAP_BEHAVIOUR = "tabTapBehaviour" + /** + * True if the status' language should be checked before posting and the user + * should be prompted to confirm if it doesn't match the set language. + */ + const val CONFIRM_STATUS_LANGUAGE = "confirmStatusLanguage" + /** Keys that are no longer used (e.g., the preference has been removed */ object Deprecated { const val WELLBEING_LIMITED_NOTIFICATIONS = "wellbeingModeLimitedNotifications" diff --git a/core/preferences/src/main/kotlin/app/pachli/core/preferences/SharedPreferencesRepository.kt b/core/preferences/src/main/kotlin/app/pachli/core/preferences/SharedPreferencesRepository.kt index f2e4a52016..c8d5193695 100644 --- a/core/preferences/src/main/kotlin/app/pachli/core/preferences/SharedPreferencesRepository.kt +++ b/core/preferences/src/main/kotlin/app/pachli/core/preferences/SharedPreferencesRepository.kt @@ -19,6 +19,7 @@ package app.pachli.core.preferences import android.content.SharedPreferences import androidx.annotation.Keep +import androidx.core.content.edit import app.pachli.core.common.di.ApplicationScope import javax.inject.Inject import javax.inject.Singleton @@ -57,6 +58,13 @@ class SharedPreferencesRepository @Inject constructor( val animateEmojis: Boolean get() = getBoolean(PrefKeys.ANIMATE_CUSTOM_EMOJIS, false) + /** True if the status' language should be checked before sending. */ + var confirmStatusLanguage: Boolean + get() = getBoolean(PrefKeys.CONFIRM_STATUS_LANGUAGE, true) + set(value) { + edit { putBoolean(PrefKeys.CONFIRM_STATUS_LANGUAGE, value) } + } + /** Location of downloaded files. */ val downloadLocation: DownloadLocation get() = getEnum(PrefKeys.DOWNLOAD_LOCATION, DownloadLocation.DOWNLOADS)