diff --git a/mobile/app.json b/mobile/app.json
index 1e84ebf..90255e3 100644
--- a/mobile/app.json
+++ b/mobile/app.json
@@ -8,9 +8,19 @@
"userInterfaceStyle": "dark",
"newArchEnabled": true,
"platforms": ["ios", "android"],
+ "icon": "./assets/icon.png",
+ "splash": {
+ "image": "./assets/splash-icon.png",
+ "resizeMode": "contain",
+ "backgroundColor": "#09090b"
+ },
"android": {
"package": "org.bincio.app",
"usesCleartextTraffic": true,
+ "adaptiveIcon": {
+ "foregroundImage": "./assets/adaptive-icon.png",
+ "backgroundColor": "#09090b"
+ },
"permissions": [
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.READ_MEDIA_VIDEO",
@@ -24,6 +34,7 @@
"supportsTablet": true
},
"plugins": [
+ "expo-system-ui",
"expo-router",
"expo-sqlite",
[
diff --git a/mobile/app/(tabs)/settings.tsx b/mobile/app/(tabs)/settings.tsx
index f986250..448fd03 100644
--- a/mobile/app/(tabs)/settings.tsx
+++ b/mobile/app/(tabs)/settings.tsx
@@ -19,6 +19,8 @@ export default function SettingsScreen() {
const [instanceUrl, setInstanceUrl] = useState(storedUrl);
const [handle, setHandle] = useState(storedHandle);
const [autoPath, setAutoPath] = useState(storedPath);
+ const [syncMode, setSyncMode] = useState(storedSyncMode);
+ const [syncUpload, setSyncUpload] = useState(storedSyncUpload);
const [saved, setSaved] = useState(false);
const [password, setPassword] = useState('');
@@ -181,17 +183,17 @@ export default function SettingsScreen() {
setSetting(db, 'sync_mode', 'summaries')}
+ active={syncMode === 'summaries'}
+ onPress={() => { setSyncMode('summaries'); setSetting(db, 'sync_mode', 'summaries'); }}
/>
setSetting(db, 'sync_mode', 'full')}
+ active={syncMode === 'full'}
+ onPress={() => { setSyncMode('full'); setSetting(db, 'sync_mode', 'full'); }}
/>
- {storedSyncMode === 'full'
+ {syncMode === 'full'
? 'Downloads map route and elevation chart for every activity during sync. Uses more storage and takes longer.'
: 'Syncs activity summaries only. Map and chart are fetched on demand when you open an activity.'}
@@ -199,17 +201,17 @@ export default function SettingsScreen() {
setSetting(db, 'sync_upload', 'false')}
+ active={!syncUpload}
+ onPress={() => { setSyncUpload(false); setSetting(db, 'sync_upload', 'false'); }}
/>
setSetting(db, 'sync_upload', 'true')}
+ active={syncUpload}
+ onPress={() => { setSyncUpload(true); setSetting(db, 'sync_upload', 'true'); }}
/>
- {storedSyncUpload
+ {syncUpload
? 'Local activities are uploaded to the instance during sync.'
: 'Local activities stay on device only.'}
diff --git a/mobile/assets/adaptive-icon.png b/mobile/assets/adaptive-icon.png
new file mode 100644
index 0000000..e33e136
Binary files /dev/null and b/mobile/assets/adaptive-icon.png differ
diff --git a/mobile/assets/icon.png b/mobile/assets/icon.png
new file mode 100644
index 0000000..e76ce4d
Binary files /dev/null and b/mobile/assets/icon.png differ
diff --git a/mobile/assets/splash-icon.png b/mobile/assets/splash-icon.png
new file mode 100644
index 0000000..052390f
Binary files /dev/null and b/mobile/assets/splash-icon.png differ
diff --git a/mobile/package-lock.json b/mobile/package-lock.json
index 686590e..d8be60c 100644
--- a/mobile/package-lock.json
+++ b/mobile/package-lock.json
@@ -20,6 +20,7 @@
"expo-splash-screen": "~31.0.13",
"expo-sqlite": "~16.0.10",
"expo-status-bar": "~3.0.9",
+ "expo-system-ui": "~6.0.9",
"expo-task-manager": "~14.0.9",
"react": "19.1.0",
"react-dom": "19.1.0",
@@ -4993,6 +4994,26 @@
"react-native": "*"
}
},
+ "node_modules/expo-system-ui": {
+ "version": "6.0.9",
+ "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-6.0.9.tgz",
+ "integrity": "sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-native/normalize-colors": "0.81.5",
+ "debug": "^4.3.2"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "react-native": "*",
+ "react-native-web": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-web": {
+ "optional": true
+ }
+ }
+ },
"node_modules/expo-task-manager": {
"version": "14.0.9",
"resolved": "https://registry.npmjs.org/expo-task-manager/-/expo-task-manager-14.0.9.tgz",
diff --git a/mobile/package.json b/mobile/package.json
index 3d51ef1..b60a2f1 100644
--- a/mobile/package.json
+++ b/mobile/package.json
@@ -10,26 +10,27 @@
"lint": "expo lint"
},
"dependencies": {
+ "@maplibre/maplibre-react-native": "~11.0.0",
"expo": "~54.0.33",
- "expo-router": "~6.0.23",
- "expo-sqlite": "~16.0.10",
+ "expo-background-fetch": "~14.0.9",
+ "expo-constants": "~18.0.13",
"expo-document-picker": "~14.0.8",
"expo-file-system": "~19.0.21",
- "expo-background-fetch": "~14.0.9",
- "expo-task-manager": "~14.0.9",
- "expo-notifications": "~0.32.16",
- "expo-constants": "~18.0.13",
"expo-linking": "~8.0.11",
+ "expo-notifications": "~0.32.16",
+ "expo-router": "~6.0.23",
"expo-splash-screen": "~31.0.13",
+ "expo-sqlite": "~16.0.10",
"expo-status-bar": "~3.0.9",
+ "expo-system-ui": "~6.0.9",
+ "expo-task-manager": "~14.0.9",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-native": "0.81.5",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",
"react-native-svg": "~15.15.0",
- "react-native-webview": "13.15.0",
- "@maplibre/maplibre-react-native": "~11.0.0"
+ "react-native-webview": "13.15.0"
},
"devDependencies": {
"@babel/core": "^7.25.0",