aad_b2c_webview icon indicating copy to clipboard operation
aad_b2c_webview copied to clipboard

Occasional white screen

Open IvorNorval opened this issue 1 year ago • 0 comments

I am using ADB2CEmbedWebView to login in a Flutter app. Occasionally the url is not reached and the app is just showing a white screen. This mostly happens running the app in Android Studio.

Before I run ADB2CEmbedWebView I lookup the url's dns to ensure it can be reached and then only run ADB2CEmbedWebView.

Can someone please let me know how to catch the exception or fix it?

import 'dart:async';

import 'package:aad_b2c_webview/aad_b2c_webview.dart';
import 'package:dnsolve/dnsolve.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:logger/logger.dart';
import 'package:mhrm/constants/app_colors.dart';
import 'package:mhrm/constants/app_constants.dart';
import 'package:mhrm/constants/typography.dart';
import 'package:mhrm/navigation/navigation_utils.dart';
import 'package:mhrm/providers/notifiers_provider.dart';
import 'package:mhrm/services/notifiers/auth/states/auth_state.dart';
import 'package:mhrm/utils/app_localizations.dart';
import 'package:mhrm/widgets/generic/dialog/one_button_popup.dart';

class LoginPage extends ConsumerStatefulWidget {
  const LoginPage({super.key});

  @override
  ConsumerState<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends ConsumerState<LoginPage> {
  final Logger _logger = Logger();
  String? _userToken;
  late Timer _watchdogTimer;
  late Timer _reloadTimer;
  int _count = 0;
  bool _canReach = false;

  onRedirect(BuildContext context) async {
    _logger.d('LoginPage onRedirect ');
    var token = _userToken ?? "";
    await ref.read(authProvider.notifier).setAccessToken(token);
  }

  onRefreshToken(Token token) async {
    _logger.d('LoginPage onRefreshToken ');
    await ref.read(authProvider.notifier).setRefreshToken(token.value);
  }

  backToSplash() {
    _watchdogTimer.cancel();
    Future.delayed(Duration.zero, () {
      GoRouter.of(context).go(splashPath);
    });
  }

  reloadLogin() {
    Future.delayed(Duration.zero, () {
      GoRouter.of(context).go(loginPath);
    });
  }

  @override
  void initState() {
    _watchdogTimer = Timer(const Duration(seconds: 300), () {
      _logger.d('LoginPage timeout');
      backToSplash();
    });
    _reloadTimer = Timer(const Duration(milliseconds: 500), () {
      _logger.d('LoginPage Reload');
      reloadLogin();
    });
    super.initState();
  }

  @override
  void dispose() {
    _watchdogTimer.cancel();
    _reloadTimer.cancel();
    super.dispose();
  }

  Future<void> dNSolve() async {
    ResolveResponse response = await dnsLookup();

    if (response.answer!.records != null) {
      for (final record in response.answer!.records!) {
        _logger.d('LoginPage DNS resolved ${record.toBind}');
      }
      setState(() {
        _canReach = true;
      });
    } else {
      _logger.d('LoginPage $_count try DNS could not be resolved!! ');
      setState(() {
        _count++;
        _canReach = false;
      });
    }
  }

  Future<ResolveResponse> dnsLookup() async {
    final dnSolve = DNSolve();
    return await dnSolve.lookup(
      //'dgsgd',
      'https://mhrb2cdev.b2clogin.com',
      dnsSec: true,
      type: RecordType.srv,
    );
  }

  @override
  Widget build(BuildContext context) {
    final localizations = AppLocalizations.of(context);
    final AuthState authState = ref.watch(authProvider);
    if (_count < 4 && !_canReach) {
      dNSolve();
      if (_count >= 3) {
        Future.delayed(Duration.zero, () {
          OneButtonPopup.showPopupDialog(
            context: context,
            heading: localizations.translate('dns_error'),
            buttonString: localizations.translate('reload'),
            onButton: () {},
            body: Text(
              localizations.translate('dns_error_info'),
              style: TypeScale.s12w500grey8x404040,
            ),
          );
          backToSplash();
        });
      }
    }

    if (authState.isAuthenticated) {
      _watchdogTimer.cancel();
      Future.delayed(Duration.zero, () {
        GoRouter.of(context).go(homePath);
      });
    }
    if (_canReach) {
      return Scaffold(
        body: Column(
          children: [
            Expanded(
              child: ADB2CEmbedWebView(
                tenantBaseUrl: AppConstants.aadB2CUserAuthFlow,
                userFlowName: AppConstants.aadB2CUserFlowName,
                clientId: AppConstants.aadB2CClientID,
                redirectUrl: AppConstants.aadB2CRedirectURL,
                scopes: AppConstants.aadB2CScopes,
                onAnyTokenRetrieved: (Token anyToken) {
                  _logger.d('LoginPage onAnyTokenRetrieved type ${anyToken.type}');
                },
                onIDToken: (Token token) {
                  _logger.d('LoginPage onIDToken type ${token.type}');
                  _userToken = token.value;
                },
                onAccessToken: (Token token) {
                  _logger.d('LoginPage onAccessToken type ${token.type}');
                },
                onRefreshToken: onRefreshToken,
                onErrorOrCancel: (context) {
                  _logger.d('LoginPage ADB2CEmbedWebView onErrorOrCancel');
                  backToSplash();
                },
                optionalParameters: const [],
                onRedirect: onRedirect,
              ),
            ),
            ElevatedButton(
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(
                  AppColors.grey6x737373,
                ),
                shadowColor: MaterialStateProperty.all(
                  AppColors.grey2xD9D9D9,
                ),
                elevation: MaterialStateProperty.all<double>(0),
              ),
              onPressed: () {
                backToSplash();
              },
              child: Text(
                localizations.translate('reload_login_page'),
                style: TypeScale.s12w500white,
              ),
            ),
          ],
        ),
      );
    } else {
      return Container(
        decoration: const BoxDecoration(
          image: DecorationImage(
            image: AssetImage("assets/images/login_background.jpg"),
            fit: BoxFit.cover,
          ),
        ),
        child: Column(
          children: [
            const SizedBox(
              height: 142,
            ),
            Image.asset(
              "assets/images/logo/logo.png",
              fit: BoxFit.cover,
              width: 232,
              height: 155,
            ),
          ],
        ),
      );
    }
  }
}

I/flutter (17740): │ #0 AADB2CAuthService.refreshAuthToken (package:mhrm/services/auth/aadb2c_auth_service.dart:258:12) I/flutter (17740): │ #1

I/flutter (17740): │ 🐛 refreshAuthToken ServiceResult.success(authTokenResponse.idToken!)

I/ViewRootImpl@ca848a1MainActivity: ViewPostIme pointer 0 I/ViewRootImpl@ca848a1MainActivity: ViewPostIme pointer 1 [GoRouter] going to /login W/WindowOnBackDispatcher(17740): sendCancelIfRunning: isInProgress=falsecallback=io.flutter.embedding.android.FlutterActivity$1@ed8ff44

I/flutter (17740): │ #0 _LoginPageState.initState. (package:mhrm/screens/login/login_screen.dart:64:15) I/flutter (17740): │ #1 Timer._createTimer. (dart:async-patch/timer_patch.dart:18:15)

I/flutter (17740): │ 🐛 LoginPage Reload

[GoRouter] going to /login

I/flutter (17740): │ #0 _LoginPageState.dNSolve (package:mhrm/screens/login/login_screen.dart:82:17) I/flutter (17740): │ #1

I/flutter (17740): │ 🐛 LoginPage DNS resolved https://mhrb2cdev.b2clogin.com. 300 IN CNAME "prda.aadg.msidentity.com."

I/flutter (17740): │ #0 _LoginPageState.dNSolve (package:mhrm/screens/login/login_screen.dart:82:17) I/flutter (17740): │ #1

I/flutter (17740): │ 🐛 LoginPage DNS resolved prda.aadg.msidentity.com. 9 IN CNAME "www.tm.a.prd.aadg.akadns.net."

W/ziparchive(17740): Unable to open '/data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.dm': No such file or directory W/ziparchive(17740): Unable to open '/data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.dm': No such file or directory W/mhrmpanelmember(17740): Entry not found D/nativeloader(17740): Configuring clns-5 for other apk /data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.apk. target_sdk_version=34, uses_libraries=ALL, library_path=/data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/lib/arm64:/data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/base.apk!/lib/arm64-v8a:/data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.apk!/lib/arm64-v8a, permitted_path=/data:/mnt/expand D/nativeloader(17740): Extending system_exposed_libraries: libaudiomirroring_jni.audiomirroring.samsung.so:lib.engmodejni.samsung.so:libheifcapture_jni.media.samsung.so:libjpegsq.media.samsung.so:libslljpeg.media.samsung.so:libsemimagecrop_jni.media.samsung.so:libsimba.media.samsung.so:libamDNN.media.samsung.so:libamDNN.media.samsung.so:libapex_motionphoto_utils_jni.media.samsung.so:libsume_mediabuffer_jni.media.samsung.so:libSlowShutter_jni.media.samsung.so:libapex_jni.media.samsung.so:libsume_jni.media.samsung.so:libneural.snap.samsung.so:libsecuresnap_aidl.snap.samsung.so:libsnap_aidl.snap.samsung.so:libeden_rt_stub.edensdk.samsung.so:libSDKRecognitionOCR.spenocr.samsung.so:libSDKMoireDetector.spenocr.samsung.so:libtensorflowlite_c.spenocr.samsung.so:libSFEffect.fonteffect.samsung.so:libperfsdk.performance.samsung.so:libvesgraphicframework.videoeditor.samsung.so:libvesinterface.videoeditor.samsung.so:libvesframework.videoeditor.samsung.so:libveframework.videoeditor.samsung.so:lib_vnd_client.dk.samsung.so:lib_native_client.dk.sa D/nativeloader(17740): Configuring clns-6 for other apk /data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/base.apk. target_sdk_version=34, uses_libraries=, library_path=/data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/lib/arm64:/data/app/~~DQlDmqjEPDgxDA_qXa2JGA==/com.google.android.webview-ZbwGemP2oeVUcabVu4t7EQ==/base.apk!/lib/arm64-v8a:/data/app/~~IGlevzahHjeBRxkXyjMtMA==/com.google.android.trichromelibrary_636705433-6hI3TlGcTqglbAKrVN1oAg==/base.apk!/lib/arm64-v8a, permitted_path=/data:/mnt/expand I/WebViewFactory(17740): Loading com.google.android.webview version 124.0.6367.54 (code 636705433) I/cr_WVCFactoryProvider(17740): Loaded version=124.0.6367.54 minSdkVersion=29 isBundle=true multiprocess=true packageId=2 I/chromium(17740): [0422/083738.202748:INFO:variations_seed_loader.cc(66)] Failed to open file for reading.: No such file or directory (2) I/cr_LibraryLoader(17740): Successfully loaded native library I/cr_CachingUmaRecorder(17740): Flushed 6 samples from 6 histograms, 0 samples were dropped. I/cr_CombinedPProvider(17740): #registerProvider() provider:WV.V7@eb97547 isPolicyCacheEnabled:false policyProvidersSize:0 I/cr_PolicyProvider(17740): #setManagerAndSource() 0 I/cr_CombinedPProvider(17740): #linkNativeInternal() 1 I/cr_AppResProvider(17740): #getApplicationRestrictionsFromUserManager() Bundle[EMPTY_PARCEL] I/cr_PolicyProvider(17740): #notifySettingsAvailable() 0 I/cr_CombinedPProvider(17740): #onSettingsAvailable() 0 I/cr_CombinedPProvider(17740): #flushPolicies() D/CompatibilityChangeReporter(17740): Compat change id reported: 214741472; UID 10542; state: ENABLED D/CompatibilityChangeReporter(17740): Compat change id reported: 171228096; UID 10542; state: ENABLED

D/ConnectivityManager(17740): StackLog: [android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4401)] [android.net.ConnectivityManager.registerDefaultNetworkCallbackForUid(ConnectivityManager.java:4965)] [android.net.ConnectivityManager.registerDefaultNetworkCallback(ConnectivityManager.java:4932)] [WV.mD.e(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:44)] [WV.mD.b(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:1)] [org.chromium.android_webview.AwContentsLifecycleNotifier.onFirstWebViewCreated(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:22)] [J.N.MFiR_zHY(Native Method)] [org.chromium.android_webview.AwContents.(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:450)] [com.android.webview.chromium.j.run(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:147)] [WV.WY.b(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:20)] [WV.VY.run(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:3)] [org.chromium.base.task.PostTask.d(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:11)] [WV.WY.a(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:23)] [com.android.webview.chromium.WebViewChromiumFactoryProvider.a(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:3)] [com.android.webview.chromium.WebViewChromium.init(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:327)] [android.webkit.WebView.(WebView.java:444)] [android.webkit.WebView.(WebView.java:364)] [android.webkit.WebView.(WebView.java:346)] [android.webkit.WebView.(WebView.java:333)] [android.webkit.WebView.(WebView.java:323)] [io.flutter.plugins.webviewflutter.WebViewHostApiImpl$WebViewPlatformView.(WebViewHostApiImpl.java:109)] [io.flutter.plugins.webviewflutter.WebViewHostApiImpl$WebViewPlatformView.(WebViewHostApiImpl.java:96)] [io.flutter.plugins.webviewflutter.WebViewHostApiImpl$WebViewProxy.createWebView(WebViewHostApiImpl.java:55)] [io.flutter.plugins.webviewflutter.WebViewHostApiImpl.create(WebViewHostApiImpl.java:237)] [io.flutter.plugins.webviewflutter.GeneratedAndroidWebView$WebViewHostApi$-CC.lambda$setup$0(GeneratedAndroidWebView.java:1004)] [io.flutter.plugins.webviewflutter.GeneratedAndroidWebView$WebViewHostApi$$ExternalSyntheticLambda0.onMessage(Unknown Source:2)] [io.flutter.plugin.common.BasicMessageChannel$IncomingMessageHandler.onMessage(BasicMessageChannel.java:261)] [io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)] [io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)] [io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)]

D/ConnectivityManager(17740): StackLog: [android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4401)] [android.net.ConnectivityManager.sendRequestForNetwork(ConnectivityManager.java:4443)] [android.net.ConnectivityManager.registerNetworkCallback(ConnectivityManager.java:4825)] [WV.mD.e(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:93)] [WV.mD.b(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:1)] [org.chromium.android_webview.AwContentsLifecycleNotifier.onFirstWebViewCreated(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:22)] [J.N.MFiR_zHY(Native Method)] [org.chromium.android_webview.AwContents.(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:450)] [com.android.webview.chromium.j.run(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:147)] [WV.WY.b(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:20)] [WV.VY.run(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:3)] [org.chromium.base.task.PostTask.d(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:11)] [WV.WY.a(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:23)] [com.android.webview.chromium.WebViewChromiumFactoryProvider.a(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:3)] [com.android.webview.chromium.WebViewChromium.init(chromium-TrichromeWebViewGoogle6432.aab-stable-636705433:327)] [android.webkit.WebView.(WebView.java:444)] [android.webkit.WebView.(WebView.java:364)] [android.webkit.WebView.(WebView.java:346)] [android.webkit.WebView.(WebView.java:333)] [android.webkit.WebView.(WebView.java:323)] [io.flutter.plugins.webviewflutter.WebViewHostApiImpl$WebViewPlatformView.(WebViewHostApiImpl.java:109)] [io.flutter.plugins.webviewflutter.WebViewHostApiImpl$WebViewPlatformView.(WebViewHostApiImpl.java:96)] [io.flutter.plugins.webviewflutter.WebViewHostApiImpl$WebViewProxy.createWebView(WebViewHostApiImpl.java:55)] [io.flutter.plugins.webviewflutter.WebViewHostApiImpl.create(WebViewHostApiImpl.java:237)] [io.flutter.plugins.webviewflutter.GeneratedAndroidWebView$WebViewHostApi$-CC.lambda$setup$0(GeneratedAndroidWebView.java:1004)] [io.flutter.plugins.webviewflutter.GeneratedAndroidWebView$WebViewHostApi$$ExternalSyntheticLambda0.onMessage(Unknown Source:2)] [io.flutter.plugin.common.BasicMessageChannel$IncomingMessageHandler.onMessage(BasicMessageChannel.java:261)] [io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)] [io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)] [io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)] W/cr_media(17740): BLUETOOTH_CONNECT permission is missing. W/cr_media(17740): registerBluetoothIntentsIfNeeded: Requires BLUETOOTH permission I/PlatformViewsController(17740): Hosting view in view hierarchy for platform view: 0 I/PlatformViewsController(17740): PlatformView is using ImageReader backend D/CompatibilityChangeReporter(17740): Compat change id reported: 236825255; UID 10542; state: DISABLED D/CompatibilityChangeReporter(17740): Compat change id reported: 193247900; UID 10542; state: ENABLED D/NativeCustomFrequencyManager(17740): [NativeCFMS] BpCustomFrequencyManager::BpCustomFrequencyManager() E/FrameEvents(17740): updateAcquireFence: Did not find frame. D/OpenGLRenderer(17740): CFMS:: SetUp Pid : 17740 Tid : 17802 I/ViewRootImpl@ca848a1MainActivity: mWNT: t=0xb400007079986030 mBlastBufferQueue=0xb400007109961f30 fn= 2 caller= android.view.ViewRootImpl$6.onFrameDraw:5539 android.view.ViewRootImpl$2.onFrameDraw:2103 android.view.ThreadedRenderer$1.onFrameDraw:788 W/mhrmpanelmember(17740): Accessing hidden field Landroid/content/pm/ApplicationInfo;->primaryCpuAbi:Ljava/lang/String; (unsupported, reflection, allowed) E/FrameEvents(17740): updateAcquireFence: Did not find frame. W/AudioCapabilities(17740): Unsupported mime audio/x-ape W/AudioCapabilities(17740): Unsupported mime audio/x-ima W/AudioCapabilities(17740): Unsupported mime audio/mpeg-L1 W/AudioCapabilities(17740): Unsupported mime audio/mpeg-L2 W/VideoCapabilities(17740): Unsupported mime video/wvc1 W/VideoCapabilities(17740): Unsupported mime video/x-ms-wmv W/cr_VAUtil(17740): Unknown level: 131072 for profile 65536 of codec video/avc

IvorNorval avatar Apr 23 '24 05:04 IvorNorval