15
15
import androidx .activity .result .contract .ActivityResultContracts ;
16
16
import androidx .annotation .NonNull ;
17
17
import androidx .fragment .app .FragmentManager ;
18
+ import androidx .fragment .app .FragmentTransaction ;
18
19
import androidx .lifecycle .Lifecycle ;
19
20
import androidx .lifecycle .Observer ;
20
21
import androidx .lifecycle .ViewModelProvider ;
40
41
import io .literal .lib .WebEvent ;
41
42
import io .literal .lib .WebRoutes ;
42
43
import io .literal .model .Annotation ;
44
+ import io .literal .model .SourceInitializationStatus ;
43
45
import io .literal .model .SourceWebViewAnnotation ;
44
46
import io .literal .model .User ;
45
47
import io .literal .repository .AnalyticsRepository ;
@@ -63,6 +65,7 @@ public class MainActivity extends InstrumentedActivity {
63
65
private SourceWebViewViewModel sourceWebViewViewModelBottomSheet ;
64
66
private AuthenticationViewModel authenticationViewModel ;
65
67
private AppWebView appWebViewPrimaryFragment = null ;
68
+
66
69
private final BroadcastReceiver annotationCreatedBroadcastReceiver = new BroadcastReceiver () {
67
70
@ Override
68
71
public void onReceive (Context context , Intent intent ) {
@@ -84,6 +87,7 @@ public void onReceive(Context context, Intent intent) {
84
87
};
85
88
private SourceWebView sourceWebViewBottomSheetFragment = null ;
86
89
private AppWebView appWebViewBottomSheetFragment = null ;
90
+ private Observer <SourceInitializationStatus > sourceInitializationStatusObserver ;
87
91
private final ActivityResultLauncher <Intent > createAnnotationFromSourceLauncher = registerForActivityResult (new ActivityResultContracts .StartActivityForResult (), MainActivity .this ::handleCreateAnnotationFromSourceResult );
88
92
89
93
@ Override
@@ -185,23 +189,38 @@ private CompletableFuture<User> initializeViewModel() {
185
189
.ifPresent ((s ) -> {
186
190
if (displayBottomSheet ) {
187
191
sourceWebViewViewModelBottomSheet .getBottomSheetBehavior ().ifPresent (b -> b .setState (BottomSheetBehavior .STATE_EXPANDED ));
192
+
193
+ SourceInitializationStatus sourceInitializationStatus = sourceWebViewViewModelBottomSheet .getSourceInitializationStatus ().getValue ();
188
194
// Source wil already be initialized if it was previously accessed or it may have loaded in a previous call where `displayBottomSheet` was false.
189
- if (sourceWebViewViewModelBottomSheet . getSourceHasFinishedInitializing (). getValue ( )) {
195
+ if (sourceInitializationStatus . equals ( SourceInitializationStatus . INITIALIZED )) {
190
196
appWebViewViewModelBottomSheet .setBottomSheetState (BottomSheetBehavior .STATE_COLLAPSED );
191
197
boolean javascriptEnabled = Optional .ofNullable (sourceWebViewViewModelBottomSheet ).map ((vm ) -> vm .getSourceJavaScriptConfig ().getValue ().isEnabled ()).orElse (true );
192
198
if (!javascriptEnabled ) {
193
199
ToastRepository .show (this , R .string .toast_javascript_disabled , ToastRepository .STYLE_DARK_ACCENT );
194
200
}
201
+ } else if (sourceInitializationStatus .equals (SourceInitializationStatus .FAILED )) {
202
+ ToastRepository .show (this , R .string .toast_annotation_renderer_failed_to_initialize , ToastRepository .STYLE_DARK_ACCENT );
195
203
} else {
196
- sourceWebViewViewModelBottomSheet .getSourceHasFinishedInitializing ().observe (this , new Observer <Boolean >() {
204
+ if (sourceInitializationStatusObserver != null ) {
205
+ sourceWebViewViewModelBottomSheet .getSourceInitializationStatus ().removeObserver (sourceInitializationStatusObserver );
206
+ }
207
+ sourceInitializationStatusObserver = new Observer <SourceInitializationStatus >() {
197
208
@ Override
198
- public void onChanged (Boolean sourceHasFinishedInitializing ) {
199
- if (sourceHasFinishedInitializing ) {
200
- sourceWebViewViewModelBottomSheet .getSourceHasFinishedInitializing ().removeObserver (this );
209
+ public void onChanged (SourceInitializationStatus sourceInitializationStatus ) {
210
+ int sourceWebViewBottomSheetState = sourceWebViewViewModelBottomSheet .getBottomSheetBehavior ()
211
+ .map (BottomSheetBehavior ::getState )
212
+ .orElse (BottomSheetBehavior .STATE_HIDDEN );
213
+
214
+ if (sourceInitializationStatus .equals (SourceInitializationStatus .INITIALIZED ) && sourceWebViewBottomSheetState != BottomSheetBehavior .STATE_HIDDEN ) {
201
215
appWebViewViewModelBottomSheet .setBottomSheetState (BottomSheetBehavior .STATE_COLLAPSED );
202
216
}
217
+
218
+ if (sourceInitializationStatus .equals (SourceInitializationStatus .INITIALIZED ) || sourceInitializationStatus .equals (SourceInitializationStatus .FAILED )) {
219
+ sourceWebViewViewModelBottomSheet .getSourceInitializationStatus ().removeObserver (this );
220
+ }
203
221
}
204
- });
222
+ };
223
+ sourceWebViewViewModelBottomSheet .getSourceInitializationStatus ().observe (this , sourceInitializationStatusObserver );
205
224
}
206
225
}
207
226
});
@@ -286,13 +305,23 @@ private void commitFragments(Bundle savedInstanceState, String initialUrl, User
286
305
this .handleCreateAnnotationFromSource (sourceUrl .toString ());
287
306
});
288
307
289
- getSupportFragmentManager ()
308
+ FragmentTransaction fragmentTransaction = getSupportFragmentManager ()
290
309
.beginTransaction ()
291
- .setReorderingAllowed (true )
292
- .add (R .id .fragment_container , appWebViewPrimaryFragment )
293
- .add (R .id .source_web_view_bottom_sheet_fragment_container , sourceWebViewBottomSheetFragment )
294
- .add (R .id .app_web_view_bottom_sheet_fragment_container , appWebViewBottomSheetFragment )
295
- .commit ();
310
+ .setReorderingAllowed (true );
311
+
312
+ if (!appWebViewPrimaryFragment .isAdded ()) {
313
+ fragmentTransaction .add (R .id .fragment_container , appWebViewPrimaryFragment );
314
+ }
315
+ if (!sourceWebViewBottomSheetFragment .isAdded ()) {
316
+ fragmentTransaction .add (R .id .source_web_view_bottom_sheet_fragment_container , sourceWebViewBottomSheetFragment );
317
+ }
318
+ if (!appWebViewBottomSheetFragment .isAdded ()) {
319
+ fragmentTransaction .add (R .id .app_web_view_bottom_sheet_fragment_container , appWebViewBottomSheetFragment );
320
+ }
321
+
322
+ if (!fragmentTransaction .isEmpty ()) {
323
+ fragmentTransaction .commit ();
324
+ }
296
325
}
297
326
298
327
private void handleCreateAnnotationFromSource (String sourceUrl ) {
0 commit comments