Skip to content

Commit 1b6062b

Browse files
committed
Show version number in settings
1 parent 0981628 commit 1b6062b

File tree

6 files changed

+41
-6
lines changed

6 files changed

+41
-6
lines changed

fastlane/Fastfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ default_platform :android
44

55
platform :android do
66

7-
androidVersionNum = 255
8-
wearVersionNum = 330
7+
androidVersionNum = 257
8+
wearVersionNum = 332
99

1010
before_all do
1111
end

shared/src/androidMain/kotlin/dev/johnoreilly/confetti/di/KoinAndroid.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package dev.johnoreilly.confetti.di
88

9+
import android.app.Application
910
import android.content.Context
1011
import android.os.Build
1112
import androidx.core.app.NotificationManagerCompat
@@ -30,6 +31,7 @@ import com.russhwolf.settings.datastore.DataStoreSettings
3031
import dev.johnoreilly.confetti.analytics.AnalyticsLogger
3132
import dev.johnoreilly.confetti.analytics.AndroidLoggingAnalyticsLogger
3233
import dev.johnoreilly.confetti.analytics.FirebaseAnalyticsLogger
34+
import dev.johnoreilly.confetti.appconfig.ApplicationInfo
3335
import dev.johnoreilly.confetti.settings.WearSettingsSerializer
3436
import dev.johnoreilly.confetti.shared.BuildConfig
3537
import dev.johnoreilly.confetti.utils.AndroidDateService
@@ -120,6 +122,8 @@ actual fun platformModule() = module {
120122
single<NotificationSender> {
121123
get<SessionNotificationSender>()
122124
}
125+
126+
single<ApplicationInfo> { getApplicationInfo(get()) }
123127
}
124128

125129
val Context.settingsStore by preferencesDataStore("settings")
@@ -140,4 +144,11 @@ private val Context.versionCode: String
140144
it.versionCode
141145
}
142146
}.toString()
143-
}
147+
}
148+
149+
150+
private fun getApplicationInfo(application: Application): ApplicationInfo {
151+
val packageManager = application.packageManager
152+
val versionName = packageManager.getPackageInfo(application.packageName, 0).versionName ?: ""
153+
return ApplicationInfo(versionName)
154+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dev.johnoreilly.confetti.appconfig
2+
3+
data class ApplicationInfo(
4+
val versionName: String
5+
)

shared/src/commonMain/kotlin/dev/johnoreilly/confetti/decompose/SettingsComponent.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package dev.johnoreilly.confetti.decompose
55
import com.arkivanov.decompose.ComponentContext
66
import com.russhwolf.settings.ExperimentalSettingsApi
77
import dev.johnoreilly.confetti.AppSettings
8+
import dev.johnoreilly.confetti.appconfig.ApplicationInfo
89
import dev.johnoreilly.confetti.auth.Authentication
910
import dev.johnoreilly.confetti.work.NotificationSender
1011
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -16,6 +17,8 @@ import kotlinx.coroutines.flow.flowOf
1617
import kotlinx.coroutines.flow.map
1718
import kotlinx.coroutines.flow.stateIn
1819
import kotlinx.coroutines.launch
20+
import org.koin.core.component.KoinComponent
21+
import org.koin.core.component.inject
1922

2023
data class DeveloperSettings(
2124
val token: String?
@@ -42,6 +45,7 @@ interface SettingsComponent {
4245

4346
val developerSettings: StateFlow<DeveloperSettings?>
4447
val userEditableSettings: StateFlow<UserEditableSettings?>
48+
val applicationInfo: ApplicationInfo
4549

4650
fun updateDarkThemeConfig(darkThemeConfig: DarkThemeConfig)
4751
fun updateUseExperimentalFeatures(value: Boolean)
@@ -51,15 +55,17 @@ interface SettingsComponent {
5155
val supportsNotifications: Boolean
5256
}
5357

58+
@OptIn(ExperimentalSettingsApi::class)
5459
class DefaultSettingsComponent(
5560
componentContext: ComponentContext,
5661
private val appSettings: AppSettings,
5762
private val authentication: Authentication,
5863
private val notificationSender: NotificationSender?,
59-
) : SettingsComponent, ComponentContext by componentContext {
64+
) : SettingsComponent, KoinComponent, ComponentContext by componentContext {
6065

6166
private val coroutineScope = coroutineScope()
6267
private val settings = appSettings.settings
68+
override val applicationInfo: ApplicationInfo by inject()
6369

6470
override val developerSettings: StateFlow<DeveloperSettings?> = appSettings.developerModeFlow().flatMapLatest {
6571
if (!it) {

shared/src/commonMain/kotlin/dev/johnoreilly/confetti/ui/settings/SettingsUI.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import confetti.shared.generated.resources.settings_boolean_false
5151
import confetti.shared.generated.resources.settings_boolean_true
5252
import confetti.shared.generated.resources.settings_title
5353
import confetti.shared.generated.resources.use_experimental_features
54+
import dev.johnoreilly.confetti.appconfig.ApplicationInfo
5455
import dev.johnoreilly.confetti.decompose.DarkThemeConfig
5556
import dev.johnoreilly.confetti.decompose.DeveloperSettings
5657
import dev.johnoreilly.confetti.decompose.SettingsComponent
@@ -65,11 +66,13 @@ fun SettingsUI(
6566
) {
6667
val userEditableSettings by component.userEditableSettings.collectAsStateWithLifecycle()
6768
val developerSettings by component.developerSettings.collectAsStateWithLifecycle()
69+
6870
SettingsUI(
6971
userEditableSettings = userEditableSettings,
7072
onChangeDarkThemeConfig = component::updateDarkThemeConfig,
7173
onChangeUseExperimentalFeatures = component::updateUseExperimentalFeatures,
7274
developerSettings = developerSettings,
75+
applicationInfo = component.applicationInfo,
7376
onEnableDeveloperMode = component::enableDeveloperMode,
7477
onSendNotifications = component::sendNotifications,
7578
supportsNotifications = component.supportsNotifications,
@@ -84,6 +87,7 @@ fun SettingsUI(
8487
onChangeUseExperimentalFeatures: (value: Boolean) -> Unit,
8588
onChangeDarkThemeConfig: (darkThemeConfig: DarkThemeConfig) -> Unit,
8689
developerSettings: DeveloperSettings?,
90+
applicationInfo: ApplicationInfo,
8791
onEnableDeveloperMode: () -> Unit,
8892
onSendNotifications: () -> Unit,
8993
supportsNotifications: Boolean,
@@ -203,8 +207,7 @@ fun SettingsUI(
203207
Modifier.fillMaxWidth(),
204208
horizontalAlignment = Alignment.CenterHorizontally,
205209
) {
206-
// Keep version so developer mode is accessible
207-
Text("Version: ")
210+
Text("Version: ${applicationInfo.versionName}")
208211
}
209212
}
210213
}

shared/src/iosMain/kotlin/dev/johnoreilly/confetti/di/KoiniOS.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.russhwolf.settings.ExperimentalSettingsApi
1212
import com.russhwolf.settings.NSUserDefaultsSettings
1313
import com.russhwolf.settings.ObservableSettings
1414
import com.russhwolf.settings.coroutines.toFlowSettings
15+
import dev.johnoreilly.confetti.appconfig.ApplicationInfo
1516
import dev.johnoreilly.confetti.auth.Authentication
1617
import dev.johnoreilly.confetti.dev.johnoreilly.confetti.work.SessionNotificationSender
1718
import dev.johnoreilly.confetti.utils.DateService
@@ -20,6 +21,7 @@ import dev.johnoreilly.confetti.work.NotificationSender
2021
import org.koin.core.module.dsl.bind
2122
import org.koin.core.module.dsl.singleOf
2223
import org.koin.dsl.module
24+
import platform.Foundation.NSBundle
2325
import platform.Foundation.NSUserDefaults
2426

2527

@@ -36,10 +38,18 @@ actual fun platformModule() = module {
3638
.addHttpInterceptor(ApolloClientAwarenessInterceptor("confetti-ios", "fixme"))
3739
}
3840
single<NotificationSender> { SessionNotificationSender() }
41+
42+
single<ApplicationInfo> { getApplicationInfo() }
3943
}
4044

4145
actual fun getNormalizedCacheFactory(conference: String, uid: String?): NormalizedCacheFactory {
4246
val sqlNormalizedCacheFactory = SqlNormalizedCacheFactory("$conference$uid.db")
4347
return MemoryCacheFactory(10 * 1024 * 1024)
4448
.chain(sqlNormalizedCacheFactory)
49+
}
50+
51+
private fun getApplicationInfo(): ApplicationInfo {
52+
val versionName = NSBundle.mainBundle.infoDictionary
53+
?.get("CFBundleShortVersionString") as? String ?: ""
54+
return ApplicationInfo(versionName)
4555
}

0 commit comments

Comments
 (0)