kopia lustrzana https://github.com/ryukoposting/Signal-Android
Track inconsistencies between new and old network availability for internal users.
rodzic
86ca1ebda0
commit
007975e7da
|
@ -47,6 +47,7 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencyProvider;
|
||||||
import org.thoughtcrime.securesms.emoji.EmojiSource;
|
import org.thoughtcrime.securesms.emoji.EmojiSource;
|
||||||
import org.thoughtcrime.securesms.emoji.JumboEmoji;
|
import org.thoughtcrime.securesms.emoji.JumboEmoji;
|
||||||
import org.thoughtcrime.securesms.gcm.FcmJobService;
|
import org.thoughtcrime.securesms.gcm.FcmJobService;
|
||||||
|
import org.thoughtcrime.securesms.jobmanager.impl.NewNetworkConnectivity;
|
||||||
import org.thoughtcrime.securesms.jobs.CheckServiceReachabilityJob;
|
import org.thoughtcrime.securesms.jobs.CheckServiceReachabilityJob;
|
||||||
import org.thoughtcrime.securesms.jobs.CreateSignedPreKeyJob;
|
import org.thoughtcrime.securesms.jobs.CreateSignedPreKeyJob;
|
||||||
import org.thoughtcrime.securesms.jobs.DownloadLatestEmojiDataJob;
|
import org.thoughtcrime.securesms.jobs.DownloadLatestEmojiDataJob;
|
||||||
|
@ -203,6 +204,7 @@ public class ApplicationContext extends MultiDexApplication implements AppForegr
|
||||||
.addPostRender(() -> ApplicationDependencies.getJobManager().add(new FontDownloaderJob()))
|
.addPostRender(() -> ApplicationDependencies.getJobManager().add(new FontDownloaderJob()))
|
||||||
.addPostRender(CheckServiceReachabilityJob::enqueueIfNecessary)
|
.addPostRender(CheckServiceReachabilityJob::enqueueIfNecessary)
|
||||||
.addPostRender(GroupV2UpdateSelfProfileKeyJob::enqueueForGroupsIfNecessary)
|
.addPostRender(GroupV2UpdateSelfProfileKeyJob::enqueueForGroupsIfNecessary)
|
||||||
|
.addPostRender(NewNetworkConnectivity::start)
|
||||||
.execute();
|
.execute();
|
||||||
|
|
||||||
Log.d(TAG, "onCreate() took " + (System.currentTimeMillis() - startTime) + " ms");
|
Log.d(TAG, "onCreate() took " + (System.currentTimeMillis() - startTime) + " ms");
|
||||||
|
|
|
@ -47,6 +47,8 @@ public class NetworkConstraint implements Constraint {
|
||||||
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
|
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
|
||||||
|
|
||||||
|
NewNetworkConnectivity.consistencyCheck();
|
||||||
|
|
||||||
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
|
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
package org.thoughtcrime.securesms.jobmanager.impl
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
|
import android.app.PendingIntent
|
||||||
|
import android.content.Intent
|
||||||
|
import android.net.ConnectivityManager
|
||||||
|
import android.net.Network
|
||||||
|
import android.net.NetworkCapabilities
|
||||||
|
import android.net.NetworkInfo
|
||||||
|
import android.net.NetworkRequest
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Handler
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.core.app.NotificationCompat
|
||||||
|
import androidx.core.app.NotificationManagerCompat
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import org.signal.core.util.concurrent.SignalExecutors
|
||||||
|
import org.signal.core.util.logging.Log
|
||||||
|
import org.thoughtcrime.securesms.R
|
||||||
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
|
import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity
|
||||||
|
import org.thoughtcrime.securesms.notifications.NotificationChannels
|
||||||
|
import org.thoughtcrime.securesms.notifications.NotificationIds
|
||||||
|
import org.thoughtcrime.securesms.util.FeatureFlags
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
object NewNetworkConnectivity {
|
||||||
|
|
||||||
|
private val TAG: String = Log.tag(NewNetworkConnectivity::class.java)
|
||||||
|
private val context: Application = ApplicationDependencies.getApplication()
|
||||||
|
|
||||||
|
private lateinit var connectivityManager: ConnectivityManager
|
||||||
|
private var retryCount = 0
|
||||||
|
|
||||||
|
private var callback: NetworkCallback? = null
|
||||||
|
private var handler: Handler? = null
|
||||||
|
private var hasInternet: Boolean? = null
|
||||||
|
private var previousHasInternet: Boolean? = null
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun start() {
|
||||||
|
if (FeatureFlags.internalUser() && Build.VERSION.SDK_INT >= 26) {
|
||||||
|
connectivityManager = ContextCompat.getSystemService(context, ConnectivityManager::class.java)!!
|
||||||
|
|
||||||
|
val thread = SignalExecutors.getAndStartHandlerThread("NewNetwork")
|
||||||
|
handler = Handler(thread.looper)
|
||||||
|
handler!!.post(this::requestNetwork)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(26)
|
||||||
|
private fun requestNetwork() {
|
||||||
|
if (retryCount > 5) {
|
||||||
|
Log.internal().w(TAG, "Unable to request network after $retryCount attempts")
|
||||||
|
} else {
|
||||||
|
callback?.let { connectivityManager.unregisterNetworkCallback(it) }
|
||||||
|
|
||||||
|
Log.internal().i(TAG, "Requesting network attempt: $retryCount")
|
||||||
|
val callback = NetworkCallback()
|
||||||
|
connectivityManager.requestNetwork(NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build(), callback, handler!!)
|
||||||
|
this.callback = callback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun consistencyCheck() {
|
||||||
|
if (FeatureFlags.internalUser() && Build.VERSION.SDK_INT >= 26) {
|
||||||
|
handler?.post {
|
||||||
|
val oldActiveNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo
|
||||||
|
val oldIsMet: Boolean = isMet(oldActiveNetwork)
|
||||||
|
|
||||||
|
if (hasInternet == null) {
|
||||||
|
Log.internal().w(TAG, "New has not been initialized yet, defaulting to false")
|
||||||
|
hasInternet = false
|
||||||
|
}
|
||||||
|
|
||||||
|
when {
|
||||||
|
oldIsMet == hasInternet && previousHasInternet != hasInternet -> {
|
||||||
|
Log.internal().i(TAG, "Old and new are consistent: $hasInternet")
|
||||||
|
previousHasInternet = hasInternet
|
||||||
|
}
|
||||||
|
oldIsMet != hasInternet && previousHasInternet != hasInternet -> {
|
||||||
|
Log.internal().w(TAG, "Network inconsistent old: $oldIsMet new: $hasInternet", Throwable())
|
||||||
|
Log.internal().w(TAG, "Old active network: $oldActiveNetwork")
|
||||||
|
|
||||||
|
previousHasInternet = hasInternet
|
||||||
|
postInternalErrorNotification()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ?: Log.internal().w(TAG, "New handler has not been initialized yet")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isMet(oldActiveNetwork: NetworkInfo?): Boolean {
|
||||||
|
return oldActiveNetwork != null && oldActiveNetwork.isConnected
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun postInternalErrorNotification() {
|
||||||
|
if (!FeatureFlags.internalUser()) return
|
||||||
|
|
||||||
|
NotificationManagerCompat.from(context).notify(
|
||||||
|
NotificationIds.INTERNAL_NET_ERROR,
|
||||||
|
NotificationCompat.Builder(context, NotificationChannels.FAILURES)
|
||||||
|
.setSmallIcon(R.drawable.ic_notification)
|
||||||
|
.setContentTitle("Network check inconsistency")
|
||||||
|
.setContentText(context.getString(R.string.MessageDecryptionUtil_tap_to_send_a_debug_log))
|
||||||
|
.setContentIntent(PendingIntent.getActivity(context, 0, Intent(context, SubmitDebugLogActivity::class.java), 0))
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(26)
|
||||||
|
private class NetworkCallback : ConnectivityManager.NetworkCallback() {
|
||||||
|
override fun onAvailable(network: Network) {
|
||||||
|
Log.internal().i(TAG, "onAvailable $network ${connectivityManager.getNetworkCapabilities(network)}")
|
||||||
|
retryCount = 0
|
||||||
|
hasInternet = true
|
||||||
|
consistencyCheck()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLost(network: Network) {
|
||||||
|
Log.internal().i(TAG, "onLost $network")
|
||||||
|
retryCount = 0
|
||||||
|
hasInternet = false
|
||||||
|
consistencyCheck()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onUnavailable() {
|
||||||
|
retryCount++
|
||||||
|
requestNetwork()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ public final class NotificationIds {
|
||||||
public static final int USER_NOTIFICATION_MIGRATION = 525600;
|
public static final int USER_NOTIFICATION_MIGRATION = 525600;
|
||||||
public static final int DEVICE_TRANSFER = 625420;
|
public static final int DEVICE_TRANSFER = 625420;
|
||||||
public static final int DONOR_BADGE_FAILURE = 630001;
|
public static final int DONOR_BADGE_FAILURE = 630001;
|
||||||
|
public static final int INTERNAL_NET_ERROR = 404404;
|
||||||
|
|
||||||
private NotificationIds() { }
|
private NotificationIds() { }
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue