@ -11,6 +11,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable ;
import android.support.annotation.Nullable ;
import android.util.Log ;
import android.util.Log ;
import org.thoughtcrime.securesms.ApplicationContext ;
import org.thoughtcrime.securesms.contacts.ContactAccessor ;
import org.thoughtcrime.securesms.contacts.ContactAccessor ;
import org.thoughtcrime.securesms.contacts.ContactAccessor.ContactData ;
import org.thoughtcrime.securesms.contacts.ContactAccessor.ContactData ;
import org.thoughtcrime.securesms.crypto.MasterSecret ;
import org.thoughtcrime.securesms.crypto.MasterSecret ;
@ -45,6 +46,7 @@ import java.io.FileInputStream;
import java.io.FileOutputStream ;
import java.io.FileOutputStream ;
import java.io.IOException ;
import java.io.IOException ;
import java.util.Collection ;
import java.util.Collection ;
import java.util.concurrent.TimeUnit ;
import javax.inject.Inject ;
import javax.inject.Inject ;
@ -54,15 +56,27 @@ public class MultiDeviceContactUpdateJob extends MasterSecretJob implements Inje
private static final String TAG = MultiDeviceContactUpdateJob . class . getSimpleName ( ) ;
private static final String TAG = MultiDeviceContactUpdateJob . class . getSimpleName ( ) ;
private static final long FULL_SYNC_TIME = TimeUnit . HOURS . toMillis ( 6 ) ;
@Inject transient SignalServiceMessageSender messageSender ;
@Inject transient SignalServiceMessageSender messageSender ;
private final @Nullable String address ;
private final @Nullable String address ;
private boolean forceSync ;
public MultiDeviceContactUpdateJob ( @NonNull Context context ) {
public MultiDeviceContactUpdateJob ( @NonNull Context context ) {
this ( context , null ) ;
this ( context , false ) ;
}
public MultiDeviceContactUpdateJob ( @NonNull Context context , boolean forceSync ) {
this ( context , null , forceSync ) ;
}
}
public MultiDeviceContactUpdateJob ( @NonNull Context context , @Nullable Address address ) {
public MultiDeviceContactUpdateJob ( @NonNull Context context , @Nullable Address address ) {
this ( context , address , true ) ;
}
public MultiDeviceContactUpdateJob ( @NonNull Context context , @Nullable Address address , boolean forceSync ) {
super ( context , JobParameters . newBuilder ( )
super ( context , JobParameters . newBuilder ( )
. withRequirement ( new NetworkRequirement ( context ) )
. withRequirement ( new NetworkRequirement ( context ) )
. withRequirement ( new MasterSecretRequirement ( context ) )
. withRequirement ( new MasterSecretRequirement ( context ) )
@ -70,6 +84,8 @@ public class MultiDeviceContactUpdateJob extends MasterSecretJob implements Inje
. withPersistence ( )
. withPersistence ( )
. create ( ) ) ;
. create ( ) ) ;
this . forceSync = forceSync ;
if ( address ! = null ) this . address = address . serialize ( ) ;
if ( address ! = null ) this . address = address . serialize ( ) ;
else this . address = null ;
else this . address = null ;
}
}
@ -126,7 +142,21 @@ public class MultiDeviceContactUpdateJob extends MasterSecretJob implements Inje
Log . w ( TAG , "No contact permissions, skipping multi-device contact update..." ) ;
Log . w ( TAG , "No contact permissions, skipping multi-device contact update..." ) ;
return ;
return ;
}
}
boolean isAppVisible = ApplicationContext . getInstance ( context ) . isAppVisible ( ) ;
long timeSinceLastSync = System . currentTimeMillis ( ) - TextSecurePreferences . getLastFullContactSyncTime ( context ) ;
Log . d ( TAG , "Requesting a full contact sync. forced = " + forceSync + ", appVisible = " + isAppVisible + ", timeSinceLastSync = " + timeSinceLastSync + " ms" ) ;
if ( ! forceSync & & ! isAppVisible & & timeSinceLastSync < FULL_SYNC_TIME ) {
Log . i ( TAG , "App is backgrounded and the last contact sync was too soon (" + timeSinceLastSync + " ms ago). Marking that we need a sync. Skipping multi-device contact update..." ) ;
TextSecurePreferences . setNeedsFullContactSync ( context , true ) ;
return ;
}
TextSecurePreferences . setLastFullContactSyncTime ( context , System . currentTimeMillis ( ) ) ;
TextSecurePreferences . setNeedsFullContactSync ( context , false ) ;
File contactDataFile = createTempFile ( "multidevice-contact-update" ) ;
File contactDataFile = createTempFile ( "multidevice-contact-update" ) ;
try {
try {