private long getThreadIdFor(IncomingMediaMessage retrieved) throws RecipientFormattingException, MmsException { if (retrieved.getGroupId() != null) { Recipients groupRecipients = RecipientFactory.getRecipientsFromString(context, retrieved.getGroupId(), true); return DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipients); } String localNumber; Set<String> group = new HashSet<>(); if (retrieved.getAddresses().getFrom() == null) { throw new MmsException("FROM value in PduHeaders did not exist."); } group.add(retrieved.getAddresses().getFrom()); if (TextSecurePreferences.isPushRegistered(context)) { localNumber = TextSecurePreferences.getLocalNumber(context); } else { localNumber = ServiceUtil.getTelephonyManager(context).getLine1Number(); } for (String cc : retrieved.getAddresses().getCc()) { PhoneNumberUtil.MatchType match; if (localNumber == null) match = PhoneNumberUtil.MatchType.NO_MATCH; else match = PhoneNumberUtil.getInstance().isNumberMatch(localNumber, cc); if (match == PhoneNumberUtil.MatchType.NO_MATCH || match == PhoneNumberUtil.MatchType.NOT_A_NUMBER) { group.add(cc); } } if (retrieved.getAddresses().getTo().size() > 1) { for (String to : retrieved.getAddresses().getTo()) { PhoneNumberUtil.MatchType match; if (localNumber == null) match = PhoneNumberUtil.MatchType.NO_MATCH; else match = PhoneNumberUtil.getInstance().isNumberMatch(localNumber, to); if (match == PhoneNumberUtil.MatchType.NO_MATCH || match == PhoneNumberUtil.MatchType.NOT_A_NUMBER) { group.add(to); } } } String recipientsList = Util.join(group, ","); Recipients recipients = RecipientFactory.getRecipientsFromString(context, recipientsList, false); return DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients); }
@Override public List<Integer> getSubDeviceSessions(String name) { long recipientId = RecipientFactory.getRecipientsFromString(context, name, true) .getPrimaryRecipient() .getRecipientId(); List<Integer> results = new LinkedList<>(); File parent = getSessionDirectory(); String[] children = parent.list(); if (children == null) return results; for (String child : children) { try { String[] parts = child.split("[.]", 2); long sessionRecipientId = Long.parseLong(parts[0]); if (sessionRecipientId == recipientId && parts.length > 1) { results.add(Integer.parseInt(parts[1])); } } catch (NumberFormatException e) { Log.w(TAG, e); } } return results; }
private void handleCommonRegistration( MasterSecret masterSecret, TextSecureAccountManager accountManager, String number) throws IOException { setState(new RegistrationState(RegistrationState.STATE_GENERATING_KEYS, number)); Recipient self = RecipientFactory.getRecipientsFromString(this, number, false).getPrimaryRecipient(); IdentityKeyPair identityKey = IdentityKeyUtil.getIdentityKeyPair(this, masterSecret); List<PreKeyRecord> records = PreKeyUtil.generatePreKeys(this, masterSecret); PreKeyRecord lastResort = PreKeyUtil.generateLastResortKey(this, masterSecret); SignedPreKeyRecord signedPreKey = PreKeyUtil.generateSignedPreKey(this, masterSecret, identityKey); accountManager.setPreKeys(identityKey.getPublicKey(), lastResort, signedPreKey, records); setState(new RegistrationState(RegistrationState.STATE_GCM_REGISTERING, number)); String gcmRegistrationId = ""; accountManager.setGcmId(Optional.of(gcmRegistrationId)); TextSecurePreferences.setGcmRegistrationId(this, gcmRegistrationId); TextSecurePreferences.setWebsocketRegistered(this, true); DatabaseFactory.getIdentityDatabase(this) .saveIdentity(masterSecret, self.getRecipientId(), identityKey.getPublicKey()); DirectoryHelper.refreshDirectory(this, accountManager, number); DirectoryRefreshListener.schedule(this); }
private @NonNull Pair<Long, Long> insertCallLog( @NonNull String number, long type, boolean unread) { Recipients recipients = RecipientFactory.getRecipientsFromString(context, number, true); long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients); ContentValues values = new ContentValues(6); values.put(ADDRESS, number); values.put(ADDRESS_DEVICE_ID, 1); values.put(DATE_RECEIVED, System.currentTimeMillis()); values.put(DATE_SENT, System.currentTimeMillis()); values.put(READ, unread ? 0 : 1); values.put(TYPE, type); values.put(THREAD_ID, threadId); SQLiteDatabase db = databaseHelper.getWritableDatabase(); long messageId = db.insert(TABLE_NAME, null, values); DatabaseFactory.getThreadDatabase(context).update(threadId, true); notifyConversationListeners(threadId); jobManager.add(new TrimThreadJob(context, threadId)); if (unread) { DatabaseFactory.getThreadDatabase(context).setUnread(threadId); } return new Pair<>(messageId, threadId); }
private boolean isBlocked(IncomingTextMessage message) { if (message.getSender() != null) { Recipients recipients = RecipientFactory.getRecipientsFromString(context, message.getSender(), false); return recipients.isBlocked(); } return false; }
private String getSessionName(AxolotlAddress axolotlAddress) { Recipient recipient = RecipientFactory.getRecipientsFromString(context, axolotlAddress.getName(), true) .getPrimaryRecipient(); long recipientId = recipient.getRecipientId(); int deviceId = axolotlAddress.getDeviceId(); return recipientId + (deviceId == TextSecureAddress.DEFAULT_DEVICE_ID ? "" : "." + deviceId); }
private long getThreadIdFor(@NonNull NotificationInd notification) { String fromString = notification.getFrom() != null && notification.getFrom().getTextString() != null ? Util.toIsoString(notification.getFrom().getTextString()) : ""; Recipients recipients = RecipientFactory.getRecipientsFromString(context, fromString, false); if (recipients.isEmpty()) recipients = RecipientFactory.getRecipientsFor(context, Recipient.getUnknownRecipient(), false); return DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients); }
public GroupDescription(@NonNull Context context, @Nullable GroupContext groupContext) { this.context = context.getApplicationContext(); this.groupContext = groupContext; if (groupContext == null || groupContext.getMembersList().isEmpty()) { this.members = null; } else { this.members = RecipientFactory.getRecipientsFromString( context, Util.join(groupContext.getMembersList(), ", "), true); } }
private Recipients getRecipientsFor(String address) { if (TextUtils.isEmpty(address) || address.equals("insert-address-token")) { return RecipientFactory.getRecipientsFor(context, Recipient.getUnknownRecipient(), true); } Recipients recipients = RecipientFactory.getRecipientsFromString(context, address, true); if (recipients == null || recipients.isEmpty()) { return RecipientFactory.getRecipientsFor(context, Recipient.getUnknownRecipient(), true); } return recipients; }
private Recipients getRecipientsFor(String address) { if (address != null) { Recipients recipients = RecipientFactory.getRecipientsFromString(context, address, true); if (recipients == null || recipients.isEmpty()) { return RecipientFactory.getRecipientsFor(context, Recipient.getUnknownRecipient(), true); } return recipients; } else { Log.w(TAG, "getRecipientsFor() address is null"); return RecipientFactory.getRecipientsFor(context, Recipient.getUnknownRecipient(), true); } }
private static Recipients getOurRecipients(Context context, String theirRecipients) { StringTokenizer tokenizer = new StringTokenizer(theirRecipients.trim(), " "); StringBuilder sb = new StringBuilder(); while (tokenizer.hasMoreTokens()) { String theirRecipientId = tokenizer.nextToken(); String address = getTheirCanonicalAddress(context, theirRecipientId); if (address == null) continue; if (sb.length() != 0) sb.append(','); sb.append(address); } try { if (sb.length() == 0) return null; else return RecipientFactory.getRecipientsFromString(context, sb.toString()); } catch (RecipientFormattingException rfe) { Log.w("SmsMigrator", rfe); return null; } }
private void createConversationIfNecessary(Intent intent) { long thread = intent.getLongExtra("thread_id", -1L); Recipients recipients = null; if (intent.getAction() != null && intent.getAction().equals("android.intent.action.SENDTO")) { try { recipients = RecipientFactory.getRecipientsFromString( this, intent.getData().getSchemeSpecificPart()); thread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(recipients); } catch (RecipientFormattingException rfe) { recipients = null; } } else { recipients = intent.getParcelableExtra("recipients"); } if (recipients != null) { createConversation(thread, recipients); intent.putExtra("thread_id", -1L); intent.putExtra("recipients", (Parcelable) null); intent.setAction(null); } }
protected Pair<Long, Long> insertMessageInbox(IncomingTextMessage message, long type) { if (message.isJoined()) { type = (type & (Types.TOTAL_MASK - Types.BASE_TYPE_MASK)) | Types.JOINED_TYPE; } else if (message.isPreKeyBundle()) { type |= Types.KEY_EXCHANGE_BIT | Types.KEY_EXCHANGE_BUNDLE_BIT; } else if (message.isSecureMessage()) { type |= Types.SECURE_MESSAGE_BIT; } else if (message.isGroup()) { type |= Types.SECURE_MESSAGE_BIT; if (((IncomingGroupMessage) message).isUpdate()) type |= Types.GROUP_UPDATE_BIT; else if (((IncomingGroupMessage) message).isQuit()) type |= Types.GROUP_QUIT_BIT; } else if (message.isEndSession()) { type |= Types.SECURE_MESSAGE_BIT; type |= Types.END_SESSION_BIT; } if (message.isPush()) type |= Types.PUSH_MESSAGE_BIT; Recipients recipients; if (message.getSender() != null) { recipients = RecipientFactory.getRecipientsFromString(context, message.getSender(), true); } else { Log.w(TAG, "Sender is null, returning unknown recipient"); recipients = RecipientFactory.getRecipientsFor(context, Recipient.getUnknownRecipient(), false); } Recipients groupRecipients; if (message.getGroupId() == null) { groupRecipients = null; } else { groupRecipients = RecipientFactory.getRecipientsFromString(context, message.getGroupId(), true); } boolean unread = org.thoughtcrime.securesms.util.Util.isDefaultSmsProvider(context) || message.isSecureMessage() || message.isPreKeyBundle(); long threadId; if (groupRecipients == null) threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(recipients); else threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipients); ContentValues values = new ContentValues(6); values.put(ADDRESS, message.getSender()); values.put(ADDRESS_DEVICE_ID, message.getSenderDeviceId()); values.put(DATE_RECEIVED, System.currentTimeMillis()); values.put(DATE_SENT, message.getSentTimestampMillis()); values.put(PROTOCOL, message.getProtocol()); values.put(READ, unread ? 0 : 1); if (!TextUtils.isEmpty(message.getPseudoSubject())) values.put(SUBJECT, message.getPseudoSubject()); values.put(REPLY_PATH_PRESENT, message.isReplyPathPresent()); values.put(SERVICE_CENTER, message.getServiceCenterAddress()); values.put(BODY, message.getMessageBody()); values.put(TYPE, type); values.put(THREAD_ID, threadId); SQLiteDatabase db = databaseHelper.getWritableDatabase(); long messageId = db.insert(TABLE_NAME, null, values); if (unread) { DatabaseFactory.getThreadDatabase(context).setUnread(threadId); } DatabaseFactory.getThreadDatabase(context).update(threadId, true); notifyConversationListeners(threadId); jobManager.add(new TrimThreadJob(context, threadId)); return new Pair<>(messageId, threadId); }