diff --git a/README.md b/README.md index bf8422b0..1f4e614f 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ [![Discord](https://img.shields.io/discord/793235453871390720)](https://discord.gg/dGFDpmWp46) [![Continuous Delivery Pipeline](https://github.com/photos-network/android/actions/workflows/continuous-delivery-pipeline.yml/badge.svg)](https://github.com/photos-network/android/actions/workflows/continuous-delivery-pipeline.yml) + + [Photos.network](https://photos.network) A privacy first, self-hosted photo storage and sharing service for fediverse. Its core features are: @@ -12,6 +14,9 @@ Its core features are: - Share photos and albums with friends, family or public - Search for photos by attributes like location or objects +[Get it on F-Droid](https://f-droid.org/repository/browse/?fdid=photos.network) +[Get it on Google Play](https://play.google.com/store/apps/details?id=photos.network&utm_source=github) + ## App The Android app itself is self-sufficient and can be used to browse local photos on an android device, add tags or search by attributes. diff --git a/fastlane/fdroid_badge.png b/fastlane/fdroid_badge.png new file mode 100644 index 00000000..23af0e40 Binary files /dev/null and b/fastlane/fdroid_badge.png differ diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 00000000..beb9fd9e Binary files /dev/null and b/fastlane/metadata/android/en-US/images/icon.png differ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832..c1962a79 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fae08049..2c3425d4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionSha256Sum=e111cb9948407e26351227dabce49822fb88c37ee72f1d1582a69c68af2e702f distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb6..aeb74cbb 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -143,12 +140,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +194,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in diff --git a/gradlew.bat b/gradlew.bat index 53a6b238..6689b85b 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% diff --git a/ui/settings/src/main/kotlin/photos/network/ui/settings/SettingsScreen.kt b/ui/settings/src/main/kotlin/photos/network/ui/settings/SettingsScreen.kt index 757eb10a..49edbf91 100644 --- a/ui/settings/src/main/kotlin/photos/network/ui/settings/SettingsScreen.kt +++ b/ui/settings/src/main/kotlin/photos/network/ui/settings/SettingsScreen.kt @@ -24,14 +24,18 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.TextField import androidx.compose.material.icons.Icons @@ -106,11 +110,57 @@ fun SettingsScreen( Column( modifier = modifier - .verticalScroll(verticalScrollState) - .fillMaxSize(), + .fillMaxSize() + .verticalScroll(verticalScrollState), ) { SettingsHeader(serverStatus = uiState.serverStatus) + Text( + modifier = Modifier.padding(horizontal = 16.dp), + text = stringResource(id = R.string.settings_features_pre), + ) + val map = listOf( + stringResource(id = R.string.feature_sharing_title) to stringResource(id = R.string.feature_sharing_description), + stringResource(id = R.string.feature_backup_title) to stringResource(id = R.string.feature_backup_description), + stringResource(id = R.string.feature_image_analysis_title) to stringResource(id = R.string.feature_image_analysis_description), + ) + + Column( + modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + map.forEach { + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Box( + modifier = Modifier + .padding(start = 8.dp, end = 8.dp) + .size(8.dp) + .background(Color.Black, shape = CircleShape), + ) + + Text( + text = it.first, + style = MaterialTheme.typography.headlineMedium, + ) + } + Text( + modifier = Modifier.padding(start = 24.dp), + text = it.second, + ) + } + } + + Text( + modifier = Modifier + .padding(horizontal = 16.dp) + .padding(bottom = 16.dp), + text = stringResource(id = R.string.settings_features_post), + ) + + Divider() + ServerSetupItem( onServerSetupClicked = { handleEvent(SettingsEvent.ToggleServerSetup) @@ -136,7 +186,7 @@ fun SettingsScreen( } } - SectionSpacer() + Spacer(modifier = Modifier.weight(1f)) AppVersionItem(version = uiState.appVersion) { handleEvent(SettingsEvent.SetClipboardEvent) diff --git a/ui/settings/src/main/res/values-de/strings.xml b/ui/settings/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..9f6d6be2 --- /dev/null +++ b/ui/settings/src/main/res/values-de/strings.xml @@ -0,0 +1,16 @@ + + + Setup server + Server Setup ändern + Version kopiert + + Foto teilen + Teile Fotos oder Alben mit der Familie, Freunden oder der Öffentlichkeit + Datensicherung + Behalte eine Kopie deiner Daten sicher in der Cloud um den Verlust des Geräts zu minimieren oder den begrenzten Speicherplatz zu umgehen. + Bilderkennung + Gewinne aussagekräftige Informationen aus deinen Fotos wie die Erkennung von Personen anhand ihrer Gesichter + + Um Funktionen wie + nutzen zu können, wird ein Benutzerkonto auf einem Photos.network Server benötigt. + diff --git a/ui/settings/src/main/res/values/strings.xml b/ui/settings/src/main/res/values/strings.xml index fae534a6..14bf9f13 100644 --- a/ui/settings/src/main/res/values/strings.xml +++ b/ui/settings/src/main/res/values/strings.xml @@ -1,5 +1,16 @@ + - Setup server instance + Setup server Change server setup Version copied into clipboard + + Photo sharing + Share photos or albums with family, friends or public. + Backup + Keep a copy of your data safe in the cloud to mitigate the loss of the device or to bypass storage limits. + Image analysis + Extract meaningful informations from your photos like identifying a person from their face. + + To use features like + you need an account on any Photos.network server.