,
expectedResultForAlice: ExpectedResult,
expectedResultForBob: ExpectedResult) {
- val testHelper = CommonTestHelper(context())
- val cryptoTestHelper = CryptoTestHelper(testHelper)
+ val testHelper = CommonTestHelper(context())
+ val cryptoTestHelper = CryptoTestHelper(testHelper)
val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
diff --git a/matrix-sdk-android/src/debug/java/org/matrix/android/sdk/internal/network/interceptors/CurlLoggingInterceptor.kt b/matrix-sdk-android/src/debug/java/org/matrix/android/sdk/internal/network/interceptors/CurlLoggingInterceptor.kt
index 3add757efa..6dd3553d02 100644
--- a/matrix-sdk-android/src/debug/java/org/matrix/android/sdk/internal/network/interceptors/CurlLoggingInterceptor.kt
+++ b/matrix-sdk-android/src/debug/java/org/matrix/android/sdk/internal/network/interceptors/CurlLoggingInterceptor.kt
@@ -37,7 +37,7 @@ import javax.inject.Inject
*/
@MatrixScope
internal class CurlLoggingInterceptor @Inject constructor() :
- Interceptor {
+ Interceptor {
/**
* Set any additional curl command options (see 'curl --help').
diff --git a/vector/src/main/java/im/vector/app/features/login/terms/UrlAndName.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UrlAndName.kt
similarity index 87%
rename from vector/src/main/java/im/vector/app/features/login/terms/UrlAndName.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UrlAndName.kt
index f298aeca37..ca0123b832 100644
--- a/vector/src/main/java/im/vector/app/features/login/terms/UrlAndName.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UrlAndName.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2019 New Vector Ltd
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package im.vector.app.features.login.terms
+package org.matrix.android.sdk.api.auth
data class UrlAndName(
val url: String,
diff --git a/vector/src/main/java/im/vector/app/features/login/terms/converter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/converter.kt
similarity index 71%
rename from vector/src/main/java/im/vector/app/features/login/terms/converter.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/converter.kt
index 56dc1edf9d..1a4c1ee51c 100644
--- a/vector/src/main/java/im/vector/app/features/login/terms/converter.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/converter.kt
@@ -1,120 +1,127 @@
-/*
- * Copyright 2019 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.features.login.terms
-
-import org.matrix.android.sdk.api.auth.data.LocalizedFlowDataLoginTerms
-import org.matrix.android.sdk.api.auth.registration.TermPolicies
-
-/**
- * This method extract the policies from the login terms parameter, regarding the user language.
- * For each policy, if user language is not found, the default language is used and if not found, the first url and name are used (not predictable)
- *
- * Example of Data:
- *
- * "m.login.terms": {
- * "policies": {
- * "privacy_policy": {
- * "version": "1.0",
- * "en": {
- * "url": "http:\/\/matrix.org\/_matrix\/consent?v=1.0",
- * "name": "Terms and Conditions"
- * }
- * }
- * }
- * }
- *
- *
- * @param userLanguage the user language
- * @param defaultLanguage the default language to use if the user language is not found for a policy in registrationFlowResponse
- */
-fun TermPolicies.toLocalizedLoginTerms(userLanguage: String,
- defaultLanguage: String = "en"): List {
- val result = ArrayList()
-
- val policies = get("policies")
- if (policies is Map<*, *>) {
- policies.keys.forEach { policyName ->
- val localizedFlowDataLoginTerms = LocalizedFlowDataLoginTerms()
- localizedFlowDataLoginTerms.policyName = policyName as String
-
- val policy = policies[policyName]
-
- // Enter this policy
- if (policy is Map<*, *>) {
- // Version
- localizedFlowDataLoginTerms.version = policy["version"] as String?
-
- var userLanguageUrlAndName: UrlAndName? = null
- var defaultLanguageUrlAndName: UrlAndName? = null
- var firstUrlAndName: UrlAndName? = null
-
- // Search for language
- policy.keys.forEach { policyKey ->
- when (policyKey) {
- "version" -> Unit // Ignore
- userLanguage -> {
- // We found the data for the user language
- userLanguageUrlAndName = extractUrlAndName(policy[policyKey])
- }
- defaultLanguage -> {
- // We found default language
- defaultLanguageUrlAndName = extractUrlAndName(policy[policyKey])
- }
- else -> {
- if (firstUrlAndName == null) {
- // Get at least some data
- firstUrlAndName = extractUrlAndName(policy[policyKey])
- }
- }
- }
- }
-
- // Copy found language data by priority
- when {
- userLanguageUrlAndName != null -> {
- localizedFlowDataLoginTerms.localizedUrl = userLanguageUrlAndName!!.url
- localizedFlowDataLoginTerms.localizedName = userLanguageUrlAndName!!.name
- }
- defaultLanguageUrlAndName != null -> {
- localizedFlowDataLoginTerms.localizedUrl = defaultLanguageUrlAndName!!.url
- localizedFlowDataLoginTerms.localizedName = defaultLanguageUrlAndName!!.name
- }
- firstUrlAndName != null -> {
- localizedFlowDataLoginTerms.localizedUrl = firstUrlAndName!!.url
- localizedFlowDataLoginTerms.localizedName = firstUrlAndName!!.name
- }
- }
- }
-
- result.add(localizedFlowDataLoginTerms)
- }
- }
-
- return result
-}
-
-private fun extractUrlAndName(policyData: Any?): UrlAndName? {
- if (policyData is Map<*, *>) {
- val url = policyData["url"] as String?
- val name = policyData["name"] as String?
-
- if (url != null && name != null) {
- return UrlAndName(url, name)
- }
- }
- return null
-}
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * 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 org.matrix.android.sdk.api.auth
+
+import org.matrix.android.sdk.api.auth.data.LocalizedFlowDataLoginTerms
+import org.matrix.android.sdk.api.auth.registration.TermPolicies
+
+/**
+ * This method extract the policies from the login terms parameter, regarding the user language.
+ * For each policy, if user language is not found, the default language is used and if not found, the first url and name are used (not predictable)
+ *
+ * Example of Data:
+ *
+ * "m.login.terms": {
+ * "policies": {
+ * "privacy_policy": {
+ * "version": "1.0",
+ * "en": {
+ * "url": "http:\/\/matrix.org\/_matrix\/consent?v=1.0",
+ * "name": "Terms and Conditions"
+ * }
+ * }
+ * }
+ * }
+ *
+ *
+ * @param userLanguage the user language
+ * @param defaultLanguage the default language to use if the user language is not found for a policy in registrationFlowResponse
+ */
+fun TermPolicies.toLocalizedLoginTerms(userLanguage: String,
+ defaultLanguage: String = "en"): List {
+ val result = ArrayList()
+
+ val policies = get("policies")
+ if (policies is Map<*, *>) {
+ policies.keys.forEach { policyName ->
+ val localizedFlowDataLoginTermsPolicyName = policyName as String
+ var localizedFlowDataLoginTermsVersion: String? = null
+ var localizedFlowDataLoginTermsLocalizedUrl: String? = null
+ var localizedFlowDataLoginTermsLocalizedName: String? = null
+
+ val policy = policies[policyName]
+
+ // Enter this policy
+ if (policy is Map<*, *>) {
+ // Version
+ localizedFlowDataLoginTermsVersion = policy["version"] as String?
+
+ var userLanguageUrlAndName: UrlAndName? = null
+ var defaultLanguageUrlAndName: UrlAndName? = null
+ var firstUrlAndName: UrlAndName? = null
+
+ // Search for language
+ policy.keys.forEach { policyKey ->
+ when (policyKey) {
+ "version" -> Unit // Ignore
+ userLanguage -> {
+ // We found the data for the user language
+ userLanguageUrlAndName = extractUrlAndName(policy[policyKey])
+ }
+ defaultLanguage -> {
+ // We found default language
+ defaultLanguageUrlAndName = extractUrlAndName(policy[policyKey])
+ }
+ else -> {
+ if (firstUrlAndName == null) {
+ // Get at least some data
+ firstUrlAndName = extractUrlAndName(policy[policyKey])
+ }
+ }
+ }
+ }
+
+ // Copy found language data by priority
+ when {
+ userLanguageUrlAndName != null -> {
+ localizedFlowDataLoginTermsLocalizedUrl = userLanguageUrlAndName!!.url
+ localizedFlowDataLoginTermsLocalizedName = userLanguageUrlAndName!!.name
+ }
+ defaultLanguageUrlAndName != null -> {
+ localizedFlowDataLoginTermsLocalizedUrl = defaultLanguageUrlAndName!!.url
+ localizedFlowDataLoginTermsLocalizedName = defaultLanguageUrlAndName!!.name
+ }
+ firstUrlAndName != null -> {
+ localizedFlowDataLoginTermsLocalizedUrl = firstUrlAndName!!.url
+ localizedFlowDataLoginTermsLocalizedName = firstUrlAndName!!.name
+ }
+ }
+ }
+
+ result.add(LocalizedFlowDataLoginTerms(
+ policyName = localizedFlowDataLoginTermsPolicyName,
+ version = localizedFlowDataLoginTermsVersion,
+ localizedUrl = localizedFlowDataLoginTermsLocalizedUrl,
+ localizedName = localizedFlowDataLoginTermsLocalizedName
+ ))
+ }
+ }
+
+ return result
+}
+
+private fun extractUrlAndName(policyData: Any?): UrlAndName? {
+ if (policyData is Map<*, *>) {
+ val url = policyData["url"] as String?
+ val name = policyData["name"] as String?
+
+ if (url != null && name != null) {
+ return UrlAndName(url, name)
+ }
+ }
+ return null
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LocalizedFlowDataLoginTerms.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LocalizedFlowDataLoginTerms.kt
index 863abf7f51..1e844a1d94 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LocalizedFlowDataLoginTerms.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LocalizedFlowDataLoginTerms.kt
@@ -24,8 +24,8 @@ import kotlinx.parcelize.Parcelize
*/
@Parcelize
data class LocalizedFlowDataLoginTerms(
- var policyName: String? = null,
- var version: String? = null,
- var localizedUrl: String? = null,
- var localizedName: String? = null
+ val policyName: String?,
+ val version: String?,
+ val localizedUrl: String?,
+ val localizedName: String?
) : Parcelable
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
index 621253faa5..0cda64499f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
@@ -16,6 +16,8 @@
package org.matrix.android.sdk.api.auth.registration
+import org.matrix.android.sdk.api.util.JsonDict
+
/**
* Set of methods to be able to create an account on a homeserver.
*
@@ -73,6 +75,13 @@ interface RegistrationWizard {
*/
suspend fun dummy(): RegistrationResult
+ /**
+ * Perform custom registration stage by sending a custom JsonDict.
+ * Current registration "session" param will be included into authParams by default.
+ * The authParams should contain at least one entry "type" with a String value.
+ */
+ suspend fun registrationCustom(authParams: JsonDict): RegistrationResult
+
/**
* Perform the "m.login.email.identity" or "m.login.msisdn" stage.
*
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
index 99fc0ba8b7..362ebcec26 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
@@ -22,34 +22,29 @@ import org.matrix.android.sdk.api.session.contentscanner.ContentScannerError
import org.matrix.android.sdk.api.session.contentscanner.ScanFailure
import org.matrix.android.sdk.internal.di.MoshiProvider
import java.io.IOException
+import java.net.UnknownHostException
import javax.net.ssl.HttpsURLConnection
-fun Throwable.is401() =
- this is Failure.ServerError &&
- httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED && /* 401 */
- error.code == MatrixError.M_UNAUTHORIZED
+fun Throwable.is401() = this is Failure.ServerError &&
+ httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED && /* 401 */
+ error.code == MatrixError.M_UNAUTHORIZED
-fun Throwable.is404() =
- this is Failure.ServerError &&
- httpCode == HttpsURLConnection.HTTP_NOT_FOUND && /* 404 */
- error.code == MatrixError.M_NOT_FOUND
+fun Throwable.is404() = this is Failure.ServerError &&
+ httpCode == HttpsURLConnection.HTTP_NOT_FOUND && /* 404 */
+ error.code == MatrixError.M_NOT_FOUND
-fun Throwable.isTokenError() =
- this is Failure.ServerError &&
- (error.code == MatrixError.M_UNKNOWN_TOKEN ||
- error.code == MatrixError.M_MISSING_TOKEN ||
- error.code == MatrixError.ORG_MATRIX_EXPIRED_ACCOUNT)
+fun Throwable.isTokenError() = this is Failure.ServerError &&
+ (error.code == MatrixError.M_UNKNOWN_TOKEN ||
+ error.code == MatrixError.M_MISSING_TOKEN ||
+ error.code == MatrixError.ORG_MATRIX_EXPIRED_ACCOUNT)
-fun Throwable.isLimitExceededError() =
- this is Failure.ServerError &&
- httpCode == 429 &&
- error.code == MatrixError.M_LIMIT_EXCEEDED
+fun Throwable.isLimitExceededError() = this is Failure.ServerError &&
+ httpCode == 429 &&
+ error.code == MatrixError.M_LIMIT_EXCEEDED
-fun Throwable.shouldBeRetried(): Boolean {
- return this is Failure.NetworkConnection ||
- this is IOException ||
- this.isLimitExceededError()
-}
+fun Throwable.shouldBeRetried() = this is Failure.NetworkConnection ||
+ this is IOException ||
+ isLimitExceededError()
/**
* Get the retry delay in case of rate limit exceeded error, adding 100 ms, of defaultValue otherwise
@@ -63,41 +58,33 @@ fun Throwable.getRetryDelay(defaultValue: Long): Long {
?: defaultValue
}
-fun Throwable.isUsernameInUse(): Boolean {
- return this is Failure.ServerError && error.code == MatrixError.M_USER_IN_USE
-}
+fun Throwable.isUsernameInUse() = this is Failure.ServerError &&
+ error.code == MatrixError.M_USER_IN_USE
-fun Throwable.isInvalidUsername(): Boolean {
- return this is Failure.ServerError &&
- error.code == MatrixError.M_INVALID_USERNAME
-}
+fun Throwable.isInvalidUsername() = this is Failure.ServerError &&
+ error.code == MatrixError.M_INVALID_USERNAME
-fun Throwable.isInvalidPassword(): Boolean {
- return this is Failure.ServerError &&
- error.code == MatrixError.M_FORBIDDEN &&
- error.message == "Invalid password"
-}
+fun Throwable.isInvalidPassword() = this is Failure.ServerError &&
+ error.code == MatrixError.M_FORBIDDEN &&
+ error.message == "Invalid password"
-fun Throwable.isRegistrationDisabled(): Boolean {
- return this is Failure.ServerError && error.code == MatrixError.M_FORBIDDEN &&
- httpCode == HttpsURLConnection.HTTP_FORBIDDEN
-}
+fun Throwable.isRegistrationDisabled() = this is Failure.ServerError &&
+ error.code == MatrixError.M_FORBIDDEN &&
+ httpCode == HttpsURLConnection.HTTP_FORBIDDEN
-fun Throwable.isWeakPassword(): Boolean {
- return this is Failure.ServerError && error.code == MatrixError.M_WEAK_PASSWORD
-}
+fun Throwable.isWeakPassword() = this is Failure.ServerError &&
+ error.code == MatrixError.M_WEAK_PASSWORD
-fun Throwable.isLoginEmailUnknown(): Boolean {
- return this is Failure.ServerError &&
- error.code == MatrixError.M_FORBIDDEN &&
- error.message.isEmpty()
-}
+fun Throwable.isLoginEmailUnknown() = this is Failure.ServerError &&
+ error.code == MatrixError.M_FORBIDDEN &&
+ error.message.isEmpty()
-fun Throwable.isInvalidUIAAuth(): Boolean {
- return this is Failure.ServerError &&
- error.code == MatrixError.M_FORBIDDEN &&
- error.flows != null
-}
+fun Throwable.isInvalidUIAAuth() = this is Failure.ServerError &&
+ error.code == MatrixError.M_FORBIDDEN &&
+ error.flows != null
+
+fun Throwable.isHomeserverUnavailable() = this is Failure.NetworkConnection &&
+ this.ioException is UnknownHostException
/**
* Try to convert to a RegistrationFlowResponse. Return null in the cases it's not possible
@@ -129,13 +116,11 @@ fun Throwable.toRegistrationFlowResponse(): RegistrationFlowResponse? {
}
}
-fun Throwable.isRegistrationAvailabilityError(): Boolean {
- return this is Failure.ServerError &&
- httpCode == HttpsURLConnection.HTTP_BAD_REQUEST && /* 400 */
- (error.code == MatrixError.M_USER_IN_USE ||
- error.code == MatrixError.M_INVALID_USERNAME ||
- error.code == MatrixError.M_EXCLUSIVE)
-}
+fun Throwable.isRegistrationAvailabilityError() = this is Failure.ServerError &&
+ httpCode == HttpsURLConnection.HTTP_BAD_REQUEST && /* 400 */
+ (error.code == MatrixError.M_USER_IN_USE ||
+ error.code == MatrixError.M_INVALID_USERNAME ||
+ error.code == MatrixError.M_EXCLUSIVE)
/**
* Try to convert to a ScanFailure. Return null in the cases it's not possible
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt
index b5165b6687..5b4896f95f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/GlobalError.kt
@@ -23,5 +23,10 @@ sealed class GlobalError {
data class InvalidToken(val softLogout: Boolean) : GlobalError()
data class ConsentNotGivenError(val consentUri: String) : GlobalError()
data class CertificateError(val fingerprint: Fingerprint) : GlobalError()
+
+ /**
+ * The SDK requires the app (which should request the user) to perform an initial sync.
+ */
+ data class InitialSyncRequest(val reason: InitialSyncRequestReason) : GlobalError()
object ExpiredAccount : GlobalError()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/InitialSyncRequestReason.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/InitialSyncRequestReason.kt
new file mode 100644
index 0000000000..ebe07823f4
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/InitialSyncRequestReason.kt
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2022 The Matrix.org Foundation C.I.C.
+ *
+ * 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 org.matrix.android.sdk.api.failure
+
+/**
+ * This enum provide the reason why the SDK request an initial sync to the application
+ */
+enum class InitialSyncRequestReason {
+ /**
+ * The list of ignored users has changed, and at least one user who was ignored is not ignored anymore
+ */
+ IGNORED_USERS_LIST_CHANGE,
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
index be924e2063..207afd50cc 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
@@ -24,7 +24,6 @@ import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.auth.data.SessionParams
import org.matrix.android.sdk.api.failure.GlobalError
import org.matrix.android.sdk.api.federation.FederationService
-import org.matrix.android.sdk.api.pushrules.PushRuleService
import org.matrix.android.sdk.api.session.account.AccountService
import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService
import org.matrix.android.sdk.api.session.cache.CacheService
@@ -47,6 +46,7 @@ import org.matrix.android.sdk.api.session.permalinks.PermalinkService
import org.matrix.android.sdk.api.session.presence.PresenceService
import org.matrix.android.sdk.api.session.profile.ProfileService
import org.matrix.android.sdk.api.session.pushers.PushersService
+import org.matrix.android.sdk.api.session.pushrules.PushRuleService
import org.matrix.android.sdk.api.session.room.RoomDirectoryService
import org.matrix.android.sdk.api.session.room.RoomService
import org.matrix.android.sdk.api.session.search.SearchService
@@ -298,6 +298,7 @@ interface Session :
* Possible cases:
* - The access token is not valid anymore,
* - a M_CONSENT_NOT_GIVEN error has been received from the homeserver
+ * See [GlobalError] for all the possible cases
*/
fun onGlobalError(session: Session, globalError: GlobalError) = Unit
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
index 042a626d28..c9a2d4e7a5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrust.kt
@@ -18,17 +18,16 @@ package org.matrix.android.sdk.api.session.crypto.keysbackup
/**
* Data model for response to [KeysBackup.getKeysBackupTrust()].
- * TODO Members should be only val
*/
data class KeysBackupVersionTrust(
/**
* Flag to indicate if the backup is trusted.
* true if there is a signature that is valid & from a trusted device.
*/
- var usable: Boolean = false,
+ val usable: Boolean,
/**
* Signatures found in the backup version.
*/
- var signatures: MutableList = ArrayList()
+ val signatures: List = emptyList()
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrustSignature.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrustSignature.kt
index 52c6fa7132..219a328cfd 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrustSignature.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupVersionTrustSignature.kt
@@ -20,23 +20,21 @@ import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
/**
* A signature in a `KeysBackupVersionTrust` object.
- * TODO Make it a data class with only val
*/
-class KeysBackupVersionTrustSignature {
+data class KeysBackupVersionTrustSignature(
+ /**
+ * The id of the device that signed the backup version.
+ */
+ val deviceId: String?,
- /**
- * The id of the device that signed the backup version.
- */
- var deviceId: String? = null
+ /**
+ * The device that signed the backup version.
+ * Can be null if the device is not known.
+ */
+ val device: CryptoDeviceInfo?,
- /**
- * The device that signed the backup version.
- * Can be null if the device is not known.
- */
- var device: CryptoDeviceInfo? = null
-
- /**
- * Flag to indicate the signature from this device is valid.
- */
- var valid = false
-}
+ /**
+ * Flag to indicate the signature from this device is valid.
+ */
+ val valid: Boolean,
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt
index 3fa8c31cf5..418b1e6ce3 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/CryptoDeviceInfo.kt
@@ -22,12 +22,12 @@ import org.matrix.android.sdk.internal.crypto.model.CryptoInfo
data class CryptoDeviceInfo(
val deviceId: String,
override val userId: String,
- var algorithms: List? = null,
+ val algorithms: List? = null,
override val keys: Map? = null,
override val signatures: Map>? = null,
val unsigned: UnsignedDeviceInfo? = null,
var trustLevel: DeviceTrustLevel? = null,
- var isBlocked: Boolean = false,
+ val isBlocked: Boolean = false,
val firstTimeSeenLocalTs: Long? = null
) : CryptoInfo {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/OutgoingRoomKeyRequest.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/OutgoingRoomKeyRequest.kt
index f0a4b24c5f..5f35cc908f 100755
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/OutgoingRoomKeyRequest.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/model/OutgoingRoomKeyRequest.kt
@@ -25,14 +25,14 @@ import org.matrix.android.sdk.internal.crypto.OutgoingGossipingRequest
@JsonClass(generateAdapter = true)
data class OutgoingRoomKeyRequest(
// RequestBody
- var requestBody: RoomKeyRequestBody?,
+ val requestBody: RoomKeyRequestBody?,
// list of recipients for the request
- override var recipients: Map>,
+ override val recipients: Map>,
// Unique id for this request. Used for both
// an id within the request for later pairing with a cancellation, and for
// the transaction id when sending the to_device messages to our local
- override var requestId: String, // current state of this request
- override var state: OutgoingGossipingRequestState
+ override val requestId: String, // current state of this request
+ override val state: OutgoingGossipingRequestState
// transaction id for the cancellation, if any
// override var cancellationTxnId: String? = null
) : OutgoingGossipingRequest {
@@ -43,9 +43,7 @@ data class OutgoingRoomKeyRequest(
* @return the room id.
*/
val roomId: String?
- get() = if (null != requestBody) {
- requestBody!!.roomId
- } else null
+ get() = requestBody?.roomId
/**
* Used only for log.
@@ -53,7 +51,5 @@ data class OutgoingRoomKeyRequest(
* @return the session id
*/
val sessionId: String?
- get() = if (null != requestBody) {
- requestBody!!.sessionId
- } else null
+ get() = requestBody?.sessionId
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/file/FileService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/file/FileService.kt
index 72f8019ada..e3ccbad249 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/file/FileService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/file/FileService.kt
@@ -45,9 +45,9 @@ interface FileService {
* Result will be a decrypted file, stored in the cache folder. url parameter will be used to create unique filename to avoid name collision.
*/
suspend fun downloadFile(fileName: String,
- mimeType: String?,
- url: String?,
- elementToDecrypt: ElementToDecrypt?): File
+ mimeType: String?,
+ url: String?,
+ elementToDecrypt: ElementToDecrypt?): File
suspend fun downloadFile(messageContent: MessageWithAttachmentContent): File =
downloadFile(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt
index 9db3876b74..597c1a0ca8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt
@@ -54,7 +54,7 @@ data class HomeServerCapabilities(
/**
* True if the home server support threading
*/
- var canUseThreading: Boolean = false
+ val canUseThreading: Boolean = false
) {
enum class RoomCapabilitySupport {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/SyncStatusService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/SyncStatusService.kt
index 267436916e..759813939f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/SyncStatusService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/initsync/SyncStatusService.kt
@@ -43,6 +43,7 @@ interface SyncStatusService {
val rooms: Int,
val toDevice: Int
) : IncrementalSyncStatus()
+
object IncrementalSyncError : IncrementalSyncStatus()
object IncrementalSyncDone : IncrementalSyncStatus()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/permalinks/MatrixLinkify.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/permalinks/MatrixLinkify.kt
index 3e27da0c41..c5d919407a 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/permalinks/MatrixLinkify.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/permalinks/MatrixLinkify.kt
@@ -55,7 +55,7 @@ object MatrixLinkify {
MatrixPatterns.isRoomId(url) ||
MatrixPatterns.isGroupId(url) ||
MatrixPatterns.isEventId(url)) {
- url = PermalinkService.MATRIX_TO_URL_BASE + url
+ url = PermalinkService.MATRIX_TO_URL_BASE + url
}
val span = MatrixPermalinkSpan(url, callback)
spannable.setSpan(span, startPos, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/permalinks/PermalinkData.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/permalinks/PermalinkData.kt
index 85291cf0f6..57aacc98b8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/permalinks/PermalinkData.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/permalinks/PermalinkData.kt
@@ -35,21 +35,21 @@ sealed class PermalinkData {
/**
* &room_name=Team2
- &room_avatar_url=mxc:
- &inviter_name=bob
+ &room_avatar_url=mxc:
+ &inviter_name=bob
*/
@Parcelize
data class RoomEmailInviteLink(
- val roomId: String,
- val email: String,
- val signUrl: String,
- val roomName: String?,
- val roomAvatarUrl: String?,
- val inviterName: String?,
- val identityServer: String,
- val token: String,
- val privateKey: String,
- val roomType: String?
+ val roomId: String,
+ val email: String,
+ val signUrl: String,
+ val roomName: String?,
+ val roomAvatarUrl: String?,
+ val inviterName: String?,
+ val identityServer: String,
+ val token: String,
+ val privateKey: String,
+ val roomType: String?
) : PermalinkData(), Parcelable
data class UserLink(val userId: String) : PermalinkData()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Action.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Action.kt
similarity index 97%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Action.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Action.kt
index 30289531e7..7790942d84 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Action.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Action.kt
@@ -13,9 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
import timber.log.Timber
sealed class Action {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Condition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Condition.kt
similarity index 93%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Condition.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Condition.kt
index 04cccf7319..df5b056c2e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Condition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Condition.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import org.matrix.android.sdk.api.session.events.model.Event
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ConditionResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/ConditionResolver.kt
similarity index 96%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ConditionResolver.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/ConditionResolver.kt
index 0a7366e5d2..f8a930f987 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ConditionResolver.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/ConditionResolver.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import org.matrix.android.sdk.api.session.events.model.Event
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ContainsDisplayNameCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/ContainsDisplayNameCondition.kt
similarity index 97%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ContainsDisplayNameCondition.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/ContainsDisplayNameCondition.kt
index 7f43023873..69dd14ddc2 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/ContainsDisplayNameCondition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/ContainsDisplayNameCondition.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt
similarity index 98%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt
index 65a13b4fec..8875807b8a 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.internal.di.MoshiProvider
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Kind.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Kind.kt
similarity index 96%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Kind.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Kind.kt
index 293a06af9f..463f3c2a73 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/Kind.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/Kind.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
enum class Kind(val value: String) {
EventMatch("event_match"),
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushEvents.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/PushEvents.kt
similarity index 88%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushEvents.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/PushEvents.kt
index 466e345cad..ee460d7076 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushEvents.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/PushEvents.kt
@@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
data class PushEvents(
val matchedEvents: List>,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/PushRuleService.kt
similarity index 91%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/PushRuleService.kt
index 76885d8545..abbdbf8104 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/PushRuleService.kt
@@ -13,12 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import androidx.lifecycle.LiveData
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
-import org.matrix.android.sdk.api.pushrules.rest.RuleSet
import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.rest.RuleSet
interface PushRuleService {
/**
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RoomMemberCountCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RoomMemberCountCondition.kt
similarity index 97%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RoomMemberCountCondition.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RoomMemberCountCondition.kt
index 328e6dae11..84b2f520ea 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RoomMemberCountCondition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RoomMemberCountCondition.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.internal.session.room.RoomGetter
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleIds.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleIds.kt
similarity index 97%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleIds.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleIds.kt
index 5b14e97d5e..4f35fb79c3 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleIds.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleIds.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
/**
* Known rule ids
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleScope.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleScope.kt
similarity index 92%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleScope.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleScope.kt
index 7c1edc1aca..307b9db042 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleScope.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleScope.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
object RuleScope {
const val GLOBAL = "global"
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleSetKey.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleSetKey.kt
similarity index 95%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleSetKey.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleSetKey.kt
index 5b6f6713f8..7b8f4c9f95 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/RuleSetKey.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/RuleSetKey.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
/**
* Ref: https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-pushrules
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/SenderNotificationPermissionCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/SenderNotificationPermissionCondition.kt
similarity index 97%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/SenderNotificationPermissionCondition.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/SenderNotificationPermissionCondition.kt
index 6675fb0ff5..82f5023c2f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/SenderNotificationPermissionCondition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/SenderNotificationPermissionCondition.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt
similarity index 84%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushCondition.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt
index b31a1e6343..1fc8329535 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushCondition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt
@@ -13,17 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules.rest
+package org.matrix.android.sdk.api.session.pushrules.rest
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
-import org.matrix.android.sdk.api.pushrules.Condition
-import org.matrix.android.sdk.api.pushrules.ContainsDisplayNameCondition
-import org.matrix.android.sdk.api.pushrules.EventMatchCondition
-import org.matrix.android.sdk.api.pushrules.Kind
-import org.matrix.android.sdk.api.pushrules.RoomMemberCountCondition
-import org.matrix.android.sdk.api.pushrules.RuleIds
-import org.matrix.android.sdk.api.pushrules.SenderNotificationPermissionCondition
+import org.matrix.android.sdk.api.session.pushrules.Condition
+import org.matrix.android.sdk.api.session.pushrules.ContainsDisplayNameCondition
+import org.matrix.android.sdk.api.session.pushrules.EventMatchCondition
+import org.matrix.android.sdk.api.session.pushrules.Kind
+import org.matrix.android.sdk.api.session.pushrules.RoomMemberCountCondition
+import org.matrix.android.sdk.api.session.pushrules.RuleIds
+import org.matrix.android.sdk.api.session.pushrules.SenderNotificationPermissionCondition
import timber.log.Timber
/**
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushRule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushRule.kt
similarity index 94%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushRule.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushRule.kt
index 31d7770a9f..270ffb2940 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushRule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushRule.kt
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules.rest
+package org.matrix.android.sdk.api.session.pushrules.rest
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import org.matrix.android.sdk.api.extensions.orFalse
-import org.matrix.android.sdk.api.pushrules.Action
-import org.matrix.android.sdk.api.pushrules.getActions
-import org.matrix.android.sdk.api.pushrules.toJson
+import org.matrix.android.sdk.api.session.pushrules.Action
+import org.matrix.android.sdk.api.session.pushrules.getActions
+import org.matrix.android.sdk.api.session.pushrules.toJson
/**
* Ref: https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-pushrules
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/RuleSet.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/RuleSet.kt
similarity index 93%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/RuleSet.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/RuleSet.kt
index 46f5148714..5bf42b8252 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/RuleSet.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/RuleSet.kt
@@ -13,12 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules.rest
+package org.matrix.android.sdk.api.session.pushrules.rest
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
-import org.matrix.android.sdk.api.pushrules.RuleIds
-import org.matrix.android.sdk.api.pushrules.RuleSetKey
+import org.matrix.android.sdk.api.session.pushrules.RuleIds
+import org.matrix.android.sdk.api.session.pushrules.RuleSetKey
/**
* Ref: https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-pushrules
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EventAnnotationsSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EventAnnotationsSummary.kt
index 3a4912e457..0238eb6c8d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EventAnnotationsSummary.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EventAnnotationsSummary.kt
@@ -16,9 +16,9 @@
package org.matrix.android.sdk.api.session.room.model
data class EventAnnotationsSummary(
- var eventId: String,
- var reactionsSummary: List = emptyList(),
- var editSummary: EditAggregatedSummary? = null,
- var pollResponseSummary: PollResponseAggregatedSummary? = null,
- var referencesAggregatedSummary: ReferencesAggregatedSummary? = null
+ val eventId: String,
+ val reactionsSummary: List = emptyList(),
+ val editSummary: EditAggregatedSummary? = null,
+ val pollResponseSummary: PollResponseAggregatedSummary? = null,
+ val referencesAggregatedSummary: ReferencesAggregatedSummary? = null
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollResponseAggregatedSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollResponseAggregatedSummary.kt
index a15d8be084..b16852e47d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollResponseAggregatedSummary.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollResponseAggregatedSummary.kt
@@ -16,13 +16,11 @@
package org.matrix.android.sdk.api.session.room.model
data class PollResponseAggregatedSummary(
-
- var aggregatedContent: PollSummaryContent? = null,
-
+ val aggregatedContent: PollSummaryContent? = null,
// If set the poll is closed (Clients SHOULD NOT consider responses after the close event)
- var closedTime: Long? = null,
+ val closedTime: Long? = null,
// Clients SHOULD validate that the option in the relationship is a valid option, and ignore the response if invalid
- var nbOptions: Int = 0,
+ val nbOptions: Int = 0,
// The list of the eventIDs used to build the summary (might be out of sync if chunked received from message chunk)
val sourceEvents: List,
val localEchos: List
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollSummaryContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollSummaryContent.kt
index f1e4354314..09458ff12e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollSummaryContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/PollSummaryContent.kt
@@ -24,13 +24,13 @@ import com.squareup.moshi.JsonClass
*/
@JsonClass(generateAdapter = true)
data class PollSummaryContent(
- var myVote: String? = null,
- // Array of VoteInfo, list is constructed so that there is only one vote by user
+ val myVote: String? = null,
+ // List of VoteInfo, list is constructed so that there is only one vote by user
// And that optionIndex is valid
- var votes: List? = null,
- var votesSummary: Map? = null,
- var totalVotes: Int = 0,
- var winnerVoteCount: Int = 0
+ val votes: List? = null,
+ val votesSummary: Map? = null,
+ val totalVotes: Int = 0,
+ val winnerVoteCount: Int = 0
)
@JsonClass(generateAdapter = true)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomJoinRulesContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomJoinRulesContent.kt
index 871b299f93..5237b10d52 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomJoinRulesContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/RoomJoinRulesContent.kt
@@ -36,10 +36,10 @@ data class RoomJoinRulesContent(
@Json(name = "allow") val allowList: List? = null
) {
val joinRules: RoomJoinRules? = when (_joinRules) {
- "public" -> RoomJoinRules.PUBLIC
- "invite" -> RoomJoinRules.INVITE
- "knock" -> RoomJoinRules.KNOCK
- "private" -> RoomJoinRules.PRIVATE
+ "public" -> RoomJoinRules.PUBLIC
+ "invite" -> RoomJoinRules.INVITE
+ "knock" -> RoomJoinRules.KNOCK
+ "private" -> RoomJoinRules.PRIVATE
"restricted" -> RoomJoinRules.RESTRICTED
else -> {
Timber.w("Invalid value for RoomJoinRules: `$_joinRules`")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAnswerContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAnswerContent.kt
index 6b4d782832..67ef85787e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAnswerContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallAnswerContent.kt
@@ -44,7 +44,7 @@ data class CallAnswerContent(
* Capability advertisement.
*/
@Json(name = "capabilities") val capabilities: CallCapabilities? = null
-) : CallSignalingContent {
+) : CallSignalingContent {
@JsonClass(generateAdapter = true)
data class Answer(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallInviteContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallInviteContent.kt
index d70e63d122..24c8152f3c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallInviteContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallInviteContent.kt
@@ -55,7 +55,7 @@ data class CallInviteContent(
*/
@Json(name = "capabilities") val capabilities: CallCapabilities? = null
-) : CallSignalingContent {
+) : CallSignalingContent {
@JsonClass(generateAdapter = true)
data class Offer(
/**
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallNegotiateContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallNegotiateContent.kt
index bbbfbe68ab..5c6c6cda01 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallNegotiateContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallNegotiateContent.kt
@@ -47,7 +47,7 @@ data class CallNegotiateContent(
*/
@Json(name = "version") override val version: String?
- ) : CallSignalingContent {
+) : CallSignalingContent {
@JsonClass(generateAdapter = true)
data class Description(
/**
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallReplacesContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallReplacesContent.kt
index 7947b7d0bd..e480e013ea 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallReplacesContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/call/CallReplacesContent.kt
@@ -61,7 +61,7 @@ data class CallReplacesContent(
* Required. The version of the VoIP specification this messages adheres to.
*/
@Json(name = "version") override val version: String?
-) : CallSignalingContent {
+) : CallSignalingContent {
@JsonClass(generateAdapter = true)
data class TargetUser(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/livelocation/LiveLocationBeaconContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/livelocation/LiveLocationBeaconContent.kt
index 106e76eafd..a7c78f6e80 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/livelocation/LiveLocationBeaconContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/livelocation/LiveLocationBeaconContent.kt
@@ -39,10 +39,18 @@ data class LiveLocationBeaconContent(
@Json(name = "m.new_content") override val newContent: Content? = null,
/**
- * Indicates user's intent to share ephemeral location.
+ * Optional description of the beacon.
*/
- @Json(name = "org.matrix.msc3672.beacon_info") val unstableBeaconInfo: BeaconInfo? = null,
- @Json(name = "m.beacon_info") val beaconInfo: BeaconInfo? = null,
+ @Json(name = "description") val description: String? = null,
+ /**
+ * Beacon should be considered as inactive after this timeout as milliseconds.
+ */
+ @Json(name = "timeout") val timeout: Long? = null,
+ /**
+ * Should be set true to start sharing beacon.
+ */
+ @Json(name = "live") val isLive: Boolean? = null,
+
/**
* Beacon creation timestamp.
*/
@@ -65,8 +73,6 @@ data class LiveLocationBeaconContent(
var hasTimedOut: Boolean = false
) : MessageContent {
- fun getBestBeaconInfo() = beaconInfo ?: unstableBeaconInfo
-
fun getBestTimestampAsMilliseconds() = timestampAsMilliseconds ?: unstableTimestampAsMilliseconds
fun getBestLocationAsset() = locationAsset ?: unstableLocationAsset
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/FileInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/FileInfo.kt
index fa18bfd21f..132b72902f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/FileInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/FileInfo.kt
@@ -52,5 +52,5 @@ data class FileInfo(
* Get the url of the encrypted thumbnail or of the thumbnail
*/
fun FileInfo.getThumbnailUrl(): String? {
- return thumbnailFile?.url ?: thumbnailUrl
+ return thumbnailFile?.url ?: thumbnailUrl
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/ImageInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/ImageInfo.kt
index 0099208320..bd99ea6900 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/ImageInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/ImageInfo.kt
@@ -62,5 +62,5 @@ data class ImageInfo(
* Get the url of the encrypted thumbnail or of the thumbnail
*/
fun ImageInfo.getThumbnailUrl(): String? {
- return thumbnailFile?.url ?: thumbnailUrl
+ return thumbnailFile?.url ?: thumbnailUrl
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVerificationRequestContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVerificationRequestContent.kt
index b2b3cdac90..a0699831f7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVerificationRequestContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVerificationRequestContent.kt
@@ -24,7 +24,7 @@ import org.matrix.android.sdk.internal.crypto.verification.VerificationInfoReque
@JsonClass(generateAdapter = true)
data class MessageVerificationRequestContent(
- @Json(name = MessageContent.MSG_TYPE_JSON_KEY)override val msgType: String = MessageType.MSGTYPE_VERIFICATION_REQUEST,
+ @Json(name = MessageContent.MSG_TYPE_JSON_KEY) override val msgType: String = MessageType.MSGTYPE_VERIFICATION_REQUEST,
@Json(name = "body") override val body: String,
@Json(name = "from_device") override val fromDevice: String?,
@Json(name = "methods") override val methods: List,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVideoContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVideoContent.kt
index 9266a0fb0f..9b657971b9 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVideoContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageVideoContent.kt
@@ -27,7 +27,7 @@ data class MessageVideoContent(
/**
* Required. Must be 'm.video'.
*/
- @Json(name = MessageContent.MSG_TYPE_JSON_KEY)override val msgType: String,
+ @Json(name = MessageContent.MSG_TYPE_JSON_KEY) override val msgType: String,
/**
* Required. A description of the video e.g. 'Gangnam style', or some kind of content description for accessibility e.g. 'video attachment'.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/VideoInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/VideoInfo.kt
index 28f3a47d11..b02b4d96ad 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/VideoInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/VideoInfo.kt
@@ -67,5 +67,5 @@ data class VideoInfo(
* Get the url of the encrypted thumbnail or of the thumbnail
*/
fun VideoInfo.getThumbnailUrl(): String? {
- return thumbnailFile?.url ?: thumbnailUrl
+ return thumbnailFile?.url ?: thumbnailUrl
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
index e9b0e4f676..f645f3ebf9 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/state/StateService.kt
@@ -66,6 +66,19 @@ interface StateService {
*/
suspend fun deleteAvatar()
+ /**
+ * Stops sharing live location in the room
+ * @param userId user id
+ */
+ suspend fun stopLiveLocation(userId: String)
+
+ /**
+ * Returns beacon info state event of a user
+ * @param userId user id who is sharing location
+ * @param filterOnlyLive filters only ongoing live location sharing beacons if true else ended event is included
+ */
+ suspend fun getLiveLocationBeaconInfo(userId: String, filterOnlyLive: Boolean): Event?
+
/**
* Send a state event to the room
* @param eventType The type of event to send.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
index d70049a144..a2ae8bfeb5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
@@ -56,7 +56,7 @@ data class TimelineEvent(
* It's not unique on the timeline as it's reset on each chunk.
*/
val displayIndex: Int,
- var ownedByThreadChunk: Boolean = false,
+ val ownedByThreadChunk: Boolean = false,
val senderInfo: SenderInfo,
val annotations: EventAnnotationsSummary? = null,
val readReceipts: List = emptyList()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEventFilters.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEventFilters.kt
index 4415c8e4b3..a35a291d9b 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEventFilters.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEventFilters.kt
@@ -16,6 +16,7 @@
package org.matrix.android.sdk.api.session.room.timeline
+// TODO Move to internal, strange?
data class TimelineEventFilters(
/**
* A flag to filter edit events
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineSettings.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineSettings.kt
index 6548453c8a..b45f3ecb71 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineSettings.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineSettings.kt
@@ -31,7 +31,8 @@ data class TimelineSettings(
/**
* The root thread eventId if this is a thread timeline, or null if this is NOT a thread timeline
*/
- val rootThreadEventId: String? = null) {
+ val rootThreadEventId: String? = null,
+) {
/**
* Returns true if this is a thread timeline or false otherwise
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SharedSecretStorageError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SharedSecretStorageError.kt
index a91b97b86c..038533c19e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SharedSecretStorageError.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SharedSecretStorageError.kt
@@ -23,7 +23,7 @@ sealed class SharedSecretStorageError(message: String?) : Throwable(message) {
data class UnsupportedAlgorithm(val algorithm: String) : SharedSecretStorageError("Unknown algorithm $algorithm")
data class SecretNotEncrypted(val secretName: String) : SharedSecretStorageError("Missing content for secret $secretName")
data class SecretNotEncryptedWithKey(val secretName: String, val keyId: String) :
- SharedSecretStorageError("Missing content for secret $secretName with key $keyId")
+ SharedSecretStorageError("Missing content for secret $secretName with key $keyId")
object BadKeyFormat : SharedSecretStorageError("Bad Key Format")
object ParsingError : SharedSecretStorageError("parsing Error")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SsssKeyCreationInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SsssKeyCreationInfo.kt
index eeb1b31f9c..7a91a16c8c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SsssKeyCreationInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/securestorage/SsssKeyCreationInfo.kt
@@ -18,7 +18,7 @@ package org.matrix.android.sdk.api.session.securestorage
data class SsssKeyCreationInfo(
val keyId: String = "",
- var content: SecretStorageKeyContent?,
+ val content: SecretStorageKeyContent?,
val recoveryKey: String = "",
val keySpec: SsssKeySpec
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt
index f4460b7659..6d82b3f7df 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt
@@ -68,7 +68,7 @@ interface SpaceService {
suggestedOnly: Boolean? = null,
limit: Int? = null,
from: String? = null,
- // when paginating, pass back the m.space.child state events
+ // when paginating, pass back the m.space.child state events
knownStateList: List? = null): SpaceHierarchyData
/**
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/threads/ThreadDetails.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/threads/ThreadDetails.kt
index d6937d5b26..c8fe1c85ea 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/threads/ThreadDetails.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/threads/ThreadDetails.kt
@@ -29,7 +29,7 @@ data class ThreadDetails(
val threadSummarySenderInfo: SenderInfo? = null,
val threadSummaryLatestEvent: Event? = null,
val lastMessageTimestamp: Long? = null,
- var threadNotificationState: ThreadNotificationState = ThreadNotificationState.NO_NEW_MESSAGE,
+ val threadNotificationState: ThreadNotificationState = ThreadNotificationState.NO_NEW_MESSAGE,
val isThread: Boolean = false,
val lastRootThreadEdition: String? = null
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
index cd4fb216d3..063abdb5a0 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt
@@ -75,11 +75,14 @@ interface UserService {
/**
* Ignore users
+ * Note: once done, for the change to take effect, you have to request an initial sync.
+ * This may be improved in the future
*/
suspend fun ignoreUserIds(userIds: List)
/**
* Un-ignore some users
+ * Note: once done, for the change to take effect, you have to request an initial sync.
*/
suspend fun unIgnoreUserIds(userIds: List)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/AuthAPI.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/AuthAPI.kt
index 554e21ce55..ebad859b05 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/AuthAPI.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/AuthAPI.kt
@@ -26,6 +26,7 @@ import org.matrix.android.sdk.internal.auth.data.WebClientConfig
import org.matrix.android.sdk.internal.auth.login.ResetPasswordMailConfirmed
import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistrationParams
import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistrationResponse
+import org.matrix.android.sdk.internal.auth.registration.RegistrationCustomParams
import org.matrix.android.sdk.internal.auth.registration.RegistrationParams
import org.matrix.android.sdk.internal.auth.registration.SuccessResult
import org.matrix.android.sdk.internal.auth.registration.ValidationCodeBody
@@ -68,6 +69,14 @@ internal interface AuthAPI {
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "register")
suspend fun register(@Body registrationParams: RegistrationParams): Credentials
+ /**
+ * Register to the homeserver, or get error 401 with a RegistrationFlowResponse object if registration is incomplete
+ * method to perform other custom stages
+ * Ref: https://matrix.org/docs/spec/client_server/latest#account-registration-and-management
+ */
+ @POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "register")
+ suspend fun registerCustom(@Body registrationCustomParams: RegistrationCustomParams): Credentials
+
/**
* Checks to see if a username is available, and valid, for the server.
*/
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt
index 4a156e74cd..590b333e90 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/DefaultRegistrationWizard.kt
@@ -17,6 +17,7 @@
package org.matrix.android.sdk.internal.auth.registration
import kotlinx.coroutines.delay
+import org.matrix.android.sdk.api.auth.data.Credentials
import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
import org.matrix.android.sdk.api.auth.registration.RegistrationAvailability
@@ -25,6 +26,7 @@ import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
import org.matrix.android.sdk.api.auth.registration.toFlowResult
import org.matrix.android.sdk.api.failure.Failure
import org.matrix.android.sdk.api.failure.Failure.RegistrationFlowError
+import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.internal.auth.AuthAPI
import org.matrix.android.sdk.internal.auth.PendingSessionStore
import org.matrix.android.sdk.internal.auth.SessionCreator
@@ -45,6 +47,7 @@ internal class DefaultRegistrationWizard(
private val registerAvailableTask: RegisterAvailableTask = DefaultRegisterAvailableTask(authAPI)
private val registerAddThreePidTask: RegisterAddThreePidTask = DefaultRegisterAddThreePidTask(authAPI)
private val validateCodeTask: ValidateCodeTask = DefaultValidateCodeTask(authAPI)
+ private val registerCustomTask: RegisterCustomTask = DefaultRegisterCustomTask(authAPI)
override val currentThreePid: String?
get() {
@@ -187,22 +190,51 @@ internal class DefaultRegistrationWizard(
return performRegistrationRequest(params)
}
- private suspend fun performRegistrationRequest(registrationParams: RegistrationParams,
- delayMillis: Long = 0): RegistrationResult {
+ override suspend fun registrationCustom(
+ authParams: JsonDict
+ ): RegistrationResult {
+ val safeSession = pendingSessionData.currentSession
+ ?: throw IllegalStateException("developer error, call createAccount() method first")
+
+ val mutableParams = authParams.toMutableMap()
+ mutableParams["session"] = safeSession
+
+ val params = RegistrationCustomParams(auth = mutableParams)
+ return performRegistrationOtherRequest(params)
+ }
+
+ private suspend fun performRegistrationRequest(
+ registrationParams: RegistrationParams,
+ delayMillis: Long = 0
+ ): RegistrationResult {
delay(delayMillis)
+ return register { registerTask.execute(RegisterTask.Params(registrationParams)) }
+ }
+
+ private suspend fun performRegistrationOtherRequest(
+ registrationCustomParams: RegistrationCustomParams
+ ): RegistrationResult {
+ return register { registerCustomTask.execute(RegisterCustomTask.Params(registrationCustomParams)) }
+ }
+
+ private suspend fun register(
+ execute: suspend () -> Credentials
+ ): RegistrationResult {
val credentials = try {
- registerTask.execute(RegisterTask.Params(registrationParams))
+ execute.invoke()
} catch (exception: Throwable) {
if (exception is RegistrationFlowError) {
- pendingSessionData = pendingSessionData.copy(currentSession = exception.registrationFlowResponse.session)
- .also { pendingSessionStore.savePendingSessionData(it) }
+ pendingSessionData =
+ pendingSessionData.copy(currentSession = exception.registrationFlowResponse.session)
+ .also { pendingSessionStore.savePendingSessionData(it) }
return RegistrationResult.FlowResponse(exception.registrationFlowResponse.toFlowResult())
} else {
throw exception
}
}
- val session = sessionCreator.createSession(credentials, pendingSessionData.homeServerConnectionConfig)
+ val session =
+ sessionCreator.createSession(credentials, pendingSessionData.homeServerConnectionConfig)
return RegistrationResult.Success(session)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/RegisterCustomTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/RegisterCustomTask.kt
new file mode 100644
index 0000000000..60af708c38
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/RegisterCustomTask.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021 The Matrix.org Foundation C.I.C.
+ *
+ * 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 org.matrix.android.sdk.internal.auth.registration
+
+import org.matrix.android.sdk.api.auth.data.Credentials
+import org.matrix.android.sdk.api.failure.Failure
+import org.matrix.android.sdk.api.failure.toRegistrationFlowResponse
+import org.matrix.android.sdk.internal.auth.AuthAPI
+import org.matrix.android.sdk.internal.network.executeRequest
+import org.matrix.android.sdk.internal.task.Task
+
+internal interface RegisterCustomTask : Task {
+ data class Params(
+ val registrationCustomParams: RegistrationCustomParams
+ )
+}
+
+internal class DefaultRegisterCustomTask(
+ private val authAPI: AuthAPI
+) : RegisterCustomTask {
+
+ override suspend fun execute(params: RegisterCustomTask.Params): Credentials {
+ try {
+ return executeRequest(null) {
+ authAPI.registerCustom(params.registrationCustomParams)
+ }
+ } catch (throwable: Throwable) {
+ throw throwable.toRegistrationFlowResponse()
+ ?.let { Failure.RegistrationFlowError(it) }
+ ?: throwable
+ }
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/livelocation/BeaconInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/RegistrationCustomParams.kt
similarity index 56%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/livelocation/BeaconInfo.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/RegistrationCustomParams.kt
index 873edc0f1f..45adac6c26 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/livelocation/BeaconInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/registration/RegistrationCustomParams.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2022 The Matrix.org Foundation C.I.C.
+ * Copyright 2021 The Matrix.org Foundation C.I.C.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,20 +14,18 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api.session.room.model.livelocation
+package org.matrix.android.sdk.internal.auth.registration
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.util.JsonDict
+/**
+ * Class to pass parameters to the custom registration types for /register.
+ */
@JsonClass(generateAdapter = true)
-data class BeaconInfo(
- @Json(name = "description") val description: String? = null,
- /**
- * Beacon should be considered as inactive after this timeout as milliseconds.
- */
- @Json(name = "timeout") val timeout: Long? = null,
- /**
- * Should be set true to start sharing beacon.
- */
- @Json(name = "live") val isLive: Boolean? = null
+internal data class RegistrationCustomParams(
+ // authentication parameters
+ @Json(name = "auth")
+ val auth: JsonDict? = null,
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CancelGossipRequestWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CancelGossipRequestWorker.kt
index 98950374ed..4380e31bff 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CancelGossipRequestWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CancelGossipRequestWorker.kt
@@ -37,7 +37,7 @@ import org.matrix.android.sdk.internal.worker.SessionWorkerParams
import javax.inject.Inject
internal class CancelGossipRequestWorker(context: Context, params: WorkerParameters, sessionManager: SessionManager) :
- SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
+ SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
@JsonClass(generateAdapter = true)
internal data class Params(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoSessionInfoProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoSessionInfoProvider.kt
index 2a58d731e5..73dfc468d9 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoSessionInfoProvider.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/CryptoSessionInfoProvider.kt
@@ -48,7 +48,7 @@ internal class CryptoSessionInfoProvider @Inject constructor(
/**
* @param allActive if true return joined as well as invited, if false, only joined
*/
- fun getRoomUserIds(roomId: String, allActive: Boolean): List {
+ fun getRoomUserIds(roomId: String, allActive: Boolean): List {
var userIds: List = emptyList()
monarchy.doWithRealm { realm ->
userIds = if (allActive) {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/InboundGroupSessionStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/InboundGroupSessionStore.kt
index a78444dff9..28ddf291b2 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/InboundGroupSessionStore.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/InboundGroupSessionStore.kt
@@ -75,15 +75,15 @@ internal class InboundGroupSessionStore @Inject constructor(
@Synchronized
fun getInboundGroupSession(sessionId: String, senderKey: String): InboundGroupSessionHolder? {
- val known = sessionCache[CacheKey(sessionId, senderKey)]
- Timber.tag(loggerTag.value).v("## Inbound: getInboundGroupSession $sessionId in cache ${known != null}")
- return known
- ?: store.getInboundGroupSession(sessionId, senderKey)?.also {
- Timber.tag(loggerTag.value).v("## Inbound: getInboundGroupSession cache populate ${it.roomId}")
- sessionCache.put(CacheKey(sessionId, senderKey), InboundGroupSessionHolder(it))
- }?.let {
- InboundGroupSessionHolder(it)
- }
+ val known = sessionCache[CacheKey(sessionId, senderKey)]
+ Timber.tag(loggerTag.value).v("## Inbound: getInboundGroupSession $sessionId in cache ${known != null}")
+ return known
+ ?: store.getInboundGroupSession(sessionId, senderKey)?.also {
+ Timber.tag(loggerTag.value).v("## Inbound: getInboundGroupSession cache populate ${it.roomId}")
+ sessionCache.put(CacheKey(sessionId, senderKey), InboundGroupSessionHolder(it))
+ }?.let {
+ InboundGroupSessionHolder(it)
+ }
}
@Synchronized
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/IncomingGossipingRequestManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/IncomingGossipingRequestManager.kt
index 3a409cf3fd..b907b57f82 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/IncomingGossipingRequestManager.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/IncomingGossipingRequestManager.kt
@@ -116,7 +116,7 @@ internal class IncomingGossipingRequestManager @Inject constructor(
Timber.i("## CRYPTO | GOSSIP onGossipingRequestEvent received type ${event.type} from user:${event.senderId}, content:$roomKeyShare")
// val ageLocalTs = event.unsignedData?.age?.let { System.currentTimeMillis() - it }
when (roomKeyShare?.action) {
- GossipingToDeviceObject.ACTION_SHARE_REQUEST -> {
+ GossipingToDeviceObject.ACTION_SHARE_REQUEST -> {
if (event.getClearType() == EventType.REQUEST_SECRET) {
IncomingSecretShareRequest.fromEvent(event)?.let {
if (event.senderId == credentials.userId && it.deviceId == credentials.deviceId) {
@@ -346,7 +346,7 @@ internal class IncomingGossipingRequestManager @Inject constructor(
val isDeviceLocallyVerified = cryptoStore.getUserDevice(userId, deviceId)?.trustLevel?.isLocallyVerified()
when (secretName) {
- MASTER_KEY_SSSS_NAME -> cryptoStore.getCrossSigningPrivateKeys()?.master
+ MASTER_KEY_SSSS_NAME -> cryptoStore.getCrossSigningPrivateKeys()?.master
SELF_SIGNING_KEY_SSSS_NAME -> cryptoStore.getCrossSigningPrivateKeys()?.selfSigned
USER_SIGNING_KEY_SSSS_NAME -> cryptoStore.getCrossSigningPrivateKeys()?.user
KEYBACKUP_SECRET_SSSS_NAME -> cryptoStore.getKeyBackupRecoveryKeyInfo()?.recoveryKey
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/OutgoingGossipingRequest.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/OutgoingGossipingRequest.kt
index b16b46cf98..2438e01102 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/OutgoingGossipingRequest.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/OutgoingGossipingRequest.kt
@@ -19,9 +19,9 @@ package org.matrix.android.sdk.internal.crypto
import org.matrix.android.sdk.api.session.crypto.model.OutgoingGossipingRequestState
internal interface OutgoingGossipingRequest {
- var recipients: Map>
- var requestId: String
- var state: OutgoingGossipingRequestState
+ val recipients: Map>
+ val requestId: String
+ val state: OutgoingGossipingRequestState
// transaction id for the cancellation, if any
// var cancellationTxnId: String?
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/SendGossipRequestWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/SendGossipRequestWorker.kt
index dbdea97411..69b405aedc 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/SendGossipRequestWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/SendGossipRequestWorker.kt
@@ -41,7 +41,7 @@ import timber.log.Timber
import javax.inject.Inject
internal class SendGossipRequestWorker(context: Context, params: WorkerParameters, sessionManager: SessionManager) :
- SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
+ SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
@JsonClass(generateAdapter = true)
internal data class Params(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/olm/MXOlmEncryption.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/olm/MXOlmEncryption.kt
index 7fdfd5a287..c842c54041 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/olm/MXOlmEncryption.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/algorithms/olm/MXOlmEncryption.kt
@@ -33,7 +33,7 @@ internal class MXOlmEncryption(
private val messageEncrypter: MessageEncrypter,
private val deviceListManager: DeviceListManager,
private val ensureOlmSessionsForUsersAction: EnsureOlmSessionsForUsersAction) :
- IMXEncrypting {
+ IMXEncrypting {
override suspend fun encryptEventContent(eventContent: Content, eventType: String, userIds: List): Content {
// pick the list of recipients based on the membership list.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/EncryptionResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/EncryptionResult.kt
index dbbc10a92c..80090cf4a8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/EncryptionResult.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/attachments/EncryptionResult.kt
@@ -20,9 +20,8 @@ import org.matrix.android.sdk.api.session.crypto.model.EncryptedFileInfo
/**
* Define the result of an encryption file
- * TODO var should be val
*/
internal data class EncryptionResult(
- var encryptedFileInfo: EncryptedFileInfo,
- var encryptedByteArray: ByteArray
+ val encryptedFileInfo: EncryptedFileInfo,
+ val encryptedByteArray: ByteArray
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
index f1929dea53..e63a6dc791 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/keysbackup/DefaultKeysBackupService.kt
@@ -409,20 +409,22 @@ internal class DefaultKeysBackupService @Inject constructor(
*/
@WorkerThread
private fun getKeysBackupTrustBg(keysBackupVersion: KeysVersionResult): KeysBackupVersionTrust {
- val keysBackupVersionTrust = KeysBackupVersionTrust()
val authData = keysBackupVersion.getAuthDataAsMegolmBackupAuthData()
if (authData == null || authData.publicKey.isEmpty() || authData.signatures.isNullOrEmpty()) {
Timber.v("getKeysBackupTrust: Key backup is absent or missing required data")
- return keysBackupVersionTrust
+ return KeysBackupVersionTrust(usable = false)
}
val mySigs = authData.signatures[userId]
if (mySigs.isNullOrEmpty()) {
Timber.v("getKeysBackupTrust: Ignoring key backup because it lacks any signatures from this user")
- return keysBackupVersionTrust
+ return KeysBackupVersionTrust(usable = false)
}
+ var keysBackupVersionTrustIsUsable = false
+ val keysBackupVersionTrustSignatures = mutableListOf()
+
for ((keyId, mySignature) in mySigs) {
// XXX: is this how we're supposed to get the device id?
var deviceId: String? = null
@@ -449,19 +451,23 @@ internal class DefaultKeysBackupService @Inject constructor(
}
if (isSignatureValid && device.isVerified) {
- keysBackupVersionTrust.usable = true
+ keysBackupVersionTrustIsUsable = true
}
}
- val signature = KeysBackupVersionTrustSignature()
- signature.device = device
- signature.valid = isSignatureValid
- signature.deviceId = deviceId
- keysBackupVersionTrust.signatures.add(signature)
+ val signature = KeysBackupVersionTrustSignature(
+ deviceId = deviceId,
+ device = device,
+ valid = isSignatureValid,
+ )
+ keysBackupVersionTrustSignatures.add(signature)
}
}
- return keysBackupVersionTrust
+ return KeysBackupVersionTrust(
+ usable = keysBackupVersionTrustIsUsable,
+ signatures = keysBackupVersionTrustSignatures
+ )
}
override fun trustKeysBackupVersion(keysBackupVersion: KeysVersionResult,
@@ -1103,7 +1109,7 @@ internal class DefaultKeysBackupService @Inject constructor(
privateKeySalt: String,
privateKeyIterations: Int,
progressListener: ProgressListener): ByteArray {
- return deriveKey(passphrase, privateKeySalt, privateKeyIterations, progressListener)
+ return deriveKey(passphrase, privateKeySalt, privateKeyIterations, progressListener)
}
/**
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/secrets/DefaultSharedSecretStorageService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/secrets/DefaultSharedSecretStorageService.kt
index 19e66635c7..972c03e92a 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/secrets/DefaultSharedSecretStorageService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/secrets/DefaultSharedSecretStorageService.kt
@@ -174,7 +174,7 @@ internal class DefaultSharedSecretStorageService @Inject constructor(
throw SharedSecretStorageError.UnknownAlgorithm(key.keyInfo.content.algorithm ?: "")
}
}
- is KeyInfoResult.Error -> throw key.error
+ is KeyInfoResult.Error -> throw key.error
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/CryptoRoomEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/CryptoRoomEntity.kt
index 6167314b5a..114a596964 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/CryptoRoomEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/CryptoRoomEntity.kt
@@ -31,8 +31,8 @@ internal open class CryptoRoomEntity(
// a security to ensure that a room will never revert to not encrypted
// even if a new state event with empty encryption, or state is reset somehow
var wasEncryptedOnce: Boolean? = false
- ) :
- RealmObject() {
+) :
+ RealmObject() {
companion object
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/OlmInboundGroupSessionEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/OlmInboundGroupSessionEntity.kt
index f330e8822a..83671b28d9 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/OlmInboundGroupSessionEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/OlmInboundGroupSessionEntity.kt
@@ -34,7 +34,7 @@ internal open class OlmInboundGroupSessionEntity(
var olmInboundGroupSessionData: String? = null,
// Indicate if the key has been backed up to the homeserver
var backedUp: Boolean = false) :
- RealmObject() {
+ RealmObject() {
fun getInboundGroupSession(): OlmInboundGroupSessionWrapper2? {
return try {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/OlmSessionEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/OlmSessionEntity.kt
index 0b69311c57..1a637d76c4 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/OlmSessionEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/store/db/model/OlmSessionEntity.kt
@@ -30,7 +30,7 @@ internal open class OlmSessionEntity(@PrimaryKey var primaryKey: String = "",
var deviceKey: String? = null,
var olmSessionData: String? = null,
var lastReceivedMessageTs: Long = 0) :
- RealmObject() {
+ RealmObject() {
fun getOlmSession(): OlmSession? {
return deserializeFromRealm(olmSessionData)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/SendVerificationMessageWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/SendVerificationMessageWorker.kt
index a763c05e07..0a175ae3ca 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/SendVerificationMessageWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/SendVerificationMessageWorker.kt
@@ -35,7 +35,7 @@ import javax.inject.Inject
* Possible next worker : None
*/
internal class SendVerificationMessageWorker(context: Context, params: WorkerParameters, sessionManager: SessionManager) :
- SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
+ SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
@JsonClass(generateAdapter = true)
internal data class Params(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessage.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessage.kt
index bd1186908c..49235c5744 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessage.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/verification/VerificationTransportRoomMessage.kt
@@ -296,13 +296,13 @@ internal class VerificationTransportRoomMessage(
messageAuthenticationCode: String,
shortAuthenticationStrings: List): VerificationInfoAccept =
MessageVerificationAcceptContent.create(
- tid,
- keyAgreementProtocol,
- hash,
- commitment,
- messageAuthenticationCode,
- shortAuthenticationStrings
- )
+ tid,
+ keyAgreementProtocol,
+ hash,
+ commitment,
+ messageAuthenticationCode,
+ shortAuthenticationStrings
+ )
override fun createKey(tid: String, pubKey: String): VerificationInfoKey = MessageVerificationKeyContent.create(tid, pubKey)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/EventInsertLiveObserver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/EventInsertLiveObserver.kt
index 115025cc7d..b057b4c319 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/EventInsertLiveObserver.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/EventInsertLiveObserver.kt
@@ -32,7 +32,7 @@ import javax.inject.Inject
internal class EventInsertLiveObserver @Inject constructor(@SessionDatabase realmConfiguration: RealmConfiguration,
private val processors: Set<@JvmSuppressWildcards EventInsertLiveProcessor>) :
- RealmLiveEntityObserver(realmConfiguration) {
+ RealmLiveEntityObserver(realmConfiguration) {
override val query = Monarchy.Query {
it.where(EventInsertEntity::class.java).equalTo(EventInsertEntityFields.CAN_BE_PROCESSED, true)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmLiveEntityObserver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmLiveEntityObserver.kt
index 50eb086f9a..f2f88e216b 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmLiveEntityObserver.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmLiveEntityObserver.kt
@@ -35,7 +35,7 @@ import java.util.concurrent.atomic.AtomicReference
internal interface LiveEntityObserver : SessionLifecycleObserver
internal abstract class RealmLiveEntityObserver(protected val realmConfiguration: RealmConfiguration) :
- LiveEntityObserver, RealmChangeListener> {
+ LiveEntityObserver, RealmChangeListener> {
private companion object {
val BACKGROUND_HANDLER = createBackgroundHandler("LIVE_ENTITY_BACKGROUND")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionProvider.kt
index 8c62c345d0..e5b5915590 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionProvider.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionProvider.kt
@@ -33,7 +33,7 @@ import kotlin.concurrent.getOrSet
*/
@SessionScope
internal class RealmSessionProvider @Inject constructor(@SessionDatabase private val monarchy: Monarchy) :
- SessionLifecycleObserver {
+ SessionLifecycleObserver {
private val realmThreadLocal = ThreadLocal()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt
index ea508731b1..8a5d08cd30 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/helper/TimelineEventEntityHelper.kt
@@ -19,9 +19,10 @@ package org.matrix.android.sdk.internal.database.helper
import io.realm.Realm
import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
+import org.matrix.android.sdk.internal.database.query.where
internal fun TimelineEventEntity.Companion.nextId(realm: Realm): Long {
- val currentIdNum = realm.where(TimelineEventEntity::class.java).max(TimelineEventEntityFields.LOCAL_ID)
+ val currentIdNum = TimelineEventEntity.where(realm).max(TimelineEventEntityFields.LOCAL_ID)
return if (currentIdNum == null) {
1
} else {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/PushConditionMapper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/PushConditionMapper.kt
index 5c0a2ba902..6521bf62d9 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/PushConditionMapper.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/PushConditionMapper.kt
@@ -16,7 +16,7 @@
package org.matrix.android.sdk.internal.database.mapper
-import org.matrix.android.sdk.api.pushrules.rest.PushCondition
+import org.matrix.android.sdk.api.session.pushrules.rest.PushCondition
import org.matrix.android.sdk.internal.database.model.PushConditionEntity
internal object PushConditionMapper {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/PushRulesMapper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/PushRulesMapper.kt
index 12eff8efa1..0b07754126 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/PushRulesMapper.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/mapper/PushRulesMapper.kt
@@ -17,9 +17,9 @@ package org.matrix.android.sdk.internal.database.mapper
import com.squareup.moshi.Types
import io.realm.RealmList
-import org.matrix.android.sdk.api.pushrules.Kind
-import org.matrix.android.sdk.api.pushrules.rest.PushCondition
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.Kind
+import org.matrix.android.sdk.api.session.pushrules.rest.PushCondition
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
import org.matrix.android.sdk.internal.database.model.PushRuleEntity
import org.matrix.android.sdk.internal.di.MoshiProvider
import timber.log.Timber
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo019.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo019.kt
index d63ef62889..754a66bb4b 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo019.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/migration/MigrateSessionTo019.kt
@@ -22,7 +22,7 @@ import org.matrix.android.sdk.internal.util.Normalizer
import org.matrix.android.sdk.internal.util.database.RealmMigrator
internal class MigrateSessionTo019(realm: DynamicRealm,
- private val normalizer: Normalizer) : RealmMigrator(realm, 19) {
+ private val normalizer: Normalizer) : RealmMigrator(realm, 19) {
override fun doMigrate(realm: DynamicRealm) {
realm.schema.get("RoomSummaryEntity")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt
index 88eb821aa9..822bc1bd8f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/ChunkEntity.kt
@@ -24,19 +24,20 @@ import io.realm.annotations.LinkingObjects
import org.matrix.android.sdk.internal.extensions.assertIsManaged
import org.matrix.android.sdk.internal.extensions.clearWith
-internal open class ChunkEntity(@Index var prevToken: String? = null,
+internal open class ChunkEntity(
+ @Index var prevToken: String? = null,
// Because of gaps we can have several chunks with nextToken == null
- @Index var nextToken: String? = null,
- var prevChunk: ChunkEntity? = null,
- var nextChunk: ChunkEntity? = null,
- var stateEvents: RealmList = RealmList(),
- var timelineEvents: RealmList = RealmList(),
+ @Index var nextToken: String? = null,
+ var prevChunk: ChunkEntity? = null,
+ var nextChunk: ChunkEntity? = null,
+ var stateEvents: RealmList = RealmList(),
+ var timelineEvents: RealmList = RealmList(),
// Only one chunk will have isLastForward == true
- @Index var isLastForward: Boolean = false,
- @Index var isLastBackward: Boolean = false,
+ @Index var isLastForward: Boolean = false,
+ @Index var isLastBackward: Boolean = false,
// Threads
- @Index var rootThreadEventId: String? = null,
- @Index var isLastForwardThread: Boolean = false,
+ @Index var rootThreadEventId: String? = null,
+ @Index var isLastForwardThread: Boolean = false,
) : RealmObject() {
fun identifier() = "${prevToken}_$nextToken"
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/GroupEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/GroupEntity.kt
index 527f782359..0120bb91d3 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/GroupEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/GroupEntity.kt
@@ -25,7 +25,7 @@ import org.matrix.android.sdk.api.session.room.model.Membership
* Then GetGroupDataTask is called regularly to fetch group information from the homeserver.
*/
internal open class GroupEntity(@PrimaryKey var groupId: String = "") :
- RealmObject() {
+ RealmObject() {
private var membershipStr: String = Membership.NONE.name
var membership: Membership
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRulesEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRulesEntity.kt
index 4125d90891..62bf40c1d2 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRulesEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/PushRulesEntity.kt
@@ -17,7 +17,7 @@ package org.matrix.android.sdk.internal.database.model
import io.realm.RealmList
import io.realm.RealmObject
-import org.matrix.android.sdk.api.pushrules.RuleKind
+import org.matrix.android.sdk.api.session.pushrules.RuleKind
import org.matrix.android.sdk.internal.extensions.clearWith
internal open class PushRulesEntity(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/RoomEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/RoomEntity.kt
index 4a6f6a7bf8..d8e6b8af0f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/RoomEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/RoomEntity.kt
@@ -48,8 +48,10 @@ internal open class RoomEntity(@PrimaryKey var roomId: String = "",
set(value) {
membersLoadStatusStr = value.name
}
+
companion object
}
+
internal fun RoomEntity.removeThreadSummaryIfNeeded(eventId: String) {
assertIsManaged()
threadSummaries.findRootOrLatest(eventId)?.let {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt
index aacd6570bc..477c04fe51 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/model/TimelineEventEntity.kt
@@ -32,8 +32,8 @@ internal open class TimelineEventEntity(var localId: Long = 0,
var isUniqueDisplayName: Boolean = false,
var senderAvatar: String? = null,
var senderMembershipEventId: String? = null,
- // ownedByThreadChunk indicates that the current TimelineEventEntity belongs
- // to a thread chunk and is a temporarily event.
+ // ownedByThreadChunk indicates that the current TimelineEventEntity belongs
+ // to a thread chunk and is a temporarily event.
var ownedByThreadChunk: Boolean = false,
var readReceipts: ReadReceiptsSummaryEntity? = null
) : RealmObject() {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt
index a33ba82f7a..9350102137 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ChunkEntityQueries.kt
@@ -56,18 +56,21 @@ internal fun ChunkEntity.Companion.findLastForwardChunkOfRoom(realm: Realm, room
.equalTo(ChunkEntityFields.IS_LAST_FORWARD, true)
.findFirst()
}
+
internal fun ChunkEntity.Companion.findLastForwardChunkOfThread(realm: Realm, roomId: String, rootThreadEventId: String): ChunkEntity? {
return where(realm, roomId)
.equalTo(ChunkEntityFields.ROOT_THREAD_EVENT_ID, rootThreadEventId)
.equalTo(ChunkEntityFields.IS_LAST_FORWARD_THREAD, true)
.findFirst()
}
+
internal fun ChunkEntity.Companion.findEventInThreadChunk(realm: Realm, roomId: String, event: String): ChunkEntity? {
return where(realm, roomId)
.`in`(ChunkEntityFields.TIMELINE_EVENTS.EVENT_ID, arrayListOf(event).toTypedArray())
.equalTo(ChunkEntityFields.IS_LAST_FORWARD_THREAD, true)
.findFirst()
}
+
internal fun ChunkEntity.Companion.findAllIncludingEvents(realm: Realm, eventIds: List): RealmResults {
return realm.where()
.`in`(ChunkEntityFields.TIMELINE_EVENTS.EVENT_ID, eventIds.toTypedArray())
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt
index 1f6b210252..3cea19a690 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/PushersQueries.kt
@@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.database.query
import io.realm.Realm
import io.realm.RealmQuery
import io.realm.kotlin.where
-import org.matrix.android.sdk.api.pushrules.RuleKind
+import org.matrix.android.sdk.api.session.pushrules.RuleKind
import org.matrix.android.sdk.internal.database.model.PushRuleEntity
import org.matrix.android.sdk.internal.database.model.PushRuleEntityFields
import org.matrix.android.sdk.internal.database.model.PushRulesEntity
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ThreadSummaryEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ThreadSummaryEntityQueries.kt
index 517d43d7cf..eab2740433 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ThreadSummaryEntityQueries.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/ThreadSummaryEntityQueries.kt
@@ -39,9 +39,11 @@ internal fun ThreadSummaryEntity.Companion.getOrCreate(realm: Realm, roomId: Str
this.rootThreadEventId = rootThreadEventId
}
}
+
internal fun ThreadSummaryEntity.Companion.getOrNull(realm: Realm, roomId: String, rootThreadEventId: String): ThreadSummaryEntity? {
return where(realm, roomId, rootThreadEventId).findFirst()
}
+
internal fun RealmList.find(rootThreadEventId: String): ThreadSummaryEntity? {
return this.where()
.equalTo(ThreadSummaryEntityFields.ROOT_THREAD_EVENT_ID, rootThreadEventId)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt
index 81d5ac835f..215ab34f95 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/query/TimelineEventEntityQueries.kt
@@ -29,26 +29,35 @@ import org.matrix.android.sdk.internal.database.model.RoomEntity
import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
-internal fun TimelineEventEntity.Companion.where(realm: Realm, roomId: String, eventId: String): RealmQuery {
- return realm.where()
+internal fun TimelineEventEntity.Companion.where(realm: Realm): RealmQuery {
+ return realm.where()
+}
+
+internal fun TimelineEventEntity.Companion.where(realm: Realm,
+ roomId: String,
+ eventId: String): RealmQuery {
+ return where(realm)
.equalTo(TimelineEventEntityFields.ROOM_ID, roomId)
.equalTo(TimelineEventEntityFields.EVENT_ID, eventId)
}
-internal fun TimelineEventEntity.Companion.where(realm: Realm, roomId: String, eventIds: List): RealmQuery {
- return realm.where()
+internal fun TimelineEventEntity.Companion.where(realm: Realm,
+ roomId: String,
+ eventIds: List): RealmQuery {
+ return where(realm)
.equalTo(TimelineEventEntityFields.ROOM_ID, roomId)
.`in`(TimelineEventEntityFields.EVENT_ID, eventIds.toTypedArray())
}
internal fun TimelineEventEntity.Companion.whereRoomId(realm: Realm,
roomId: String): RealmQuery {
- return realm.where()
+ return where(realm)
.equalTo(TimelineEventEntityFields.ROOM_ID, roomId)
}
-internal fun TimelineEventEntity.Companion.findWithSenderMembershipEvent(realm: Realm, senderMembershipEventId: String): List {
- return realm.where()
+internal fun TimelineEventEntity.Companion.findWithSenderMembershipEvent(realm: Realm,
+ senderMembershipEventId: String): List {
+ return where(realm)
.equalTo(TimelineEventEntityFields.SENDER_MEMBERSHIP_EVENT_ID, senderMembershipEventId)
.findAll()
}
@@ -110,12 +119,12 @@ internal fun RealmQuery.filterTypes(filterTypes: List.find(eventId: String): TimelineEventEntity? {
- return this.where()
+ return where()
.equalTo(TimelineEventEntityFields.EVENT_ID, eventId)
.findFirst()
}
@@ -132,3 +141,14 @@ internal fun RealmQuery.filterSendStates(sendStates: List): RealmResults {
+ return where(realm)
+ .`in`(TimelineEventEntityFields.ROOT.SENDER, senderIds.toTypedArray())
+ .isNull(TimelineEventEntityFields.ROOT.STATE_KEY)
+ .findAll()
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConnectivityChecker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConnectivityChecker.kt
index cd7c99b8f9..3d2b2bfbfb 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConnectivityChecker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/NetworkConnectivityChecker.kt
@@ -44,7 +44,7 @@ internal interface NetworkConnectivityChecker {
internal class DefaultNetworkConnectivityChecker @Inject constructor(private val homeServerPinger: HomeServerPinger,
private val backgroundDetectionObserver: BackgroundDetectionObserver,
private val networkCallbackStrategy: NetworkCallbackStrategy) :
- NetworkConnectivityChecker {
+ NetworkConnectivityChecker {
private val hasInternetAccess = AtomicBoolean(true)
private val listeners = Collections.synchronizedSet(LinkedHashSet())
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/RequestExecutor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/RequestExecutor.kt
index 5cd2d88000..71df7c08be 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/RequestExecutor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/RequestExecutor.kt
@@ -15,6 +15,7 @@
*/
package org.matrix.android.sdk.internal.network
+
import org.matrix.android.sdk.internal.network.executeRequest as internalExecuteRequest
internal interface RequestExecutor {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt
index ac097f57ee..9b83cca558 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultFileService.kt
@@ -123,7 +123,7 @@ internal class DefaultFileService @Inject constructor(
val resolvedUrl = contentUrlResolver.resolveForDownload(url, elementToDecrypt) ?: throw IllegalArgumentException("url is null")
val request = when (resolvedUrl) {
- is ContentUrlResolver.ResolvedMethod.GET -> {
+ is ContentUrlResolver.ResolvedMethod.GET -> {
Request.Builder()
.url(resolvedUrl.url)
.header(DOWNLOAD_PROGRESS_INTERCEPTOR_HEADER, url)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt
index 1e533158a7..1c2e2bb266 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt
@@ -26,7 +26,6 @@ import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.auth.data.SessionParams
import org.matrix.android.sdk.api.failure.GlobalError
import org.matrix.android.sdk.api.federation.FederationService
-import org.matrix.android.sdk.api.pushrules.PushRuleService
import org.matrix.android.sdk.api.session.EventStreamService
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.SessionLifecycleObserver
@@ -53,6 +52,7 @@ import org.matrix.android.sdk.api.session.permalinks.PermalinkService
import org.matrix.android.sdk.api.session.presence.PresenceService
import org.matrix.android.sdk.api.session.profile.ProfileService
import org.matrix.android.sdk.api.session.pushers.PushersService
+import org.matrix.android.sdk.api.session.pushrules.PushRuleService
import org.matrix.android.sdk.api.session.room.RoomDirectoryService
import org.matrix.android.sdk.api.session.room.RoomService
import org.matrix.android.sdk.api.session.search.SearchService
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt
index 3f199c5cce..b15a647421 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/call/CallEventProcessor.kt
@@ -30,7 +30,7 @@ private val loggerTag = LoggerTag("CallEventProcessor", LoggerTag.VOIP)
@SessionScope
internal class CallEventProcessor @Inject constructor(private val callSignalingHandler: CallSignalingHandler) :
- EventInsertLiveProcessor {
+ EventInsertLiveProcessor {
private val allowedTypes = listOf(
EventType.CALL_ANSWER,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt
index e9cb423893..f96a019fe2 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/FileUploader.kt
@@ -148,8 +148,8 @@ internal class FileUploader @Inject constructor(
.post(requestBody)
.build()
- return withContext(coroutineDispatchers.io) {
- okHttpClient.newCall(request).awaitResponse().use { response ->
+ return withContext(coroutineDispatchers.io) {
+ okHttpClient.newCall(request).awaitResponse().use { response ->
if (!response.isSuccessful) {
throw response.toFailure(globalErrorReceiver)
} else {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageCompressor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageCompressor.kt
index 01eb52ff22..c5aa6cd5e7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageCompressor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/ImageCompressor.kt
@@ -68,16 +68,16 @@ internal class ImageCompressor @Inject constructor(
val orientation = exifInfo.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
val matrix = Matrix()
when (orientation) {
- ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f)
- ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f)
- ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f)
+ ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f)
+ ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f)
+ ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f)
ExifInterface.ORIENTATION_FLIP_HORIZONTAL -> matrix.preScale(-1f, 1f)
- ExifInterface.ORIENTATION_FLIP_VERTICAL -> matrix.preScale(1f, -1f)
- ExifInterface.ORIENTATION_TRANSPOSE -> {
+ ExifInterface.ORIENTATION_FLIP_VERTICAL -> matrix.preScale(1f, -1f)
+ ExifInterface.ORIENTATION_TRANSPOSE -> {
matrix.preRotate(-90f)
matrix.preScale(-1f, 1f)
}
- ExifInterface.ORIENTATION_TRANSVERSE -> {
+ ExifInterface.ORIENTATION_TRANSVERSE -> {
matrix.preRotate(90f)
matrix.preScale(-1f, 1f)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/DefaultSyncStatusService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/DefaultSyncStatusService.kt
index 4a1e6661b0..c138c1a40e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/DefaultSyncStatusService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/initsync/DefaultSyncStatusService.kt
@@ -24,7 +24,7 @@ import javax.inject.Inject
@SessionScope
internal class DefaultSyncStatusService @Inject constructor() :
- SyncStatusService,
+ SyncStatusService,
ProgressReporter {
private val status = MutableLiveData()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt
index 30b1589169..1b96931c6c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/integrationmanager/IntegrationManager.kt
@@ -59,7 +59,7 @@ internal class IntegrationManager @Inject constructor(matrixConfiguration: Matri
private val updateUserAccountDataTask: UpdateUserAccountDataTask,
private val accountDataDataSource: UserAccountDataDataSource,
private val widgetFactory: WidgetFactory) :
- SessionLifecycleObserver {
+ SessionLifecycleObserver {
private val currentConfigs = ArrayList()
private val lifecycleOwner: LifecycleOwner = LifecycleOwner { lifecycleRegistry }
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/BindThreePidBody.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/BindThreePidBody.kt
index fa45ae9940..4d2a999137 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/BindThreePidBody.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/BindThreePidBody.kt
@@ -30,17 +30,17 @@ internal data class BindThreePidBody(
* Required. The identity server to use. (without "https://")
*/
@Json(name = "id_server")
- var identityServerUrlWithoutProtocol: String,
+ val identityServerUrlWithoutProtocol: String,
/**
* Required. An access token previously registered with the identity server.
*/
@Json(name = "id_access_token")
- var identityServerAccessToken: String,
+ val identityServerAccessToken: String,
/**
* Required. The session identifier given by the identity server.
*/
@Json(name = "sid")
- var sid: String
+ val sid: String
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/AddPushRuleTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/AddPushRuleTask.kt
index b217687168..c46474cf90 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/AddPushRuleTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/AddPushRuleTask.kt
@@ -15,8 +15,8 @@
*/
package org.matrix.android.sdk.internal.session.pushers
-import org.matrix.android.sdk.api.pushrules.RuleKind
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.RuleKind
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.task.Task
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/AddPusherWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/AddPusherWorker.kt
index ce29efaaac..0042558027 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/AddPusherWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/AddPusherWorker.kt
@@ -26,7 +26,7 @@ import org.matrix.android.sdk.internal.worker.SessionWorkerParams
import javax.inject.Inject
internal class AddPusherWorker(context: Context, params: WorkerParameters, sessionManager: SessionManager) :
- SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
+ SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
@JsonClass(generateAdapter = true)
internal data class Params(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultConditionResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultConditionResolver.kt
index 84a05067be..0aa58b7410 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultConditionResolver.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/DefaultConditionResolver.kt
@@ -15,14 +15,14 @@
*/
package org.matrix.android.sdk.internal.session.pushers
-import org.matrix.android.sdk.api.pushrules.ConditionResolver
-import org.matrix.android.sdk.api.pushrules.ContainsDisplayNameCondition
-import org.matrix.android.sdk.api.pushrules.EventMatchCondition
-import org.matrix.android.sdk.api.pushrules.RoomMemberCountCondition
-import org.matrix.android.sdk.api.pushrules.SenderNotificationPermissionCondition
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toModel
+import org.matrix.android.sdk.api.session.pushrules.ConditionResolver
+import org.matrix.android.sdk.api.session.pushrules.ContainsDisplayNameCondition
+import org.matrix.android.sdk.api.session.pushrules.EventMatchCondition
+import org.matrix.android.sdk.api.session.pushrules.RoomMemberCountCondition
+import org.matrix.android.sdk.api.session.pushrules.SenderNotificationPermissionCondition
import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.session.room.RoomGetter
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/GetPushRulesResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/GetPushRulesResponse.kt
similarity index 90%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/GetPushRulesResponse.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/GetPushRulesResponse.kt
index 35b4d77c0e..de03819629 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/GetPushRulesResponse.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/GetPushRulesResponse.kt
@@ -13,10 +13,11 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules.rest
+package org.matrix.android.sdk.internal.session.pushers
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.session.pushrules.rest.RuleSet
/**
* All push rulesets for a user.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/PushRulesApi.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/PushRulesApi.kt
index 994b4860c6..dab6d37317 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/PushRulesApi.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/PushRulesApi.kt
@@ -15,8 +15,7 @@
*/
package org.matrix.android.sdk.internal.session.pushers
-import org.matrix.android.sdk.api.pushrules.rest.GetPushRulesResponse
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
import org.matrix.android.sdk.internal.network.NetworkConstants
import retrofit2.http.Body
import retrofit2.http.DELETE
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/PushersModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/PushersModule.kt
index d53a4eed65..4528c95e69 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/PushersModule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/PushersModule.kt
@@ -19,14 +19,14 @@ package org.matrix.android.sdk.internal.session.pushers
import dagger.Binds
import dagger.Module
import dagger.Provides
-import org.matrix.android.sdk.api.pushrules.ConditionResolver
-import org.matrix.android.sdk.api.pushrules.PushRuleService
import org.matrix.android.sdk.api.session.pushers.PushersService
-import org.matrix.android.sdk.internal.session.notification.DefaultProcessEventForPushTask
-import org.matrix.android.sdk.internal.session.notification.DefaultPushRuleService
-import org.matrix.android.sdk.internal.session.notification.ProcessEventForPushTask
+import org.matrix.android.sdk.api.session.pushrules.ConditionResolver
+import org.matrix.android.sdk.api.session.pushrules.PushRuleService
import org.matrix.android.sdk.internal.session.pushers.gateway.DefaultPushGatewayNotifyTask
import org.matrix.android.sdk.internal.session.pushers.gateway.PushGatewayNotifyTask
+import org.matrix.android.sdk.internal.session.pushrules.DefaultProcessEventForPushTask
+import org.matrix.android.sdk.internal.session.pushrules.DefaultPushRuleService
+import org.matrix.android.sdk.internal.session.pushrules.ProcessEventForPushTask
import org.matrix.android.sdk.internal.session.room.notification.DefaultSetRoomNotificationStateTask
import org.matrix.android.sdk.internal.session.room.notification.SetRoomNotificationStateTask
import retrofit2.Retrofit
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/RemovePushRuleTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/RemovePushRuleTask.kt
index bae893608b..9b0bf7934b 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/RemovePushRuleTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/RemovePushRuleTask.kt
@@ -15,7 +15,7 @@
*/
package org.matrix.android.sdk.internal.session.pushers
-import org.matrix.android.sdk.api.pushrules.RuleKind
+import org.matrix.android.sdk.api.session.pushrules.RuleKind
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.task.Task
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/SavePushRulesTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/SavePushRulesTask.kt
index 6a4b891ecf..ff685e9281 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/SavePushRulesTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/SavePushRulesTask.kt
@@ -16,9 +16,8 @@
package org.matrix.android.sdk.internal.session.pushers
import com.zhuinden.monarchy.Monarchy
-import org.matrix.android.sdk.api.pushrules.RuleScope
-import org.matrix.android.sdk.api.pushrules.RuleSetKey
-import org.matrix.android.sdk.api.pushrules.rest.GetPushRulesResponse
+import org.matrix.android.sdk.api.session.pushrules.RuleScope
+import org.matrix.android.sdk.api.session.pushrules.RuleSetKey
import org.matrix.android.sdk.internal.database.mapper.PushRulesMapper
import org.matrix.android.sdk.internal.database.model.PushRulesEntity
import org.matrix.android.sdk.internal.database.model.deleteOnCascade
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/UpdatePushRuleActionsTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/UpdatePushRuleActionsTask.kt
index 33589dc55b..454b9cdd80 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/UpdatePushRuleActionsTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/UpdatePushRuleActionsTask.kt
@@ -15,9 +15,9 @@
*/
package org.matrix.android.sdk.internal.session.pushers
-import org.matrix.android.sdk.api.pushrules.Action
-import org.matrix.android.sdk.api.pushrules.RuleKind
-import org.matrix.android.sdk.api.pushrules.toJson
+import org.matrix.android.sdk.api.session.pushrules.Action
+import org.matrix.android.sdk.api.session.pushrules.RuleKind
+import org.matrix.android.sdk.api.session.pushrules.toJson
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.task.Task
@@ -38,18 +38,18 @@ internal class DefaultUpdatePushRuleActionsTask @Inject constructor(
) : UpdatePushRuleActionsTask {
override suspend fun execute(params: UpdatePushRuleActionsTask.Params) {
+ executeRequest(globalErrorReceiver) {
+ pushRulesApi.updateEnableRuleStatus(
+ params.kind.value,
+ params.ruleId,
+ EnabledBody(params.enable)
+ )
+ }
+ if (params.actions != null) {
+ val body = mapOf("actions" to params.actions.toJson())
executeRequest(globalErrorReceiver) {
- pushRulesApi.updateEnableRuleStatus(
- params.kind.value,
- params.ruleId,
- EnabledBody(params.enable)
- )
- }
- if (params.actions != null) {
- val body = mapOf("actions" to params.actions.toJson())
- executeRequest(globalErrorReceiver) {
- pushRulesApi.updateRuleActions(params.kind.value, params.ruleId, body)
- }
+ pushRulesApi.updateRuleActions(params.kind.value, params.ruleId, body)
}
+ }
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/UpdatePushRuleEnableStatusTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/UpdatePushRuleEnableStatusTask.kt
index 3fe1614678..815661a1ce 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/UpdatePushRuleEnableStatusTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushers/UpdatePushRuleEnableStatusTask.kt
@@ -15,8 +15,8 @@
*/
package org.matrix.android.sdk.internal.session.pushers
-import org.matrix.android.sdk.api.pushrules.RuleKind
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.RuleKind
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.task.Task
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/DefaultPushRuleService.kt
similarity index 90%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/DefaultPushRuleService.kt
index cdc7350f8b..ace23f1fe5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/DefaultPushRuleService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/DefaultPushRuleService.kt
@@ -13,23 +13,23 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.matrix.android.sdk.internal.session.notification
+package org.matrix.android.sdk.internal.session.pushrules
import androidx.lifecycle.LiveData
import androidx.lifecycle.Transformations
import com.zhuinden.monarchy.Monarchy
-import org.matrix.android.sdk.api.pushrules.Action
-import org.matrix.android.sdk.api.pushrules.ConditionResolver
-import org.matrix.android.sdk.api.pushrules.PushEvents
-import org.matrix.android.sdk.api.pushrules.PushRuleService
-import org.matrix.android.sdk.api.pushrules.RuleKind
-import org.matrix.android.sdk.api.pushrules.RuleScope
-import org.matrix.android.sdk.api.pushrules.RuleSetKey
-import org.matrix.android.sdk.api.pushrules.SenderNotificationPermissionCondition
-import org.matrix.android.sdk.api.pushrules.getActions
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
-import org.matrix.android.sdk.api.pushrules.rest.RuleSet
import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.api.session.pushrules.Action
+import org.matrix.android.sdk.api.session.pushrules.ConditionResolver
+import org.matrix.android.sdk.api.session.pushrules.PushEvents
+import org.matrix.android.sdk.api.session.pushrules.PushRuleService
+import org.matrix.android.sdk.api.session.pushrules.RuleKind
+import org.matrix.android.sdk.api.session.pushrules.RuleScope
+import org.matrix.android.sdk.api.session.pushrules.RuleSetKey
+import org.matrix.android.sdk.api.session.pushrules.SenderNotificationPermissionCondition
+import org.matrix.android.sdk.api.session.pushrules.getActions
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.rest.RuleSet
import org.matrix.android.sdk.internal.database.mapper.PushRulesMapper
import org.matrix.android.sdk.internal.database.model.PushRuleEntity
import org.matrix.android.sdk.internal.database.model.PushRulesEntity
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt
similarity index 95%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt
index 899bce4c8d..91d092a2b4 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/ProcessEventForPushTask.kt
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.internal.session.notification
+package org.matrix.android.sdk.internal.session.pushrules
-import org.matrix.android.sdk.api.pushrules.PushEvents
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.isInvitation
+import org.matrix.android.sdk.api.session.pushrules.PushEvents
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
import org.matrix.android.sdk.api.session.sync.model.RoomsSyncResponse
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.task.Task
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/PushRuleFinder.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/PushRuleFinder.kt
similarity index 86%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/PushRuleFinder.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/PushRuleFinder.kt
index 6e302d373d..b9d06a934d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/PushRuleFinder.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/PushRuleFinder.kt
@@ -14,11 +14,11 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.internal.session.notification
+package org.matrix.android.sdk.internal.session.pushrules
-import org.matrix.android.sdk.api.pushrules.ConditionResolver
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.api.session.pushrules.ConditionResolver
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
import javax.inject.Inject
internal class PushRuleFinder @Inject constructor(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt
index 9f2b7d5f60..15ce5810c8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/EventRelationsAggregationProcessor.kt
@@ -316,14 +316,16 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
ContentMapper
.map(eventAnnotationsSummaryEntity.pollResponseSummary?.aggregatedContent)
?.toModel()
- ?.apply {
- totalVotes = 0
- winnerVoteCount = 0
- votes = emptyList()
- votesSummary = emptyMap()
- }
- ?.apply {
- eventAnnotationsSummaryEntity.pollResponseSummary?.aggregatedContent = ContentMapper.map(toContent())
+ ?.let { existingPollSummaryContent ->
+ eventAnnotationsSummaryEntity.pollResponseSummary?.aggregatedContent = ContentMapper.map(
+ PollSummaryContent(
+ myVote = existingPollSummaryContent.myVote,
+ votes = emptyList(),
+ votesSummary = emptyMap(),
+ totalVotes = 0,
+ winnerVoteCount = 0,
+ )
+ .toContent())
}
val txId = event.unsignedData?.transactionId
@@ -410,15 +412,15 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
existing.pollResponseSummary = it
}
- val closedTime = existingPollSummary?.closedTime
+ val closedTime = existingPollSummary.closedTime
if (closedTime != null && eventTimestamp > closedTime) {
Timber.v("## POLL is closed ignore event poll:$targetEventId, event :${event.eventId}")
return
}
- val sumModel = ContentMapper.map(existingPollSummary?.aggregatedContent).toModel() ?: PollSummaryContent()
+ val currentModel = ContentMapper.map(existingPollSummary.aggregatedContent).toModel()
- if (existingPollSummary!!.sourceEvents.contains(eventId)) {
+ if (existingPollSummary.sourceEvents.contains(eventId)) {
// ignore this event, we already know it (??)
Timber.v("## POLL ignoring event for summary, it's known eventId:$eventId")
return
@@ -443,7 +445,9 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
return
}
- val votes = sumModel.votes?.toMutableList() ?: ArrayList()
+ val votes = currentModel?.votes.orEmpty().toMutableList()
+
+ var myVote: String? = null
val existingVoteIndex = votes.indexOfFirst { it.userId == senderId }
if (existingVoteIndex != -1) {
// Is the vote newer?
@@ -452,7 +456,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
// Take the new one
votes[existingVoteIndex] = VoteInfo(senderId, option, eventTimestamp)
if (userId == senderId) {
- sumModel.myVote = option
+ myVote = option
}
Timber.v("## POLL adding vote $option for user $senderId in poll :$targetEventId ")
} else {
@@ -461,16 +465,14 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
} else {
votes.add(VoteInfo(senderId, option, eventTimestamp))
if (userId == senderId) {
- sumModel.myVote = option
+ myVote = option
}
Timber.v("## POLL adding vote $option for user $senderId in poll :$targetEventId ")
}
- sumModel.votes = votes
// Precompute the percentage of votes for all options
val totalVotes = votes.size
- sumModel.totalVotes = totalVotes
- sumModel.votesSummary = votes
+ val newVotesSummary = votes
.groupBy({ it.option }, { it.userId })
.mapValues {
VoteSummary(
@@ -478,7 +480,7 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
percentage = if (totalVotes == 0 && it.value.isEmpty()) 0.0 else it.value.size.toDouble() / totalVotes
)
}
- sumModel.winnerVoteCount = sumModel.votesSummary?.maxOf { it.value.total } ?: 0
+ val newWinnerVoteCount = newVotesSummary.maxOf { it.value.total }
if (isLocalEcho) {
existingPollSummary.sourceLocalEchoEvents.add(eventId)
@@ -486,7 +488,15 @@ internal class EventRelationsAggregationProcessor @Inject constructor(
existingPollSummary.sourceEvents.add(eventId)
}
- existingPollSummary.aggregatedContent = ContentMapper.map(sumModel.toContent())
+ val newSumModel = PollSummaryContent(
+ myVote = myVote,
+ votes = votes,
+ votesSummary = newVotesSummary,
+ totalVotes = totalVotes,
+ winnerVoteCount = newWinnerVoteCount
+ )
+
+ existingPollSummary.aggregatedContent = ContentMapper.map(newSumModel.toContent())
}
private fun handleEndPoll(realm: Realm,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/DefaultLiveLocationAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/DefaultLiveLocationAggregationProcessor.kt
index 95e196c762..8de0965b40 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/DefaultLiveLocationAggregationProcessor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/DefaultLiveLocationAggregationProcessor.kt
@@ -59,7 +59,7 @@ internal class DefaultLiveLocationAggregationProcessor @Inject constructor() : L
}
// Check if live location is ended
- if (!beaconInfoContent.getBestBeaconInfo()?.isLive.orFalse()) {
+ if (!beaconInfoContent.isLive.orFalse()) {
Timber.v("## LIVE LOCATION. Beacon info is not live anymore")
return
}
@@ -79,7 +79,7 @@ internal class DefaultLiveLocationAggregationProcessor @Inject constructor() : L
liveLocationContent: MessageLiveLocationContent): Boolean {
val beaconInfoStartTime = beaconInfoContent.getBestTimestampAsMilliseconds() ?: 0
val liveLocationEventTime = liveLocationContent.getBestTimestampAsMilliseconds() ?: 0
- val timeout = beaconInfoContent.getBestBeaconInfo()?.timeout ?: 0
+ val timeout = beaconInfoContent.timeout ?: 0
return liveLocationEventTime - beaconInfoStartTime > timeout
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/LiveLocationAggregationProcessor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/LiveLocationAggregationProcessor.kt
index 447eed21b0..7b5f23e243 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/LiveLocationAggregationProcessor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/aggregation/livelocation/LiveLocationAggregationProcessor.kt
@@ -20,7 +20,7 @@ import io.realm.Realm
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.room.model.message.MessageLiveLocationContent
-interface LiveLocationAggregationProcessor {
+internal interface LiveLocationAggregationProcessor {
fun handleLiveLocation(realm: Realm,
event: Event,
content: MessageLiveLocationContent,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/GetRoomIdByAliasTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/GetRoomIdByAliasTask.kt
index dc3ea55a01..b25ef7ba0f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/GetRoomIdByAliasTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/GetRoomIdByAliasTask.kt
@@ -52,7 +52,7 @@ internal class DefaultGetRoomIdByAliasTask @Inject constructor(
} else if (!params.searchOnServer) {
Optional.from(null)
} else {
- val description = tryOrNull("## Failed to get roomId from alias") {
+ val description = tryOrNull("## Failed to get roomId from alias") {
executeRequest(globalErrorReceiver) {
directoryAPI.getRoomIdByAlias(params.roomAlias)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/DefaultRoomPushRuleService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/DefaultRoomPushRuleService.kt
index 8f1aefb731..85f53e1346 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/DefaultRoomPushRuleService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/DefaultRoomPushRuleService.kt
@@ -22,7 +22,7 @@ import com.zhuinden.monarchy.Monarchy
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
-import org.matrix.android.sdk.api.pushrules.RuleScope
+import org.matrix.android.sdk.api.session.pushrules.RuleScope
import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState
import org.matrix.android.sdk.api.session.room.notification.RoomPushRuleService
import org.matrix.android.sdk.internal.database.model.PushRuleEntity
@@ -32,7 +32,7 @@ import org.matrix.android.sdk.internal.di.SessionDatabase
internal class DefaultRoomPushRuleService @AssistedInject constructor(@Assisted private val roomId: String,
private val setRoomNotificationStateTask: SetRoomNotificationStateTask,
@SessionDatabase private val monarchy: Monarchy) :
- RoomPushRuleService {
+ RoomPushRuleService {
@AssistedFactory
interface Factory {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/RoomPushRule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/RoomPushRule.kt
index d2c0d13b51..2c74e2a1e5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/RoomPushRule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/RoomPushRule.kt
@@ -16,8 +16,8 @@
package org.matrix.android.sdk.internal.session.room.notification
-import org.matrix.android.sdk.api.pushrules.RuleKind
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.RuleKind
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
internal data class RoomPushRule(
val kind: RuleKind,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/RoomPushRuleMapper.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/RoomPushRuleMapper.kt
index 86d2e6c619..a5a5ab58ba 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/RoomPushRuleMapper.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/RoomPushRuleMapper.kt
@@ -16,13 +16,13 @@
package org.matrix.android.sdk.internal.session.room.notification
-import org.matrix.android.sdk.api.pushrules.Action
-import org.matrix.android.sdk.api.pushrules.Kind
-import org.matrix.android.sdk.api.pushrules.RuleSetKey
-import org.matrix.android.sdk.api.pushrules.getActions
-import org.matrix.android.sdk.api.pushrules.rest.PushCondition
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
-import org.matrix.android.sdk.api.pushrules.toJson
+import org.matrix.android.sdk.api.session.pushrules.Action
+import org.matrix.android.sdk.api.session.pushrules.Kind
+import org.matrix.android.sdk.api.session.pushrules.RuleSetKey
+import org.matrix.android.sdk.api.session.pushrules.getActions
+import org.matrix.android.sdk.api.session.pushrules.rest.PushCondition
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.toJson
import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState
import org.matrix.android.sdk.internal.database.mapper.PushRulesMapper
import org.matrix.android.sdk.internal.database.model.PushRuleEntity
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/SetRoomNotificationStateTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/SetRoomNotificationStateTask.kt
index feb8c27b09..021d7dbefb 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/SetRoomNotificationStateTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/notification/SetRoomNotificationStateTask.kt
@@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.session.room.notification
import com.zhuinden.monarchy.Monarchy
import io.realm.Realm
-import org.matrix.android.sdk.api.pushrules.RuleScope
+import org.matrix.android.sdk.api.session.pushrules.RuleScope
import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState
import org.matrix.android.sdk.internal.database.model.PushRuleEntity
import org.matrix.android.sdk.internal.database.query.where
@@ -38,7 +38,7 @@ internal interface SetRoomNotificationStateTask : Task(context, params, sessionManager, Params::class.java) {
+ SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
@JsonClass(generateAdapter = true)
internal data class Params(
@@ -76,10 +76,10 @@ internal class MultipleEventSendingDispatcherWorker(context: Context, params: Wo
params.localEchoIds.forEach { localEchoIds ->
val roomId = localEchoIds.roomId
val eventId = localEchoIds.eventId
- localEchoRepository.updateSendState(eventId, roomId, SendState.SENDING)
- Timber.v("## SendEvent: [${System.currentTimeMillis()}] Schedule send event $eventId")
- val sendWork = createSendEventWork(params.sessionId, eventId, true)
- timelineSendEventWorkCommon.postWork(roomId, sendWork)
+ localEchoRepository.updateSendState(eventId, roomId, SendState.SENDING)
+ Timber.v("## SendEvent: [${System.currentTimeMillis()}] Schedule send event $eventId")
+ val sendWork = createSendEventWork(params.sessionId, eventId, true)
+ timelineSendEventWorkCommon.postWork(roomId, sendWork)
}
return Result.success()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/RedactEventWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/RedactEventWorker.kt
index c03d1fa81e..83c61d2845 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/RedactEventWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/RedactEventWorker.kt
@@ -34,7 +34,7 @@ import javax.inject.Inject
* Possible next worker : None
*/
internal class RedactEventWorker(context: Context, params: WorkerParameters, sessionManager: SessionManager) :
- SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
+ SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
@JsonClass(generateAdapter = true)
internal data class Params(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/SendEventWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/SendEventWorker.kt
index 7f24688ece..669891c822 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/SendEventWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/SendEventWorker.kt
@@ -40,7 +40,7 @@ import javax.inject.Inject
* Possible next worker : None
*/
internal class SendEventWorker(context: Context, params: WorkerParameters, sessionManager: SessionManager) :
- SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
+ SessionSafeCoroutineWorker(context, params, sessionManager, Params::class.java) {
@JsonClass(generateAdapter = true)
internal data class Params(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt
index 116c8d5c6b..545fc41737 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/QueueMemento.kt
@@ -74,7 +74,7 @@ internal class QueueMemento @Inject constructor(context: Context,
encrypt = task.encrypt,
order = order
)
- is RedactQueuedTask -> RedactEventTaskInfo(
+ is RedactQueuedTask -> RedactEventTaskInfo(
redactionLocalEcho = task.redactionLocalEchoId,
order = order
)
@@ -92,7 +92,7 @@ internal class QueueMemento @Inject constructor(context: Context,
?.forEach { info ->
try {
when (info) {
- is SendEventTaskInfo -> {
+ is SendEventTaskInfo -> {
localEchoRepository.getUpToDateEcho(info.localEchoId)?.let {
if (it.sendState.isSending() && it.eventId != null && it.roomId != null) {
localEchoRepository.updateSendState(it.eventId, it.roomId, SendState.UNSENT)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
index 417417f439..0a4fd875d5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/DefaultStateService.kt
@@ -21,16 +21,19 @@ import androidx.lifecycle.LiveData
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
+import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toContent
+import org.matrix.android.sdk.api.session.events.model.toModel
import org.matrix.android.sdk.api.session.room.model.GuestAccess
import org.matrix.android.sdk.api.session.room.model.RoomCanonicalAliasContent
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
import org.matrix.android.sdk.api.session.room.model.RoomJoinRules
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesContent
+import org.matrix.android.sdk.api.session.room.model.livelocation.LiveLocationBeaconContent
import org.matrix.android.sdk.api.session.room.state.StateService
import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.api.util.MimeTypes
@@ -186,4 +189,35 @@ internal class DefaultStateService @AssistedInject constructor(@Assisted private
}
updateJoinRule(RoomJoinRules.RESTRICTED, null, allowEntries)
}
+
+ override suspend fun stopLiveLocation(userId: String) {
+ getLiveLocationBeaconInfo(userId, true)?.let { beaconInfoStateEvent ->
+ beaconInfoStateEvent.getClearContent()?.toModel()?.let { content ->
+ val updatedContent = content.copy(isLive = false).toContent()
+
+ beaconInfoStateEvent.stateKey?.let {
+ sendStateEvent(
+ eventType = EventType.STATE_ROOM_BEACON_INFO.first(),
+ body = updatedContent,
+ stateKey = it
+ )
+ }
+ }
+ }
+ }
+
+ override suspend fun getLiveLocationBeaconInfo(userId: String, filterOnlyLive: Boolean): Event? {
+ return EventType.STATE_ROOM_BEACON_INFO
+ .mapNotNull {
+ stateEventDataSource.getStateEvent(
+ roomId = roomId,
+ eventType = it,
+ stateKey = QueryStringValue.Equals(userId)
+ )
+ }
+ .firstOrNull { beaconInfoEvent ->
+ !filterOnlyLive ||
+ beaconInfoEvent.getClearContent()?.toModel()?.isLive.orFalse()
+ }
+ }
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/SafePowerLevelContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/SafePowerLevelContent.kt
index 197b4f8688..1f2ec09367 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/SafePowerLevelContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/state/SafePowerLevelContent.kt
@@ -51,7 +51,7 @@ internal fun JsonDict.toSafePowerLevelsContentDict(): JsonDict {
usersDefault = content.usersDefault,
users = content.users,
stateDefault = content.stateDefault,
- notifications = content.notifications?.mapValues { content.notificationLevel(it.key) }
+ notifications = content.notifications?.mapValues { content.notificationLevel(it.key) }
)
}
?.toContent()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/GraphUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/GraphUtils.kt
index e3a215445d..52879d7121 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/GraphUtils.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/GraphUtils.kt
@@ -101,11 +101,11 @@ internal class Graph {
// it's a candidate
destination = it.destination
}
- inPath -> {
+ inPath -> {
// Cycle!!
backwardEdges.add(it)
}
- completed -> {
+ completed -> {
// dead end
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt
index 5064ebf49b..08b2700a43 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt
@@ -100,6 +100,7 @@ internal class DefaultTimeline(private val roomId: String,
threadsAwarenessHandler = threadsAwarenessHandler,
lightweightSettingsStorage = lightweightSettingsStorage,
onEventsUpdated = this::sendSignalToPostSnapshot,
+ onEventsDeleted = this::onEventsDeleted,
onLimitedTimeline = this::onLimitedTimeline,
onNewTimelineEvents = this::onNewTimelineEvents
)
@@ -304,6 +305,12 @@ internal class DefaultTimeline(private val roomId: String,
}
}
+ private fun onEventsDeleted() {
+ // Some event have been deleted, for instance when a user has been ignored.
+ // Restart the timeline (live)
+ restartWithEventId(null)
+ }
+
private suspend fun postSnapshot() {
val snapshot = strategy.buildSnapshot()
Timber.v("Post snapshot of ${snapshot.size} events")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LiveTimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LiveTimelineEvent.kt
index 64b1a4ff1d..e765e05578 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LiveTimelineEvent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LiveTimelineEvent.kt
@@ -41,7 +41,7 @@ internal class LiveTimelineEvent(private val monarchy: Monarchy,
private val timelineEventMapper: TimelineEventMapper,
private val roomId: String,
private val eventId: String) :
- MediatorLiveData>() {
+ MediatorLiveData>() {
init {
buildAndObserveQuery()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt
index ff986d04af..8819ffe69f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt
@@ -95,6 +95,7 @@ internal class LoadTimelineStrategy(
val threadsAwarenessHandler: ThreadsAwarenessHandler,
val lightweightSettingsStorage: LightweightSettingsStorage,
val onEventsUpdated: (Boolean) -> Unit,
+ val onEventsDeleted: () -> Unit,
val onLimitedTimeline: () -> Unit,
val onNewTimelineEvents: (List) -> Unit
)
@@ -302,7 +303,8 @@ internal class LoadTimelineStrategy(
threadsAwarenessHandler = dependencies.threadsAwarenessHandler,
lightweightSettingsStorage = dependencies.lightweightSettingsStorage,
initialEventId = mode.originEventId(),
- onBuiltEvents = dependencies.onEventsUpdated
+ onBuiltEvents = dependencies.onEventsUpdated,
+ onEventsDeleted = dependencies.onEventsDeleted,
)
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt
index 4ead1d4ecb..27f4245b22 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt
@@ -49,21 +49,24 @@ import java.util.concurrent.atomic.AtomicBoolean
* It does mainly listen to the db timeline events.
* It also triggers pagination to the server when needed, or dispatch to the prev or next chunk if any.
*/
-internal class TimelineChunk(private val chunkEntity: ChunkEntity,
- private val timelineSettings: TimelineSettings,
- private val roomId: String,
- private val timelineId: String,
- private val fetchThreadTimelineTask: FetchThreadTimelineTask,
- private val eventDecryptor: TimelineEventDecryptor,
- private val paginationTask: PaginationTask,
- private val realmConfiguration: RealmConfiguration,
- private val fetchTokenAndPaginateTask: FetchTokenAndPaginateTask,
- private val timelineEventMapper: TimelineEventMapper,
- private val uiEchoManager: UIEchoManager? = null,
- private val threadsAwarenessHandler: ThreadsAwarenessHandler,
- private val lightweightSettingsStorage: LightweightSettingsStorage,
- private val initialEventId: String?,
- private val onBuiltEvents: (Boolean) -> Unit) {
+internal class TimelineChunk(
+ private val chunkEntity: ChunkEntity,
+ private val timelineSettings: TimelineSettings,
+ private val roomId: String,
+ private val timelineId: String,
+ private val fetchThreadTimelineTask: FetchThreadTimelineTask,
+ private val eventDecryptor: TimelineEventDecryptor,
+ private val paginationTask: PaginationTask,
+ private val realmConfiguration: RealmConfiguration,
+ private val fetchTokenAndPaginateTask: FetchTokenAndPaginateTask,
+ private val timelineEventMapper: TimelineEventMapper,
+ private val uiEchoManager: UIEchoManager?,
+ private val threadsAwarenessHandler: ThreadsAwarenessHandler,
+ private val lightweightSettingsStorage: LightweightSettingsStorage,
+ private val initialEventId: String?,
+ private val onBuiltEvents: (Boolean) -> Unit,
+ private val onEventsDeleted: () -> Unit,
+) {
private val isLastForward = AtomicBoolean(chunkEntity.isLastForward)
private val isLastBackward = AtomicBoolean(chunkEntity.isLastBackward)
@@ -505,6 +508,11 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity,
if (insertions.isNotEmpty() || modifications.isNotEmpty()) {
onBuiltEvents(true)
}
+
+ val deletions = changeSet.deletions
+ if (deletions.isNotEmpty()) {
+ onEventsDeleted()
+ }
}
private fun getNextDisplayIndex(direction: Timeline.Direction): Int? {
@@ -543,7 +551,8 @@ internal class TimelineChunk(private val chunkEntity: ChunkEntity,
threadsAwarenessHandler = threadsAwarenessHandler,
lightweightSettingsStorage = lightweightSettingsStorage,
initialEventId = null,
- onBuiltEvents = this.onBuiltEvents
+ onBuiltEvents = this.onBuiltEvents,
+ onEventsDeleted = this.onEventsDeleted
)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDataSource.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDataSource.kt
index 638866a46e..8b58d3ca5c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDataSource.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineEventDataSource.kt
@@ -19,7 +19,6 @@ package org.matrix.android.sdk.internal.session.room.timeline
import androidx.lifecycle.LiveData
import com.zhuinden.monarchy.Monarchy
import io.realm.Sort
-import io.realm.kotlin.where
import org.matrix.android.sdk.api.session.events.model.isImageMessage
import org.matrix.android.sdk.api.session.events.model.isVideoMessage
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
@@ -29,6 +28,7 @@ import org.matrix.android.sdk.internal.database.mapper.TimelineEventMapper
import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
import org.matrix.android.sdk.internal.database.query.where
+import org.matrix.android.sdk.internal.database.query.whereRoomId
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.task.TaskExecutor
import javax.inject.Inject
@@ -53,8 +53,7 @@ internal class TimelineEventDataSource @Inject constructor(private val realmSess
fun getAttachmentMessages(roomId: String): List {
// TODO pretty bad query.. maybe we should denormalize clear type in base?
return realmSessionProvider.withRealm { realm ->
- realm.where()
- .equalTo(TimelineEventEntityFields.ROOM_ID, roomId)
+ TimelineEventEntity.whereRoomId(realm, roomId)
.sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.ASCENDING)
.findAll()
?.mapNotNull { timelineEventMapper.map(it).takeIf { it.root.isImageMessage() || it.root.isVideoMessage() } }
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/uploads/GetUploadsTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/uploads/GetUploadsTask.kt
index 028c3e9193..7daf506c14 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/uploads/GetUploadsTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/uploads/GetUploadsTask.kt
@@ -17,6 +17,7 @@
package org.matrix.android.sdk.internal.session.room.uploads
import com.zhuinden.monarchy.Monarchy
+import io.realm.Sort
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toModel
@@ -75,6 +76,7 @@ internal class DefaultGetUploadsTask @Inject constructor(
monarchy.doWithRealm { realm ->
eventsFromRealm = EventEntity.whereType(realm, EventType.ENCRYPTED, params.roomId)
.like(EventEntityFields.DECRYPTION_RESULT_JSON, TimelineEventFilter.DecryptedContent.URL)
+ .sort(EventEntityFields.ORIGIN_SERVER_TS, Sort.DESCENDING)
.findAll()
.map { it.asDomain() }
// Exclude stickers
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/search/SearchTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/search/SearchTask.kt
index 3ba7d11c3d..fcaf3b60a7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/search/SearchTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/search/SearchTask.kt
@@ -87,7 +87,7 @@ internal class DefaultSearchTask @Inject constructor(
results = searchCategories.roomEvents?.results?.map { searchResponseItem ->
val localThreadEventDetails = localTimelineEvents
- ?.firstOrNull { it.eventId == searchResponseItem.event.eventId }
+ ?.firstOrNull { it.eventId == searchResponseItem.event.eventId }
?.root
?.asDomain()
?.threadDetails
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncPresence.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncPresence.kt
index 4f1fe43b7d..42cd972e0c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncPresence.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncPresence.kt
@@ -34,11 +34,12 @@ internal enum class SyncPresence(val value: String) {
companion object {
fun from(presenceEnum: PresenceEnum): SyncPresence {
return when (presenceEnum) {
- PresenceEnum.ONLINE -> Online
- PresenceEnum.OFFLINE -> Offline
+ PresenceEnum.ONLINE -> Online
+ PresenceEnum.OFFLINE -> Offline
PresenceEnum.UNAVAILABLE -> Unavailable
}
}
+
fun from(s: String?): SyncPresence? = values().find { it.value == s }
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
index 97850e81d3..02a7a9a37f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt
@@ -18,9 +18,9 @@ package org.matrix.android.sdk.internal.session.sync
import androidx.work.ExistingPeriodicWorkPolicy
import com.zhuinden.monarchy.Monarchy
-import org.matrix.android.sdk.api.pushrules.PushRuleService
-import org.matrix.android.sdk.api.pushrules.RuleScope
import org.matrix.android.sdk.api.session.initsync.InitSyncStep
+import org.matrix.android.sdk.api.session.pushrules.PushRuleService
+import org.matrix.android.sdk.api.session.pushrules.RuleScope
import org.matrix.android.sdk.api.session.sync.model.GroupsSyncResponse
import org.matrix.android.sdk.api.session.sync.model.RoomsSyncResponse
import org.matrix.android.sdk.api.session.sync.model.SyncResponse
@@ -34,7 +34,7 @@ import org.matrix.android.sdk.internal.session.dispatchTo
import org.matrix.android.sdk.internal.session.group.GetGroupDataWorker
import org.matrix.android.sdk.internal.session.initsync.ProgressReporter
import org.matrix.android.sdk.internal.session.initsync.reportSubtask
-import org.matrix.android.sdk.internal.session.notification.ProcessEventForPushTask
+import org.matrix.android.sdk.internal.session.pushrules.ProcessEventForPushTask
import org.matrix.android.sdk.internal.session.sync.handler.CryptoSyncHandler
import org.matrix.android.sdk.internal.session.sync.handler.GroupSyncHandler
import org.matrix.android.sdk.internal.session.sync.handler.PresenceSyncHandler
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt
index b56f897749..bb0197a38d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt
@@ -172,7 +172,7 @@ internal class DefaultSyncTask @Inject constructor(
val nbToDevice = syncResponse.toDevice?.events.orEmpty().size
val nextBatch = syncResponse.nextBatch
Timber.tag(loggerTag.value).d(
- "Incremental sync request parsing, $nbRooms room(s) $nbToDevice toDevice(s). Got nextBatch: $nextBatch"
+ "Incremental sync request parsing, $nbRooms room(s) $nbToDevice toDevice(s). Got nextBatch: $nextBatch"
)
defaultSyncStatusService.setStatus(SyncStatusService.Status.IncrementalSyncParsing(
rooms = nbRooms,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt
index 25de05602a..c638ed4f80 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt
@@ -28,6 +28,7 @@ import org.matrix.android.sdk.internal.session.sync.model.accountdata.toMutable
import org.matrix.android.sdk.internal.session.user.UserEntityFactory
import org.matrix.android.sdk.internal.session.user.accountdata.DirectChatsHelper
import org.matrix.android.sdk.internal.session.user.accountdata.UpdateUserAccountDataTask
+import org.matrix.android.sdk.internal.util.awaitTransaction
import javax.inject.Inject
internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor(
@@ -91,9 +92,9 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor(
}
}
- private fun List.saveLocally() {
+ private suspend fun List.saveLocally() {
val userEntities = map { user -> UserEntityFactory.create(user) }
- monarchy.doWithRealm {
+ monarchy.awaitTransaction {
it.insertOrUpdate(userEntities)
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
index 7f80486c70..c213ea4bcf 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UserAccountDataSyncHandler.kt
@@ -20,17 +20,19 @@ import com.zhuinden.monarchy.Monarchy
import io.realm.Realm
import io.realm.RealmList
import io.realm.kotlin.where
-import org.matrix.android.sdk.api.pushrules.RuleScope
-import org.matrix.android.sdk.api.pushrules.RuleSetKey
-import org.matrix.android.sdk.api.pushrules.rest.GetPushRulesResponse
+import org.matrix.android.sdk.api.failure.GlobalError
+import org.matrix.android.sdk.api.failure.InitialSyncRequestReason
import org.matrix.android.sdk.api.session.accountdata.UserAccountDataEvent
import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes
import org.matrix.android.sdk.api.session.events.model.Content
import org.matrix.android.sdk.api.session.events.model.toModel
+import org.matrix.android.sdk.api.session.pushrules.RuleScope
+import org.matrix.android.sdk.api.session.pushrules.RuleSetKey
import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.sync.model.InvitedRoomSync
import org.matrix.android.sdk.api.session.sync.model.UserAccountDataSync
+import org.matrix.android.sdk.internal.SessionManager
import org.matrix.android.sdk.internal.database.mapper.ContentMapper
import org.matrix.android.sdk.internal.database.mapper.PushRulesMapper
import org.matrix.android.sdk.internal.database.mapper.asDomain
@@ -39,14 +41,20 @@ import org.matrix.android.sdk.internal.database.model.IgnoredUserEntity
import org.matrix.android.sdk.internal.database.model.PushRulesEntity
import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
import org.matrix.android.sdk.internal.database.model.RoomSummaryEntityFields
+import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
import org.matrix.android.sdk.internal.database.model.UserAccountDataEntity
import org.matrix.android.sdk.internal.database.model.UserAccountDataEntityFields
import org.matrix.android.sdk.internal.database.model.deleteOnCascade
+import org.matrix.android.sdk.internal.database.query.findAllFrom
import org.matrix.android.sdk.internal.database.query.getDirectRooms
import org.matrix.android.sdk.internal.database.query.getOrCreate
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
+import org.matrix.android.sdk.internal.di.SessionId
import org.matrix.android.sdk.internal.di.UserId
+import org.matrix.android.sdk.internal.session.SessionListeners
+import org.matrix.android.sdk.internal.session.dispatchTo
+import org.matrix.android.sdk.internal.session.pushers.GetPushRulesResponse
import org.matrix.android.sdk.internal.session.room.RoomAvatarResolver
import org.matrix.android.sdk.internal.session.room.membership.RoomDisplayNameResolver
import org.matrix.android.sdk.internal.session.room.membership.RoomMemberHelper
@@ -65,7 +73,10 @@ internal class UserAccountDataSyncHandler @Inject constructor(
private val directChatsHelper: DirectChatsHelper,
private val updateUserAccountDataTask: UpdateUserAccountDataTask,
private val roomAvatarResolver: RoomAvatarResolver,
- private val roomDisplayNameResolver: RoomDisplayNameResolver
+ private val roomDisplayNameResolver: RoomDisplayNameResolver,
+ @SessionId private val sessionId: String,
+ private val sessionManager: SessionManager,
+ private val sessionListeners: SessionListeners
) {
fun handle(realm: Realm, accountData: UserAccountDataSync?) {
@@ -184,12 +195,36 @@ internal class UserAccountDataSyncHandler @Inject constructor(
private fun handleIgnoredUsers(realm: Realm, event: UserAccountDataEvent) {
val userIds = event.content.toModel()?.ignoredUsers?.keys ?: return
- realm.where(IgnoredUserEntity::class.java)
- .findAll()
- .deleteAllFromRealm()
+ val currentIgnoredUsers = realm.where(IgnoredUserEntity::class.java).findAll()
+ val currentIgnoredUserIds = currentIgnoredUsers.map { it.userId }
+ // Delete the previous list
+ currentIgnoredUsers.deleteAllFromRealm()
// And save the new received list
userIds.forEach { realm.createObject(IgnoredUserEntity::class.java).apply { userId = it } }
- // TODO If not initial sync, we should execute a init sync
+
+ // Delete all the TimelineEvents for all the ignored users
+ // See https://spec.matrix.org/latest/client-server-api/#client-behaviour-22 :
+ // "Once ignored, the client will no longer receive events sent by that user, with the exception of state events"
+ // So just delete all non-state events from our local storage.
+ TimelineEventEntity.findAllFrom(realm, userIds)
+ .also { Timber.d("Deleting ${it.size} TimelineEventEntity from ignored users") }
+ .forEach {
+ it.deleteOnCascade(true)
+ }
+
+ // Handle the case when some users are unignored from another session
+ val mustRefreshCache = currentIgnoredUserIds.any { currentIgnoredUserId -> currentIgnoredUserId !in userIds }
+ if (mustRefreshCache) {
+ Timber.d("A user has been unignored from another session, an initial sync should be performed")
+ dispatchMustRefresh()
+ }
+ }
+
+ private fun dispatchMustRefresh() {
+ val session = sessionManager.getSessionComponent(sessionId)?.session()
+ session.dispatchTo(sessionListeners) { safeSession, listener ->
+ listener.onGlobalError(safeSession, GlobalError.InitialSyncRequest(InitialSyncRequestReason.IGNORED_USERS_LIST_CHANGE))
+ }
}
private fun handleBreadcrumbs(realm: Realm, event: UserAccountDataEvent) {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt
index c67c0e350e..f183c4cb28 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncWorker.kt
@@ -42,7 +42,7 @@ private const val DEFAULT_DELAY_MILLIS = 30_000L
* Possible next worker : None
*/
internal class SyncWorker(context: Context, workerParameters: WorkerParameters, sessionManager: SessionManager) :
- SessionSafeCoroutineWorker(context, workerParameters, sessionManager, Params::class.java) {
+ SessionSafeCoroutineWorker(context, workerParameters, sessionManager, Params::class.java) {
@JsonClass(generateAdapter = true)
internal data class Params(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/thirdparty/DefaultThirdPartyService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/thirdparty/DefaultThirdPartyService.kt
index fdd5524fc2..210cb192e7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/thirdparty/DefaultThirdPartyService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/thirdparty/DefaultThirdPartyService.kt
@@ -23,7 +23,7 @@ import javax.inject.Inject
internal class DefaultThirdPartyService @Inject constructor(private val getThirdPartyProtocolTask: GetThirdPartyProtocolsTask,
private val getThirdPartyUserTask: GetThirdPartyUserTask) :
- ThirdPartyService {
+ ThirdPartyService {
override suspend fun getThirdPartyProtocols(): Map {
return getThirdPartyProtocolTask.execute(Unit)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserModule.kt
index 4dfc7586ae..c205c4f1c6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserModule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserModule.kt
@@ -21,9 +21,7 @@ import dagger.Module
import dagger.Provides
import org.matrix.android.sdk.api.session.user.UserService
import org.matrix.android.sdk.internal.session.SessionScope
-import org.matrix.android.sdk.internal.session.user.accountdata.DefaultSaveIgnoredUsersTask
import org.matrix.android.sdk.internal.session.user.accountdata.DefaultUpdateIgnoredUserIdsTask
-import org.matrix.android.sdk.internal.session.user.accountdata.SaveIgnoredUsersTask
import org.matrix.android.sdk.internal.session.user.accountdata.UpdateIgnoredUserIdsTask
import org.matrix.android.sdk.internal.session.user.model.DefaultSearchUserTask
import org.matrix.android.sdk.internal.session.user.model.SearchUserTask
@@ -48,9 +46,6 @@ internal abstract class UserModule {
@Binds
abstract fun bindSearchUserTask(task: DefaultSearchUserTask): SearchUserTask
- @Binds
- abstract fun bindSaveIgnoredUsersTask(task: DefaultSaveIgnoredUsersTask): SaveIgnoredUsersTask
-
@Binds
abstract fun bindUpdateIgnoredUserIdsTask(task: DefaultUpdateIgnoredUserIdsTask): UpdateIgnoredUserIdsTask
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/SaveIgnoredUsersTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/SaveIgnoredUsersTask.kt
deleted file mode 100644
index 63c0ce645e..0000000000
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/SaveIgnoredUsersTask.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2020 The Matrix.org Foundation C.I.C.
- *
- * 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 org.matrix.android.sdk.internal.session.user.accountdata
-
-import com.zhuinden.monarchy.Monarchy
-import org.matrix.android.sdk.internal.database.model.IgnoredUserEntity
-import org.matrix.android.sdk.internal.di.SessionDatabase
-import org.matrix.android.sdk.internal.task.Task
-import org.matrix.android.sdk.internal.util.awaitTransaction
-import javax.inject.Inject
-
-/**
- * Save the ignored users list in DB
- */
-internal interface SaveIgnoredUsersTask : Task {
- data class Params(
- val userIds: List
- )
-}
-
-internal class DefaultSaveIgnoredUsersTask @Inject constructor(@SessionDatabase private val monarchy: Monarchy) : SaveIgnoredUsersTask {
-
- override suspend fun execute(params: SaveIgnoredUsersTask.Params) {
- monarchy.awaitTransaction { realm ->
- // clear current ignored users
- realm.where(IgnoredUserEntity::class.java)
- .findAll()
- .deleteAllFromRealm()
-
- // And save the new received list
- params.userIds.forEach { realm.createObject(IgnoredUserEntity::class.java).apply { userId = it } }
- }
- }
-}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UpdateIgnoredUserIdsTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UpdateIgnoredUserIdsTask.kt
index 445b78104c..173161f8ae 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UpdateIgnoredUserIdsTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/accountdata/UpdateIgnoredUserIdsTask.kt
@@ -38,7 +38,6 @@ internal interface UpdateIgnoredUserIdsTask : Task(JSON_DICT_PARAMETERIZED_TYPE)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt
index 89e827aea0..53a435d217 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/DefaultWidgetService.kt
@@ -29,7 +29,7 @@ import javax.inject.Provider
internal class DefaultWidgetService @Inject constructor(private val widgetManager: WidgetManager,
private val widgetURLFormatter: WidgetURLFormatter,
private val widgetPostAPIMediator: Provider) :
- WidgetService {
+ WidgetService {
override fun getWidgetURLFormatter(): WidgetURLFormatter {
return widgetURLFormatter
@@ -52,7 +52,7 @@ internal class DefaultWidgetService @Inject constructor(private val widgetManage
return widgetManager.getWidgetComputedUrl(widget, isLightTheme)
}
-override fun getRoomWidgetsLive(
+ override fun getRoomWidgetsLive(
roomId: String,
widgetId: QueryStringValue,
widgetTypes: Set?,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt
index e18117d2d7..07ed91c179 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/WidgetManager.kt
@@ -52,7 +52,7 @@ internal class WidgetManager @Inject constructor(private val integrationManager:
private val widgetFactory: WidgetFactory,
@UserId private val userId: String) :
- IntegrationManagerService.Listener, SessionLifecycleObserver {
+ IntegrationManagerService.Listener, SessionLifecycleObserver {
private val lifecycleOwner: LifecycleOwner = LifecycleOwner { lifecycleRegistry }
private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(lifecycleOwner)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt
index 2790ffba36..dddd789212 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/TemporaryFileCreator.kt
@@ -29,6 +29,7 @@ internal class TemporaryFileCreator @Inject constructor(
suspend fun create(): File {
return withContext(Dispatchers.IO) {
File.createTempFile(UUID.randomUUID().toString(), null, context.cacheDir)
+ .apply { mkdirs() }
}
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/database/RealmMigrator.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/database/RealmMigrator.kt
index f22f0810a1..8f3c89f2d4 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/database/RealmMigrator.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/database/RealmMigrator.kt
@@ -21,7 +21,7 @@ import io.realm.RealmObjectSchema
import timber.log.Timber
internal abstract class RealmMigrator(private val realm: DynamicRealm,
- private val targetSchemaVersion: Int) {
+ private val targetSchemaVersion: Int) {
fun perform() {
Timber.d("Migrate ${realm.configuration.realmFileName} to $targetSchemaVersion")
doMigrate(realm)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/system/DefaultBuildVersionSdkIntProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/system/DefaultBuildVersionSdkIntProvider.kt
index 2d5e4b944a..806c6e9735 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/system/DefaultBuildVersionSdkIntProvider.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/util/system/DefaultBuildVersionSdkIntProvider.kt
@@ -20,6 +20,6 @@ import android.os.Build
import javax.inject.Inject
internal class DefaultBuildVersionSdkIntProvider @Inject constructor() :
- BuildVersionSdkIntProvider {
+ BuildVersionSdkIntProvider {
override fun get() = Build.VERSION.SDK_INT
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/AlwaysSuccessfulWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/AlwaysSuccessfulWorker.kt
index 856d3debcf..c92b51fcb8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/AlwaysSuccessfulWorker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/AlwaysSuccessfulWorker.kt
@@ -20,7 +20,7 @@ import androidx.work.Worker
import androidx.work.WorkerParameters
internal class AlwaysSuccessfulWorker(context: Context, params: WorkerParameters) :
- Worker(context, params) {
+ Worker(context, params) {
override fun doWork(): Result {
return Result.success()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/MatrixWorkerFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/MatrixWorkerFactory.kt
index 0b451e9c34..e56b359f7a 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/MatrixWorkerFactory.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/worker/MatrixWorkerFactory.kt
@@ -93,7 +93,7 @@ internal class MatrixWorkerFactory @Inject constructor(private val sessionManage
class CheckFactoryWorker(context: Context,
workerParameters: WorkerParameters,
private val isCreatedByMatrixWorkerFactory: Boolean) :
- CoroutineWorker(context, workerParameters) {
+ CoroutineWorker(context, workerParameters) {
// Called by WorkManager if there is no MatrixWorkerFactory
constructor(context: Context, workerParameters: WorkerParameters) : this(context,
diff --git a/matrix-sdk-android/src/release/java/org/matrix/android/sdk/internal/network/interceptors/CurlLoggingInterceptor.kt b/matrix-sdk-android/src/release/java/org/matrix/android/sdk/internal/network/interceptors/CurlLoggingInterceptor.kt
index 47f6869479..0b7bac0d6f 100644
--- a/matrix-sdk-android/src/release/java/org/matrix/android/sdk/internal/network/interceptors/CurlLoggingInterceptor.kt
+++ b/matrix-sdk-android/src/release/java/org/matrix/android/sdk/internal/network/interceptors/CurlLoggingInterceptor.kt
@@ -27,7 +27,7 @@ import javax.inject.Inject
*/
@MatrixScope
internal class CurlLoggingInterceptor @Inject constructor() :
- Interceptor {
+ Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/pushrules/PushRuleActionsTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRuleActionsTest.kt
similarity index 95%
rename from matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/pushrules/PushRuleActionsTest.kt
rename to matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRuleActionsTest.kt
index 9bfdea5414..1879e8195c 100644
--- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/pushrules/PushRuleActionsTest.kt
+++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRuleActionsTest.kt
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.matrix.android.sdk.MatrixTest
-import org.matrix.android.sdk.api.pushrules.rest.PushRule
+import org.matrix.android.sdk.api.session.pushrules.rest.PushRule
import org.matrix.android.sdk.internal.di.MoshiProvider
class PushRuleActionsTest : MatrixTest {
diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/pushrules/PushRulesConditionTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt
similarity index 99%
rename from matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/pushrules/PushRulesConditionTest.kt
rename to matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt
index c0b869a90e..8b680449cd 100644
--- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/pushrules/PushRulesConditionTest.kt
+++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api.pushrules
+package org.matrix.android.sdk.api.session.pushrules
import io.mockk.every
import io.mockk.mockk
diff --git a/vector-config/src/main/res/values/config-settings.xml b/vector-config/src/main/res/values/config-settings.xml
index b6d1c6676c..0a4da4c98e 100755
--- a/vector-config/src/main/res/values/config-settings.xml
+++ b/vector-config/src/main/res/values/config-settings.xml
@@ -13,7 +13,6 @@
true
true
true
- true
true
true
true
@@ -33,10 +32,10 @@
-
-
+ true
+
false
diff --git a/vector/build.gradle b/vector/build.gradle
index c7950da28e..162d9fe81c 100644
--- a/vector/build.gradle
+++ b/vector/build.gradle
@@ -18,7 +18,7 @@ ext.versionMinor = 4
// Note: even values are reserved for regular release, odd values for hotfix release.
// When creating a hotfix, you should decrease the value, since the current value
// is the value for the next regular release.
-ext.versionPatch = 12
+ext.versionPatch = 14
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'
@@ -368,7 +368,7 @@ dependencies {
implementation 'com.facebook.stetho:stetho:1.6.0'
// Phone number https://github.com/google/libphonenumber
- implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.46'
+ implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.47'
// FlowBinding
implementation libs.github.flowBinding
diff --git a/vector/src/androidTest/java/im/vector/app/EspressoExt.kt b/vector/src/androidTest/java/im/vector/app/EspressoExt.kt
index 5fb404efe3..35554ae75a 100644
--- a/vector/src/androidTest/java/im/vector/app/EspressoExt.kt
+++ b/vector/src/androidTest/java/im/vector/app/EspressoExt.kt
@@ -198,7 +198,7 @@ fun activityIdlingResource(activityClass: Class<*>): IdlingResource {
println("*** [$name] onActivityLifecycleChanged callback: $callback")
callback?.onTransitionToIdle()
}
- else -> {
+ else -> {
// do nothing, we're blocking until the activity resumes
}
}
diff --git a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
index 5a03d5890a..4333558e7a 100644
--- a/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
+++ b/vector/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
@@ -72,7 +72,6 @@ class UiAllScreensSanityTest {
notifications { crawl() }
preferences { crawl() }
voiceAndVideo()
- ignoredUsers()
securityAndPrivacy { crawl() }
labs()
advancedSettings { crawl() }
diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/MessageMenuRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/MessageMenuRobot.kt
index 5c9ecfdef5..53ad2af7e6 100644
--- a/vector/src/androidTest/java/im/vector/app/ui/robot/MessageMenuRobot.kt
+++ b/vector/src/androidTest/java/im/vector/app/ui/robot/MessageMenuRobot.kt
@@ -75,6 +75,7 @@ class MessageMenuRobot(
clickOn(R.string.reply_in_thread)
autoClosed = true
}
+
fun viewInRoom() {
clickOn(R.string.view_in_room)
autoClosed = true
diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/settings/SettingsRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/settings/SettingsRobot.kt
index 97aee7ac4a..1697fe078d 100644
--- a/vector/src/androidTest/java/im/vector/app/ui/robot/settings/SettingsRobot.kt
+++ b/vector/src/androidTest/java/im/vector/app/ui/robot/settings/SettingsRobot.kt
@@ -44,15 +44,11 @@ class SettingsRobot {
clickOnAndGoBack(R.string.preference_voice_and_video) { block() }
}
- fun ignoredUsers(block: () -> Unit = {}) {
- clickOnAndGoBack(R.string.settings_ignored_users) { block() }
- }
-
fun securityAndPrivacy(block: SettingsSecurityRobot.() -> Unit) {
clickOnAndGoBack(R.string.settings_security_and_privacy) { block(SettingsSecurityRobot()) }
}
- fun labs(shouldGoBack: Boolean = true, block: () -> Unit = {}) {
+ fun labs(shouldGoBack: Boolean = true, block: () -> Unit = {}) {
if (shouldGoBack) {
clickOnAndGoBack(R.string.room_settings_labs_pref_title) { block() }
} else {
diff --git a/vector/src/androidTest/java/im/vector/app/ui/robot/settings/SettingsSecurityRobot.kt b/vector/src/androidTest/java/im/vector/app/ui/robot/settings/SettingsSecurityRobot.kt
index 168db3e0e9..ef20d7764b 100644
--- a/vector/src/androidTest/java/im/vector/app/ui/robot/settings/SettingsSecurityRobot.kt
+++ b/vector/src/androidTest/java/im/vector/app/ui/robot/settings/SettingsSecurityRobot.kt
@@ -18,6 +18,7 @@ package im.vector.app.ui.robot.settings
import androidx.test.espresso.Espresso
import im.vector.app.R
+import im.vector.app.clickOnAndGoBack
import im.vector.app.espresso.tools.clickOnPreference
class SettingsSecurityRobot {
@@ -36,5 +37,11 @@ class SettingsSecurityRobot {
clickOnPreference(R.string.settings_opt_in_of_analytics)
Espresso.pressBack()
+
+ ignoredUsers()
+ }
+
+ private fun ignoredUsers(block: () -> Unit = {}) {
+ clickOnAndGoBack(R.string.settings_ignored_users) { block() }
}
}
diff --git a/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt b/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt
index bc716779ac..07fab8a58d 100644
--- a/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt
+++ b/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt
@@ -60,6 +60,9 @@ class DebugVectorFeatures(
override fun isLiveLocationEnabled(): Boolean = read(DebugFeatureKeys.liveLocationSharing)
?: vectorFeatures.isLiveLocationEnabled()
+ override fun isScreenSharingEnabled(): Boolean = read(DebugFeatureKeys.screenSharing)
+ ?: vectorFeatures.isScreenSharingEnabled()
+
fun override(value: T?, key: Preferences.Key) = updatePreferences {
if (value == null) {
it.remove(key)
@@ -114,4 +117,5 @@ object DebugFeatureKeys {
val onboardingPersonalize = booleanPreferencesKey("onboarding-personalize")
val onboardingCombinedRegister = booleanPreferencesKey("onboarding-combined-register")
val liveLocationSharing = booleanPreferencesKey("live-location-sharing")
+ val screenSharing = booleanPreferencesKey("screen-sharing")
}
diff --git a/vector/src/debug/java/im/vector/app/features/debug/sas/SasEmojiItem.kt b/vector/src/debug/java/im/vector/app/features/debug/sas/SasEmojiItem.kt
index a7b74f3b59..9e0c013960 100644
--- a/vector/src/debug/java/im/vector/app/features/debug/sas/SasEmojiItem.kt
+++ b/vector/src/debug/java/im/vector/app/features/debug/sas/SasEmojiItem.kt
@@ -32,6 +32,7 @@ abstract class SasEmojiItem : VectorEpoxyModel() {
@EpoxyAttribute
var index: Int = 0
+
@EpoxyAttribute
lateinit var emojiRepresentation: EmojiRepresentation
diff --git a/vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestAutoStartBoot.kt b/vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestAutoStartBoot.kt
index 27a3f09ddc..6d741a36ba 100644
--- a/vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestAutoStartBoot.kt
+++ b/vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestAutoStartBoot.kt
@@ -28,7 +28,7 @@ import javax.inject.Inject
*/
class TestAutoStartBoot @Inject constructor(private val vectorPreferences: VectorPreferences,
private val stringProvider: StringProvider) :
- TroubleshootTest(R.string.settings_troubleshoot_test_service_boot_title) {
+ TroubleshootTest(R.string.settings_troubleshoot_test_service_boot_title) {
override fun perform(activityResultLauncher: ActivityResultLauncher) {
if (vectorPreferences.autoStartOnBoot()) {
diff --git a/vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestBackgroundRestrictions.kt b/vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestBackgroundRestrictions.kt
index b5635e186c..f8c30f813d 100644
--- a/vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestBackgroundRestrictions.kt
+++ b/vector/src/fdroid/java/im/vector/app/fdroid/features/settings/troubleshoot/TestBackgroundRestrictions.kt
@@ -28,7 +28,7 @@ import javax.inject.Inject
class TestBackgroundRestrictions @Inject constructor(private val context: FragmentActivity,
private val stringProvider: StringProvider) :
- TroubleshootTest(R.string.settings_troubleshoot_test_bg_restricted_title) {
+ TroubleshootTest(R.string.settings_troubleshoot_test_bg_restricted_title) {
override fun perform(activityResultLauncher: ActivityResultLauncher) {
context.getSystemService()!!.apply {
diff --git a/vector/src/fdroid/java/im/vector/app/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt b/vector/src/fdroid/java/im/vector/app/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt
index 935d7e6e13..c1bc90c4db 100644
--- a/vector/src/fdroid/java/im/vector/app/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt
+++ b/vector/src/fdroid/java/im/vector/app/fdroid/receiver/OnApplicationUpgradeOrRebootReceiver.kt
@@ -29,10 +29,10 @@ class OnApplicationUpgradeOrRebootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Timber.v("## onReceive() ${intent.action}")
val singletonEntryPoint = context.singletonEntryPoint()
- BackgroundSyncStarter.start(
- context,
- singletonEntryPoint.vectorPreferences(),
- singletonEntryPoint.activeSessionHolder()
- )
+ BackgroundSyncStarter.start(
+ context,
+ singletonEntryPoint.vectorPreferences(),
+ singletonEntryPoint.activeSessionHolder()
+ )
}
}
diff --git a/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestPlayServices.kt b/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestPlayServices.kt
index cc682e7a5f..ecb457bf9f 100644
--- a/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestPlayServices.kt
+++ b/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestPlayServices.kt
@@ -31,7 +31,7 @@ import javax.inject.Inject
*/
class TestPlayServices @Inject constructor(private val context: FragmentActivity,
private val stringProvider: StringProvider) :
- TroubleshootTest(R.string.settings_troubleshoot_test_play_services_title) {
+ TroubleshootTest(R.string.settings_troubleshoot_test_play_services_title) {
override fun perform(activityResultLauncher: ActivityResultLauncher) {
val apiAvailability = GoogleApiAvailability.getInstance()
diff --git a/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestPushFromPushGateway.kt b/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestPushFromPushGateway.kt
index 7ae68b201b..f485de760a 100644
--- a/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestPushFromPushGateway.kt
+++ b/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestPushFromPushGateway.kt
@@ -41,7 +41,7 @@ class TestPushFromPushGateway @Inject constructor(private val context: FragmentA
private val errorFormatter: ErrorFormatter,
private val pushersManager: PushersManager,
private val activeSessionHolder: ActiveSessionHolder) :
- TroubleshootTest(R.string.settings_troubleshoot_test_push_loop_title) {
+ TroubleshootTest(R.string.settings_troubleshoot_test_push_loop_title) {
private var action: Job? = null
private var pushReceived: Boolean = false
diff --git a/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestTokenRegistration.kt b/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestTokenRegistration.kt
index 913b5491ea..f0199ad390 100644
--- a/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestTokenRegistration.kt
+++ b/vector/src/gplay/java/im/vector/app/gplay/features/settings/troubleshoot/TestTokenRegistration.kt
@@ -37,7 +37,7 @@ class TestTokenRegistration @Inject constructor(private val context: FragmentAct
private val stringProvider: StringProvider,
private val pushersManager: PushersManager,
private val activeSessionHolder: ActiveSessionHolder) :
- TroubleshootTest(R.string.settings_troubleshoot_test_token_registration_title) {
+ TroubleshootTest(R.string.settings_troubleshoot_test_token_registration_title) {
override fun perform(activityResultLauncher: ActivityResultLauncher) {
// Check if we have a registered pusher for this token
diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml
index eada664216..20b7c4908a 100644
--- a/vector/src/main/AndroidManifest.xml
+++ b/vector/src/main/AndroidManifest.xml
@@ -375,6 +375,12 @@
android:exported="false"
android:foregroundServiceType="location" />
+
+
, S : MavericksState> hiltMavericksViewModelFactory() = HiltMavericksViewModelFactory(VM::class.java)
class HiltMavericksViewModelFactory, S : MavericksState>(
- private val viewModelClass: Class>
+ private val viewModelClass: Class>
) : MavericksViewModelFactory {
override fun create(viewModelContext: ViewModelContext, state: S): VM {
diff --git a/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt b/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt
index b87b7f0286..024d283c4c 100644
--- a/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt
+++ b/vector/src/main/java/im/vector/app/core/dialogs/ExportKeysDialog.kt
@@ -35,7 +35,7 @@ class ExportKeysDialog {
val textWatcher = object : SimpleTextWatcher() {
override fun afterTextChanged(s: Editable) {
when {
- views.exportDialogEt.text.isNullOrEmpty() -> {
+ views.exportDialogEt.text.isNullOrEmpty() -> {
views.exportDialogSubmit.isEnabled = false
views.exportDialogTilConfirm.error = null
}
@@ -43,7 +43,7 @@ class ExportKeysDialog {
views.exportDialogSubmit.isEnabled = true
views.exportDialogTilConfirm.error = null
}
- else -> {
+ else -> {
views.exportDialogSubmit.isEnabled = false
views.exportDialogTilConfirm.error = activity.getString(R.string.passphrase_passphrase_does_not_match)
}
diff --git a/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItem.kt b/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItem.kt
index 0af342641e..90e81ceb26 100644
--- a/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItem.kt
+++ b/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItem.kt
@@ -32,6 +32,7 @@ abstract class ProfileMatrixItem : BaseProfileMatrixItem(R.id.matrixItemTitle)
val subtitleView by bind(R.id.matrixItemSubtitle)
+ val ignoredUserView by bind(R.id.matrixItemIgnored)
val powerLabel by bind(R.id.matrixItemPowerLevelLabel)
val presenceImageView by bind(R.id.matrixItemPresenceImageView)
val avatarImageView by bind(R.id.matrixItemAvatar)
diff --git a/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItemWithPowerLevel.kt b/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItemWithPowerLevel.kt
index 12189dc8f4..453f402496 100644
--- a/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItemWithPowerLevel.kt
+++ b/vector/src/main/java/im/vector/app/core/epoxy/profiles/ProfileMatrixItemWithPowerLevel.kt
@@ -26,11 +26,13 @@ import im.vector.app.core.extensions.setTextOrHide
@EpoxyModelClass(layout = R.layout.item_profile_matrix_item)
abstract class ProfileMatrixItemWithPowerLevel : ProfileMatrixItem() {
+ @EpoxyAttribute var ignoredUser: Boolean = false
@EpoxyAttribute var powerLevelLabel: CharSequence? = null
override fun bind(holder: Holder) {
super.bind(holder)
holder.editableView.isVisible = false
+ holder.ignoredUserView.isVisible = ignoredUser
holder.powerLabel.setTextOrHide(powerLevelLabel)
}
}
diff --git a/vector/src/main/java/im/vector/app/core/extensions/Session.kt b/vector/src/main/java/im/vector/app/core/extensions/Session.kt
index 87ed51522f..f89ba4c47a 100644
--- a/vector/src/main/java/im/vector/app/core/extensions/Session.kt
+++ b/vector/src/main/java/im/vector/app/core/extensions/Session.kt
@@ -74,8 +74,8 @@ fun Session.cannotLogoutSafely(): Boolean {
return hasUnsavedKeys() ||
// has local cross signing keys
(cryptoService().crossSigningService().allPrivateKeysKnown() &&
- // That are not backed up
- !sharedSecretStorageService.isRecoverySetup())
+ // That are not backed up
+ !sharedSecretStorageService.isRecoverySetup())
}
fun Session.vectorStore(context: Context) = VectorSessionStore(context, myUserId)
diff --git a/vector/src/main/java/im/vector/app/core/extensions/View.kt b/vector/src/main/java/im/vector/app/core/extensions/View.kt
index 7ec86d3508..4b21063f0b 100644
--- a/vector/src/main/java/im/vector/app/core/extensions/View.kt
+++ b/vector/src/main/java/im/vector/app/core/extensions/View.kt
@@ -32,3 +32,12 @@ fun View.showKeyboard(andRequestFocus: Boolean = false) {
val imm = context?.getSystemService()
imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
+
+fun View.setHorizontalPadding(padding: Int) {
+ setPadding(
+ padding,
+ paddingTop,
+ padding,
+ paddingBottom
+ )
+}
diff --git a/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt b/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt
index e61f81de55..e7ced6b335 100644
--- a/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt
+++ b/vector/src/main/java/im/vector/app/core/glide/AvatarPlaceholder.kt
@@ -43,7 +43,7 @@ class AvatarPlaceholderModelLoaderFactory(private val context: Context) : ModelL
}
class AvatarPlaceholderModelLoader(private val context: Context) :
- ModelLoader {
+ ModelLoader {
override fun buildLoadData(model: AvatarPlaceholder, width: Int, height: Int, options: Options): ModelLoader.LoadData? {
return ModelLoader.LoadData(ObjectKey(model), AvatarPlaceholderDataFetcher(context, model))
@@ -55,7 +55,7 @@ class AvatarPlaceholderModelLoader(private val context: Context) :
}
class AvatarPlaceholderDataFetcher(context: Context, private val data: AvatarPlaceholder) :
- DataFetcher {
+ DataFetcher {
private val avatarRenderer = context.singletonEntryPoint().avatarRenderer()
diff --git a/vector/src/main/java/im/vector/app/core/glide/VectorGlideModelLoader.kt b/vector/src/main/java/im/vector/app/core/glide/VectorGlideModelLoader.kt
index 6b42e3fff8..c53db12b6b 100644
--- a/vector/src/main/java/im/vector/app/core/glide/VectorGlideModelLoader.kt
+++ b/vector/src/main/java/im/vector/app/core/glide/VectorGlideModelLoader.kt
@@ -49,7 +49,7 @@ class VectorGlideModelLoaderFactory(private val context: Context) : ModelLoaderF
}
class VectorGlideModelLoader(private val context: Context) :
- ModelLoader {
+ ModelLoader {
override fun handles(model: ImageContentRenderer.Data): Boolean {
// Always handle
return true
@@ -64,7 +64,7 @@ class VectorGlideDataFetcher(context: Context,
private val data: ImageContentRenderer.Data,
private val width: Int,
private val height: Int) :
- DataFetcher {
+ DataFetcher {
private val localFilesHelper = LocalFilesHelper(context)
private val activeSessionHolder = context.singletonEntryPoint().activeSessionHolder()
diff --git a/vector/src/main/java/im/vector/app/core/platform/ButtonStateView.kt b/vector/src/main/java/im/vector/app/core/platform/ButtonStateView.kt
index e7e91dbfd9..7bedeaa4ff 100755
--- a/vector/src/main/java/im/vector/app/core/platform/ButtonStateView.kt
+++ b/vector/src/main/java/im/vector/app/core/platform/ButtonStateView.kt
@@ -29,7 +29,7 @@ import im.vector.app.core.epoxy.onClick
import im.vector.app.databinding.ViewButtonStateBinding
class ButtonStateView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
- FrameLayout(context, attrs, defStyle) {
+ FrameLayout(context, attrs, defStyle) {
sealed class State {
object Button : State()
diff --git a/vector/src/main/java/im/vector/app/core/platform/MaxHeightScrollView.kt b/vector/src/main/java/im/vector/app/core/platform/MaxHeightScrollView.kt
index 8d4c5d8950..da15d4413d 100644
--- a/vector/src/main/java/im/vector/app/core/platform/MaxHeightScrollView.kt
+++ b/vector/src/main/java/im/vector/app/core/platform/MaxHeightScrollView.kt
@@ -25,7 +25,7 @@ import im.vector.app.R
private const val DEFAULT_MAX_HEIGHT = 200
class MaxHeightScrollView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
- NestedScrollView(context, attrs, defStyle) {
+ NestedScrollView(context, attrs, defStyle) {
var maxHeight: Int = 0
set(value) {
diff --git a/vector/src/main/java/im/vector/app/core/platform/StateView.kt b/vector/src/main/java/im/vector/app/core/platform/StateView.kt
index b3d42dc38f..a70bf54aa1 100755
--- a/vector/src/main/java/im/vector/app/core/platform/StateView.kt
+++ b/vector/src/main/java/im/vector/app/core/platform/StateView.kt
@@ -27,7 +27,7 @@ import im.vector.app.core.extensions.updateConstraintSet
import im.vector.app.databinding.ViewStateBinding
class StateView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
- FrameLayout(context, attrs, defStyle) {
+ FrameLayout(context, attrs, defStyle) {
sealed class State {
object Content : State()
diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
index 4796022856..febcfc5ef2 100644
--- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
+++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
@@ -46,6 +46,7 @@ import androidx.viewbinding.ViewBinding
import com.airbnb.mvrx.MavericksView
import com.bumptech.glide.util.Util
import com.google.android.material.appbar.MaterialToolbar
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import dagger.hilt.android.EntryPointAccessors
import im.vector.app.BuildConfig
@@ -86,6 +87,7 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.failure.GlobalError
+import org.matrix.android.sdk.api.failure.InitialSyncRequestReason
import reactivecircus.flowbinding.android.view.clicks
import timber.log.Timber
import javax.inject.Inject
@@ -266,9 +268,27 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver
is GlobalError.CertificateError ->
handleCertificateError(globalError)
GlobalError.ExpiredAccount -> Unit // TODO Handle account expiration
+ is GlobalError.InitialSyncRequest -> handleInitialSyncRequest(globalError)
}
}
+ private fun handleInitialSyncRequest(initialSyncRequest: GlobalError.InitialSyncRequest) {
+ MaterialAlertDialogBuilder(this)
+ .setTitle(R.string.initial_sync_request_title)
+ .setMessage(
+ getString(R.string.initial_sync_request_content, getString(
+ when (initialSyncRequest.reason) {
+ InitialSyncRequestReason.IGNORED_USERS_LIST_CHANGE -> R.string.initial_sync_request_reason_unignored_users
+ }
+ ))
+ )
+ .setPositiveButton(R.string.ok) { _, _ ->
+ MainActivity.restartApp(this, MainActivityArgs(clearCache = true))
+ }
+ .setNegativeButton(R.string.later, null)
+ .show()
+ }
+
private fun handleCertificateError(certificateError: GlobalError.CertificateError) {
singletonEntryPoint()
.unrecognizedCertificateDialog()
diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt
index 70b265ff9f..7db35a8e8f 100644
--- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt
+++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseFragment.kt
@@ -83,8 +83,8 @@ abstract class VectorBaseFragment : Fragment(), MavericksView
* [ToolbarConfig] instance from host activity
* */
protected var toolbar: ToolbarConfig? = null
- get() = (activity as? VectorBaseActivity<*>)?.toolbar
- private set
+ get() = (activity as? VectorBaseActivity<*>)?.toolbar
+ private set
/* ==========================================================================================
* View model
* ========================================================================================== */
diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorEventViewModel.kt b/vector/src/main/java/im/vector/app/core/platform/VectorEventViewModel.kt
index 9ab46557a5..2b47412901 100644
--- a/vector/src/main/java/im/vector/app/core/platform/VectorEventViewModel.kt
+++ b/vector/src/main/java/im/vector/app/core/platform/VectorEventViewModel.kt
@@ -26,4 +26,4 @@ interface VectorSharedAction
* Parent class to handle navigation events, action events, or other any events
*/
open class VectorSharedActionViewModel(private val store: MutableDataSource = PublishDataSource()) :
- ViewModel(), MutableDataSource by store
+ ViewModel(), MutableDataSource by store
diff --git a/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt b/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt
index b57bb27671..6101f8a597 100644
--- a/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt
+++ b/vector/src/main/java/im/vector/app/core/preference/KeywordPreference.kt
@@ -139,7 +139,7 @@ class KeywordPreference : VectorPreference {
keyword.contains("/") -> {
context.getString(R.string.settings_notification_keyword_contains_invalid_character, "/")
}
- else -> null
+ else -> null
}
chipTextInputLayout.isErrorEnabled = errorMessage != null
diff --git a/vector/src/main/java/im/vector/app/core/resources/LocaleProvider.kt b/vector/src/main/java/im/vector/app/core/resources/LocaleProvider.kt
index fdb5f21b61..2f1b46b555 100644
--- a/vector/src/main/java/im/vector/app/core/resources/LocaleProvider.kt
+++ b/vector/src/main/java/im/vector/app/core/resources/LocaleProvider.kt
@@ -32,6 +32,6 @@ class LocaleProvider @Inject constructor(private val resources: Resources) {
fun LocaleProvider.isEnglishSpeaking() = current().language.startsWith("en")
-fun LocaleProvider.getLayoutDirectionFromCurrentLocale() = TextUtils.getLayoutDirectionFromLocale(current())
+fun LocaleProvider.getLayoutDirectionFromCurrentLocale() = TextUtils.getLayoutDirectionFromLocale(current())
fun LocaleProvider.isRTL() = getLayoutDirectionFromCurrentLocale() == View.LAYOUT_DIRECTION_RTL
diff --git a/vector/src/main/java/im/vector/app/core/ui/bottomsheet/BottomSheetGenericController.kt b/vector/src/main/java/im/vector/app/core/ui/bottomsheet/BottomSheetGenericController.kt
index 6e92549809..70faa87645 100644
--- a/vector/src/main/java/im/vector/app/core/ui/bottomsheet/BottomSheetGenericController.kt
+++ b/vector/src/main/java/im/vector/app/core/ui/bottomsheet/BottomSheetGenericController.kt
@@ -21,7 +21,7 @@ import com.airbnb.epoxy.TypedEpoxyController
* Epoxy controller for generic bottom sheet actions
*/
abstract class BottomSheetGenericController :
- TypedEpoxyController() {
+ TypedEpoxyController() {
var listener: Listener? = null
diff --git a/vector/src/main/java/im/vector/app/core/ui/views/PasswordStrengthBar.kt b/vector/src/main/java/im/vector/app/core/ui/views/PasswordStrengthBar.kt
index a984707bf7..39bfce6975 100644
--- a/vector/src/main/java/im/vector/app/core/ui/views/PasswordStrengthBar.kt
+++ b/vector/src/main/java/im/vector/app/core/ui/views/PasswordStrengthBar.kt
@@ -36,7 +36,7 @@ class PasswordStrengthBar @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0) :
- LinearLayout(context, attrs, defStyleAttr) {
+ LinearLayout(context, attrs, defStyleAttr) {
private val views: ViewPasswordStrengthBarBinding
diff --git a/vector/src/main/java/im/vector/app/core/ui/views/TypingMessageDotsView.kt b/vector/src/main/java/im/vector/app/core/ui/views/TypingMessageDotsView.kt
index bc06254b0d..2e9945c8d7 100644
--- a/vector/src/main/java/im/vector/app/core/ui/views/TypingMessageDotsView.kt
+++ b/vector/src/main/java/im/vector/app/core/ui/views/TypingMessageDotsView.kt
@@ -30,7 +30,7 @@ import androidx.core.view.setMargins
import im.vector.app.R
class TypingMessageDotsView(context: Context, attrs: AttributeSet) :
- LinearLayout(context, attrs) {
+ LinearLayout(context, attrs) {
companion object {
const val DEFAULT_CIRCLE_DURATION = 1000L
diff --git a/vector/src/main/java/im/vector/app/features/VectorFeatures.kt b/vector/src/main/java/im/vector/app/features/VectorFeatures.kt
index b2a62a42d3..9d54475e8c 100644
--- a/vector/src/main/java/im/vector/app/features/VectorFeatures.kt
+++ b/vector/src/main/java/im/vector/app/features/VectorFeatures.kt
@@ -27,6 +27,7 @@ interface VectorFeatures {
fun isOnboardingPersonalizeEnabled(): Boolean
fun isOnboardingCombinedRegisterEnabled(): Boolean
fun isLiveLocationEnabled(): Boolean
+ fun isScreenSharingEnabled(): Boolean
enum class OnboardingVariant {
LEGACY,
@@ -43,4 +44,5 @@ class DefaultVectorFeatures : VectorFeatures {
override fun isOnboardingPersonalizeEnabled() = false
override fun isOnboardingCombinedRegisterEnabled() = false
override fun isLiveLocationEnabled(): Boolean = false
+ override fun isScreenSharingEnabled(): Boolean = false
}
diff --git a/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsOptInFragment.kt b/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsOptInFragment.kt
index f112ba4659..320386aebd 100644
--- a/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsOptInFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/analytics/ui/consent/AnalyticsOptInFragment.kt
@@ -31,7 +31,7 @@ import im.vector.app.databinding.FragmentAnalyticsOptinBinding
import javax.inject.Inject
class AnalyticsOptInFragment @Inject constructor() :
- VectorBaseFragment(),
+ VectorBaseFragment(),
OnBackPressed {
// Share the view model with the Activity so that the Activity
diff --git a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewViewModel.kt b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewViewModel.kt
index 3e9d72e98b..81f0994899 100644
--- a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewViewModel.kt
@@ -20,7 +20,7 @@ package im.vector.app.features.attachments.preview
import im.vector.app.core.platform.VectorViewModel
class AttachmentsPreviewViewModel(initialState: AttachmentsPreviewViewState) :
- VectorViewModel(initialState) {
+ VectorViewModel(initialState) {
override fun handle(action: AttachmentsPreviewAction) {
when (action) {
diff --git a/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt b/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt
index 501af00ad2..bd44a5b9cd 100644
--- a/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/auth/PromptFragment.kt
@@ -65,7 +65,7 @@ class PromptFragment : VectorBaseFragment() {
override fun invalidate() = withState(viewModel) {
when (it.flowType) {
- LoginFlowTypes.SSO -> {
+ LoginFlowTypes.SSO -> {
views.passwordFieldTil.isVisible = false
views.reAuthConfirmButton.text = getString(R.string.auth_login_sso)
}
diff --git a/vector/src/main/java/im/vector/app/features/auth/ReAuthActivity.kt b/vector/src/main/java/im/vector/app/features/auth/ReAuthActivity.kt
index 78c6cbb021..f92ec8ea9e 100644
--- a/vector/src/main/java/im/vector/app/features/auth/ReAuthActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/auth/ReAuthActivity.kt
@@ -86,10 +86,10 @@ class ReAuthActivity : SimpleFragmentActivity() {
sharedViewModel.observeViewEvents {
when (it) {
- is ReAuthEvents.OpenSsoURl -> {
+ is ReAuthEvents.OpenSsoURl -> {
openInCustomTab(it.url)
}
- ReAuthEvents.Dismiss -> {
+ ReAuthEvents.Dismiss -> {
setResult(RESULT_CANCELED)
finish()
}
@@ -205,7 +205,7 @@ class ReAuthActivity : SimpleFragmentActivity() {
LoginFlowTypes.PASSWORD -> {
LoginFlowTypes.PASSWORD
}
- LoginFlowTypes.SSO -> {
+ LoginFlowTypes.SSO -> {
LoginFlowTypes.SSO
}
else -> {
diff --git a/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt b/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt
index fcc2a59ef8..16aca5cfeb 100644
--- a/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/auth/ReAuthViewModel.kt
@@ -42,7 +42,7 @@ class ReAuthViewModel @AssistedInject constructor(
override fun handle(action: ReAuthActions) = withState { state ->
when (action) {
- ReAuthActions.StartSSOFallback -> {
+ ReAuthActions.StartSSOFallback -> {
if (state.flowType == LoginFlowTypes.SSO) {
setState { copy(ssoFallbackPageWasShown = true) }
val ssoURL = session.getUiaSsoFallbackUrl(initialState.session ?: "")
@@ -55,7 +55,7 @@ class ReAuthViewModel @AssistedInject constructor(
ReAuthActions.FallBackPageClosed -> {
// Should we do something here?
}
- is ReAuthActions.ReAuthWithPass -> {
+ is ReAuthActions.ReAuthWithPass -> {
val safeForIntentCypher = ByteArrayOutputStream().also {
it.use {
session.securelyStoreObject(action.password, initialState.resultKeyStoreAlias, it)
diff --git a/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt b/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt
index ce3b9c6a7e..a62024d99f 100644
--- a/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt
+++ b/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt
@@ -24,10 +24,10 @@ import dagger.assisted.AssistedInject
import im.vector.app.R
import im.vector.app.features.autocomplete.AutocompleteClickListener
import im.vector.app.features.autocomplete.RecyclerViewPresenter
-import org.matrix.android.sdk.api.pushrules.SenderNotificationPermissionCondition
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.api.session.pushrules.SenderNotificationPermissionCondition
import org.matrix.android.sdk.api.session.room.members.RoomMemberQueryParams
import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams
import org.matrix.android.sdk.api.session.room.model.Membership
diff --git a/vector/src/main/java/im/vector/app/features/call/CallControlsBottomSheet.kt b/vector/src/main/java/im/vector/app/features/call/CallControlsBottomSheet.kt
index e38b53c858..11a43bcd0c 100644
--- a/vector/src/main/java/im/vector/app/features/call/CallControlsBottomSheet.kt
+++ b/vector/src/main/java/im/vector/app/features/call/CallControlsBottomSheet.kt
@@ -27,6 +27,8 @@ import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.R
import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment
import im.vector.app.databinding.BottomSheetCallControlsBinding
+import im.vector.app.features.VectorFeatures
+import javax.inject.Inject
@AndroidEntryPoint
class CallControlsBottomSheet : VectorBaseBottomSheetDialogFragment() {
@@ -34,6 +36,8 @@ class CallControlsBottomSheet : VectorBaseBottomSheetDialogFragment(), CallContro
@Inject lateinit var callManager: WebRtcCallManager
@Inject lateinit var avatarRenderer: AvatarRenderer
+ @Inject lateinit var screenCaptureServiceConnection: ScreenCaptureServiceConnection
private val callViewModel: VectorCallViewModel by viewModel()
@@ -512,20 +516,22 @@ class VectorCallActivity : VectorBaseActivity(), CallContro
private fun handleViewEvents(event: VectorCallViewEvents?) {
Timber.tag(loggerTag.value).v("handleViewEvents $event")
when (event) {
- is VectorCallViewEvents.ConnectionTimeout -> {
+ is VectorCallViewEvents.ConnectionTimeout -> {
onErrorTimoutConnect(event.turn)
}
- is VectorCallViewEvents.ShowDialPad -> {
+ is VectorCallViewEvents.ShowDialPad -> {
CallDialPadBottomSheet.newInstance(false).apply {
callback = dialPadCallback
}.show(supportFragmentManager, FRAGMENT_DIAL_PAD_TAG)
}
- is VectorCallViewEvents.ShowCallTransferScreen -> {
+ is VectorCallViewEvents.ShowCallTransferScreen -> {
val callId = withState(callViewModel) { it.callId }
navigator.openCallTransfer(this, callTransferActivityResultLauncher, callId)
}
- is VectorCallViewEvents.FailToTransfer -> showSnackbar(getString(R.string.call_transfer_failure))
- else -> Unit
+ is VectorCallViewEvents.FailToTransfer -> showSnackbar(getString(R.string.call_transfer_failure))
+ is VectorCallViewEvents.ShowScreenSharingPermissionDialog -> handleShowScreenSharingPermissionDialog()
+ is VectorCallViewEvents.StopScreenSharingService -> handleStopScreenSharingService()
+ else -> Unit
}
}
@@ -628,6 +634,32 @@ class VectorCallActivity : VectorBaseActivity(), CallContro
}
}
+ private val screenSharingPermissionActivityResultLauncher = registerStartForActivityResult { activityResult ->
+ if (activityResult.resultCode == Activity.RESULT_OK) {
+ callViewModel.handle(VectorCallViewActions.StartScreenSharing)
+ // We need to start a foreground service with a sticky notification during screen sharing
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ ContextCompat.startForegroundService(
+ this,
+ Intent(this, ScreenCaptureService::class.java)
+ )
+ screenCaptureServiceConnection.bind()
+ }
+ }
+ }
+
+ private fun handleShowScreenSharingPermissionDialog() {
+ getSystemService()?.let {
+ navigator.openScreenSharingPermissionDialog(it.createScreenCaptureIntent(), screenSharingPermissionActivityResultLauncher)
+ }
+ }
+
+ private fun handleStopScreenSharingService() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ screenCaptureServiceConnection.stopScreenCapturing()
+ }
+ }
+
companion object {
private const val EXTRA_MODE = "EXTRA_MODE"
private const val FRAGMENT_DIAL_PAD_TAG = "FRAGMENT_DIAL_PAD_TAG"
diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewActions.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewActions.kt
index d1ed961814..c84f733b9a 100644
--- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewActions.kt
+++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewActions.kt
@@ -40,4 +40,6 @@ sealed class VectorCallViewActions : VectorViewModelAction {
object CallTransferSelectionCancelled : VectorCallViewActions()
data class CallTransferSelectionResult(val callTransferResult: CallTransferResult) : VectorCallViewActions()
object TransferCall : VectorCallViewActions()
+ object ToggleScreenSharing : VectorCallViewActions()
+ object StartScreenSharing : VectorCallViewActions()
}
diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewEvents.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewEvents.kt
index 7c29d7eea3..52510f6f8b 100644
--- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewEvents.kt
+++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewEvents.kt
@@ -27,10 +27,10 @@ sealed class VectorCallViewEvents : VectorViewEvents {
val available: Set,
val current: CallAudioManager.Device
) : VectorCallViewEvents()
+
object ShowDialPad : VectorCallViewEvents()
object ShowCallTransferScreen : VectorCallViewEvents()
object FailToTransfer : VectorCallViewEvents()
-// data class CallAnswered(val content: CallAnswerContent) : VectorCallViewEvents()
-// data class CallHangup(val content: CallHangupContent) : VectorCallViewEvents()
-// object CallAccepted : VectorCallViewEvents()
+ object ShowScreenSharingPermissionDialog : VectorCallViewEvents()
+ object StopScreenSharingService : VectorCallViewEvents()
}
diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt
index b9bf578daa..3b7baef155 100644
--- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewModel.kt
@@ -256,27 +256,30 @@ class VectorCallViewModel @AssistedInject constructor(
override fun handle(action: VectorCallViewActions) = withState { state ->
when (action) {
- VectorCallViewActions.EndCall -> call?.endCall()
- VectorCallViewActions.AcceptCall -> {
+ VectorCallViewActions.EndCall -> {
+ call?.endCall()
+ _viewEvents.post(VectorCallViewEvents.StopScreenSharingService)
+ }
+ VectorCallViewActions.AcceptCall -> {
setState {
copy(callState = Loading())
}
call?.acceptIncomingCall()
}
- VectorCallViewActions.DeclineCall -> {
+ VectorCallViewActions.DeclineCall -> {
setState {
copy(callState = Loading())
}
call?.endCall()
}
- VectorCallViewActions.ToggleMute -> {
+ VectorCallViewActions.ToggleMute -> {
val muted = state.isAudioMuted
call?.muteCall(!muted)
setState {
copy(isAudioMuted = !muted)
}
}
- VectorCallViewActions.ToggleVideo -> {
+ VectorCallViewActions.ToggleVideo -> {
if (state.isVideoCall) {
val videoEnabled = state.isVideoEnabled
call?.enableVideo(!videoEnabled)
@@ -286,19 +289,19 @@ class VectorCallViewModel @AssistedInject constructor(
}
Unit
}
- VectorCallViewActions.ToggleHoldResume -> {
+ VectorCallViewActions.ToggleHoldResume -> {
val isRemoteOnHold = state.isRemoteOnHold
call?.updateRemoteOnHold(!isRemoteOnHold)
}
- is VectorCallViewActions.ChangeAudioDevice -> {
+ is VectorCallViewActions.ChangeAudioDevice -> {
callManager.audioManager.setAudioDevice(action.device)
}
- VectorCallViewActions.SwitchSoundDevice -> {
+ VectorCallViewActions.SwitchSoundDevice -> {
_viewEvents.post(
VectorCallViewEvents.ShowSoundDeviceChooser(state.availableDevices, state.device)
)
}
- VectorCallViewActions.HeadSetButtonPressed -> {
+ VectorCallViewActions.HeadSetButtonPressed -> {
if (state.callState.invoke() is CallState.LocalRinging) {
// accept call
call?.acceptIncomingCall()
@@ -309,20 +312,20 @@ class VectorCallViewModel @AssistedInject constructor(
}
Unit
}
- VectorCallViewActions.ToggleCamera -> {
+ VectorCallViewActions.ToggleCamera -> {
call?.switchCamera()
}
- VectorCallViewActions.ToggleHDSD -> {
+ VectorCallViewActions.ToggleHDSD -> {
if (!state.isVideoCall) return@withState
call?.setCaptureFormat(if (state.isHD) CaptureFormat.SD else CaptureFormat.HD)
}
- VectorCallViewActions.OpenDialPad -> {
+ VectorCallViewActions.OpenDialPad -> {
_viewEvents.post(VectorCallViewEvents.ShowDialPad)
}
- is VectorCallViewActions.SendDtmfDigit -> {
+ is VectorCallViewActions.SendDtmfDigit -> {
call?.sendDtmfDigit(action.digit)
}
- VectorCallViewActions.InitiateCallTransfer -> {
+ VectorCallViewActions.InitiateCallTransfer -> {
call?.updateRemoteOnHold(true)
_viewEvents.post(
VectorCallViewEvents.ShowCallTransferScreen
@@ -334,13 +337,38 @@ class VectorCallViewModel @AssistedInject constructor(
is VectorCallViewActions.CallTransferSelectionResult -> {
handleCallTransferSelectionResult(action.callTransferResult)
}
- VectorCallViewActions.TransferCall -> {
+ VectorCallViewActions.TransferCall -> {
handleCallTransfer()
}
- is VectorCallViewActions.SwitchCall -> {
+ is VectorCallViewActions.SwitchCall -> {
setState { VectorCallViewState(action.callArgs) }
setupCallWithCurrentState()
}
+ is VectorCallViewActions.ToggleScreenSharing -> {
+ handleToggleScreenSharing(state.isSharingScreen)
+ }
+ is VectorCallViewActions.StartScreenSharing -> {
+ call?.startSharingScreen()
+ setState {
+ copy(isSharingScreen = true)
+ }
+ }
+ }
+ }
+
+ private fun handleToggleScreenSharing(isSharingScreen: Boolean) {
+ if (isSharingScreen) {
+ call?.stopSharingScreen()
+ setState {
+ copy(isSharingScreen = false)
+ }
+ _viewEvents.post(
+ VectorCallViewEvents.StopScreenSharingService
+ )
+ } else {
+ _viewEvents.post(
+ VectorCallViewEvents.ShowScreenSharingPermissionDialog
+ )
}
}
diff --git a/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt b/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt
index 2d33cbf9b9..2cd819b5f5 100644
--- a/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt
+++ b/vector/src/main/java/im/vector/app/features/call/VectorCallViewState.kt
@@ -42,7 +42,8 @@ data class VectorCallViewState(
val callInfo: CallInfo? = null,
val formattedDuration: String = "",
val canOpponentBeTransferred: Boolean = false,
- val transferee: TransfereeState = TransfereeState.NoTransferee
+ val transferee: TransfereeState = TransfereeState.NoTransferee,
+ val isSharingScreen: Boolean = false
) : MavericksState {
sealed class TransfereeState {
diff --git a/vector/src/main/java/im/vector/app/features/call/audio/API23AudioDeviceDetector.kt b/vector/src/main/java/im/vector/app/features/call/audio/API23AudioDeviceDetector.kt
index 7e12987a6b..ccf79cc02d 100644
--- a/vector/src/main/java/im/vector/app/features/call/audio/API23AudioDeviceDetector.kt
+++ b/vector/src/main/java/im/vector/app/features/call/audio/API23AudioDeviceDetector.kt
@@ -32,10 +32,11 @@ internal class API23AudioDeviceDetector(private val audioManager: AudioManager,
val deviceInfos = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
for (info in deviceInfos) {
when (info.type) {
- AudioDeviceInfo.TYPE_BLUETOOTH_SCO -> devices.add(CallAudioManager.Device.WirelessHeadset(info.productName.toString()))
- AudioDeviceInfo.TYPE_BUILTIN_EARPIECE -> devices.add(CallAudioManager.Device.Phone)
- AudioDeviceInfo.TYPE_BUILTIN_SPEAKER -> devices.add(CallAudioManager.Device.Speaker)
- AudioDeviceInfo.TYPE_WIRED_HEADPHONES, AudioDeviceInfo.TYPE_WIRED_HEADSET, TYPE_USB_HEADSET -> devices.add(CallAudioManager.Device.Headset)
+ AudioDeviceInfo.TYPE_BLUETOOTH_SCO -> devices.add(CallAudioManager.Device.WirelessHeadset(info.productName.toString()))
+ AudioDeviceInfo.TYPE_BUILTIN_EARPIECE -> devices.add(CallAudioManager.Device.Phone)
+ AudioDeviceInfo.TYPE_BUILTIN_SPEAKER -> devices.add(CallAudioManager.Device.Speaker)
+ AudioDeviceInfo.TYPE_WIRED_HEADPHONES,
+ AudioDeviceInfo.TYPE_WIRED_HEADSET, TYPE_USB_HEADSET -> devices.add(CallAudioManager.Device.Headset)
}
}
callAudioManager.replaceDevices(devices)
diff --git a/vector/src/main/java/im/vector/app/features/call/audio/DefaultAudioDeviceRouter.kt b/vector/src/main/java/im/vector/app/features/call/audio/DefaultAudioDeviceRouter.kt
index fd85ce075f..c3500c7bc2 100644
--- a/vector/src/main/java/im/vector/app/features/call/audio/DefaultAudioDeviceRouter.kt
+++ b/vector/src/main/java/im/vector/app/features/call/audio/DefaultAudioDeviceRouter.kt
@@ -95,7 +95,7 @@ class DefaultAudioDeviceRouter(private val audioManager: AudioManager,
override fun onAudioFocusChange(focusChange: Int) {
callAudioManager.runInAudioThread {
when (focusChange) {
- AudioManager.AUDIOFOCUS_GAIN -> {
+ AudioManager.AUDIOFOCUS_GAIN -> {
Timber.d(" Audio focus gained")
if (audioFocusLost) {
callAudioManager.resetAudioRoute()
diff --git a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt
index eadccab4f6..80c4e93306 100644
--- a/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt
+++ b/vector/src/main/java/im/vector/app/features/call/dialpad/DialPadLookup.kt
@@ -49,7 +49,7 @@ class DialPadLookup @Inject constructor(
}
session.getExistingDirectRoomWithUser(nativeUserId)
// if there is not, just create a DM with the sip user
- ?: directRoomHelper.ensureDMExists(sipUserId)
+ ?: directRoomHelper.ensureDMExists(sipUserId)
} else {
// do the same if there is no corresponding native user.
directRoomHelper.ensureDMExists(sipUserId)
diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
index b10353be13..81173568b5 100644
--- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferActivity.kt
@@ -70,7 +70,6 @@ class CallTransferActivity : VectorBaseActivity() {
}.attach()
setupToolbar(views.callTransferToolbar)
.allowBack()
- views.callTransferToolbar.title = getString(R.string.call_transfer_title)
setupConnectAction()
}
diff --git a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferViewModel.kt b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferViewModel.kt
index 1765b58a02..67f0949dcf 100644
--- a/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/call/transfer/CallTransferViewModel.kt
@@ -31,7 +31,7 @@ import org.matrix.android.sdk.api.session.call.MxCall
class CallTransferViewModel @AssistedInject constructor(@Assisted initialState: CallTransferViewState,
private val callManager: WebRtcCallManager) :
- VectorViewModel(initialState) {
+ VectorViewModel(initialState) {
@AssistedFactory
interface Factory : MavericksAssistedViewModelFactory {
@@ -62,5 +62,5 @@ class CallTransferViewModel @AssistedInject constructor(@Assisted initialState:
call?.removeListener(callListener)
}
- override fun handle(action: EmptyAction) { }
+ override fun handle(action: EmptyAction) {}
}
diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/PeerConnectionObserver.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/PeerConnectionObserver.kt
index 99c26c5ebe..c776951f93 100644
--- a/vector/src/main/java/im/vector/app/features/call/webrtc/PeerConnectionObserver.kt
+++ b/vector/src/main/java/im/vector/app/features/call/webrtc/PeerConnectionObserver.kt
@@ -37,13 +37,13 @@ class PeerConnectionObserver(private val webRtcCall: WebRtcCall) : PeerConnectio
* Every ICE transport used by the connection is either in use (state "connected" or "completed")
* or is closed (state "closed"); in addition, at least one transport is either "connected" or "completed"
*/
- PeerConnection.PeerConnectionState.CONNECTED -> {
+ PeerConnection.PeerConnectionState.CONNECTED -> {
webRtcCall.mxCall.state = CallState.Connected(MxPeerConnectionState.CONNECTED)
}
/**
* One or more of the ICE transports on the connection is in the "failed" state.
*/
- PeerConnection.PeerConnectionState.FAILED -> {
+ PeerConnection.PeerConnectionState.FAILED -> {
// This can be temporary, e.g when other ice not yet received...
// webRtcCall.mxCall.state = CallState.ERROR
webRtcCall.mxCall.state = CallState.Connected(MxPeerConnectionState.FAILED)
@@ -58,7 +58,7 @@ class PeerConnectionObserver(private val webRtcCall: WebRtcCall) : PeerConnectio
* One or more of the ICE transports are currently in the process of establishing a connection;
* that is, their RTCIceConnectionState is either "checking" or "connected", and no transports are in the "failed" state
*/
- PeerConnection.PeerConnectionState.CONNECTING -> {
+ PeerConnection.PeerConnectionState.CONNECTING -> {
webRtcCall.mxCall.state = CallState.Connected(MxPeerConnectionState.CONNECTING)
}
/**
@@ -66,7 +66,7 @@ class PeerConnectionObserver(private val webRtcCall: WebRtcCall) : PeerConnectio
* This value was in the RTCSignalingState enum (and therefore found by reading the value of the signalingState)
* property until the May 13, 2016 draft of the specification.
*/
- PeerConnection.PeerConnectionState.CLOSED -> {
+ PeerConnection.PeerConnectionState.CLOSED -> {
webRtcCall.mxCall.state = CallState.Connected(MxPeerConnectionState.CLOSED)
}
/**
@@ -76,7 +76,7 @@ class PeerConnectionObserver(private val webRtcCall: WebRtcCall) : PeerConnectio
PeerConnection.PeerConnectionState.DISCONNECTED -> {
webRtcCall.mxCall.state = CallState.Connected(MxPeerConnectionState.DISCONNECTED)
}
- null -> {
+ null -> {
}
}
}
@@ -101,14 +101,14 @@ class PeerConnectionObserver(private val webRtcCall: WebRtcCall) : PeerConnectio
* the ICE agent is gathering addresses or is waiting to be given remote candidates through
* calls to RTCPeerConnection.addIceCandidate() (or both).
*/
- PeerConnection.IceConnectionState.NEW -> {
+ PeerConnection.IceConnectionState.NEW -> {
}
/**
* The ICE agent has been given one or more remote candidates and is checking pairs of local and remote candidates
* against one another to try to find a compatible match, but has not yet found a pair which will allow
* the peer connection to be made. It's possible that gathering of candidates is also still underway.
*/
- PeerConnection.IceConnectionState.CHECKING -> {
+ PeerConnection.IceConnectionState.CHECKING -> {
}
/**
@@ -117,7 +117,7 @@ class PeerConnectionObserver(private val webRtcCall: WebRtcCall) : PeerConnectio
* It's possible that gathering is still underway, and it's also possible that the ICE agent is still checking
* candidates against one another looking for a better connection to use.
*/
- PeerConnection.IceConnectionState.CONNECTED -> {
+ PeerConnection.IceConnectionState.CONNECTED -> {
}
/**
* Checks to ensure that components are still connected failed for at least one component of the RTCPeerConnection.
@@ -131,18 +131,18 @@ class PeerConnectionObserver(private val webRtcCall: WebRtcCall) : PeerConnectio
* compatible matches for all components of the connection.
* It is, however, possible that the ICE agent did find compatible connections for some components.
*/
- PeerConnection.IceConnectionState.FAILED -> {
+ PeerConnection.IceConnectionState.FAILED -> {
webRtcCall.onRenegotiationNeeded(restartIce = true)
}
/**
* The ICE agent has finished gathering candidates, has checked all pairs against one another, and has found a connection for all components.
*/
- PeerConnection.IceConnectionState.COMPLETED -> {
+ PeerConnection.IceConnectionState.COMPLETED -> {
}
/**
* The ICE agent for this RTCPeerConnection has shut down and is no longer handling requests.
*/
- PeerConnection.IceConnectionState.CLOSED -> {
+ PeerConnection.IceConnectionState.CLOSED -> {
}
}
}
diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureService.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureService.kt
new file mode 100644
index 0000000000..f1a4975751
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureService.kt
@@ -0,0 +1,56 @@
+/*
+ * 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.features.call.webrtc
+
+import android.content.Intent
+import android.os.Binder
+import android.os.IBinder
+import dagger.hilt.android.AndroidEntryPoint
+import im.vector.app.core.services.VectorService
+import im.vector.app.features.notifications.NotificationUtils
+import javax.inject.Inject
+
+@AndroidEntryPoint
+class ScreenCaptureService : VectorService() {
+
+ @Inject lateinit var notificationUtils: NotificationUtils
+ private val binder = LocalBinder()
+
+ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
+ showStickyNotification()
+
+ return START_STICKY
+ }
+
+ private fun showStickyNotification() {
+ val notificationId = System.currentTimeMillis().toInt()
+ val notification = notificationUtils.buildScreenSharingNotification()
+ startForeground(notificationId, notification)
+ }
+
+ override fun onBind(intent: Intent?): IBinder {
+ return binder
+ }
+
+ fun stopService() {
+ stopSelf()
+ }
+
+ inner class LocalBinder : Binder() {
+ fun getService(): ScreenCaptureService = this@ScreenCaptureService
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureServiceConnection.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureServiceConnection.kt
new file mode 100644
index 0000000000..922e9676a8
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureServiceConnection.kt
@@ -0,0 +1,54 @@
+/*
+ * 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.features.call.webrtc
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.ServiceConnection
+import android.os.IBinder
+import javax.inject.Inject
+
+class ScreenCaptureServiceConnection @Inject constructor(
+ private val context: Context
+) : ServiceConnection {
+
+ private var isBound = false
+ private var screenCaptureService: ScreenCaptureService? = null
+
+ fun bind() {
+ if (!isBound) {
+ Intent(context, ScreenCaptureService::class.java).also { intent ->
+ context.bindService(intent, this, 0)
+ }
+ }
+ }
+
+ fun stopScreenCapturing() {
+ screenCaptureService?.stopService()
+ }
+
+ override fun onServiceConnected(className: ComponentName, binder: IBinder) {
+ screenCaptureService = (binder as ScreenCaptureService.LocalBinder).getService()
+ isBound = true
+ }
+
+ override fun onServiceDisconnected(className: ComponentName) {
+ isBound = false
+ screenCaptureService = null
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt
index 90088c8475..bc8ae51a88 100644
--- a/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt
+++ b/vector/src/main/java/im/vector/app/features/call/webrtc/WebRtcCall.kt
@@ -770,6 +770,14 @@ class WebRtcCall(
return currentCaptureFormat
}
+ fun startSharingScreen() {
+ // TODO. Will be handled within the next PR.
+ }
+
+ fun stopSharingScreen() {
+ // TODO. Will be handled within the next PR.
+ }
+
private suspend fun release() {
listeners.clear()
mxCall.removeListener(this)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyFragment.kt
index 40ad1372fb..42605a850b 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/restore/KeysBackupRestoreFromKeyFragment.kt
@@ -31,7 +31,7 @@ import org.matrix.android.sdk.api.extensions.tryOrNull
import javax.inject.Inject
class KeysBackupRestoreFromKeyFragment @Inject constructor() :
- VectorBaseFragment() {
+ VectorBaseFragment() {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentKeysBackupRestoreFromKeyBinding {
return FragmentKeysBackupRestoreFromKeyBinding.inflate(inflater, container, false)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsFragment.kt
index 50d5e56483..4d3ec9a820 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/settings/KeysBackupSettingsFragment.kt
@@ -32,7 +32,7 @@ import im.vector.app.features.crypto.keysbackup.setup.KeysBackupSetupActivity
import javax.inject.Inject
class KeysBackupSettingsFragment @Inject constructor(private val keysBackupSettingsRecyclerViewController: KeysBackupSettingsRecyclerViewController) :
- VectorBaseFragment(),
+ VectorBaseFragment(),
KeysBackupSettingsRecyclerViewController.Listener {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentKeysBackupSettingsBinding {
diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
index 51d8b3a8d5..55ab672c43 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecureStorageViewModel.kt
@@ -76,7 +76,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
@Assisted private val initialState: SharedSecureStorageViewState,
private val stringProvider: StringProvider,
private val session: Session) :
- VectorViewModel(initialState) {
+ VectorViewModel(initialState) {
@AssistedFactory
interface Factory : MavericksAssistedViewModelFactory {
@@ -88,7 +88,7 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
copy(userId = session.myUserId)
}
val integrityResult = session.sharedSecretStorageService.checkShouldBeAbleToAccessSecrets(initialState.requestedSecrets, initialState.keyId)
- if (integrityResult !is IntegrityResult.Success) {
+ if (integrityResult !is IntegrityResult.Success) {
_viewEvents.post(
SharedSecureStorageViewEvent.Error(
stringProvider.getString(R.string.enter_secret_storage_invalid),
@@ -134,13 +134,13 @@ class SharedSecureStorageViewModel @AssistedInject constructor(
override fun handle(action: SharedSecureStorageAction) = withState {
when (action) {
- is SharedSecureStorageAction.Cancel -> handleCancel()
- is SharedSecureStorageAction.SubmitPassphrase -> handleSubmitPassphrase(action)
- SharedSecureStorageAction.UseKey -> handleUseKey()
- is SharedSecureStorageAction.SubmitKey -> handleSubmitKey(action)
- SharedSecureStorageAction.Back -> handleBack()
- SharedSecureStorageAction.ForgotResetAll -> handleResetAll()
- SharedSecureStorageAction.DoResetAll -> handleDoResetAll()
+ is SharedSecureStorageAction.Cancel -> handleCancel()
+ is SharedSecureStorageAction.SubmitPassphrase -> handleSubmitPassphrase(action)
+ SharedSecureStorageAction.UseKey -> handleUseKey()
+ is SharedSecureStorageAction.SubmitKey -> handleSubmitKey(action)
+ SharedSecureStorageAction.Back -> handleBack()
+ SharedSecureStorageAction.ForgotResetAll -> handleResetAll()
+ SharedSecureStorageAction.DoResetAll -> handleDoResetAll()
}
}
diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageResetAllFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageResetAllFragment.kt
index 200b2b73c2..c0d0aa8e76 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageResetAllFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageResetAllFragment.kt
@@ -30,7 +30,7 @@ import im.vector.app.features.roommemberprofile.devices.DeviceListBottomSheet
import javax.inject.Inject
class SharedSecuredStorageResetAllFragment @Inject constructor() :
- VectorBaseFragment() {
+ VectorBaseFragment() {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSsssResetAllBinding {
return FragmentSsssResetAllBinding.inflate(inflater, container, false)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt
index 363416b7de..395b4d0475 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapActions.kt
@@ -37,7 +37,7 @@ sealed class BootstrapActions : VectorViewModelAction {
data class UpdateCandidatePassphrase(val pass: String) : BootstrapActions()
data class UpdateConfirmCandidatePassphrase(val pass: String) : BootstrapActions()
-// data class ReAuth(val pass: String) : BootstrapActions()
+ // data class ReAuth(val pass: String) : BootstrapActions()
object RecoveryKeySaved : BootstrapActions()
object Completed : BootstrapActions()
object SaveReqQueryStarted : BootstrapActions()
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapBottomSheet.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapBottomSheet.kt
index ac7662ca59..57a8ad68b7 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapBottomSheet.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapBottomSheet.kt
@@ -64,7 +64,7 @@ class BootstrapBottomSheet : VectorBaseBottomSheetDialogFragment
if (activityResult.resultCode == Activity.RESULT_OK) {
when (activityResult.data?.extras?.getString(ReAuthActivity.RESULT_FLOW_TYPE)) {
- LoginFlowTypes.SSO -> {
+ LoginFlowTypes.SSO -> {
viewModel.handle(BootstrapActions.SsoAuthDone)
}
LoginFlowTypes.PASSWORD -> {
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt
index 8a211388ed..7920ab3b96 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapConfirmPassphraseFragment.kt
@@ -37,7 +37,7 @@ import reactivecircus.flowbinding.android.widget.textChanges
import javax.inject.Inject
class BootstrapConfirmPassphraseFragment @Inject constructor() :
- VectorBaseFragment() {
+ VectorBaseFragment() {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentBootstrapEnterPassphraseBinding {
return FragmentBootstrapEnterPassphraseBinding.inflate(inflater, container, false)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt
index 51430ba12e..ff6d109b3c 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapEnterPassphraseFragment.kt
@@ -36,7 +36,7 @@ import reactivecircus.flowbinding.android.widget.textChanges
import javax.inject.Inject
class BootstrapEnterPassphraseFragment @Inject constructor() :
- VectorBaseFragment() {
+ VectorBaseFragment() {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentBootstrapEnterPassphraseBinding {
return FragmentBootstrapEnterPassphraseBinding.inflate(inflater, container, false)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSetupRecoveryKeyFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSetupRecoveryKeyFragment.kt
index 2765dfefd3..3be2f020b8 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSetupRecoveryKeyFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapSetupRecoveryKeyFragment.kt
@@ -29,7 +29,7 @@ import im.vector.app.databinding.FragmentBootstrapSetupRecoveryBinding
import javax.inject.Inject
class BootstrapSetupRecoveryKeyFragment @Inject constructor() :
- VectorBaseFragment() {
+ VectorBaseFragment() {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentBootstrapSetupRecoveryBinding {
return FragmentBootstrapSetupRecoveryBinding.inflate(inflater, container, false)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapWaitingFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapWaitingFragment.kt
index 8cf48a7c66..cc566833d8 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapWaitingFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapWaitingFragment.kt
@@ -26,7 +26,7 @@ import im.vector.app.databinding.FragmentBootstrapWaitingBinding
import javax.inject.Inject
class BootstrapWaitingFragment @Inject constructor() :
- VectorBaseFragment() {
+ VectorBaseFragment() {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentBootstrapWaitingBinding {
return FragmentBootstrapWaitingBinding.inflate(inflater, container, false)
diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt
index 3a3f1054f1..62affec7b5 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt
@@ -61,7 +61,7 @@ class IncomingVerificationRequestHandler @Inject constructor(
// TODO maybe check also if
val uid = "kvr_${tx.transactionId}"
when (tx.state) {
- is VerificationTxState.OnStarted -> {
+ is VerificationTxState.OnStarted -> {
// Add a notification for every incoming request
val user = session?.getUser(tx.otherUserId)
val name = user?.toMatrixItem()?.getBestName() ?: tx.otherUserId
diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionViewModel.kt
index 82bdbccdb3..0e56a6857b 100644
--- a/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/crypto/verification/conclusion/VerificationConclusionViewModel.kt
@@ -36,7 +36,7 @@ enum class ConclusionState {
}
class VerificationConclusionViewModel(initialState: VerificationConclusionViewState) :
- VectorViewModel(initialState) {
+ VectorViewModel(initialState) {
companion object : MavericksViewModelFactory {
diff --git a/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolEditFragment.kt b/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolEditFragment.kt
index dd0bd174af..1b6fbb7359 100644
--- a/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolEditFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/devtools/RoomDevToolEditFragment.kt
@@ -32,7 +32,7 @@ import reactivecircus.flowbinding.android.widget.textChanges
import javax.inject.Inject
class RoomDevToolEditFragment @Inject constructor() :
- VectorBaseFragment() {
+ VectorBaseFragment() {
private val sharedViewModel: RoomDevToolViewModel by activityViewModel()
diff --git a/vector/src/main/java/im/vector/app/features/discovery/change/SetIdentityServerViewModel.kt b/vector/src/main/java/im/vector/app/features/discovery/change/SetIdentityServerViewModel.kt
index da01ba5662..4249e8d899 100644
--- a/vector/src/main/java/im/vector/app/features/discovery/change/SetIdentityServerViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/discovery/change/SetIdentityServerViewModel.kt
@@ -39,7 +39,7 @@ class SetIdentityServerViewModel @AssistedInject constructor(
@Assisted initialState: SetIdentityServerState,
private val mxSession: Session,
stringProvider: StringProvider) :
- VectorViewModel(initialState) {
+ VectorViewModel(initialState) {
@AssistedFactory
interface Factory : MavericksAssistedViewModelFactory {
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
index 9d3f022e53..d0ae7581be 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
@@ -370,7 +370,7 @@ class HomeActivity :
}
views.waitingView.root.isVisible = true
}
- else -> {
+ else -> {
// Idle or Incremental sync status
views.waitingView.root.isVisible = false
}
@@ -580,7 +580,7 @@ class HomeActivity :
}
override fun spaceInviteBottomSheetOnAccept(spaceId: String) {
- navigator.switchToSpace(this, spaceId, Navigator.PostSwitchSpaceAction.None)
+ navigator.switchToSpace(this, spaceId, Navigator.PostSwitchSpaceAction.OpenRoomList)
}
override fun spaceInviteBottomSheetOnDecline(spaceId: String) {
@@ -613,6 +613,6 @@ class HomeActivity :
}
override fun mxToBottomSheetSwitchToSpace(spaceId: String) {
- navigator.switchToSpace(this, spaceId, Navigator.PostSwitchSpaceAction.None)
+ navigator.switchToSpace(this, spaceId, Navigator.PostSwitchSpaceAction.OpenRoomList)
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt
index c8b0fa024e..f15e44fef7 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt
@@ -42,10 +42,10 @@ import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.api.auth.registration.nextUncompletedStage
import org.matrix.android.sdk.api.extensions.tryOrNull
-import org.matrix.android.sdk.api.pushrules.RuleIds
import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap
import org.matrix.android.sdk.api.session.initsync.SyncStatusService
+import org.matrix.android.sdk.api.session.pushrules.RuleIds
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
import org.matrix.android.sdk.api.settings.LightweightSettingsStorage
@@ -189,7 +189,7 @@ class HomeActivityViewModel @AssistedInject constructor(
maybeBootstrapCrossSigningAfterInitialSync()
}
}
- else -> Unit
+ else -> Unit
}
setState {
diff --git a/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt
index 08b528f25a..d2617bd1c8 100644
--- a/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt
@@ -58,7 +58,7 @@ data class DeviceDetectionInfo(
class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(@Assisted initialState: UnknownDevicesState,
session: Session,
private val vectorPreferences: VectorPreferences) :
- VectorViewModel(initialState) {
+ VectorViewModel(initialState) {
sealed class Action : VectorViewModelAction {
data class IgnoreDevice(val deviceIds: List) : Action()
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/JoinReplacementRoomBottomSheet.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/JoinReplacementRoomBottomSheet.kt
index 99843084ec..ce2903a6fa 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/JoinReplacementRoomBottomSheet.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/JoinReplacementRoomBottomSheet.kt
@@ -62,15 +62,15 @@ class JoinReplacementRoomBottomSheet :
when (joinState) {
// it should never be Uninitialized
Uninitialized,
- is Loading -> {
+ is Loading -> {
views.roomUpgradeButton.render(ButtonStateView.State.Loading)
views.descriptionText.setText(R.string.it_may_take_some_time)
}
- is Success -> {
+ is Success -> {
views.roomUpgradeButton.render(ButtonStateView.State.Loaded)
dismiss()
}
- is Fail -> {
+ is Fail -> {
// display the error message
views.descriptionText.text = errorFormatter.toHumanReadable(joinState.error)
views.roomUpgradeButton.render(ButtonStateView.State.Error)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt
index d10b363519..f6ea8b76ef 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailAction.kt
@@ -111,4 +111,7 @@ sealed class RoomDetailAction : VectorViewModelAction {
// Poll
data class EndPoll(val eventId: String) : RoomDetailAction()
+
+ // Live Location
+ object StopLiveLocationSharing : RoomDetailAction()
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
index a722729629..4603793bd5 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
@@ -136,6 +136,7 @@ import im.vector.app.features.call.conference.ConferenceEventObserver
import im.vector.app.features.call.conference.JitsiCallViewModel
import im.vector.app.features.call.webrtc.WebRtcCallManager
import im.vector.app.features.command.Command
+import im.vector.app.features.command.ParsedCommand
import im.vector.app.features.crypto.keysbackup.restore.KeysBackupRestoreActivity
import im.vector.app.features.crypto.verification.VerificationBottomSheet
import im.vector.app.features.home.AvatarRenderer
@@ -385,6 +386,7 @@ class TimelineFragment @Inject constructor(
setupEmojiButton()
setupRemoveJitsiWidgetView()
setupVoiceMessageView()
+ setupLiveLocationIndicator()
views.includeRoomToolbar.roomToolbarContentView.debouncedClicks {
navigator.openRoomProfile(requireActivity(), timelineArgs.roomId)
@@ -437,6 +439,7 @@ class TimelineFragment @Inject constructor(
messageComposerViewModel.observeViewEvents {
when (it) {
is MessageComposerViewEvents.JoinRoomCommandSuccess -> handleJoinedToAnotherRoom(it)
+ is MessageComposerViewEvents.SlashCommandConfirmationRequest -> handleSlashCommandConfirmationRequest(it)
is MessageComposerViewEvents.SendMessageResult -> renderSendMessageResult(it)
is MessageComposerViewEvents.ShowMessage -> showSnackWithMessage(it.message)
is MessageComposerViewEvents.ShowRoomUpgradeDialog -> handleShowRoomUpgradeDialog(it)
@@ -495,6 +498,25 @@ class TimelineFragment @Inject constructor(
}
}
+ private fun handleSlashCommandConfirmationRequest(action: MessageComposerViewEvents.SlashCommandConfirmationRequest) {
+ when (action.parsedCommand) {
+ is ParsedCommand.UnignoreUser -> promptUnignoreUser(action.parsedCommand)
+ else -> TODO("Add case for ${action.parsedCommand.javaClass.simpleName}")
+ }
+ lockSendButton = false
+ }
+
+ private fun promptUnignoreUser(command: ParsedCommand.UnignoreUser) {
+ MaterialAlertDialogBuilder(requireActivity())
+ .setTitle(R.string.room_participants_action_unignore_title)
+ .setMessage(getString(R.string.settings_unignore_user, command.userId))
+ .setPositiveButton(R.string.unignore) { _, _ ->
+ messageComposerViewModel.handle(MessageComposerAction.SlashCommandConfirmed(command))
+ }
+ .setNegativeButton(R.string.action_cancel, null)
+ .show()
+ }
+
private fun renderVoiceMessageMode(content: String) {
ContentAttachmentData.fromJsonString(content)?.let { audioAttachmentData ->
views.voiceMessageRecorderView.isVisible = true
@@ -810,6 +832,12 @@ class TimelineFragment @Inject constructor(
}
}
+ private fun setupLiveLocationIndicator() {
+ views.locationLiveStatusIndicator.stopButton.debouncedClicks {
+ timelineViewModel.handle(RoomDetailAction.StopLiveLocationSharing)
+ }
+ }
+
private fun joinJitsiRoom(jitsiWidget: Widget, enableVideo: Boolean) {
navigator.openRoomWidget(requireContext(), timelineArgs.roomId, jitsiWidget, mapOf(JitsiCallViewModel.ENABLE_VIDEO_OPTION to enableVideo))
}
@@ -1679,9 +1707,7 @@ class TimelineFragment @Inject constructor(
displayCommandError(getString(R.string.unrecognized_command, sendMessageResult.command))
}
is MessageComposerViewEvents.SlashCommandResultOk -> {
- dismissLoadingDialog()
- views.composerLayout.setTextIfDifferent("")
- sendMessageResult.messageRes?.let { showSnackWithMessage(getString(it)) }
+ handleSlashCommandResultOk(sendMessageResult.parsedCommand)
}
is MessageComposerViewEvents.SlashCommandResultError -> {
dismissLoadingDialog()
@@ -1698,6 +1724,17 @@ class TimelineFragment @Inject constructor(
lockSendButton = false
}
+ private fun handleSlashCommandResultOk(parsedCommand: ParsedCommand) {
+ dismissLoadingDialog()
+ views.composerLayout.setTextIfDifferent("")
+ when (parsedCommand) {
+ is ParsedCommand.SetMarkdown -> {
+ showSnackWithMessage(getString(if (parsedCommand.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
+ }
+ else -> Unit
+ }
+ }
+
private fun displayCommandError(message: String) {
MaterialAlertDialogBuilder(requireActivity())
.setTitle(R.string.command_error)
@@ -2411,23 +2448,23 @@ class TimelineFragment @Inject constructor(
}
private fun displayThreadsBetaOptInDialog() {
- activity?.let {
- MaterialAlertDialogBuilder(it)
- .setTitle(R.string.threads_beta_enable_notice_title)
- .setMessage(threadsManager.getBetaEnableThreadsMessage())
- .setCancelable(true)
- .setNegativeButton(R.string.action_not_now) { _, _ -> }
- .setPositiveButton(R.string.action_try_it_out) { _, _ ->
- threadsManager.enableThreadsAndRestart(it)
- }
- .show()
- ?.findViewById(android.R.id.message)
- ?.apply {
- linksClickable = true
- movementMethod = LinkMovementMethod.getInstance()
- }
- }
+ activity?.let {
+ MaterialAlertDialogBuilder(it)
+ .setTitle(R.string.threads_beta_enable_notice_title)
+ .setMessage(threadsManager.getBetaEnableThreadsMessage())
+ .setCancelable(true)
+ .setNegativeButton(R.string.action_not_now) { _, _ -> }
+ .setPositiveButton(R.string.action_try_it_out) { _, _ ->
+ threadsManager.enableThreadsAndRestart(it)
+ }
+ .show()
+ ?.findViewById(android.R.id.message)
+ ?.apply {
+ linksClickable = true
+ movementMethod = LinkMovementMethod.getInstance()
+ }
}
+ }
/**
* Navigate to Threads list for the current room
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt
index 36ab526cd9..b79b55b248 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineViewModel.kt
@@ -444,6 +444,7 @@ class TimelineViewModel @AssistedInject constructor(
_viewEvents.post(RoomDetailViewEvents.OpenRoom(action.replacementRoomId, closeCurrentRoom = true))
}
is RoomDetailAction.EndPoll -> handleEndPoll(action.eventId)
+ RoomDetailAction.StopLiveLocationSharing -> handleStopLiveLocationSharing()
}
}
@@ -1093,6 +1094,10 @@ class TimelineViewModel @AssistedInject constructor(
}
}
+ private fun handleStopLiveLocationSharing() {
+ locationSharingServiceConnection.stopLiveLocationSharing(room.roomId)
+ }
+
private fun observeRoomSummary() {
room.flow().liveRoomSummary()
.unwrap()
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
index dca698ee52..0da324ffc2 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerAction.kt
@@ -17,6 +17,7 @@
package im.vector.app.features.home.room.detail.composer
import im.vector.app.core.platform.VectorViewModelAction
+import im.vector.app.features.command.ParsedCommand
import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView
import org.matrix.android.sdk.api.session.content.ContentAttachmentData
import org.matrix.android.sdk.api.session.room.model.message.MessageAudioContent
@@ -30,6 +31,7 @@ sealed class MessageComposerAction : VectorViewModelAction {
data class UserIsTyping(val isTyping: Boolean) : MessageComposerAction()
data class OnTextChanged(val text: CharSequence) : MessageComposerAction()
data class OnEntersBackground(val composerText: String) : MessageComposerAction()
+ data class SlashCommandConfirmed(val parsedCommand: ParsedCommand) : MessageComposerAction()
// Voice Message
data class InitializeVoiceRecorder(val attachmentData: ContentAttachmentData) : MessageComposerAction()
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
index c1af838795..e1f6923d21 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewEvents.kt
@@ -16,9 +16,9 @@
package im.vector.app.features.home.room.detail.composer
-import androidx.annotation.StringRes
import im.vector.app.core.platform.VectorViewEvents
import im.vector.app.features.command.Command
+import im.vector.app.features.command.ParsedCommand
sealed class MessageComposerViewEvents : VectorViewEvents {
@@ -30,13 +30,14 @@ sealed class MessageComposerViewEvents : VectorViewEvents {
object MessageSent : SendMessageResult()
data class JoinRoomCommandSuccess(val roomId: String) : SendMessageResult()
- class SlashCommandError(val command: Command) : SendMessageResult()
- class SlashCommandUnknown(val command: String) : SendMessageResult()
- class SlashCommandNotSupportedInThreads(val command: Command) : SendMessageResult()
- data class SlashCommandHandled(@StringRes val messageRes: Int? = null) : SendMessageResult()
+ data class SlashCommandError(val command: Command) : SendMessageResult()
+ data class SlashCommandUnknown(val command: String) : SendMessageResult()
+ data class SlashCommandNotSupportedInThreads(val command: Command) : SendMessageResult()
object SlashCommandLoading : SendMessageResult()
- data class SlashCommandResultOk(@StringRes val messageRes: Int? = null) : SendMessageResult()
- class SlashCommandResultError(val throwable: Throwable) : SendMessageResult()
+ data class SlashCommandResultOk(val parsedCommand: ParsedCommand) : SendMessageResult()
+ data class SlashCommandResultError(val throwable: Throwable) : SendMessageResult()
+
+ data class SlashCommandConfirmationRequest(val parsedCommand: ParsedCommand) : MessageComposerViewEvents()
data class OpenRoomMemberProfile(val userId: String) : MessageComposerViewEvents()
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
index aabc319ee2..9c81a39941 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt
@@ -110,6 +110,7 @@ class MessageComposerViewModel @AssistedInject constructor(
is MessageComposerAction.VoiceWaveformTouchedUp -> handleVoiceWaveformTouchedUp(action)
is MessageComposerAction.VoiceWaveformMovedTo -> handleVoiceWaveformMovedTo(action)
is MessageComposerAction.AudioSeekBarMovedTo -> handleAudioSeekBarMovedTo(action)
+ is MessageComposerAction.SlashCommandConfirmed -> handleSlashCommandConfirmed(action)
}
}
@@ -195,7 +196,7 @@ class MessageComposerViewModel @AssistedInject constructor(
}
when (state.sendMode) {
is SendMode.Regular -> {
- when (val slashCommandResult = commandParser.parseSlashCommand(
+ when (val parsedCommand = commandParser.parseSlashCommand(
textMessage = action.text,
isInThreadTimeline = state.isInThreadTimeline())) {
is ParsedCommand.ErrorNotACommand -> {
@@ -213,118 +214,117 @@ class MessageComposerViewModel @AssistedInject constructor(
popDraft()
}
is ParsedCommand.ErrorSyntax -> {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandError(slashCommandResult.command))
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandError(parsedCommand.command))
}
is ParsedCommand.ErrorEmptySlashCommand -> {
_viewEvents.post(MessageComposerViewEvents.SlashCommandUnknown("/"))
}
is ParsedCommand.ErrorUnknownSlashCommand -> {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandUnknown(slashCommandResult.slashCommand))
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandUnknown(parsedCommand.slashCommand))
}
is ParsedCommand.ErrorCommandNotSupportedInThreads -> {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandNotSupportedInThreads(slashCommandResult.command))
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandNotSupportedInThreads(parsedCommand.command))
}
is ParsedCommand.SendPlainText -> {
// Send the text message to the room, without markdown
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
- replyInThreadText = slashCommandResult.message,
+ replyInThreadText = parsedCommand.message,
autoMarkdown = false)
} else {
- room.sendTextMessage(slashCommandResult.message, autoMarkdown = false)
+ room.sendTextMessage(parsedCommand.message, autoMarkdown = false)
}
_viewEvents.post(MessageComposerViewEvents.MessageSent)
popDraft()
}
is ParsedCommand.ChangeRoomName -> {
- handleChangeRoomNameSlashCommand(slashCommandResult)
+ handleChangeRoomNameSlashCommand(parsedCommand)
}
is ParsedCommand.Invite -> {
- handleInviteSlashCommand(slashCommandResult)
+ handleInviteSlashCommand(parsedCommand)
}
is ParsedCommand.Invite3Pid -> {
- handleInvite3pidSlashCommand(slashCommandResult)
+ handleInvite3pidSlashCommand(parsedCommand)
}
is ParsedCommand.SetUserPowerLevel -> {
- handleSetUserPowerLevel(slashCommandResult)
+ handleSetUserPowerLevel(parsedCommand)
}
is ParsedCommand.ClearScalarToken -> {
// TODO
_viewEvents.post(MessageComposerViewEvents.SlashCommandNotImplemented)
}
is ParsedCommand.SetMarkdown -> {
- vectorPreferences.setMarkdownEnabled(slashCommandResult.enable)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(
- if (slashCommandResult.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
+ vectorPreferences.setMarkdownEnabled(parsedCommand.enable)
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.BanUser -> {
- handleBanSlashCommand(slashCommandResult)
+ handleBanSlashCommand(parsedCommand)
}
is ParsedCommand.UnbanUser -> {
- handleUnbanSlashCommand(slashCommandResult)
+ handleUnbanSlashCommand(parsedCommand)
}
is ParsedCommand.IgnoreUser -> {
- handleIgnoreSlashCommand(slashCommandResult)
+ handleIgnoreSlashCommand(parsedCommand)
}
is ParsedCommand.UnignoreUser -> {
- handleUnignoreSlashCommand(slashCommandResult)
+ handleUnignoreSlashCommand(parsedCommand)
}
is ParsedCommand.RemoveUser -> {
- handleRemoveSlashCommand(slashCommandResult)
+ handleRemoveSlashCommand(parsedCommand)
}
is ParsedCommand.JoinRoom -> {
- handleJoinToAnotherRoomSlashCommand(slashCommandResult)
+ handleJoinToAnotherRoomSlashCommand(parsedCommand)
popDraft()
}
is ParsedCommand.PartRoom -> {
- handlePartSlashCommand(slashCommandResult)
+ handlePartSlashCommand(parsedCommand)
}
is ParsedCommand.SendEmote -> {
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
- replyInThreadText = slashCommandResult.message,
+ replyInThreadText = parsedCommand.message,
msgType = MessageType.MSGTYPE_EMOTE,
autoMarkdown = action.autoMarkdown)
} else {
- room.sendTextMessage(slashCommandResult.message, msgType = MessageType.MSGTYPE_EMOTE, autoMarkdown = action.autoMarkdown)
+ room.sendTextMessage(parsedCommand.message, msgType = MessageType.MSGTYPE_EMOTE, autoMarkdown = action.autoMarkdown)
}
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendRainbow -> {
- val message = slashCommandResult.message.toString()
+ val message = parsedCommand.message.toString()
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
- replyInThreadText = slashCommandResult.message,
+ replyInThreadText = parsedCommand.message,
formattedText = rainbowGenerator.generate(message))
} else {
room.sendFormattedTextMessage(message, rainbowGenerator.generate(message))
}
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendRainbowEmote -> {
- val message = slashCommandResult.message.toString()
+ val message = parsedCommand.message.toString()
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
- replyInThreadText = slashCommandResult.message,
+ replyInThreadText = parsedCommand.message,
msgType = MessageType.MSGTYPE_EMOTE,
formattedText = rainbowGenerator.generate(message))
} else {
room.sendFormattedTextMessage(message, rainbowGenerator.generate(message), MessageType.MSGTYPE_EMOTE)
}
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendSpoiler -> {
- val text = "[${stringProvider.getString(R.string.spoiler)}](${slashCommandResult.message})"
- val formattedText = "${slashCommandResult.message}"
+ val text = "[${stringProvider.getString(R.string.spoiler)}](${parsedCommand.message})"
+ val formattedText = "${parsedCommand.message}"
if (state.rootThreadEventId != null) {
room.replyInThread(
rootThreadEventId = state.rootThreadEventId,
@@ -335,51 +335,51 @@ class MessageComposerViewModel @AssistedInject constructor(
text,
formattedText)
}
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendShrug -> {
- sendPrefixedMessage("¯\\_(ツ)_/¯", slashCommandResult.message, state.rootThreadEventId)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ sendPrefixedMessage("¯\\_(ツ)_/¯", parsedCommand.message, state.rootThreadEventId)
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendLenny -> {
- sendPrefixedMessage("( ͡° ͜ʖ ͡°)", slashCommandResult.message, state.rootThreadEventId)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ sendPrefixedMessage("( ͡° ͜ʖ ͡°)", parsedCommand.message, state.rootThreadEventId)
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.SendChatEffect -> {
- sendChatEffect(slashCommandResult)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ sendChatEffect(parsedCommand)
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
is ParsedCommand.ChangeTopic -> {
- handleChangeTopicSlashCommand(slashCommandResult)
+ handleChangeTopicSlashCommand(parsedCommand)
}
is ParsedCommand.ChangeDisplayName -> {
- handleChangeDisplayNameSlashCommand(slashCommandResult)
+ handleChangeDisplayNameSlashCommand(parsedCommand)
}
is ParsedCommand.ChangeDisplayNameForRoom -> {
- handleChangeDisplayNameForRoomSlashCommand(slashCommandResult)
+ handleChangeDisplayNameForRoomSlashCommand(parsedCommand)
}
is ParsedCommand.ChangeRoomAvatar -> {
- handleChangeRoomAvatarSlashCommand(slashCommandResult)
+ handleChangeRoomAvatarSlashCommand(parsedCommand)
}
is ParsedCommand.ChangeAvatarForRoom -> {
- handleChangeAvatarForRoomSlashCommand(slashCommandResult)
+ handleChangeAvatarForRoomSlashCommand(parsedCommand)
}
is ParsedCommand.ShowUser -> {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
- handleWhoisSlashCommand(slashCommandResult)
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
+ handleWhoisSlashCommand(parsedCommand)
popDraft()
}
is ParsedCommand.DiscardSession -> {
if (room.isEncrypted()) {
session.cryptoService().discardOutboundSession(room.roomId)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
} else {
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
_viewEvents.post(
MessageComposerViewEvents
.ShowMessage(stringProvider.getString(R.string.command_description_discard_session_not_handled))
@@ -391,8 +391,8 @@ class MessageComposerViewModel @AssistedInject constructor(
viewModelScope.launch(Dispatchers.IO) {
try {
val params = CreateSpaceParams().apply {
- name = slashCommandResult.name
- invitedUserIds.addAll(slashCommandResult.invitees)
+ name = parsedCommand.name
+ invitedUserIds.addAll(parsedCommand.invitees)
}
val spaceId = session.spaceService().createSpace(params)
session.spaceService().getSpace(spaceId)
@@ -403,7 +403,7 @@ class MessageComposerViewModel @AssistedInject constructor(
true
)
popDraft()
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
} catch (failure: Throwable) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultError(failure))
}
@@ -414,7 +414,7 @@ class MessageComposerViewModel @AssistedInject constructor(
_viewEvents.post(MessageComposerViewEvents.SlashCommandLoading)
viewModelScope.launch(Dispatchers.IO) {
try {
- session.spaceService().getSpace(slashCommandResult.spaceId)
+ session.spaceService().getSpace(parsedCommand.spaceId)
?.addChildren(
room.roomId,
null,
@@ -422,7 +422,7 @@ class MessageComposerViewModel @AssistedInject constructor(
false
)
popDraft()
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
} catch (failure: Throwable) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultError(failure))
}
@@ -433,9 +433,9 @@ class MessageComposerViewModel @AssistedInject constructor(
_viewEvents.post(MessageComposerViewEvents.SlashCommandLoading)
viewModelScope.launch(Dispatchers.IO) {
try {
- session.spaceService().joinSpace(slashCommandResult.spaceIdOrAlias)
+ session.spaceService().joinSpace(parsedCommand.spaceIdOrAlias)
popDraft()
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
} catch (failure: Throwable) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultError(failure))
}
@@ -445,9 +445,9 @@ class MessageComposerViewModel @AssistedInject constructor(
is ParsedCommand.LeaveRoom -> {
viewModelScope.launch(Dispatchers.IO) {
try {
- session.leaveRoom(slashCommandResult.roomId)
+ session.leaveRoom(parsedCommand.roomId)
popDraft()
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
} catch (failure: Throwable) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultError(failure))
}
@@ -457,11 +457,11 @@ class MessageComposerViewModel @AssistedInject constructor(
is ParsedCommand.UpgradeRoom -> {
_viewEvents.post(
MessageComposerViewEvents.ShowRoomUpgradeDialog(
- slashCommandResult.newVersion,
+ parsedCommand.newVersion,
room.roomSummary()?.isPublic ?: false
)
)
- _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk(parsedCommand))
popDraft()
}
}
@@ -644,19 +644,19 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleChangeTopicSlashCommand(changeTopic: ParsedCommand.ChangeTopic) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeTopic) {
room.updateTopic(changeTopic.topic)
}
}
private fun handleInviteSlashCommand(invite: ParsedCommand.Invite) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(invite) {
room.invite(invite.userId, invite.reason)
}
}
private fun handleInvite3pidSlashCommand(invite: ParsedCommand.Invite3Pid) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(invite) {
room.invite3pid(invite.threePid)
}
}
@@ -669,19 +669,19 @@ class MessageComposerViewModel @AssistedInject constructor(
?.toContent()
?: return
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(setUserPowerLevel) {
room.sendStateEvent(EventType.STATE_ROOM_POWER_LEVELS, stateKey = "", newPowerLevelsContent)
}
}
private fun handleChangeDisplayNameSlashCommand(changeDisplayName: ParsedCommand.ChangeDisplayName) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeDisplayName) {
session.setDisplayName(session.myUserId, changeDisplayName.displayName)
}
}
private fun handlePartSlashCommand(command: ParsedCommand.PartRoom) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(command) {
if (command.roomAlias == null) {
// Leave the current room
room
@@ -697,25 +697,25 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleRemoveSlashCommand(removeUser: ParsedCommand.RemoveUser) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(removeUser) {
room.remove(removeUser.userId, removeUser.reason)
}
}
private fun handleBanSlashCommand(ban: ParsedCommand.BanUser) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(ban) {
room.ban(ban.userId, ban.reason)
}
}
private fun handleUnbanSlashCommand(unban: ParsedCommand.UnbanUser) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(unban) {
room.unban(unban.userId, unban.reason)
}
}
private fun handleChangeRoomNameSlashCommand(changeRoomName: ParsedCommand.ChangeRoomName) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeRoomName) {
room.updateName(changeRoomName.name)
}
}
@@ -727,7 +727,7 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleChangeDisplayNameForRoomSlashCommand(changeDisplayName: ParsedCommand.ChangeDisplayNameForRoom) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeDisplayName) {
getMyRoomMemberContent()
?.copy(displayName = changeDisplayName.displayName)
?.toContent()
@@ -738,13 +738,13 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleChangeRoomAvatarSlashCommand(changeAvatar: ParsedCommand.ChangeRoomAvatar) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeAvatar) {
room.sendStateEvent(EventType.STATE_ROOM_AVATAR, stateKey = "", RoomAvatarContent(changeAvatar.url).toContent())
}
}
private fun handleChangeAvatarForRoomSlashCommand(changeAvatar: ParsedCommand.ChangeAvatarForRoom) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(changeAvatar) {
getMyRoomMemberContent()
?.copy(avatarUrl = changeAvatar.url)
?.toContent()
@@ -755,13 +755,24 @@ class MessageComposerViewModel @AssistedInject constructor(
}
private fun handleIgnoreSlashCommand(ignore: ParsedCommand.IgnoreUser) {
- launchSlashCommandFlowSuspendable {
+ launchSlashCommandFlowSuspendable(ignore) {
session.ignoreUserIds(listOf(ignore.userId))
}
}
private fun handleUnignoreSlashCommand(unignore: ParsedCommand.UnignoreUser) {
- launchSlashCommandFlowSuspendable {
+ _viewEvents.post(MessageComposerViewEvents.SlashCommandConfirmationRequest(unignore))
+ }
+
+ private fun handleSlashCommandConfirmed(action: MessageComposerAction.SlashCommandConfirmed) {
+ when (action.parsedCommand) {
+ is ParsedCommand.UnignoreUser -> handleUnignoreSlashCommandConfirmed(action.parsedCommand)
+ else -> TODO("Not handled yet")
+ }
+ }
+
+ private fun handleUnignoreSlashCommandConfirmed(unignore: ParsedCommand.UnignoreUser) {
+ launchSlashCommandFlowSuspendable(unignore) {
session.unIgnoreUserIds(listOf(unignore.userId))
}
}
@@ -900,13 +911,13 @@ class MessageComposerViewModel @AssistedInject constructor(
}
}
- private fun launchSlashCommandFlowSuspendable(block: suspend () -> Unit) {
+ private fun launchSlashCommandFlowSuspendable(parsedCommand: ParsedCommand, block: suspend () -> Unit) {
_viewEvents.post(MessageComposerViewEvents.SlashCommandLoading)
viewModelScope.launch {
val event = try {
block()
popDraft()
- MessageComposerViewEvents.SlashCommandResultOk()
+ MessageComposerViewEvents.SlashCommandResultOk(parsedCommand)
} catch (failure: Throwable) {
MessageComposerViewEvents.SlashCommandResultError(failure)
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt
index bf88218fa6..c316c556b0 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/readreceipts/DisplayReadReceiptsController.kt
@@ -31,7 +31,7 @@ import javax.inject.Inject
class DisplayReadReceiptsController @Inject constructor(private val dateFormatter: VectorDateFormatter,
private val session: Session,
private val avatarRender: AvatarRenderer) :
- TypedEpoxyController>() {
+ TypedEpoxyController>() {
var listener: Listener? = null
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
index 981e5740d7..8cea57399a 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt
@@ -132,6 +132,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
mediaData: ImageContentRenderer.Data,
view: View,
inMemory: List)
+
fun onVideoMessageClicked(messageVideoContent: MessageVideoContent, mediaData: VideoContentRenderer.Data, view: View)
// fun onFileMessageClicked(eventId: String, messageFileContent: MessageFileContent)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt
index 9a73afd897..99c36d1190 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt
@@ -452,6 +452,10 @@ class MessageActionsViewModel @AssistedInject constructor(
actionPermissions: ActionPermissions): Boolean {
// We let reply in thread visible even if threads are not enabled, with an enhanced flow to attract users
// if (!vectorPreferences.areThreadMessagesEnabled()) return false
+ // Disable beta prompt if the homeserver do not support threads
+ if (!vectorPreferences.areThreadMessagesEnabled() &&
+ !session.getHomeServerCapabilities().canUseThreading) return false
+
if (initialState.isFromThreadTimeline) return false
if (event.root.isThread()) return false
if (event.root.getClearType() != EventType.MESSAGE &&
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewState.kt
index 61a400d875..dd344c4c82 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewState.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryViewState.kt
@@ -27,7 +27,7 @@ data class ViewEditHistoryViewState(
val roomId: String,
val isOriginalAReply: Boolean = false,
val editList: Async> = Uninitialized) :
- MavericksState {
+ MavericksState {
constructor(args: TimelineEventFragmentArgs) : this(roomId = args.roomId, eventId = args.eventId)
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/LiveLocationMessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/LiveLocationMessageItemFactory.kt
index 9bc148a562..c417038935 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/LiveLocationMessageItemFactory.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/LiveLocationMessageItemFactory.kt
@@ -46,7 +46,7 @@ class LiveLocationMessageItemFactory @Inject constructor(
}
private fun isLiveRunning(liveLocationContent: LiveLocationBeaconContent): Boolean {
- return liveLocationContent.getBestBeaconInfo()?.isLive.orFalse() && liveLocationContent.hasTimedOut.not()
+ return liveLocationContent.isLive.orFalse() && liveLocationContent.hasTimedOut.not()
}
private fun buildStartLiveItem(
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
index 1787da2ae7..04e087d25d 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt
@@ -122,31 +122,31 @@ import org.matrix.android.sdk.api.util.MimeTypes
import javax.inject.Inject
class MessageItemFactory @Inject constructor(
- private val localFilesHelper: LocalFilesHelper,
- private val colorProvider: ColorProvider,
- private val dimensionConverter: DimensionConverter,
- private val timelineMediaSizeProvider: TimelineMediaSizeProvider,
- private val htmlRenderer: Lazy,
- private val htmlCompressor: VectorHtmlCompressor,
- private val textRendererFactory: EventTextRenderer.Factory,
- private val stringProvider: StringProvider,
- private val imageContentRenderer: ImageContentRenderer,
- private val messageInformationDataFactory: MessageInformationDataFactory,
- private val messageItemAttributesFactory: MessageItemAttributesFactory,
- private val contentUploadStateTrackerBinder: ContentUploadStateTrackerBinder,
- private val contentDownloadStateTrackerBinder: ContentDownloadStateTrackerBinder,
- private val defaultItemFactory: DefaultItemFactory,
- private val noticeItemFactory: NoticeItemFactory,
- private val avatarSizeProvider: AvatarSizeProvider,
- private val pillsPostProcessorFactory: PillsPostProcessor.Factory,
- private val lightweightSettingsStorage: LightweightSettingsStorage,
- private val spanUtils: SpanUtils,
- private val session: Session,
- private val audioMessagePlaybackTracker: AudioMessagePlaybackTracker,
- private val locationPinProvider: LocationPinProvider,
- private val vectorPreferences: VectorPreferences,
- private val urlMapProvider: UrlMapProvider,
- private val liveLocationMessageItemFactory: LiveLocationMessageItemFactory,
+ private val localFilesHelper: LocalFilesHelper,
+ private val colorProvider: ColorProvider,
+ private val dimensionConverter: DimensionConverter,
+ private val timelineMediaSizeProvider: TimelineMediaSizeProvider,
+ private val htmlRenderer: Lazy,
+ private val htmlCompressor: VectorHtmlCompressor,
+ private val textRendererFactory: EventTextRenderer.Factory,
+ private val stringProvider: StringProvider,
+ private val imageContentRenderer: ImageContentRenderer,
+ private val messageInformationDataFactory: MessageInformationDataFactory,
+ private val messageItemAttributesFactory: MessageItemAttributesFactory,
+ private val contentUploadStateTrackerBinder: ContentUploadStateTrackerBinder,
+ private val contentDownloadStateTrackerBinder: ContentDownloadStateTrackerBinder,
+ private val defaultItemFactory: DefaultItemFactory,
+ private val noticeItemFactory: NoticeItemFactory,
+ private val avatarSizeProvider: AvatarSizeProvider,
+ private val pillsPostProcessorFactory: PillsPostProcessor.Factory,
+ private val lightweightSettingsStorage: LightweightSettingsStorage,
+ private val spanUtils: SpanUtils,
+ private val session: Session,
+ private val audioMessagePlaybackTracker: AudioMessagePlaybackTracker,
+ private val locationPinProvider: LocationPinProvider,
+ private val vectorPreferences: VectorPreferences,
+ private val urlMapProvider: UrlMapProvider,
+ private val liveLocationMessageItemFactory: LiveLocationMessageItemFactory,
) {
// TODO inject this properly?
@@ -181,7 +181,7 @@ class MessageItemFactory @Inject constructor(
return defaultItemFactory.create(malformedText, informationData, highlight, callback)
}
if (messageContent.relatesTo?.type == RelationType.REPLACE ||
- event.isEncrypted() && event.root.content.toModel()?.relatesTo?.type == RelationType.REPLACE
+ event.isEncrypted() && event.root.content.toModel()?.relatesTo?.type == RelationType.REPLACE
) {
// This is an edit event, we should display it when debugging as a notice event
return noticeItemFactory.create(params)
@@ -198,24 +198,24 @@ class MessageItemFactory @Inject constructor(
// val all = event.root.toContent()
// val ev = all.toModel()
val messageItem = when (messageContent) {
- is MessageEmoteContent -> buildEmoteMessageItem(messageContent, informationData, highlight, callback, attributes)
- is MessageTextContent -> buildItemForTextContent(messageContent, informationData, highlight, callback, attributes)
- is MessageImageInfoContent -> buildImageMessageItem(messageContent, informationData, highlight, callback, attributes)
- is MessageNoticeContent -> buildNoticeMessageItem(messageContent, informationData, highlight, callback, attributes)
- is MessageVideoContent -> buildVideoMessageItem(messageContent, informationData, highlight, callback, attributes)
- is MessageFileContent -> buildFileMessageItem(messageContent, highlight, attributes)
- is MessageAudioContent -> buildAudioContent(params, messageContent, informationData, highlight, attributes)
+ is MessageEmoteContent -> buildEmoteMessageItem(messageContent, informationData, highlight, callback, attributes)
+ is MessageTextContent -> buildItemForTextContent(messageContent, informationData, highlight, callback, attributes)
+ is MessageImageInfoContent -> buildImageMessageItem(messageContent, informationData, highlight, callback, attributes)
+ is MessageNoticeContent -> buildNoticeMessageItem(messageContent, informationData, highlight, callback, attributes)
+ is MessageVideoContent -> buildVideoMessageItem(messageContent, informationData, highlight, callback, attributes)
+ is MessageFileContent -> buildFileMessageItem(messageContent, highlight, attributes)
+ is MessageAudioContent -> buildAudioContent(params, messageContent, informationData, highlight, attributes)
is MessageVerificationRequestContent -> buildVerificationRequestMessageItem(messageContent, informationData, highlight, callback, attributes)
- is MessagePollContent -> buildPollItem(messageContent, informationData, highlight, callback, attributes)
- is MessageLocationContent -> {
+ is MessagePollContent -> buildPollItem(messageContent, informationData, highlight, callback, attributes)
+ is MessageLocationContent -> {
if (vectorPreferences.labsRenderLocationsInTimeline()) {
buildLocationItem(messageContent, informationData, highlight, attributes)
} else {
buildMessageTextItem(messageContent.body, false, informationData, highlight, callback, attributes)
}
}
- is LiveLocationBeaconContent -> liveLocationMessageItemFactory.create(messageContent, highlight, attributes)
- else -> buildNotHandledMessageItem(messageContent, informationData, highlight, callback, attributes)
+ is LiveLocationBeaconContent -> liveLocationMessageItemFactory.create(messageContent, highlight, attributes)
+ else -> buildNotHandledMessageItem(messageContent, informationData, highlight, callback, attributes)
}
return messageItem?.apply {
layout(informationData.messageLayout.layoutRes)
@@ -223,10 +223,10 @@ class MessageItemFactory @Inject constructor(
}
private fun buildLocationItem(
- locationContent: MessageLocationContent,
- informationData: MessageInformationData,
- highlight: Boolean,
- attributes: AbsMessageItem.Attributes,
+ locationContent: MessageLocationContent,
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ attributes: AbsMessageItem.Attributes,
): MessageLocationItem? {
val width = timelineMediaSizeProvider.getMaxSize().first
val height = dimensionConverter.dpToPx(MESSAGE_LOCATION_ITEM_HEIGHT_IN_DP)
@@ -238,22 +238,22 @@ class MessageItemFactory @Inject constructor(
val userId = if (locationContent.isSelfLocation()) informationData.senderId else null
return MessageLocationItem_()
- .attributes(attributes)
- .locationUrl(locationUrl)
- .mapWidth(width)
- .mapHeight(height)
- .userId(userId)
- .locationPinProvider(locationPinProvider)
- .highlighted(highlight)
- .leftGuideline(avatarSizeProvider.leftGuideline)
+ .attributes(attributes)
+ .locationUrl(locationUrl)
+ .mapWidth(width)
+ .mapHeight(height)
+ .userId(userId)
+ .locationPinProvider(locationPinProvider)
+ .highlighted(highlight)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
}
private fun buildPollItem(
- pollContent: MessagePollContent,
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ pollContent: MessagePollContent,
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): PollItem {
val pollResponseSummary = informationData.pollResponseAggregatedSummary
val pollState = createPollState(informationData, pollResponseSummary, pollContent)
@@ -264,16 +264,16 @@ class MessageItemFactory @Inject constructor(
val totalVotesText = createTotalVotesText(pollState, pollResponseSummary)
return PollItem_()
- .attributes(attributes)
- .eventId(informationData.eventId)
- .pollQuestion(question)
- .canVote(pollState.isVotable())
- .totalVotesText(totalVotesText)
- .optionViewStates(optionViewStates)
- .edited(informationData.hasBeenEdited)
- .highlighted(highlight)
- .leftGuideline(avatarSizeProvider.leftGuideline)
- .callback(callback)
+ .attributes(attributes)
+ .eventId(informationData.eventId)
+ .pollQuestion(question)
+ .canVote(pollState.isVotable())
+ .totalVotesText(totalVotesText)
+ .optionViewStates(optionViewStates)
+ .edited(informationData.hasBeenEdited)
+ .highlighted(highlight)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
+ .callback(callback)
}
private fun createPollState(
@@ -281,11 +281,11 @@ class MessageItemFactory @Inject constructor(
pollResponseSummary: PollResponseData?,
pollContent: MessagePollContent,
): PollState = when {
- !informationData.sendState.isSent() -> Sending
- pollResponseSummary?.isClosed.orFalse() -> Ended
+ !informationData.sendState.isSent() -> Sending
+ pollResponseSummary?.isClosed.orFalse() -> Ended
pollContent.getBestPollCreationInfo()?.kind == PollType.UNDISCLOSED -> Undisclosed
- pollResponseSummary?.myVote?.isNotEmpty().orFalse() -> Voted(pollResponseSummary?.totalVotes ?: 0)
- else -> Ready
+ pollResponseSummary?.myVote?.isNotEmpty().orFalse() -> Voted(pollResponseSummary?.totalVotes ?: 0)
+ else -> Ready
}
private fun List.mapToOptions(
@@ -303,11 +303,11 @@ class MessageItemFactory @Inject constructor(
val isWinner = winnerVoteCount != 0 && voteCount == winnerVoteCount
when (pollState) {
- Sending -> PollSending(optionId, optionAnswer)
- Ready -> PollReady(optionId, optionAnswer)
- is Voted -> PollVoted(optionId, optionAnswer, voteCount, votePercentage, isMyVote)
+ Sending -> PollSending(optionId, optionAnswer)
+ Ready -> PollReady(optionId, optionAnswer)
+ is Voted -> PollVoted(optionId, optionAnswer, voteCount, votePercentage, isMyVote)
Undisclosed -> PollUndisclosed(optionId, optionAnswer, isMyVote)
- Ended -> PollEnded(optionId, optionAnswer, voteCount, votePercentage, isWinner)
+ Ended -> PollEnded(optionId, optionAnswer, voteCount, votePercentage, isWinner)
}
}
@@ -327,11 +327,11 @@ class MessageItemFactory @Inject constructor(
): String {
val votes = pollResponseSummary?.totalVotes ?: 0
return when {
- pollState is Ended -> stringProvider.getQuantityString(R.plurals.poll_total_vote_count_after_ended, votes, votes)
+ pollState is Ended -> stringProvider.getQuantityString(R.plurals.poll_total_vote_count_after_ended, votes, votes)
pollState is Undisclosed -> ""
- pollState is Voted -> stringProvider.getQuantityString(R.plurals.poll_total_vote_count_before_ended_and_voted, votes, votes)
- votes == 0 -> stringProvider.getString(R.string.poll_no_votes_cast)
- else -> stringProvider.getQuantityString(R.plurals.poll_total_vote_count_before_ended_and_not_voted, votes, votes)
+ pollState is Voted -> stringProvider.getQuantityString(R.plurals.poll_total_vote_count_before_ended_and_voted, votes, votes)
+ votes == 0 -> stringProvider.getString(R.string.poll_no_votes_cast)
+ else -> stringProvider.getQuantityString(R.plurals.poll_total_vote_count_before_ended_and_not_voted, votes, votes)
}
}
@@ -406,27 +406,27 @@ class MessageItemFactory @Inject constructor(
}
return MessageVoiceItem_()
- .attributes(attributes)
- .duration(messageContent.audioWaveformInfo?.duration ?: 0)
- .waveform(messageContent.audioWaveformInfo?.waveform?.toFft().orEmpty())
- .playbackControlButtonClickListener(playbackControlButtonClickListener)
- .waveformTouchListener(waveformTouchListener)
- .audioMessagePlaybackTracker(audioMessagePlaybackTracker)
- .isLocalFile(localFilesHelper.isLocalFile(fileUrl))
- .mxcUrl(fileUrl)
- .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
- .contentDownloadStateTrackerBinder(contentDownloadStateTrackerBinder)
- .highlighted(highlight)
- .leftGuideline(avatarSizeProvider.leftGuideline)
+ .attributes(attributes)
+ .duration(messageContent.audioWaveformInfo?.duration ?: 0)
+ .waveform(messageContent.audioWaveformInfo?.waveform?.toFft().orEmpty())
+ .playbackControlButtonClickListener(playbackControlButtonClickListener)
+ .waveformTouchListener(waveformTouchListener)
+ .audioMessagePlaybackTracker(audioMessagePlaybackTracker)
+ .isLocalFile(localFilesHelper.isLocalFile(fileUrl))
+ .mxcUrl(fileUrl)
+ .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
+ .contentDownloadStateTrackerBinder(contentDownloadStateTrackerBinder)
+ .highlighted(highlight)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
}
private fun buildVerificationRequestMessageItem(
- messageContent: MessageVerificationRequestContent,
- @Suppress("UNUSED_PARAMETER")
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ messageContent: MessageVerificationRequestContent,
+ @Suppress("UNUSED_PARAMETER")
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): VerificationRequestItem? {
// If this request is not sent by me or sent to me, we should ignore it in timeline
val myUserId = session.myUserId
@@ -441,44 +441,44 @@ class MessageItemFactory @Inject constructor(
informationData.memberName
}
return VerificationRequestItem_()
- .attributes(
- VerificationRequestItem.Attributes(
- otherUserId = otherUserId,
- otherUserName = otherUserName.toString(),
- referenceId = informationData.eventId,
- informationData = informationData,
- avatarRenderer = attributes.avatarRenderer,
- messageColorProvider = attributes.messageColorProvider,
- itemLongClickListener = attributes.itemLongClickListener,
- itemClickListener = attributes.itemClickListener,
- reactionPillCallback = attributes.reactionPillCallback,
- readReceiptsCallback = attributes.readReceiptsCallback,
- emojiTypeFace = attributes.emojiTypeFace,
- reactionsSummaryEvents = attributes.reactionsSummaryEvents,
+ .attributes(
+ VerificationRequestItem.Attributes(
+ otherUserId = otherUserId,
+ otherUserName = otherUserName.toString(),
+ referenceId = informationData.eventId,
+ informationData = informationData,
+ avatarRenderer = attributes.avatarRenderer,
+ messageColorProvider = attributes.messageColorProvider,
+ itemLongClickListener = attributes.itemLongClickListener,
+ itemClickListener = attributes.itemClickListener,
+ reactionPillCallback = attributes.reactionPillCallback,
+ readReceiptsCallback = attributes.readReceiptsCallback,
+ emojiTypeFace = attributes.emojiTypeFace,
+ reactionsSummaryEvents = attributes.reactionsSummaryEvents,
+ )
)
- )
- .callback(callback)
- .highlighted(highlight)
- .leftGuideline(avatarSizeProvider.leftGuideline)
+ .callback(callback)
+ .highlighted(highlight)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
}
private fun buildFileMessageItem(
- messageContent: MessageFileContent,
- highlight: Boolean,
- attributes: AbsMessageItem.Attributes,
+ messageContent: MessageFileContent,
+ highlight: Boolean,
+ attributes: AbsMessageItem.Attributes,
): MessageFileItem {
val mxcUrl = messageContent.getFileUrl() ?: ""
return MessageFileItem_()
- .attributes(attributes)
- .leftGuideline(avatarSizeProvider.leftGuideline)
- .isLocalFile(localFilesHelper.isLocalFile(messageContent.getFileUrl()))
- .isDownloaded(session.fileService().isFileInCache(messageContent))
- .mxcUrl(mxcUrl)
- .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
- .contentDownloadStateTrackerBinder(contentDownloadStateTrackerBinder)
- .highlighted(highlight)
- .filename(messageContent.body)
- .iconRes(R.drawable.ic_paperclip)
+ .attributes(attributes)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
+ .isLocalFile(localFilesHelper.isLocalFile(messageContent.getFileUrl()))
+ .isDownloaded(session.fileService().isFileInCache(messageContent))
+ .mxcUrl(mxcUrl)
+ .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
+ .contentDownloadStateTrackerBinder(contentDownloadStateTrackerBinder)
+ .highlighted(highlight)
+ .filename(messageContent.body)
+ .iconRes(R.drawable.ic_paperclip)
}
private fun buildAudioContent(
@@ -488,10 +488,10 @@ class MessageItemFactory @Inject constructor(
highlight: Boolean,
attributes: AbsMessageItem.Attributes,
) = if (messageContent.voiceMessageIndicator != null) {
- buildVoiceMessageItem(params, messageContent, informationData, highlight, attributes)
- } else {
- buildAudioMessageItem(params, messageContent, informationData, highlight, attributes)
- }
+ buildVoiceMessageItem(params, messageContent, informationData, highlight, attributes)
+ } else {
+ buildAudioMessageItem(params, messageContent, informationData, highlight, attributes)
+ }
private fun buildNotHandledMessageItem(
messageContent: MessageContent,
@@ -504,95 +504,95 @@ class MessageItemFactory @Inject constructor(
}
private fun buildImageMessageItem(
- messageContent: MessageImageInfoContent,
- @Suppress("UNUSED_PARAMETER")
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ messageContent: MessageImageInfoContent,
+ @Suppress("UNUSED_PARAMETER")
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): MessageImageVideoItem? {
val (maxWidth, maxHeight) = timelineMediaSizeProvider.getMaxSize()
val data = ImageContentRenderer.Data(
- eventId = informationData.eventId,
- filename = messageContent.body,
- mimeType = messageContent.mimeType,
- url = messageContent.getFileUrl(),
- elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt(),
- height = messageContent.info?.height,
- maxHeight = maxHeight,
- width = messageContent.info?.width,
- maxWidth = maxWidth,
- allowNonMxcUrls = informationData.sendState.isSending()
+ eventId = informationData.eventId,
+ filename = messageContent.body,
+ mimeType = messageContent.mimeType,
+ url = messageContent.getFileUrl(),
+ elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt(),
+ height = messageContent.info?.height,
+ maxHeight = maxHeight,
+ width = messageContent.info?.width,
+ maxWidth = maxWidth,
+ allowNonMxcUrls = informationData.sendState.isSending()
)
return MessageImageVideoItem_()
- .attributes(attributes)
- .leftGuideline(avatarSizeProvider.leftGuideline)
- .imageContentRenderer(imageContentRenderer)
- .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
- .playable(messageContent.mimeType == MimeTypes.Gif)
- .highlighted(highlight)
- .mediaData(data)
- .apply {
- if (messageContent.msgType == MessageType.MSGTYPE_STICKER_LOCAL) {
- mode(ImageContentRenderer.Mode.STICKER)
- clickListener { view ->
- callback?.onImageMessageClicked(messageContent, data, view, listOf(data))
- }
- } else {
- clickListener { view ->
- callback?.onImageMessageClicked(messageContent, data, view, emptyList())
+ .attributes(attributes)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
+ .imageContentRenderer(imageContentRenderer)
+ .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
+ .playable(messageContent.mimeType == MimeTypes.Gif)
+ .highlighted(highlight)
+ .mediaData(data)
+ .apply {
+ if (messageContent.msgType == MessageType.MSGTYPE_STICKER_LOCAL) {
+ mode(ImageContentRenderer.Mode.STICKER)
+ clickListener { view ->
+ callback?.onImageMessageClicked(messageContent, data, view, listOf(data))
+ }
+ } else {
+ clickListener { view ->
+ callback?.onImageMessageClicked(messageContent, data, view, emptyList())
+ }
}
}
- }
}
private fun buildVideoMessageItem(
- messageContent: MessageVideoContent,
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ messageContent: MessageVideoContent,
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): MessageImageVideoItem? {
val (maxWidth, maxHeight) = timelineMediaSizeProvider.getMaxSize()
val thumbnailData = ImageContentRenderer.Data(
- eventId = informationData.eventId,
- filename = messageContent.body,
- mimeType = messageContent.mimeType,
- url = messageContent.videoInfo?.getThumbnailUrl(),
- elementToDecrypt = messageContent.videoInfo?.thumbnailFile?.toElementToDecrypt(),
- height = messageContent.videoInfo?.height,
- maxHeight = maxHeight,
- width = messageContent.videoInfo?.width,
- maxWidth = maxWidth,
- allowNonMxcUrls = informationData.sendState.isSending()
+ eventId = informationData.eventId,
+ filename = messageContent.body,
+ mimeType = messageContent.mimeType,
+ url = messageContent.videoInfo?.getThumbnailUrl(),
+ elementToDecrypt = messageContent.videoInfo?.thumbnailFile?.toElementToDecrypt(),
+ height = messageContent.videoInfo?.height,
+ maxHeight = maxHeight,
+ width = messageContent.videoInfo?.width,
+ maxWidth = maxWidth,
+ allowNonMxcUrls = informationData.sendState.isSending()
)
val videoData = VideoContentRenderer.Data(
- eventId = informationData.eventId,
- filename = messageContent.body,
- mimeType = messageContent.mimeType,
- url = messageContent.getFileUrl(),
- elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt(),
- thumbnailMediaData = thumbnailData
+ eventId = informationData.eventId,
+ filename = messageContent.body,
+ mimeType = messageContent.mimeType,
+ url = messageContent.getFileUrl(),
+ elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt(),
+ thumbnailMediaData = thumbnailData
)
return MessageImageVideoItem_()
- .leftGuideline(avatarSizeProvider.leftGuideline)
- .attributes(attributes)
- .imageContentRenderer(imageContentRenderer)
- .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
- .playable(true)
- .highlighted(highlight)
- .mediaData(thumbnailData)
- .clickListener { view -> callback?.onVideoMessageClicked(messageContent, videoData, view.findViewById(R.id.messageThumbnailView)) }
+ .leftGuideline(avatarSizeProvider.leftGuideline)
+ .attributes(attributes)
+ .imageContentRenderer(imageContentRenderer)
+ .contentUploadStateTrackerBinder(contentUploadStateTrackerBinder)
+ .playable(true)
+ .highlighted(highlight)
+ .mediaData(thumbnailData)
+ .clickListener { view -> callback?.onVideoMessageClicked(messageContent, videoData, view.findViewById(R.id.messageThumbnailView)) }
}
private fun buildItemForTextContent(
- messageContent: MessageTextContent,
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ messageContent: MessageTextContent,
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): VectorEpoxyModel<*>? {
val matrixFormattedBody = messageContent.matrixFormattedBody
return if (matrixFormattedBody != null) {
@@ -603,11 +603,11 @@ class MessageItemFactory @Inject constructor(
}
private fun buildFormattedTextItem(
- matrixFormattedBody: String,
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ matrixFormattedBody: String,
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): MessageTextItem? {
val compressed = htmlCompressor.compress(matrixFormattedBody)
val renderedFormattedBody = htmlRenderer.get().render(compressed, pillsPostProcessor) as Spanned
@@ -615,42 +615,42 @@ class MessageItemFactory @Inject constructor(
}
private fun buildMessageTextItem(
- body: CharSequence,
- isFormatted: Boolean,
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ body: CharSequence,
+ isFormatted: Boolean,
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): MessageTextItem? {
val renderedBody = textRenderer.render(body)
val bindingOptions = spanUtils.getBindingOptions(renderedBody)
val linkifiedBody = renderedBody.linkify(callback)
return MessageTextItem_()
- .message(
- if (informationData.hasBeenEdited) {
- annotateWithEdited(linkifiedBody, callback, informationData)
- } else {
- linkifiedBody
- }.toEpoxyCharSequence()
- )
- .useBigFont(linkifiedBody.length <= MAX_NUMBER_OF_EMOJI_FOR_BIG_FONT * 2 && containsOnlyEmojis(linkifiedBody.toString()))
- .bindingOptions(bindingOptions)
- .markwonPlugins(htmlRenderer.get().plugins)
- .searchForPills(isFormatted)
- .previewUrlRetriever(callback?.getPreviewUrlRetriever())
- .imageContentRenderer(imageContentRenderer)
- .previewUrlCallback(callback)
- .leftGuideline(avatarSizeProvider.leftGuideline)
- .attributes(attributes)
- .highlighted(highlight)
- .movementMethod(createLinkMovementMethod(callback))
+ .message(
+ if (informationData.hasBeenEdited) {
+ annotateWithEdited(linkifiedBody, callback, informationData)
+ } else {
+ linkifiedBody
+ }.toEpoxyCharSequence()
+ )
+ .useBigFont(linkifiedBody.length <= MAX_NUMBER_OF_EMOJI_FOR_BIG_FONT * 2 && containsOnlyEmojis(linkifiedBody.toString()))
+ .bindingOptions(bindingOptions)
+ .markwonPlugins(htmlRenderer.get().plugins)
+ .searchForPills(isFormatted)
+ .previewUrlRetriever(callback?.getPreviewUrlRetriever())
+ .imageContentRenderer(imageContentRenderer)
+ .previewUrlCallback(callback)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
+ .attributes(attributes)
+ .highlighted(highlight)
+ .movementMethod(createLinkMovementMethod(callback))
}
private fun annotateWithEdited(
- linkifiedBody: CharSequence,
- callback: TimelineEventController.Callback?,
- informationData: MessageInformationData,
+ linkifiedBody: CharSequence,
+ callback: TimelineEventController.Callback?,
+ informationData: MessageInformationData,
): Spannable {
val spannable = SpannableStringBuilder()
spannable.append(linkifiedBody)
@@ -660,17 +660,17 @@ class MessageItemFactory @Inject constructor(
val editStart = spannable.lastIndexOf(editedSuffix)
val editEnd = editStart + editedSuffix.length
spannable.setSpan(
- ForegroundColorSpan(color),
- editStart,
- editEnd,
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
+ ForegroundColorSpan(color),
+ editStart,
+ editEnd,
+ Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
// Note: text size is set to 14sp
spannable.setSpan(
- AbsoluteSizeSpan(dimensionConverter.spToPx(13)),
- editStart,
- editEnd,
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
+ AbsoluteSizeSpan(dimensionConverter.spToPx(13)),
+ editStart,
+ editEnd,
+ Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
spannable.setSpan(object : ClickableSpan() {
override fun onClick(widget: View) {
@@ -681,19 +681,19 @@ class MessageItemFactory @Inject constructor(
// nop
}
},
- editStart,
- editEnd,
- Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
+ editStart,
+ editEnd,
+ Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
return spannable
}
private fun buildNoticeMessageItem(
- messageContent: MessageNoticeContent,
- @Suppress("UNUSED_PARAMETER")
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ messageContent: MessageNoticeContent,
+ @Suppress("UNUSED_PARAMETER")
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): MessageTextItem? {
val htmlBody = messageContent.getHtmlBody()
val formattedBody = span {
@@ -706,23 +706,23 @@ class MessageItemFactory @Inject constructor(
val message = formattedBody.linkify(callback)
return MessageTextItem_()
- .leftGuideline(avatarSizeProvider.leftGuideline)
- .previewUrlRetriever(callback?.getPreviewUrlRetriever())
- .imageContentRenderer(imageContentRenderer)
- .previewUrlCallback(callback)
- .attributes(attributes)
- .message(message.toEpoxyCharSequence())
- .bindingOptions(bindingOptions)
- .highlighted(highlight)
- .movementMethod(createLinkMovementMethod(callback))
+ .leftGuideline(avatarSizeProvider.leftGuideline)
+ .previewUrlRetriever(callback?.getPreviewUrlRetriever())
+ .imageContentRenderer(imageContentRenderer)
+ .previewUrlCallback(callback)
+ .attributes(attributes)
+ .message(message.toEpoxyCharSequence())
+ .bindingOptions(bindingOptions)
+ .highlighted(highlight)
+ .movementMethod(createLinkMovementMethod(callback))
}
private fun buildEmoteMessageItem(
- messageContent: MessageEmoteContent,
- informationData: MessageInformationData,
- highlight: Boolean,
- callback: TimelineEventController.Callback?,
- attributes: AbsMessageItem.Attributes,
+ messageContent: MessageEmoteContent,
+ informationData: MessageInformationData,
+ highlight: Boolean,
+ callback: TimelineEventController.Callback?,
+ attributes: AbsMessageItem.Attributes,
): MessageTextItem? {
val formattedBody = SpannableStringBuilder()
formattedBody.append("* ${informationData.memberName} ")
@@ -731,48 +731,48 @@ class MessageItemFactory @Inject constructor(
val message = formattedBody.linkify(callback)
return MessageTextItem_()
- .message(
- if (informationData.hasBeenEdited) {
- annotateWithEdited(message, callback, informationData)
- } else {
- message
- }.toEpoxyCharSequence()
- )
- .bindingOptions(bindingOptions)
- .leftGuideline(avatarSizeProvider.leftGuideline)
- .previewUrlRetriever(callback?.getPreviewUrlRetriever())
- .imageContentRenderer(imageContentRenderer)
- .previewUrlCallback(callback)
- .attributes(attributes)
- .highlighted(highlight)
- .movementMethod(createLinkMovementMethod(callback))
+ .message(
+ if (informationData.hasBeenEdited) {
+ annotateWithEdited(message, callback, informationData)
+ } else {
+ message
+ }.toEpoxyCharSequence()
+ )
+ .bindingOptions(bindingOptions)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
+ .previewUrlRetriever(callback?.getPreviewUrlRetriever())
+ .imageContentRenderer(imageContentRenderer)
+ .previewUrlCallback(callback)
+ .attributes(attributes)
+ .highlighted(highlight)
+ .movementMethod(createLinkMovementMethod(callback))
}
private fun MessageContentWithFormattedBody.getHtmlBody(): CharSequence {
return matrixFormattedBody
- ?.let { htmlCompressor.compress(it) }
- ?.let { htmlRenderer.get().render(it, pillsPostProcessor) }
+ ?.let { htmlCompressor.compress(it) }
+ ?.let { htmlRenderer.get().render(it, pillsPostProcessor) }
?: body
}
private fun buildRedactedItem(
- attributes: AbsMessageItem.Attributes,
- highlight: Boolean,
+ attributes: AbsMessageItem.Attributes,
+ highlight: Boolean,
): RedactedMessageItem? {
return RedactedMessageItem_()
- .layout(attributes.informationData.messageLayout.layoutRes)
- .leftGuideline(avatarSizeProvider.leftGuideline)
- .attributes(attributes)
- .highlighted(highlight)
+ .layout(attributes.informationData.messageLayout.layoutRes)
+ .leftGuideline(avatarSizeProvider.leftGuideline)
+ .attributes(attributes)
+ .highlighted(highlight)
}
private fun List?.toFft(): List? {
return this
- ?.filterNotNull()
- ?.map {
- // Value comes from AudioWaveformView.MAX_FFT, and 1024 is the max value in the Matrix spec
- it * AudioWaveformView.MAX_FFT / 1024
- }
+ ?.filterNotNull()
+ ?.map {
+ // Value comes from AudioWaveformView.MAX_FFT, and 1024 is the max value in the Matrix spec
+ it * AudioWaveformView.MAX_FFT / 1024
+ }
}
companion object {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineVisibilityStateChangedListeners.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineVisibilityStateChangedListeners.kt
index 2337a6ea15..95feef83c0 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineVisibilityStateChangedListeners.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineVisibilityStateChangedListeners.kt
@@ -22,7 +22,7 @@ import im.vector.app.features.home.room.detail.timeline.TimelineEventController
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
class ReadMarkerVisibilityStateChangedListener(private val callback: TimelineEventController.Callback?) :
- VectorEpoxyModel.OnVisibilityStateChangedListener {
+ VectorEpoxyModel.OnVisibilityStateChangedListener {
override fun onVisibilityStateChanged(visibilityState: Int) {
if (visibilityState == VisibilityState.VISIBLE) {
@@ -33,7 +33,7 @@ class ReadMarkerVisibilityStateChangedListener(private val callback: TimelineEve
class TimelineEventVisibilityStateChangedListener(private val callback: TimelineEventController.Callback?,
private val event: TimelineEvent) :
- VectorEpoxyModel.OnVisibilityStateChangedListener {
+ VectorEpoxyModel.OnVisibilityStateChangedListener {
override fun onVisibilityStateChanged(visibilityState: Int) {
if (visibilityState == VisibilityState.VISIBLE) {
@@ -46,7 +46,7 @@ class TimelineEventVisibilityStateChangedListener(private val callback: Timeline
class MergedTimelineEventVisibilityStateChangedListener(private val callback: TimelineEventController.Callback?,
private val events: List) :
- VectorEpoxyModel.OnVisibilityStateChangedListener {
+ VectorEpoxyModel.OnVisibilityStateChangedListener {
override fun onVisibilityStateChanged(visibilityState: Int) {
if (visibilityState == VisibilityState.VISIBLE) {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt
index ea130901b1..b56f5264e6 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/CallTileTimelineItem.kt
@@ -209,13 +209,13 @@ abstract class CallTileTimelineItem : AbsBaseMessageItem {
holder.statusView.setStatus(R.string.call_tile_video_active)
}
- attributes.informationData.sentByMe -> {
+ attributes.informationData.sentByMe -> {
holder.statusView.setStatus(R.string.call_ringing)
}
- attributes.callKind.isVoiceCall -> {
+ attributes.callKind.isVoiceCall -> {
holder.statusView.setStatus(R.string.call_tile_voice_incoming)
}
- else -> {
+ else -> {
holder.statusView.setStatus(R.string.call_tile_video_incoming)
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageAudioItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageAudioItem.kt
index 3c071578cc..f574dcfdcb 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageAudioItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageAudioItem.kt
@@ -127,9 +127,11 @@ abstract class MessageAudioItem : AbsMessageItem() {
(duration * (progress.toFloat() / 100)).toInt()
)
}
+
override fun onStartTrackingTouch(seekBar: SeekBar) {
isUserSeeking = true
}
+
override fun onStopTrackingTouch(seekBar: SeekBar) {
isUserSeeking = false
val percentage = seekBar.progress.toFloat() / 100
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
index 02937574f2..82860da886 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt
@@ -126,9 +126,9 @@ abstract class MessageVoiceItem : AbsMessageItem() {
audioMessagePlaybackTracker.track(attributes.informationData.eventId, object : AudioMessagePlaybackTracker.Listener {
override fun onUpdate(state: AudioMessagePlaybackTracker.Listener.State) {
when (state) {
- is AudioMessagePlaybackTracker.Listener.State.Idle -> renderIdleState(holder, waveformColorIdle, waveformColorPlayed)
- is AudioMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state, waveformColorIdle, waveformColorPlayed)
- is AudioMessagePlaybackTracker.Listener.State.Paused -> renderPausedState(holder, state, waveformColorIdle, waveformColorPlayed)
+ is AudioMessagePlaybackTracker.Listener.State.Idle -> renderIdleState(holder, waveformColorIdle, waveformColorPlayed)
+ is AudioMessagePlaybackTracker.Listener.State.Playing -> renderPlayingState(holder, state, waveformColorIdle, waveformColorPlayed)
+ is AudioMessagePlaybackTracker.Listener.State.Paused -> renderPausedState(holder, state, waveformColorIdle, waveformColorPlayed)
is AudioMessagePlaybackTracker.Listener.State.Recording -> Unit
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/StatusTileTimelineItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/StatusTileTimelineItem.kt
index 2d9119f14c..3810f1cb6f 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/StatusTileTimelineItem.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/StatusTileTimelineItem.kt
@@ -57,7 +57,7 @@ abstract class StatusTileTimelineItem : AbsBaseMessageItem R.drawable.ic_shield_trusted
ShieldUIState.BLACK -> R.drawable.ic_shield_black
ShieldUIState.RED -> R.drawable.ic_shield_warning
- ShieldUIState.ERROR -> R.drawable.ic_warning_badge
+ ShieldUIState.ERROR -> R.drawable.ic_warning_badge
}
holder.titleView.setCompoundDrawablesWithIntrinsicBounds(
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/style/TimelineMessageLayout.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/style/TimelineMessageLayout.kt
index ae9b004f6c..a41732be2a 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/style/TimelineMessageLayout.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/style/TimelineMessageLayout.kt
@@ -29,11 +29,11 @@ sealed interface TimelineMessageLayout : Parcelable {
@Parcelize
data class Default(
- override val showAvatar: Boolean,
- override val showDisplayName: Boolean,
- override val showTimestamp: Boolean,
- // Keep defaultLayout generated on epoxy items
- override val layoutRes: Int = 0,
+ override val showAvatar: Boolean,
+ override val showDisplayName: Boolean,
+ override val showTimestamp: Boolean,
+ // Keep defaultLayout generated on epoxy items
+ override val layoutRes: Int = 0,
) : TimelineMessageLayout
@Parcelize
@@ -56,10 +56,10 @@ sealed interface TimelineMessageLayout : Parcelable {
@Parcelize
data class CornersRadius(
- val topStartRadius: Float,
- val topEndRadius: Float,
- val bottomStartRadius: Float,
- val bottomEndRadius: Float,
+ val topStartRadius: Float,
+ val topEndRadius: Float,
+ val bottomStartRadius: Float,
+ val bottomEndRadius: Float,
) : Parcelable
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomViewModel.kt
index 98be65c167..5a535e5696 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/upgrade/MigrateRoomViewModel.kt
@@ -34,7 +34,7 @@ class MigrateRoomViewModel @AssistedInject constructor(
@Assisted initialState: MigrateRoomViewState,
private val session: Session,
private val upgradeRoomViewModelTask: UpgradeRoomViewModelTask) :
- VectorViewModel(initialState) {
+ VectorViewModel(initialState) {
init {
val room = session.getRoom(initialState.roomId)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetsController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetsController.kt
index b2da3bfc78..87392c5d7a 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetsController.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/widget/RoomWidgetsController.kt
@@ -32,7 +32,7 @@ import javax.inject.Inject
class RoomWidgetsController @Inject constructor(
val stringProvider: StringProvider,
val colorProvider: ColorProvider) :
- TypedEpoxyController>() {
+ TypedEpoxyController>() {
var listener: Listener? = null
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/CollapsableTypedEpoxyController.kt b/vector/src/main/java/im/vector/app/features/home/room/list/CollapsableTypedEpoxyController.kt
index 15b3602766..8cf7e6bcab 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/CollapsableTypedEpoxyController.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/CollapsableTypedEpoxyController.kt
@@ -19,7 +19,7 @@ package im.vector.app.features.home.room.list
import com.airbnb.epoxy.EpoxyController
abstract class CollapsableTypedEpoxyController :
- EpoxyController(), CollapsableControllerExtension {
+ EpoxyController(), CollapsableControllerExtension {
private var currentData: T? = null
private var allowModelBuildRequests = false
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsSharedAction.kt b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsSharedAction.kt
index 2d61da0dd5..625118919b 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsSharedAction.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/actions/RoomListQuickActionsSharedAction.kt
@@ -25,7 +25,7 @@ sealed class RoomListQuickActionsSharedAction(
@StringRes val titleRes: Int,
@DrawableRes val iconResId: Int?,
val destructive: Boolean = false) :
- VectorSharedAction {
+ VectorSharedAction {
data class NotificationsAllNoisy(val roomId: String) : RoomListQuickActionsSharedAction(
R.string.room_list_quick_actions_notifications_all_noisy,
diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt
index 29f7df2439..545077b550 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt
@@ -18,6 +18,7 @@ package im.vector.app.features.home.room.threads
import android.app.Activity
import android.text.Spanned
+import androidx.annotation.StringRes
import androidx.core.text.HtmlCompat
import im.vector.app.R
import im.vector.app.core.resources.StringProvider
@@ -49,11 +50,17 @@ class ThreadsManager @Inject constructor(
/**
* Generates and return an Html spanned string to be rendered especially in dialogs
*/
- fun getBetaEnableThreadsMessage(): Spanned {
+ private fun generateLearnMoreHtmlString(@StringRes messageId: Int): Spanned {
val learnMore = stringProvider.getString(R.string.action_learn_more)
val learnMoreUrl = stringProvider.getString(R.string.threads_learn_more_url)
val href = "$learnMore.
"
- val message = stringProvider.getString(R.string.threads_beta_enable_notice_message, href)
+ val message = stringProvider.getString(messageId, href)
return HtmlCompat.fromHtml(message, HtmlCompat.FROM_HTML_MODE_LEGACY)
}
+
+ fun getBetaEnableThreadsMessage(): Spanned =
+ generateLearnMoreHtmlString(R.string.threads_beta_enable_notice_message)
+
+ fun getLabsEnableThreadsMessage(): Spanned =
+ generateLearnMoreHtmlString(R.string.threads_labs_enable_notice_message)
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListController.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListController.kt
index aeef69c6dc..54c44e178f 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListController.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListController.kt
@@ -71,13 +71,13 @@ class ThreadListController @Inject constructor(
}
?.forEach { threadSummary ->
val date = dateFormatter.format(threadSummary.latestEvent?.originServerTs, DateFormatKind.ROOM_LIST)
- val lastMessageFormatted = threadSummary.let {
+ val lastMessageFormatted = threadSummary.let {
displayableEventFormatter.formatThreadSummary(
event = it.latestEvent,
latestEdition = it.threadEditions.latestThreadEdition
).toString()
}
- val rootMessageFormatted = threadSummary.let {
+ val rootMessageFormatted = threadSummary.let {
displayableEventFormatter.formatThreadSummary(
event = it.rootEvent,
latestEdition = it.threadEditions.rootThreadEdition
@@ -123,12 +123,12 @@ class ThreadListController @Inject constructor(
?.forEach { timelineEvent ->
val date = dateFormatter.format(timelineEvent.root.threadDetails?.lastMessageTimestamp, DateFormatKind.ROOM_LIST)
val lastRootThreadEdition = timelineEvent.root.threadDetails?.lastRootThreadEdition
- val lastMessageFormatted = timelineEvent.root.threadDetails?.threadSummaryLatestEvent.let {
+ val lastMessageFormatted = timelineEvent.root.threadDetails?.threadSummaryLatestEvent.let {
displayableEventFormatter.formatThreadSummary(
event = it,
).toString()
}
- val rootMessageFormatted = timelineEvent.root.let {
+ val rootMessageFormatted = timelineEvent.root.let {
displayableEventFormatter.formatThreadSummary(
event = it,
latestEdition = lastRootThreadEdition
diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListFragment.kt
index 16555ef03c..c90ad542c0 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListFragment.kt
@@ -122,6 +122,7 @@ class ThreadListFragment @Inject constructor(
bugReporter.openBugReportScreen(requireActivity(), reportType = ReportType.THREADS_BETA_FEEDBACK)
}
}
+
override fun invalidate() = withState(threadListViewModel) { state ->
invalidateOptionsMenu()
renderEmptyStateIfNeeded(state)
diff --git a/vector/src/main/java/im/vector/app/features/invite/VectorInviteView.kt b/vector/src/main/java/im/vector/app/features/invite/VectorInviteView.kt
index d9f1ad343b..7c5159ce11 100644
--- a/vector/src/main/java/im/vector/app/features/invite/VectorInviteView.kt
+++ b/vector/src/main/java/im/vector/app/features/invite/VectorInviteView.kt
@@ -32,7 +32,7 @@ import javax.inject.Inject
@AndroidEntryPoint
class VectorInviteView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
- ConstraintLayout(context, attrs, defStyle) {
+ ConstraintLayout(context, attrs, defStyle) {
interface Callback {
fun onAcceptInvite()
diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
index 85679e34a7..4e0980173b 100644
--- a/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
+++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingService.kt
@@ -31,7 +31,6 @@ import kotlinx.parcelize.Parcelize
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toContent
-import org.matrix.android.sdk.api.session.room.model.livelocation.BeaconInfo
import org.matrix.android.sdk.api.session.room.model.livelocation.LiveLocationBeaconContent
import timber.log.Timber
import java.util.Timer
@@ -87,7 +86,7 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
.getSafeActiveSession()
?.let { session ->
session.coroutineScope.launch(session.coroutineDispatchers.io) {
- sendBeaconInfo(session, roomArgs)
+ sendLiveBeaconInfo(session, roomArgs)
}
}
}
@@ -95,12 +94,10 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
return START_STICKY
}
- private suspend fun sendBeaconInfo(session: Session, roomArgs: RoomArgs) {
+ private suspend fun sendLiveBeaconInfo(session: Session, roomArgs: RoomArgs) {
val beaconContent = LiveLocationBeaconContent(
- unstableBeaconInfo = BeaconInfo(
- timeout = roomArgs.durationMillis,
- isLive = true
- ),
+ timeout = roomArgs.durationMillis,
+ isLive = true,
unstableTimestampAsMilliseconds = clock.epochMillis()
).toContent()
@@ -129,8 +126,12 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
}
}
- private fun stopSharingLocation(roomId: String) {
+ fun stopSharingLocation(roomId: String) {
Timber.i("### LocationSharingService.stopSharingLocation for $roomId")
+
+ // Send a new beacon info state by setting live field as false
+ sendStoppedBeaconInfo(roomId)
+
synchronized(roomArgsList) {
roomArgsList.removeAll { it.roomId == roomId }
if (roomArgsList.isEmpty()) {
@@ -140,19 +141,39 @@ class LocationSharingService : VectorService(), LocationTracker.Callback {
}
}
+ private fun sendStoppedBeaconInfo(roomId: String) {
+ activeSessionHolder
+ .getSafeActiveSession()
+ ?.let { session ->
+ session.coroutineScope.launch(session.coroutineDispatchers.io) {
+ session.getRoom(roomId)?.stopLiveLocation(session.myUserId)
+ }
+ }
+ }
+
override fun onLocationUpdate(locationData: LocationData) {
Timber.i("### LocationSharingService.onLocationUpdate. Uncertainty: ${locationData.uncertainty}")
+ val session = activeSessionHolder.getSafeActiveSession()
// Emit location update to all rooms in which live location sharing is active
- roomArgsList.toList().forEach { roomArg ->
- sendLiveLocation(roomArg.roomId, locationData)
+ session?.coroutineScope?.launch(session.coroutineDispatchers.io) {
+ roomArgsList.toList().forEach { roomArg ->
+ sendLiveLocation(roomArg.roomId, locationData)
+ }
}
}
- private fun sendLiveLocation(roomId: String, locationData: LocationData) {
- val room = activeSessionHolder.getSafeActiveSession()?.getRoom(roomId)
+ private suspend fun sendLiveLocation(roomId: String, locationData: LocationData) {
+ val session = activeSessionHolder.getSafeActiveSession()
+ val room = session?.getRoom(roomId)
+ val userId = session?.myUserId
+
+ if (room == null || userId == null) {
+ return
+ }
+
room
- ?.getStateEvent(EventType.STATE_ROOM_BEACON_INFO.first())
+ .getLiveLocationBeaconInfo(userId, true)
?.eventId
?.let {
room.sendLiveLocation(
diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
index 9af6b1539a..e72f77531b 100644
--- a/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
+++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingServiceConnection.kt
@@ -34,6 +34,7 @@ class LocationSharingServiceConnection @Inject constructor(
private var callback: Callback? = null
private var isBound = false
+ private var locationSharingService: LocationSharingService? = null
fun bind(callback: Callback) {
this.callback = callback
@@ -51,13 +52,19 @@ class LocationSharingServiceConnection @Inject constructor(
callback = null
}
+ fun stopLiveLocationSharing(roomId: String) {
+ locationSharingService?.stopSharingLocation(roomId)
+ }
+
override fun onServiceConnected(className: ComponentName, binder: IBinder) {
+ locationSharingService = (binder as LocationSharingService.LocalBinder).getService()
isBound = true
callback?.onLocationServiceRunning()
}
override fun onServiceDisconnected(className: ComponentName) {
isBound = false
+ locationSharingService = null
callback?.onLocationServiceStopped()
}
}
diff --git a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
index dec6fef040..79d2d37c44 100644
--- a/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/login/LoginActivity.kt
@@ -42,10 +42,10 @@ import im.vector.app.features.analytics.plan.MobileScreen
import im.vector.app.features.home.HomeActivity
import im.vector.app.features.login.terms.LoginTermsFragment
import im.vector.app.features.login.terms.LoginTermsFragmentArgument
-import im.vector.app.features.login.terms.toLocalizedLoginTerms
import im.vector.app.features.pin.UnlockedActivity
import org.matrix.android.sdk.api.auth.registration.FlowResult
import org.matrix.android.sdk.api.auth.registration.Stage
+import org.matrix.android.sdk.api.auth.toLocalizedLoginTerms
import org.matrix.android.sdk.api.extensions.tryOrNull
/**
diff --git a/vector/src/main/java/im/vector/app/features/login/LoginMode.kt b/vector/src/main/java/im/vector/app/features/login/LoginMode.kt
index 00945968fb..9713e492ec 100644
--- a/vector/src/main/java/im/vector/app/features/login/LoginMode.kt
+++ b/vector/src/main/java/im/vector/app/features/login/LoginMode.kt
@@ -20,8 +20,8 @@ import android.os.Parcelable
import kotlinx.parcelize.Parcelize
import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider
-sealed class LoginMode : Parcelable
-/** because persist state */ {
+sealed class LoginMode : Parcelable { // Parcelable because persist state
+
@Parcelize object Unknown : LoginMode()
@Parcelize object Password : LoginMode()
@Parcelize data class Sso(val ssoIdentityProviders: List?) : LoginMode()
diff --git a/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt b/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt
index 515c8e9d39..68fc2d1c59 100644
--- a/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt
+++ b/vector/src/main/java/im/vector/app/features/login/SocialLoginButtonsView.kt
@@ -28,7 +28,7 @@ import im.vector.app.R
import org.matrix.android.sdk.api.auth.data.SsoIdentityProvider
class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyle: Int = 0) :
- LinearLayout(context, attrs, defStyle) {
+ LinearLayout(context, attrs, defStyle) {
fun interface InteractionListener {
fun onProviderSelected(id: String?)
@@ -99,10 +99,10 @@ class SocialLoginButtonsView @JvmOverloads constructor(context: Context, attrs:
SsoIdentityProvider.BRAND_TWITTER -> {
MaterialButton(context, null, R.attr.vctr_social_login_button_twitter_style)
}
- SsoIdentityProvider.BRAND_GITLAB -> {
+ SsoIdentityProvider.BRAND_GITLAB -> {
MaterialButton(context, null, R.attr.vctr_social_login_button_gitlab_style)
}
- else -> {
+ else -> {
// TODO Use iconUrl
MaterialButton(context, null, R.attr.materialButtonOutlinedStyle).apply {
transformationMethod = null
diff --git a/vector/src/main/java/im/vector/app/features/login/terms/PolicyController.kt b/vector/src/main/java/im/vector/app/features/login/terms/PolicyController.kt
index 405f7b09c5..42c39efdac 100644
--- a/vector/src/main/java/im/vector/app/features/login/terms/PolicyController.kt
+++ b/vector/src/main/java/im/vector/app/features/login/terms/PolicyController.kt
@@ -24,6 +24,7 @@ class PolicyController @Inject constructor() : TypedEpoxyController) {
@@ -32,6 +33,7 @@ class PolicyController @Inject constructor() : TypedEpoxyController() {
@@ -38,6 +39,9 @@ abstract class PolicyItem : EpoxyModelWithHolder() {
@EpoxyAttribute
var subtitle: String? = null
+ @EpoxyAttribute
+ var horizontalPadding: Int? = null
+
@EpoxyAttribute(EpoxyAttribute.Option.DoNotHash)
var checkChangeListener: CompoundButton.OnCheckedChangeListener? = null
@@ -46,13 +50,12 @@ abstract class PolicyItem : EpoxyModelWithHolder() {
override fun bind(holder: Holder) {
super.bind(holder)
- holder.let {
- it.checkbox.isChecked = checked
- it.checkbox.setOnCheckedChangeListener(checkChangeListener)
- it.title.text = title
- it.subtitle.text = subtitle
- it.view.onClick(clickListener)
- }
+ horizontalPadding?.let { holder.view.setHorizontalPadding(it) }
+ holder.checkbox.isChecked = checked
+ holder.checkbox.setOnCheckedChangeListener(checkChangeListener)
+ holder.title.text = title
+ holder.subtitle.text = subtitle
+ holder.view.onClick(clickListener)
}
// Ensure checkbox behaves as expected (remove the listener)
diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginGenericTextInputFormFragment2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginGenericTextInputFormFragment2.kt
index 76af86fda8..f623fb5abd 100644
--- a/vector/src/main/java/im/vector/app/features/login2/LoginGenericTextInputFormFragment2.kt
+++ b/vector/src/main/java/im/vector/app/features/login2/LoginGenericTextInputFormFragment2.kt
@@ -75,8 +75,8 @@ class LoginGenericTextInputFormFragment2 @Inject constructor() : AbstractLoginFr
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
views.loginGenericTextInputFormTextInput.setAutofillHints(
when (params.mode) {
- TextInputFormFragmentMode.SetEmail -> HintConstants.AUTOFILL_HINT_EMAIL_ADDRESS
- TextInputFormFragmentMode.SetMsisdn -> HintConstants.AUTOFILL_HINT_PHONE_NUMBER
+ TextInputFormFragmentMode.SetEmail -> HintConstants.AUTOFILL_HINT_EMAIL_ADDRESS
+ TextInputFormFragmentMode.SetMsisdn -> HintConstants.AUTOFILL_HINT_PHONE_NUMBER
TextInputFormFragmentMode.ConfirmMsisdn -> HintConstants.AUTOFILL_HINT_SMS_OTP
}
)
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToAction.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToAction.kt
index f38049640d..25db811600 100644
--- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToAction.kt
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToAction.kt
@@ -24,7 +24,7 @@ sealed class MatrixToAction : VectorViewModelAction {
object FailedToResolveUser : MatrixToAction()
object FailedToStartChatting : MatrixToAction()
data class JoinSpace(val spaceID: String, val viaServers: List?) : MatrixToAction()
- data class JoinRoom(val roomId: String, val viaServers: List?) : MatrixToAction()
+ data class JoinRoom(val roomIdOrAlias: String, val viaServers: List?) : MatrixToAction()
data class OpenSpace(val spaceID: String) : MatrixToAction()
data class OpenRoom(val roomId: String) : MatrixToAction()
}
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
index 04c2c8dd44..6d0e380bc9 100644
--- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt
@@ -33,6 +33,7 @@ import im.vector.app.core.resources.StringProvider
import im.vector.app.features.createdirect.DirectRoomHelper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
+import org.matrix.android.sdk.api.MatrixPatterns
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.permalinks.PermalinkData
@@ -296,8 +297,12 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor(
}
viewModelScope.launch {
try {
- session.joinRoom(action.roomId, null, action.viaServers?.take(3) ?: emptyList())
- _viewEvents.post(MatrixToViewEvents.NavigateToRoom(action.roomId))
+ session.joinRoom(
+ roomIdOrAlias = action.roomIdOrAlias,
+ reason = null,
+ viaServers = action.viaServers?.take(3) ?: emptyList()
+ )
+ _viewEvents.post(MatrixToViewEvents.NavigateToRoom(getRoomIdFromRoomIdOrAlias(action.roomIdOrAlias)))
} catch (failure: Throwable) {
_viewEvents.post(MatrixToViewEvents.ShowModalError(errorFormatter.toHumanReadable(failure)))
} finally {
@@ -309,6 +314,12 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor(
}
}
+ private suspend fun getRoomIdFromRoomIdOrAlias(roomIdOrAlias: String): String {
+ return if (MatrixPatterns.isRoomAlias(roomIdOrAlias)) {
+ session.getRoomIdByAlias(roomIdOrAlias, true).get().roomId
+ } else roomIdOrAlias
+ }
+
private fun handleStartChatting(action: MatrixToAction.StartChattingWithUser) {
setState {
copy(startChattingState = Loading())
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToRoomSpaceFragment.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToRoomSpaceFragment.kt
index 3b0fc175b0..4e3159b5b3 100644
--- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToRoomSpaceFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToRoomSpaceFragment.kt
@@ -60,10 +60,10 @@ class MatrixToRoomSpaceFragment @Inject constructor(
Uninitialized -> {
views.matrixToCardContentVisibility.isVisible = false
}
- is Loading -> {
+ is Loading -> {
views.matrixToCardContentVisibility.isVisible = false
}
- is Success -> {
+ is Success -> {
views.matrixToCardContentVisibility.isVisible = true
when (val peek = item.invoke()) {
is RoomInfoResult.FullInfo -> {
@@ -154,7 +154,7 @@ class MatrixToRoomSpaceFragment @Inject constructor(
}
}
}
- is Fail -> {
+ is Fail -> {
// TODO display some error copy?
sharedViewModel.handle(MatrixToAction.FailedToResolveUser)
}
@@ -176,14 +176,14 @@ class MatrixToRoomSpaceFragment @Inject constructor(
Uninitialized -> {
views.matrixToCardMainButton.render(ButtonStateView.State.Button)
}
- is Success -> {
+ is Success -> {
views.matrixToCardMainButton.render(ButtonStateView.State.Button)
}
- is Fail -> {
+ is Fail -> {
views.matrixToCardMainButton.render(ButtonStateView.State.Error)
// TODO display some error copy?
}
- is Loading -> {
+ is Loading -> {
views.matrixToCardMainButton.render(ButtonStateView.State.Loading)
}
}
@@ -191,7 +191,7 @@ class MatrixToRoomSpaceFragment @Inject constructor(
private fun mainButtonClicked() = withState(sharedViewModel) { state ->
when (val info = state.roomPeekResult.invoke()) {
- is RoomInfoResult.FullInfo -> {
+ is RoomInfoResult.FullInfo -> {
when (info.membership) {
Membership.NONE,
Membership.INVITE,
diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToUserFragment.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToUserFragment.kt
index 3792183bca..b0d68c57e8 100644
--- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToUserFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToUserFragment.kt
@@ -60,16 +60,16 @@ class MatrixToUserFragment @Inject constructor(
Uninitialized -> {
views.matrixToCardUserContentVisibility.isVisible = false
}
- is Loading -> {
+ is Loading -> {
views.matrixToCardUserContentVisibility.isVisible = false
}
- is Success -> {
+ is Success -> {
views.matrixToCardUserContentVisibility.isVisible = true
views.matrixToCardNameText.setTextOrHide(item.invoke().displayName)
views.matrixToCardUserIdText.setTextOrHide(item.invoke().id)
avatarRenderer.render(item.invoke(), views.matrixToCardAvatar)
}
- is Fail -> {
+ is Fail -> {
// TODO display some error copy?
sharedViewModel.handle(MatrixToAction.FailedToResolveUser)
}
@@ -80,17 +80,17 @@ class MatrixToUserFragment @Inject constructor(
views.matrixToCardButtonLoading.isVisible = false
views.matrixToCardSendMessageButton.isVisible = false
}
- is Success -> {
+ is Success -> {
views.matrixToCardButtonLoading.isVisible = false
views.matrixToCardSendMessageButton.isVisible = true
}
- is Fail -> {
+ is Fail -> {
views.matrixToCardButtonLoading.isVisible = false
views.matrixToCardSendMessageButton.isVisible = true
// TODO display some error copy?
sharedViewModel.handle(MatrixToAction.FailedToStartChatting)
}
- is Loading -> {
+ is Loading -> {
views.matrixToCardButtonLoading.isVisible = true
views.matrixToCardSendMessageButton.isInvisible = true
}
diff --git a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
index 8ff70c2954..086a40636c 100644
--- a/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
+++ b/vector/src/main/java/im/vector/app/features/navigation/DefaultNavigator.kt
@@ -176,6 +176,9 @@ class DefaultNavigator @Inject constructor(
Navigator.PostSwitchSpaceAction.OpenAddExistingRooms -> {
startActivity(context, SpaceManageActivity.newIntent(context, spaceId, ManageType.AddRooms), false)
}
+ Navigator.PostSwitchSpaceAction.OpenRoomList -> {
+ startActivity(context, SpaceExploreActivity.newIntent(context, spaceId), buildTask = false)
+ }
is Navigator.PostSwitchSpaceAction.OpenDefaultRoom -> {
val args = TimelineArgs(
postSwitchSpaceAction.roomId,
@@ -597,4 +600,9 @@ class DefaultNavigator @Inject constructor(
roomEncryptionTrustLevel = threadTimelineArgs.roomEncryptionTrustLevel
)))
}
+
+ override fun openScreenSharingPermissionDialog(screenCaptureIntent: Intent,
+ activityResultLauncher: ActivityResultLauncher) {
+ activityResultLauncher.launch(screenCaptureIntent)
+ }
}
diff --git a/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt b/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt
index 85826fad5b..41b5374168 100644
--- a/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt
+++ b/vector/src/main/java/im/vector/app/features/navigation/Navigator.kt
@@ -54,8 +54,9 @@ interface Navigator {
sealed class PostSwitchSpaceAction {
object None : PostSwitchSpaceAction()
- data class OpenDefaultRoom(val roomId: String, val showShareSheet: Boolean) : PostSwitchSpaceAction()
object OpenAddExistingRooms : PostSwitchSpaceAction()
+ object OpenRoomList : PostSwitchSpaceAction()
+ data class OpenDefaultRoom(val roomId: String, val showShareSheet: Boolean) : PostSwitchSpaceAction()
}
fun switchToSpace(context: Context, spaceId: String, postSwitchSpaceAction: PostSwitchSpaceAction)
@@ -167,4 +168,9 @@ interface Navigator {
fun openThread(context: Context, threadTimelineArgs: ThreadTimelineArgs, eventIdToNavigate: String? = null)
fun openThreadList(context: Context, threadTimelineArgs: ThreadTimelineArgs)
+
+ fun openScreenSharingPermissionDialog(
+ screenCaptureIntent: Intent,
+ activityResultLauncher: ActivityResultLauncher