Bug 1856970 - Translations UI Preference Screen Never Translate

fenix/122.0
iorgamgabriel 7 months ago committed by mergify[bot]
parent 8c02de0307
commit d18fff8e62

@ -23,6 +23,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.mozilla.fenix.R
@ -72,7 +73,8 @@ fun TextListItem(
onClick = onIconClick,
modifier = Modifier
.padding(end = 16.dp)
.size(ICON_SIZE),
.size(ICON_SIZE)
.clearAndSetSemantics {},
) {
Icon(
painter = iconPainter,

@ -41,7 +41,12 @@ class TranslationSettingsFragment : Fragment(), UserInteractionHandler {
)
},
onDownloadLanguageClicked = {},
onNeverTranslationClicked = {},
onNeverTranslationClicked = {
findNavController().navigate(
TranslationSettingsFragmentDirections
.actionTranslationSettingsFragmentToNeverTranslateSitePreferenceFragment(),
)
},
)
}
}

@ -0,0 +1,72 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.translations.preferences.nevertranslatesite
import androidx.compose.foundation.background
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.AlertDialog
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import org.mozilla.fenix.R
import org.mozilla.fenix.compose.annotation.LightDarkPreview
import org.mozilla.fenix.compose.button.TextButton
import org.mozilla.fenix.theme.FirefoxTheme
/**
* Firefox Preference: Never Translate Dialog compose view.
*
* @param websiteUrl Title of the dialog that should be display.
* @param onConfirmDelete Invoked when the user clicks on the "Delete" dialog button.
* @param onCancel Invoked when the user clicks on the "Cancel" dialog button.
*/
@Composable
fun NeverTranslateSiteDialogPreference(
websiteUrl: String,
onConfirmDelete: () -> Unit,
onCancel: () -> Unit,
) {
AlertDialog(
onDismissRequest = {},
modifier = Modifier.background(
color = FirefoxTheme.colors.layer2,
shape = RoundedCornerShape(8.dp),
),
title = {
Text(
text = stringResource(R.string.never_translate_site_dialog_title_preference, websiteUrl),
color = FirefoxTheme.colors.textPrimary,
style = FirefoxTheme.typography.headline7,
)
},
confirmButton = {
TextButton(
text = stringResource(id = R.string.never_translate_site_dialog_confirm_delete_preference),
onClick = { onConfirmDelete() },
)
},
dismissButton = {
TextButton(
text = stringResource(id = R.string.never_translate_site_dialog_cancel_preference),
onClick = { onCancel() },
)
},
backgroundColor = FirefoxTheme.colors.layer2,
)
}
@Composable
@LightDarkPreview
private fun NeverTranslateSiteDialogPreferencePreview() {
FirefoxTheme {
NeverTranslateSiteDialogPreference(
websiteUrl = "wikipedia.com",
onConfirmDelete = {},
onCancel = {},
)
}
}

@ -0,0 +1,47 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.translations.preferences.nevertranslatesite
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.DialogFragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import org.mozilla.fenix.theme.FirefoxTheme
/**
* A dialog fragment displaying the Firefox Preference: never translate site item.
*/
class NeverTranslateSiteDialogPreferenceFragment : DialogFragment() {
private val args by navArgs<NeverTranslateSiteDialogPreferenceFragmentArgs>()
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
super.onCreateDialog(savedInstanceState).apply {
setOnShowListener {
setCanceledOnTouchOutside(false)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View = ComposeView(requireContext()).apply {
setContent {
FirefoxTheme {
NeverTranslateSiteDialogPreference(
websiteUrl = args.websiteUrl,
onConfirmDelete = { findNavController().popBackStack() },
onCancel = { findNavController().popBackStack() },
)
}
}
}
}

@ -0,0 +1,12 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.translations.preferences.nevertranslatesite
/**
* NeverTranslateSiteListItemPreference that will appear on [NeverTranslateSitePreferenceFragment] screens.
*
* @property websiteUrl The text that will appear on the item list.
*/
data class NeverTranslateSiteListItemPreference(val websiteUrl: String)

@ -0,0 +1,104 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.translations.preferences.nevertranslatesite
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.role
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import org.mozilla.fenix.R
import org.mozilla.fenix.compose.annotation.LightDarkPreview
import org.mozilla.fenix.compose.list.TextListItem
import org.mozilla.fenix.theme.FirefoxTheme
/**
* Firefox Preference: Never Translate Site preference screen.
*
* @param neverTranslateSiteListPreferences List of [NeverTranslateSiteListItemPreference]s to display.
* @param onItemClick Invoked when the user clicks on the a item from the list.
*/
@Composable
fun NeverTranslateSitePreference(
neverTranslateSiteListPreferences: List<NeverTranslateSiteListItemPreference>,
onItemClick: (NeverTranslateSiteListItemPreference) -> Unit,
) {
Column(
modifier = Modifier
.background(
color = FirefoxTheme.colors.layer1,
),
) {
TextListItem(
label = stringResource(R.string.never_translate_site_header_preference),
modifier = Modifier
.padding(
start = 56.dp,
)
.semantics { heading() },
maxLabelLines = Int.MAX_VALUE,
)
LazyColumn {
items(neverTranslateSiteListPreferences) { item: NeverTranslateSiteListItemPreference ->
val itemContentDescription = stringResource(
id = R.string.never_translate_site_item_list_content_description_preference,
item.websiteUrl,
)
TextListItem(
label = item.websiteUrl,
modifier = Modifier
.padding(
start = 56.dp,
)
.clearAndSetSemantics {
role = Role.Button
contentDescription = itemContentDescription
},
onClick = { onItemClick(item) },
iconPainter = painterResource(R.drawable.mozac_ic_delete_24),
onIconClick = { onItemClick(item) },
)
}
}
}
}
@Composable
internal fun getNeverTranslateListItemsPreference(): List<NeverTranslateSiteListItemPreference> {
return mutableListOf<NeverTranslateSiteListItemPreference>().apply {
add(
NeverTranslateSiteListItemPreference(
websiteUrl = "expedia.ca",
),
)
add(
NeverTranslateSiteListItemPreference(
websiteUrl = "wikipedia.com",
),
)
}
}
@Composable
@LightDarkPreview
private fun NeverTranslateSitePreferencePreview() {
FirefoxTheme {
NeverTranslateSitePreference(
neverTranslateSiteListPreferences = getNeverTranslateListItemsPreference(),
) {}
}
}

@ -0,0 +1,48 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.translations.preferences.nevertranslatesite
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.showToolbar
import org.mozilla.fenix.theme.FirefoxTheme
/**
* A fragment displaying the Firefox Preference never translate site items list.
*/
class NeverTranslateSitePreferenceFragment : Fragment() {
override fun onResume() {
super.onResume()
showToolbar(getString(R.string.never_translate_site_toolbar_title_preference))
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View = ComposeView(requireContext()).apply {
setContent {
FirefoxTheme {
NeverTranslateSitePreference(
neverTranslateSiteListPreferences = getNeverTranslateListItemsPreference(),
onItemClick = {
findNavController().navigate(
NeverTranslateSitePreferenceFragmentDirections
.actionNeverTranslateSitePreferenceFragmentToNeverTranslateSiteDialogPreferenceFragment(
it.websiteUrl,
),
)
},
)
}
}
}
}

@ -1443,6 +1443,9 @@
app:destination="@id/translationsDialogFragment"
app:popUpTo="@id/translationSettingsFragment"
app:popUpToInclusive="true" />
<action
android:id="@+id/action_translationSettingsFragment_to_neverTranslateSitePreferenceFragment"
app:destination="@id/neverTranslateSitePreferenceFragment" />
<action
android:id="@+id/action_translationSettingsFragment_to_automaticTranslationPreferenceFragment"
app:destination="@id/automaticTranslationPreferenceFragment" />
@ -1461,5 +1464,19 @@
android:name="selectedTranslationOptionPreference"
app:argType="org.mozilla.fenix.translations.preferences.automatic.AutomaticTranslationItemPreference" />
</fragment>
<fragment
android:id="@+id/neverTranslateSitePreferenceFragment"
android:name="org.mozilla.fenix.translations.preferences.nevertranslatesite.NeverTranslateSitePreferenceFragment">
<action
android:id="@+id/action_neverTranslateSitePreferenceFragment_to_neverTranslateSiteDialogPreferenceFragment"
app:destination="@id/neverTranslateSiteDialogPreferenceFragment" />
</fragment>
<dialog
android:id="@+id/neverTranslateSiteDialogPreferenceFragment"
android:name="org.mozilla.fenix.translations.preferences.nevertranslatesite.NeverTranslateSiteDialogPreferenceFragment">
<argument
android:name="websiteUrl"
app:argType="string" />
</dialog>
</navigation>
</navigation>

@ -2304,7 +2304,7 @@
<!-- Title of the never translate site preference screen that will appear on the toolbar.-->
<string name="automatic_translation_toolbar_title_preference">Automatic translation</string>
<!-- Screen header presenting the automatic translation preference feature. It will appear under the toolbar. -->
<string name="automatic_translation_header_preference">Select a language to manage \"always translate\" and \"never translate\" preferences.</string>
<string name="automatic_translation_header_preference">Select a language to manage ”always translate“ and ”never translate“ preferences.</string>
<!-- Automatic translation options preference screen -->
<!-- Preference option for offering to translate. Radio button title text.-->
@ -2319,4 +2319,20 @@
<string name="automatic_translation_option_never_translate_title_preference">Never translate</string>
<!-- Preference option for never translate. Radio button summary text. The first parameter is the name of the app defined in app_name (for example: Fenix)-->
<string name="automatic_translation_option_never_translate_summary_preference">%1$s will never offer to translate sites in this language.</string>
<!-- Never translate site preference screen -->
<!-- Title of the never translate site preference screen that will appear on the toolbar.-->
<string name="never_translate_site_toolbar_title_preference">Never translate these sites</string>
<!-- Screen header presenting the never translate site preference feature. It will appear under the toolbar. -->
<string name="never_translate_site_header_preference">To add a new site: Visit it and select “Never translate this site” from the translation menu.</string>
<!-- Content description (not visible, for screen readers etc.): For a never-translated site list item that is selected.
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="never_translate_site_item_list_content_description_preference">Remove %1$s</string>
<!-- The Delete site dialogue title will appear when the user clicks on a list item.
The first parameter is the name of the app defined in app_name (for example: Fenix) -->
<string name="never_translate_site_dialog_title_preference">Delete %1$s?</string>
<!-- The Delete site dialogue positive button will appear when the user clicks on a list item. The site will be deleted. -->
<string name="never_translate_site_dialog_confirm_delete_preference">Delete</string>
<!-- The Delete site dialogue negative button will appear when the user clicks on a list item. The dialog will be dismissed. -->
<string name="never_translate_site_dialog_cancel_preference">Cancel</string>
</resources>

Loading…
Cancel
Save