diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index c436044153..aa56f6a25a 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -1700,8 +1700,8 @@ App ID: Push Key: App Display Name: - Device Display Name: - Device ID: + Session Display Name: + Session ID: Url: Format: Profile tag: diff --git a/vector/src/main/java/im/vector/app/core/device/GetDeviceInfoUseCase.kt b/vector/src/main/java/im/vector/app/core/device/GetDeviceInfoUseCase.kt new file mode 100644 index 0000000000..344173aab7 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/device/GetDeviceInfoUseCase.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.core.device + +import im.vector.app.core.di.ActiveSessionHolder +import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import javax.inject.Inject + +interface GetDeviceInfoUseCase { + + fun execute(): CryptoDeviceInfo +} + +class DefaultGetDeviceInfoUseCase @Inject constructor( + private val activeSessionHolder: ActiveSessionHolder +) : GetDeviceInfoUseCase { + + override fun execute(): CryptoDeviceInfo { + return activeSessionHolder.getActiveSession().cryptoService().getMyDevice() + } +} diff --git a/vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt b/vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt index 67e7868df7..44cccbd3f5 100644 --- a/vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt +++ b/vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt @@ -16,8 +16,8 @@ package im.vector.app.core.pushers -import im.vector.app.AppBuildConfig import im.vector.app.R +import im.vector.app.core.device.GetDeviceInfoUseCase import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.resources.AppNameProvider import im.vector.app.core.resources.LocaleProvider @@ -35,6 +35,7 @@ class PushersManager @Inject constructor( private val localeProvider: LocaleProvider, private val stringProvider: StringProvider, private val appNameProvider: AppNameProvider, + private val getDeviceInfoUseCase: GetDeviceInfoUseCase, ) { suspend fun testPush() { val currentSession = activeSessionHolder.getActiveSession() @@ -64,12 +65,12 @@ class PushersManager @Inject constructor( pushKey: String, gateway: String ) = HttpPusher( - pushKey, + pushkey = pushKey, appId = stringProvider.getString(R.string.pusher_app_id), profileTag = DEFAULT_PUSHER_FILE_TAG + "_" + abs(activeSessionHolder.getActiveSession().myUserId.hashCode()), lang = localeProvider.current().language, appDisplayName = appNameProvider.getAppName(), - deviceDisplayName = AppBuildConfig.getModel(), + deviceDisplayName = getDeviceInfoUseCase.execute().displayName().orEmpty(), url = gateway, enabled = true, deviceId = activeSessionHolder.getActiveSession().sessionParams.deviceId ?: "MOBILE", diff --git a/vector/src/test/java/im/vector/app/core/device/DefaultGetDeviceInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/core/device/DefaultGetDeviceInfoUseCaseTest.kt new file mode 100644 index 0000000000..0675556bec --- /dev/null +++ b/vector/src/test/java/im/vector/app/core/device/DefaultGetDeviceInfoUseCaseTest.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.core.device + +import im.vector.app.test.fakes.FakeActiveSessionHolder +import im.vector.app.test.fakes.FakeCryptoService +import im.vector.app.test.fakes.FakeSession +import org.amshove.kluent.shouldBeEqualTo +import org.junit.Test + +class DefaultGetDeviceInfoUseCaseTest { + + private val cryptoService = FakeCryptoService() + private val session = FakeSession(fakeCryptoService = cryptoService) + private val activeSessionHolder = FakeActiveSessionHolder(session) + + private val getDeviceInfoUseCase = DefaultGetDeviceInfoUseCase(activeSessionHolder.instance) + + @Test + fun `when execute, then get crypto device info`() { + + val result = getDeviceInfoUseCase.execute() + + result shouldBeEqualTo cryptoService.cryptoDeviceInfo + } +} diff --git a/vector/src/test/java/im/vector/app/core/pushers/PushersManagerTest.kt b/vector/src/test/java/im/vector/app/core/pushers/PushersManagerTest.kt index e42f995ef6..50c9024e86 100644 --- a/vector/src/test/java/im/vector/app/core/pushers/PushersManagerTest.kt +++ b/vector/src/test/java/im/vector/app/core/pushers/PushersManagerTest.kt @@ -16,20 +16,20 @@ package im.vector.app.core.pushers -import im.vector.app.AppBuildConfig import im.vector.app.R import im.vector.app.test.fakes.FakeActiveSessionHolder import im.vector.app.test.fakes.FakeAppNameProvider +import im.vector.app.test.fakes.FakeGetDeviceInfoUseCase import im.vector.app.test.fakes.FakeLocaleProvider import im.vector.app.test.fakes.FakePushersService import im.vector.app.test.fakes.FakeSession import im.vector.app.test.fakes.FakeStringProvider -import io.mockk.every +import im.vector.app.test.fixtures.CryptoDeviceInfoFixture.aCryptoDeviceInfo import io.mockk.mockk -import io.mockk.mockkObject import org.amshove.kluent.shouldBeEqualTo -import org.junit.Before import org.junit.Test +import org.matrix.android.sdk.api.session.crypto.model.UnsignedDeviceInfo +import org.matrix.android.sdk.api.session.pushers.HttpPusher import java.util.Locale import kotlin.math.abs @@ -41,6 +41,7 @@ class PushersManagerTest { private val stringProvider = FakeStringProvider() private val localeProvider = FakeLocaleProvider() private val appNameProvider = FakeAppNameProvider() + private val getDeviceInfoUseCase = FakeGetDeviceInfoUseCase() private val pushersManager = PushersManager( mockk(), @@ -48,13 +49,9 @@ class PushersManagerTest { localeProvider, stringProvider.instance, appNameProvider, + getDeviceInfoUseCase, ) - @Before - fun setUp() { - mockkObject(AppBuildConfig) - } - @Test fun `when enqueueRegisterPusher, then HttpPusher created and enqueued`() { val pushKey = "abc" @@ -65,21 +62,24 @@ class PushersManagerTest { stringProvider.given(R.string.pusher_app_id, pusherAppId) localeProvider.givenCurrent(Locale.UK) appNameProvider.givenAppName(appName) - every { AppBuildConfig.getModel() } returns deviceDisplayName + getDeviceInfoUseCase.givenDeviceInfo(aCryptoDeviceInfo(unsigned = UnsignedDeviceInfo(deviceDisplayName))) + val expectedHttpPusher = HttpPusher( + pushkey = pushKey, + appId = pusherAppId, + profileTag = DEFAULT_PUSHER_FILE_TAG + "_" + abs(session.myUserId.hashCode()), + lang = Locale.UK.language, + appDisplayName = appName, + deviceDisplayName = deviceDisplayName, + url = gateway, + enabled = true, + deviceId = session.sessionParams.deviceId!!, + append = false, + withEventIdOnly = true, + ) pushersManager.enqueueRegisterPusher(pushKey, gateway) val httpPusher = pushersService.verifyEnqueueAddHttpPusher() - httpPusher.pushkey shouldBeEqualTo pushKey - httpPusher.appId shouldBeEqualTo pusherAppId - httpPusher.profileTag shouldBeEqualTo DEFAULT_PUSHER_FILE_TAG + "_" + abs(session.myUserId.hashCode()) - httpPusher.lang shouldBeEqualTo Locale.UK.language - httpPusher.appDisplayName shouldBeEqualTo appName - httpPusher.deviceDisplayName shouldBeEqualTo deviceDisplayName - httpPusher.enabled shouldBeEqualTo true - httpPusher.deviceId shouldBeEqualTo session.sessionParams.deviceId - httpPusher.append shouldBeEqualTo false - httpPusher.withEventIdOnly shouldBeEqualTo true - httpPusher.url shouldBeEqualTo gateway + httpPusher shouldBeEqualTo expectedHttpPusher } } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeCryptoService.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeCryptoService.kt index 538ce671d2..02b911e800 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeCryptoService.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeCryptoService.kt @@ -17,6 +17,7 @@ package im.vector.app.test.fakes import androidx.lifecycle.MutableLiveData +import im.vector.app.test.fixtures.CryptoDeviceInfoFixture.aCryptoDeviceInfo import io.mockk.mockk import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo @@ -32,6 +33,7 @@ class FakeCryptoService( var cryptoDeviceInfos = mutableMapOf() var cryptoDeviceInfoWithIdLiveData: MutableLiveData> = MutableLiveData() var myDevicesInfoWithIdLiveData: MutableLiveData> = MutableLiveData() + var cryptoDeviceInfo = aCryptoDeviceInfo() override fun crossSigningService() = fakeCrossSigningService @@ -50,4 +52,6 @@ class FakeCryptoService( override fun getLiveCryptoDeviceInfoWithId(deviceId: String) = cryptoDeviceInfoWithIdLiveData override fun getMyDevicesInfoLive(deviceId: String) = myDevicesInfoWithIdLiveData + + override fun getMyDevice() = cryptoDeviceInfo } diff --git a/vector/src/main/java/im/vector/app/AppBuildConfig.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeGetDeviceInfoUseCase.kt similarity index 61% rename from vector/src/main/java/im/vector/app/AppBuildConfig.kt rename to vector/src/test/java/im/vector/app/test/fakes/FakeGetDeviceInfoUseCase.kt index 54eb4f87ea..c284263d28 100644 --- a/vector/src/main/java/im/vector/app/AppBuildConfig.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeGetDeviceInfoUseCase.kt @@ -14,13 +14,16 @@ * limitations under the License. */ -package im.vector.app +package im.vector.app.test.fakes -import android.os.Build +import im.vector.app.core.device.GetDeviceInfoUseCase +import io.mockk.every +import io.mockk.mockk +import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo -object AppBuildConfig { +class FakeGetDeviceInfoUseCase : GetDeviceInfoUseCase by mockk() { - fun getModel(): String { - return Build.MODEL + fun givenDeviceInfo(cryptoDeviceInfo: CryptoDeviceInfo) { + every { execute() } returns cryptoDeviceInfo } } diff --git a/vector/src/test/java/im/vector/app/test/fixtures/CryptoDeviceInfoFixture.kt b/vector/src/test/java/im/vector/app/test/fixtures/CryptoDeviceInfoFixture.kt new file mode 100644 index 0000000000..834a428b4a --- /dev/null +++ b/vector/src/test/java/im/vector/app/test/fixtures/CryptoDeviceInfoFixture.kt @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.test.fixtures + +import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel +import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import org.matrix.android.sdk.api.session.crypto.model.UnsignedDeviceInfo + +object CryptoDeviceInfoFixture { + + fun aCryptoDeviceInfo( + deviceId: String = "", + userId: String = "", + algorithms: List? = null, + keys: Map? = null, + signatures: Map>? = null, + unsigned: UnsignedDeviceInfo? = null, + trustLevel: DeviceTrustLevel? = null, + isBlocked: Boolean = false, + firstTimeSeenLocalTs: Long? = null, + ) = CryptoDeviceInfo( + deviceId, + userId, + algorithms, + keys, + signatures, + unsigned, + trustLevel, + isBlocked, + firstTimeSeenLocalTs, + ) +}