Add support for baseline profiles.

This commit is contained in:
Clark
2023-03-09 14:27:03 -05:00
committed by Greyson Parrelli
parent 79a062c838
commit 04baa7925f
20 changed files with 37283 additions and 22 deletions

View File

@@ -23,6 +23,7 @@ import org.thoughtcrime.securesms.database.model.UpdateDescription;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.SignalTrace;
import java.util.ArrayList;
import java.util.Collections;
@@ -66,6 +67,7 @@ abstract class ConversationListDataSource implements PagedDataSource<Long, Conve
@Override
public @NonNull List<Conversation> load(int start, int length, @NonNull CancellationSignal cancellationSignal) {
SignalTrace.beginSection("ConversationListDataSource#load");
Stopwatch stopwatch = new Stopwatch("load(" + start + ", " + length + "), " + getClass().getSimpleName() + ", " + conversationFilter);
List<Conversation> conversations = new ArrayList<>(length);
@@ -97,6 +99,7 @@ abstract class ConversationListDataSource implements PagedDataSource<Long, Conve
stopwatch.split("recipient-resolve");
stopwatch.stop(TAG);
SignalTrace.endSection();
if (conversations.isEmpty() && start == 0 && length == 1) {
if (conversationFilter == ConversationFilter.OFF) {

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.push;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import com.google.android.gms.security.ProviderInstaller;
@@ -17,14 +18,32 @@ import org.whispersystems.signalservice.api.push.PNI;
public class AccountManagerFactory {
private static AccountManagerFactory instance;
public static AccountManagerFactory getInstance() {
if (instance == null) {
synchronized (AccountManagerFactory.class) {
if (instance == null) {
instance = new AccountManagerFactory();
}
}
}
return instance;
}
@VisibleForTesting
public static void setInstance(@NonNull AccountManagerFactory accountManagerFactory) {
synchronized (AccountManagerFactory.class) {
instance = accountManagerFactory;
}
}
private static final String TAG = Log.tag(AccountManagerFactory.class);
public static @NonNull SignalServiceAccountManager createAuthenticated(@NonNull Context context,
@NonNull ACI aci,
@NonNull PNI pni,
@NonNull String e164,
int deviceId,
@NonNull String password)
public @NonNull SignalServiceAccountManager createAuthenticated(@NonNull Context context,
@NonNull ACI aci,
@NonNull PNI pni,
@NonNull String e164,
int deviceId,
@NonNull String password)
{
if (ApplicationDependencies.getSignalServiceNetworkAccess().isCensored(e164)) {
SignalExecutors.BOUNDED.execute(() -> {
@@ -50,10 +69,10 @@ public class AccountManagerFactory {
/**
* Should only be used during registration when you haven't yet been assigned an ACI.
*/
public static @NonNull SignalServiceAccountManager createUnauthenticated(@NonNull Context context,
@NonNull String e164,
int deviceId,
@NonNull String password)
public @NonNull SignalServiceAccountManager createUnauthenticated(@NonNull Context context,
@NonNull String e164,
int deviceId,
@NonNull String password)
{
if (new SignalServiceNetworkAccess(context).isCensored(e164)) {
SignalExecutors.BOUNDED.execute(() -> {

View File

@@ -142,7 +142,7 @@ public final class RegistrationRepository {
ApplicationDependencies.getProtocolStore().pni().sessions().archiveAllSessions();
SenderKeyUtil.clearAllState();
SignalServiceAccountManager accountManager = AccountManagerFactory.createAuthenticated(context, aci, pni, registrationData.getE164(), SignalServiceAddress.DEFAULT_DEVICE_ID, registrationData.getPassword());
SignalServiceAccountManager accountManager = AccountManagerFactory.getInstance().createAuthenticated(context, aci, pni, registrationData.getE164(), SignalServiceAddress.DEFAULT_DEVICE_ID, registrationData.getPassword());
SignalServiceAccountDataStoreImpl aciProtocolStore = ApplicationDependencies.getProtocolStore().aci();
SignalServiceAccountDataStoreImpl pniProtocolStore = ApplicationDependencies.getProtocolStore().pni();
@@ -219,7 +219,7 @@ public final class RegistrationRepository {
}
public Single<BackupAuthCheckProcessor> getKbsAuthCredential(@NonNull RegistrationData registrationData, List<String> usernamePasswords) {
SignalServiceAccountManager accountManager = AccountManagerFactory.createUnauthenticated(context, registrationData.getE164(), SignalServiceAddress.DEFAULT_DEVICE_ID, registrationData.getPassword());
SignalServiceAccountManager accountManager = AccountManagerFactory.getInstance().createUnauthenticated(context, registrationData.getE164(), SignalServiceAddress.DEFAULT_DEVICE_ID, registrationData.getPassword());
return accountManager.checkBackupAuthCredentials(registrationData.getE164(), usernamePasswords)
.map(BackupAuthCheckProcessor::new)

View File

@@ -42,7 +42,7 @@ class VerifyAccountRepository(private val context: Application) {
return if (sessionId.isNullOrBlank()) {
Single.just(ServiceResponse.forApplicationError(NoSuchSessionException(), 409, null))
} else {
val accountManager: SignalServiceAccountManager = AccountManagerFactory.createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
val accountManager: SignalServiceAccountManager = AccountManagerFactory.getInstance().createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
Single.fromCallable { accountManager.getRegistrationSession(sessionId) }.subscribeOn(Schedulers.io())
}
}
@@ -55,7 +55,7 @@ class VerifyAccountRepository(private val context: Application) {
): Single<ServiceResponse<RegistrationSessionMetadataResponse>> {
return Single.fromCallable {
val fcmToken: String? = FcmUtil.getToken(context).orElse(null)
val accountManager: SignalServiceAccountManager = AccountManagerFactory.createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
val accountManager: SignalServiceAccountManager = AccountManagerFactory.getInstance().createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
if (fcmToken == null) {
return@fromCallable accountManager.createRegistrationSession(null, mcc, mnc)
} else {
@@ -97,7 +97,7 @@ class VerifyAccountRepository(private val context: Application) {
password: String
): Single<ServiceResponse<RegistrationSessionMetadataResponse>> {
val fcmToken: Optional<String> = FcmUtil.getToken(context)
val accountManager = AccountManagerFactory.createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
val accountManager = AccountManagerFactory.getInstance().createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
val pushChallenge = PushChallengeRequest.getPushChallengeBlocking(accountManager, sessionId, fcmToken, PUSH_REQUEST_TIMEOUT)
return Single.fromCallable {
return@fromCallable accountManager.submitPushChallengeToken(sessionId, pushChallenge.orElse(null))
@@ -110,7 +110,7 @@ class VerifyAccountRepository(private val context: Application) {
e164: String,
password: String
): Single<ServiceResponse<RegistrationSessionMetadataResponse>> {
val accountManager = AccountManagerFactory.createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
val accountManager = AccountManagerFactory.getInstance().createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
return Single.fromCallable {
return@fromCallable accountManager.submitCaptchaToken(sessionId, captcha)
}.subscribeOn(Schedulers.io())
@@ -125,7 +125,7 @@ class VerifyAccountRepository(private val context: Application) {
Log.d(TAG, "SMS Verification requested")
return Single.fromCallable {
val accountManager = AccountManagerFactory.createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
val accountManager = AccountManagerFactory.getInstance().createUnauthenticated(context, e164, SignalServiceAddress.DEFAULT_DEVICE_ID, password)
if (mode == Mode.PHONE_CALL) {
return@fromCallable accountManager.requestVoiceVerificationCode(sessionId, Locale.getDefault(), mode.isSmsRetrieverSupported)
} else {
@@ -135,7 +135,7 @@ class VerifyAccountRepository(private val context: Application) {
}
fun verifyAccount(sessionId: String, registrationData: RegistrationData): Single<ServiceResponse<RegistrationSessionMetadataResponse>> {
val accountManager: SignalServiceAccountManager = AccountManagerFactory.createUnauthenticated(
val accountManager: SignalServiceAccountManager = AccountManagerFactory.getInstance().createUnauthenticated(
context,
registrationData.e164,
SignalServiceAddress.DEFAULT_DEVICE_ID,
@@ -154,7 +154,7 @@ class VerifyAccountRepository(private val context: Application) {
val universalUnidentifiedAccess: Boolean = TextSecurePreferences.isUniversalUnidentifiedAccess(context)
val unidentifiedAccessKey: ByteArray = UnidentifiedAccess.deriveAccessKeyFrom(registrationData.profileKey)
val accountManager: SignalServiceAccountManager = AccountManagerFactory.createUnauthenticated(
val accountManager: SignalServiceAccountManager = AccountManagerFactory.getInstance().createUnauthenticated(
context,
registrationData.e164,
SignalServiceAddress.DEFAULT_DEVICE_ID,

View File

@@ -158,7 +158,7 @@ public final class SignalProxyUtil {
private static boolean testWebsocketConnectionUnregistered(long timeout) {
CountDownLatch latch = new CountDownLatch(1);
AtomicBoolean success = new AtomicBoolean(false);
SignalServiceAccountManager accountManager = AccountManagerFactory.createUnauthenticated(ApplicationDependencies.getApplication(), "", SignalServiceAddress.DEFAULT_DEVICE_ID, "");
SignalServiceAccountManager accountManager = AccountManagerFactory.getInstance().createUnauthenticated(ApplicationDependencies.getApplication(), "", SignalServiceAddress.DEFAULT_DEVICE_ID, "");
SignalExecutors.UNBOUNDED.execute(() -> {
try {

View File

@@ -0,0 +1,22 @@
package org.thoughtcrime.securesms.util
import org.thoughtcrime.securesms.BuildConfig
import androidx.tracing.Trace as AndroidTrace
object SignalTrace {
@JvmStatic
fun beginSection(methodName: String) {
if (!BuildConfig.TRACING_ENABLED) {
return
}
AndroidTrace.beginSection(methodName)
}
@JvmStatic
fun endSection() {
if (!BuildConfig.TRACING_ENABLED) {
return
}
AndroidTrace.endSection()
}
}