diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 72a7185..01e9f4b 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -28,12 +28,14 @@ android { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + // Align with modern Android Gradle Plugin requirements + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_11.toString() + // Generate JVM bytecode targeting Java 17 + jvmTarget = JavaVersion.VERSION_17.toString() } signingConfigs { diff --git a/android/app/src/main/kotlin/app/cogwheel/conduit/MainActivity.kt b/android/app/src/main/kotlin/app/cogwheel/conduit/MainActivity.kt index ab2c0cd..5675718 100644 --- a/android/app/src/main/kotlin/app/cogwheel/conduit/MainActivity.kt +++ b/android/app/src/main/kotlin/app/cogwheel/conduit/MainActivity.kt @@ -10,23 +10,8 @@ class MainActivity : FlutterActivity() { private lateinit var backgroundStreamingHandler: BackgroundStreamingHandler override fun onCreate(savedInstanceState: Bundle?) { - // Enable edge-to-edge display for Android 15+ compatibility - // This ensures proper handling of system bars and insets - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { - // For Android 15+ (API 35), try to use enableEdgeToEdge if available - try { - // Use reflection to call EdgeToEdge.enable() for forward compatibility - val edgeToEdgeClass = Class.forName("androidx.activity.EdgeToEdge") - val enableMethod = edgeToEdgeClass.getMethod("enable", android.app.Activity::class.java) - enableMethod.invoke(null, this) - } catch (e: Exception) { - // Fallback to WindowCompat if EdgeToEdge is not available - WindowCompat.setDecorFitsSystemWindows(window, false) - } - } else { - // For older versions, use WindowCompat for backward compatibility - WindowCompat.setDecorFitsSystemWindows(window, false) - } + // Ensure content draws behind system bars (backwards compatible helper) + WindowCompat.setDecorFitsSystemWindows(window, false) super.onCreate(savedInstanceState) } @@ -45,4 +30,4 @@ class MainActivity : FlutterActivity() { backgroundStreamingHandler.cleanup() } } -} \ No newline at end of file +} diff --git a/android/app/src/main/res/values-v35/styles.xml b/android/app/src/main/res/values-v35/styles.xml index 85122a2..e286369 100644 --- a/android/app/src/main/res/values-v35/styles.xml +++ b/android/app/src/main/res/values-v35/styles.xml @@ -10,8 +10,7 @@ true always - @android:color/transparent - @android:color/transparent + false false @@ -25,9 +24,8 @@ ?android:colorBackground true - @android:color/transparent - @android:color/transparent + false false - \ No newline at end of file + diff --git a/lib/core/services/platform_service.dart b/lib/core/services/platform_service.dart index 4119cd4..56ac3dd 100644 --- a/lib/core/services/platform_service.dart +++ b/lib/core/services/platform_service.dart @@ -326,25 +326,21 @@ class PlatformService { statusBarIconBrightness: isDarkContent ? Brightness.dark : Brightness.light, + // iOS: it's safe to pass a color; leave behavior unchanged statusBarColor: backgroundColor, ), ); } else { - // For Android 15+, use edge-to-edge approach - // Avoid deprecated setStatusBarColor, setNavigationBarColor, setNavigationBarDividerColor + // Android: Avoid passing any bar colors to prevent invoking + // deprecated Window.setStatusBarColor / setNavigationBarColor / setNavigationBarDividerColor + // on Android 15+. Only control icon brightness; colors come from theme + EdgeToEdge. SystemChrome.setSystemUIOverlayStyle( SystemUiOverlayStyle( - // Only set icon brightness for edge-to-edge compatibility - statusBarIconBrightness: isDarkContent - ? Brightness.dark - : Brightness.light, - systemNavigationBarIconBrightness: isDarkContent - ? Brightness.dark - : Brightness.light, - // Use transparent colors for proper edge-to-edge display - statusBarColor: Colors.transparent, - systemNavigationBarColor: Colors.transparent, - systemNavigationBarDividerColor: Colors.transparent, + statusBarIconBrightness: + isDarkContent ? Brightness.dark : Brightness.light, + systemNavigationBarIconBrightness: + isDarkContent ? Brightness.dark : Brightness.light, + // Do NOT set status/navigation bar colors on Android. ), ); } diff --git a/lib/main.dart b/lib/main.dart index 37e1675..ee48c0f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'core/services/navigation_service.dart'; import 'core/widgets/error_boundary.dart'; @@ -23,6 +24,10 @@ import 'core/services/share_receiver_service.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); + // Enable edge-to-edge globally (back-compat on pre-Android 15) + // Pairs with Activity's EdgeToEdge.enable and our SafeArea usage. + await SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); + final sharedPrefs = await SharedPreferences.getInstance(); const secureStorage = FlutterSecureStorage();