fix: ensure epub content does not go behind in-screen cameras #3
1 changed files with 29 additions and 16 deletions
|
|
@ -2,6 +2,7 @@ import 'dart:async';
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||
import 'package:flutter_epub_viewer/flutter_epub_viewer.dart';
|
||||
|
|
@ -74,6 +75,9 @@ class _EpubReaderScreenState extends ConsumerState<EpubReaderScreen> {
|
|||
|
||||
// Keep screen awake while reading
|
||||
WakelockPlus.enable();
|
||||
|
||||
// Enter immersive mode to hide system bars (matching image reader behavior)
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
|
||||
}
|
||||
|
||||
Future<void> _loadEpub() async {
|
||||
|
|
@ -476,22 +480,24 @@ class _EpubReaderScreenState extends ConsumerState<EpubReaderScreen> {
|
|||
const minWidthForDualPage = 768.0;
|
||||
final shouldUseDualPage = screenWidth >= minWidthForDualPage;
|
||||
|
||||
return EpubViewer(
|
||||
key: ValueKey(
|
||||
'$_viewerKey-${shouldUseDualPage ? "dual" : "single"}'), // Include spread in key to force recreation
|
||||
epubController: _epubController!,
|
||||
epubSource: EpubSource.fromFile(_epubFile!),
|
||||
initialCfi: _initialCfi,
|
||||
displaySettings: _buildDisplaySettings(orientation),
|
||||
onEpubLoaded: () {
|
||||
debugPrint('EPUB loaded successfully');
|
||||
},
|
||||
onChaptersLoaded: _handleChaptersLoaded,
|
||||
onRelocated: _handleRelocated,
|
||||
onTextSelected: (selection) {
|
||||
// Future: Handle text selection for highlights/notes
|
||||
debugPrint('Selected: ${selection.selectedText}');
|
||||
},
|
||||
return SafeArea(
|
||||
child: EpubViewer(
|
||||
key: ValueKey(
|
||||
'$_viewerKey-${shouldUseDualPage ? "dual" : "single"}'), // Include spread in key to force recreation
|
||||
epubController: _epubController!,
|
||||
epubSource: EpubSource.fromFile(_epubFile!),
|
||||
initialCfi: _initialCfi,
|
||||
displaySettings: _buildDisplaySettings(orientation),
|
||||
onEpubLoaded: () {
|
||||
debugPrint('EPUB loaded successfully');
|
||||
},
|
||||
onChaptersLoaded: _handleChaptersLoaded,
|
||||
onRelocated: _handleRelocated,
|
||||
onTextSelected: (selection) {
|
||||
// Future: Handle text selection for highlights/notes
|
||||
debugPrint('Selected: ${selection.selectedText}');
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
|
|
@ -646,8 +652,10 @@ class _EpubReaderScreenState extends ConsumerState<EpubReaderScreen> {
|
|||
});
|
||||
|
||||
if (_showAppBar) {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
||||
_startAutoHideTimer();
|
||||
} else {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
|
||||
_cancelAutoHideTimer();
|
||||
}
|
||||
}
|
||||
|
|
@ -660,6 +668,7 @@ class _EpubReaderScreenState extends ConsumerState<EpubReaderScreen> {
|
|||
setState(() {
|
||||
_showAppBar = false;
|
||||
});
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -676,6 +685,7 @@ class _EpubReaderScreenState extends ConsumerState<EpubReaderScreen> {
|
|||
setState(() {
|
||||
_showAppBar = false;
|
||||
});
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
|
||||
}
|
||||
|
||||
/// Build custom app bar overlay
|
||||
|
|
@ -796,6 +806,9 @@ class _EpubReaderScreenState extends ConsumerState<EpubReaderScreen> {
|
|||
// Allow screen to sleep again
|
||||
WakelockPlus.disable();
|
||||
|
||||
// Restore system UI bars when leaving the reader
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
||||
|
||||
// Clean up WebView resources to prevent OOM crashes
|
||||
// The EpubController holds a reference to the InAppWebViewController
|
||||
// which needs to be properly disposed
|
||||
|
|
|
|||
Loading…
Reference in a new issue