Skip to content

Commit dfee4db

Browse files
authored
Merge pull request #255 from Ixam97/active_development
Release 0.28.0
2 parents 4896203 + c8773a2 commit dfee4db

File tree

84 files changed

+5458
-592
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+5458
-592
lines changed

automotive/build.gradle

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ if (firebase) {
1616
}
1717

1818
android {
19-
compileSdk 34
19+
compileSdk 35
2020

2121
defaultConfig {
2222
minSdkVersion 29
23-
targetSdkVersion 34
24-
versionCode 266
25-
versionName "0.27.3.0001"
23+
targetSdkVersion 35
24+
versionCode 284
25+
versionName "0.28.0.0017"
2626

2727
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2828
}
@@ -130,8 +130,12 @@ dependencies {
130130
implementation libs.kotlinx.coroutines.play.services
131131
implementation libs.jakarta.mail
132132
implementation libs.aboutlibraries.core
133+
implementation libs.aboutlibraries.compose
133134
implementation libs.airbnb.paris
134135
implementation libs.github.egm96
136+
implementation libs.github.scrollbar
137+
implementation libs.retrofit
138+
implementation libs.retrofit.converter.gson
135139

136140
implementation libs.androidx.car.app
137141
implementation libs.androidx.car.app.automotive
@@ -141,8 +145,10 @@ dependencies {
141145
}
142146

143147
implementation libs.androidx.activity.compose
148+
implementation(platform(libs.androidx.compose.bom))
144149
implementation libs.androidx.compose.ui
145150
implementation libs.androidx.compose.material
151+
implementation libs.androidx.compose.material.icons.extended
146152
implementation libs.androidx.lifecycle.viewmodel.compose
147153
implementation libs.androidx.navigation.compose
148154
implementation libs.kotlinx.serialization.json
@@ -156,6 +162,8 @@ dependencies {
156162

157163
debugImplementation libs.squareup.leakcanary
158164

165+
implementation 'com.github.jetradarmobile:android-snowfall:1.2.1'
166+
159167
// to fix unresolved references to android.car
160168
// def sdkDir = project.android.sdkDirectory.canonicalPath
161169
// def androidCarJar = "$sdkDir/platforms/android-33/optional/android.car.jar"
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.ixam97.carStatsViewer.carApp
2+
3+
import androidx.car.app.CarContext
4+
import androidx.car.app.Screen
5+
import androidx.car.app.model.Action
6+
import androidx.car.app.model.Header
7+
import androidx.car.app.model.Pane
8+
import androidx.car.app.model.PaneTemplate
9+
import androidx.car.app.model.Row
10+
import androidx.car.app.model.Template
11+
import androidx.lifecycle.DefaultLifecycleObserver
12+
import com.ixam97.carStatsViewer.database.tripData.ChargingSession
13+
import com.ixam97.carStatsViewer.utils.StringFormatters
14+
import java.util.Date
15+
16+
class ChargingSessionDetailsScreen(
17+
carContext: CarContext,
18+
private val chargingSession: ChargingSession,
19+
private val chargingLocation: String?
20+
): Screen(carContext), DefaultLifecycleObserver {
21+
22+
init {
23+
lifecycle.addObserver(this)
24+
}
25+
26+
override fun onGetTemplate(): Template {
27+
return chargingSessionDetailsTemplate()
28+
}
29+
30+
private fun chargingSessionDetailsTemplate() = PaneTemplate.Builder(
31+
Pane.Builder().apply {
32+
addRow(Row.Builder().apply {
33+
setTitle(StringFormatters.getDateString(Date(chargingSession.start_epoch_time)))
34+
}.build())
35+
}.build()
36+
).apply {
37+
setHeader(Header.Builder().apply {
38+
setTitle("Charging Session")
39+
setStartHeaderAction(Action.BACK)
40+
}.build())
41+
}.build()
42+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.ixam97.carStatsViewer.carApp
2+
3+
import androidx.car.app.CarContext
4+
import androidx.car.app.Screen
5+
import androidx.car.app.model.Action
6+
import androidx.car.app.model.Header
7+
import androidx.car.app.model.ItemList
8+
import androidx.car.app.model.ListTemplate
9+
import androidx.car.app.model.MessageTemplate
10+
import androidx.car.app.model.Row
11+
import androidx.car.app.model.Template
12+
import androidx.lifecycle.DefaultLifecycleObserver
13+
import com.ixam97.carStatsViewer.R
14+
import com.ixam97.carStatsViewer.database.tripData.ChargingSession
15+
import com.ixam97.carStatsViewer.utils.StringFormatters
16+
import java.util.Date
17+
import kotlin.math.roundToInt
18+
19+
class ChargingSessionListScreen(
20+
carContext: CarContext,
21+
private val chargingSessions: List<ChargingSession>,
22+
private val chargingLocations: List<String?>
23+
): Screen(carContext), DefaultLifecycleObserver {
24+
25+
init {
26+
lifecycle.addObserver(this)
27+
}
28+
29+
override fun onGetTemplate(): Template {
30+
if (chargingSessions.isEmpty()) {
31+
return MessageTemplate.Builder("No recorded charging sessions").apply {
32+
setHeader(screenHeader())
33+
}.build()
34+
}
35+
return chargingSessionListTemplate()
36+
}
37+
38+
private fun chargingSessionListTemplate() = ListTemplate.Builder().apply {
39+
setHeader(screenHeader())
40+
setSingleList(ItemList.Builder().apply {
41+
chargingSessions.forEachIndexed { index, it ->
42+
addItem(Row.Builder().apply {
43+
setTitle(StringFormatters.getDateString(Date(it.start_epoch_time)))
44+
setOnClickListener {
45+
// screenManager.push(ChargingSessionDetailsScreen(carContext, it, chargingLocations[index]))
46+
}
47+
addText("" +
48+
"${StringFormatters.getElapsedTimeString(it.chargeTime, true)}, " +
49+
"${((it.chargingPoints?.first()?.state_of_charge?:0f) * 100).roundToInt()}% → ${((it.chargingPoints?.last()?.state_of_charge?:0f) * 100).roundToInt()}%, " +
50+
(chargingLocations[index]?:"no location available")
51+
)
52+
setBrowsable(false)
53+
}.build())
54+
}
55+
}.build())
56+
}.build()
57+
58+
private fun screenHeader() = Header.Builder().apply {
59+
setTitle(carContext.getString(R.string.summary_charging_sessions))
60+
setStartHeaderAction(Action.BACK)
61+
}.build()
62+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.ixam97.carStatsViewer.carApp
2+
3+
import androidx.car.app.CarContext
4+
import androidx.car.app.Screen
5+
import androidx.car.app.model.Action
6+
import androidx.car.app.model.Header
7+
import androidx.car.app.model.MessageTemplate
8+
import androidx.car.app.model.Pane
9+
import androidx.car.app.model.PaneTemplate
10+
import androidx.car.app.model.Template
11+
import androidx.lifecycle.DefaultLifecycleObserver
12+
import com.ixam97.carStatsViewer.R
13+
import com.ixam97.carStatsViewer.carApp.utils.carIconFromRes
14+
15+
class ConfirmDeleteTripScreen(carContext: CarContext):
16+
Screen(carContext), DefaultLifecycleObserver
17+
{
18+
init {
19+
lifecycle.addObserver(this)
20+
}
21+
22+
override fun onGetTemplate(): Template {
23+
return confirmDeleteTripTemplate()
24+
}
25+
26+
private fun confirmDeleteTripTemplate() = MessageTemplate.Builder(
27+
carContext.getString(R.string.history_dialog_delete_message)
28+
).apply {
29+
setHeader(Header.Builder().apply {
30+
setTitle(carContext.getString(R.string.history_dialog_delete_title))
31+
}.build())
32+
setIcon(carContext.carIconFromRes(R.drawable.ic_delete))
33+
addAction(Action.Builder().apply {
34+
setTitle(carContext.getString(R.string.history_dialog_delete_confirm))
35+
setFlags(Action.FLAG_PRIMARY)
36+
setOnClickListener {
37+
setResult(true)
38+
screenManager.pop()
39+
}
40+
}.build())
41+
addAction(Action.Builder().apply {
42+
setTitle(carContext.getString(R.string.dialog_reset_cancel))
43+
setOnClickListener {
44+
setResult(false)
45+
screenManager.pop()
46+
}
47+
}.build())
48+
}.build()
49+
}

automotive/src/carapp/java/com/ixam97/carStatsViewer/carApp/TabsScreen.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,13 @@ class TabsScreen(
105105
val realTimeDataOnDashboard = selectedTabContentID == CID_DASHBOARD && appPreferences.carAppRealTimeData && !(carContext.carAppApiLevel >= 7 && BuildConfig.FLAVOR_version == "dev")
106106
if (realTimeDataOnDashboard || realTimeDataOnTripData) {
107107
invalidateTabView()
108-
InAppLogger.v("[$TAG] Real time data flow requested invalidate.")
108+
// InAppLogger.v("[$TAG] Real time data flow requested invalidate.")
109109
}
110110
}
111111
}
112112
lifecycleScope.launch {
113+
delay(1_000)
114+
delay(1_000)
113115
CarStatsViewer.dataProcessor.selectedSessionDataFlow.collect {
114116
session.carDataSurfaceCallback.updateSession()
115117
drivingSession = it
@@ -174,7 +176,7 @@ class TabsScreen(
174176
setHeaderAction(Action.APP_ICON)
175177
addTab(createTab(tripType, CID_TRIP_DATA, R.drawable.ic_car_app_list))
176178
if (BuildConfig.FLAVOR_version == "dev") addTab(createTab(R.string.car_app_dashboard, CID_DASHBOARD, R.drawable.ic_car_app_dashboard))
177-
else addTab(createTab(R.string.car_app_status, CID_STATUS, R.drawable.ic_connected))
179+
else addTab(createTab(R.string.car_app_menu, CID_STATUS, R.drawable.ic_car_app_menu))
178180
addTab(createTab(R.string.settings_title, CID_SETTINGS, R.drawable.ic_car_app_settings))
179181
if (BuildConfig.FLAVOR_version == "dev") addTab(createTab(R.string.car_app_menu, CID_MISC, R.drawable.ic_car_app_menu))
180182
setTabContents(TabContents.Builder(
@@ -224,15 +226,15 @@ class TabsScreen(
224226
val nanoTime = System.nanoTime()
225227
if (lastInvalidate + 1_000_000_000 < nanoTime) {
226228
invalidate()
227-
InAppLogger.d("[$TAG] Invalidated")
229+
// InAppLogger.d("[$TAG] Invalidated")
228230
lastInvalidate = nanoTime
229231
} else {
230232
invalidateInQueue = true
231233
lifecycleScope.launch {
232234
val remainingDelay = INVALIDATE_INTERVAL_MS - (nanoTime - lastInvalidate) / 1_000_000
233235
delay(remainingDelay)
234236
invalidate()
235-
InAppLogger.d("[$TAG] Invalidated")
237+
// InAppLogger.d("[$TAG] Invalidated")
236238
lastInvalidate = System.nanoTime()
237239
invalidateInQueue = false
238240
}

0 commit comments

Comments
 (0)