feat(app): Background-GPS als opt-in Settings-Toggle
Stefan-Anforderung: GPS soll auch im Hintergrund liefern (Auto-Szenarien,
Handy-Tasche), aber NUR fuer Power-User die das bewusst aktivieren.
Mama-Tauglichkeit bleibt erhalten — Default AUS, keine Surprise-Permission.
Aenderungen:
AndroidManifest:
- ACCESS_BACKGROUND_LOCATION Permission
- FOREGROUND_SERVICE_LOCATION Permission
- AriaPlaybackService foregroundServiceType erweitert um |location
(vorher: mediaPlayback|microphone)
backgroundAudio.ts:
- Neuer Slot 'location' zwischen 'wake' und 'background' in der
Prioritaeten-Liste. Notification zeigt entsprechend.
gpsTracking.ts:
- isBackgroundGpsEnabled() / setBackgroundGpsEnabled() AsyncStorage-Helper
- ensureBackgroundLocationPermission() pruefte ACCESS_BACKGROUND_LOCATION
und oeffnet Android-Settings wenn fehlend (auf Android 10+ kann das
NICHT ueber den normalen Permission-Dialog angefordert werden)
- start(): wenn BG-GPS enabled, acquireBackgroundAudio('location') →
Foreground-Service hochziehen mit type=location
- stop(): releaseBackgroundAudio('location')
SettingsScreen.tsx:
- Neuer Toggle "GPS auch im Hintergrund" direkt unter dem
GPS-Tracking-Toggle, rot (#FF3B30) statt orange weil's eine stark
privacy-relevante Einstellung ist
- Erklaerungs-Text zu Android-Settings + Akku-Verbrauch
- Beim Aktivieren: Permission-Check, ggf. Android-Settings oeffnen
- Wenn Tracking bereits laeuft: neustart damit location-Slot greift
APK neu bauen erforderlich.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -52,7 +52,11 @@ import {
|
||||
TTS_SPEED_STORAGE_KEY,
|
||||
} from '../services/audio';
|
||||
import audioService from '../services/audio';
|
||||
import gpsTrackingService from '../services/gpsTracking';
|
||||
import gpsTrackingService, {
|
||||
isBackgroundGpsEnabled,
|
||||
setBackgroundGpsEnabled,
|
||||
ensureBackgroundLocationPermission,
|
||||
} from '../services/gpsTracking';
|
||||
import { acquireBackgroundAudio, releaseBackgroundAudio } from '../services/backgroundAudio';
|
||||
import MemoryBrowser from '../components/MemoryBrowser';
|
||||
import TriggerBrowser from '../components/TriggerBrowser';
|
||||
@@ -134,6 +138,7 @@ const SettingsScreen: React.FC = () => {
|
||||
const [currentMode, setCurrentMode] = useState('normal');
|
||||
const [gpsEnabled, setGpsEnabled] = useState(false);
|
||||
const [gpsTracking, setGpsTracking] = useState(gpsTrackingService.isActive());
|
||||
const [bgGpsEnabled, setBgGpsEnabled] = useState(false);
|
||||
const [backgroundMode, setBackgroundMode] = useState(true); // Default an
|
||||
const [showSystemHints, setShowSystemHints] = useState(false); // Default aus
|
||||
const [scannerVisible, setScannerVisible] = useState(false);
|
||||
@@ -216,6 +221,8 @@ const SettingsScreen: React.FC = () => {
|
||||
const offGps = gpsTrackingService.onChange(setGpsTracking);
|
||||
// Persistierten Status wiederherstellen (war Tracking beim letzten Mal an?)
|
||||
gpsTrackingService.restoreFromStorage().catch(() => {});
|
||||
// Background-GPS-Toggle initial laden
|
||||
isBackgroundGpsEnabled().then(setBgGpsEnabled).catch(() => {});
|
||||
AsyncStorage.getItem(TTS_PREROLL_STORAGE_KEY).then(saved => {
|
||||
if (saved != null) {
|
||||
const n = parseFloat(saved);
|
||||
@@ -1117,6 +1124,52 @@ const SettingsScreen: React.FC = () => {
|
||||
thumbColor={gpsTracking ? '#FFFFFF' : '#666680'}
|
||||
/>
|
||||
</View>
|
||||
|
||||
{/* Background-GPS opt-in — Default AUS. Braucht ACCESS_BACKGROUND_LOCATION
|
||||
(User muss in Android-Settings 'Immer erlauben' aktivieren). */}
|
||||
<View style={[styles.toggleRow, {marginTop: 12, borderTopWidth: 1, borderTopColor: '#1E1E2E', paddingTop: 12}]}>
|
||||
<View style={styles.toggleInfo}>
|
||||
<Text style={styles.toggleLabel}>GPS auch im Hintergrund</Text>
|
||||
<Text style={styles.toggleHint}>
|
||||
Damit ARIA auch unterwegs deine aktuelle Position kennt wenn die
|
||||
App im Hintergrund ist (Auto, Handy-Tasche). Standard: aus.
|
||||
{'\n\n'}
|
||||
Android verlangt fuer Background-GPS, dass du in den
|
||||
System-Einstellungen unter Standort "Immer erlauben" auswaehlst.
|
||||
Beim Aktivieren wird Android-Settings geoeffnet falls noetig.
|
||||
{'\n\n'}
|
||||
Akku-Verbrauch: ~3-5% mehr pro Tag durch dauerhaftes Polling.
|
||||
</Text>
|
||||
</View>
|
||||
<Switch
|
||||
value={bgGpsEnabled}
|
||||
onValueChange={async (v) => {
|
||||
if (v) {
|
||||
const ok = await ensureBackgroundLocationPermission();
|
||||
if (!ok) {
|
||||
// User muss in Android-Settings auf "Immer erlauben" — Toggle
|
||||
// bleibt aus bis er zurueckkommt und nochmal tippt.
|
||||
return;
|
||||
}
|
||||
await setBackgroundGpsEnabled(true);
|
||||
setBgGpsEnabled(true);
|
||||
// Wenn Tracking bereits laeuft: neu starten damit der
|
||||
// Foreground-Service jetzt mit location-Slot kommt
|
||||
if (gpsTrackingService.isActive()) {
|
||||
gpsTrackingService.stop('bg-toggle');
|
||||
gpsTrackingService.start('bg-aktiviert').catch(() => {});
|
||||
}
|
||||
ToastAndroid.show('Background-GPS aktiviert', ToastAndroid.SHORT);
|
||||
} else {
|
||||
await setBackgroundGpsEnabled(false);
|
||||
setBgGpsEnabled(false);
|
||||
ToastAndroid.show('Background-GPS aus — nur noch Foreground', ToastAndroid.SHORT);
|
||||
}
|
||||
}}
|
||||
trackColor={{ false: '#2A2A3E', true: '#FF3B30' }}
|
||||
thumbColor={bgGpsEnabled ? '#FFFFFF' : '#666680'}
|
||||
/>
|
||||
</View>
|
||||
</View>
|
||||
|
||||
{/* === Bubble-Anzeige === */}
|
||||
|
||||
Reference in New Issue
Block a user