Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 39 additions & 2 deletions .github/workflows/android-play-store.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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: |
Expand Down
35 changes: 33 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,40 @@
# SpaceView
Display all Meetings for your room on a Display from your Nextcloud RoomVox Instance
<br/>
<div
style="
display: flex;
gap: 20px;
align-items:
center;
justify-content: center
">
<img src="./docs/images/app-icon.png" width="125"/>
<p style="font-size: 48px; font-weight: 500;">SpaceView</p>
</div>
<br/>

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)
Expand Down
20 changes: 14 additions & 6 deletions androidApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -84,4 +92,4 @@ android {
buildFeatures {
compose = true
}
}
}
Binary file added docs/images/app-icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 4 additions & 4 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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]
Expand Down
6 changes: 3 additions & 3 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
zipStorePath=wrapper/dists
Loading