diff --git a/android/app/src/main/res/drawable-nodpi/splash_android12_icon.png b/android/app/src/main/res/drawable-nodpi/splash_android12_icon.png new file mode 100644 index 0000000..0ba6084 Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/splash_android12_icon.png differ diff --git a/android/app/src/main/res/drawable-nodpi/splash_content.png b/android/app/src/main/res/drawable-nodpi/splash_content.png new file mode 100644 index 0000000..40530dc Binary files /dev/null and b/android/app/src/main/res/drawable-nodpi/splash_content.png differ diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml index 2995854..2ea5839 100644 --- a/android/app/src/main/res/drawable-v21/launch_background.xml +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -9,4 +9,12 @@ android:endColor="#FFFFFF" /> + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 2995854..2ea5839 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -9,4 +9,12 @@ android:endColor="#FFFFFF" /> + + + diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml new file mode 100644 index 0000000..a1d906e --- /dev/null +++ b/android/app/src/main/res/values-night-v31/styles.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml index 2bf52b9..1a6fccd 100644 --- a/android/app/src/main/res/values-night/styles.xml +++ b/android/app/src/main/res/values-night/styles.xml @@ -1,7 +1,7 @@ - diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml new file mode 100644 index 0000000..a1d906e --- /dev/null +++ b/android/app/src/main/res/values-v31/styles.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png index 9da19ea..3e0874b 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png index 9da19ea..5dc446b 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png index 9da19ea..40530dc 100644 Binary files a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard index 8ad8574..05972b4 100644 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -32,6 +32,6 @@ - + diff --git a/lib/main.dart b/lib/main.dart index 02d9bf3..720702b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -99,6 +99,7 @@ class _H5ShellPageState extends State { String? _loadError; bool _showShellCover = true; bool _shellBrandingLoaded = false; + Timer? _shellCoverFallbackTimer; late ShellBranding _shellBranding; @override @@ -112,6 +113,10 @@ class _H5ShellPageState extends State { WebViewController _buildController() { return WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..addJavaScriptChannel( + 'OpenIMShell', + onMessageReceived: _handleShellMessage, + ) ..setBackgroundColor(_shellBackground) ..setNavigationDelegate( NavigationDelegate( @@ -121,6 +126,7 @@ class _H5ShellPageState extends State { } }, onPageStarted: (_) { + _shellCoverFallbackTimer?.cancel(); if (mounted) { setState(() { _loadError = null; @@ -134,6 +140,7 @@ class _H5ShellPageState extends State { }, onWebResourceError: (error) { if (error.isForMainFrame ?? true) { + _shellCoverFallbackTimer?.cancel(); if (mounted) { setState(() { _loadError = error.description; @@ -147,6 +154,12 @@ class _H5ShellPageState extends State { ); } + @override + void dispose() { + _shellCoverFallbackTimer?.cancel(); + super.dispose(); + } + Future _runJavaScriptSafely(String source) async { try { await _controller.runJavaScript(source); @@ -165,9 +178,42 @@ class _H5ShellPageState extends State { if (mounted) { setState(() { _progress = 100; - _showShellCover = false; }); } + _scheduleShellCoverFallback(); + } + + void _handleShellMessage(JavaScriptMessage message) { + try { + final decoded = jsonDecode(message.message); + if (decoded is Map && decoded['type'] == 'first-screen-ready') { + _hideShellCover(); + } + } catch (_) { + if (message.message == 'first-screen-ready') { + _hideShellCover(); + } + } + } + + void _scheduleShellCoverFallback() { + _shellCoverFallbackTimer?.cancel(); + _shellCoverFallbackTimer = Timer( + const Duration(seconds: 4), + _hideShellCover, + ); + } + + void _hideShellCover() { + _shellCoverFallbackTimer?.cancel(); + if (!mounted || !_showShellCover) { + return; + } + + setState(() { + _progress = 100; + _showShellCover = false; + }); } Future _loadShellBrandingIfNeeded() async { @@ -212,6 +258,7 @@ class _H5ShellPageState extends State { final targetUrl = AppConfig.canonicalizeMainFrameUrl(url); if (mounted) { + _shellCoverFallbackTimer?.cancel(); setState(() { _loadError = null; _progress = 0;