From 8da29b7d544a5e69ede93e89f1e9b57804ec5ef4 Mon Sep 17 00:00:00 2001
From: Shane <6071159+smashedr@users.noreply.github.com>
Date: Fri, 9 Oct 2026 17:42:51 -0700
Subject: [PATCH 1/2] Update Icons
---
README.md | 3 +-
.../java/org/cssnr/parking/ui/ParKingApp.kt | 38 ++++++++-----------
.../org/cssnr/parking/ui/screens/MapScreen.kt | 4 +-
app/src/main/res/values/strings.xml | 2 +-
4 files changed, 21 insertions(+), 26 deletions(-)
diff --git a/README.md b/README.md
index 82bbebf..a11d805 100644
--- a/README.md
+++ b/README.md
@@ -252,10 +252,11 @@ You can also star this project on GitHub and support other related projects:
- [Django Files Android](https://github.com/django-files/android-client?tab=readme-ov-file#readme)
- [Zipline Android](https://github.com/cssnr/zipline-android?tab=readme-ov-file#readme)
-- [NOAA Weather Android](https://github.com/cssnr/noaa-weather-android?tab=readme-ov-file#readme)
- [Remote Wallpaper Android](https://github.com/cssnr/remote-wallpaper-android?tab=readme-ov-file#readme)
+- [NOAA Weather Android](https://github.com/cssnr/noaa-weather-android?tab=readme-ov-file#readme)
- [ParKing Android](https://github.com/cssnr/parking-android?tab=readme-ov-file#readme)
- [Todo List Android](https://github.com/cssnr/todolist-android?tab=readme-ov-file#readme)
+- [Device Info Android](https://github.com/cssnr/device-info-android?tab=readme-ov-file#readme)
- [Tibs3DPrints Android](https://github.com/cssnr/tibs3dprints-android?tab=readme-ov-file#readme)
For a full list of current projects visit: [https://cssnr.github.io/](https://cssnr.github.io/)
diff --git a/app/src/main/java/org/cssnr/parking/ui/ParKingApp.kt b/app/src/main/java/org/cssnr/parking/ui/ParKingApp.kt
index c3a612a..6d14f43 100644
--- a/app/src/main/java/org/cssnr/parking/ui/ParKingApp.kt
+++ b/app/src/main/java/org/cssnr/parking/ui/ParKingApp.kt
@@ -1,14 +1,18 @@
package org.cssnr.parking.ui
-import androidx.annotation.DrawableRes
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.History
+import androidx.compose.material.icons.filled.AddLocation
import androidx.compose.material.icons.filled.Map
+import androidx.compose.material.icons.filled.BrowseGallery
import androidx.compose.material.icons.filled.Settings
+import androidx.compose.material.icons.outlined.AddLocation
+import androidx.compose.material.icons.outlined.Map
+import androidx.compose.material.icons.outlined.BrowseGallery
+import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material3.Icon
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
@@ -19,7 +23,6 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.res.painterResource
import androidx.navigation.NavDestination.Companion.hasRoute
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.NavGraph.Companion.findStartDestination
@@ -28,7 +31,6 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import androidx.navigation.toRoute
-import org.cssnr.parking.R
import org.cssnr.parking.ui.navigation.Automatic
import org.cssnr.parking.ui.navigation.About
import org.cssnr.parking.ui.navigation.History
@@ -45,13 +47,13 @@ import org.cssnr.parking.ui.screens.SettingsRoute
enum class Destination(
val route: Any,
val label: String,
- val icon: ImageVector?,
- @DrawableRes val iconRes: Int? = null,
+ val selectedIcon: ImageVector,
+ val unselectedIcon: ImageVector,
) {
- LOCATION(Location, "Location", Icons.Filled.Map),
- HISTORY(History, "History", Icons.Filled.History),
- AUTOMATIC(Automatic, "Automatic", null, R.drawable.md_pin_road_24px),
- SETTINGS(Settings, "Settings", Icons.Filled.Settings),
+ LOCATION(Location, "Location", Icons.Filled.Map, Icons.Outlined.Map),
+ HISTORY(History, "History", Icons.Filled.BrowseGallery, Icons.Outlined.BrowseGallery),
+ AUTOMATIC(Automatic, "Automatic", Icons.Filled.AddLocation, Icons.Outlined.AddLocation),
+ SETTINGS(Settings, "Settings", Icons.Filled.Settings, Icons.Outlined.Settings),
}
@Composable
@@ -88,18 +90,10 @@ fun ParKingApp() {
}
},
icon = {
- val imageVector = destination.icon
- if (imageVector != null) {
- Icon(
- imageVector = imageVector,
- contentDescription = destination.label,
- )
- } else {
- Icon(
- painter = painterResource(destination.iconRes!!),
- contentDescription = destination.label,
- )
- }
+ Icon(
+ imageVector = if (selected) destination.selectedIcon else destination.unselectedIcon,
+ contentDescription = destination.label,
+ )
},
label = { Text(destination.label) },
)
diff --git a/app/src/main/java/org/cssnr/parking/ui/screens/MapScreen.kt b/app/src/main/java/org/cssnr/parking/ui/screens/MapScreen.kt
index d5532b1..6430da0 100644
--- a/app/src/main/java/org/cssnr/parking/ui/screens/MapScreen.kt
+++ b/app/src/main/java/org/cssnr/parking/ui/screens/MapScreen.kt
@@ -9,7 +9,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.AddCircle
-import androidx.compose.material.icons.filled.LocationSearching
+import androidx.compose.material.icons.filled.MyLocation
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FloatingActionButton
@@ -233,7 +233,7 @@ fun MapScreen(
},
) {
Icon(
- imageVector = Icons.Filled.LocationSearching,
+ imageVector = Icons.Filled.MyLocation,
contentDescription = "Jump to current location",
)
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ae40ac0..52ff420 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -18,7 +18,7 @@
View Developer\'s Website
Join Discord
Chat with us on Discord
- Support
+ Support Development
Donate on Ko-fi
Please Reconsider
Disable
From 784fb74743863e9d8127d979072c628dcef2a7e4 Mon Sep 17 00:00:00 2001
From: Shane <6071159+smashedr@users.noreply.github.com>
Date: Fri, 9 Oct 2026 17:46:33 -0700
Subject: [PATCH 2/2] Add Info Transition
---
.github/workflows/release.yaml | 7 +++--
.../java/org/cssnr/parking/ui/ParKingApp.kt | 29 +++++++++++++++++--
2 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index cea7ccb..9432333 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -174,12 +174,15 @@ jobs:
- name: "Create Version in Acrarium"
if: ${{ env.acra_id }}
continue-on-error: true
+ env:
+ summary_url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
+ acrarium_url: ${{ secrets.ACRARIUM_HOST }}/api/apps/${{ env.acra_id }}/version/upload/${{ github.run_number }}?name=${{ github.ref_name }}
run: |
- echo -n "See GitHub Actions" | curl -m 120 \
+ echo -n "See: ${{ env.summary_url }}" | curl -m 120 \
-H "Content-Type: text/plain" \
-u "${{ secrets.ACRARIUM_USER }}:${{ secrets.ACRARIUM_PASS }}" \
--data-binary @- \
- "${{ secrets.ACRARIUM_HOST }}/api/apps/${{ env.acra_id }}/version/upload/${{ github.run_number }}?name=${{ github.ref_name }}"
+ "${{ env.acrarium_url }}"
- name: "Upload APK to Artifacts"
uses: actions/upload-artifact@v7
diff --git a/app/src/main/java/org/cssnr/parking/ui/ParKingApp.kt b/app/src/main/java/org/cssnr/parking/ui/ParKingApp.kt
index 6d14f43..4d9732e 100644
--- a/app/src/main/java/org/cssnr/parking/ui/ParKingApp.kt
+++ b/app/src/main/java/org/cssnr/parking/ui/ParKingApp.kt
@@ -1,5 +1,12 @@
package org.cssnr.parking.ui
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.expandVertically
+import androidx.compose.animation.fadeIn
+import androidx.compose.animation.fadeOut
+import androidx.compose.animation.shrinkVertically
+import androidx.compose.animation.slideInVertically
+import androidx.compose.animation.slideOutVertically
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.consumeWindowInsets
import androidx.compose.foundation.layout.only
@@ -21,6 +28,7 @@ import androidx.compose.material3.ScaffoldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.navigation.NavDestination.Companion.hasRoute
@@ -70,15 +78,32 @@ fun ParKingApp() {
}
}
+ // About is a drill-in from Settings. Animate the bar instead of
+ // adding/removing it instantly, otherwise Scaffold's innerPadding
+ // snaps and the outgoing/incoming content jumps.
+ val isAbout = currentDestination?.hasRoute(About::class) == true
+ val showBottomBar = !isAbout
+
Scaffold(
contentWindowInsets = ScaffoldDefaults.contentWindowInsets
.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom),
bottomBar = {
- if (currentDestination?.hasRoute(About::class) != true) {
+ AnimatedVisibility(
+ visible = showBottomBar,
+ enter = slideInVertically(initialOffsetY = { it }) +
+ expandVertically(expandFrom = Alignment.Bottom) +
+ fadeIn(),
+ exit = slideOutVertically(targetOffsetY = { it }) +
+ shrinkVertically(shrinkTowards = Alignment.Bottom) +
+ fadeOut(),
+ ) {
NavigationBar {
Destination.entries.forEach { destination ->
+ // Keep Settings highlighted while About is on top so the
+ // selection does not flicker out during the slide-away.
val selected = currentDestination?.hierarchy
- ?.any { it.hasRoute(destination.route::class) } == true
+ ?.any { it.hasRoute(destination.route::class) } == true ||
+ (isAbout && destination == Destination.SETTINGS)
NavigationBarItem(
selected = selected,
onClick = {