Skip to content

Commit

Permalink
Use the new networkstatus flow to know if we have internet or not
Browse files Browse the repository at this point in the history
  • Loading branch information
tevincent committed Aug 13, 2024
1 parent 4ae9c75 commit ce06e89
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 33 deletions.
22 changes: 1 addition & 21 deletions app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,15 @@ import androidx.annotation.FloatRange
import androidx.core.view.isVisible
import androidx.drawerlayout.widget.DrawerLayout
import androidx.lifecycle.Lifecycle.State
import androidx.lifecycle.distinctUntilChanged
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.NavDestination
import androidx.navigation.fragment.NavHostFragment
import androidx.work.Data
import com.infomaniak.lib.core.MatomoCore.TrackerAction
import com.infomaniak.lib.core.networking.LiveDataNetworkStatus
import com.infomaniak.lib.core.utils.SentryLog
import com.infomaniak.lib.core.utils.*
import com.infomaniak.lib.core.utils.Utils
import com.infomaniak.lib.core.utils.Utils.toEnumOrThrow
import com.infomaniak.lib.core.utils.hasPermissions
import com.infomaniak.lib.core.utils.year
import com.infomaniak.lib.stores.StoreUtils
import com.infomaniak.lib.stores.StoreUtils.checkUpdateIsRequired
import com.infomaniak.lib.stores.reviewmanagers.InAppReviewManager
Expand Down Expand Up @@ -193,7 +189,6 @@ class MainActivity : BaseActivity() {
localSettings.accentColor.theme,
)

observeNetworkStatus()
observeDeletedMessages()
observeDeleteThreadTrigger()
observeDraftWorkerResults()
Expand Down Expand Up @@ -224,21 +219,6 @@ class MainActivity : BaseActivity() {
)
}

private fun observeNetworkStatus() {
LiveDataNetworkStatus(context = this).distinctUntilChanged().observe(this) { isAvailable ->

SentryLog.d("Internet availability", if (isAvailable) "Available" else "Unavailable")

Breadcrumb().apply {
category = "Network"
message = "Internet access is available : $isAvailable"
level = if (isAvailable) SentryLevel.INFO else SentryLevel.WARNING
}.also(Sentry::addBreadcrumb)

mainViewModel.isInternetAvailable.value = isAvailable
}
}

private fun observeDeletedMessages() = with(mainViewModel) {
deletedMessages.observe(owner = this@MainActivity) {
if (it.isNotEmpty()) {
Expand Down
14 changes: 13 additions & 1 deletion app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package com.infomaniak.mail.ui
import android.app.Application
import androidx.lifecycle.*
import com.infomaniak.lib.core.models.ApiResponse
import com.infomaniak.lib.core.networking.NetworkAvailability
import com.infomaniak.lib.core.utils.ApiErrorCode.Companion.translateError
import com.infomaniak.lib.core.utils.DownloadManagerUtils
import com.infomaniak.lib.core.utils.SentryLog
Expand Down Expand Up @@ -99,7 +100,6 @@ class MainViewModel @Inject constructor(
private var refreshEverythingJob: Job? = null

val isDownloadingChanges: MutableLiveData<Boolean> = MutableLiveData(false)
val isInternetAvailable = MutableLiveData<Boolean>()
val isMovedToNewFolder = SingleLiveEvent<Boolean>()
val toggleLightThemeForMessage = SingleLiveEvent<Message>()
val deletedMessages = SingleLiveEvent<Set<String>>()
Expand Down Expand Up @@ -169,6 +169,17 @@ class MainViewModel @Inject constructor(

val currentThreadsLive = MutableLiveData<ResultsChange<Thread>>()

val isNetworkAvailable = NetworkAvailability(appContext).isNetworkAvailable
.mapLatest {
SentryLog.d("Internet availability", if (it) "Available" else "Unavailable")
it
}
.stateIn(
scope = viewModelScope,
started = SharingStarted.Eagerly,
initialValue = null
)

private var currentThreadsLiveJob: Job? = null

fun reassignCurrentThreadsLive() {
Expand Down Expand Up @@ -1091,5 +1102,6 @@ class MainViewModel @Inject constructor(
private val DEFAULT_SELECTED_FOLDER = FolderRole.INBOX
private const val REFRESH_DELAY = 2_000L // We add this delay because `etop` isn't always big enough.
private const val MAX_REFRESH_DELAY = 6_000L
private const val TIMEOUT_MS_NETWORK_AVAILABILITY_MS = 500L
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import androidx.core.view.isVisible
import androidx.fragment.app.FragmentContainerView
import androidx.fragment.app.viewModels
import androidx.lifecycle.distinctUntilChanged
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.LinearLayoutManager
Expand Down Expand Up @@ -81,6 +82,7 @@ import com.infomaniak.mail.utils.extensions.*
import dagger.hilt.android.AndroidEntryPoint
import io.sentry.Sentry
import io.sentry.SentryLevel
import kotlinx.coroutines.launch
import java.util.Date
import javax.inject.Inject
import com.infomaniak.lib.core.R as RCore
Expand Down Expand Up @@ -495,8 +497,7 @@ class ThreadListFragment : TwoPaneFragment(), SwipeRefreshLayout.OnRefreshListen
SwipeAction.NONE -> error("Cannot swipe on an action which is not set")
}

val shouldKeepItemBecauseOfNoConnection = isInternetAvailable.value == false

val shouldKeepItemBecauseOfNoConnection = mainViewModel.isNetworkAvailable.value == false
return shouldKeepItemBecauseOfAction || shouldKeepItemBecauseOfNoConnection
}

Expand Down Expand Up @@ -529,10 +530,14 @@ class ThreadListFragment : TwoPaneFragment(), SwipeRefreshLayout.OnRefreshListen
}

private fun observeNetworkStatus() {
mainViewModel.isInternetAvailable.observe(viewLifecycleOwner) { isAvailable ->
TransitionManager.beginDelayedTransition(binding.root)
binding.noNetwork.isGone = isAvailable
if (!isAvailable) updateThreadsVisibility()
lifecycleScope.launch {
mainViewModel.isNetworkAvailable.collect { isNetworkAvailable ->
if (isNetworkAvailable != null) {
TransitionManager.beginDelayedTransition(binding.root)
binding.noNetwork.isGone = isNetworkAvailable
if (!isNetworkAvailable) updateThreadsVisibility()
}
}
}
}

Expand Down Expand Up @@ -731,7 +736,7 @@ class ThreadListFragment : TwoPaneFragment(), SwipeRefreshLayout.OnRefreshListen
val areThereThreads = (currentThreadsCount ?: 0) > 0
val isFilterEnabled = mainViewModel.currentFilter.value != ThreadFilter.ALL
val isCursorNull = currentFolderCursor == null
val isNetworkConnected = mainViewModel.isInternetAvailable.value == true
val isNetworkConnected = mainViewModel.isNetworkAvailable.value == true
val isBooting = currentThreadsCount == null && !isCursorNull && isNetworkConnected
val isWaitingFirstThreads = isCursorNull && isNetworkConnected
val shouldDisplayThreadsView = isBooting || isWaitingFirstThreads || areThereThreads || isFilterEnabled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import androidx.appcompat.content.res.AppCompatResources
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import com.google.android.material.dialog.MaterialAlertDialogBuilder
Expand All @@ -35,6 +36,8 @@ import com.infomaniak.mail.ui.MainViewModel
import com.infomaniak.mail.utils.extensions.AttachmentExtensions
import com.infomaniak.mail.utils.extensions.AttachmentExtensions.getIntentOrGoToPlayStore
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch

@AndroidEntryPoint
class DownloadAttachmentProgressDialog : DialogFragment() {
Expand Down Expand Up @@ -76,8 +79,14 @@ class DownloadAttachmentProgressDialog : DialogFragment() {
}

private fun popBackStackWithError() {
val title = if (mainViewModel.isInternetAvailable.value == true) R.string.anErrorHasOccurred else R.string.noConnection
showSnackbar(title)
findNavController().popBackStack()
// We have to use the Flow instead of the LiveData here since the mainViewModel is not the same instance as the one in the
// MainActivity. So, instead of observing the LiveData in order to make it "active", we use the Flow.
lifecycleScope.launch {
mainViewModel.isNetworkAvailable.first { it != null }?.let { isNetworkAvailable ->
val title = if (isNetworkAvailable) R.string.anErrorHasOccurred else R.string.noConnection
showSnackbar(title)
findNavController().popBackStack()
}
}
}
}

0 comments on commit ce06e89

Please sign in to comment.