mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-02-26 20:55:10 +00:00
Use remote config v2.
This commit is contained in:
committed by
Jeffrey Starke
parent
dcce8ea35a
commit
7d35cf1374
@@ -1,77 +0,0 @@
|
||||
package org.thoughtcrime.securesms.jobs;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.dependencies.AppDependencies;
|
||||
import org.thoughtcrime.securesms.jobmanager.Job;
|
||||
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore;
|
||||
import org.thoughtcrime.securesms.net.SignalNetwork;
|
||||
import org.thoughtcrime.securesms.util.ExceptionHelper;
|
||||
import org.thoughtcrime.securesms.util.RemoteConfig;
|
||||
import org.whispersystems.signalservice.api.NetworkResultUtil;
|
||||
import org.whispersystems.signalservice.api.remoteconfig.RemoteConfigResult;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class RemoteConfigRefreshJob extends BaseJob {
|
||||
|
||||
private static final String TAG = Log.tag(RemoteConfigRefreshJob.class);
|
||||
|
||||
public static final String KEY = "RemoteConfigRefreshJob";
|
||||
|
||||
public RemoteConfigRefreshJob() {
|
||||
this(new Job.Parameters.Builder()
|
||||
.setQueue("RemoteConfigRefreshJob")
|
||||
.setMaxInstancesForFactory(1)
|
||||
.addConstraint(NetworkConstraint.KEY)
|
||||
.setMaxAttempts(Parameters.UNLIMITED)
|
||||
.setLifespan(TimeUnit.DAYS.toMillis(1))
|
||||
.build());
|
||||
}
|
||||
|
||||
private RemoteConfigRefreshJob(@NonNull Parameters parameters) {
|
||||
super(parameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable byte[] serialize() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull String getFactoryKey() {
|
||||
return KEY;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRun() throws Exception {
|
||||
if (!SignalStore.account().isRegistered()) {
|
||||
Log.w(TAG, "Not registered. Skipping.");
|
||||
return;
|
||||
}
|
||||
|
||||
RemoteConfigResult result = NetworkResultUtil.toBasicLegacy(SignalNetwork.remoteConfig().getRemoteConfig());
|
||||
RemoteConfig.update(result.getConfig());
|
||||
SignalStore.misc().setLastKnownServerTime(result.getServerEpochTimeMilliseconds(), System.currentTimeMillis());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onShouldRetry(@NonNull Exception e) {
|
||||
return ExceptionHelper.isRetryableIOException(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure() {
|
||||
}
|
||||
|
||||
public static final class Factory implements Job.Factory<RemoteConfigRefreshJob> {
|
||||
@Override
|
||||
public @NonNull RemoteConfigRefreshJob create(@NonNull Parameters parameters, @Nullable byte[] serializedData) {
|
||||
return new RemoteConfigRefreshJob(parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package org.thoughtcrime.securesms.jobs
|
||||
|
||||
import org.signal.core.util.isNotNullOrBlank
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.thoughtcrime.securesms.jobmanager.Job
|
||||
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
|
||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||
import org.thoughtcrime.securesms.net.SignalNetwork
|
||||
import org.thoughtcrime.securesms.util.RemoteConfig
|
||||
import org.whispersystems.signalservice.api.NetworkResult
|
||||
import kotlin.time.Duration.Companion.days
|
||||
|
||||
/**
|
||||
* Job to refresh remote configs. Utilizes eTags so a 304 is returned if content is unchanged since last fetch.
|
||||
*/
|
||||
class RemoteConfigRefreshJob private constructor(parameters: Parameters) : Job(parameters) {
|
||||
companion object {
|
||||
const val KEY: String = "RemoteConfigRefreshJob"
|
||||
private val TAG = Log.tag(RemoteConfigRefreshJob::class.java)
|
||||
}
|
||||
|
||||
constructor() : this(
|
||||
Parameters.Builder()
|
||||
.setQueue(KEY)
|
||||
.addConstraint(NetworkConstraint.KEY)
|
||||
.setMaxInstancesForFactory(1)
|
||||
.setMaxAttempts(Parameters.UNLIMITED)
|
||||
.setLifespan(1.days.inWholeMilliseconds)
|
||||
.build()
|
||||
)
|
||||
|
||||
override fun serialize(): ByteArray? {
|
||||
return null
|
||||
}
|
||||
|
||||
override fun getFactoryKey(): String {
|
||||
return KEY
|
||||
}
|
||||
|
||||
override fun run(): Result {
|
||||
if (!SignalStore.account.isRegistered) {
|
||||
Log.w(TAG, "Not registered. Skipping.")
|
||||
return Result.success()
|
||||
}
|
||||
|
||||
return when (val result = SignalNetwork.remoteConfig.getRemoteConfig(SignalStore.remoteConfig.eTag)) {
|
||||
is NetworkResult.Success -> {
|
||||
RemoteConfig.update(result.result.config)
|
||||
SignalStore.misc.setLastKnownServerTime(result.result.serverEpochTimeMilliseconds, System.currentTimeMillis())
|
||||
if (result.result.eTag.isNotNullOrBlank()) {
|
||||
SignalStore.remoteConfig.eTag = result.result.eTag
|
||||
}
|
||||
Result.success()
|
||||
}
|
||||
|
||||
is NetworkResult.ApplicationError -> Result.failure()
|
||||
is NetworkResult.NetworkError -> Result.retry(defaultBackoff())
|
||||
is NetworkResult.StatusCodeError ->
|
||||
if (result.code == 304) {
|
||||
Log.i(TAG, "Remote config has not changed since last pull.")
|
||||
Result.success()
|
||||
} else {
|
||||
Result.retry(defaultBackoff())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure() = Unit
|
||||
|
||||
class Factory : Job.Factory<RemoteConfigRefreshJob?> {
|
||||
override fun create(parameters: Parameters, serializedData: ByteArray?): RemoteConfigRefreshJob {
|
||||
return RemoteConfigRefreshJob(parameters)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ public final class RemoteConfigValues extends SignalStoreValues {
|
||||
private static final String CURRENT_CONFIG = "remote_config";
|
||||
private static final String PENDING_CONFIG = "pending_remote_config";
|
||||
private static final String LAST_FETCH_TIME = "remote_config_last_fetch_time";
|
||||
private static final String ETAG = "etag";
|
||||
|
||||
RemoteConfigValues(@NonNull KeyValueStore store) {
|
||||
super(store);
|
||||
@@ -51,4 +52,12 @@ public final class RemoteConfigValues extends SignalStoreValues {
|
||||
public void setLastFetchTime(long time) {
|
||||
putLong(LAST_FETCH_TIME, time);
|
||||
}
|
||||
|
||||
public String getETag() {
|
||||
return getString(ETAG, "");
|
||||
}
|
||||
|
||||
public void setETag(String etag) {
|
||||
putString(ETAG, etag);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,6 +151,8 @@ class SignalStore(context: Application, private val store: KeyValueStore) {
|
||||
val pin: PinValues
|
||||
get() = instance!!.pinValues
|
||||
|
||||
@JvmStatic
|
||||
@get:JvmName("remoteConfig")
|
||||
val remoteConfig: RemoteConfigValues
|
||||
get() = instance!!.remoteConfigValues
|
||||
|
||||
|
||||
Reference in New Issue
Block a user