commit 3567e06b2e81e5b0acbb9015a2a94391ea0e79c6
parent 9d1b7dbacd89d1dfcecca4630676eb63b81eff90
Author: Gabriel Luong <gabriel.luong@gmail.com>
Date: Thu, 20 Nov 2025 08:12:38 +0000
Bug 1998092 - Part 14: Migrate EditAddressScreen to M3 Acorn color tokens r=android-reviewers,007
- Fixed the previews to display the address structure with add and edit mode.
- Migrated EditAddressScreen to M3 Acorn color tokens. This was mostly removing unnecessary colors to use the default parameters in the design components. This does not align screen with the updated M3 specs beyond colors.
- Figma: https://www.figma.com/design/ctk1Pw1TBxUwVgTTOvjHb4/2025-Android-Fundamentals?node-id=990-28370&m=dev
Differential Revision: https://phabricator.services.mozilla.com/D272201
Diffstat:
4 files changed, 106 insertions(+), 37 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/store/AddressState.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/store/AddressState.kt
@@ -81,7 +81,7 @@ data class AddressState(
fun initial(
region: RegionState? = null,
address: Address? = null,
- ): AddressState {
+ ): AddressState {
// We want to use the country unless it is empty, we fall back to the users region unless
// it hasn't loaded yet meaning that we will have the Default value of XX falling back to
// DEFAULT_COUNTRY.
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/ui/edit/EditAddressScreen.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/ui/edit/EditAddressScreen.kt
@@ -25,7 +25,9 @@ import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
+import mozilla.components.browser.state.search.RegionState
import mozilla.components.compose.base.Dropdown
import mozilla.components.compose.base.annotation.FlexibleWindowLightDarkPreview
import mozilla.components.compose.base.button.DestructiveButton
@@ -34,8 +36,8 @@ import mozilla.components.compose.base.button.OutlinedButton
import mozilla.components.compose.base.menu.MenuItem
import mozilla.components.compose.base.modifier.thenConditional
import mozilla.components.compose.base.textfield.TextField
-import mozilla.components.compose.base.textfield.TextFieldColors
import mozilla.components.concept.engine.autofill.AddressStructure
+import mozilla.components.concept.storage.Address
import mozilla.components.concept.storage.UpdatableAddressFields
import mozilla.components.lib.state.ext.observeAsState
import org.mozilla.fenix.R
@@ -48,7 +50,9 @@ import org.mozilla.fenix.settings.address.store.FormChange
import org.mozilla.fenix.settings.address.store.SaveTapped
import org.mozilla.fenix.settings.address.store.ViewAppeared
import org.mozilla.fenix.settings.address.store.isEditing
+import org.mozilla.fenix.settings.address.utils.generateAddress
import org.mozilla.fenix.theme.FirefoxTheme
+import org.mozilla.fenix.theme.Theme
import mozilla.components.compose.base.text.Text as DropdownText
/**
@@ -62,7 +66,6 @@ fun EditAddressScreen(store: AddressStore) {
topBar = {
EditAddressTopBar(store)
},
- containerColor = FirefoxTheme.colors.layer1,
) { paddingValues ->
val structureState by store.observeAsState(store.state.structureState) { it.structureState }
var hasRequestedFocus by remember { mutableStateOf(false) }
@@ -140,9 +143,6 @@ private fun TextField(
errorText = "",
modifier = modifier.testTag(field.id.testTag),
label = field.localizationKey.localizedString(),
- colors = TextFieldColors.default(
- placeholderColor = FirefoxTheme.colors.textPrimary,
- ),
)
}
@@ -285,11 +285,73 @@ private fun AddressStructure.Field.LocalizationKey.localizedString() = when (thi
is AddressStructure.Field.LocalizationKey.Unknown -> key
}
+private fun createStore(
+ region: RegionState? = null,
+ address: Address? = null,
+) = AddressStore(
+ initialState = AddressState.initial(region = region, address = address).copy(
+ structureState = AddressStructureState.Loaded(
+ structure = AddressStructure(
+ fields = listOf(
+ AddressStructure.Field.TextField(
+ AddressStructure.Field.ID.Name,
+ AddressStructure.Field.LocalizationKey.Name,
+ ),
+ AddressStructure.Field.TextField(
+ AddressStructure.Field.ID.Organization,
+ AddressStructure.Field.LocalizationKey.Organization,
+ ),
+ AddressStructure.Field.TextField(
+ AddressStructure.Field.ID.StreetAddress,
+ AddressStructure.Field.LocalizationKey.StreetAddress,
+ ),
+ ),
+ ),
+ ),
+ ),
+ listOf(),
+).also { it.dispatch(ViewAppeared) }
+
+@FlexibleWindowLightDarkPreview
+@Composable
+private fun AddAddressPreview() {
+ val store = createStore()
+
+ FirefoxTheme {
+ EditAddressScreen(store)
+ }
+}
+
+@Preview
+@Composable
+private fun AddAddressPrivatePreview() {
+ val store = createStore()
+
+ FirefoxTheme(theme = Theme.Private) {
+ EditAddressScreen(store)
+ }
+}
+
@FlexibleWindowLightDarkPreview
@Composable
private fun EditAddressPreview() {
- val store = AddressStore(AddressState.initial(), listOf()).also { it.dispatch(ViewAppeared) }
+ val store = createStore(
+ address = generateAddress(),
+ )
+
FirefoxTheme {
EditAddressScreen(store)
}
}
+
+@Preview
+@Composable
+private fun EditAddressPrivatePreview() {
+ val store = createStore(
+ address = generateAddress(),
+ )
+
+ FirefoxTheme(theme = Theme.Private) {
+ EditAddressScreen(store)
+ }
+}
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/utils/AddressUtils.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/utils/AddressUtils.kt
@@ -0,0 +1,36 @@
+/* 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.settings.address.utils
+
+import mozilla.components.concept.storage.Address
+
+internal fun generateAddress(
+ name: String = "Firefox The Browser",
+ organization: String = "Mozilla",
+ streetAddress: String = "street",
+ addressLevel3: String = "3",
+ addressLevel2: String = "2",
+ addressLevel1: String = "1",
+ postalCode: String = "code",
+ country: String = "country",
+ tel: String = "tel",
+ email: String = "email",
+) = Address(
+ guid = "",
+ name = name,
+ organization = organization,
+ streetAddress = streetAddress,
+ addressLevel3 = addressLevel3,
+ addressLevel2 = addressLevel2,
+ addressLevel1 = addressLevel1,
+ postalCode = postalCode,
+ country = country,
+ tel = tel,
+ email = email,
+ timeCreated = 1,
+ timeLastUsed = 1,
+ timeLastModified = 1,
+ timesUsed = 1,
+)
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/address/ext/AddressTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/settings/address/ext/AddressTest.kt
@@ -4,9 +4,9 @@
package org.mozilla.fenix.settings.address.ext
-import mozilla.components.concept.storage.Address
import org.junit.Assert.assertEquals
import org.junit.Test
+import org.mozilla.fenix.settings.address.utils.generateAddress
class AddressTest {
@@ -70,33 +70,4 @@ class AddressTest {
assertEquals("line1 line2 line3", result)
}
-
- private fun generateAddress(
- name: String = "Firefox The Browser",
- organization: String = "Mozilla",
- streetAddress: String = "street",
- addressLevel3: String = "3",
- addressLevel2: String = "2",
- addressLevel1: String = "1",
- postalCode: String = "code",
- country: String = "country",
- tel: String = "tel",
- email: String = "email",
- ) = Address(
- guid = "",
- name = name,
- organization = organization,
- streetAddress = streetAddress,
- addressLevel3 = addressLevel3,
- addressLevel2 = addressLevel2,
- addressLevel1 = addressLevel1,
- postalCode = postalCode,
- country = country,
- tel = tel,
- email = email,
- timeCreated = 1,
- timeLastUsed = 1,
- timeLastModified = 1,
- timesUsed = 1,
- )
}