Merge branch 'fix/3074-avoid-multiple-events-requests' into 'develop'

Avoid enqueueing multiple jobs to fetch updates

See merge request android/mail/proton-mail-android!1260
This commit is contained in:
Marino Meneghel 2023-05-04 08:22:14 +00:00
commit d69ff561d8
5 changed files with 35 additions and 24 deletions

View File

@ -25,6 +25,7 @@ import androidx.annotation.NonNull;
import androidx.core.app.ProtonJobIntentService;
import com.birbit.android.jobqueue.JobManager;
import com.birbit.android.jobqueue.TagConstraint;
import javax.inject.Inject;
@ -70,6 +71,7 @@ public class EventUpdaterService extends ProtonJobIntentService {
private void startService() {
mJobManager.cancelJobs(TagConstraint.ALL, FetchUpdatesJob.FETCH_UPDATE_JOB_TAG);
mJobManager.addJob(new FetchUpdatesJob(eventManager));
alarmReceiver.setAlarm(getApplicationContext());
}

View File

@ -26,11 +26,10 @@ import ch.protonmail.android.jobs.ProtonMailBaseJob
import com.birbit.android.jobqueue.Params
import timber.log.Timber
import java.io.IOException
import java.net.ConnectException
import java.util.concurrent.TimeUnit
class FetchUpdatesJob internal constructor(private val eventManager: EventManager) : ProtonMailBaseJob(
Params(Priority.HIGH).requireNetwork()
Params(Priority.HIGH).addTags(FETCH_UPDATE_JOB_TAG).requireNetwork()
) {
constructor() : this(ProtonMailApplication.getApplication().eventManager)
@ -58,4 +57,9 @@ class FetchUpdatesJob internal constructor(private val eventManager: EventManage
}
override fun onProtonCancel(cancelReason: Int, throwable: Throwable?) {}
companion object {
internal const val FETCH_UPDATE_JOB_TAG = "FetchUpdateJobTag"
}
}

View File

@ -23,6 +23,7 @@ import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET
import android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED
import android.net.NetworkRequest
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.delay
@ -42,8 +43,9 @@ class NetworkConnectivityManager @Inject constructor(
) {
fun isInternetConnectionPossible(): Boolean {
val capabilities = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
return capabilities?.hasCapability(NET_CAPABILITY_INTERNET) == true
val activeNetwork = connectivityManager.activeNetwork
val capabilities = connectivityManager.getNetworkCapabilities(activeNetwork)
return capabilities.hasVerifiedInternet()
}
/**
@ -73,7 +75,7 @@ class NetworkConnectivityManager @Inject constructor(
network: Network,
networkCapabilities: NetworkCapabilities
) {
if (networkCapabilities.hasCapability(NET_CAPABILITY_INTERNET)) {
if (networkCapabilities.hasVerifiedInternet()) {
Timber.v("Network $network has internet capability")
trySend(Constants.ConnectionState.CONNECTED)
}
@ -92,4 +94,7 @@ class NetworkConnectivityManager @Inject constructor(
return connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
?.hasTransport(NetworkCapabilities.TRANSPORT_VPN) ?: false
}
private fun NetworkCapabilities?.hasVerifiedInternet(): Boolean =
this?.hasCapability(NET_CAPABILITY_INTERNET) == true && this.hasCapability(NET_CAPABILITY_VALIDATED)
}

View File

@ -134,7 +134,7 @@ class QueueNetworkUtil @Inject constructor(
private fun hasConn(checkReal: Boolean): Boolean {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val netInfo = cm.activeNetworkInfo
var hasConnection = netInfo != null && netInfo.isConnectedOrConnecting
var hasConnection = netInfo != null && netInfo.isConnected
val currentStatus = isServerAccessible
if (checkReal) {
hasConnection = hasConnection && isServerAccessible

View File

@ -67,7 +67,7 @@ internal open class QueueNetworkUtilTest {
@Test
fun `should call the listener as soon as the real connectivity is updated`() = with(testInput) {
// given
every { networkInfoMock.isConnectedOrConnecting } returns isConnectedOrConnecting
every { networkInfoMock.isConnected } returns isConnected
queueNetworkUtil.setListener(listenerMock)
// when
@ -82,25 +82,25 @@ internal open class QueueNetworkUtilTest {
private val pingNeededStateInputs = listOf(
TestInput(
serverAccessible = true,
isConnectedOrConnecting = true,
isConnected = true,
connectionState = Constants.ConnectionState.PING_NEEDED,
expectedNetworkStatus = NetworkUtil.METERED
),
TestInput(
serverAccessible = true,
isConnectedOrConnecting = false,
isConnected = false,
connectionState = Constants.ConnectionState.PING_NEEDED,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
),
TestInput(
serverAccessible = false,
isConnectedOrConnecting = true,
isConnected = true,
connectionState = Constants.ConnectionState.PING_NEEDED,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
),
TestInput(
serverAccessible = false,
isConnectedOrConnecting = false,
isConnected = false,
connectionState = Constants.ConnectionState.PING_NEEDED,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
)
@ -109,25 +109,25 @@ internal open class QueueNetworkUtilTest {
private val connectedStateInputs = listOf(
TestInput(
serverAccessible = true,
isConnectedOrConnecting = true,
isConnected = true,
connectionState = Constants.ConnectionState.CONNECTED,
expectedNetworkStatus = NetworkUtil.METERED
),
TestInput(
serverAccessible = true,
isConnectedOrConnecting = false,
isConnected = false,
connectionState = Constants.ConnectionState.CONNECTED,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
),
TestInput(
serverAccessible = false,
isConnectedOrConnecting = true,
isConnected = true,
connectionState = Constants.ConnectionState.CONNECTED,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
),
TestInput(
serverAccessible = false,
isConnectedOrConnecting = false,
isConnected = false,
connectionState = Constants.ConnectionState.CONNECTED,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
)
@ -136,25 +136,25 @@ internal open class QueueNetworkUtilTest {
private val noInternetStateInputs = listOf(
TestInput(
serverAccessible = true,
isConnectedOrConnecting = true,
isConnected = true,
connectionState = Constants.ConnectionState.NO_INTERNET,
expectedNetworkStatus = NetworkUtil.METERED
),
TestInput(
serverAccessible = true,
isConnectedOrConnecting = false,
isConnected = false,
connectionState = Constants.ConnectionState.NO_INTERNET,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
),
TestInput(
serverAccessible = false,
isConnectedOrConnecting = true,
isConnected = true,
connectionState = Constants.ConnectionState.NO_INTERNET,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
),
TestInput(
serverAccessible = false,
isConnectedOrConnecting = false,
isConnected = false,
connectionState = Constants.ConnectionState.NO_INTERNET,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
)
@ -163,25 +163,25 @@ internal open class QueueNetworkUtilTest {
private val cantReachServerInputs = listOf(
TestInput(
serverAccessible = true,
isConnectedOrConnecting = true,
isConnected = true,
connectionState = Constants.ConnectionState.CANT_REACH_SERVER,
expectedNetworkStatus = NetworkUtil.METERED
),
TestInput(
serverAccessible = true,
isConnectedOrConnecting = false,
isConnected = false,
connectionState = Constants.ConnectionState.CANT_REACH_SERVER,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
),
TestInput(
serverAccessible = false,
isConnectedOrConnecting = true,
isConnected = true,
connectionState = Constants.ConnectionState.CANT_REACH_SERVER,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
),
TestInput(
serverAccessible = false,
isConnectedOrConnecting = false,
isConnected = false,
connectionState = Constants.ConnectionState.CANT_REACH_SERVER,
expectedNetworkStatus = NetworkUtil.DISCONNECTED
)
@ -197,7 +197,7 @@ internal open class QueueNetworkUtilTest {
internal data class TestInput(
val serverAccessible: Boolean,
val isConnectedOrConnecting: Boolean,
val isConnected: Boolean,
val connectionState: Constants.ConnectionState,
val expectedNetworkStatus: Int
)