mirror of
https://github.com/oxen-io/session-android.git
synced 2025-12-05 07:32:14 +00:00
wip
This commit is contained in:
75
src/org/thoughtcrime/securesms/service/AvatarDownloader.java
Normal file
75
src/org/thoughtcrime/securesms/service/AvatarDownloader.java
Normal file
@@ -0,0 +1,75 @@
|
||||
package org.thoughtcrime.securesms.service;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Bitmap;
|
||||
import android.util.Log;
|
||||
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||
import org.thoughtcrime.securesms.database.GroupDatabase;
|
||||
import org.thoughtcrime.securesms.database.PartDatabase;
|
||||
import org.thoughtcrime.securesms.push.PushServiceSocketFactory;
|
||||
import org.thoughtcrime.securesms.util.BitmapDecodingException;
|
||||
import org.thoughtcrime.securesms.util.BitmapUtil;
|
||||
import org.whispersystems.textsecure.crypto.AttachmentCipherInputStream;
|
||||
import org.whispersystems.textsecure.crypto.InvalidMessageException;
|
||||
import org.whispersystems.textsecure.crypto.MasterSecret;
|
||||
import org.whispersystems.textsecure.push.PushServiceSocket;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public class AvatarDownloader {
|
||||
|
||||
private final Context context;
|
||||
|
||||
public AvatarDownloader(Context context) {
|
||||
this.context = context.getApplicationContext();
|
||||
}
|
||||
|
||||
public void process(MasterSecret masterSecret, Intent intent) {
|
||||
try {
|
||||
if (!SendReceiveService.DOWNLOAD_AVATAR_ACTION.equals(intent.getAction()))
|
||||
return;
|
||||
|
||||
String groupId = intent.getStringExtra("group_id");
|
||||
GroupDatabase database = DatabaseFactory.getGroupDatabase(context);
|
||||
GroupDatabase.Reader reader = database.getGroup(groupId);
|
||||
|
||||
GroupDatabase.GroupRecord record;
|
||||
|
||||
while ((record = reader.getNext()) != null) {
|
||||
long avatarId = record.getAvatarId();
|
||||
byte[] key = record.getAvatarKey();
|
||||
String relay = record.getRelay();
|
||||
|
||||
if (avatarId == -1 || key == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
File attachment = downloadAttachment(relay, avatarId);
|
||||
InputStream scaleInputStream = new AttachmentCipherInputStream(attachment, key);
|
||||
InputStream measureInputStream = new AttachmentCipherInputStream(attachment, key);
|
||||
Bitmap avatar = BitmapUtil.createScaledBitmap(measureInputStream, scaleInputStream, 500, 500);
|
||||
|
||||
database.updateAvatar(groupId, avatar);
|
||||
|
||||
avatar.recycle();
|
||||
attachment.delete();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
Log.w("AvatarDownloader", e);
|
||||
} catch (InvalidMessageException e) {
|
||||
Log.w("AvatarDownloader", e);
|
||||
} catch (BitmapDecodingException e) {
|
||||
Log.w("AvatarDownloader", e);
|
||||
}
|
||||
}
|
||||
|
||||
private File downloadAttachment(String relay, long contentLocation) throws IOException {
|
||||
PushServiceSocket socket = PushServiceSocketFactory.create(context);
|
||||
return socket.retrieveAttachment(relay, contentLocation);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.crypto.DecryptingQueue;
|
||||
import org.thoughtcrime.securesms.crypto.KeyExchangeProcessorV2;
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||
import org.thoughtcrime.securesms.database.EncryptingSmsDatabase;
|
||||
import org.thoughtcrime.securesms.database.GroupDatabase;
|
||||
import org.thoughtcrime.securesms.database.MmsDatabase;
|
||||
import org.thoughtcrime.securesms.mms.IncomingMediaMessage;
|
||||
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
||||
@@ -31,9 +32,13 @@ import org.whispersystems.textsecure.crypto.protocol.PreKeyWhisperMessage;
|
||||
import org.whispersystems.textsecure.push.IncomingPushMessage;
|
||||
import org.whispersystems.textsecure.push.PushMessageProtos.PushMessageContent;
|
||||
import org.whispersystems.textsecure.storage.InvalidKeyIdException;
|
||||
import org.whispersystems.textsecure.util.Hex;
|
||||
|
||||
import ws.com.google.android.mms.MmsException;
|
||||
|
||||
import static org.whispersystems.textsecure.push.PushMessageProtos.PushMessageContent.GroupContext;
|
||||
import static org.whispersystems.textsecure.push.PushMessageProtos.PushMessageContent.GroupContext.Type;
|
||||
|
||||
public class PushReceiver {
|
||||
|
||||
public static final int RESULT_OK = 0;
|
||||
@@ -67,8 +72,16 @@ public class PushReceiver {
|
||||
}
|
||||
|
||||
private void handleMessage(MasterSecret masterSecret, Intent intent) {
|
||||
if (intent.getExtras() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
IncomingPushMessage message = intent.getExtras().getParcelable("message");
|
||||
|
||||
if (message == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (message.isSecureMessage()) handleReceivedSecureMessage(masterSecret, message);
|
||||
else if (message.isPreKeyBundle()) handleReceivedPreKeyBundle(masterSecret, message);
|
||||
else handleReceivedMessage(masterSecret, message, false);
|
||||
@@ -105,7 +118,7 @@ public class PushReceiver {
|
||||
} else {
|
||||
SmsTransportDetails transportDetails = new SmsTransportDetails();
|
||||
String encoded = new String(transportDetails.getEncodedMessage(message.getBody()));
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(message, "");
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(message, "", null);
|
||||
|
||||
textMessage = new IncomingPreKeyBundleMessage(textMessage, encoded);
|
||||
DatabaseFactory.getEncryptingSmsDatabase(context).insertMessageInbox(masterSecret, textMessage);
|
||||
@@ -133,12 +146,15 @@ public class PushReceiver {
|
||||
Log.w("PushReceiver", "Processing: " + new String(message.getBody()));
|
||||
PushMessageContent messageContent = PushMessageContent.parseFrom(message.getBody());
|
||||
|
||||
if (messageContent.getAttachmentsCount() > 0 || message.getDestinations().size() > 0) {
|
||||
if (messageContent.hasGroup()) {
|
||||
Log.w("PushReceiver", "Received push group message...");
|
||||
handleReceivedGroupMessage(masterSecret, message, messageContent, secure);
|
||||
} else if (messageContent.getAttachmentsCount() > 0) {
|
||||
Log.w("PushReceiver", "Received push media message...");
|
||||
handleReceivedMediaMessage(masterSecret, message, messageContent, secure);
|
||||
handleReceivedMediaMessage(masterSecret, message, messageContent, secure, null);
|
||||
} else {
|
||||
Log.w("PushReceiver", "Received push text message...");
|
||||
handleReceivedTextMessage(masterSecret, message, messageContent, secure);
|
||||
handleReceivedTextMessage(masterSecret, message, messageContent, secure, null);
|
||||
}
|
||||
} catch (InvalidProtocolBufferException e) {
|
||||
Log.w("PushReceiver", e);
|
||||
@@ -146,17 +162,75 @@ public class PushReceiver {
|
||||
}
|
||||
}
|
||||
|
||||
private void handleReceivedMediaMessage(MasterSecret masterSecret,
|
||||
private void handleReceivedGroupMessage(MasterSecret masterSecret,
|
||||
IncomingPushMessage message,
|
||||
PushMessageContent messageContent,
|
||||
boolean secure)
|
||||
{
|
||||
if (messageContent.getGroup().getType().equals(Type.UNKNOWN)) {
|
||||
Log.w("PushReceiver", "Received group message of unknown type: " +
|
||||
messageContent.getGroup().getType().getNumber());
|
||||
return;
|
||||
}
|
||||
|
||||
if (!messageContent.getGroup().hasId()) {
|
||||
Log.w("PushReceiver", "Received group message with no id!");
|
||||
return;
|
||||
}
|
||||
|
||||
GroupDatabase database = DatabaseFactory.getGroupDatabase(context);
|
||||
GroupContext group = messageContent.getGroup();
|
||||
byte[] id = group.getId().toByteArray();
|
||||
int type = group.getType().getNumber();
|
||||
|
||||
switch (type) {
|
||||
case Type.CREATE_VALUE:
|
||||
database.create(id, message.getSource(), group.getName(), group.getMembersList(), group.getAvatar(), message.getRelay());
|
||||
break;
|
||||
case Type.ADD_VALUE:
|
||||
database.add(id, message.getSource(), group.getMembersList());
|
||||
break;
|
||||
case Type.QUIT_VALUE:
|
||||
database.remove(id, message.getSource());
|
||||
break;
|
||||
case Type.MODIFY_VALUE:
|
||||
database.update(id, message.getSource(), group.getName(), group.getAvatar());
|
||||
break;
|
||||
case Type.DELIVER_VALUE:
|
||||
break;
|
||||
case Type.UNKNOWN_VALUE:
|
||||
default:
|
||||
Log.w("PushReceiver", "Received group message of unknown type: " + type);
|
||||
return;
|
||||
}
|
||||
|
||||
if (group.hasAvatar()) {
|
||||
Intent intent = new Intent(context, SendReceiveService.class);
|
||||
intent.setAction(SendReceiveService.DOWNLOAD_AVATAR_ACTION);
|
||||
context.startService(intent);
|
||||
}
|
||||
|
||||
String groupId = "g_" + Hex.toString(group.getId().toByteArray());
|
||||
|
||||
if (messageContent.getAttachmentsCount() > 0) {
|
||||
handleReceivedMediaMessage(masterSecret, message, messageContent, secure, groupId);
|
||||
} else if (messageContent.hasBody()) {
|
||||
handleReceivedTextMessage(masterSecret, message, messageContent, secure, groupId);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleReceivedMediaMessage(MasterSecret masterSecret,
|
||||
IncomingPushMessage message,
|
||||
PushMessageContent messageContent,
|
||||
boolean secure, String groupId)
|
||||
{
|
||||
|
||||
try {
|
||||
String localNumber = TextSecurePreferences.getLocalNumber(context);
|
||||
MmsDatabase database = DatabaseFactory.getMmsDatabase(context);
|
||||
IncomingMediaMessage mediaMessage = new IncomingMediaMessage(masterSecret, localNumber,
|
||||
message, messageContent);
|
||||
message, messageContent,
|
||||
groupId);
|
||||
|
||||
Pair<Long, Long> messageAndThreadId;
|
||||
|
||||
@@ -181,10 +255,10 @@ public class PushReceiver {
|
||||
private void handleReceivedTextMessage(MasterSecret masterSecret,
|
||||
IncomingPushMessage message,
|
||||
PushMessageContent messageContent,
|
||||
boolean secure)
|
||||
boolean secure, String groupId)
|
||||
{
|
||||
EncryptingSmsDatabase database = DatabaseFactory.getEncryptingSmsDatabase(context);
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(message, "");
|
||||
IncomingTextMessage textMessage = new IncomingTextMessage(message, "", groupId);
|
||||
|
||||
if (secure) {
|
||||
textMessage = new IncomingEncryptedMessage(textMessage, "");
|
||||
@@ -210,7 +284,7 @@ public class PushReceiver {
|
||||
IncomingPushMessage message,
|
||||
boolean invalidVersion)
|
||||
{
|
||||
IncomingTextMessage corruptedMessage = new IncomingTextMessage(message, "");
|
||||
IncomingTextMessage corruptedMessage = new IncomingTextMessage(message, "", null);
|
||||
IncomingKeyExchangeMessage corruptedKeyMessage = new IncomingKeyExchangeMessage(corruptedMessage, "");
|
||||
|
||||
if (!invalidVersion) corruptedKeyMessage.setCorrupted(true);
|
||||
@@ -235,7 +309,7 @@ public class PushReceiver {
|
||||
IncomingPushMessage message,
|
||||
boolean secure)
|
||||
{
|
||||
IncomingTextMessage placeholder = new IncomingTextMessage(message, "");
|
||||
IncomingTextMessage placeholder = new IncomingTextMessage(message, "", null);
|
||||
|
||||
if (secure) {
|
||||
placeholder = new IncomingEncryptedMessage(placeholder, "");
|
||||
|
||||
@@ -57,6 +57,7 @@ public class SendReceiveService extends Service {
|
||||
public static final String RECEIVE_PUSH_ACTION = "org.thoughtcrime.securesms.SendReceiveService.RECEIVE_PUSH_ACTION";
|
||||
public static final String DECRYPTED_PUSH_ACTION = "org.thoughtcrime.securesms.SendReceiveService.DECRYPTED_PUSH_ACTION";
|
||||
public static final String DOWNLOAD_PUSH_ACTION = "org.thoughtcrime.securesms.SendReceiveService.DOWNLOAD_PUSH_ACTION";
|
||||
public static final String DOWNLOAD_AVATAR_ACTION = "org.thoughtcrime.securesms.SendReceiveService.DOWNLOAD_AVATAR_ACTION";
|
||||
|
||||
private static final int SEND_SMS = 0;
|
||||
private static final int RECEIVE_SMS = 1;
|
||||
@@ -66,16 +67,18 @@ public class SendReceiveService extends Service {
|
||||
private static final int DOWNLOAD_MMS_PENDING = 5;
|
||||
private static final int RECEIVE_PUSH = 6;
|
||||
private static final int DOWNLOAD_PUSH = 7;
|
||||
private static final int DOWNLOAD_AVATAR = 8;
|
||||
|
||||
private ToastHandler toastHandler;
|
||||
|
||||
private SmsReceiver smsReceiver;
|
||||
private SmsSender smsSender;
|
||||
private MmsReceiver mmsReceiver;
|
||||
private MmsSender mmsSender;
|
||||
private MmsDownloader mmsDownloader;
|
||||
private PushReceiver pushReceiver;
|
||||
private PushDownloader pushDownloader;
|
||||
private SmsReceiver smsReceiver;
|
||||
private SmsSender smsSender;
|
||||
private MmsReceiver mmsReceiver;
|
||||
private MmsSender mmsSender;
|
||||
private MmsDownloader mmsDownloader;
|
||||
private PushReceiver pushReceiver;
|
||||
private PushDownloader pushDownloader;
|
||||
private AvatarDownloader avatarDownloader;
|
||||
|
||||
private MasterSecret masterSecret;
|
||||
private boolean hasSecret;
|
||||
@@ -122,6 +125,8 @@ public class SendReceiveService extends Service {
|
||||
scheduleSecretRequiredIntent(RECEIVE_PUSH, intent);
|
||||
else if (action.equals(DOWNLOAD_PUSH_ACTION))
|
||||
scheduleSecretRequiredIntent(DOWNLOAD_PUSH, intent);
|
||||
else if (action.equals(DOWNLOAD_AVATAR_ACTION))
|
||||
scheduleIntent(DOWNLOAD_AVATAR, intent);
|
||||
else
|
||||
Log.w("SendReceiveService", "Received intent with unknown action: " + intent.getAction());
|
||||
}
|
||||
@@ -148,13 +153,14 @@ public class SendReceiveService extends Service {
|
||||
}
|
||||
|
||||
private void initializeProcessors() {
|
||||
smsReceiver = new SmsReceiver(this);
|
||||
smsSender = new SmsSender(this, toastHandler);
|
||||
mmsReceiver = new MmsReceiver(this);
|
||||
mmsSender = new MmsSender(this, toastHandler);
|
||||
mmsDownloader = new MmsDownloader(this, toastHandler);
|
||||
pushReceiver = new PushReceiver(this);
|
||||
pushDownloader = new PushDownloader(this);
|
||||
smsReceiver = new SmsReceiver(this);
|
||||
smsSender = new SmsSender(this, toastHandler);
|
||||
mmsReceiver = new MmsReceiver(this);
|
||||
mmsSender = new MmsSender(this, toastHandler);
|
||||
mmsDownloader = new MmsDownloader(this, toastHandler);
|
||||
pushReceiver = new PushReceiver(this);
|
||||
pushDownloader = new PushDownloader(this);
|
||||
avatarDownloader = new AvatarDownloader(this);
|
||||
}
|
||||
|
||||
private void initializeWorkQueue() {
|
||||
@@ -235,14 +241,15 @@ public class SendReceiveService extends Service {
|
||||
@Override
|
||||
public void run() {
|
||||
switch (what) {
|
||||
case RECEIVE_SMS: smsReceiver.process(masterSecret, intent); return;
|
||||
case SEND_SMS: smsSender.process(masterSecret, intent); return;
|
||||
case RECEIVE_MMS: mmsReceiver.process(masterSecret, intent); return;
|
||||
case SEND_MMS: mmsSender.process(masterSecret, intent); return;
|
||||
case DOWNLOAD_MMS: mmsDownloader.process(masterSecret, intent); return;
|
||||
case DOWNLOAD_MMS_PENDING: mmsDownloader.process(masterSecret, intent); return;
|
||||
case RECEIVE_PUSH: pushReceiver.process(masterSecret, intent); return;
|
||||
case DOWNLOAD_PUSH: pushDownloader.process(masterSecret, intent); return;
|
||||
case RECEIVE_SMS: smsReceiver.process(masterSecret, intent); return;
|
||||
case SEND_SMS: smsSender.process(masterSecret, intent); return;
|
||||
case RECEIVE_MMS: mmsReceiver.process(masterSecret, intent); return;
|
||||
case SEND_MMS: mmsSender.process(masterSecret, intent); return;
|
||||
case DOWNLOAD_MMS: mmsDownloader.process(masterSecret, intent); return;
|
||||
case DOWNLOAD_MMS_PENDING: mmsDownloader.process(masterSecret, intent); return;
|
||||
case RECEIVE_PUSH: pushReceiver.process(masterSecret, intent); return;
|
||||
case DOWNLOAD_PUSH: pushDownloader.process(masterSecret, intent); return;
|
||||
case DOWNLOAD_AVATAR: avatarDownloader.process(masterSecret, intent); return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user