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 12, 2024
1 parent cf0e38f commit 3d066c4
Show file tree
Hide file tree
Showing 5 changed files with 41 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 @@ -198,7 +194,6 @@ class MainActivity : BaseActivity() {
localSettings.accentColor.theme,
)

observeNetworkStatus()
observeDeletedMessages()
observeDeleteThreadTrigger()
observeDraftWorkerResults()
Expand Down Expand Up @@ -229,21 +224,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
16 changes: 15 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 @@ -27,6 +27,7 @@ import androidx.lifecycle.asLiveData
import androidx.lifecycle.liveData
import androidx.lifecycle.viewModelScope
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 @@ -83,11 +84,13 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import java.util.Date
import javax.inject.Inject
Expand Down Expand Up @@ -120,7 +123,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 @@ -190,6 +192,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 @@ -1112,5 +1125,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 @@ -95,6 +96,7 @@ import com.infomaniak.mail.utils.extensions.toDate
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 @@ -509,8 +511,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 @@ -543,10 +544,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 @@ -745,7 +750,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 3d066c4

Please sign in to comment.