From f2165201ebcdb9a7dc84c4f7bce172c5db8abd26 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 13 Jan 2022 17:53:26 +0100 Subject: [PATCH 1/5] Remove unused module matrix-sdk-android-rx and do some cleanup --- attachment-viewer/build.gradle | 3 - build.gradle | 10 - changelog.d/4942.misc | 1 + dependencies.gradle | 4 +- matrix-sdk-android-rx/.gitignore | 1 - matrix-sdk-android-rx/build.gradle | 47 ---- matrix-sdk-android-rx/proguard-rules.pro | 21 -- .../src/main/AndroidManifest.xml | 1 - .../android/sdk/rx/LiveDataObservable.kt | 71 ----- .../org/matrix/android/sdk/rx/OptionalRx.kt | 30 --- .../java/org/matrix/android/sdk/rx/RxRoom.kt | 158 ----------- .../org/matrix/android/sdk/rx/RxSession.kt | 251 ------------------ .../sdk/rx/SecretsSynchronisationInfo.kt | 27 -- settings.gradle | 1 - 14 files changed, 2 insertions(+), 624 deletions(-) create mode 100644 changelog.d/4942.misc delete mode 100644 matrix-sdk-android-rx/.gitignore delete mode 100644 matrix-sdk-android-rx/build.gradle delete mode 100644 matrix-sdk-android-rx/proguard-rules.pro delete mode 100644 matrix-sdk-android-rx/src/main/AndroidManifest.xml delete mode 100644 matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/LiveDataObservable.kt delete mode 100644 matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/OptionalRx.kt delete mode 100644 matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt delete mode 100644 matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt delete mode 100644 matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/SecretsSynchronisationInfo.kt diff --git a/attachment-viewer/build.gradle b/attachment-viewer/build.gradle index 02fbfc794c..8f3d970834 100644 --- a/attachment-viewer/build.gradle +++ b/attachment-viewer/build.gradle @@ -50,9 +50,6 @@ dependencies { implementation 'com.github.chrisbanes:PhotoView:2.3.0' - implementation libs.rx.rxKotlin - implementation libs.rx.rxAndroid - implementation libs.androidx.core implementation libs.androidx.appCompat implementation libs.androidx.recyclerview diff --git a/build.gradle b/build.gradle index b7299b01f7..5fdeba24de 100644 --- a/build.gradle +++ b/build.gradle @@ -153,13 +153,3 @@ project(":diff-match-patch") { // } // } //} -// -//project(":matrix-sdk-android-rx") { -// sonarqube { -// properties { -// property "sonar.sources", project(":matrix-sdk-android-rx").android.sourceSets.main.java.srcDirs -// // exclude source code from analyses separated by a colon (:) -// // property "sonar.exclusions", "**/*.*" -// } -// } -//} diff --git a/changelog.d/4942.misc b/changelog.d/4942.misc new file mode 100644 index 0000000000..29fb8cee55 --- /dev/null +++ b/changelog.d/4942.misc @@ -0,0 +1 @@ +Remove unused module matrix-sdk-android-rx and do some cleanup \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index 2243510f92..b4e1a7e7fa 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -42,7 +42,6 @@ ext.libs = [ jetbrains : [ 'coroutinesCore' : "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinCoroutines", 'coroutinesAndroid' : "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinCoroutines", - 'coroutinesRx2' : "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$kotlinCoroutines", 'coroutinesTest' : "org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinCoroutines" ], androidx : [ @@ -87,8 +86,7 @@ ext.libs = [ 'retrofitMoshi' : "com.squareup.retrofit2:converter-moshi:$retrofit" ], rx : [ - 'rxKotlin' : "io.reactivex.rxjava2:rxkotlin:2.4.0", - 'rxAndroid' : "io.reactivex.rxjava2:rxandroid:2.1.1" + 'rxKotlin' : "io.reactivex.rxjava2:rxkotlin:2.4.0" ], arrow : [ 'core' : "io.arrow-kt:arrow-core:$arrow", diff --git a/matrix-sdk-android-rx/.gitignore b/matrix-sdk-android-rx/.gitignore deleted file mode 100644 index 796b96d1c4..0000000000 --- a/matrix-sdk-android-rx/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/matrix-sdk-android-rx/build.gradle b/matrix-sdk-android-rx/build.gradle deleted file mode 100644 index dbd761cee3..0000000000 --- a/matrix-sdk-android-rx/build.gradle +++ /dev/null @@ -1,47 +0,0 @@ -apply plugin: 'com.android.library' -apply plugin: 'kotlin-android' -apply plugin: 'kotlin-kapt' - -android { - compileSdk versions.compileSdk - - defaultConfig { - minSdk versions.minSdk - targetSdk versions.targetSdk - - // Multidex is useful for tests - multiDexEnabled true - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - - compileOptions { - sourceCompatibility versions.sourceCompat - targetCompatibility versions.targetCompat - } - - kotlinOptions { - jvmTarget = "11" - } -} - -dependencies { - - implementation project(":matrix-sdk-android") - implementation libs.androidx.appCompat - implementation libs.rx.rxKotlin - implementation libs.rx.rxAndroid - implementation libs.jetbrains.coroutinesRx2 - - // Paging - implementation libs.androidx.pagingRuntimeKtx - - // Logging - implementation libs.jakewharton.timber -} diff --git a/matrix-sdk-android-rx/proguard-rules.pro b/matrix-sdk-android-rx/proguard-rules.pro deleted file mode 100644 index f1b424510d..0000000000 --- a/matrix-sdk-android-rx/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/matrix-sdk-android-rx/src/main/AndroidManifest.xml b/matrix-sdk-android-rx/src/main/AndroidManifest.xml deleted file mode 100644 index 5f399e9f84..0000000000 --- a/matrix-sdk-android-rx/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/LiveDataObservable.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/LiveDataObservable.kt deleted file mode 100644 index 56b52facf9..0000000000 --- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/LiveDataObservable.kt +++ /dev/null @@ -1,71 +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.rx - -import androidx.lifecycle.LiveData -import androidx.lifecycle.Observer -import io.reactivex.Observable -import io.reactivex.android.MainThreadDisposable -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.schedulers.Schedulers - -private class LiveDataObservable( - private val liveData: LiveData, - private val valueIfNull: T? = null -) : Observable() { - - override fun subscribeActual(observer: io.reactivex.Observer) { - val relay = RemoveObserverInMainThread(observer) - observer.onSubscribe(relay) - liveData.observeForever(relay) - } - - private inner class RemoveObserverInMainThread(private val observer: io.reactivex.Observer) : - MainThreadDisposable(), Observer { - - override fun onChanged(t: T?) { - if (!isDisposed) { - if (t == null) { - if (valueIfNull != null) { - observer.onNext(valueIfNull) - } else { - observer.onError(NullPointerException( - "convert liveData value t to RxJava onNext(t), t cannot be null")) - } - } else { - observer.onNext(t) - } - } - } - - override fun onDispose() { - liveData.removeObserver(this) - } - } -} - -fun LiveData.asObservable(): Observable { - return LiveDataObservable(this).observeOn(Schedulers.computation()) -} - -internal fun Observable.startWithCallable(supplier: () -> T): Observable { - val startObservable = Observable - .fromCallable(supplier) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - return startWith(startObservable) -} diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/OptionalRx.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/OptionalRx.kt deleted file mode 100644 index 936bd824e7..0000000000 --- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/OptionalRx.kt +++ /dev/null @@ -1,30 +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.rx - -import io.reactivex.Observable -import org.matrix.android.sdk.api.util.Optional - -fun Observable>.unwrap(): Observable { - return filter { it.hasValue() }.map { it.get() } -} - -fun Observable>.mapOptional(fn: (T) -> U?): Observable> { - return map { - it.map(fn) - } -} diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt deleted file mode 100644 index b3495c4493..0000000000 --- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt +++ /dev/null @@ -1,158 +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.rx - -import android.net.Uri -import io.reactivex.Completable -import io.reactivex.Observable -import io.reactivex.Single -import kotlinx.coroutines.rx2.rxCompletable -import kotlinx.coroutines.rx2.rxSingle -import org.matrix.android.sdk.api.query.QueryStringValue -import org.matrix.android.sdk.api.session.content.ContentAttachmentData -import org.matrix.android.sdk.api.session.events.model.Event -import org.matrix.android.sdk.api.session.identity.ThreePid -import org.matrix.android.sdk.api.session.room.Room -import org.matrix.android.sdk.api.session.room.members.RoomMemberQueryParams -import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary -import org.matrix.android.sdk.api.session.room.model.GuestAccess -import org.matrix.android.sdk.api.session.room.model.ReadReceipt -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.RoomMemberSummary -import org.matrix.android.sdk.api.session.room.model.RoomSummary -import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState -import org.matrix.android.sdk.api.session.room.send.UserDraft -import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent -import org.matrix.android.sdk.api.util.Optional -import org.matrix.android.sdk.api.util.toOptional - -class RxRoom(private val room: Room) { - - fun liveRoomSummary(): Observable> { - return room.getRoomSummaryLive() - .asObservable() - .startWithCallable { room.roomSummary().toOptional() } - } - - fun liveRoomMembers(queryParams: RoomMemberQueryParams): Observable> { - return room.getRoomMembersLive(queryParams).asObservable() - .startWithCallable { - room.getRoomMembers(queryParams) - } - } - - fun liveAnnotationSummary(eventId: String): Observable> { - return room.getEventAnnotationsSummaryLive(eventId).asObservable() - .startWithCallable { - room.getEventAnnotationsSummary(eventId).toOptional() - } - } - - fun liveTimelineEvent(eventId: String): Observable> { - return room.getTimeLineEventLive(eventId).asObservable() - .startWithCallable { - room.getTimeLineEvent(eventId).toOptional() - } - } - - fun liveStateEvent(eventType: String, stateKey: QueryStringValue): Observable> { - return room.getStateEventLive(eventType, stateKey).asObservable() - .startWithCallable { - room.getStateEvent(eventType, stateKey).toOptional() - } - } - - fun liveStateEvents(eventTypes: Set): Observable> { - return room.getStateEventsLive(eventTypes).asObservable() - .startWithCallable { - room.getStateEvents(eventTypes) - } - } - - fun liveReadMarker(): Observable> { - return room.getReadMarkerLive().asObservable() - } - - fun liveReadReceipt(): Observable> { - return room.getMyReadReceiptLive().asObservable() - } - - fun loadRoomMembersIfNeeded(): Single = rxSingle { - room.loadRoomMembersIfNeeded() - } - - fun joinRoom(reason: String? = null, - viaServers: List = emptyList()): Single = rxSingle { - room.join(reason, viaServers) - } - - fun liveEventReadReceipts(eventId: String): Observable> { - return room.getEventReadReceiptsLive(eventId).asObservable() - } - - fun liveDraft(): Observable> { - return room.getDraftLive().asObservable() - .startWithCallable { - room.getDraft().toOptional() - } - } - - fun liveNotificationState(): Observable { - return room.getLiveRoomNotificationState().asObservable() - } - - fun invite(userId: String, reason: String? = null): Completable = rxCompletable { - room.invite(userId, reason) - } - - fun invite3pid(threePid: ThreePid): Completable = rxCompletable { - room.invite3pid(threePid) - } - - fun updateTopic(topic: String): Completable = rxCompletable { - room.updateTopic(topic) - } - - fun updateName(name: String): Completable = rxCompletable { - room.updateName(name) - } - - fun updateHistoryReadability(readability: RoomHistoryVisibility): Completable = rxCompletable { - room.updateHistoryReadability(readability) - } - - fun updateJoinRule(joinRules: RoomJoinRules?, guestAccess: GuestAccess?): Completable = rxCompletable { - room.updateJoinRule(joinRules, guestAccess) - } - - fun updateAvatar(avatarUri: Uri, fileName: String): Completable = rxCompletable { - room.updateAvatar(avatarUri, fileName) - } - - fun deleteAvatar(): Completable = rxCompletable { - room.deleteAvatar() - } - - fun sendMedia(attachment: ContentAttachmentData, compressBeforeSending: Boolean, roomIds: Set): Completable = rxCompletable { - room.sendMedia(attachment, compressBeforeSending, roomIds) - } -} - -fun Room.rx(): RxRoom { - return RxRoom(this) -} diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt deleted file mode 100644 index 47203816b4..0000000000 --- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt +++ /dev/null @@ -1,251 +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.rx - -import androidx.paging.PagedList -import io.reactivex.Observable -import io.reactivex.Single -import io.reactivex.functions.Function3 -import kotlinx.coroutines.rx2.rxSingle -import org.matrix.android.sdk.api.extensions.orFalse -import org.matrix.android.sdk.api.query.QueryStringValue -import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.accountdata.UserAccountDataEvent -import org.matrix.android.sdk.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME -import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME -import org.matrix.android.sdk.api.session.crypto.crosssigning.MXCrossSigningInfo -import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME -import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME -import org.matrix.android.sdk.api.session.group.GroupSummaryQueryParams -import org.matrix.android.sdk.api.session.group.model.GroupSummary -import org.matrix.android.sdk.api.session.identity.FoundThreePid -import org.matrix.android.sdk.api.session.identity.ThreePid -import org.matrix.android.sdk.api.session.pushers.Pusher -import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams -import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataEvent -import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState -import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary -import org.matrix.android.sdk.api.session.room.model.RoomSummary -import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams -import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams -import org.matrix.android.sdk.api.session.sync.SyncState -import org.matrix.android.sdk.api.session.user.model.User -import org.matrix.android.sdk.api.session.widgets.model.Widget -import org.matrix.android.sdk.api.util.JsonDict -import org.matrix.android.sdk.api.util.Optional -import org.matrix.android.sdk.api.util.toOptional -import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo -import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo -import org.matrix.android.sdk.internal.crypto.store.PrivateKeysInfo -import org.matrix.android.sdk.internal.session.room.alias.RoomAliasDescription - -class RxSession(private val session: Session) { - - fun liveRoomSummaries(queryParams: RoomSummaryQueryParams): Observable> { - return session.getRoomSummariesLive(queryParams).asObservable() - .startWithCallable { - session.getRoomSummaries(queryParams) - } - } - - fun liveGroupSummaries(queryParams: GroupSummaryQueryParams): Observable> { - return session.getGroupSummariesLive(queryParams).asObservable() - .startWithCallable { - session.getGroupSummaries(queryParams) - } - } - - fun liveSpaceSummaries(queryParams: SpaceSummaryQueryParams): Observable> { - return session.spaceService().getSpaceSummariesLive(queryParams).asObservable() - .startWithCallable { - session.spaceService().getSpaceSummaries(queryParams) - } - } - - fun liveBreadcrumbs(queryParams: RoomSummaryQueryParams): Observable> { - return session.getBreadcrumbsLive(queryParams).asObservable() - .startWithCallable { - session.getBreadcrumbs(queryParams) - } - } - - fun liveMyDevicesInfo(): Observable> { - return session.cryptoService().getLiveMyDevicesInfo().asObservable() - .startWithCallable { - session.cryptoService().getMyDevicesInfo() - } - } - - fun liveSyncState(): Observable { - return session.getSyncStateLive().asObservable() - } - - fun livePushers(): Observable> { - return session.getPushersLive().asObservable() - } - - fun liveUser(userId: String): Observable> { - return session.getUserLive(userId).asObservable() - .startWithCallable { - session.getUser(userId).toOptional() - } - } - - fun liveRoomMember(userId: String, roomId: String): Observable> { - return session.getRoomMemberLive(userId, roomId).asObservable() - .startWithCallable { - session.getRoomMember(userId, roomId).toOptional() - } - } - - fun liveUsers(): Observable> { - return session.getUsersLive().asObservable() - } - - fun liveIgnoredUsers(): Observable> { - return session.getIgnoredUsersLive().asObservable() - } - - fun livePagedUsers(filter: String? = null, excludedUserIds: Set? = null): Observable> { - return session.getPagedUsersLive(filter, excludedUserIds).asObservable() - } - - fun liveThreePIds(refreshData: Boolean): Observable> { - return session.getThreePidsLive(refreshData).asObservable() - .startWithCallable { session.getThreePids() } - } - - fun livePendingThreePIds(): Observable> { - return session.getPendingThreePidsLive().asObservable() - .startWithCallable { session.getPendingThreePids() } - } - - fun createRoom(roomParams: CreateRoomParams): Single = rxSingle { - session.createRoom(roomParams) - } - - fun searchUsersDirectory(search: String, - limit: Int, - excludedUserIds: Set): Single> = rxSingle { - session.searchUsersDirectory(search, limit, excludedUserIds) - } - - fun joinRoom(roomIdOrAlias: String, - reason: String? = null, - viaServers: List = emptyList()): Single = rxSingle { - session.joinRoom(roomIdOrAlias, reason, viaServers) - } - - fun getRoomIdByAlias(roomAlias: String, - searchOnServer: Boolean): Single> = rxSingle { - session.getRoomIdByAlias(roomAlias, searchOnServer) - } - - fun getProfileInfo(userId: String): Single = rxSingle { - session.getProfile(userId) - } - - fun liveUserCryptoDevices(userId: String): Observable> { - return session.cryptoService().getLiveCryptoDeviceInfo(userId).asObservable().startWithCallable { - session.cryptoService().getCryptoDeviceInfo(userId) - } - } - - fun liveCrossSigningInfo(userId: String): Observable> { - return session.cryptoService().crossSigningService().getLiveCrossSigningKeys(userId).asObservable() - .startWithCallable { - session.cryptoService().crossSigningService().getUserCrossSigningKeys(userId).toOptional() - } - } - - fun liveCrossSigningPrivateKeys(): Observable> { - return session.cryptoService().crossSigningService().getLiveCrossSigningPrivateKeys().asObservable() - .startWithCallable { - session.cryptoService().crossSigningService().getCrossSigningPrivateKeys().toOptional() - } - } - - fun liveUserAccountData(types: Set): Observable> { - return session.accountDataService().getLiveUserAccountDataEvents(types).asObservable() - .startWithCallable { - session.accountDataService().getUserAccountDataEvents(types) - } - } - - fun liveRoomAccountData(types: Set): Observable> { - return session.accountDataService().getLiveRoomAccountDataEvents(types).asObservable() - .startWithCallable { - session.accountDataService().getRoomAccountDataEvents(types) - } - } - - fun liveRoomWidgets( - roomId: String, - widgetId: QueryStringValue, - widgetTypes: Set? = null, - excludedTypes: Set? = null - ): Observable> { - return session.widgetService().getRoomWidgetsLive(roomId, widgetId, widgetTypes, excludedTypes).asObservable() - .startWithCallable { - session.widgetService().getRoomWidgets(roomId, widgetId, widgetTypes, excludedTypes) - } - } - - fun liveRoomChangeMembershipState(): Observable> { - return session.getChangeMembershipsLive().asObservable() - } - - fun liveSecretSynchronisationInfo(): Observable { - return Observable.combineLatest, Optional, Optional, SecretsSynchronisationInfo>( - liveUserAccountData(setOf(MASTER_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME, KEYBACKUP_SECRET_SSSS_NAME)), - liveCrossSigningInfo(session.myUserId), - liveCrossSigningPrivateKeys(), - Function3 { _, crossSigningInfo, pInfo -> - // first check if 4S is already setup - val is4SSetup = session.sharedSecretStorageService.isRecoverySetup() - val isCrossSigningEnabled = crossSigningInfo.getOrNull() != null - val isCrossSigningTrusted = crossSigningInfo.getOrNull()?.isTrusted() == true - val allPrivateKeysKnown = pInfo.getOrNull()?.allKnown().orFalse() - - val keysBackupService = session.cryptoService().keysBackupService() - val currentBackupVersion = keysBackupService.currentBackupVersion - val megolmBackupAvailable = currentBackupVersion != null - val savedBackupKey = keysBackupService.getKeyBackupRecoveryKeyInfo() - - val megolmKeyKnown = savedBackupKey?.version == currentBackupVersion - SecretsSynchronisationInfo( - isBackupSetup = is4SSetup, - isCrossSigningEnabled = isCrossSigningEnabled, - isCrossSigningTrusted = isCrossSigningTrusted, - allPrivateKeysKnown = allPrivateKeysKnown, - megolmBackupAvailable = megolmBackupAvailable, - megolmSecretKnown = megolmKeyKnown, - isMegolmKeyIn4S = session.sharedSecretStorageService.isMegolmKeyInBackup() - ) - } - ) - .distinctUntilChanged() - } - - fun lookupThreePid(threePid: ThreePid): Single> = rxSingle { - session.identityService().lookUp(listOf(threePid)).firstOrNull().toOptional() - } -} - -fun Session.rx(): RxSession { - return RxSession(this) -} diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/SecretsSynchronisationInfo.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/SecretsSynchronisationInfo.kt deleted file mode 100644 index 6da3217070..0000000000 --- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/SecretsSynchronisationInfo.kt +++ /dev/null @@ -1,27 +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.rx - -data class SecretsSynchronisationInfo( - val isBackupSetup: Boolean, - val isCrossSigningEnabled: Boolean, - val isCrossSigningTrusted: Boolean, - val allPrivateKeysKnown: Boolean, - val megolmBackupAvailable: Boolean, - val megolmSecretKnown: Boolean, - val isMegolmKeyIn4S: Boolean -) diff --git a/settings.gradle b/settings.gradle index e3b84b4733..84b908e97c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,6 +1,5 @@ include ':vector' include ':matrix-sdk-android' -include ':matrix-sdk-android-rx' include ':diff-match-patch' include ':attachment-viewer' include ':multipicker' From b8aaa177c21a69e23eba59659a26be2c1db4f88a Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 13 Jan 2022 20:14:19 +0100 Subject: [PATCH 2/5] Add a module library/core-utils as a base module for all util tools --- library/core-utils/.gitignore | 1 + library/core-utils/build.gradle | 55 +++++++++++++++++++ .../core-utils/src/main/AndroidManifest.xml | 2 + .../lib/core/utils}/flow/TimingOperators.kt | 4 +- .../lib/core/utils/timer}/CountUpTimer.kt | 5 +- settings.gradle | 1 + vector/build.gradle | 1 + .../analytics/DecryptionFailureTracker.kt | 2 +- .../app/features/call/webrtc/WebRtcCall.kt | 4 +- .../quads/SharedSecuredStorageKeyFragment.kt | 2 +- .../SharedSecuredStoragePassphraseFragment.kt | 2 +- .../BootstrapConfirmPassphraseFragment.kt | 2 +- .../BootstrapEnterPassphraseFragment.kt | 2 +- .../recover/BootstrapMigrateBackupFragment.kt | 2 +- .../app/features/home/HomeDetailViewModel.kt | 2 +- .../home/UnreadMessagesSharedViewModel.kt | 2 +- .../home/room/detail/RoomDetailViewModel.kt | 2 +- .../detail/composer/VoiceMessageHelper.kt | 2 +- .../voice/VoiceMessageRecorderView.kt | 2 +- .../reactions/EmojiReactionPickerActivity.kt | 2 +- .../settings/devices/DevicesViewModel.kt | 2 +- .../spaces/preview/SpacePreviewFragment.kt | 2 +- 22 files changed, 82 insertions(+), 19 deletions(-) create mode 100644 library/core-utils/.gitignore create mode 100644 library/core-utils/build.gradle create mode 100644 library/core-utils/src/main/AndroidManifest.xml rename {vector/src/main/java/im/vector/app/core => library/core-utils/src/main/java/im/vector/lib/core/utils}/flow/TimingOperators.kt (97%) rename {vector/src/main/java/im/vector/app/core/utils => library/core-utils/src/main/java/im/vector/lib/core/utils/timer}/CountUpTimer.kt (93%) diff --git a/library/core-utils/.gitignore b/library/core-utils/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/library/core-utils/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/library/core-utils/build.gradle b/library/core-utils/build.gradle new file mode 100644 index 0000000000..ad3a948808 --- /dev/null +++ b/library/core-utils/build.gradle @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 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. + */ + +plugins { + id 'com.android.library' + id 'kotlin-android' +} + +android { + compileSdk versions.compileSdk + defaultConfig { + minSdk versions.minSdk + targetSdk versions.targetSdk + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility versions.sourceCompat + targetCompatibility versions.targetCompat + } + + kotlinOptions { + jvmTarget = "11" + freeCompilerArgs += [ + "-Xopt-in=kotlin.RequiresOptIn" + ] + } +} + +dependencies { + implementation libs.androidx.appCompat + implementation libs.jetbrains.coroutinesAndroid +} \ No newline at end of file diff --git a/library/core-utils/src/main/AndroidManifest.xml b/library/core-utils/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..20a9414519 --- /dev/null +++ b/library/core-utils/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/core/flow/TimingOperators.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/flow/TimingOperators.kt similarity index 97% rename from vector/src/main/java/im/vector/app/core/flow/TimingOperators.kt rename to library/core-utils/src/main/java/im/vector/lib/core/utils/flow/TimingOperators.kt index 621a80d96e..065c19c17a 100644 --- a/vector/src/main/java/im/vector/app/core/flow/TimingOperators.kt +++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/flow/TimingOperators.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.core.flow +package im.vector.lib.core.utils.flow import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -85,10 +85,12 @@ fun Flow.throttleFirst(windowDuration: Long): Flow = flow { } } +@ExperimentalCoroutinesApi fun tickerFlow(scope: CoroutineScope, delayMillis: Long, initialDelayMillis: Long = delayMillis): Flow { return scope.fixedPeriodTicker(delayMillis, initialDelayMillis).consumeAsFlow() } +@ExperimentalCoroutinesApi private fun CoroutineScope.fixedPeriodTicker(delayMillis: Long, initialDelayMillis: Long = delayMillis): ReceiveChannel { require(delayMillis >= 0) { "Expected non-negative delay, but has $delayMillis ms" } require(initialDelayMillis >= 0) { "Expected non-negative initial delay, but has $initialDelayMillis ms" } diff --git a/vector/src/main/java/im/vector/app/core/utils/CountUpTimer.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt similarity index 93% rename from vector/src/main/java/im/vector/app/core/utils/CountUpTimer.kt rename to library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt index b58d0fb3f6..e9d311fe03 100644 --- a/vector/src/main/java/im/vector/app/core/utils/CountUpTimer.kt +++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package im.vector.app.core.utils +package im.vector.lib.core.utils.timer -import im.vector.app.core.flow.tickerFlow +import im.vector.lib.core.utils.flow.tickerFlow import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.cancel @@ -27,6 +27,7 @@ import kotlinx.coroutines.flow.onEach import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicLong +@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class) class CountUpTimer(private val intervalInMs: Long = 1_000) { private val coroutineScope = CoroutineScope(Dispatchers.Main) diff --git a/settings.gradle b/settings.gradle index 84b908e97c..7d3c1de746 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,5 +3,6 @@ include ':matrix-sdk-android' include ':diff-match-patch' include ':attachment-viewer' include ':multipicker' +include ':library:core-utils' include ':library:ui-styles' include ':matrix-sdk-android-flow' diff --git a/vector/build.gradle b/vector/build.gradle index d0bb7e3666..96e85521ee 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -333,6 +333,7 @@ dependencies { implementation project(":multipicker") implementation project(":attachment-viewer") implementation project(":library:ui-styles") + implementation project(":library:core-utils") implementation 'androidx.multidex:multidex:2.0.1' implementation libs.jetbrains.coroutinesCore diff --git a/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt b/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt index cd98356445..eb2a99fdd4 100644 --- a/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt +++ b/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt @@ -16,9 +16,9 @@ package im.vector.app.features.analytics -import im.vector.app.core.flow.tickerFlow import im.vector.app.core.time.Clock import im.vector.app.features.analytics.plan.Error +import im.vector.lib.core.utils.flow.tickerFlow import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob 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 bbb158f6e4..786e1655d6 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 @@ -19,9 +19,7 @@ package im.vector.app.features.call.webrtc import android.content.Context import android.hardware.camera2.CameraManager import androidx.core.content.getSystemService -import im.vector.app.core.flow.chunk import im.vector.app.core.services.CallService -import im.vector.app.core.utils.CountUpTimer import im.vector.app.core.utils.PublishDataSource import im.vector.app.core.utils.TextUtils.formatDuration import im.vector.app.features.call.CameraEventsHandlerAdapter @@ -37,6 +35,8 @@ import im.vector.app.features.call.utils.awaitSetLocalDescription import im.vector.app.features.call.utils.awaitSetRemoteDescription import im.vector.app.features.call.utils.mapToCallCandidate import im.vector.app.features.session.coroutineScope +import im.vector.lib.core.utils.flow.chunk +import im.vector.lib.core.utils.timer.CountUpTimer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageKeyFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageKeyFragment.kt index c49291d6a2..8e7f11f0f5 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageKeyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStorageKeyFragment.kt @@ -26,10 +26,10 @@ import androidx.lifecycle.lifecycleScope import com.airbnb.mvrx.activityViewModel import im.vector.app.R import im.vector.app.core.extensions.registerStartForActivityResult -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.utils.startImportTextFromFileIntent import im.vector.app.databinding.FragmentSsssAccessFromKeyBinding +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.matrix.android.sdk.api.extensions.tryOrNull diff --git a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt index c93e562d77..70c1003773 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/quads/SharedSecuredStoragePassphraseFragment.kt @@ -25,10 +25,10 @@ import androidx.core.text.toSpannable import androidx.lifecycle.lifecycleScope import com.airbnb.mvrx.activityViewModel import im.vector.app.R -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.ColorProvider import im.vector.app.databinding.FragmentSsssAccessFromPassphraseBinding +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import reactivecircus.flowbinding.android.widget.editorActionEvents 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 940a4d9af3..8a211388ed 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 @@ -27,9 +27,9 @@ import com.airbnb.mvrx.parentFragmentViewModel import com.airbnb.mvrx.withState import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentBootstrapEnterPassphraseBinding +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import reactivecircus.flowbinding.android.widget.editorActionEvents 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 77fb5ab3a6..51430ba12e 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 @@ -25,10 +25,10 @@ import androidx.lifecycle.lifecycleScope import com.airbnb.mvrx.parentFragmentViewModel import com.airbnb.mvrx.withState import im.vector.app.R -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentBootstrapEnterPassphraseBinding import im.vector.app.features.settings.VectorLocale +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import reactivecircus.flowbinding.android.widget.editorActionEvents diff --git a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt index 5d0f3bbeae..429d51857c 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/recover/BootstrapMigrateBackupFragment.kt @@ -33,12 +33,12 @@ import com.airbnb.mvrx.withState import im.vector.app.R import im.vector.app.core.extensions.hideKeyboard import im.vector.app.core.extensions.registerStartForActivityResult -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.ColorProvider import im.vector.app.core.utils.colorizeMatchingText import im.vector.app.core.utils.startImportTextFromFileIntent import im.vector.app.databinding.FragmentBootstrapMigrateBackupBinding +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import org.matrix.android.sdk.api.extensions.tryOrNull diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt index 5260330475..f284de9d48 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt @@ -27,7 +27,6 @@ import im.vector.app.RoomGroupingMethod import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.extensions.singletonEntryPoint -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.call.dialpad.DialPadLookup import im.vector.app.features.call.lookup.CallProtocolsChecker @@ -37,6 +36,7 @@ import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.invite.showInvites import im.vector.app.features.settings.VectorDataStore import im.vector.app.features.ui.UiStateRepository +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterIsInstance diff --git a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt index 6c0ae71cfa..b65a85eb00 100644 --- a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt @@ -26,12 +26,12 @@ import im.vector.app.AppStateHandler import im.vector.app.RoomGroupingMethod import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.EmptyAction import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.invite.AutoAcceptInvites import im.vector.app.features.settings.VectorPreferences +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index aba636309f..c1ff67d5d9 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -33,7 +33,6 @@ import im.vector.app.R import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.extensions.exhaustive -import im.vector.app.core.flow.chunk import im.vector.app.core.mvrx.runCatchingToAsync import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider @@ -55,6 +54,7 @@ import im.vector.app.features.powerlevel.PowerLevelsFlowFactory import im.vector.app.features.session.coroutineScope import im.vector.app.features.settings.VectorDataStore import im.vector.app.features.settings.VectorPreferences +import im.vector.lib.core.utils.flow.chunk import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.combine diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt index b7e584b4c0..735d356476 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageHelper.kt @@ -21,11 +21,11 @@ import android.media.AudioAttributes import android.media.MediaPlayer import androidx.core.content.FileProvider import im.vector.app.BuildConfig -import im.vector.app.core.utils.CountUpTimer import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker import im.vector.app.features.voice.VoiceFailure import im.vector.app.features.voice.VoiceRecorder import im.vector.app.features.voice.VoiceRecorderProvider +import im.vector.lib.core.utils.timer.CountUpTimer import im.vector.lib.multipicker.entity.MultiPickerAudioType import im.vector.lib.multipicker.utils.toMultiPickerAudioType import org.matrix.android.sdk.api.extensions.orFalse diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt index 312963771d..9a643796a9 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt @@ -26,10 +26,10 @@ import im.vector.app.R import im.vector.app.core.extensions.exhaustive import im.vector.app.core.hardware.vibrate import im.vector.app.core.time.Clock -import im.vector.app.core.utils.CountUpTimer import im.vector.app.core.utils.DimensionConverter import im.vector.app.databinding.ViewVoiceMessageRecorderBinding import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker +import im.vector.lib.core.utils.timer.CountUpTimer import javax.inject.Inject import kotlin.math.floor diff --git a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt index d377c74ad7..dc10c89967 100644 --- a/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt +++ b/vector/src/main/java/im/vector/app/features/reactions/EmojiReactionPickerActivity.kt @@ -32,10 +32,10 @@ import dagger.hilt.android.AndroidEntryPoint import im.vector.app.EmojiCompatFontProvider import im.vector.app.R import im.vector.app.core.extensions.observeEvent -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.databinding.ActivityEmojiReactionPickerBinding import im.vector.app.features.reactions.data.EmojiDataSource +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt index 67ed2e18f2..76e82e69f6 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt @@ -29,12 +29,12 @@ import dagger.assisted.AssistedInject import im.vector.app.R import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider import im.vector.app.core.utils.PublishDataSource import im.vector.app.features.auth.ReAuthActivity import im.vector.app.features.login.ReAuthHelper +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged diff --git a/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewFragment.kt index 4d0d301721..e97dab1d86 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/preview/SpacePreviewFragment.kt @@ -32,12 +32,12 @@ import com.airbnb.mvrx.withState import im.vector.app.R import im.vector.app.core.extensions.cleanup import im.vector.app.core.extensions.configureWith -import im.vector.app.core.flow.throttleFirst import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentSpacePreviewBinding import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.spaces.SpacePreviewSharedAction import im.vector.app.features.spaces.SpacePreviewSharedActionViewModel +import im.vector.lib.core.utils.flow.throttleFirst import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.parcelize.Parcelize From 1e8f4381229d6c398d45d2aaa246decba35568cc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 13 Jan 2022 20:31:23 +0100 Subject: [PATCH 3/5] Use the module library/core-utils in attachment-viewer library No more usage of Rx --- attachment-viewer/build.gradle | 1 + .../lib/attachmentviewer/VideoViewHolder.kt | 33 ++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/attachment-viewer/build.gradle b/attachment-viewer/build.gradle index 8f3d970834..048710f62c 100644 --- a/attachment-viewer/build.gradle +++ b/attachment-viewer/build.gradle @@ -47,6 +47,7 @@ android { dependencies { implementation project(":library:ui-styles") + implementation project(":library:core-utils") implementation 'com.github.chrisbanes:PhotoView:2.3.0' diff --git a/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt b/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt index 0b72ef36f0..12213a8786 100644 --- a/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt +++ b/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt @@ -20,12 +20,9 @@ import android.util.Log import android.view.View import androidx.core.view.isVisible import im.vector.lib.attachmentviewer.databinding.ItemVideoAttachmentBinding -import io.reactivex.Observable -import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable +import im.vector.lib.core.utils.timer.CountUpTimer import java.io.File import java.lang.ref.WeakReference -import java.util.concurrent.TimeUnit // TODO, it would be probably better to use a unique media player // for better customization and control @@ -35,7 +32,7 @@ class VideoViewHolder constructor(itemView: View) : private var isSelected = false private var mVideoPath: String? = null - private var progressDisposable: Disposable? = null + private var countUpTimer: CountUpTimer? = null private var progress: Int = 0 private var wasPaused = false @@ -47,8 +44,7 @@ class VideoViewHolder constructor(itemView: View) : override fun onRecycled() { super.onRecycled() - progressDisposable?.dispose() - progressDisposable = null + stopTimer() mVideoPath = null } @@ -72,8 +68,7 @@ class VideoViewHolder constructor(itemView: View) : override fun entersBackground() { if (views.videoView.isPlaying) { progress = views.videoView.currentPosition - progressDisposable?.dispose() - progressDisposable = null + stopTimer() views.videoView.stopPlayback() views.videoView.pause() } @@ -91,8 +86,7 @@ class VideoViewHolder constructor(itemView: View) : } else { progress = 0 } - progressDisposable?.dispose() - progressDisposable = null + stopTimer() } else { if (mVideoPath != null) { startPlaying() @@ -107,17 +101,19 @@ class VideoViewHolder constructor(itemView: View) : views.videoView.isVisible = true views.videoView.setOnPreparedListener { - progressDisposable?.dispose() - progressDisposable = Observable.interval(100, TimeUnit.MILLISECONDS) - .timeInterval() - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { + stopTimer() + countUpTimer = CountUpTimer(100).also { + it.tickListener = object : CountUpTimer.TickListener { + override fun onTick(milliseconds: Long) { val duration = views.videoView.duration val progress = views.videoView.currentPosition val isPlaying = views.videoView.isPlaying // Log.v("FOO", "isPlaying $isPlaying $progress/$duration") eventListener?.get()?.onEvent(AttachmentEvents.VideoEvent(isPlaying, progress, duration)) } + } + it.resume() + } } try { views.videoView.setVideoPath(mVideoPath) @@ -134,6 +130,11 @@ class VideoViewHolder constructor(itemView: View) : } } + private fun stopTimer() { + countUpTimer?.stop() + countUpTimer = null + } + override fun handleCommand(commands: AttachmentCommands) { if (!isSelected) return when (commands) { From 9a42e1e8c31d50986d73739a469d6051c630c987 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 13 Jan 2022 20:32:59 +0100 Subject: [PATCH 4/5] Move this class to the correct folder --- .../vector/lib/ui/styles/dialogs}/MaterialProgressDialog.kt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename library/ui-styles/src/main/java/{ => im/vector/lib/ui/styles/dialogs}/MaterialProgressDialog.kt (100%) diff --git a/library/ui-styles/src/main/java/MaterialProgressDialog.kt b/library/ui-styles/src/main/java/im/vector/lib/ui/styles/dialogs/MaterialProgressDialog.kt similarity index 100% rename from library/ui-styles/src/main/java/MaterialProgressDialog.kt rename to library/ui-styles/src/main/java/im/vector/lib/ui/styles/dialogs/MaterialProgressDialog.kt From 006b212189d87530ebce873122b0ba8924965e4e Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 13 Jan 2022 21:19:52 +0100 Subject: [PATCH 5/5] Change remaining `Observable` to something more accurate --- vector/src/main/java/im/vector/app/AppStateHandler.kt | 2 +- .../main/java/im/vector/app/core/di/ActiveSessionHolder.kt | 6 +++--- .../java/im/vector/app/features/home/HomeDetailViewModel.kt | 4 ++-- .../vector/app/features/home/PromoteRestrictedViewModel.kt | 2 +- .../app/features/home/UnreadMessagesSharedViewModel.kt | 4 ++-- .../features/home/room/list/RoomListSectionBuilderGroup.kt | 2 +- .../features/home/room/list/RoomListSectionBuilderSpace.kt | 4 ++-- .../vector/app/features/home/room/list/RoomListViewModel.kt | 2 +- .../im/vector/app/features/spaces/SpaceListViewModel.kt | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/vector/src/main/java/im/vector/app/AppStateHandler.kt b/vector/src/main/java/im/vector/app/AppStateHandler.kt index 9ed9dd5b23..2a3d2cd87f 100644 --- a/vector/src/main/java/im/vector/app/AppStateHandler.kt +++ b/vector/src/main/java/im/vector/app/AppStateHandler.kt @@ -61,7 +61,7 @@ class AppStateHandler @Inject constructor( private val coroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) private val selectedSpaceDataSource = BehaviorDataSource>(Option.empty()) - val selectedRoomGroupingObservable = selectedSpaceDataSource.stream() + val selectedRoomGroupingFlow = selectedSpaceDataSource.stream() fun getCurrentRoomGroupingMethod(): RoomGroupingMethod? { // XXX we should somehow make it live :/ just a work around diff --git a/vector/src/main/java/im/vector/app/core/di/ActiveSessionHolder.kt b/vector/src/main/java/im/vector/app/core/di/ActiveSessionHolder.kt index 5d8d5db3fe..4883676f87 100644 --- a/vector/src/main/java/im/vector/app/core/di/ActiveSessionHolder.kt +++ b/vector/src/main/java/im/vector/app/core/di/ActiveSessionHolder.kt @@ -31,7 +31,7 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class ActiveSessionHolder @Inject constructor(private val sessionObservableStore: ActiveSessionDataSource, +class ActiveSessionHolder @Inject constructor(private val activeSessionDataSource: ActiveSessionDataSource, private val keyRequestHandler: KeyRequestHandler, private val incomingVerificationRequestHandler: IncomingVerificationRequestHandler, private val callManager: WebRtcCallManager, @@ -46,7 +46,7 @@ class ActiveSessionHolder @Inject constructor(private val sessionObservableStore fun setActiveSession(session: Session) { Timber.w("setActiveSession of ${session.myUserId}") activeSession.set(session) - sessionObservableStore.post(Option.just(session)) + activeSessionDataSource.post(Option.just(session)) keyRequestHandler.start(session) incomingVerificationRequestHandler.start(session) @@ -66,7 +66,7 @@ class ActiveSessionHolder @Inject constructor(private val sessionObservableStore } activeSession.set(null) - sessionObservableStore.post(Option.empty()) + activeSessionDataSource.post(Option.empty()) keyRequestHandler.stop() incomingVerificationRequestHandler.stop() diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt index f284de9d48..d7239373bd 100644 --- a/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailViewModel.kt @@ -197,7 +197,7 @@ class HomeDetailViewModel @AssistedInject constructor( } private fun observeRoomGroupingMethod() { - appStateHandler.selectedRoomGroupingObservable + appStateHandler.selectedRoomGroupingFlow .setOnEach { copy( roomGroupingMethod = it.orNull() ?: RoomGroupingMethod.BySpace(null) @@ -206,7 +206,7 @@ class HomeDetailViewModel @AssistedInject constructor( } private fun observeRoomSummaries() { - appStateHandler.selectedRoomGroupingObservable.distinctUntilChanged().flatMapLatest { + appStateHandler.selectedRoomGroupingFlow.distinctUntilChanged().flatMapLatest { // we use it as a trigger to all changes in room, but do not really load // the actual models session.getPagedRoomSummariesLive( diff --git a/vector/src/main/java/im/vector/app/features/home/PromoteRestrictedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/PromoteRestrictedViewModel.kt index 77ee23f732..5c66e7c52d 100644 --- a/vector/src/main/java/im/vector/app/features/home/PromoteRestrictedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/PromoteRestrictedViewModel.kt @@ -50,7 +50,7 @@ class PromoteRestrictedViewModel @AssistedInject constructor( ) : VectorViewModel(initialState) { init { - appStateHandler.selectedRoomGroupingObservable.distinctUntilChanged().execute { state -> + appStateHandler.selectedRoomGroupingFlow.distinctUntilChanged().execute { state -> val groupingMethod = state.invoke()?.orNull() val isSpaceMode = groupingMethod is RoomGroupingMethod.BySpace val currentSpace = (groupingMethod as? RoomGroupingMethod.BySpace)?.spaceSummary diff --git a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt index b65a85eb00..409eb0b845 100644 --- a/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/UnreadMessagesSharedViewModel.kt @@ -107,8 +107,8 @@ class UnreadMessagesSharedViewModel @AssistedInject constructor(@Assisted initia } combine( - appStateHandler.selectedRoomGroupingObservable.distinctUntilChanged(), - appStateHandler.selectedRoomGroupingObservable.flatMapLatest { + appStateHandler.selectedRoomGroupingFlow.distinctUntilChanged(), + appStateHandler.selectedRoomGroupingFlow.flatMapLatest { session.getPagedRoomSummariesLive( roomSummaryQueryParams { this.memberships = Membership.activeMemberships() diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderGroup.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderGroup.kt index 58db2a4030..77f61149f8 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderGroup.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderGroup.kt @@ -104,7 +104,7 @@ class RoomListSectionBuilderGroup( } } - appStateHandler.selectedRoomGroupingObservable + appStateHandler.selectedRoomGroupingFlow .distinctUntilChanged() .onEach { groupingMethod -> val selectedGroupId = (groupingMethod.orNull() as? RoomGroupingMethod.ByLegacyGroup)?.groupSummary?.groupId diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderSpace.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderSpace.kt index bde324e57b..296e61690b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderSpace.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListSectionBuilderSpace.kt @@ -132,7 +132,7 @@ class RoomListSectionBuilderSpace( } } - appStateHandler.selectedRoomGroupingObservable + appStateHandler.selectedRoomGroupingFlow .distinctUntilChanged() .onEach { groupingMethod -> val selectedSpace = groupingMethod.orNull()?.space() @@ -222,7 +222,7 @@ class RoomListSectionBuilderSpace( // add suggested rooms val suggestedRoomsFlow = // MutableLiveData>() - appStateHandler.selectedRoomGroupingObservable + appStateHandler.selectedRoomGroupingFlow .distinctUntilChanged() .flatMapLatest { groupingMethod -> val selectedSpace = groupingMethod.orNull()?.space() diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt index e5caaffbda..46a91e2c72 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt @@ -92,7 +92,7 @@ class RoomListViewModel @AssistedInject constructor( init { observeMembershipChanges() - appStateHandler.selectedRoomGroupingObservable + appStateHandler.selectedRoomGroupingFlow .distinctUntilChanged() .execute { copy( diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index a762e13cba..02771abc95 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -88,7 +88,7 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa observeSpaceSummaries() // observeSelectionState() - appStateHandler.selectedRoomGroupingObservable + appStateHandler.selectedRoomGroupingFlow .distinctUntilChanged() .setOnEach { copy(