mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-28 04:25:18 +00:00
WIP
This commit is contained in:
parent
787b74ad1f
commit
93b7472e25
@ -76,6 +76,7 @@ import org.webrtc.voiceengine.WebRtcAudioUtils;
|
|||||||
import org.whispersystems.libsignal.logging.SignalProtocolLoggerProvider;
|
import org.whispersystems.libsignal.logging.SignalProtocolLoggerProvider;
|
||||||
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
|
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
|
||||||
import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
|
import org.whispersystems.signalservice.internal.push.SignalServiceProtos;
|
||||||
|
import org.whispersystems.signalservice.loki.api.LokiGroupChatAPI;
|
||||||
import org.whispersystems.signalservice.loki.api.LokiLongPoller;
|
import org.whispersystems.signalservice.loki.api.LokiLongPoller;
|
||||||
import org.whispersystems.signalservice.loki.api.LokiP2PAPI;
|
import org.whispersystems.signalservice.loki.api.LokiP2PAPI;
|
||||||
import org.whispersystems.signalservice.loki.api.LokiP2PAPIDelegate;
|
import org.whispersystems.signalservice.loki.api.LokiP2PAPIDelegate;
|
||||||
@ -423,7 +424,8 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc
|
|||||||
public void setUpPublicChatIfNeeded() {
|
public void setUpPublicChatIfNeeded() {
|
||||||
boolean isPublicChatSetUp = TextSecurePreferences.isPublicChatSetUp(this);
|
boolean isPublicChatSetUp = TextSecurePreferences.isPublicChatSetUp(this);
|
||||||
if (isPublicChatSetUp) return;
|
if (isPublicChatSetUp) return;
|
||||||
GroupManager.createGroup(this, new HashSet<>(), null, "Loki Public Chat", false);
|
String id = "loki-group-chat-" + LokiGroupChatAPI.getPublicChatID();
|
||||||
|
GroupManager.createGroup(id, this, new HashSet<>(), null, "Loki Public Chat", false);
|
||||||
TextSecurePreferences.markPublicChatSetUp(this);
|
TextSecurePreferences.markPublicChatSetUp(this);
|
||||||
}
|
}
|
||||||
// endregion
|
// endregion
|
||||||
|
@ -46,6 +46,7 @@ import org.thoughtcrime.securesms.database.Address;
|
|||||||
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
import org.thoughtcrime.securesms.database.DatabaseFactory;
|
||||||
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
|
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
|
||||||
import org.thoughtcrime.securesms.lock.RegistrationLockDialog;
|
import org.thoughtcrime.securesms.lock.RegistrationLockDialog;
|
||||||
|
import org.thoughtcrime.securesms.loki.LokiGroupChatPoller;
|
||||||
import org.thoughtcrime.securesms.notifications.MarkReadReceiver;
|
import org.thoughtcrime.securesms.notifications.MarkReadReceiver;
|
||||||
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
import org.thoughtcrime.securesms.notifications.MessageNotifier;
|
||||||
import org.thoughtcrime.securesms.permissions.Permissions;
|
import org.thoughtcrime.securesms.permissions.Permissions;
|
||||||
@ -57,6 +58,7 @@ import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
|
|||||||
import org.thoughtcrime.securesms.util.DynamicTheme;
|
import org.thoughtcrime.securesms.util.DynamicTheme;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
|
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
|
||||||
|
import org.whispersystems.signalservice.loki.api.LokiGroupChatAPI;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -104,6 +106,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
|||||||
RegistrationLockDialog.showReminderIfNecessary(this);
|
RegistrationLockDialog.showReminderIfNecessary(this);
|
||||||
|
|
||||||
TooltipCompat.setTooltipText(searchAction, getText(R.string.SearchToolbar_search_for_conversations_contacts_and_messages));
|
TooltipCompat.setTooltipText(searchAction, getText(R.string.SearchToolbar_search_for_conversations_contacts_and_messages));
|
||||||
|
|
||||||
|
LokiGroupChatPoller.poll(this, LokiGroupChatAPI.getPublicChatID());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -56,7 +56,6 @@ import org.thoughtcrime.securesms.BindableConversationItem;
|
|||||||
import org.thoughtcrime.securesms.ConfirmIdentityDialog;
|
import org.thoughtcrime.securesms.ConfirmIdentityDialog;
|
||||||
import org.thoughtcrime.securesms.MediaPreviewActivity;
|
import org.thoughtcrime.securesms.MediaPreviewActivity;
|
||||||
import org.thoughtcrime.securesms.MessageDetailsActivity;
|
import org.thoughtcrime.securesms.MessageDetailsActivity;
|
||||||
import network.loki.messenger.R;
|
|
||||||
import org.thoughtcrime.securesms.attachments.Attachment;
|
import org.thoughtcrime.securesms.attachments.Attachment;
|
||||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||||
import org.thoughtcrime.securesms.components.AlertView;
|
import org.thoughtcrime.securesms.components.AlertView;
|
||||||
@ -115,6 +114,8 @@ import java.util.List;
|
|||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import network.loki.messenger.R;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A view that displays an individual conversation item within a conversation
|
* A view that displays an individual conversation item within a conversation
|
||||||
* thread. Used by ComposeMessageActivity's ListActivity via a ConversationAdapter.
|
* thread. Used by ComposeMessageActivity's ListActivity via a ConversationAdapter.
|
||||||
|
@ -41,10 +41,22 @@ public class GroupManager {
|
|||||||
@Nullable Bitmap avatar,
|
@Nullable Bitmap avatar,
|
||||||
@Nullable String name,
|
@Nullable String name,
|
||||||
boolean mms)
|
boolean mms)
|
||||||
|
{
|
||||||
|
GroupDatabase database = DatabaseFactory.getGroupDatabase(context);
|
||||||
|
String id = GroupUtil.getEncodedId(database.allocateGroupId(), mms);
|
||||||
|
return createGroup(id, context, members, avatar, name, mms);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static @NonNull GroupActionResult createGroup(@NonNull String id,
|
||||||
|
@NonNull Context context,
|
||||||
|
@NonNull Set<Recipient> members,
|
||||||
|
@Nullable Bitmap avatar,
|
||||||
|
@Nullable String name,
|
||||||
|
boolean mms)
|
||||||
{
|
{
|
||||||
final byte[] avatarBytes = BitmapUtil.toByteArray(avatar);
|
final byte[] avatarBytes = BitmapUtil.toByteArray(avatar);
|
||||||
final GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
|
final GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
|
||||||
final String groupId = GroupUtil.getEncodedId(groupDatabase.allocateGroupId(), mms);
|
final String groupId = GroupUtil.getEncodedId(id.getBytes(), mms);
|
||||||
final Recipient groupRecipient = Recipient.from(context, Address.fromSerialized(groupId), false);
|
final Recipient groupRecipient = Recipient.from(context, Address.fromSerialized(groupId), false);
|
||||||
final Set<Address> memberAddresses = getMemberAddresses(members);
|
final Set<Address> memberAddresses = getMemberAddresses(members);
|
||||||
|
|
||||||
|
@ -111,6 +111,7 @@ import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSy
|
|||||||
import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage;
|
import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage;
|
||||||
import org.whispersystems.signalservice.api.messages.shared.SharedContact;
|
import org.whispersystems.signalservice.api.messages.shared.SharedContact;
|
||||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||||
|
import org.whispersystems.signalservice.loki.api.LokiGroupChatAPI;
|
||||||
import org.whispersystems.signalservice.loki.crypto.LokiServiceCipher;
|
import org.whispersystems.signalservice.loki.crypto.LokiServiceCipher;
|
||||||
import org.whispersystems.signalservice.loki.messaging.LokiMessageFriendRequestStatus;
|
import org.whispersystems.signalservice.loki.messaging.LokiMessageFriendRequestStatus;
|
||||||
import org.whispersystems.signalservice.loki.messaging.LokiServiceMessage;
|
import org.whispersystems.signalservice.loki.messaging.LokiServiceMessage;
|
||||||
@ -816,7 +817,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
|
|||||||
return threadId;
|
return threadId;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleTextMessage(@NonNull SignalServiceContent content,
|
public void handleTextMessage(@NonNull SignalServiceContent content,
|
||||||
@NonNull SignalServiceDataMessage message,
|
@NonNull SignalServiceDataMessage message,
|
||||||
@NonNull Optional<Long> smsMessageId)
|
@NonNull Optional<Long> smsMessageId)
|
||||||
throws StorageFailedException
|
throws StorageFailedException
|
||||||
@ -830,10 +831,13 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Long threadId;
|
Long threadId;
|
||||||
|
boolean isLokiPublicChatMessage;
|
||||||
|
|
||||||
if (smsMessageId.isPresent() && !message.getGroupInfo().isPresent()) {
|
if (smsMessageId.isPresent() && !message.getGroupInfo().isPresent()) {
|
||||||
|
isLokiPublicChatMessage = false;
|
||||||
threadId = database.updateBundleMessageBody(smsMessageId.get(), body).second;
|
threadId = database.updateBundleMessageBody(smsMessageId.get(), body).second;
|
||||||
} else {
|
} else {
|
||||||
|
isLokiPublicChatMessage = new String(message.getGroupInfo().get().getGroupId()).equals("loki-group-chat-" + LokiGroupChatAPI.getPublicChatID());
|
||||||
notifyTypingStoppedFromIncomingMessage(recipient, content.getSender(), content.getSenderDevice());
|
notifyTypingStoppedFromIncomingMessage(recipient, content.getSender(), content.getSenderDevice());
|
||||||
|
|
||||||
IncomingTextMessage textMessage = new IncomingTextMessage(Address.fromSerialized(content.getSender()),
|
IncomingTextMessage textMessage = new IncomingTextMessage(Address.fromSerialized(content.getSender()),
|
||||||
@ -852,7 +856,7 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
|
|||||||
if (smsMessageId.isPresent()) database.deleteMessage(smsMessageId.get());
|
if (smsMessageId.isPresent()) database.deleteMessage(smsMessageId.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (threadId != null) {
|
if (threadId != null && !isLokiPublicChatMessage) {
|
||||||
MessageNotifier.updateNotification(context, threadId);
|
MessageNotifier.updateNotification(context, threadId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
30
src/org/thoughtcrime/securesms/loki/LokiGroupChatPoller.kt
Normal file
30
src/org/thoughtcrime/securesms/loki/LokiGroupChatPoller.kt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package org.thoughtcrime.securesms.loki
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.Log
|
||||||
|
import org.thoughtcrime.securesms.jobs.PushDecryptJob
|
||||||
|
import org.whispersystems.libsignal.util.guava.Optional
|
||||||
|
import org.whispersystems.signalservice.api.messages.SignalServiceContent
|
||||||
|
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage
|
||||||
|
import org.whispersystems.signalservice.api.messages.SignalServiceGroup
|
||||||
|
import org.whispersystems.signalservice.api.push.SignalServiceAddress
|
||||||
|
import org.whispersystems.signalservice.loki.api.LokiGroupChatAPI
|
||||||
|
|
||||||
|
object LokiGroupChatPoller {
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun poll(context: Context, groupID: Long) {
|
||||||
|
LokiGroupChatAPI.getMessages(groupID).success { messages ->
|
||||||
|
messages.map { message ->
|
||||||
|
val id = "loki-group-chat-$groupID".toByteArray()
|
||||||
|
val x1 = SignalServiceGroup(SignalServiceGroup.Type.UPDATE, id, null, null, null)
|
||||||
|
val x2 = SignalServiceDataMessage(message.timestamp, x1, null, message.body)
|
||||||
|
val senderDisplayName = "${message.displayName} (...${message.hexEncodedPublicKey.takeLast(8)})"
|
||||||
|
val x3 = SignalServiceContent(x2, senderDisplayName, SignalServiceAddress.DEFAULT_DEVICE_ID, message.timestamp, false)
|
||||||
|
PushDecryptJob(context).handleTextMessage(x3, x2, Optional.absent())
|
||||||
|
}
|
||||||
|
}.fail {
|
||||||
|
Log.d("Loki", "Failed to get messages for group chat with ID: $groupID.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user