mirror of
https://github.com/oxen-io/session-android.git
synced 2025-10-24 06:09:16 +00:00
committed by
Moxie Marlinspike
parent
7e2c9f97e9
commit
80ce83ef9d
@@ -12,6 +12,7 @@ import org.thoughtcrime.securesms.database.PartDatabase;
|
||||
import org.thoughtcrime.securesms.database.PartDatabase.PartId;
|
||||
import org.thoughtcrime.securesms.dependencies.InjectableType;
|
||||
import org.thoughtcrime.securesms.jobs.requirements.MasterSecretRequirement;
|
||||
import org.thoughtcrime.securesms.jobs.requirements.MediaNetworkRequirement;
|
||||
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.whispersystems.jobqueue.JobParameters;
|
||||
@@ -26,7 +27,6 @@ import org.whispersystems.textsecure.api.push.exceptions.PushNetworkException;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
@@ -35,50 +35,49 @@ import ws.com.google.android.mms.MmsException;
|
||||
import ws.com.google.android.mms.pdu.PduPart;
|
||||
|
||||
public class AttachmentDownloadJob extends MasterSecretJob implements InjectableType {
|
||||
|
||||
private static final String TAG = AttachmentDownloadJob.class.getSimpleName();
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final String TAG = AttachmentDownloadJob.class.getSimpleName();
|
||||
|
||||
@Inject transient TextSecureMessageReceiver messageReceiver;
|
||||
|
||||
private final long messageId;
|
||||
private final long partRowId;
|
||||
private final long partUniqueId;
|
||||
|
||||
public AttachmentDownloadJob(Context context, long messageId) {
|
||||
public AttachmentDownloadJob(Context context, long messageId, PartId partId) {
|
||||
super(context, JobParameters.newBuilder()
|
||||
.withGroupId(AttachmentDownloadJob.class.getCanonicalName())
|
||||
.withRequirement(new MasterSecretRequirement(context))
|
||||
.withRequirement(new NetworkRequirement(context))
|
||||
.withRequirement(new MediaNetworkRequirement(context, messageId, partId))
|
||||
.withPersistence()
|
||||
.create());
|
||||
|
||||
this.messageId = messageId;
|
||||
this.messageId = messageId;
|
||||
this.partRowId = partId.getRowId();
|
||||
this.partUniqueId = partId.getUniqueId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdded() {}
|
||||
public void onAdded() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRun(MasterSecret masterSecret) throws IOException {
|
||||
PartDatabase database = DatabaseFactory.getPartDatabase(context);
|
||||
final PartId partId = new PartId(partRowId, partUniqueId);
|
||||
final PduPart part = DatabaseFactory.getPartDatabase(context).getPart(partId);
|
||||
|
||||
Log.w(TAG, "Downloading push parts for: " + messageId);
|
||||
|
||||
List<PduPart> parts = database.getParts(messageId);
|
||||
|
||||
for (PduPart part : parts) {
|
||||
retrievePart(masterSecret, part, messageId);
|
||||
Log.w(TAG, "Got part: " + part.getPartId());
|
||||
}
|
||||
Log.w(TAG, "Downloading push part " + partId);
|
||||
|
||||
retrievePart(masterSecret, part, messageId);
|
||||
MessageNotifier.updateNotification(context, masterSecret);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCanceled() {
|
||||
PartDatabase database = DatabaseFactory.getPartDatabase(context);
|
||||
List<PduPart> parts = database.getParts(messageId);
|
||||
|
||||
for (PduPart part : parts) {
|
||||
markFailed(messageId, part, part.getPartId());
|
||||
}
|
||||
final PartId partId = new PartId(partRowId, partUniqueId);
|
||||
final PduPart part = DatabaseFactory.getPartDatabase(context).getPart(partId);
|
||||
markFailed(messageId, part, part.getPartId());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -58,9 +58,11 @@ import org.whispersystems.textsecure.api.messages.multidevice.SentTranscriptMess
|
||||
import org.whispersystems.textsecure.api.messages.multidevice.TextSecureSyncMessage;
|
||||
import org.whispersystems.textsecure.api.push.TextSecureAddress;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import ws.com.google.android.mms.MmsException;
|
||||
import ws.com.google.android.mms.pdu.PduPart;
|
||||
|
||||
public class PushDecryptJob extends ContextJob {
|
||||
|
||||
@@ -252,11 +254,14 @@ public class PushDecryptJob extends ContextJob {
|
||||
message.getGroupInfo(),
|
||||
message.getAttachments());
|
||||
|
||||
Pair<Long, Long> messageAndThreadId = database.insertSecureDecryptedMessageInbox(masterSecret, mediaMessage, -1);
|
||||
Pair<Long, Long> messageAndThreadId = database.insertSecureDecryptedMessageInbox(masterSecret, mediaMessage, -1);
|
||||
|
||||
ApplicationContext.getInstance(context)
|
||||
.getJobManager()
|
||||
.add(new AttachmentDownloadJob(context, messageAndThreadId.first));
|
||||
List<PduPart> parts = DatabaseFactory.getPartDatabase(context).getParts(messageAndThreadId.first);
|
||||
for (PduPart part : parts) {
|
||||
ApplicationContext.getInstance(context)
|
||||
.getJobManager()
|
||||
.add(new AttachmentDownloadJob(context, messageAndThreadId.first, part.getPartId()));
|
||||
}
|
||||
|
||||
if (smsMessageId.isPresent()) {
|
||||
DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
|
||||
@@ -284,9 +289,11 @@ public class PushDecryptJob extends ContextJob {
|
||||
database.markAsSent(messageId, "push".getBytes(), 0);
|
||||
database.markAsPush(messageId);
|
||||
|
||||
ApplicationContext.getInstance(context)
|
||||
.getJobManager()
|
||||
.add(new AttachmentDownloadJob(context, messageId));
|
||||
for (PduPart part : DatabaseFactory.getPartDatabase(context).getParts(messageId)) {
|
||||
ApplicationContext.getInstance(context)
|
||||
.getJobManager()
|
||||
.add(new AttachmentDownloadJob(context, messageId, part.getPartId()));
|
||||
}
|
||||
|
||||
if (smsMessageId.isPresent()) {
|
||||
DatabaseFactory.getSmsDatabase(context).deleteMessage(smsMessageId.get());
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
package org.thoughtcrime.securesms.jobs.requirements;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.NetworkInfo;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||
import org.thoughtcrime.securesms.database.PartDatabase;
|
||||
import org.thoughtcrime.securesms.database.PartDatabase.PartId;
|
||||
import org.thoughtcrime.securesms.util.MediaUtil;
|
||||
import org.thoughtcrime.securesms.util.ServiceUtil;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.whispersystems.jobqueue.dependencies.ContextDependent;
|
||||
import org.whispersystems.jobqueue.requirements.Requirement;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
import ws.com.google.android.mms.pdu.PduPart;
|
||||
|
||||
public class MediaNetworkRequirement implements Requirement, ContextDependent {
|
||||
private static final long serialVersionUID = 0L;
|
||||
private static final String TAG = MediaNetworkRequirement.class.getSimpleName();
|
||||
|
||||
private transient Context context;
|
||||
|
||||
private final long messageId;
|
||||
private final long partRowId;
|
||||
private final long partUniqueId;
|
||||
|
||||
public MediaNetworkRequirement(Context context, long messageId, PartId partId) {
|
||||
this.context = context;
|
||||
this.messageId = messageId;
|
||||
this.partRowId = partId.getRowId();
|
||||
this.partUniqueId = partId.getUniqueId();
|
||||
}
|
||||
|
||||
@Override public void setContext(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
private NetworkInfo getNetworkInfo() {
|
||||
return ServiceUtil.getConnectivityManager(context).getActiveNetworkInfo();
|
||||
}
|
||||
|
||||
public boolean isConnectedWifi() {
|
||||
final NetworkInfo info = getNetworkInfo();
|
||||
return info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI;
|
||||
}
|
||||
|
||||
public boolean isConnectedMobile() {
|
||||
final NetworkInfo info = getNetworkInfo();
|
||||
return info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE;
|
||||
}
|
||||
|
||||
public boolean isConnectedRoaming() {
|
||||
final NetworkInfo info = getNetworkInfo();
|
||||
return info != null && info.isConnected() && info.isRoaming() && info.getType() == ConnectivityManager.TYPE_MOBILE;
|
||||
}
|
||||
|
||||
private @NonNull Set<String> getAllowedAutoDownloadTypes() {
|
||||
if (isConnectedWifi()) {
|
||||
return TextSecurePreferences.getWifiMediaDownloadAllowed(context);
|
||||
} else if (isConnectedRoaming()) {
|
||||
return TextSecurePreferences.getRoamingMediaDownloadAllowed(context);
|
||||
} else if (isConnectedMobile()) {
|
||||
return TextSecurePreferences.getMobileMediaDownloadAllowed(context);
|
||||
} else {
|
||||
return Collections.emptySet();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPresent() {
|
||||
final PartId partId = new PartId(partRowId, partUniqueId);
|
||||
final PartDatabase db = DatabaseFactory.getPartDatabase(context);
|
||||
final PduPart part = db.getPart(partId);
|
||||
if (part == null) {
|
||||
Log.w(TAG, "part was null");
|
||||
return false;
|
||||
}
|
||||
|
||||
Log.w(TAG, "part transfer progress is " + part.getTransferProgress());
|
||||
switch (part.getTransferProgress()) {
|
||||
case PartDatabase.TRANSFER_PROGRESS_STARTED:
|
||||
return true;
|
||||
case PartDatabase.TRANSFER_PROGRESS_AUTO_PENDING:
|
||||
final Set<String> allowedTypes = getAllowedAutoDownloadTypes();
|
||||
final boolean isAllowed = allowedTypes.contains(MediaUtil.getDiscreteMimeType(part));
|
||||
|
||||
if (isAllowed) db.setTransferState(messageId, partId, PartDatabase.TRANSFER_PROGRESS_STARTED);
|
||||
return isAllowed;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package org.thoughtcrime.securesms.jobs.requirements;
|
||||
|
||||
import org.whispersystems.jobqueue.requirements.RequirementListener;
|
||||
import org.whispersystems.jobqueue.requirements.RequirementProvider;
|
||||
|
||||
public class MediaNetworkRequirementProvider implements RequirementProvider {
|
||||
|
||||
private RequirementListener listener;
|
||||
|
||||
public void notifyMediaControlEvent() {
|
||||
if (listener != null) listener.onRequirementStatusChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setListener(RequirementListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user