From b8803cb9f75b74ac44b89f8b1879ac6186b894c3 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Mon, 2 Dec 2024 12:25:04 +0800 Subject: [PATCH] Inject signal --- .../one/mixin/android/MixinApplication.kt | 22 +------------ .../mixin/android/crypto/db/SignalDatabase.kt | 6 ++++ .../one/mixin/android/db/DatabaseProvider.kt | 2 ++ .../java/one/mixin/android/di/AppModule.kt | 20 ------------ .../java/one/mixin/android/job/BaseJob.kt | 14 ++++++-- .../one/mixin/android/job/ConversationJob.kt | 2 +- .../java/one/mixin/android/job/MixinJob.kt | 16 +++++----- .../android/job/RefreshConversationJob.kt | 2 +- .../one/mixin/android/job/SendMessageJob.kt | 4 +-- .../one/mixin/android/job/SendPlaintextJob.kt | 2 +- .../android/repository/AccountRepository.kt | 1 - .../repository/ConversationRepository.kt | 1 - .../android/repository/TokenRepository.kt | 1 - .../android/repository/UserRepository.kt | 1 - .../android/ui/landing/LandingFragment.kt | 14 ++++++++ .../android/ui/setting/AccountFragment.kt | 5 +-- app/src/main/res/layout/fragment_landing.xml | 32 +++++++++++++++++++ 17 files changed, 82 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/one/mixin/android/MixinApplication.kt b/app/src/main/java/one/mixin/android/MixinApplication.kt index c448e42452..0ce8134992 100644 --- a/app/src/main/java/one/mixin/android/MixinApplication.kt +++ b/app/src/main/java/one/mixin/android/MixinApplication.kt @@ -32,6 +32,7 @@ import com.microsoft.appcenter.crashes.Crashes import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.android.EntryPointAccessors +import dagger.hilt.android.internal.managers.ApplicationComponentManager import dagger.hilt.components.SingletonComponent import io.reactivex.plugins.RxJavaPlugins import kotlinx.coroutines.CoroutineScope @@ -117,11 +118,6 @@ open class MixinApplication : fun getHiltWorkerFactory(): HiltWorkerFactory } - @InstallIn(SingletonComponent::class) - @EntryPoint - interface AppEntryPoint { - fun inject(app: MixinApplication) - } @Inject lateinit var databaseProvider: DatabaseProvider @@ -280,27 +276,11 @@ open class MixinApplication : applicationScope.launch { clearData(sessionId) withContext(Dispatchers.Main) { - val entryPoint = - EntryPointAccessors.fromApplication( - this@MixinApplication, - AppEntryPoint::class.java, - ) - entryPoint.inject(this@MixinApplication) LandingActivity.show(this@MixinApplication) } } } - reject() - } - - fun reject() { databaseProvider.closeAllDatabases() - val entryPoint = - EntryPointAccessors.fromApplication( - this@MixinApplication, - AppEntryPoint::class.java, - ) - entryPoint.inject(this@MixinApplication) } private fun clearData(sessionId: String?) { diff --git a/app/src/main/java/one/mixin/android/crypto/db/SignalDatabase.kt b/app/src/main/java/one/mixin/android/crypto/db/SignalDatabase.kt index c87c0cf2de..8d18bdff13 100644 --- a/app/src/main/java/one/mixin/android/crypto/db/SignalDatabase.kt +++ b/app/src/main/java/one/mixin/android/crypto/db/SignalDatabase.kt @@ -12,6 +12,7 @@ import one.mixin.android.crypto.vo.RatchetSenderKey import one.mixin.android.crypto.vo.SenderKey import one.mixin.android.crypto.vo.Session import one.mixin.android.crypto.vo.SignedPreKey +import one.mixin.android.db.MixinDatabase @Database( entities = [ @@ -67,4 +68,9 @@ abstract class SignalDatabase : RoomDatabase() { object : RoomDatabase.Callback() { } } + + override fun close() { + INSTANCE = null + super.close() + } } diff --git a/app/src/main/java/one/mixin/android/db/DatabaseProvider.kt b/app/src/main/java/one/mixin/android/db/DatabaseProvider.kt index 2ec23e97f6..35b73dcd3e 100644 --- a/app/src/main/java/one/mixin/android/db/DatabaseProvider.kt +++ b/app/src/main/java/one/mixin/android/db/DatabaseProvider.kt @@ -1,6 +1,7 @@ package one.mixin.android.db import android.content.Context +import one.mixin.android.crypto.db.SignalDatabase import one.mixin.android.fts.FtsDatabase import one.mixin.android.db.pending.PendingDatabase import one.mixin.android.db.pending.PendingDatabaseImp @@ -44,6 +45,7 @@ class DatabaseProvider @Inject constructor( pendingDatabase?.close() pendingDatabase = PendingDatabaseImp.getDatabase(context, db.floodMessageDao(), db.jobDao()) + } @Synchronized diff --git a/app/src/main/java/one/mixin/android/di/AppModule.kt b/app/src/main/java/one/mixin/android/di/AppModule.kt index 35bfdd8c41..55d060f257 100644 --- a/app/src/main/java/one/mixin/android/di/AppModule.kt +++ b/app/src/main/java/one/mixin/android/di/AppModule.kt @@ -666,26 +666,6 @@ object AppModule { isLenient = true } - @Provides - @Singleton - fun provideJobSenderKey( - participantSessionDao: ParticipantSessionDao, - signalProtocol: SignalProtocol, - conversationApi: ConversationService, - participantDao: ParticipantDao, - chatWebSocket: ChatWebSocket, - linkState: LinkState, - messageHistoryDao: MessageHistoryDao, - ) = JobSenderKey( - participantSessionDao, - signalProtocol, - conversationApi, - participantDao, - chatWebSocket, - linkState, - messageHistoryDao, - ) - private const val DATA_STORE_FILE_NAME = "safe_box_%s.store" @Singleton diff --git a/app/src/main/java/one/mixin/android/job/BaseJob.kt b/app/src/main/java/one/mixin/android/job/BaseJob.kt index 89a556fdfe..cff7d73d7a 100644 --- a/app/src/main/java/one/mixin/android/job/BaseJob.kt +++ b/app/src/main/java/one/mixin/android/job/BaseJob.kt @@ -186,9 +186,17 @@ abstract class BaseJob(params: Params) : Job(params) { @Inject lateinit var applicationScope: CoroutineScope - @Transient - @Inject - lateinit var jobSenderKey: JobSenderKey + fun jobSenderKey(): JobSenderKey { + return JobSenderKey( + participantSessionDao(), + signalProtocol, + conversationApi, + participantDao(), + chatWebSocket, + linkState, + messageHistoryDao(), + ) + } fun database(): MixinDatabase = databaseProvider.getMixinDatabase() diff --git a/app/src/main/java/one/mixin/android/job/ConversationJob.kt b/app/src/main/java/one/mixin/android/job/ConversationJob.kt index a2f2a1e813..8c90d4b45c 100644 --- a/app/src/main/java/one/mixin/android/job/ConversationJob.kt +++ b/app/src/main/java/one/mixin/android/job/ConversationJob.kt @@ -143,7 +143,7 @@ class ConversationJob( } participantDao().insertList(participants) cr.participantSessions?.let { - jobSenderKey.syncParticipantSession(cr.conversationId, it) + jobSenderKey().syncParticipantSession(cr.conversationId, it) } jobManager.addJobInBackground(GenerateAvatarJob(cr.conversationId)) } else if (type == TYPE_MUTE) { diff --git a/app/src/main/java/one/mixin/android/job/MixinJob.kt b/app/src/main/java/one/mixin/android/job/MixinJob.kt index 1335a60f87..afc2bd2593 100644 --- a/app/src/main/java/one/mixin/android/job/MixinJob.kt +++ b/app/src/main/java/one/mixin/android/job/MixinJob.kt @@ -73,7 +73,7 @@ abstract class MixinJob( sessionId: String, ): Boolean { val blazeMessage = createConsumeSessionSignalKeys(createConsumeSignalKeysParam(arrayListOf(BlazeMessageParamSession(recipientId, sessionId)))) - val data = jobSenderKey.signalKeysChannel(blazeMessage) ?: return false + val data = jobSenderKey().signalKeysChannel(blazeMessage) ?: return false val keys = Gson().fromJson>(data) if (!keys.isNullOrEmpty()) { val preKeyBundle = createPreKeyBundle(keys[0]) @@ -86,9 +86,9 @@ abstract class MixinJob( val (cipherText, err) = signalProtocol.encryptSenderKey(conversationId, recipientId, sessionId.getDeviceId()) if (err) return false val signalKeyMessages = createBlazeSignalKeyMessage(recipientId, cipherText!!, sessionId) - val checksum = jobSenderKey.getCheckSum(conversationId) + val checksum = jobSenderKey().getCheckSum(conversationId) val bm = createSignalKeyMessage(createSignalKeyMessageParam(conversationId, arrayListOf(signalKeyMessages), checksum)) - val result = jobSenderKey.deliverNoThrow(bm) + val result = jobSenderKey().deliverNoThrow(bm) if (result.retry) { return sendSenderKey(conversationId, recipientId, sessionId) } @@ -108,7 +108,7 @@ abstract class MixinJob( createConsumeSignalKeysParam(arrayListOf(BlazeMessageParamSession(recipientId, sessionId))), ) - val data = jobSenderKey.signalKeysChannel(blazeMessage) ?: return false + val data = jobSenderKey().signalKeysChannel(blazeMessage) ?: return false val keys = Gson().fromJson>(data) if (!keys.isNullOrEmpty()) { val preKeyBundle = createPreKeyBundle(keys[0]) @@ -122,7 +122,7 @@ abstract class MixinJob( protected fun deliver(blazeMessage: BlazeMessage): Boolean { blazeMessage.params?.conversation_id?.let { - blazeMessage.params.conversation_checksum = jobSenderKey.getCheckSum(it) + blazeMessage.params.conversation_checksum = jobSenderKey().getCheckSum(it) } val bm = chatWebSocket.sendMessage(blazeMessage) if (bm == null) { @@ -132,7 +132,7 @@ abstract class MixinJob( when (bm.error.code) { CONVERSATION_CHECKSUM_INVALID_ERROR -> { blazeMessage.params?.conversation_id?.let { - jobSenderKey.syncConversation(it) + jobSenderKey().syncConversation(it) } throw ChecksumException() } @@ -169,13 +169,13 @@ abstract class MixinJob( MessageStatus.SENDING.name, ) val bm = BlazeMessage(UUID.randomUUID().toString(), CREATE_MESSAGE, params) - jobSenderKey.deliverNoThrow(bm) + jobSenderKey().deliverNoThrow(bm) } protected fun checkConversation(conversationId: String) { val conversation = conversationDao().findConversationById(conversationId) ?: return if (conversation.isGroupConversation()) { - jobSenderKey.syncConversation(conversation.conversationId) + jobSenderKey().syncConversation(conversation.conversationId) } else { checkConversationExist(conversation) } diff --git a/app/src/main/java/one/mixin/android/job/RefreshConversationJob.kt b/app/src/main/java/one/mixin/android/job/RefreshConversationJob.kt index 33f192fdb4..1eb254a1f4 100644 --- a/app/src/main/java/one/mixin/android/job/RefreshConversationJob.kt +++ b/app/src/main/java/one/mixin/android/job/RefreshConversationJob.kt @@ -55,7 +55,7 @@ class RefreshConversationJob(val conversationId: String, private val skipRefresh participantDao().replaceAll(data.conversationId, participants) data.participantSessions?.let { - jobSenderKey.syncParticipantSession(conversationId, it) + jobSenderKey().syncParticipantSession(conversationId, it) } if (conversationUserIds.isNotEmpty()) { diff --git a/app/src/main/java/one/mixin/android/job/SendMessageJob.kt b/app/src/main/java/one/mixin/android/job/SendMessageJob.kt index 7ceac5821a..71d4155e13 100644 --- a/app/src/main/java/one/mixin/android/job/SendMessageJob.kt +++ b/app/src/main/java/one/mixin/android/job/SendMessageJob.kt @@ -250,7 +250,7 @@ open class SendMessageJob( val accountId = Session.getAccountId()!! var participantSessionKey = getBotSessionKey(accountId) if (participantSessionKey == null || participantSessionKey.publicKey.isNullOrBlank()) { - jobSenderKey.syncConversation(message.conversationId) + jobSenderKey().syncConversation(message.conversationId) participantSessionKey = getBotSessionKey(accountId) } // Workaround No session key, can't encrypt message, send PLAIN directly @@ -327,7 +327,7 @@ open class SendMessageJob( if (!signalProtocol.isExistSenderKey(message.conversationId, message.userId)) { checkConversation(message.conversationId) } - jobSenderKey.checkSessionSenderKey(message.conversationId) + jobSenderKey().checkSessionSenderKey(message.conversationId) deliver(encryptNormalMessage(expireIn)) callback(expireIn) } diff --git a/app/src/main/java/one/mixin/android/job/SendPlaintextJob.kt b/app/src/main/java/one/mixin/android/job/SendPlaintextJob.kt index bd3d328085..632c75cbbc 100644 --- a/app/src/main/java/one/mixin/android/job/SendPlaintextJob.kt +++ b/app/src/main/java/one/mixin/android/job/SendPlaintextJob.kt @@ -16,7 +16,7 @@ class SendPlaintextJob( } override fun onRun() { - jobSenderKey.deliverNoThrow(blazeMessage) + jobSenderKey().deliverNoThrow(blazeMessage) } override fun cancel() { diff --git a/app/src/main/java/one/mixin/android/repository/AccountRepository.kt b/app/src/main/java/one/mixin/android/repository/AccountRepository.kt index eb69dc0eb4..f03b892577 100644 --- a/app/src/main/java/one/mixin/android/repository/AccountRepository.kt +++ b/app/src/main/java/one/mixin/android/repository/AccountRepository.kt @@ -56,7 +56,6 @@ import one.mixin.android.vo.User import javax.inject.Inject import javax.inject.Singleton -@Singleton class AccountRepository @Inject constructor( diff --git a/app/src/main/java/one/mixin/android/repository/ConversationRepository.kt b/app/src/main/java/one/mixin/android/repository/ConversationRepository.kt index b3b6e0dc78..cae3a64ad6 100644 --- a/app/src/main/java/one/mixin/android/repository/ConversationRepository.kt +++ b/app/src/main/java/one/mixin/android/repository/ConversationRepository.kt @@ -76,7 +76,6 @@ import one.mixin.android.vo.SearchMessageItem import javax.inject.Inject import javax.inject.Singleton -@Singleton class ConversationRepository @Inject internal constructor( diff --git a/app/src/main/java/one/mixin/android/repository/TokenRepository.kt b/app/src/main/java/one/mixin/android/repository/TokenRepository.kt index b1b3a0f051..4ff68eeb73 100644 --- a/app/src/main/java/one/mixin/android/repository/TokenRepository.kt +++ b/app/src/main/java/one/mixin/android/repository/TokenRepository.kt @@ -128,7 +128,6 @@ import java.util.UUID import javax.inject.Inject import javax.inject.Singleton -@Singleton class TokenRepository @Inject constructor( diff --git a/app/src/main/java/one/mixin/android/repository/UserRepository.kt b/app/src/main/java/one/mixin/android/repository/UserRepository.kt index 39f8331bc6..995b2dbff5 100644 --- a/app/src/main/java/one/mixin/android/repository/UserRepository.kt +++ b/app/src/main/java/one/mixin/android/repository/UserRepository.kt @@ -45,7 +45,6 @@ import one.mixin.android.vo.generateConversationId import javax.inject.Inject import javax.inject.Singleton -@Singleton class UserRepository @Inject constructor( diff --git a/app/src/main/java/one/mixin/android/ui/landing/LandingFragment.kt b/app/src/main/java/one/mixin/android/ui/landing/LandingFragment.kt index 16a180d8a5..ce5a5d5c21 100644 --- a/app/src/main/java/one/mixin/android/ui/landing/LandingFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/landing/LandingFragment.kt @@ -54,5 +54,19 @@ class LandingFragment : Fragment(R.layout.fragment_landing) { MobileFragment.TAG, ) } + binding.userTv1.setOnClickListener { v -> + navTo(MnemonicPhraseFragment.newInstance(words = ArrayList().apply { + addAll(testAccount[0].split(" ")) + }), MnemonicPhraseFragment.TAG) + } + binding.userTv2.setOnClickListener { v -> + navTo(MnemonicPhraseFragment.newInstance(words = ArrayList().apply { + addAll(testAccount[1].split(" ")) + }), MnemonicPhraseFragment.TAG) + } } + + private val testAccount = listOf( + "" , "" // Todo add test account + ) } diff --git a/app/src/main/java/one/mixin/android/ui/setting/AccountFragment.kt b/app/src/main/java/one/mixin/android/ui/setting/AccountFragment.kt index 84da657542..b293faef0a 100644 --- a/app/src/main/java/one/mixin/android/ui/setting/AccountFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/setting/AccountFragment.kt @@ -49,9 +49,10 @@ class AccountFragment : BaseFragment(R.layout.fragment_account) { // BackupMnemonicPhraseWarningBottomSheetDialogFragment.newInstance() // .show(parentFragmentManager, BackupMnemonicPhraseWarningBottomSheetDialogFragment.TAG) // } else { - LogoutPinBottomSheetDialogFragment.newInstance() - .showNow(parentFragmentManager, VerifyBottomSheetDialogFragment.TAG) + // LogoutPinBottomSheetDialogFragment.newInstance() + // .showNow(parentFragmentManager, VerifyBottomSheetDialogFragment.TAG) // } + MixinApplication.get().closeAndClear() } deleteRl.setOnClickListener { navTo(DeleteAccountFragment.newInstance(), DeleteAccountFragment.TAG) diff --git a/app/src/main/res/layout/fragment_landing.xml b/app/src/main/res/layout/fragment_landing.xml index caa5a8cd11..442683f9af 100644 --- a/app/src/main/res/layout/fragment_landing.xml +++ b/app/src/main/res/layout/fragment_landing.xml @@ -55,6 +55,38 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> +