diff --git a/.github/workflows/android-play-store.yml b/.github/workflows/android-play-store.yml
index ae6d37b..3dd3c52 100644
--- a/.github/workflows/android-play-store.yml
+++ b/.github/workflows/android-play-store.yml
@@ -57,11 +57,48 @@ jobs:
- name: Restore signing keystore
shell: bash
+ env:
+ ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
run: |
- echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" \
- | base64 --decode > "$RUNNER_TEMP/release.jks"
+ if [[ -z "$ANDROID_KEYSTORE_BASE64" ]]; then
+ echo "ANDROID_KEYSTORE_BASE64 secret is missing or empty." >&2
+ exit 1
+ fi
+
+ echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > "$RUNNER_TEMP/release.jks"
+
+ if [[ ! -s "$RUNNER_TEMP/release.jks" ]]; then
+ echo "Decoded Android keystore is missing or empty." >&2
+ exit 1
+ fi
echo "KEYSTORE_FILE=$RUNNER_TEMP/release.jks" >> "$GITHUB_ENV"
+
+ - name: Validate Android signing config
+ env:
+ KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
+ KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
+ KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
+ shell: bash
+ run: |
+ if [[ -z "$KEYSTORE_PASSWORD" || -z "$KEY_ALIAS" || -z "$KEY_PASSWORD" ]]; then
+ echo "One or more Android signing secrets are missing: ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS, ANDROID_KEY_PASSWORD." >&2
+ exit 1
+ fi
+
+ keytool -list \
+ -keystore "$KEYSTORE_FILE" \
+ -storepass "$KEYSTORE_PASSWORD" \
+ -alias "$KEY_ALIAS" \
+ >/dev/null
+
+ keytool -certreq \
+ -keystore "$KEYSTORE_FILE" \
+ -storepass "$KEYSTORE_PASSWORD" \
+ -alias "$KEY_ALIAS" \
+ -keypass "$KEY_PASSWORD" \
+ -file "$RUNNER_TEMP/android-signing-cert-request.pem" \
+ >/dev/null
- name: Export lib info
run: |
diff --git a/README.md b/README.md
index 8588b80..067da6f 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,40 @@
-# SpaceView
-Display all Meetings for your room on a Display from your Nextcloud RoomVox Instance
+
+
+

+
SpaceView
+
+
+
+Display all Meetings for your room on a Display, Spaceview supports Nextcloud RoomVox and iCal Calendars. Also you have some options to customize Spaceview.
+
+## Calendar Providers
+We support currently the following calendar providers:
+- iCal (.ics)
+- Nextcloud Roomvox
+- ~~Google Workspace (planed)~~
+- ~~Outlook (planed)~~
+
+## Customization
+You can add a logo, change the background image and change the acent color. If you use a Nextcloud Provider, you can automaticaly use your default images and color from your Server Theme.\
+You can also add your own images to the app to use them.
## Development
+### Run local
+View the instructions in [KOTLIN.md](KOTLIN.md)
+
### Change Version
+#### GitHub Action
+The version will be set automatically from the realease tag.
+
+#### Local
Open the [gradle.properties](gradle.properties) file and change the following values:
- `app.version`: for the global App Version (1.0.0)
- `android.versionCode`: for the Android Build number (needs to be counted +1 for every Play Store Build)
diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts
index 91737bb..1eaf0e2 100644
--- a/androidApp/build.gradle.kts
+++ b/androidApp/build.gradle.kts
@@ -14,10 +14,10 @@ val keyAliasEnv = System.getenv("KEY_ALIAS")
val keyPassword = System.getenv("KEY_PASSWORD")
val hasSigningConfig =
- keystoreFile != null &&
- keystorePassword != null &&
- keyAliasEnv != null &&
- keyPassword != null
+ !keystoreFile.isNullOrBlank() &&
+ !keystorePassword.isNullOrBlank() &&
+ !keyAliasEnv.isNullOrBlank() &&
+ !keyPassword.isNullOrBlank()
kotlin {
compilerOptions {
@@ -53,7 +53,15 @@ android {
if (hasSigningConfig) {
signingConfigs {
create("release") {
- storeFile = file(keystoreFile!!)
+ val resolvedKeystoreFile = file(keystoreFile!!)
+ require(resolvedKeystoreFile.isFile) {
+ "Release signing keystore was not found at: ${resolvedKeystoreFile.absolutePath}"
+ }
+ require(resolvedKeystoreFile.length() > 0) {
+ "Release signing keystore is empty: ${resolvedKeystoreFile.absolutePath}"
+ }
+
+ storeFile = resolvedKeystoreFile
storePassword = keystorePassword
keyAlias = keyAliasEnv
keyPassword = keyPassword
@@ -84,4 +92,4 @@ android {
buildFeatures {
compose = true
}
-}
\ No newline at end of file
+}
diff --git a/docs/images/app-icon.png b/docs/images/app-icon.png
new file mode 100644
index 0000000..5abedc5
Binary files /dev/null and b/docs/images/app-icon.png differ
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index c609ce9..7ed81a9 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,8 +1,8 @@
[versions]
-agp = "9.0.1"
-android-compileSdk = "36"
+agp = "9.1.1"
+android-compileSdk = "37"
android-minSdk = "24"
-android-targetSdk = "36"
+android-targetSdk = "37"
androidx-activity = "1.13.0"
androidx-appcompat = "1.7.1"
androidx-core = "1.19.0"
@@ -20,7 +20,7 @@ ktor = "3.3.0"
material3 = "1.11.0-alpha07"
multiplatform-settings = "1.3.0"
buildkonfig = "0.17.1"
-aboutLibraries = "14.2.1"
+aboutLibraries = "15.2.0"
kotlin-wrappers = "2026.8.4"
[libraries]
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 75927bd..4146564 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,8 +1,8 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionSha256Sum=a17ddd85a26b6a7f5ddb71ff8b05fc5104c0202c6e64782429790c933686c806
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
+distributionSha256Sum=b266d5ff6b90eada6dc3b20cb090e3731302e553a27c5d3e4df1f0d76beaff06
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
\ No newline at end of file
+zipStorePath=wrapper/dists