From 4354fc2a4625a2f40591bcb059dd8c28a6de39b6 Mon Sep 17 00:00:00 2001 From: Gaurav Ujjwal Date: Wed, 6 Mar 2024 22:26:58 +0530 Subject: [PATCH] Fix LoginFragment crash on activity recreation App can go in background while LoginFragment is visible, where it can be killed by system. If VncActivity is the recreated, old VncViewModel would be gone and loginType will be null. Instead of crashing on null loginType, now the LoginFragment is simply dismissed. --- .../main/java/com/gaurav/avnc/ui/vnc/LoginFragment.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/java/com/gaurav/avnc/ui/vnc/LoginFragment.kt b/app/src/main/java/com/gaurav/avnc/ui/vnc/LoginFragment.kt index 35d984d..999edfb 100644 --- a/app/src/main/java/com/gaurav/avnc/ui/vnc/LoginFragment.kt +++ b/app/src/main/java/com/gaurav/avnc/ui/vnc/LoginFragment.kt @@ -11,6 +11,7 @@ package com.gaurav.avnc.ui.vnc import android.app.Dialog import android.os.Bundle import android.util.ArrayMap +import android.util.Log import android.widget.ArrayAdapter import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment @@ -42,6 +43,14 @@ class LoginFragment : DialogFragment() { private val loginInfo by lazy { getLoginInfoFromProfile(viewModel.profile) } override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + if (savedInstanceState != null && viewModel.loginInfoRequest.value == null) { + Log.i(javaClass.simpleName, "Activity is being recreated and old ViewModel is gone, removing stale login dialog") + showsDialog = false + dismiss() + return Dialog(requireContext()) // Can't return null + } + + check(viewModel.loginInfoRequest.value != null) { "Login fragment invoked without a login type" } binding = FragmentCredentialBinding.inflate(layoutInflater, null, false) binding.loginInfo = loginInfo