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