From 7a6bebd1436ee6f53cf16fd90f669609304bbb26 Mon Sep 17 00:00:00 2001 From: johan12345 Date: Fri, 9 May 2025 22:59:59 +0200 Subject: [PATCH] RTL and Arabic locale fixes --- app/build.gradle.kts | 3 ++- app/src/debug/res/values/strings.xml | 2 +- app/src/main/java/net/vonforst/evmap/Utils.kt | 12 +++++++++++- .../net/vonforst/evmap/adapter/GalleryAdapter.kt | 11 ++++------- .../net/vonforst/evmap/auto/ChargepriceScreen.kt | 3 ++- .../net/vonforst/evmap/auto/ChargerDetailScreen.kt | 3 ++- .../vonforst/evmap/fragment/OnboardingFragment.kt | 12 ++++++++---- .../java/net/vonforst/evmap/model/ChargersModel.kt | 11 ++++++----- .../java/net/vonforst/evmap/utils/LocationUtils.kt | 7 +++++-- .../main/res/layout-sw720dp/fragment_onboarding.xml | 1 + app/src/main/res/layout/app_logo.xml | 1 + app/src/main/res/layout/data_source_select.xml | 4 +++- app/src/main/res/layout/detail_view.xml | 13 +++++++++---- .../res/layout/dialog_connector_details_header.xml | 8 +++++--- app/src/main/res/layout/fragment_onboarding.xml | 1 + .../res/layout/fragment_onboarding_data_source.xml | 1 + app/src/main/res/layout/item_connector.xml | 8 +++++--- app/src/main/res/layout/item_connector_button.xml | 6 ++++-- app/src/main/res/layout/item_detail.xml | 2 ++ app/src/main/res/layout/item_favorite.xml | 9 +++++++-- app/src/main/res/layout/item_filter_boolean.xml | 1 + .../main/res/layout/item_filter_multiple_choice.xml | 1 + .../layout/item_filter_multiple_choice_large.xml | 2 ++ app/src/main/res/layout/map_layers.xml | 12 +++++++++--- app/src/main/res/values-ldrtl-w960dp/dimens.xml | 4 ++++ 25 files changed, 97 insertions(+), 41 deletions(-) create mode 100644 app/src/main/res/values-ldrtl-w960dp/dimens.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6b726ac2..3166a087 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -289,10 +289,11 @@ dependencies { implementation("androidx.cardview:cardview:1.0.0") implementation("androidx.preference:preference-ktx:1.2.1") implementation("com.google.android.material:material:1.12.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") + implementation("androidx.constraintlayout:constraintlayout:2.2.1") implementation("androidx.recyclerview:recyclerview:1.3.2") implementation("androidx.browser:browser:1.8.0") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") + implementation("androidx.viewpager2:viewpager2:1.1.0") implementation("androidx.security:security-crypto:1.1.0-alpha06") implementation("androidx.work:work-runtime-ktx:2.9.0") implementation("com.github.ev-map:CustomBottomSheetBehavior:e48f73ea7b") diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml index 1e2efcfc..7b37dad8 100644 --- a/app/src/debug/res/values/strings.xml +++ b/app/src/debug/res/values/strings.xml @@ -1,4 +1,4 @@ - EVMap (debug) + EVMap \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/Utils.kt b/app/src/main/java/net/vonforst/evmap/Utils.kt index 15023be6..15d68de9 100644 --- a/app/src/main/java/net/vonforst/evmap/Utils.kt +++ b/app/src/main/java/net/vonforst/evmap/Utils.kt @@ -16,6 +16,8 @@ import android.text.SpannableStringBuilder import android.text.SpannedString import android.text.TextUtils import android.text.style.StyleSpan +import android.view.View +import android.view.ViewTreeObserver import net.vonforst.evmap.storage.PreferenceDataSource import java.util.Currency import java.util.Locale @@ -142,4 +144,12 @@ fun PackageManager.isAppInstalled(packageName: String): Boolean { } } -fun currencyDisplayName(code: String) = "${Currency.getInstance(code).displayName} ($code)" \ No newline at end of file +fun currencyDisplayName(code: String) = "${Currency.getInstance(code).displayName} ($code)" + +inline fun View.waitForLayout(crossinline f: () -> Unit) = + viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + viewTreeObserver.removeOnGlobalLayoutListener(this) + f() + } + }) \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/adapter/GalleryAdapter.kt b/app/src/main/java/net/vonforst/evmap/adapter/GalleryAdapter.kt index 9a1495e8..d4b543c7 100644 --- a/app/src/main/java/net/vonforst/evmap/adapter/GalleryAdapter.kt +++ b/app/src/main/java/net/vonforst/evmap/adapter/GalleryAdapter.kt @@ -5,7 +5,6 @@ import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.widget.ImageView import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter @@ -14,6 +13,7 @@ import coil.load import coil.memory.MemoryCache import net.vonforst.evmap.R import net.vonforst.evmap.model.ChargerPhoto +import net.vonforst.evmap.waitForLayout class GalleryAdapter(context: Context, val itemClickListener: ItemClickListener? = null) : @@ -39,12 +39,9 @@ class GalleryAdapter(context: Context, val itemClickListener: ItemClickListener? val item = getItem(position) if (holder.view.height == 0) { - holder.view.viewTreeObserver.addOnGlobalLayoutListener(object : OnGlobalLayoutListener { - override fun onGlobalLayout() { - holder.view.viewTreeObserver.removeOnGlobalLayoutListener(this) - loadImage(item, holder) - } - }) + holder.view.waitForLayout { + loadImage(item, holder) + } } else { loadImage(item, holder) } diff --git a/app/src/main/java/net/vonforst/evmap/auto/ChargepriceScreen.kt b/app/src/main/java/net/vonforst/evmap/auto/ChargepriceScreen.kt index d1db6140..042f2238 100644 --- a/app/src/main/java/net/vonforst/evmap/auto/ChargepriceScreen.kt +++ b/app/src/main/java/net/vonforst/evmap/auto/ChargepriceScreen.kt @@ -18,6 +18,7 @@ import androidx.car.app.model.Template import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.IconCompat import androidx.lifecycle.lifecycleScope +import com.github.erfansn.localeconfigx.currentOrDefaultLocale import jsonapi.Meta import jsonapi.Relationship import jsonapi.Relationships @@ -89,7 +90,7 @@ class ChargepriceScreen(ctx: CarContext, val session: EVMapSession, val charger: carContext.stringProvider(), chargepoint.type ) - } ${chargepoint.formatPower()} ${ + } ${chargepoint.formatPower(carContext.currentOrDefaultLocale)} ${ carContext.getString( R.string.chargeprice_stats, meta.energy, diff --git a/app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt b/app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt index 4fe73d57..8e3bbb73 100644 --- a/app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt +++ b/app/src/main/java/net/vonforst/evmap/auto/ChargerDetailScreen.kt @@ -35,6 +35,7 @@ import androidx.core.text.HtmlCompat import androidx.lifecycle.lifecycleScope import coil.imageLoader import coil.request.ImageRequest +import com.github.erfansn.localeconfigx.currentOrDefaultLocale import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch @@ -523,7 +524,7 @@ class ChargerDetailScreen( } else { append(nameForPlugType(carContext.stringProvider(), cp.type)) } - cp.formatPower()?.let { + cp.formatPower(carContext.currentOrDefaultLocale)?.let { append(" ") append(it) } diff --git a/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt index 4552f496..987a0c97 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/OnboardingFragment.kt @@ -27,6 +27,7 @@ import net.vonforst.evmap.databinding.FragmentOnboardingWelcomeBinding import net.vonforst.evmap.model.FILTERS_DISABLED import net.vonforst.evmap.navigation.safeNavigate import net.vonforst.evmap.storage.PreferenceDataSource +import net.vonforst.evmap.waitForLayout class OnboardingFragment : Fragment() { private lateinit var binding: FragmentOnboardingBinding @@ -62,7 +63,6 @@ class OnboardingFragment : Fragment() { } override fun onPageSelected(position: Int) { - binding.pageIndicatorView.selection = position binding.forward?.visibility = if (position == adapter.itemCount - 1) View.INVISIBLE else View.VISIBLE binding.backward?.visibility = if (position == 0) View.INVISIBLE else View.VISIBLE @@ -79,9 +79,13 @@ class OnboardingFragment : Fragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - if (prefs.welcomeDialogShown) { - // skip to last page for selecting data source or accepting the privacy policy - binding.viewPager.currentItem = adapter.itemCount - 1 + binding.root.waitForLayout { + binding.viewPager.currentItem = if (prefs.welcomeDialogShown) { + // skip to last page for selecting data source or accepting the privacy policy + adapter.itemCount - 1 + } else { + 0 + } } } diff --git a/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt b/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt index 03ee2c17..d58567bc 100644 --- a/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt +++ b/app/src/main/java/net/vonforst/evmap/model/ChargersModel.kt @@ -18,6 +18,7 @@ import java.time.LocalDate import java.time.LocalTime import java.time.format.DateTimeFormatter import java.time.format.FormatStyle +import java.util.Locale import kotlin.math.abs sealed class ChargepointListItem @@ -140,9 +141,9 @@ data class ChargeLocation( val totalChargepoints: Int get() = chargepoints.sumOf { it.count } - fun formatChargepoints(sp: StringProvider): String { + fun formatChargepoints(sp: StringProvider, locale: Locale): String { return chargepointsMerged.joinToString(" · ") { - "${it.count} × ${nameForPlugType(sp, it.type)} ${it.formatPower()}" + "${it.count} × ${nameForPlugType(sp, it.type)} ${it.formatPower(locale)}" } } } @@ -413,12 +414,12 @@ data class Chargepoint( * If chargepoint power is defined, format it into a string. * Otherwise, return null. */ - fun formatPower(): String? { + fun formatPower(locale: Locale): String? { if (power == null) return null val powerFmt = if (abs(power - power.toInt()) < 0.1) { - "%.0f".format(power) + "%.0f".format(locale, power) } else { - "%.1f".format(power) + "%.1f".format(locale, power) } return "$powerFmt kW" } diff --git a/app/src/main/java/net/vonforst/evmap/utils/LocationUtils.kt b/app/src/main/java/net/vonforst/evmap/utils/LocationUtils.kt index a480bec7..be1510eb 100644 --- a/app/src/main/java/net/vonforst/evmap/utils/LocationUtils.kt +++ b/app/src/main/java/net/vonforst/evmap/utils/LocationUtils.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.location.Location +import android.text.BidiFormatter import androidx.core.content.ContextCompat import com.car2go.maps.model.LatLng import com.car2go.maps.model.LatLngBounds @@ -154,11 +155,13 @@ private fun dms(value: Double, lon: Boolean): String { } fun Coordinate.formatDecimal(accuracy: Int = 6): String { - return "%.${accuracy}f, %.${accuracy}f".format(Locale.ENGLISH, lat, lng) + return BidiFormatter.getInstance() + .unicodeWrap("%.${accuracy}f, %.${accuracy}f".format(Locale.ENGLISH, lat, lng)) } fun Location.formatDecimal(accuracy: Int = 6): String { - return "%.${accuracy}f, %.${accuracy}f".format(Locale.ENGLISH, latitude, longitude) + return BidiFormatter.getInstance() + .unicodeWrap("%.${accuracy}f, %.${accuracy}f".format(Locale.ENGLISH, latitude, longitude)) } fun LatLngBounds.normalize() = LatLngBounds( diff --git a/app/src/main/res/layout-sw720dp/fragment_onboarding.xml b/app/src/main/res/layout-sw720dp/fragment_onboarding.xml index 76eaec2b..95489336 100644 --- a/app/src/main/res/layout-sw720dp/fragment_onboarding.xml +++ b/app/src/main/res/layout-sw720dp/fragment_onboarding.xml @@ -32,6 +32,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" + app:piv_rtl_mode="auto" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/card" diff --git a/app/src/main/res/layout/app_logo.xml b/app/src/main/res/layout/app_logo.xml index c0bdb3af..8b9f1695 100644 --- a/app/src/main/res/layout/app_logo.xml +++ b/app/src/main/res/layout/app_logo.xml @@ -19,6 +19,7 @@ android:layout_height="wrap_content" android:text="@string/app_name" android:textAppearance="@style/TextAppearance.Material3.HeadlineLarge" + android:textAlignment="viewStart" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" diff --git a/app/src/main/res/layout/data_source_select.xml b/app/src/main/res/layout/data_source_select.xml index 67e4b9c5..5842ebf8 100644 --- a/app/src/main/res/layout/data_source_select.xml +++ b/app/src/main/res/layout/data_source_select.xml @@ -6,7 +6,7 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/detail_view.xml b/app/src/main/res/layout/detail_view.xml index 15f8f6ae..e91f7e7a 100644 --- a/app/src/main/res/layout/detail_view.xml +++ b/app/src/main/res/layout/detail_view.xml @@ -7,6 +7,8 @@ + + @@ -120,6 +122,7 @@ android:layout_height="wrap_content" android:ellipsize="end" android:maxLines="1" + android:textAlignment="viewStart" android:text="@{charger.data.address.toString()}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" app:invisibleUnless="@{charger.data.address != null}" @@ -134,7 +137,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:ellipsize="end" - android:gravity="end" + android:textAlignment="viewEnd" android:maxLines="1" android:minWidth="50dp" android:text="@{BindingAdaptersKt.distance(distance, context)}" @@ -153,7 +156,7 @@ android:gravity="end" android:maxLines="1" android:padding="2dp" - android:text="@{String.format("%s/%d", BindingAdaptersKt.availabilityText(BindingAdaptersKt.flatten(filteredAvailability.data.status.values())), filteredAvailability.data.totalChargepoints)}" + android:text="@{String.format(LocaleConfigXKt.getCurrentOrDefaultLocale(context), "%s/%d", BindingAdaptersKt.availabilityText(BindingAdaptersKt.flatten(filteredAvailability.data.status.values())), filteredAvailability.data.totalChargepoints)}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" android:textColor="@android:color/white" app:backgroundTintAvailability="@{BindingAdaptersKt.flatten(filteredAvailability.data.status.values())}" @@ -170,7 +173,8 @@ android:layout_marginEnd="8dp" android:ellipsize="end" android:maxLines="1" - android:text="@{charger.data.formatChargepoints(ChargepointApiKt.stringProvider(context))}" + android:textAlignment="viewStart" + android:text="@{charger.data.formatChargepoints(ChargepointApiKt.stringProvider(context), LocaleConfigXKt.getCurrentOrDefaultLocale(context))}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" app:layout_constraintEnd_toStartOf="@+id/txtDistance" app:layout_constraintStart_toStartOf="@+id/guideline" @@ -199,6 +203,7 @@ android:text="@string/connectors" android:textAppearance="@style/TextAppearance.Material3.TitleSmall" android:textColor="?colorPrimary" + android:textAlignment="viewStart" app:layout_constraintEnd_toStartOf="@+id/btnRefreshLiveData" app:layout_constraintStart_toStartOf="@+id/guideline" app:layout_constraintTop_toBottomOf="@+id/txtConnectors" /> @@ -315,7 +320,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" - android:gravity="right|end" + android:gravity="end" android:text="@{availability.status == Status.SUCCESS ? @string/realtime_data_source(availability.data.source) : availability.status == Status.LOADING ? @string/realtime_data_loading : availability.message == "not signed in" ? @string/realtime_data_login_needed : @string/realtime_data_unavailable}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" app:layout_constraintEnd_toStartOf="@+id/btnLogin" diff --git a/app/src/main/res/layout/dialog_connector_details_header.xml b/app/src/main/res/layout/dialog_connector_details_header.xml index e92db8e9..629c30ba 100644 --- a/app/src/main/res/layout/dialog_connector_details_header.xml +++ b/app/src/main/res/layout/dialog_connector_details_header.xml @@ -7,6 +7,8 @@ + + @@ -47,7 +49,7 @@ android:layout_height="wrap_content" android:layout_marginStart="38dp" android:layout_marginTop="38dp" - android:text="@{String.format("\u00D7 %d", item.chargepoint.count)}" + android:text="@{String.format(LocaleConfigXKt.getCurrentOrDefaultLocale(context), "\u00D7 %d", item.chargepoint.count)}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" app:goneUnless="@{item.status == null}" app:layout_constraintStart_toStartOf="@+id/imageView" @@ -63,7 +65,7 @@ android:layout_marginTop="30dp" android:background="@drawable/rounded_rect" android:padding="2dp" - android:text="@{String.format("%s/%d", BindingAdaptersKt.availabilityText(item.status), item.chargepoint.count)}" + android:text="@{String.format(LocaleConfigXKt.getCurrentOrDefaultLocale(context), "%s/%d", BindingAdaptersKt.availabilityText(item.status), item.chargepoint.count)}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" android:textColor="@android:color/white" app:backgroundTintAvailability="@{item.status}" @@ -79,7 +81,7 @@ android:layout_height="wrap_content" android:layout_marginStart="36dp" android:layout_marginTop="4dp" - android:text="@{item != null ? UtilsKt.nameForPlugType(ChargepointApiKt.stringProvider(context), item.chargepoint.type) + " · " + item.chargepoint.formatPower() : null}" + android:text="@{item != null ? UtilsKt.nameForPlugType(ChargepointApiKt.stringProvider(context), item.chargepoint.type) + " · " + item.chargepoint.formatPower(LocaleConfigXKt.getCurrentOrDefaultLocale(context)) : null}" android:textAppearance="@style/TextAppearance.Material3.BodyMedium" app:goneUnless="@{item.chargepoint.hasKnownPower()}" app:layout_constraintBottom_toTopOf="@id/textView8" diff --git a/app/src/main/res/layout/fragment_onboarding.xml b/app/src/main/res/layout/fragment_onboarding.xml index 83c20ddb..9c6c629f 100644 --- a/app/src/main/res/layout/fragment_onboarding.xml +++ b/app/src/main/res/layout/fragment_onboarding.xml @@ -21,6 +21,7 @@ android:layout_height="wrap_content" android:layout_margin="24dp" android:layout_gravity="center_horizontal" + app:piv_rtl_mode="auto" app:piv_animationType="worm" app:piv_dynamicCount="true" app:piv_interactiveAnimation="true" diff --git a/app/src/main/res/layout/fragment_onboarding_data_source.xml b/app/src/main/res/layout/fragment_onboarding_data_source.xml index bf4bf7d7..f871d5ce 100644 --- a/app/src/main/res/layout/fragment_onboarding_data_source.xml +++ b/app/src/main/res/layout/fragment_onboarding_data_source.xml @@ -96,6 +96,7 @@ android:layout_marginBottom="24dp" android:paddingStart="16dp" android:textAppearance="@style/TextAppearance.Material3.BodyMedium" + android:textAlignment="viewStart" app:layout_constraintBottom_toTopOf="@+id/btnGetStarted" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" diff --git a/app/src/main/res/layout/item_connector.xml b/app/src/main/res/layout/item_connector.xml index ea285710..bf6c9226 100644 --- a/app/src/main/res/layout/item_connector.xml +++ b/app/src/main/res/layout/item_connector.xml @@ -4,6 +4,8 @@ xmlns:tools="http://schemas.android.com/tools"> + + @@ -40,7 +42,7 @@ android:layout_height="wrap_content" android:layout_marginStart="38dp" android:layout_marginTop="38dp" - android:text="@{String.format("\u00D7 %d", item.chargepoint.count)}" + android:text="@{String.format(LocaleConfigXKt.getCurrentOrDefaultLocale(context), "\u00D7 %d", item.chargepoint.count)}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" app:layout_constraintStart_toStartOf="@+id/imageView" app:layout_constraintTop_toTopOf="@+id/imageView" @@ -54,7 +56,7 @@ android:layout_height="wrap_content" android:layout_marginStart="30dp" android:layout_marginTop="30dp" - android:text="@{String.format("%s/%d", BindingAdaptersKt.availabilityText(item.status), item.chargepoint.count)}" + android:text="@{String.format(LocaleConfigXKt.getCurrentOrDefaultLocale(context), "%s/%d", BindingAdaptersKt.availabilityText(item.status), item.chargepoint.count)}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" android:background="@drawable/rounded_rect" android:padding="2dp" @@ -72,7 +74,7 @@ android:layout_height="wrap_content" android:layout_marginTop="4dp" android:layout_marginBottom="8dp" - android:text="@{item.chargepoint.formatPower()}" + android:text="@{item.chargepoint.formatPower(LocaleConfigXKt.getCurrentOrDefaultLocale(context))}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" app:goneUnless="@{item.chargepoint.hasKnownPower()}" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/item_connector_button.xml b/app/src/main/res/layout/item_connector_button.xml index c244bc2b..bb2ee1e9 100644 --- a/app/src/main/res/layout/item_connector_button.xml +++ b/app/src/main/res/layout/item_connector_button.xml @@ -9,6 +9,8 @@ + + @@ -51,7 +53,7 @@ android:layout_marginStart="38dp" android:layout_marginTop="38dp" android:layout_marginEnd="4dp" - android:text="@{String.format("× %d", item.count)}" + android:text="@{String.format(LocaleConfigXKt.getCurrentOrDefaultLocale(context), "× %d", item.count)}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" android:textColor="@{BindingAdaptersKt.colorEnabled(context, enabled)}" app:layout_constraintEnd_toEndOf="parent" @@ -65,7 +67,7 @@ android:layout_height="wrap_content" android:layout_marginTop="4dp" android:layout_marginBottom="4dp" - android:text="@{item.formatPower()}" + android:text="@{item.formatPower(LocaleConfigXKt.getCurrentOrDefaultLocale(context))}" android:textAppearance="@style/TextAppearance.Material3.BodySmall" android:textColor="@{BindingAdaptersKt.colorEnabled(context, enabled)}" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/item_detail.xml b/app/src/main/res/layout/item_detail.xml index 3b06bac2..3289ad3a 100644 --- a/app/src/main/res/layout/item_detail.xml +++ b/app/src/main/res/layout/item_detail.xml @@ -26,6 +26,7 @@ android:layout_marginEnd="16dp" android:layout_marginBottom="14dp" android:text="@{item.text}" + android:textAlignment="viewStart" android:textAppearance="@style/TextAppearance.Material3.BodyMedium" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -55,6 +56,7 @@ android:layout_marginEnd="16dp" android:layout_marginBottom="14dp" android:text="@{item.detailText}" + android:textAlignment="viewStart" android:textAppearance="@style/TextAppearance.Material3.BodySmall" app:linkify="@{item.links ? Linkify.WEB_URLS | Linkify.PHONE_NUMBERS : 0}" app:goneUnless="@{item.detailText != null}" diff --git a/app/src/main/res/layout/item_favorite.xml b/app/src/main/res/layout/item_favorite.xml index 70c05f6e..7a17b44e 100644 --- a/app/src/main/res/layout/item_favorite.xml +++ b/app/src/main/res/layout/item_favorite.xml @@ -7,6 +7,8 @@ + + @@ -61,6 +63,7 @@ app:layout_constraintEnd_toStartOf="@+id/textView16" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + android:textAlignment="viewStart" tools:text="Nikola-Tesla-Parkhaus mit extra langem Namen, der auf mehrere Zeilen umbricht" /> diff --git a/app/src/main/res/layout/item_filter_multiple_choice_large.xml b/app/src/main/res/layout/item_filter_multiple_choice_large.xml index 5d7ed2bf..956195e2 100644 --- a/app/src/main/res/layout/item_filter_multiple_choice_large.xml +++ b/app/src/main/res/layout/item_filter_multiple_choice_large.xml @@ -33,6 +33,7 @@ android:layout_marginEnd="8dp" android:text="@{item.filter.name}" android:textAppearance="@style/TextAppearance.Material3.BodyLarge" + android:textAlignment="viewStart" app:layout_constraintEnd_toStartOf="@+id/btnEdit" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -61,6 +62,7 @@ android:layout_marginTop="4dp" android:layout_marginEnd="8dp" android:text="@{item.value.all ? @string/all_selected : @string/number_selected(item.value.values.size())}" + android:textAlignment="viewStart" app:layout_constraintEnd_toStartOf="@+id/btnEdit" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView17" diff --git a/app/src/main/res/layout/map_layers.xml b/app/src/main/res/layout/map_layers.xml index a261901b..54a66886 100644 --- a/app/src/main/res/layout/map_layers.xml +++ b/app/src/main/res/layout/map_layers.xml @@ -30,6 +30,7 @@ android:layout_marginEnd="16dp" android:text="@string/map_type" android:textAppearance="@style/TextAppearance.Material3.TitleSmall" + android:textAlignment="viewStart" app:layout_constraintEnd_toStartOf="@id/btnClose" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -52,7 +53,8 @@ android:layout_height="wrap_content" android:checked="@{vm.mapType.equals(AnyMap.Type.NORMAL)}" android:onClick="@{() -> vm.setMapType(AnyMap.Type.NORMAL)}" - android:text="@string/map_type_normal" /> + android:text="@string/map_type_normal" + android:textAlignment="viewStart" /> + android:text="@string/map_type_satellite" + android:textAlignment="viewStart" /> + android:text="@string/map_type_terrain" + android:textAlignment="viewStart" /> + + 44dp + \ No newline at end of file