Author: Adam Evyčędo <git@apiote.xyz>
add journeys horizontal layout and fix styling
%!v(PANIC=String method: strings: negative Repeat count)
diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyFragment.kt b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyFragment.kt index 2f9db1a9daa4e9aa6d4126759e6a47710a0d0450..53ab5eed8b4d2abec73b4220feb4917e88806f75 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyFragment.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/dashboard/ui/journey/JourneyFragment.kt @@ -101,7 +101,6 @@ dashboard.viewModel.suggestions[DashboardViewModel.ORIGIN_KEY] = binding.originSuggestions dashboard.viewModel.suggestions[DashboardViewModel.DEST_KEY] = binding.destinationSuggestions - // TODO test upside down ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) @@ -368,6 +367,7 @@ ) { val suggestions = dashboard.viewModel.suggestions[source]!! if (s.isNullOrBlank()) { dashboard.viewModel.spans[source] = "" + initSuggestions(source) binding.goButton.isEnabled = false return } diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/journeys/Journeys.kt b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/Journeys.kt index 4044d0012f2868e09b4e2eca7e321d251da1a930..d7e64de917032eb11d4c946d965e372a76665f3a 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/journeys/Journeys.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/Journeys.kt @@ -15,12 +15,9 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ViewHolder import com.google.android.material.card.MaterialCardView -import kotlinx.serialization.descriptors.PrimitiveKind import xyz.apiote.bimba.czwek.R import xyz.apiote.bimba.czwek.repo.Journey -import xyz.apiote.bimba.czwek.units.Metre import xyz.apiote.bimba.czwek.units.UnitSystem -import java.util.zip.Inflater class JourneysViewHolder(itemView: View) : ViewHolder(itemView) { val root: MaterialCardView = itemView.findViewById(R.id.journey) @@ -89,6 +86,7 @@ distance.text = if (it.start.vehicle.Line.name.isBlank() && it.distance != null) { val us = UnitSystem.getSelected(context) us.toString(context, it.distance) } else { + // TODO » terminus context.resources.getQuantityString( R.plurals.number_stops, it.intermediateStops.size + 1, diff --git a/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysActivity.kt b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysActivity.kt index db4beeaad871f5e4bb57fdd0bb349199f2cc36cf..27cd5f4eb45f1a1ed247833cd99ea4445c40cbf0 100644 --- a/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysActivity.kt +++ b/app/src/main/java/xyz/apiote/bimba/czwek/journeys/JourneysActivity.kt @@ -6,6 +6,7 @@ package xyz.apiote.bimba.czwek.journeys import android.content.Context import android.content.Intent +import android.content.res.Configuration import android.content.res.Configuration.UI_MODE_NIGHT_MASK import android.content.res.Configuration.UI_MODE_NIGHT_UNDEFINED import android.content.res.Configuration.UI_MODE_NIGHT_YES @@ -13,14 +14,18 @@ import android.graphics.DashPathEffect import android.os.Build import android.os.Bundle import android.view.View +import android.view.ViewGroup import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager +import com.google.android.material.sidesheet.SideSheetBehavior import org.osmdroid.tileprovider.tilesource.TileSourceFactory import org.osmdroid.util.BoundingBox import org.osmdroid.util.GeoPoint @@ -38,6 +43,8 @@ import xyz.apiote.bimba.czwek.repo.Place import xyz.apiote.bimba.czwek.repo.Position import kotlin.math.max import kotlin.math.min + +// FIXME rotating breaks class JourneysActivity : AppCompatActivity() { private lateinit var binding: ActivityJourneysBinding @@ -82,11 +89,15 @@ binding = ActivityJourneysBinding.inflate(layoutInflater) setContentView(binding.root) val journeysViewModel = ViewModelProvider(this)[JourneysViewModel::class.java] - // TODO check upside-down - // TODO for horizontal make side sheet ViewCompat.setOnApplyWindowInsetsListener(binding.journeys) { v, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) v.updatePadding(bottom = insets.bottom + dpToPixelI(16f)) + v.updateLayoutParams<ViewGroup.MarginLayoutParams> { + if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { + topMargin = insets.top + dpToPixelI(16f) + } + } + // TODO left/right notch WindowInsetsCompat.CONSUMED } @@ -170,6 +181,11 @@ } } } journeysViewModel.getJourneys(this, origin, destination, params) + + val ssb = binding.journeysSideSheet?.let { + SideSheetBehavior.from<ConstraintLayout>(it) + } + ssb?.expand() } override fun onStart() { @@ -183,7 +199,7 @@ val destination = getDestination() val bb = box ?: BoundingBox( max(origin.latitude, destination.latitude), max(origin.longitude, destination.longitude), - min(origin.latitude, destination.latitude), // TODO offset bottom sheet + min(origin.latitude, destination.latitude), min(origin.longitude, destination.longitude), ) binding.map.zoomToBoundingBox(bb, false, margin) diff --git a/app/src/main/res/layout/chip_suggestion.xml b/app/src/main/res/layout/chip_suggestion.xml index 211f8a5261418b9a19dc6140094e16a5b16ca1db..49e80e69de34bb4afbb18e68fdcaad7ac00904d5 100644 --- a/app/src/main/res/layout/chip_suggestion.xml +++ b/app/src/main/res/layout/chip_suggestion.xml @@ -5,7 +5,8 @@ SPDX-License-Identifier: GPL-3.0-or-later --> <com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android" - style="@style/Widget.Material3.Chip.Suggestion" + style="@style/Theme.Bimba.Chip.Suggestion" + android:textAppearance="@style/Theme.Bimba.Chip.Text" android:layout_width="wrap_content" android:layout_height="wrap_content"> diff --git a/app/src/main/res/layout/fragment_journey.xml b/app/src/main/res/layout/fragment_journey.xml index 8c00176c1876bddbcc75762fea831c91efc934fc..946d88abf3855b76dc3519c27509f646a2ba1031 100644 --- a/app/src/main/res/layout/fragment_journey.xml +++ b/app/src/main/res/layout/fragment_journey.xml @@ -119,7 +119,8 @@ app:layout_constraintTop_toBottomOf="@+id/materialDivider"> <com.google.android.material.chip.Chip android:id="@+id/chip_time_reference" - style="@style/Widget.Material3.Chip.Filter" + style="@style/Theme.Bimba.Chip.Filter" + android:textAppearance="@style/Theme.Bimba.Chip.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checkable="false" @@ -131,7 +132,8 @@ tool:ignore="MissingConstraints" /> <com.google.android.material.chip.Chip android:id="@+id/chip_date" - style="@style/Widget.Material3.Chip.Filter" + style="@style/Theme.Bimba.Chip.Filter" + android:textAppearance="@style/Theme.Bimba.Chip.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checkable="false" @@ -143,7 +145,8 @@ tool:ignore="MissingConstraints" /> <com.google.android.material.chip.Chip android:id="@+id/chip_time" - style="@style/Widget.Material3.Chip.Filter" + style="@style/Theme.Bimba.Chip.Filter" + android:textAppearance="@style/Theme.Bimba.Chip.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checkable="false" @@ -168,7 +171,8 @@ app:layout_constraintTop_toBottomOf="@id/chips_params_time"> <com.google.android.material.chip.Chip android:id="@+id/chip_wheelchair" - style="@style/Widget.Material3.Chip.Filter" + style="@style/Theme.Bimba.Chip.Filter" + android:textAppearance="@style/Theme.Bimba.Chip.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/wheelchair_accessible" @@ -178,7 +182,8 @@ tool:ignore="MissingConstraints" /> <com.google.android.material.chip.Chip android:id="@+id/chip_bike" - style="@style/Widget.Material3.Chip.Filter" + style="@style/Theme.Bimba.Chip.Filter" + android:textAppearance="@style/Theme.Bimba.Chip.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/bike_transport" @@ -188,7 +193,8 @@ tool:ignore="MissingConstraints" /> <!--<com.google.android.material.chip.Chip android:id="@+id/chip_options" - style="@style/Widget.Material3.Chip.Filter" + style="@style/Theme.Bimba.Chip.Filter" + android:textAppearance="@style/Theme.Bimba.Chip.Filter.Text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/other_options" diff --git a/app/src/main/res/layout/journey_leg.xml b/app/src/main/res/layout/journey_leg.xml index dcf3850b25ca8890463b1d5f4b7366b0a780bb66..72d8f2d222507dbde33fb613c7c7f37e9e888818 100644 --- a/app/src/main/res/layout/journey_leg.xml +++ b/app/src/main/res/layout/journey_leg.xml @@ -8,7 +8,10 @@android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" - android:padding="8dp" + android:paddingStart="8dp" + android:paddingEnd="8dp" + android:paddingTop="16dp" + android:paddingBottom="16dp" xmlns:tool="http://schemas.android.com/tools"> <ImageView android:id="@+id/leg_origin_image" diff --git a/app/src/main/res/layout-land/activity_journeys.xml b/app/src/main/res/layout-land/activity_journeys.xml new file mode 100644 index 0000000000000000000000000000000000000000..fae2b3a37167b5d4e3ab54a5d2deb158436d577a --- /dev/null +++ b/app/src/main/res/layout-land/activity_journeys.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8"?><!-- +SPDX-FileCopyrightText: Adam Evyčędo + +SPDX-License-Identifier: GPL-3.0-or-later +--> +<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".journeys.JourneysActivity"> + + <org.osmdroid.views.MapView + android:id="@+id/map" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + <androidx.constraintlayout.widget.ConstraintLayout + app:behavior_draggable="false" + android:background="?attr/colorSurface" + android:id="@+id/journeys_side_sheet" + android:layout_width="384dp" + android:layout_height="match_parent" + android:layout_gravity="start" + app:layout_behavior="com.google.android.material.sidesheet.SideSheetBehavior"> + + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/journeys" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clipToPadding="false" + android:visibility="gone" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + app:layout_constraintTop_toTopOf="parent" /> + + <com.google.android.material.progressindicator.CircularProgressIndicator + android:id="@+id/journeys_progress" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="48dp" + android:indeterminate="true" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + <ImageView + android:id="@+id/empty_image" + android:layout_width="92dp" + android:layout_height="92dp" + android:layout_marginTop="36dp" + android:src="@drawable/error_journeys" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + tools:ignore="ContentDescription" /> + + <com.google.android.material.textview.MaterialTextView + android:id="@+id/empty_text" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" + android:layout_marginTop="8dp" + android:visibility="gone" + android:layout_marginEnd="16dp" + android:text="@string/no_journeys_found" + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/empty_image" /> + + </androidx.constraintlayout.widget.ConstraintLayout> + +</androidx.coordinatorlayout.widget.CoordinatorLayout> diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 7bc3779f9823af620c497c26f8a3c661eb9a8d37..7ffd5f9ab587399fca106eb6ebf7de64138617bf 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -7,6 +7,7 @@ <resources xmlns:tool="http://schemas.android.com/tools"> <style name="Theme.Bimba" parent="Theme.Material3.Light.NoActionBar"> + <item name="fontFamily">@font/yellowcircle8</item> <item name="android:fontFamily">@font/yellowcircle8</item> <item name="colorPrimary">@color/md_theme_light_primary</item> <item name="colorOnPrimary">@color/md_theme_light_onPrimary</item> @@ -42,6 +43,25 @@ - true
<item name="randomColourLightness">.2</item> </style> + <style name="Theme.Bimba.Chip.Suggestion" parent="Widget.Material3.Chip.Suggestion"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + + <style name="Theme.Bimba.Chip.Input" parent="Widget.Material3.Chip.Input"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + + <style name="Theme.Bimba.Chip.Filter" parent="Widget.Material3.Chip.Filter"> + <item name="checkedIconVisible">false</item> + </style> + + <style name="Theme.Bimba.Chip.Text" parent="TextAppearance.MaterialComponents.Chip"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + <declare-styleable name="Theme.Bimba"> <attr name="randomColourLightness" format="float" /> <attr name="lightStatusBar" format="boolean" /> @@ -63,7 +83,7 @@- ?attr/colorSurface
<item name="postSplashScreenTheme">@style/Theme.Bimba</item> </style> - <style name="Theme.Bimba.Style" /> + <style name="Theme.Bimba.Style" parent="Theme.Bimba" /> <style name="Theme.Bimba.Style.NoActionBar"> <item name="windowActionBar">false</item> diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 18cc0e701931c44646e7e0c5b028a021e85a355c..4d12b800cc840988cb6d1683e0b69d2e1534a7dd 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -7,6 +7,7 @@ <resources xmlns:tool="http://schemas.android.com/tools"> <style name="Theme.Bimba" parent="Theme.Material3.Dark.NoActionBar"> + <item name="fontFamily">@font/yellowcircle8</item> <item name="android:fontFamily">@font/yellowcircle8</item> <item name="colorPrimary">@color/md_theme_dark_primary</item> <item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item> @@ -40,6 +41,22 @@- @android:color/transparent
<item name="android:enforceStatusBarContrast" tool:targetApi="q">false</item> <item name="lightStatusBar">false</item> <item name="randomColourLightness">.75</item> + </style> + + <style name="Theme.Bimba.Chip.Suggestion" parent="Widget.Material3.Chip.Suggestion"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + + <style name="Theme.Bimba.Chip.Input" parent="Widget.Material3.Chip.Input"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + + <style name="Theme.Bimba.Chip.Filter" parent="Widget.Material3.Chip.Filter"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="checkedIconVisible">false</item> + <item name="android:fontFamily">@font/yellowcircle8</item> </style> <style name="Theme.Bimba.SearchResult.Title" parent="Theme.Bimba"> diff --git a/app/src/main/res/values-night-v31/themes.xml b/app/src/main/res/values-night-v31/themes.xml index 4f3e6bf3e18b37d13d04dc967a0b03b75b701d1d..f98fabd05d7083193e3f102690bb6c6470b7f7d1 100644 --- a/app/src/main/res/values-night-v31/themes.xml +++ b/app/src/main/res/values-night-v31/themes.xml @@ -9,6 +9,7 @@ <resources xmlns:tool="http://schemas.android.com/tools"> <style name="Theme.Bimba" parent="Theme.Material3.Dark.NoActionBar"> + <item name="fontFamily">@font/yellowcircle8</item> <item name="android:fontFamily">@font/yellowcircle8</item> <item name="colorPrimary">@android:color/system_accent1_300</item> <item name="colorOnPrimary">@android:color/system_accent1_800</item> @@ -45,6 +46,22 @@- @android:color/transparent
<item name="android:enforceStatusBarContrast">false</item> <item name="lightStatusBar">false</item> <item name="randomColourLightness">.75</item> + </style> + + <style name="Theme.Bimba.Chip.Suggestion" parent="Widget.Material3.Chip.Suggestion"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + + <style name="Theme.Bimba.Chip.Input" parent="Widget.Material3.Chip.Input"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + + <style name="Theme.Bimba.Chip.Filter" parent="Widget.Material3.Chip.Filter"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="checkedIconVisible">false</item> + <item name="android:fontFamily">@font/yellowcircle8</item> </style> <style name="Theme.Bimba.SearchResult.Title" parent="Theme.Bimba"> diff --git a/app/src/main/res/values-v31/themes.xml b/app/src/main/res/values-v31/themes.xml index f07ff67b177ed5e11ed481990ae1e34133dc4e3c..6a2be0c58c62bd939cea48d74bf6ced21e901bf0 100644 --- a/app/src/main/res/values-v31/themes.xml +++ b/app/src/main/res/values-v31/themes.xml @@ -9,6 +9,7 @@ <resources xmlns:tool="http://schemas.android.com/tools"> <style name="Theme.Bimba" parent="Theme.Material3.Light.NoActionBar"> + <item name="fontFamily">@font/yellowcircle8</item> <item name="android:fontFamily">@font/yellowcircle8</item> <item name="colorPrimary">@android:color/system_accent1_600</item> <item name="colorOnPrimary">@android:color/system_accent1_0</item> @@ -45,6 +46,22 @@- @android:color/transparent
<item name="android:enforceStatusBarContrast">false</item> <item name="lightStatusBar">true</item> <item name="randomColourLightness">.2</item> + </style> + + <style name="Theme.Bimba.Chip.Suggestion" parent="Widget.Material3.Chip.Suggestion"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + + <style name="Theme.Bimba.Chip.Input" parent="Widget.Material3.Chip.Input"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="android:fontFamily">@font/yellowcircle8</item> + </style> + + <style name="Theme.Bimba.Chip.Filter" parent="Widget.Material3.Chip.Filter"> + <item name="fontFamily">@font/yellowcircle8</item> + <item name="checkedIconVisible">false</item> + <item name="android:fontFamily">@font/yellowcircle8</item> </style> <style name="Theme.Bimba.SearchResult.Title" parent="Theme.Bimba"> diff --git a/app/src/main/res/xml/journey_chip.xml b/app/src/main/res/xml/journey_chip.xml index 0efc50369675e1c049426633e68f729fc77527cf..641522a599890a0f74552d203416869a0fb506f0 100644 --- a/app/src/main/res/xml/journey_chip.xml +++ b/app/src/main/res/xml/journey_chip.xml @@ -5,4 +5,6 @@ SPDX-License-Identifier: GPL-3.0-or-later --> <chip xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/Theme.Bimba.Chip.Input" + android:textAppearance="@style/Theme.Bimba.Chip.Text" android:text="-180.00, -90.00" /> \ No newline at end of file