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:
commit
d69ff561d8
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue