Skip to content

Commit

Permalink
Load identities in transaction.
Browse files Browse the repository at this point in the history
  • Loading branch information
alan-signal authored and greyson-signal committed Jun 7, 2020
1 parent 7832497 commit 4f4be44
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 37 deletions.
Expand Up @@ -1309,7 +1309,7 @@ private void handleManualMmsRequired() {
}

private void handleUnverifiedRecipients() {
List<Recipient> unverifiedRecipients = identityRecords.getUnverifiedRecipients(this);
List<Recipient> unverifiedRecipients = identityRecords.getUnverifiedRecipients();
List<IdentityRecord> unverifiedRecords = identityRecords.getUnverifiedRecords();
String message = IdentityUtil.getUnverifiedSendDialogDescription(this, unverifiedRecipients);

Expand All @@ -1332,7 +1332,7 @@ public void onFailure(ExecutionException e) {
}

private void handleUntrustedRecipients() {
List<Recipient> untrustedRecipients = identityRecords.getUntrustedRecipients(this);
List<Recipient> untrustedRecipients = identityRecords.getUntrustedRecipients();
List<IdentityRecord> untrustedRecords = identityRecords.getUntrustedRecords();
String untrustedMessage = IdentityUtil.getUntrustedSendDialogDescription(this, untrustedRecipients);

Expand Down Expand Up @@ -1633,31 +1633,25 @@ private ListenableFuture<Boolean> initializeIdentityRecords() {
new AsyncTask<Recipient, Void, Pair<IdentityRecordList, String>>() {
@Override
protected @NonNull Pair<IdentityRecordList, String> doInBackground(Recipient... params) {
IdentityDatabase identityDatabase = DatabaseFactory.getIdentityDatabase(ConversationActivity.this);
IdentityRecordList identityRecordList = new IdentityRecordList();
List<Recipient> recipients = new LinkedList<>();
IdentityDatabase identityDatabase = DatabaseFactory.getIdentityDatabase(ConversationActivity.this);
List<Recipient> recipients;

if (params[0].isGroup()) {
recipients.addAll(DatabaseFactory.getGroupDatabase(ConversationActivity.this)
.getGroupMembers(params[0].requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF));
recipients = DatabaseFactory.getGroupDatabase(ConversationActivity.this)
.getGroupMembers(params[0].requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
} else {
recipients.add(params[0]);
recipients = Collections.singletonList(params[0]);
}

long startTime = System.currentTimeMillis();
StringBuilder logBuilder = new StringBuilder();
long startTime = System.currentTimeMillis();
IdentityRecordList identityRecordList = identityDatabase.getIdentities(recipients);

for (Recipient recipient : recipients) {
logBuilder.append(recipient.getId()).append(" ");
identityRecordList.add(identityDatabase.getIdentity(recipient.getId()));
}

Log.i(TAG, String.format(Locale.ENGLISH, "Loaded %d identities in %d ms: %s", recipients.size(), System.currentTimeMillis() - startTime, logBuilder.toString()));
Log.i(TAG, String.format(Locale.US, "Loaded %d identities in %d ms", recipients.size(), System.currentTimeMillis() - startTime));

String message = null;

if (identityRecordList.isUnverified()) {
message = IdentityUtil.getUnverifiedBannerDescription(ConversationActivity.this, identityRecordList.getUnverifiedRecipients(ConversationActivity.this));
message = IdentityUtil.getUnverifiedBannerDescription(ConversationActivity.this, identityRecordList.getUnverifiedRecipients());
}

return new Pair<>(identityRecordList, message);
Expand Down
Expand Up @@ -19,13 +19,15 @@
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import net.sqlcipher.database.SQLiteDatabase;

import org.greenrobot.eventbus.EventBus;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
import org.thoughtcrime.securesms.database.identity.IdentityRecordList;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.Base64;
Expand All @@ -35,6 +37,7 @@
import org.whispersystems.libsignal.util.guava.Optional;

import java.io.IOException;
import java.util.List;

public class IdentityDatabase extends Database {

Expand Down Expand Up @@ -111,6 +114,31 @@ public Optional<IdentityRecord> getIdentity(@NonNull RecipientId recipientId) {
return Optional.absent();
}

public @NonNull IdentityRecordList getIdentities(@NonNull List<Recipient> recipients) {
IdentityRecordList identityRecordList = new IdentityRecordList();
SQLiteDatabase database = databaseHelper.getReadableDatabase();
String[] selectionArgs = new String[1];

database.beginTransaction();
try {
for (Recipient recipient : recipients) {
selectionArgs[0] = recipient.getId().serialize();

try (Cursor cursor = database.query(TABLE_NAME, null, RECIPIENT_ID + " = ?", selectionArgs, null, null, null)) {
if (cursor.moveToFirst()) {
identityRecordList.add(getIdentityRecord(cursor));
}
} catch (InvalidKeyException | IOException e) {
throw new AssertionError(e);
}
}
} finally {
database.endTransaction();
}

return identityRecordList;
}

public void saveIdentity(@NonNull RecipientId recipientId, IdentityKey identityKey, VerifiedStatus verifiedStatus,
boolean firstUse, long timestamp, boolean nonBlockingApproval)
{
Expand Down Expand Up @@ -181,7 +209,7 @@ private boolean hasMatchingStatus(@NonNull RecipientId id, IdentityKey identityK
}
}

private IdentityRecord getIdentityRecord(@NonNull Cursor cursor) throws IOException, InvalidKeyException {
private static @NonNull IdentityRecord getIdentityRecord(@NonNull Cursor cursor) throws IOException, InvalidKeyException {
long recipientId = cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID));
String serializedIdentity = cursor.getString(cursor.getColumnIndexOrThrow(IDENTITY_KEY));
long timestamp = cursor.getLong(cursor.getColumnIndexOrThrow(TIMESTAMP));
Expand Down
@@ -1,30 +1,25 @@
package org.thoughtcrime.securesms.database.identity;


import android.content.Context;
import androidx.annotation.NonNull;

import org.thoughtcrime.securesms.database.IdentityDatabase.IdentityRecord;
import org.thoughtcrime.securesms.database.IdentityDatabase.VerifiedStatus;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.whispersystems.libsignal.util.guava.Optional;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class IdentityRecordList {

private static final String TAG = IdentityRecordList.class.getSimpleName();
public final class IdentityRecordList {

private final List<IdentityRecord> identityRecords = new LinkedList<>();

public void add(Optional<IdentityRecord> identityRecord) {
if (identityRecord.isPresent()) {
identityRecords.add(identityRecord.get());
}
public void add(@NonNull IdentityRecord identityRecord) {
identityRecords.add(identityRecord);
}

public void replaceWith(IdentityRecordList identityRecordList) {
public void replaceWith(@NonNull IdentityRecordList identityRecordList) {
identityRecords.clear();
identityRecords.addAll(identityRecordList.identityRecords);
}
Expand Down Expand Up @@ -59,8 +54,8 @@ public boolean isUntrusted() {
return false;
}

public List<IdentityRecord> getUntrustedRecords() {
List<IdentityRecord> results = new LinkedList<>();
public @NonNull List<IdentityRecord> getUntrustedRecords() {
List<IdentityRecord> results = new ArrayList<>(identityRecords.size());

for (IdentityRecord identityRecord : identityRecords) {
if (isUntrusted(identityRecord)) {
Expand All @@ -71,8 +66,8 @@ public List<IdentityRecord> getUntrustedRecords() {
return results;
}

public List<Recipient> getUntrustedRecipients(Context context) {
List<Recipient> untrusted = new LinkedList<>();
public @NonNull List<Recipient> getUntrustedRecipients() {
List<Recipient> untrusted = new ArrayList<>(identityRecords.size());

for (IdentityRecord identityRecord : identityRecords) {
if (isUntrusted(identityRecord)) {
Expand All @@ -84,7 +79,7 @@ public List<Recipient> getUntrustedRecipients(Context context) {
}

public List<IdentityRecord> getUnverifiedRecords() {
List<IdentityRecord> results = new LinkedList<>();
List<IdentityRecord> results = new ArrayList<>(identityRecords.size());

for (IdentityRecord identityRecord : identityRecords) {
if (identityRecord.getVerifiedStatus() == VerifiedStatus.UNVERIFIED) {
Expand All @@ -95,8 +90,8 @@ public List<IdentityRecord> getUnverifiedRecords() {
return results;
}

public List<Recipient> getUnverifiedRecipients(Context context) {
List<Recipient> unverified = new LinkedList<>();
public List<Recipient> getUnverifiedRecipients() {
List<Recipient> unverified = new ArrayList<>(identityRecords.size());

for (IdentityRecord identityRecord : identityRecords) {
if (identityRecord.getVerifiedStatus() == VerifiedStatus.UNVERIFIED) {
Expand All @@ -107,7 +102,7 @@ public List<Recipient> getUnverifiedRecipients(Context context) {
return unverified;
}

private boolean isUntrusted(IdentityRecord identityRecord) {
private static boolean isUntrusted(@NonNull IdentityRecord identityRecord) {
return !identityRecord.isApprovedNonBlocking() &&
System.currentTimeMillis() - identityRecord.getTimestamp() < TimeUnit.SECONDS.toMillis(5);
}
Expand Down

0 comments on commit 4f4be44

Please sign in to comment.