From d5fdbe71e59854e8d598dbc788426754c1f9a1e2 Mon Sep 17 00:00:00 2001 From: Johan von Forstner Date: Mon, 23 Mar 2020 20:42:08 +0100 Subject: [PATCH] Add some stuff in detail view --- _img/connectors/connector_ccs.svg | 8 +- app/build.gradle | 7 +- .../java/com/johan/evmap/EvMapApplication.kt | 2 + .../main/java/com/johan/evmap/MapsActivity.kt | 75 +++++++++++++---- .../evmap/adapter/DataBindingAdapters.kt | 35 +++++++- .../johan/evmap/api/GoingElectricAdapters.kt | 29 +++++++ .../com/johan/evmap/api/GoingElectricApi.kt | 1 + .../com/johan/evmap/api/GoingElectricModel.kt | 82 ++++++++++++++++++- .../com/johan/evmap/ui/BindingAdapters.kt | 10 +++ app/src/main/res/drawable/connector_ccs.xml | 6 +- app/src/main/res/drawable/ic_address.xml | 9 ++ app/src/main/res/drawable/ic_hours.xml | 9 ++ app/src/main/res/drawable/ic_network.xml | 9 ++ app/src/main/res/drawable/ic_operator.xml | 9 ++ app/src/main/res/layout/activity_maps.xml | 61 +++++++++----- app/src/main/res/layout/detail_view.xml | 73 +++++++++++++---- app/src/main/res/layout/gallery_item.xml | 1 + app/src/main/res/layout/item_connector.xml | 7 +- app/src/main/res/layout/item_detail.xml | 47 +++++++++++ app/src/main/res/values-de/strings.xml | 15 ++++ app/src/main/res/values/colors.xml | 7 +- app/src/main/res/values/strings.xml | 10 +++ app/src/main/res/values/styles.xml | 8 +- 23 files changed, 452 insertions(+), 68 deletions(-) create mode 100644 app/src/main/res/drawable/ic_address.xml create mode 100644 app/src/main/res/drawable/ic_hours.xml create mode 100644 app/src/main/res/drawable/ic_network.xml create mode 100644 app/src/main/res/drawable/ic_operator.xml create mode 100644 app/src/main/res/layout/item_detail.xml create mode 100644 app/src/main/res/values-de/strings.xml diff --git a/_img/connectors/connector_ccs.svg b/_img/connectors/connector_ccs.svg index 02270cdd..1c774893 100644 --- a/_img/connectors/connector_ccs.svg +++ b/_img/connectors/connector_ccs.svg @@ -2,13 +2,13 @@ - ccs + connector_ccs - - - + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 52b93c1d..2ccb4341 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,6 +29,10 @@ android { sourceCompatibility = JavaVersion.VERSION_1_8 } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + dataBinding { enabled = true } @@ -46,13 +50,14 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation 'com.google.maps.android:android-maps-utils:0.5' - implementation 'com.github.johan12345:CustomBottomSheetBehavior:-SNAPSHOT' + implementation 'com.github.johan12345:CustomBottomSheetBehavior:0d0e30d8f1' implementation 'com.google.android.gms:play-services-maps:17.0.0' implementation 'com.google.android.gms:play-services-location:17.0.0' implementation 'com.squareup.retrofit2:retrofit:2.7.2' implementation 'com.squareup.retrofit2:converter-moshi:2.7.2' implementation 'com.squareup.moshi:moshi-kotlin:1.9.2' implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'com.jakewharton.threetenabp:threetenabp:1.2.2' // debug tools implementation 'com.facebook.stetho:stetho:1.5.1' diff --git a/app/src/main/java/com/johan/evmap/EvMapApplication.kt b/app/src/main/java/com/johan/evmap/EvMapApplication.kt index 24cde797..09712f47 100644 --- a/app/src/main/java/com/johan/evmap/EvMapApplication.kt +++ b/app/src/main/java/com/johan/evmap/EvMapApplication.kt @@ -2,10 +2,12 @@ package com.johan.evmap import android.app.Application import com.facebook.stetho.Stetho +import com.jakewharton.threetenabp.AndroidThreeTen class EvMapApplication : Application() { override fun onCreate() { super.onCreate() + AndroidThreeTen.init(this); Stetho.initializeWithDefaults(this); } } \ No newline at end of file diff --git a/app/src/main/java/com/johan/evmap/MapsActivity.kt b/app/src/main/java/com/johan/evmap/MapsActivity.kt index ea00f725..4bf1e755 100644 --- a/app/src/main/java/com/johan/evmap/MapsActivity.kt +++ b/app/src/main/java/com/johan/evmap/MapsActivity.kt @@ -1,7 +1,9 @@ package com.johan.evmap import android.Manifest +import android.content.Intent import android.content.pm.PackageManager +import android.net.Uri import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat @@ -20,8 +22,10 @@ import com.google.android.gms.maps.model.BitmapDescriptorFactory import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.Marker import com.google.android.gms.maps.model.MarkerOptions +import com.google.android.material.snackbar.Snackbar import com.google.maps.android.ui.IconGenerator import com.johan.evmap.adapter.ConnectorAdapter +import com.johan.evmap.adapter.DetailAdapter import com.johan.evmap.adapter.GalleryAdapter import com.johan.evmap.api.* import com.johan.evmap.databinding.ActivityMapsBinding @@ -51,21 +55,9 @@ class MapsActivity : AppCompatActivity(), OnMapReadyCallback { mapFragment.getMapAsync(this) api = GoingElectricApi.create(getString(R.string.goingelectric_key)) + setupAdapters() + val behavior = BottomSheetBehaviorGoogleMapsLike.from(binding.bottomSheet) - - binding.gallery.adapter = GalleryAdapter(this) - binding.gallery.layoutManager = - LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) - binding.gallery.addItemDecoration(DividerItemDecoration( - this, LinearLayoutManager.HORIZONTAL - ).apply { - setDrawable(getDrawable(R.drawable.gallery_divider)!!) - }) - - binding.detailView.connectors.adapter = ConnectorAdapter() - binding.detailView.connectors.layoutManager = - LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) - binding.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() { var previousCharger = binding.charger @@ -100,7 +92,62 @@ class MapsActivity : AppCompatActivity(), OnMapReadyCallback { enableLocation(true) } } + binding.fabDirections.setOnClickListener { + val charger = binding.charger + if (charger != null) { + val intent = Intent(Intent.ACTION_VIEW) + val coord = charger.coordinates + // google maps navigation + intent.data = Uri.parse("google.navigation:q=${coord.lat},${coord.lng}") + if (intent.resolveActivity(packageManager) != null) { + startActivity(intent); + } else { + // fallback: generic geo intent + intent.data = Uri.parse("geo:${coord.lat},${coord.lng}") + if (intent.resolveActivity(packageManager) != null) { + startActivity(intent); + } else { + Snackbar.make( + binding.root, + R.string.no_maps_app_found, + Snackbar.LENGTH_SHORT + ) + } + } + } + } + } + + private fun setupAdapters() { + binding.gallery.apply { + adapter = GalleryAdapter(this@MapsActivity) + layoutManager = + LinearLayoutManager(this@MapsActivity, LinearLayoutManager.HORIZONTAL, false) + addItemDecoration(DividerItemDecoration( + this@MapsActivity, LinearLayoutManager.HORIZONTAL + ).apply { + setDrawable(getDrawable(R.drawable.gallery_divider)!!) + }) + } + + binding.detailView.connectors.apply { + adapter = ConnectorAdapter() + layoutManager = + LinearLayoutManager(this@MapsActivity, LinearLayoutManager.HORIZONTAL, false) + } + + binding.detailView.details.apply { + adapter = DetailAdapter() + layoutManager = + LinearLayoutManager(this@MapsActivity, LinearLayoutManager.VERTICAL, false) + addItemDecoration( + DividerItemDecoration( + this@MapsActivity, + LinearLayoutManager.VERTICAL + ) + ) + } } diff --git a/app/src/main/java/com/johan/evmap/adapter/DataBindingAdapters.kt b/app/src/main/java/com/johan/evmap/adapter/DataBindingAdapters.kt index 03374d6f..4bf6287f 100644 --- a/app/src/main/java/com/johan/evmap/adapter/DataBindingAdapters.kt +++ b/app/src/main/java/com/johan/evmap/adapter/DataBindingAdapters.kt @@ -1,5 +1,6 @@ package com.johan.evmap.adapter +import android.content.Context import android.view.LayoutInflater import android.view.ViewGroup import androidx.databinding.DataBindingUtil @@ -9,6 +10,7 @@ import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.johan.evmap.BR import com.johan.evmap.R +import com.johan.evmap.api.ChargeLocation import com.johan.evmap.api.Chargepoint interface Equatable { @@ -46,4 +48,35 @@ abstract class DataBindingAdapter() : class ConnectorAdapter : DataBindingAdapter() { override fun getItemViewType(position: Int): Int = R.layout.item_connector -} \ No newline at end of file +} + +class DetailAdapter : DataBindingAdapter() { + data class Detail(val icon: Int, val contentDescription: Int, val text: CharSequence) : + Equatable + + override fun getItemViewType(position: Int): Int = R.layout.item_detail +} + +fun buildDetails(loc: ChargeLocation?, ctx: Context): List { + if (loc == null) return emptyList() + + return listOfNotNull( + DetailAdapter.Detail(R.drawable.ic_address, R.string.address, loc.address.toString()), + if (loc.operator != null) DetailAdapter.Detail( + R.drawable.ic_operator, + R.string.operator, + loc.operator + ) else null, + if (loc.network != null) DetailAdapter.Detail( + R.drawable.ic_network, + R.string.network, + loc.network + ) else null, + // TODO: separate layout for opening hours with expandable details + if (loc.openinghours != null) DetailAdapter.Detail( + R.drawable.ic_hours, + R.string.hours, + loc.openinghours.getStatusText(ctx) + ) else null + ) +} diff --git a/app/src/main/java/com/johan/evmap/api/GoingElectricAdapters.kt b/app/src/main/java/com/johan/evmap/api/GoingElectricAdapters.kt index 85fb48e4..efa99273 100644 --- a/app/src/main/java/com/johan/evmap/api/GoingElectricAdapters.kt +++ b/app/src/main/java/com/johan/evmap/api/GoingElectricAdapters.kt @@ -1,6 +1,7 @@ package com.johan.evmap.api import com.squareup.moshi.* +import org.threeten.bp.LocalTime import java.lang.reflect.Type @@ -101,3 +102,31 @@ private fun hasJsonObjectOrFalseAnnotation(annotations: Set?) = annotation class JsonObjectOrFalse { } + +internal class HoursAdapter { + private val regex = Regex("from (.*) till (.*)") + + @FromJson + fun fromJson(str: String): Hours? { + if (str == "closed") { + return Hours(null, null) + } else { + val match = regex.find(str) + ?: throw IllegalArgumentException("$str does not match hours format") + return Hours( + LocalTime.parse(match.groupValues[1]), + LocalTime.parse(match.groupValues[2]) + ) + } + } + + @ToJson + fun toJson(value: Hours): String { + if (value.start == null || value.end == null) { + return "closed" + } else { + return "from ${value.start} till ${value.end}" + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/johan/evmap/api/GoingElectricApi.kt b/app/src/main/java/com/johan/evmap/api/GoingElectricApi.kt index ec22c2f8..3c96da47 100644 --- a/app/src/main/java/com/johan/evmap/api/GoingElectricApi.kt +++ b/app/src/main/java/com/johan/evmap/api/GoingElectricApi.kt @@ -38,6 +38,7 @@ interface GoingElectricApi { val moshi = Moshi.Builder() .add(ChargepointListItemJsonAdapterFactory()) .add(JsonObjectOrFalseAdapter.Factory()) + .add(HoursAdapter()) .build() val retrofit = Retrofit.Builder() diff --git a/app/src/main/java/com/johan/evmap/api/GoingElectricModel.kt b/app/src/main/java/com/johan/evmap/api/GoingElectricModel.kt index 1b2ca076..3d7da7d7 100644 --- a/app/src/main/java/com/johan/evmap/api/GoingElectricModel.kt +++ b/app/src/main/java/com/johan/evmap/api/GoingElectricModel.kt @@ -1,8 +1,14 @@ package com.johan.evmap.api +import android.content.Context +import androidx.core.text.HtmlCompat +import com.johan.evmap.R import com.johan.evmap.adapter.Equatable import com.squareup.moshi.Json import com.squareup.moshi.JsonClass +import org.threeten.bp.DayOfWeek +import org.threeten.bp.LocalDate +import org.threeten.bp.LocalTime @JsonClass(generateAdapter = true) data class ChargepointList( @@ -26,8 +32,9 @@ data class ChargeLocation( // only shown in details: @JsonObjectOrFalse val operator: String?, @Json(name = "general_information") @JsonObjectOrFalse val generalInformation: String?, - val photos: List? + val photos: List?, //val chargecards: Boolean? + val openinghours: OpeningHours? ) : ChargepointListItem() { val maxPower: Double get() { @@ -41,6 +48,79 @@ data class ChargeLocation( } } +@JsonClass(generateAdapter = true) +data class OpeningHours( + @Json(name = "24/7") val twentyfourSeven: Boolean, + @JsonObjectOrFalse val description: String?, + val days: OpeningHoursDays? +) { + fun getStatusText(ctx: Context): CharSequence { + if (twentyfourSeven) { + return HtmlCompat.fromHtml(ctx.getString(R.string.open_247), 0) + } else if (days != null) { + val hours = days.getHoursForDate(LocalDate.now()) + if (hours.start == null || hours.end == null) { + return HtmlCompat.fromHtml(ctx.getString(R.string.closed), 0) + } + + val now = LocalTime.now() + if (hours.start.isBefore(now) && hours.end.isAfter(now)) { + return HtmlCompat.fromHtml( + ctx.getString( + R.string.open_closesat, + hours.end.toString() + ), 0 + ) + } else if (hours.end.isBefore(now)) { + return HtmlCompat.fromHtml(ctx.getString(R.string.closed), 0) + } else { + return HtmlCompat.fromHtml( + ctx.getString( + R.string.closed_opensat, + hours.start.toString() + ), 0 + ) + } + } else if (description != null) { + return description + } else { + return "" + } + } +} + +@JsonClass(generateAdapter = true) +data class OpeningHoursDays( + val monday: Hours, + val tuesday: Hours, + val wednesday: Hours, + val thursday: Hours, + val friday: Hours, + val saturday: Hours, + val sunday: Hours, + val holiday: Hours +) { + fun getHoursForDate(date: LocalDate): Hours { + // TODO: check for holidays + + @Suppress("WHEN_ENUM_CAN_BE_NULL_IN_JAVA") + return when (date.dayOfWeek) { + DayOfWeek.MONDAY -> monday + DayOfWeek.TUESDAY -> tuesday + DayOfWeek.WEDNESDAY -> wednesday + DayOfWeek.THURSDAY -> thursday + DayOfWeek.FRIDAY -> friday + DayOfWeek.SATURDAY -> saturday + DayOfWeek.SUNDAY -> sunday + } + } +} + +data class Hours( + val start: LocalTime?, + val end: LocalTime? +) + @JsonClass(generateAdapter = true) data class ChargerPhoto(val id: String) diff --git a/app/src/main/java/com/johan/evmap/ui/BindingAdapters.kt b/app/src/main/java/com/johan/evmap/ui/BindingAdapters.kt index 3d00af3b..b9a8562c 100644 --- a/app/src/main/java/com/johan/evmap/ui/BindingAdapters.kt +++ b/app/src/main/java/com/johan/evmap/ui/BindingAdapters.kt @@ -49,4 +49,14 @@ fun getConnectorItem(view: ImageView, type: String) { else -> 0 } ) +} + +@BindingAdapter("srcCompat") +fun setImageResource(imageView: ImageView, resource: Int) { + imageView.setImageResource(resource) +} + +@BindingAdapter("android:contentDescription") +fun setContentDescriptionResource(imageView: ImageView, resource: Int) { + imageView.contentDescription = imageView.context.getString(resource) } \ No newline at end of file diff --git a/app/src/main/res/drawable/connector_ccs.xml b/app/src/main/res/drawable/connector_ccs.xml index 8442a553..e94a3654 100644 --- a/app/src/main/res/drawable/connector_ccs.xml +++ b/app/src/main/res/drawable/connector_ccs.xml @@ -19,12 +19,12 @@ android:pathData="M14.4,5m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" /> + android:pathData="M9,18.73m-1.37,0a1.37,1.37 0,1 1,2.74 0a1.37,1.37 0,1 1,-2.74 0" /> + android:pathData="M15,18.73m-1.37,0a1.37,1.37 0,1 1,2.74 0a1.37,1.37 0,1 1,-2.74 0" /> diff --git a/app/src/main/res/drawable/ic_address.xml b/app/src/main/res/drawable/ic_address.xml new file mode 100644 index 00000000..8a408707 --- /dev/null +++ b/app/src/main/res/drawable/ic_address.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_hours.xml b/app/src/main/res/drawable/ic_hours.xml new file mode 100644 index 00000000..c0ecd8dc --- /dev/null +++ b/app/src/main/res/drawable/ic_hours.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_network.xml b/app/src/main/res/drawable/ic_network.xml new file mode 100644 index 00000000..a61b9a70 --- /dev/null +++ b/app/src/main/res/drawable/ic_network.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_operator.xml b/app/src/main/res/drawable/ic_operator.xml new file mode 100644 index 00000000..65a0e0c8 --- /dev/null +++ b/app/src/main/res/drawable/ic_operator.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_maps.xml b/app/src/main/res/layout/activity_maps.xml index b8e3a135..e9127eb9 100644 --- a/app/src/main/res/layout/activity_maps.xml +++ b/app/src/main/res/layout/activity_maps.xml @@ -1,11 +1,12 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + @@ -16,26 +17,42 @@ + android:fitsSystemWindows="false"> + + + app:layout_behavior="@string/BackDropBottomSheetBehavior" /> - + app:layout_behavior="@string/ScrollAwareFABBehavior" /> + + + \ 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 709bee7c..2c6804ae 100644 --- a/app/src/main/res/layout/detail_view.xml +++ b/app/src/main/res/layout/detail_view.xml @@ -7,6 +7,8 @@ + + @@ -23,9 +25,7 @@ android:layout_height="wrap_content" android:background="?android:colorBackground" android:minHeight="600dp" - android:paddingLeft="16dp" android:paddingTop="8dp" - android:paddingRight="16dp" android:paddingBottom="8dp"> @@ -49,8 +49,8 @@ android:maxLines="1" android:text="@{charger.address.toString()}" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@+id/guideline2" + app:layout_constraintStart_toStartOf="@+id/guideline" app:layout_constraintTop_toBottomOf="@+id/textView" tools:text="Beispielstraße 10, 12345 Berlin" /> @@ -62,8 +62,8 @@ android:maxLines="1" android:text="@{charger.formatChargepoints()}" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toStartOf="@+id/guideline2" + app:layout_constraintStart_toStartOf="@+id/guideline" app:layout_constraintTop_toBottomOf="@+id/textView2" tools:text="2x Typ 2 22 kW" /> @@ -71,28 +71,67 @@ android:id="@+id/textView4" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginTop="16dp" android:text="@{charger.generalInformation}" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.937" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/connectors" + app:layout_constraintEnd_toStartOf="@+id/guideline2" + app:layout_constraintHorizontal_bias="0.0" + app:layout_constraintStart_toStartOf="@+id/guideline" + tools:layout_editor_absoluteY="386dp" tools:text="Nur für Gäste." /> + + + + + + + + + diff --git a/app/src/main/res/layout/gallery_item.xml b/app/src/main/res/layout/gallery_item.xml index a3963100..0438595e 100644 --- a/app/src/main/res/layout/gallery_item.xml +++ b/app/src/main/res/layout/gallery_item.xml @@ -5,4 +5,5 @@ android:layout_height="match_parent" android:adjustViewBounds="true" android:scaleType="fitCenter" + android:fitsSystemWindows="true" tools:srcCompat="@tools:sample/backgrounds/scenic" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_connector.xml b/app/src/main/res/layout/item_connector.xml index 823598ed..047afbae 100644 --- a/app/src/main/res/layout/item_connector.xml +++ b/app/src/main/res/layout/item_connector.xml @@ -20,11 +20,12 @@ android:id="@+id/imageView" android:layout_width="48dp" android:layout_height="48dp" - android:layout_marginStart="16dp" - android:layout_marginTop="16dp" - android:layout_marginEnd="16dp" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" android:tint="?colorControlNormal" android:tintMode="src_in" + android:contentDescription="@{item.type}" app:connectorIcon="@{item.type}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/item_detail.xml b/app/src/main/res/layout/item_detail.xml new file mode 100644 index 00000000..f75b114e --- /dev/null +++ b/app/src/main/res/layout/item_detail.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..d4a69715 --- /dev/null +++ b/app/src/main/res/values-de/strings.xml @@ -0,0 +1,15 @@ + + + EV Map + Map + Anschlüsse + Keine Navigations-App gefunden + Adresse + Betreiber + Verbund + Öffnungszeiten + 24 Stunden geöffnet]]> + Geschlossen]]> + Geöffnet · Schließt um %s]]> + Geschlossen · Öffnet um %s]]> + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index c46250cc..f665b600 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,8 +1,9 @@ - #6200EE - #3700B3 - #03DAC5 + #4caf50 + #087f23 + #00e676 + #00b248 #ffeb3b #ff9800 #03a9f4 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f0ff00c7..a515e617 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,4 +1,14 @@ EV Map Map + Connectors + No navigation app found + Address + Operator + Network + Opening hours + Open 24/7]]> + Closed]]> + Open · Closes at %s]]> + Closed · Opens at %s]]> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e58cbf33..208770f8 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,8 +4,12 @@