Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Occasional white screen #39

Open
IvorNorval opened this issue Apr 23, 2024 · 0 comments
Open

Occasional white screen #39

IvorNorval opened this issue Apr 23, 2024 · 0 comments

Comments

@IvorNorval
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant