diff --git a/apps/rebreak-native/app.config.ts b/apps/rebreak-native/app.config.ts index 89046ad..cf5eee0 100644 --- a/apps/rebreak-native/app.config.ts +++ b/apps/rebreak-native/app.config.ts @@ -6,7 +6,7 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ slug: "rebreak", version: "0.1.0", orientation: "portrait", - icon: "./assets/rebreak_android.png", + icon: "./assets/icon.png", scheme: "rebreak", userInterfaceStyle: "automatic", newArchEnabled: true, @@ -38,9 +38,10 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ package: "org.rebreak.app", versionCode: 2, adaptiveIcon: { - // Play-Console-Icon (rebreak_android.png) verwenden — wird durch Adaptive-Mask - // gecropped (Kreis/Squircle), evtl. Edges leicht beschnitten je nach Design. - foregroundImage: "./assets/rebreak_android.png", + // Foreground muss in der ~66%-Safe-Zone bleiben (Launcher-Mask clippt den + // Außenring) → adaptive-foreground.png ist das Logo auf transparentem + // 1024er-Canvas mit ~21% Padding. Hintergrund = Marken-Dunkel. + foregroundImage: "./assets/adaptive-foreground.png", backgroundColor: "#0a0a0a", }, permissions: [ diff --git a/apps/rebreak-native/assets/adaptive-foreground.png b/apps/rebreak-native/assets/adaptive-foreground.png new file mode 100644 index 0000000..61f51a5 Binary files /dev/null and b/apps/rebreak-native/assets/adaptive-foreground.png differ diff --git a/apps/rebreak-native/components/AppHeader.tsx b/apps/rebreak-native/components/AppHeader.tsx index 503ad5a..5fdad97 100644 --- a/apps/rebreak-native/components/AppHeader.tsx +++ b/apps/rebreak-native/components/AppHeader.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { View, Text, Pressable, Image } from 'react-native'; +import { View, Text, TouchableOpacity, Image } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { useRouter, type RelativePathString } from 'expo-router'; @@ -59,22 +59,22 @@ export function AppHeader({ notifCount, showBack, title }: Props = {}) { {showBack ? ( - router.back()} hitSlop={10} - style={({ pressed }) => ({ - opacity: pressed ? 0.6 : 1, + activeOpacity={0.6} + style={{ marginLeft: -8, width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center', - })} + }} accessibilityLabel="Zurück" > - + ) : null} {title ?? t('appHeader.appName')} @@ -82,18 +82,18 @@ export function AppHeader({ notifCount, showBack, title }: Props = {}) { - setNotifOpen(true)} hitSlop={{ top: 4, bottom: 4, left: 4, right: 4 }} - style={({ pressed }) => ({ - opacity: pressed ? 0.7 : 1, + activeOpacity={0.7} + style={{ width: 36, height: 36, borderRadius: 18, backgroundColor: colors.surface, alignItems: 'center', justifyContent: 'center', - })} + }} > {badge > 0 && ( @@ -103,14 +103,17 @@ export function AppHeader({ notifCount, showBack, title }: Props = {}) { )} - + - {/* Avatar = Trigger für Dropdown-Menu (kein separates 3-Punkte-Icon) */} - setMenuOpen(true)} hitSlop={{ top: 4, bottom: 4, left: 4, right: 4 }} - style={({ pressed }) => ({ - opacity: pressed ? 0.7 : 1, + activeOpacity={0.7} + style={{ width: 36, height: 36, borderRadius: 18, @@ -118,7 +121,7 @@ export function AppHeader({ notifCount, showBack, title }: Props = {}) { justifyContent: 'center', overflow: 'hidden', backgroundColor: showAvatarImage ? colors.surfaceElevated : colors.brandOrange, - })} + }} > {showAvatarImage ? ( {initials} )} - + { - const [layers, cooldown, backend] = await Promise.all([ + const [rawLayers, cooldown, backend] = await Promise.all([ this.getDeviceState(), this.getCooldownStatus(), this.getBackendProtectionState(), ]); + // Android's native module reports {vpn, accessibility, tamperLock}; the UI + // (blocker.tsx, isAllLayersOn) reads the iOS-shaped names {urlFilter, + // familyControls, appDeletionLock}. Alias them so consumers are platform- + // agnostic. Android "App-Lock" = AccessibilityService + armed tamper-lock, + // so the lock-state maps to `tamperLock`. + const layers: DeviceLayers = + Platform.OS === "android" && rawLayers.urlFilter === undefined + ? ({ + ...rawLayers, + urlFilter: rawLayers.vpn, + familyControls: rawLayers.tamperLock, + appDeletionLock: rawLayers.tamperLock, + } as DeviceLayers) + : rawLayers; + const allLayersOn = isAllLayersOn(layers); const iosLockActive = layers.appDeletionLock ?? layers.familyControls ?? false;