diff --git a/app/build.gradle b/app/build.gradle index ebdf809ca5..55a440e1c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,7 +28,7 @@ configurations.all { exclude module: "commons-logging" } -def canonicalVersionCode = 377 +def canonicalVersionCode = 379 def canonicalVersionName = "1.19.0" def postFixSize = 10 @@ -265,7 +265,7 @@ dependencies { implementation "androidx.core:core-ktx:$coreVersion" implementation "androidx.work:work-runtime-ktx:2.7.1" - playImplementation ("com.google.firebase:firebase-messaging:18.0.0") { + playImplementation ("com.google.firebase:firebase-messaging:24.0.0") { exclude group: 'com.google.firebase', module: 'firebase-core' exclude group: 'com.google.firebase', module: 'firebase-analytics' exclude group: 'com.google.firebase', module: 'firebase-measurement-connector' @@ -393,7 +393,6 @@ dependencies { implementation "androidx.camera:camera-lifecycle:1.3.2" implementation "androidx.camera:camera-view:1.3.2" - implementation 'com.google.firebase:firebase-core:21.1.1' implementation "com.google.mlkit:barcode-scanning:17.2.0" } diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt index b4ddf80b84..2f5aec40ec 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt @@ -371,12 +371,9 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), updateLegacyConfigView() - // TODO: remove this after enough updates that we can rely on ConfigBase.isNewConfigEnabled to always return true - // This will only run if we aren't using new configs, as they are schedule to sync when there are changes applied - if (textSecurePreferences.getConfigurationMessageSynced()) { - lifecycleScope.launch(Dispatchers.IO) { - ConfigurationMessageUtilities.syncConfigurationIfNeeded(this@HomeActivity) - } + // Sync config changes if there are any + lifecycleScope.launch(Dispatchers.IO) { + ConfigurationMessageUtilities.syncConfigurationIfNeeded(this@HomeActivity) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsAdapter.kt index 36e51e35be..cb352d83b7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsAdapter.kt @@ -1,13 +1,14 @@ package org.thoughtcrime.securesms.messagerequests import android.content.Context -import android.content.res.ColorStateList import android.database.Cursor +import android.os.Build import android.text.SpannableString import android.text.style.ForegroundColorSpan import android.view.ContextThemeWrapper import android.view.ViewGroup import android.widget.PopupMenu +import androidx.core.graphics.drawable.DrawableCompat import androidx.recyclerview.widget.RecyclerView import network.loki.messenger.R import org.session.libsession.utilities.ThemeUtil @@ -63,10 +64,17 @@ class MessageRequestsAdapter( val s = SpannableString(item.title) val danger = ThemeUtil.getThemedColor(context, R.attr.danger) s.setSpan(ForegroundColorSpan(danger), 0, s.length, 0) - item.iconTintList = ColorStateList.valueOf(danger) + item.icon?.let { + DrawableCompat.setTint( + it, + danger + ) + } item.title = s } - popupMenu.setForceShowIcon(true) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + popupMenu.setForceShowIcon(true) + } popupMenu.show() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/manager/CreateAccountManager.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/manager/CreateAccountManager.kt index 98e9c8b20d..40bf577255 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/manager/CreateAccountManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/manager/CreateAccountManager.kt @@ -8,6 +8,7 @@ import org.session.libsignal.utilities.KeyHelper import org.session.libsignal.utilities.hexEncodedPublicKey import org.thoughtcrime.securesms.crypto.KeyPairUtilities import org.thoughtcrime.securesms.dependencies.ConfigFactory +import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities import org.thoughtcrime.securesms.util.VersionDataFetcher import javax.inject.Inject import javax.inject.Singleton @@ -24,7 +25,6 @@ class CreateAccountManager @Inject constructor( fun createAccount(displayName: String) { prefs.setProfileName(displayName) - configFactory.user?.setName(displayName) // This is here to resolve a case where the app restarts before a user completes onboarding // which can result in an invalid database state @@ -37,13 +37,16 @@ class CreateAccountManager @Inject constructor( val x25519KeyPair = keyPairGenerationResult.x25519KeyPair KeyPairUtilities.store(application, seed, ed25519KeyPair, x25519KeyPair) - configFactory.keyPairChanged() val userHexEncodedPublicKey = x25519KeyPair.hexEncodedPublicKey val registrationID = KeyHelper.generateRegistrationId(false) prefs.setLocalRegistrationId(registrationID) prefs.setLocalNumber(userHexEncodedPublicKey) prefs.setRestorationTime(0) + // we'll rely on the config syncing in the homeActivity resume + configFactory.keyPairChanged() + configFactory.user?.setName(displayName) + versionDataFetcher.startTimedVersionCheck() } } \ No newline at end of file diff --git a/app/src/main/java/org/thoughtcrime/securesms/onboarding/pickname/PickDisplayNameViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/onboarding/pickname/PickDisplayNameViewModel.kt index 99b697037d..d17c6f602c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/onboarding/pickname/PickDisplayNameViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/onboarding/pickname/PickDisplayNameViewModel.kt @@ -49,6 +49,7 @@ internal class PickDisplayNameViewModel( viewModelScope.launch(Dispatchers.IO) { if (loadFailed) { prefs.setProfileName(displayName) + // we'll rely on the config syncing in the homeActivity resume configFactory.user?.setName(displayName) _events.emit(Event.LoadAccountComplete) diff --git a/app/src/play/kotlin/org/thoughtcrime/securesms/notifications/FirebaseTokenFetcher.kt b/app/src/play/kotlin/org/thoughtcrime/securesms/notifications/FirebaseTokenFetcher.kt index d40f160d0b..22c258ddcf 100644 --- a/app/src/play/kotlin/org/thoughtcrime/securesms/notifications/FirebaseTokenFetcher.kt +++ b/app/src/play/kotlin/org/thoughtcrime/securesms/notifications/FirebaseTokenFetcher.kt @@ -1,19 +1,19 @@ package org.thoughtcrime.securesms.notifications -import com.google.android.gms.tasks.Tasks -import com.google.firebase.iid.FirebaseInstanceId +import com.google.firebase.messaging.FirebaseMessaging + import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.isActive +import kotlinx.coroutines.tasks.await import kotlinx.coroutines.withContext import javax.inject.Inject import javax.inject.Singleton @Singleton class FirebaseTokenFetcher @Inject constructor(): TokenFetcher { + val TAG = "FirebaseTF" + override suspend fun fetch() = withContext(Dispatchers.IO) { - FirebaseInstanceId.getInstance().instanceId - .also(Tasks::await) - .takeIf { isActive } // don't 'complete' task if we were canceled - ?.run { result?.token ?: throw exception!! } + FirebaseMessaging.getInstance().token.await().takeIf { isActive } ?: throw Exception("Firebase token is null") } -} +} \ No newline at end of file diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/RetrieveProfileAvatarJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/RetrieveProfileAvatarJob.kt index d82f29446d..618a31b5e2 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/RetrieveProfileAvatarJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/RetrieveProfileAvatarJob.kt @@ -39,7 +39,7 @@ class RetrieveProfileAvatarJob(private val profileAvatar: String?, val recipient override suspend fun execute(dispatcherName: String) { val delegate = delegate ?: return Log.w(TAG, "RetrieveProfileAvatarJob has no delegate method to work with!") - if (profileAvatar in errorUrls) return delegate.handleJobFailed(this, dispatcherName, Exception("Profile URL 404'd this app instance")) + if (profileAvatar != null && profileAvatar in errorUrls) return delegate.handleJobFailed(this, dispatcherName, Exception("Profile URL 404'd this app instance")) val context = MessagingModuleConfiguration.shared.context val storage = MessagingModuleConfiguration.shared.storage val recipient = Recipient.from(context, recipientAddress, true)