From bd1addbd913d2d02ae304ef4aabf75095ff00235 Mon Sep 17 00:00:00 2001
From: Kamal Bramwell <kamal@elixxir.io>
Date: Tue, 9 Aug 2022 01:44:13 +0000
Subject: [PATCH] FE-956: Components initializing screen

---
 .../xxlabs/messenger/ui/main/MainActivity.kt  | 43 ++++++++++---
 .../xxlabs/messenger/ui/main/MainViewModel.kt |  5 ++
 app/src/main/res/layout/activity_main.xml     | 61 ++++++++++++++++---
 3 files changed, 91 insertions(+), 18 deletions(-)

diff --git a/app/src/main/java/io/xxlabs/messenger/ui/main/MainActivity.kt b/app/src/main/java/io/xxlabs/messenger/ui/main/MainActivity.kt
index 64a04e94..e6edbd54 100755
--- a/app/src/main/java/io/xxlabs/messenger/ui/main/MainActivity.kt
+++ b/app/src/main/java/io/xxlabs/messenger/ui/main/MainActivity.kt
@@ -11,6 +11,7 @@ import android.graphics.Color
 import android.os.Bundle
 import android.view.*
 import android.view.inputmethod.InputMethodManager
+import android.widget.ProgressBar
 import androidx.coordinatorlayout.widget.CoordinatorLayout
 import androidx.core.os.bundleOf
 import androidx.core.view.WindowInsetsCompat
@@ -50,11 +51,13 @@ import io.xxlabs.messenger.ui.base.BaseFragment
 import io.xxlabs.messenger.ui.global.BaseInstance
 import io.xxlabs.messenger.ui.global.ContactsViewModel
 import io.xxlabs.messenger.ui.global.NetworkViewModel
+import io.xxlabs.messenger.ui.main.chat.setVisibility
 import io.xxlabs.messenger.ui.main.chats.ChatsFragment
 import io.xxlabs.messenger.ui.main.chats.ChatsViewModel
 import io.xxlabs.messenger.ui.main.contacts.PhotoSelectorFragment
 import kotlinx.android.synthetic.main.activity_main.*
 import kotlinx.android.synthetic.main.component_menu.*
+import kotlinx.android.synthetic.main.fragment_delete_account.*
 import kotlinx.coroutines.flow.launchIn
 import kotlinx.coroutines.flow.onEach
 import timber.log.Timber
@@ -84,6 +87,7 @@ class MainActivity : MediaProviderActivity(), SnackBarActivity, CustomToastActiv
     var isBackBtnAllowed = true
     var isMenuOpened = false
 
+    private val intentQueue: MutableList<Intent> = mutableListOf()
 
     override fun onStart() {
         super.onStart()
@@ -163,17 +167,22 @@ class MainActivity : MediaProviderActivity(), SnackBarActivity, CustomToastActiv
         handleIntent(intent)
     }
 
+
     private fun handleIntent(intent: Intent) {
-        intent.getBundleExtra(INTENT_NOTIFICATION_CLICK)?.let {
-            // PendingIntent from notifications
-            handleNotification(it)
-            return
-        }
+        if (mainViewModel.areComponentsInitialized.value == true) {
+            intent.getBundleExtra(INTENT_NOTIFICATION_CLICK)?.let {
+                // PendingIntent from notifications
+                handleNotification(it)
+                return
+            }
 
-        intent.getStringExtra(INTENT_INVITATION)?.let { username ->
-            // Implicit intent from an invitation link
-            invitationIntent(username)
-            return
+            intent.getStringExtra(INTENT_INVITATION)?.let { username ->
+                // Implicit intent from an invitation link
+                invitationIntent(username)
+                return
+            }
+        } else {
+            intentQueue.add(intent)
         }
     }
 
@@ -417,6 +426,17 @@ class MainActivity : MediaProviderActivity(), SnackBarActivity, CustomToastActiv
     }
 
     private fun observeUI() {
+        mainViewModel.areComponentsInitialized.observe(this) { ready ->
+            enableUi(ready)
+
+            if (ready) {
+                // LIFO ordering.
+                intentQueue.removeLastOrNull()?.run {
+                    handleIntent(this)
+                }
+            }
+        }
+
         contactsViewModel.showToast.onEach { toast ->
             toast?.let {
                 showCustomToast(toast)
@@ -446,6 +466,11 @@ class MainActivity : MediaProviderActivity(), SnackBarActivity, CustomToastActiv
         }
     }
 
+    private fun enableUi(enabled: Boolean) {
+        initializingBackground?.setVisibility(!enabled)
+        initializingProgressBar?.setVisibility(!enabled)
+   }
+
     private fun dismissNetworkStatusMessage() {
         for (status in cachedNetworkStatus) {
             dismissIndefiniteToast(status)
diff --git a/app/src/main/java/io/xxlabs/messenger/ui/main/MainViewModel.kt b/app/src/main/java/io/xxlabs/messenger/ui/main/MainViewModel.kt
index 52cfd7bd..92ea8eaf 100644
--- a/app/src/main/java/io/xxlabs/messenger/ui/main/MainViewModel.kt
+++ b/app/src/main/java/io/xxlabs/messenger/ui/main/MainViewModel.kt
@@ -1,6 +1,7 @@
 package io.xxlabs.messenger.ui.main
 
 import android.content.Context
+import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
@@ -54,6 +55,9 @@ class MainViewModel @Inject constructor(
     private var isLoggingIn: Boolean = false
     private var hasManagerStarted: Boolean = false
 
+    val areComponentsInitialized: LiveData<Boolean> by ::_areComponentsInitialized
+    private val _areComponentsInitialized = MutableLiveData(false)
+
     @Volatile
     var wasLoggedIn = false
 
@@ -331,6 +335,7 @@ class MainViewModel @Inject constructor(
             wasLoggedIn = true
             enableDummyTraffic(preferences.isCoverTrafficOn)
             loginProcess.postValue(DataRequestState.Success(true))
+            _areComponentsInitialized.value = true
         } else {
             loginProcess.postValue(DataRequestState.Error(err))
         }
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 07c988ad..31c1f066 100755
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/mainLayout"
@@ -10,12 +11,21 @@
     <include
         android:id="@+id/mainMenuView"
         layout="@layout/component_menu"
-        android:visibility="gone" />
+        android:visibility="gone"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"/>
 
     <androidx.coordinatorlayout.widget.CoordinatorLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:id="@+id/contentCoordinatorLayout"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
         android:focusable="true"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
         tools:context=".ui.main.MainActivity">
 
         <com.google.android.material.card.MaterialCardView
@@ -46,13 +56,44 @@
         </com.google.android.material.card.MaterialCardView>
     </androidx.coordinatorlayout.widget.CoordinatorLayout>
 
+    <View
+        android:id="@+id/initializingBackground"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:visibility="visible"
+        android:background="@drawable/bg_splash_screen"
+        android:clickable="true"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        tools:visibility="visible"/>
+
+    <ProgressBar
+        android:id="@+id/initializingProgressBar"
+        style="@style/XxProgressBarCircularBlue"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:indeterminate="true"
+        android:indeterminateTint="@color/neutral_off_white"
+        android:visibility="visible"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintVertical_bias="0.80"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
     <ImageView
         android:id="@+id/mainBlurryImg"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
         android:src="@drawable/bg_white"
         android:translationZ="@dimen/spacing_10"
-        android:visibility="gone" />
+        android:visibility="gone"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent" />
 
     <com.google.android.material.floatingactionbutton.FloatingActionButton
         android:id="@+id/mainReportBtn"
@@ -64,5 +105,7 @@
         android:layout_marginBottom="@dimen/spacing_30"
         android:src="@drawable/ic_bug_report"
         android:visibility="gone"
-        android:tint="@color/white" />
-</RelativeLayout>
\ No newline at end of file
+        android:tint="@color/white"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"/>
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
-- 
GitLab