From ccd729e82f6671f2bfe7f3af8d368860d27c5c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Orzech?= Date: Thu, 19 Mar 2026 15:27:58 +0100 Subject: [PATCH] feat: show app version in Settings, fix composer NPE crash, bump to v0.2.0 - Settings: shows "Swoosh v0.2.0" at bottom - Fix: NPE crash in composer error display (AnimatedVisibility exit) - Version bumped to 0.2.0 (versionCode 2) - CLAUDE.md: added versioning process documentation --- CLAUDE.md | 17 +++++++++++++++++ app/build.gradle.kts | 4 ++-- .../microblog/ui/composer/ComposerScreen.kt | 2 +- .../microblog/ui/settings/SettingsScreen.kt | 13 +++++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 3d334ef..7cd266c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -41,3 +41,20 @@ MVVM with Repository pattern, single-module Gradle project. - **Credentials:** Stored in `EncryptedSharedPreferences` (AES256-GCM) via `CredentialsManager` - **API client:** Base URL is configured at runtime during setup; `ApiClient` rebuilds Retrofit instance when URL changes - **Min SDK 26, Target/Compile SDK 34, Kotlin 1.9.22, Java 17** + +## Versioning + +Version is defined in `app/build.gradle.kts` (`versionCode` and `versionName`). + +- **Format:** Semantic versioning `MAJOR.MINOR.PATCH` (e.g., `0.2.0`) +- **`versionCode`:** Integer, increment by 1 on every release (used by Google Play) +- **`versionName`:** Human-readable, shown in Settings screen + +**When to bump:** +- **PATCH** (0.2.0 → 0.2.1): Bug fixes, small tweaks, no new features +- **MINOR** (0.2.0 → 0.3.0): New features, UI changes, significant improvements +- **MAJOR** (0.x → 1.0): First stable public release + +**Current:** `versionName = "0.2.0"`, `versionCode = 2` + +**Process:** When making a release commit, bump both `versionCode` (+1) and `versionName` in `app/build.gradle.kts`. Always bump version when creating a release build or PR. diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dfc34e4..0bd534e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,8 +12,8 @@ android { applicationId = "com.swoosh.microblog" minSdk = 26 targetSdk = 34 - versionCode = 1 - versionName = "1.0" + versionCode = 2 + versionName = "0.2.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary = true } diff --git a/app/src/main/java/com/swoosh/microblog/ui/composer/ComposerScreen.kt b/app/src/main/java/com/swoosh/microblog/ui/composer/ComposerScreen.kt index 0ca3c29..560cd7b 100644 --- a/app/src/main/java/com/swoosh/microblog/ui/composer/ComposerScreen.kt +++ b/app/src/main/java/com/swoosh/microblog/ui/composer/ComposerScreen.kt @@ -521,7 +521,7 @@ fun ComposerScreen( Column { Spacer(modifier = Modifier.height(12.dp)) Text( - text = state.error!!, + text = state.error ?: "", color = MaterialTheme.colorScheme.error, style = MaterialTheme.typography.bodySmall ) diff --git a/app/src/main/java/com/swoosh/microblog/ui/settings/SettingsScreen.kt b/app/src/main/java/com/swoosh/microblog/ui/settings/SettingsScreen.kt index 978561a..28e7248 100644 --- a/app/src/main/java/com/swoosh/microblog/ui/settings/SettingsScreen.kt +++ b/app/src/main/java/com/swoosh/microblog/ui/settings/SettingsScreen.kt @@ -141,6 +141,19 @@ fun SettingsScreen( Spacer(modifier = Modifier.height(8.dp)) + // App version + Spacer(modifier = Modifier.height(16.dp)) + val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0) + Text( + text = "Swoosh v${packageInfo.versionName}", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.fillMaxWidth(), + textAlign = androidx.compose.ui.text.style.TextAlign.Center + ) + + Spacer(modifier = Modifier.height(16.dp)) + // Disconnect all if (accountManager.getAccounts().size > 1) { TextButton(