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
+[](https://f-droid.org/repository/browse/?fdid=photos.network)
+[](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.