kopia lustrzana https://github.com/ryukoposting/Signal-Android
Add new subscription multi device sync message.
rodzic
9f9bf3c604
commit
ae1f834619
|
@ -21,6 +21,7 @@ import org.thoughtcrime.securesms.components.settings.app.subscription.DonationE
|
||||||
import org.thoughtcrime.securesms.components.settings.app.subscription.DonationExceptions
|
import org.thoughtcrime.securesms.components.settings.app.subscription.DonationExceptions
|
||||||
import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentRepository
|
import org.thoughtcrime.securesms.components.settings.app.subscription.DonationPaymentRepository
|
||||||
import org.thoughtcrime.securesms.components.settings.app.subscription.SubscriptionsRepository
|
import org.thoughtcrime.securesms.components.settings.app.subscription.SubscriptionsRepository
|
||||||
|
import org.thoughtcrime.securesms.jobs.MultiDeviceSubscriptionSyncRequestJob
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.subscription.LevelUpdate
|
import org.thoughtcrime.securesms.subscription.LevelUpdate
|
||||||
import org.thoughtcrime.securesms.subscription.Subscriber
|
import org.thoughtcrime.securesms.subscription.Subscriber
|
||||||
|
@ -169,6 +170,7 @@ class SubscribeViewModel(
|
||||||
SignalStore.donationsValues().setLastEndOfPeriod(0L)
|
SignalStore.donationsValues().setLastEndOfPeriod(0L)
|
||||||
SignalStore.donationsValues().clearLevelOperations()
|
SignalStore.donationsValues().clearLevelOperations()
|
||||||
SignalStore.donationsValues().shouldCancelSubscriptionBeforeNextSubscribeAttempt = false
|
SignalStore.donationsValues().shouldCancelSubscriptionBeforeNextSubscribeAttempt = false
|
||||||
|
MultiDeviceSubscriptionSyncRequestJob.enqueue()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Completable.complete()
|
Completable.complete()
|
||||||
|
@ -185,6 +187,7 @@ class SubscribeViewModel(
|
||||||
SignalStore.donationsValues().clearLevelOperations()
|
SignalStore.donationsValues().clearLevelOperations()
|
||||||
SignalStore.donationsValues().markUserManuallyCancelled()
|
SignalStore.donationsValues().markUserManuallyCancelled()
|
||||||
refreshActiveSubscription()
|
refreshActiveSubscription()
|
||||||
|
MultiDeviceSubscriptionSyncRequestJob.enqueue()
|
||||||
store.update { it.copy(stage = SubscribeState.Stage.READY) }
|
store.update { it.copy(stage = SubscribeState.Stage.READY) }
|
||||||
},
|
},
|
||||||
onError = { throwable ->
|
onError = { throwable ->
|
||||||
|
|
|
@ -111,6 +111,7 @@ public final class JobManagerFactories {
|
||||||
put(MultiDeviceStickerPackOperationJob.KEY, new MultiDeviceStickerPackOperationJob.Factory());
|
put(MultiDeviceStickerPackOperationJob.KEY, new MultiDeviceStickerPackOperationJob.Factory());
|
||||||
put(MultiDeviceStickerPackSyncJob.KEY, new MultiDeviceStickerPackSyncJob.Factory());
|
put(MultiDeviceStickerPackSyncJob.KEY, new MultiDeviceStickerPackSyncJob.Factory());
|
||||||
put(MultiDeviceStorageSyncRequestJob.KEY, new MultiDeviceStorageSyncRequestJob.Factory());
|
put(MultiDeviceStorageSyncRequestJob.KEY, new MultiDeviceStorageSyncRequestJob.Factory());
|
||||||
|
put(MultiDeviceSubscriptionSyncRequestJob.KEY, new MultiDeviceSubscriptionSyncRequestJob.Factory());
|
||||||
put(MultiDeviceVerifiedUpdateJob.KEY, new MultiDeviceVerifiedUpdateJob.Factory());
|
put(MultiDeviceVerifiedUpdateJob.KEY, new MultiDeviceVerifiedUpdateJob.Factory());
|
||||||
put(MultiDeviceViewOnceOpenJob.KEY, new MultiDeviceViewOnceOpenJob.Factory());
|
put(MultiDeviceViewOnceOpenJob.KEY, new MultiDeviceViewOnceOpenJob.Factory());
|
||||||
put(MultiDeviceViewedUpdateJob.KEY, new MultiDeviceViewedUpdateJob.Factory());
|
put(MultiDeviceViewedUpdateJob.KEY, new MultiDeviceViewedUpdateJob.Factory());
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
package org.thoughtcrime.securesms.jobs
|
||||||
|
|
||||||
|
import org.signal.core.util.logging.Log
|
||||||
|
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil
|
||||||
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
|
||||||
|
import org.thoughtcrime.securesms.jobmanager.Data
|
||||||
|
import org.thoughtcrime.securesms.jobmanager.Job
|
||||||
|
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
|
||||||
|
import org.thoughtcrime.securesms.net.NotPushRegisteredException
|
||||||
|
import org.thoughtcrime.securesms.recipients.Recipient
|
||||||
|
import org.thoughtcrime.securesms.util.TextSecurePreferences
|
||||||
|
import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage
|
||||||
|
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException
|
||||||
|
import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a sync message to linked devices to notify them to refresh subscription status.
|
||||||
|
*/
|
||||||
|
class MultiDeviceSubscriptionSyncRequestJob private constructor(parameters: Parameters) : BaseJob(parameters) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val KEY = "MultiDeviceSubscriptionSyncRequestJob"
|
||||||
|
|
||||||
|
private val TAG = Log.tag(MultiDeviceSubscriptionSyncRequestJob::class.java)
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun enqueue() {
|
||||||
|
val job = MultiDeviceSubscriptionSyncRequestJob(
|
||||||
|
Parameters.Builder()
|
||||||
|
.setQueue("MultiDeviceSubscriptionSyncRequestJob")
|
||||||
|
.setMaxInstancesForFactory(2)
|
||||||
|
.addConstraint(NetworkConstraint.KEY)
|
||||||
|
.setMaxAttempts(10)
|
||||||
|
.build()
|
||||||
|
)
|
||||||
|
|
||||||
|
ApplicationDependencies.getJobManager().add(job)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun serialize(): Data = Data.EMPTY
|
||||||
|
|
||||||
|
override fun getFactoryKey(): String = KEY
|
||||||
|
|
||||||
|
override fun onFailure() {
|
||||||
|
Log.w(TAG, "Did not succeed!")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRun() {
|
||||||
|
if (!Recipient.self().isRegistered) {
|
||||||
|
throw NotPushRegisteredException()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TextSecurePreferences.isMultiDevice(context)) {
|
||||||
|
Log.i(TAG, "Not multi device, aborting...")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val messageSender = ApplicationDependencies.getSignalServiceMessageSender()
|
||||||
|
|
||||||
|
messageSender.sendSyncMessage(
|
||||||
|
SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.SUBSCRIPTION_STATUS),
|
||||||
|
UnidentifiedAccessUtil.getAccessForSync(context)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onShouldRetry(e: Exception): Boolean {
|
||||||
|
return e is PushNetworkException && e !is ServerRejectedException
|
||||||
|
}
|
||||||
|
|
||||||
|
class Factory : Job.Factory<MultiDeviceSubscriptionSyncRequestJob> {
|
||||||
|
override fun create(parameters: Parameters, data: Data): MultiDeviceSubscriptionSyncRequestJob {
|
||||||
|
return MultiDeviceSubscriptionSyncRequestJob(parameters)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -218,6 +218,7 @@ public class RefreshOwnProfileJob extends BaseJob {
|
||||||
|
|
||||||
if (!SignalStore.donationsValues().isUserManuallyCancelled()) {
|
if (!SignalStore.donationsValues().isUserManuallyCancelled()) {
|
||||||
Log.d(TAG, "Detected an unexpected subscription expiry.", true);
|
Log.d(TAG, "Detected an unexpected subscription expiry.", true);
|
||||||
|
MultiDeviceSubscriptionSyncRequestJob.enqueue();
|
||||||
SignalStore.donationsValues().setShouldCancelSubscriptionBeforeNextSubscribeAttempt(true);
|
SignalStore.donationsValues().setShouldCancelSubscriptionBeforeNextSubscribeAttempt(true);
|
||||||
}
|
}
|
||||||
} else if (!remoteHasBoostBadges && localHasBoostBadges) {
|
} else if (!remoteHasBoostBadges && localHasBoostBadges) {
|
||||||
|
|
|
@ -104,6 +104,7 @@ public class SubscriptionReceiptRequestResponseJob extends BaseJob {
|
||||||
public void onFailure() {
|
public void onFailure() {
|
||||||
DonorBadgeNotifications.RedemptionFailed.INSTANCE.show(context);
|
DonorBadgeNotifications.RedemptionFailed.INSTANCE.show(context);
|
||||||
SignalStore.donationsValues().markSubscriptionRedemptionFailed();
|
SignalStore.donationsValues().markSubscriptionRedemptionFailed();
|
||||||
|
MultiDeviceSubscriptionSyncRequestJob.enqueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -128,6 +129,7 @@ public class SubscriptionReceiptRequestResponseJob extends BaseJob {
|
||||||
} else {
|
} else {
|
||||||
Log.i(TAG, "Recording end of period from active subscription.", true);
|
Log.i(TAG, "Recording end of period from active subscription.", true);
|
||||||
SignalStore.donationsValues().setLastEndOfPeriod(subscription.getEndOfCurrentPeriod());
|
SignalStore.donationsValues().setLastEndOfPeriod(subscription.getEndOfCurrentPeriod());
|
||||||
|
MultiDeviceSubscriptionSyncRequestJob.enqueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requestContext == null) {
|
if (requestContext == null) {
|
||||||
|
@ -240,6 +242,7 @@ public class SubscriptionReceiptRequestResponseJob extends BaseJob {
|
||||||
private void onPaymentFailure() {
|
private void onPaymentFailure() {
|
||||||
SignalStore.donationsValues().setShouldCancelSubscriptionBeforeNextSubscribeAttempt(true);
|
SignalStore.donationsValues().setShouldCancelSubscriptionBeforeNextSubscribeAttempt(true);
|
||||||
setOutputData(new Data.Builder().putBoolean(DonationReceiptRedemptionJob.INPUT_PAYMENT_FAILURE, true).build());
|
setOutputData(new Data.Builder().putBoolean(DonationReceiptRedemptionJob.INPUT_PAYMENT_FAILURE, true).build());
|
||||||
|
MultiDeviceSubscriptionSyncRequestJob.enqueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -967,6 +967,9 @@ public final class MessageContentProcessor {
|
||||||
case STORAGE_MANIFEST:
|
case STORAGE_MANIFEST:
|
||||||
StorageSyncHelper.scheduleSyncForDataChange();
|
StorageSyncHelper.scheduleSyncForDataChange();
|
||||||
break;
|
break;
|
||||||
|
case SUBSCRIPTION_STATUS:
|
||||||
|
warn(TAG, "Dropping subscription status fetch message.");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
warn(TAG, "Received a fetch message for an unknown type.");
|
warn(TAG, "Received a fetch message for an unknown type.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1214,6 +1214,9 @@ public class SignalServiceMessageSender {
|
||||||
case STORAGE_MANIFEST:
|
case STORAGE_MANIFEST:
|
||||||
fetchMessage.setType(SyncMessage.FetchLatest.Type.STORAGE_MANIFEST);
|
fetchMessage.setType(SyncMessage.FetchLatest.Type.STORAGE_MANIFEST);
|
||||||
break;
|
break;
|
||||||
|
case SUBSCRIPTION_STATUS:
|
||||||
|
fetchMessage.setType(SyncMessage.FetchLatest.Type.SUBSCRIPTION_STATUS);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
Log.w(TAG, "Unknown fetch type!");
|
Log.w(TAG, "Unknown fetch type!");
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -741,8 +741,9 @@ public final class SignalServiceContent {
|
||||||
|
|
||||||
if (content.hasFetchLatest() && content.getFetchLatest().hasType()) {
|
if (content.hasFetchLatest() && content.getFetchLatest().hasType()) {
|
||||||
switch (content.getFetchLatest().getType()) {
|
switch (content.getFetchLatest().getType()) {
|
||||||
case LOCAL_PROFILE: return SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.LOCAL_PROFILE);
|
case LOCAL_PROFILE: return SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.LOCAL_PROFILE);
|
||||||
case STORAGE_MANIFEST: return SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.STORAGE_MANIFEST);
|
case STORAGE_MANIFEST: return SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.STORAGE_MANIFEST);
|
||||||
|
case SUBSCRIPTION_STATUS: return SignalServiceSyncMessage.forFetchLatest(SignalServiceSyncMessage.FetchType.SUBSCRIPTION_STATUS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -434,6 +434,7 @@ public class SignalServiceSyncMessage {
|
||||||
|
|
||||||
public enum FetchType {
|
public enum FetchType {
|
||||||
LOCAL_PROFILE,
|
LOCAL_PROFILE,
|
||||||
STORAGE_MANIFEST
|
STORAGE_MANIFEST,
|
||||||
|
SUBSCRIPTION_STATUS
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -447,9 +447,10 @@ message SyncMessage {
|
||||||
|
|
||||||
message FetchLatest {
|
message FetchLatest {
|
||||||
enum Type {
|
enum Type {
|
||||||
UNKNOWN = 0;
|
UNKNOWN = 0;
|
||||||
LOCAL_PROFILE = 1;
|
LOCAL_PROFILE = 1;
|
||||||
STORAGE_MANIFEST = 2;
|
STORAGE_MANIFEST = 2;
|
||||||
|
SUBSCRIPTION_STATUS = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
optional Type type = 1;
|
optional Type type = 1;
|
||||||
|
|
Ładowanie…
Reference in New Issue