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