@@ -19,8 +19,8 @@ module.exports = function prepareImmersiveFullscreen(context) {
1919 const original = fs . readFileSync ( webViewPath , "utf8" ) ;
2020 const newline = original . includes ( "\r\n" ) ? "\r\n" : "\n" ;
2121
22- // Rebuild our blocks on every prepare, including when only the controller
23- // changes. No stale version flag and no duplicate fields or lifecycle calls .
22+ // Markers delimit our generated blocks so each prepare can replace them safely,
23+ // including when only the controller changes .
2424 let source = original
2525 . replace ( / \r \n / g, "\n" )
2626 . replace (
@@ -33,7 +33,7 @@ module.exports = function prepareImmersiveFullscreen(context) {
3333 ) ;
3434 }
3535
36- function insert ( name , anchor , lines , before = false ) {
36+ function insert ( name , anchor , code , before = false ) {
3737 const matches = [ ...source . matchAll ( new RegExp ( anchor . source , "gm" ) ) ] ;
3838 if ( matches . length !== 1 ) {
3939 throw new Error (
@@ -43,7 +43,7 @@ module.exports = function prepareImmersiveFullscreen(context) {
4343 const indent = matches [ 0 ] [ 1 ] ;
4444 const block = [
4545 `// ACODE_FULLSCREEN_BEGIN ${ name } ` ,
46- ...lines ,
46+ ...code . trim ( ) . split ( "\n" ) ,
4747 `// ACODE_FULLSCREEN_END ${ name } ` ,
4848 ]
4949 . map ( ( line ) => indent + line )
@@ -53,94 +53,102 @@ module.exports = function prepareImmersiveFullscreen(context) {
5353 ) ;
5454 }
5555
56- insert ( "field" , / ^ ( [ \t ] * ) p r i v a t e V i e w m C u s t o m V i e w ; [ \t ] * $ / m, [
57- "private ImmersiveFullscreen immersiveFullscreen;" ,
58- "private boolean fullscreenPaused;" ,
59- "private boolean fullscreenBackHandlerEnabled;" ,
60- "" ,
61- "public void setFullscreenBackHandler(boolean enabled) {" ,
62- " if (enabled && (mCustomView == null || !mCustomView.isAttachedToWindow() || fullscreenPaused)) {" ,
63- ' throw new IllegalStateException("Back handler requires foreground fullscreen.");' ,
64- " }" ,
65- " fullscreenBackHandlerEnabled = enabled;" ,
66- "}" ,
67- "" ,
68- "// Called on the UI thread by Acode's System plugin. null releases the override." ,
69- "public void setFullscreenOrientation(String orientation) {" ,
70- " if (orientation == null) {" ,
71- " if (immersiveFullscreen != null) immersiveFullscreen.unlockOrientation();" ,
72- " return;" ,
73- " }" ,
74- " if (immersiveFullscreen == null) {" ,
75- ' throw new IllegalStateException("Orientation requires foreground fullscreen.");' ,
76- " }" ,
77- " immersiveFullscreen.lockOrientation(orientation);" ,
78- "}" ,
79- ] ) ;
56+ // System calls these setters on the UI thread; null releases the orientation override.
57+ insert (
58+ "field" ,
59+ / ^ ( [ \t ] * ) p r i v a t e V i e w m C u s t o m V i e w ; [ \t ] * $ / m,
60+ `
61+ private ImmersiveFullscreen immersiveFullscreen;
62+ private boolean fullscreenPaused;
63+ private boolean fullscreenBackHandlerEnabled;
64+
65+ public void setFullscreenBackHandler(boolean enabled) {
66+ if (enabled && (mCustomView == null || !mCustomView.isAttachedToWindow() || fullscreenPaused)) {
67+ throw new IllegalStateException("Back handler requires foreground fullscreen.");
68+ }
69+ fullscreenBackHandlerEnabled = enabled;
70+ }
71+
72+ public void setFullscreenOrientation(String orientation) {
73+ if (orientation == null) {
74+ if (immersiveFullscreen != null) immersiveFullscreen.unlockOrientation();
75+ return;
76+ }
77+ if (immersiveFullscreen == null) {
78+ throw new IllegalStateException("Orientation requires foreground fullscreen.");
79+ }
80+ immersiveFullscreen.lockOrientation(orientation);
81+ }
82+ ` ,
83+ ) ;
84+ // CoreAndroid's message channel accepts only Cordova's built-in events.
8085 insert (
8186 "back" ,
8287 / (?< = i f \( i s B a c k B u t t o n & & m C u s t o m V i e w ! = n u l l \) \{ \n ) ^ ( [ \t ] * ) h i d e C u s t o m V i e w \( \) ; \n [ \t ] * r e t u r n t r u e ; [ \t ] * $ / m,
83- [
84- "if (fullscreenBackHandlerEnabled) {" ,
85- // CoreAndroid's message channel accepts only Cordova's built-in events.
86- ` engine.evaluateJavascript("cordova.fireDocumentEvent('fullscreenbackbutton');", null);` ,
87- " return true;" ,
88- "}" ,
89- ] ,
88+ `
89+ if (fullscreenBackHandlerEnabled) {
90+ engine.evaluateJavascript("cordova.fireDocumentEvent('fullscreenbackbutton');", null);
91+ return true;
92+ }
93+ ` ,
9094 true ,
9195 ) ;
92- insert ( "enter" , / ^ ( [ \t ] * ) p a r e n t \. b r i n g T o F r o n t \( \) ; [ \t ] * $ / m, [
93- "fullscreenBackHandlerEnabled = false;" ,
94- "immersiveFullscreen = new ImmersiveFullscreen(cordova.getActivity(), !fullscreenPaused, () -> fullscreenBackHandlerEnabled = false);" ,
95- "immersiveFullscreen.enter(wrapperView);" ,
96- ] ) ;
96+ insert (
97+ "enter" ,
98+ / ^ ( [ \t ] * ) p a r e n t \. b r i n g T o F r o n t \( \) ; [ \t ] * $ / m,
99+ `
100+ fullscreenBackHandlerEnabled = false;
101+ immersiveFullscreen = new ImmersiveFullscreen(cordova.getActivity(), !fullscreenPaused, () -> fullscreenBackHandlerEnabled = false);
102+ immersiveFullscreen.enter(wrapperView);
103+ ` ,
104+ ) ;
97105 insert (
98106 "exit" ,
99107 / ^ ( [ \t ] * ) m C u s t o m V i e w \. s e t V i s i b i l i t y \( V i e w \. G O N E \) ; [ \t ] * $ / m,
100- [
101- " fullscreenBackHandlerEnabled = false;" ,
102- " if (immersiveFullscreen != null) {" ,
103- " immersiveFullscreen.exit();" ,
104- " immersiveFullscreen = null;" ,
105- "}" ,
106- ] ,
108+ `
109+ fullscreenBackHandlerEnabled = false;
110+ if (immersiveFullscreen != null) {
111+ immersiveFullscreen.exit();
112+ immersiveFullscreen = null;
113+ }
114+ ` ,
107115 true ,
108116 ) ;
109117 insert (
110118 "pause" ,
111119 / ^ ( [ \t ] * ) p l u g i n M a n a g e r \. o n P a u s e \( k e e p R u n n i n g \) ; [ \t ] * $ / m,
112- [
113- " fullscreenPaused = true;" ,
114- " if (immersiveFullscreen != null) immersiveFullscreen.pause();" ,
115- ] ,
120+ `
121+ fullscreenPaused = true;
122+ if (immersiveFullscreen != null) immersiveFullscreen.pause();
123+ ` ,
116124 true ,
117125 ) ;
118126 insert (
119127 "resume" ,
120128 / ^ ( [ \t ] * ) t h i s \. p l u g i n M a n a g e r \. o n R e s u m e \( k e e p R u n n i n g \) ; [ \t ] * $ / m,
121- [
122- " fullscreenPaused = false;" ,
123- " if (immersiveFullscreen != null) immersiveFullscreen.resume();" ,
124- ] ,
129+ `
130+ fullscreenPaused = false;
131+ if (immersiveFullscreen != null) immersiveFullscreen.resume();
132+ ` ,
125133 true ,
126134 ) ;
127135 insert (
128136 "reset" ,
129137 / ^ ( [ \t ] * ) p l u g i n M a n a g e r \. o n R e s e t \( \) ; [ \t ] * $ / m,
130- [
131- " fullscreenBackHandlerEnabled = false;" ,
132- " if (immersiveFullscreen != null) immersiveFullscreen.unlockOrientation();" ,
133- ] ,
138+ `
139+ fullscreenBackHandlerEnabled = false;
140+ if (immersiveFullscreen != null) immersiveFullscreen.unlockOrientation();
141+ ` ,
134142 true ,
135143 ) ;
144+ // Release fullscreen while the WebView and its callback are still alive.
136145 insert (
137146 "destroy" ,
138147 / ^ ( [ \t ] * ) e n g i n e \. d e s t r o y \( \) ; [ \t ] * $ / m,
139- [
140- "// Release fullscreen while the WebView and its callback are still alive." ,
141- "fullscreenBackHandlerEnabled = false;" ,
142- "hideCustomView();" ,
143- ] ,
148+ `
149+ fullscreenBackHandlerEnabled = false;
150+ hideCustomView();
151+ ` ,
144152 true ,
145153 ) ;
146154
0 commit comments