From 95d83db90c900b676e4f4a5ea1497d55382e9fbf Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 4 Jul 2019 10:53:46 +0200 Subject: [PATCH 01/10] WIP --- .../api/session/InitialSyncProgressService.kt | 13 +++ .../matrix/android/api/session/Session.kt | 5 +- .../DefaultInitialSyncProgressService.kt | 97 +++++++++++++++++++ .../internal/session/DefaultSession.kt | 9 +- .../internal/session/SessionComponent.kt | 1 + .../android/internal/session/SessionModule.kt | 4 + .../session/sync/CryptoSyncHandler.kt | 8 +- .../internal/session/sync/GroupSyncHandler.kt | 46 +++++++-- .../internal/session/sync/RoomSyncHandler.kt | 44 +++++++-- .../session/sync/SyncResponseHandler.kt | 43 +++++--- .../android/internal/session/sync/SyncTask.kt | 20 +++- .../src/main/res/values/strings.xml | 9 ++ .../riotx/features/home/HomeActivity.kt | 23 +++++ .../features/rageshake/BugReportActivity.kt | 6 +- .../riotx/features/rageshake/BugReporter.kt | 22 ++--- vector/src/main/res/layout/activity.xml | 62 +----------- vector/src/main/res/layout/activity_home.xml | 3 + .../res/layout/merge_overlay_waiting_view.xml | 71 ++++++++++++++ 18 files changed, 373 insertions(+), 113 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt create mode 100644 vector/src/main/res/layout/merge_overlay_waiting_view.xml diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt new file mode 100644 index 00000000..619d9356 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt @@ -0,0 +1,13 @@ +package im.vector.matrix.android.api.session + +import androidx.lifecycle.LiveData + +interface InitialSyncProgressService { + + fun getLiveStatus() : LiveData + + data class Status( + val statusText: Int?, + val percentProgress: Int = 0 + ) +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/Session.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/Session.kt index 3621c6ad..08e706c3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/Session.kt @@ -49,14 +49,15 @@ interface Session : FilterService, FileService, PushRuleService, - PushersService { + PushersService, + InitialSyncProgressService { /** * The params associated to the session */ val sessionParams: SessionParams - val myUserId : String + val myUserId: String get() = sessionParams.credentials.userId diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt new file mode 100644 index 00000000..3bf5f7ae --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt @@ -0,0 +1,97 @@ +package im.vector.matrix.android.internal.session + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import im.vector.matrix.android.api.session.InitialSyncProgressService +import timber.log.Timber +import javax.inject.Inject + + +@SessionScope +class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgressService { + + var status = MutableLiveData() + + var rootTask: TaskInfo? = null + + override fun getLiveStatus(): LiveData { + return status + } + + + fun startTask(nameRes: Int, totalProgress: Int, parentWeight: Float = 1f) { + if (rootTask == null) { + rootTask = TaskInfo(nameRes, totalProgress) + } else { + val currentLeaf = rootTask!!.leaf() + val newTask = TaskInfo(nameRes, totalProgress) + newTask.parent = currentLeaf + newTask.offset = currentLeaf.currentProgress + currentLeaf.child = newTask + newTask.parentWeight = parentWeight + } + reportProgress(0) + } + + fun reportProgress(progress: Int) { + rootTask?.leaf()?.incrementProgress(progress) + } + + fun endTask(nameRes: Int) { + val endedTask = rootTask?.leaf() + if (endedTask?.nameRes == nameRes) { + //close it + val parent = endedTask.parent + parent?.child = null + parent?.incrementProgress(endedTask.offset + (endedTask.totalProgress * endedTask.parentWeight).toInt()) + } + if (endedTask?.parent == null) { + this@DefaultInitialSyncProgressService.status.postValue(null) + } + } + + fun endAll() { + this@DefaultInitialSyncProgressService.status.postValue(null) + } + + + inner class TaskInfo(var nameRes: Int, + var totalProgress: Int) { + var parent: TaskInfo? = null + var child: TaskInfo? = null + var parentWeight: Float = 1f + var currentProgress: Int = 0 + var offset: Int = 0 + + fun leaf(): TaskInfo { + var last = this + while (last.child != null) { + last = last.child!! + } + return last + } + + fun incrementProgress(progress: Int) { + currentProgress = progress +// val newProgress = Math.min(currentProgress + progress, totalProgress) + parent?.let { + val parentProgress = (currentProgress * parentWeight).toInt() + it.incrementProgress(offset + parentProgress) + } + if (parent == null) { + Timber.e("--- ${leaf().nameRes}: ${currentProgress}") + this@DefaultInitialSyncProgressService.status.postValue( + InitialSyncProgressService.Status(leaf().nameRes, currentProgress) + ) + } + } + } + +} + +public inline fun reportSubtask(reporter: DefaultInitialSyncProgressService?, nameRes: Int, totalProgress: Int, parentWeight: Float = 1f, block: () -> T): T { + reporter?.startTask(nameRes, totalProgress, parentWeight) + return block().also { + reporter?.endTask(nameRes) + } +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt index 72fdadfc..1e2aec84 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultSession.kt @@ -24,6 +24,7 @@ import androidx.work.WorkManager import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.pushrules.PushRuleService +import im.vector.matrix.android.api.session.InitialSyncProgressService import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.cache.CacheService import im.vector.matrix.android.api.session.content.ContentUploadStateTracker @@ -64,7 +65,8 @@ internal class DefaultSession @Inject constructor(override val sessionParams: Se private val fileService: FileService, private val syncThread: SyncThread, private val contentUrlResolver: ContentUrlResolver, - private val contentUploadProgressTracker: ContentUploadStateTracker) + private val contentUploadProgressTracker: ContentUploadStateTracker, + private val initialSyncProgressService: InitialSyncProgressService) : Session, RoomService by roomService, RoomDirectoryService by roomDirectoryService, @@ -74,9 +76,10 @@ internal class DefaultSession @Inject constructor(override val sessionParams: Se CacheService by cacheService, SignOutService by signOutService, FilterService by filterService, - FileService by fileService, PushRuleService by pushRuleService, - PushersService by pushersService { + PushersService by pushersService, + FileService by fileService, + InitialSyncProgressService by initialSyncProgressService { private var isOpen = false diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionComponent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionComponent.kt index fc23b780..1738cedd 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionComponent.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionComponent.kt @@ -19,6 +19,7 @@ package im.vector.matrix.android.internal.session import dagger.BindsInstance import dagger.Component import im.vector.matrix.android.api.auth.data.SessionParams +import im.vector.matrix.android.api.session.InitialSyncProgressService import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.internal.crypto.CryptoModule import im.vector.matrix.android.internal.di.MatrixComponent diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt index 8f580da1..d1673bfe 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt @@ -25,6 +25,7 @@ import dagger.multibindings.IntoSet import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig import im.vector.matrix.android.api.auth.data.SessionParams +import im.vector.matrix.android.api.session.InitialSyncProgressService import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.internal.database.LiveEntityObserver import im.vector.matrix.android.internal.database.configureEncryption @@ -132,4 +133,7 @@ internal abstract class SessionModule { @IntoSet abstract fun bindUserEntityUpdater(groupSummaryUpdater: UserEntityUpdater): LiveEntityObserver + @Binds + abstract fun bindInitialSyncProgressService(initialSyncProgressService: DefaultInitialSyncProgressService): InitialSyncProgressService + } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/CryptoSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/CryptoSyncHandler.kt index a9416a70..cb102d5d 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/CryptoSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/CryptoSyncHandler.kt @@ -26,6 +26,8 @@ import im.vector.matrix.android.internal.crypto.CryptoManager import im.vector.matrix.android.internal.crypto.MXEventDecryptionResult import im.vector.matrix.android.internal.crypto.algorithms.olm.OlmDecryptionResult import im.vector.matrix.android.internal.crypto.verification.DefaultSasVerificationService +import im.vector.matrix.android.internal.session.DefaultInitialSyncProgressService +import im.vector.matrix.android.internal.session.SessionScope import im.vector.matrix.android.internal.session.sync.model.SyncResponse import im.vector.matrix.android.internal.session.sync.model.ToDeviceSyncResponse import timber.log.Timber @@ -35,8 +37,10 @@ import javax.inject.Inject internal class CryptoSyncHandler @Inject constructor(private val cryptoManager: CryptoManager, private val sasVerificationService: DefaultSasVerificationService) { - fun handleToDevice(toDevice: ToDeviceSyncResponse) { - toDevice.events?.forEach { event -> + fun handleToDevice(toDevice: ToDeviceSyncResponse, initialSyncProgressService: DefaultInitialSyncProgressService? = null) { + val total = toDevice.events?.size ?: 0 + toDevice.events?.forEachIndexed { index, event -> + initialSyncProgressService?.reportProgress(((index / total.toFloat()) * 100).toInt()) // Decrypt event if necessary decryptEvent(event, null) if (TextUtils.equals(event.getClearType(), EventType.MESSAGE) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/GroupSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/GroupSyncHandler.kt index d7b8328c..4d19bcf5 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/GroupSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/GroupSyncHandler.kt @@ -17,10 +17,11 @@ package im.vector.matrix.android.internal.session.sync import com.zhuinden.monarchy.Monarchy +import im.vector.matrix.android.R import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.internal.database.model.GroupEntity import im.vector.matrix.android.internal.database.query.where -import im.vector.matrix.android.internal.session.SessionScope +import im.vector.matrix.android.internal.session.DefaultInitialSyncProgressService import im.vector.matrix.android.internal.session.sync.model.GroupsSyncResponse import im.vector.matrix.android.internal.session.sync.model.InvitedGroupSync import io.realm.Realm @@ -34,21 +35,48 @@ internal class GroupSyncHandler @Inject constructor(private val monarchy: Monarc data class LEFT(val data: Map) : HandlingStrategy() } - fun handle(roomsSyncResponse: GroupsSyncResponse) { + fun handle(roomsSyncResponse: GroupsSyncResponse, reporter: DefaultInitialSyncProgressService? = null) { monarchy.runTransactionSync { realm -> - handleGroupSync(realm, GroupSyncHandler.HandlingStrategy.JOINED(roomsSyncResponse.join)) - handleGroupSync(realm, GroupSyncHandler.HandlingStrategy.INVITED(roomsSyncResponse.invite)) - handleGroupSync(realm, GroupSyncHandler.HandlingStrategy.LEFT(roomsSyncResponse.leave)) + handleGroupSync(realm, HandlingStrategy.JOINED(roomsSyncResponse.join), reporter) + handleGroupSync(realm, HandlingStrategy.INVITED(roomsSyncResponse.invite), reporter) + handleGroupSync(realm, HandlingStrategy.LEFT(roomsSyncResponse.leave), reporter) } } // PRIVATE METHODS ***************************************************************************** - private fun handleGroupSync(realm: Realm, handlingStrategy: HandlingStrategy) { + private fun handleGroupSync(realm: Realm, handlingStrategy: HandlingStrategy, reporter: DefaultInitialSyncProgressService?) { val groups = when (handlingStrategy) { - is HandlingStrategy.JOINED -> handlingStrategy.data.map { handleJoinedGroup(realm, it.key) } - is HandlingStrategy.INVITED -> handlingStrategy.data.map { handleInvitedGroup(realm, it.key) } - is HandlingStrategy.LEFT -> handlingStrategy.data.map { handleLeftGroup(realm, it.key) } + is HandlingStrategy.JOINED -> { + val total = handlingStrategy.data.size + reporter?.startTask(R.string.initial_sync_start_importing_account_groups, total, 0.6f) + var current = 0 + handlingStrategy.data.map { + reporter?.reportProgress((current / total.toFloat() * 100).toInt()) + current++ + handleJoinedGroup(realm, it.key) + } + } + is HandlingStrategy.INVITED -> { + val total = handlingStrategy.data.size + reporter?.startTask(R.string.initial_sync_start_importing_account_groups, total, 0.3f) + var current = 0 + handlingStrategy.data.map { + reporter?.reportProgress((current / total.toFloat() * 100).toInt()) + current++ + handleInvitedGroup(realm, it.key) + } + } + is HandlingStrategy.LEFT -> { + val total = handlingStrategy.data.size + reporter?.startTask(R.string.initial_sync_start_importing_account_groups, total, 0.1f) + var current = 0 + handlingStrategy.data.map { + reporter?.reportProgress((current / total.toFloat() * 100).toInt()) + current++ + handleLeftGroup(realm, it.key) + } + } } realm.insertOrUpdate(groups) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt index 3afc57f9..ae59bad8 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt @@ -17,6 +17,7 @@ package im.vector.matrix.android.internal.session.sync import com.zhuinden.monarchy.Monarchy +import im.vector.matrix.android.R import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.toModel @@ -32,6 +33,7 @@ import im.vector.matrix.android.internal.database.model.RoomEntity import im.vector.matrix.android.internal.database.query.find import im.vector.matrix.android.internal.database.query.findLastLiveChunkFromRoom import im.vector.matrix.android.internal.database.query.where +import im.vector.matrix.android.internal.session.DefaultInitialSyncProgressService import im.vector.matrix.android.internal.session.notification.DefaultPushRuleService import im.vector.matrix.android.internal.session.notification.ProcessEventForPushTask import im.vector.matrix.android.internal.session.room.RoomSummaryUpdater @@ -60,11 +62,11 @@ internal class RoomSyncHandler @Inject constructor(private val monarchy: Monarch data class LEFT(val data: Map) : HandlingStrategy() } - fun handle(roomsSyncResponse: RoomsSyncResponse) { + fun handle(roomsSyncResponse: RoomsSyncResponse, reporter: DefaultInitialSyncProgressService? = null) { monarchy.runTransactionSync { realm -> - handleRoomSync(realm, HandlingStrategy.JOINED(roomsSyncResponse.join)) - handleRoomSync(realm, HandlingStrategy.INVITED(roomsSyncResponse.invite)) - handleRoomSync(realm, HandlingStrategy.LEFT(roomsSyncResponse.leave)) + handleRoomSync(realm, HandlingStrategy.JOINED(roomsSyncResponse.join), reporter) + handleRoomSync(realm, HandlingStrategy.INVITED(roomsSyncResponse.invite), reporter) + handleRoomSync(realm, HandlingStrategy.LEFT(roomsSyncResponse.leave), reporter) } //handle event for bing rule checks @@ -87,11 +89,37 @@ internal class RoomSyncHandler @Inject constructor(private val monarchy: Monarch // PRIVATE METHODS ***************************************************************************** - private fun handleRoomSync(realm: Realm, handlingStrategy: HandlingStrategy) { + private fun handleRoomSync(realm: Realm, handlingStrategy: HandlingStrategy, reporter: DefaultInitialSyncProgressService?) { + val rooms = when (handlingStrategy) { - is HandlingStrategy.JOINED -> handlingStrategy.data.map { handleJoinedRoom(realm, it.key, it.value) } - is HandlingStrategy.INVITED -> handlingStrategy.data.map { handleInvitedRoom(realm, it.key, it.value) } - is HandlingStrategy.LEFT -> handlingStrategy.data.map { handleLeftRoom(realm, it.key, it.value) } + is HandlingStrategy.JOINED -> { + val total = handlingStrategy.data.size + reporter?.startTask(R.string.initial_sync_start_importing_account_joined_rooms, total, 0.6f) + var current = 0 + handlingStrategy.data.map { + reporter?.reportProgress((current / total.toFloat() * 100).toInt()) + current++ + handleJoinedRoom(realm, it.key, it.value).also { + reporter?.endTask(R.string.initial_sync_start_importing_account_joined_rooms) + } + } + + } + is HandlingStrategy.INVITED -> { + val total = handlingStrategy.data.size + reporter?.startTask(R.string.initial_sync_start_importing_account_invited_rooms, total, 0.4f) + var current = 0 + handlingStrategy.data.map { + reporter?.reportProgress((current / total.toFloat() * 100).toInt()) + current++ + handleInvitedRoom(realm, it.key, it.value) + }.also { + reporter?.endTask(R.string.initial_sync_start_importing_account_invited_rooms) + } + } + is HandlingStrategy.LEFT -> { + handlingStrategy.data.map { handleLeftRoom(realm, it.key, it.value) } + } } realm.insertOrUpdate(rooms) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt index d21b1de3..8d018d61 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt @@ -17,7 +17,10 @@ package im.vector.matrix.android.internal.session.sync import arrow.core.Try +import im.vector.matrix.android.R import im.vector.matrix.android.internal.crypto.CryptoManager +import im.vector.matrix.android.internal.session.DefaultInitialSyncProgressService +import im.vector.matrix.android.internal.session.reportSubtask import im.vector.matrix.android.internal.session.sync.model.SyncResponse import timber.log.Timber import javax.inject.Inject @@ -27,12 +30,15 @@ internal class SyncResponseHandler @Inject constructor(private val roomSyncHandl private val userAccountDataSyncHandler: UserAccountDataSyncHandler, private val groupSyncHandler: GroupSyncHandler, private val cryptoSyncHandler: CryptoSyncHandler, - private val cryptoManager: CryptoManager) { + private val cryptoManager: CryptoManager, + private val initialSyncProgressService: DefaultInitialSyncProgressService) { fun handleResponse(syncResponse: SyncResponse, fromToken: String?, isCatchingUp: Boolean): Try { return Try { - Timber.v("Start handling sync") val isInitialSync = fromToken == null + Timber.v("Start handling sync, is InitialSync: ${isInitialSync}") + val reporter = initialSyncProgressService.takeIf { isInitialSync } + if (!cryptoManager.isStarted()) { Timber.v("Should start cryptoManager") cryptoManager.start(isInitialSync) @@ -41,23 +47,36 @@ internal class SyncResponseHandler @Inject constructor(private val roomSyncHandl // Handle the to device events before the room ones // to ensure to decrypt them properly Timber.v("Handle toDevice") - if (syncResponse.toDevice != null) { - cryptoSyncHandler.handleToDevice(syncResponse.toDevice) + reportSubtask(reporter, R.string.initial_sync_start_importing_account_crypto, 100, 0.2f) { + if (syncResponse.toDevice != null) { + cryptoSyncHandler.handleToDevice(syncResponse.toDevice, reporter) + } } Timber.v("Handle rooms") - if (syncResponse.rooms != null) { - roomSyncHandler.handle(syncResponse.rooms) + + reportSubtask(reporter, R.string.initial_sync_start_importing_account_rooms, 100, 0.5f) { + if (syncResponse.rooms != null) { + roomSyncHandler.handle(syncResponse.rooms, reporter) + } } - Timber.v("Handle groups") - if (syncResponse.groups != null) { - groupSyncHandler.handle(syncResponse.groups) + + reportSubtask(reporter, R.string.initial_sync_start_importing_account_groups, 100, 0.2f) { + Timber.v("Handle groups") + if (syncResponse.groups != null) { + groupSyncHandler.handle(syncResponse.groups, reporter) + } } - Timber.v("Handle accoundData") - if (syncResponse.accountData != null) { - userAccountDataSyncHandler.handle(syncResponse.accountData) + + reportSubtask(reporter, R.string.initial_sync_start_importing_account_data, 100, 0.1f) { + Timber.v("Handle accoundData") + if (syncResponse.accountData != null) { + userAccountDataSyncHandler.handle(syncResponse.accountData) + } } + Timber.v("On sync completed") cryptoSyncHandler.onSyncCompleted(syncResponse) + } Timber.v("Finish handling sync in $measure ms") syncResponse diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTask.kt index e29f2eea..45e10fb9 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTask.kt @@ -19,14 +19,18 @@ package im.vector.matrix.android.internal.session.sync import arrow.core.Try import arrow.core.failure import arrow.core.recoverWith +import com.zhuinden.monarchy.Monarchy +import im.vector.matrix.android.R import im.vector.matrix.android.api.auth.data.Credentials import im.vector.matrix.android.api.failure.Failure import im.vector.matrix.android.api.failure.MatrixError import im.vector.matrix.android.internal.auth.SessionParamsStore import im.vector.matrix.android.internal.network.executeRequest +import im.vector.matrix.android.internal.session.DefaultInitialSyncProgressService import im.vector.matrix.android.internal.session.filter.FilterRepository import im.vector.matrix.android.internal.session.sync.model.SyncResponse import im.vector.matrix.android.internal.task.Task +import im.vector.matrix.android.internal.util.tryTransactionAsync import javax.inject.Inject internal interface SyncTask : Task { @@ -40,7 +44,9 @@ internal class DefaultSyncTask @Inject constructor(private val syncAPI: SyncAPI, private val filterRepository: FilterRepository, private val syncResponseHandler: SyncResponseHandler, private val sessionParamsStore: SessionParamsStore, - private val syncTokenStore: SyncTokenStore + private val initialSyncProgressService: DefaultInitialSyncProgressService, + private val syncTokenStore: SyncTokenStore, + private val monarchy: Monarchy ) : SyncTask { @@ -55,6 +61,10 @@ internal class DefaultSyncTask @Inject constructor(private val syncAPI: SyncAPI, requestParams["timeout"] = timeout.toString() requestParams["filter"] = filterRepository.getFilter() + val isInitialSync = token == null + if (isInitialSync) { + initialSyncProgressService.startTask(R.string.initial_sync_start_importing_account, 100) + } return executeRequest { apiCall = syncAPI.sync(requestParams) }.recoverWith { throwable -> @@ -67,7 +77,13 @@ internal class DefaultSyncTask @Inject constructor(private val syncAPI: SyncAPI, // Transmit the throwable throwable.failure() }.flatMap { syncResponse -> - syncResponseHandler.handleResponse(syncResponse, token, false) + syncResponseHandler.handleResponse(syncResponse, token, false).also { + if (isInitialSync) { + monarchy.tryTransactionAsync { + initialSyncProgressService.endAll() + } + } + } }.map { syncTokenStore.saveToken(it.nextBatch) } diff --git a/matrix-sdk-android/src/main/res/values/strings.xml b/matrix-sdk-android/src/main/res/values/strings.xml index be64a659..eb39b689 100644 --- a/matrix-sdk-android/src/main/res/values/strings.xml +++ b/matrix-sdk-android/src/main/res/values/strings.xml @@ -228,4 +228,13 @@ Pin + + Initial Sync:\nImporting account… + Initial Sync:\nImporting crypto + Initial Sync:\nImporting Rooms + Initial Sync:\nImporting Joined Rooms + Initial Sync:\nImporting Invited Rooms + Initial Sync:\nImporting Left Rooms + Initial Sync:\nImporting Communities + Initial Sync:\nImporting Account Data diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt index 21ca495a..398c3c46 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt @@ -17,6 +17,7 @@ package im.vector.riotx.features.home import android.app.ProgressDialog +import android.app.TimePickerDialog import android.content.Context import android.content.Intent import android.os.Bundle @@ -24,6 +25,7 @@ import android.view.MenuItem import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.Toolbar import androidx.core.view.GravityCompat +import androidx.core.view.isVisible import androidx.drawerlayout.widget.DrawerLayout import androidx.fragment.app.FragmentManager import androidx.lifecycle.Observer @@ -45,6 +47,8 @@ import im.vector.riotx.features.rageshake.VectorUncaughtExceptionHandler import im.vector.riotx.features.workers.signout.SignOutViewModel import im.vector.riotx.push.fcm.FcmHelper import kotlinx.android.synthetic.main.activity_home.* +import kotlinx.android.synthetic.main.merge_overlay_waiting_view.* +import timber.log.Timber import javax.inject.Inject @@ -114,6 +118,25 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable { notificationDrawerManager.clearAllEvents() intent.removeExtra(EXTRA_CLEAR_EXISTING_NOTIFICATION) } + + activeSessionHolder.getSafeActiveSession()?.getLiveStatus()?.observe(this, Observer { + Timber.e("${it?.statusText?.let { getString(it) }} ${it?.percentProgress}") + if (it == null) { + waiting_view.isVisible = false + } else { + waiting_view_status_horizontal_progress.apply { + isIndeterminate = false + max = 100 + progress = it.percentProgress + isVisible = true + } + waiting_view_status_text.apply { + text = it.statusText?.let { res -> getString(res) } + isVisible = true + } + waiting_view.isVisible = true + } + }) } override fun onNewIntent(intent: Intent?) { diff --git a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReportActivity.kt b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReportActivity.kt index d0e229ff..7f56bdc0 100755 --- a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReportActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReportActivity.kt @@ -30,7 +30,7 @@ import kotlinx.android.synthetic.main.activity_bug_report.* import timber.log.Timber /** - * Form to send a bug report + * Form to send a bug reportSubtask */ class BugReportActivity : VectorBaseActivity() { @@ -56,7 +56,7 @@ class BugReportActivity : VectorBaseActivity() { forSuggestion = intent.getBooleanExtra("FOR_SUGGESTION", false) - // Default screen is for bug report, so modify it for suggestion + // Default screen is for bug reportSubtask, so modify it for suggestion if (forSuggestion) { supportActionBar?.setTitle(R.string.send_suggestion) @@ -101,7 +101,7 @@ class BugReportActivity : VectorBaseActivity() { /** - * Send the bug report + * Send the bug reportSubtask */ private fun sendBugReport() { bug_report_scrollview.alpha = 0.3f diff --git a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt index 7bb75c4e..123d0a5a 100755 --- a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt +++ b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt @@ -68,11 +68,11 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes // the http client private val mOkHttpClient = OkHttpClient() - // the pending bug report call + // the pending bug reportSubtask call private var mBugReportCall: Call? = null - // boolean to cancel the bug report + // boolean to cancel the bug reportSubtask private val mIsCancelled = false /** @@ -96,16 +96,16 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes private val LOGCAT_CMD_DEBUG = arrayOf("logcat", "-d", "-v", "threadtime", "*:*") /** - * Bug report upload listener + * Bug reportSubtask upload listener */ interface IMXBugReportListener { /** - * The bug report has been cancelled + * The bug reportSubtask has been cancelled */ fun onUploadCancelled() /** - * The bug report upload failed. + * The bug reportSubtask upload failed. * * @param reason the failure reason */ @@ -119,13 +119,13 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes fun onProgress(progress: Int) /** - * The bug report upload succeeded. + * The bug reportSubtask upload succeeded. */ fun onUploadSucceed() } /** - * Send a bug report. + * Send a bug reportSubtask. * * @param context the application context * @param forSuggestion true to send a suggestion @@ -407,7 +407,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes override fun onPostExecute(reason: String?) { mBugReportCall = null - // delete when the bug report has been successfully sent + // delete when the bug reportSubtask has been successfully sent for (file in mBugReportFiles) { file.delete() } @@ -431,7 +431,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes } /** - * Send a bug report either with email or with Vector. + * Send a bug reportSubtask either with email or with Vector. */ fun openBugReportScreen(activity: Activity, forSuggestion: Boolean = false) { screenshot = takeScreenshot(activity) @@ -442,7 +442,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes } //============================================================================================================== - // crash report management + // crash reportSubtask management //============================================================================================================== /** @@ -472,7 +472,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes } /** - * Save the crash report + * Save the crash reportSubtask * * @param context the context * @param crashDescription teh crash description diff --git a/vector/src/main/res/layout/activity.xml b/vector/src/main/res/layout/activity.xml index 9a5c32e4..df0cd3fb 100644 --- a/vector/src/main/res/layout/activity.xml +++ b/vector/src/main/res/layout/activity.xml @@ -22,66 +22,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/toolbar" /> - - - - - - - - - - - - - - - - - + diff --git a/vector/src/main/res/layout/activity_home.xml b/vector/src/main/res/layout/activity_home.xml index 599b7d4c..c6f74147 100644 --- a/vector/src/main/res/layout/activity_home.xml +++ b/vector/src/main/res/layout/activity_home.xml @@ -15,6 +15,8 @@ android:id="@+id/homeDetailFragmentContainer" android:layout_width="match_parent" android:layout_height="match_parent" /> + + @@ -24,4 +26,5 @@ android:layout_height="match_parent" android:layout_gravity="start" /> + \ No newline at end of file diff --git a/vector/src/main/res/layout/merge_overlay_waiting_view.xml b/vector/src/main/res/layout/merge_overlay_waiting_view.xml new file mode 100644 index 00000000..8f09ed09 --- /dev/null +++ b/vector/src/main/res/layout/merge_overlay_waiting_view.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 8159a52bd7530406c7294f4b56de3c966fb041c6 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 8 Jul 2019 16:31:21 +0200 Subject: [PATCH 02/10] cleaning --- .../DefaultInitialSyncProgressService.kt | 17 ++++++++- .../internal/session/sync/GroupSyncHandler.kt | 34 +++++------------ .../internal/session/sync/RoomSyncHandler.kt | 37 ++++++------------- 3 files changed, 38 insertions(+), 50 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt index 3bf5f7ae..b3eac5d4 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt @@ -94,4 +94,19 @@ public inline fun reportSubtask(reporter: DefaultInitialSyncProgressService? return block().also { reporter?.endTask(nameRes) } -} \ No newline at end of file +} + + +public inline fun Map.mapWithProgress(reporter: DefaultInitialSyncProgressService?, taskId: Int, weight: Float, transform: (Map.Entry) -> R): List { + val total = this.count() + var current = 0 + reporter?.startTask(taskId, 100, weight) + return this.map { + reporter?.reportProgress((current / total.toFloat() * 100).toInt()) + current++ + transform.invoke(it) + }.also { + reporter?.endTask(taskId) + } +} + diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/GroupSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/GroupSyncHandler.kt index 4d19bcf5..29b119dd 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/GroupSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/GroupSyncHandler.kt @@ -22,6 +22,7 @@ import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.internal.database.model.GroupEntity import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.session.DefaultInitialSyncProgressService +import im.vector.matrix.android.internal.session.mapWithProgress import im.vector.matrix.android.internal.session.sync.model.GroupsSyncResponse import im.vector.matrix.android.internal.session.sync.model.InvitedGroupSync import io.realm.Realm @@ -47,36 +48,21 @@ internal class GroupSyncHandler @Inject constructor(private val monarchy: Monarc private fun handleGroupSync(realm: Realm, handlingStrategy: HandlingStrategy, reporter: DefaultInitialSyncProgressService?) { val groups = when (handlingStrategy) { - is HandlingStrategy.JOINED -> { - val total = handlingStrategy.data.size - reporter?.startTask(R.string.initial_sync_start_importing_account_groups, total, 0.6f) - var current = 0 - handlingStrategy.data.map { - reporter?.reportProgress((current / total.toFloat() * 100).toInt()) - current++ + is HandlingStrategy.JOINED -> + handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_groups, 0.6f) { handleJoinedGroup(realm, it.key) } - } - is HandlingStrategy.INVITED -> { - val total = handlingStrategy.data.size - reporter?.startTask(R.string.initial_sync_start_importing_account_groups, total, 0.3f) - var current = 0 - handlingStrategy.data.map { - reporter?.reportProgress((current / total.toFloat() * 100).toInt()) - current++ + + is HandlingStrategy.INVITED -> + handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_groups, 0.3f) { handleInvitedGroup(realm, it.key) } - } - is HandlingStrategy.LEFT -> { - val total = handlingStrategy.data.size - reporter?.startTask(R.string.initial_sync_start_importing_account_groups, total, 0.1f) - var current = 0 - handlingStrategy.data.map { - reporter?.reportProgress((current / total.toFloat() * 100).toInt()) - current++ + + is HandlingStrategy.LEFT -> + handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_groups, 0.1f) { handleLeftGroup(realm, it.key) } - } + } realm.insertOrUpdate(groups) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt index ae59bad8..bdf81064 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt @@ -34,6 +34,7 @@ import im.vector.matrix.android.internal.database.query.find import im.vector.matrix.android.internal.database.query.findLastLiveChunkFromRoom import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.session.DefaultInitialSyncProgressService +import im.vector.matrix.android.internal.session.mapWithProgress import im.vector.matrix.android.internal.session.notification.DefaultPushRuleService import im.vector.matrix.android.internal.session.notification.ProcessEventForPushTask import im.vector.matrix.android.internal.session.room.RoomSummaryUpdater @@ -92,33 +93,19 @@ internal class RoomSyncHandler @Inject constructor(private val monarchy: Monarch private fun handleRoomSync(realm: Realm, handlingStrategy: HandlingStrategy, reporter: DefaultInitialSyncProgressService?) { val rooms = when (handlingStrategy) { - is HandlingStrategy.JOINED -> { - val total = handlingStrategy.data.size - reporter?.startTask(R.string.initial_sync_start_importing_account_joined_rooms, total, 0.6f) - var current = 0 - handlingStrategy.data.map { - reporter?.reportProgress((current / total.toFloat() * 100).toInt()) - current++ - handleJoinedRoom(realm, it.key, it.value).also { - reporter?.endTask(R.string.initial_sync_start_importing_account_joined_rooms) - } + is HandlingStrategy.JOINED -> + handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_joined_rooms, 0.6f) { + handleJoinedRoom(realm, it.key, it.value) + } + is HandlingStrategy.INVITED -> + handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_invited_rooms, 0.4f) { + handleInvitedRoom(realm, it.key, it.value) } - } - is HandlingStrategy.INVITED -> { - val total = handlingStrategy.data.size - reporter?.startTask(R.string.initial_sync_start_importing_account_invited_rooms, total, 0.4f) - var current = 0 - handlingStrategy.data.map { - reporter?.reportProgress((current / total.toFloat() * 100).toInt()) - current++ - handleInvitedRoom(realm, it.key, it.value) - }.also { - reporter?.endTask(R.string.initial_sync_start_importing_account_invited_rooms) - } - } is HandlingStrategy.LEFT -> { - handlingStrategy.data.map { handleLeftRoom(realm, it.key, it.value) } + handlingStrategy.data.mapWithProgress(reporter, R.string.initial_sync_start_importing_account_left_rooms, 0.2f) { + handleLeftRoom(realm, it.key, it.value) + } } } realm.insertOrUpdate(rooms) @@ -262,4 +249,4 @@ internal class RoomSyncHandler @Inject constructor(private val monarchy: Monarch .forEach { roomTagHandler.handle(realm, roomId, it) } } -} \ No newline at end of file +} From 4aae1f78d8a84e233040e57e04f71ab7d5045d85 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 8 Jul 2019 18:05:37 +0200 Subject: [PATCH 03/10] moved new strings + @StringRes annotation --- .../android/api/session/InitialSyncProgressService.kt | 3 ++- matrix-sdk-android/src/main/res/values/strings.xml | 9 --------- .../src/main/res/values/strings_RiotX.xml | 10 ++++++++++ 3 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 matrix-sdk-android/src/main/res/values/strings_RiotX.xml diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt index 619d9356..ce842125 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt @@ -1,5 +1,6 @@ package im.vector.matrix.android.api.session +import androidx.annotation.StringRes import androidx.lifecycle.LiveData interface InitialSyncProgressService { @@ -7,7 +8,7 @@ interface InitialSyncProgressService { fun getLiveStatus() : LiveData data class Status( - val statusText: Int?, + @StringRes val statusText: Int?, val percentProgress: Int = 0 ) } \ No newline at end of file diff --git a/matrix-sdk-android/src/main/res/values/strings.xml b/matrix-sdk-android/src/main/res/values/strings.xml index eb39b689..be64a659 100644 --- a/matrix-sdk-android/src/main/res/values/strings.xml +++ b/matrix-sdk-android/src/main/res/values/strings.xml @@ -228,13 +228,4 @@ Pin - - Initial Sync:\nImporting account… - Initial Sync:\nImporting crypto - Initial Sync:\nImporting Rooms - Initial Sync:\nImporting Joined Rooms - Initial Sync:\nImporting Invited Rooms - Initial Sync:\nImporting Left Rooms - Initial Sync:\nImporting Communities - Initial Sync:\nImporting Account Data diff --git a/matrix-sdk-android/src/main/res/values/strings_RiotX.xml b/matrix-sdk-android/src/main/res/values/strings_RiotX.xml new file mode 100644 index 00000000..d03dfa79 --- /dev/null +++ b/matrix-sdk-android/src/main/res/values/strings_RiotX.xml @@ -0,0 +1,10 @@ + + Initial Sync:\nImporting account… + Initial Sync:\nImporting crypto + Initial Sync:\nImporting Rooms + Initial Sync:\nImporting Joined Rooms + Initial Sync:\nImporting Invited Rooms + Initial Sync:\nImporting Left Rooms + Initial Sync:\nImporting Communities + Initial Sync:\nImporting Account Data + \ No newline at end of file From dba4df6836d667fe39bb3598077709d05aba9553 Mon Sep 17 00:00:00 2001 From: Valere Date: Mon, 8 Jul 2019 18:23:11 +0200 Subject: [PATCH 04/10] clean --- .../im/vector/riotx/features/home/HomeActivity.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt index 398c3c46..612ba804 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt @@ -17,7 +17,6 @@ package im.vector.riotx.features.home import android.app.ProgressDialog -import android.app.TimePickerDialog import android.content.Context import android.content.Intent import android.os.Bundle @@ -119,19 +118,19 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable { intent.removeExtra(EXTRA_CLEAR_EXISTING_NOTIFICATION) } - activeSessionHolder.getSafeActiveSession()?.getLiveStatus()?.observe(this, Observer { - Timber.e("${it?.statusText?.let { getString(it) }} ${it?.percentProgress}") - if (it == null) { + activeSessionHolder.getSafeActiveSession()?.getLiveStatus()?.observe(this, Observer { sprogress -> + Timber.e("${sprogress?.statusText?.let { getString(it) }} ${sprogress?.percentProgress}") + if (sprogress == null) { waiting_view.isVisible = false } else { waiting_view_status_horizontal_progress.apply { isIndeterminate = false max = 100 - progress = it.percentProgress + progress = sprogress.percentProgress isVisible = true } waiting_view_status_text.apply { - text = it.statusText?.let { res -> getString(res) } + text = sprogress.statusText?.let { getString(it) } isVisible = true } waiting_view.isVisible = true From fa81d1a9c7c54fbffc627bae7ec8972b13014d69 Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 9 Jul 2019 15:04:13 +0200 Subject: [PATCH 05/10] Fix / revert bad refactor rename --- .../features/rageshake/BugReportActivity.kt | 6 +++--- .../riotx/features/rageshake/BugReporter.kt | 20 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReportActivity.kt b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReportActivity.kt index 7f56bdc0..d0e229ff 100755 --- a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReportActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReportActivity.kt @@ -30,7 +30,7 @@ import kotlinx.android.synthetic.main.activity_bug_report.* import timber.log.Timber /** - * Form to send a bug reportSubtask + * Form to send a bug report */ class BugReportActivity : VectorBaseActivity() { @@ -56,7 +56,7 @@ class BugReportActivity : VectorBaseActivity() { forSuggestion = intent.getBooleanExtra("FOR_SUGGESTION", false) - // Default screen is for bug reportSubtask, so modify it for suggestion + // Default screen is for bug report, so modify it for suggestion if (forSuggestion) { supportActionBar?.setTitle(R.string.send_suggestion) @@ -101,7 +101,7 @@ class BugReportActivity : VectorBaseActivity() { /** - * Send the bug reportSubtask + * Send the bug report */ private fun sendBugReport() { bug_report_scrollview.alpha = 0.3f diff --git a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt index 123d0a5a..e06bcaa2 100755 --- a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt +++ b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt @@ -68,7 +68,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes // the http client private val mOkHttpClient = OkHttpClient() - // the pending bug reportSubtask call + // the pending bug report call private var mBugReportCall: Call? = null @@ -96,16 +96,16 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes private val LOGCAT_CMD_DEBUG = arrayOf("logcat", "-d", "-v", "threadtime", "*:*") /** - * Bug reportSubtask upload listener + * Bug report upload listener */ interface IMXBugReportListener { /** - * The bug reportSubtask has been cancelled + * The bug report has been cancelled */ fun onUploadCancelled() /** - * The bug reportSubtask upload failed. + * The bug report upload failed. * * @param reason the failure reason */ @@ -119,13 +119,13 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes fun onProgress(progress: Int) /** - * The bug reportSubtask upload succeeded. + * The bug report upload succeeded. */ fun onUploadSucceed() } /** - * Send a bug reportSubtask. + * Send a bug report. * * @param context the application context * @param forSuggestion true to send a suggestion @@ -407,7 +407,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes override fun onPostExecute(reason: String?) { mBugReportCall = null - // delete when the bug reportSubtask has been successfully sent + // delete when the bug report has been successfully sent for (file in mBugReportFiles) { file.delete() } @@ -431,7 +431,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes } /** - * Send a bug reportSubtask either with email or with Vector. + * Send a bug report either with email or with Vector. */ fun openBugReportScreen(activity: Activity, forSuggestion: Boolean = false) { screenshot = takeScreenshot(activity) @@ -442,7 +442,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes } //============================================================================================================== - // crash reportSubtask management + // crash report management //============================================================================================================== /** @@ -472,7 +472,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes } /** - * Save the crash reportSubtask + * Save the crash report * * @param context the context * @param crashDescription teh crash description From 1a4157a66361307d0cb772294d98afce5f7202f0 Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 9 Jul 2019 15:36:12 +0200 Subject: [PATCH 06/10] review --- .../api/session/InitialSyncProgressService.kt | 15 +++++++++++++++ .../session/DefaultInitialSyncProgressService.kt | 16 ++++++++++++++++ .../android/internal/session/sync/SyncTask.kt | 1 + 3 files changed, 32 insertions(+) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt index ce842125..3bb567ae 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/InitialSyncProgressService.kt @@ -1,3 +1,18 @@ +/* + * 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.matrix.android.api.session import androidx.annotation.StringRes diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt index b3eac5d4..e4f1f571 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt @@ -1,3 +1,18 @@ +/* + * 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.matrix.android.internal.session import androidx.lifecycle.LiveData @@ -51,6 +66,7 @@ class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgr } fun endAll() { + rootTask = null this@DefaultInitialSyncProgressService.status.postValue(null) } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTask.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTask.kt index 45e10fb9..84490404 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTask.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncTask.kt @@ -63,6 +63,7 @@ internal class DefaultSyncTask @Inject constructor(private val syncAPI: SyncAPI, val isInitialSync = token == null if (isInitialSync) { + initialSyncProgressService.endAll() initialSyncProgressService.startTask(R.string.initial_sync_start_importing_account, 100) } return executeRequest { From 34ac987494a9d9706fd01352d2df275ec80033b9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 9 Jul 2019 16:36:46 +0200 Subject: [PATCH 07/10] Cleanup --- .../session/DefaultInitialSyncProgressService.kt | 12 ++++++------ .../internal/session/sync/SyncResponseHandler.kt | 4 ++-- .../vector/riotx/features/rageshake/BugReporter.kt | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt index e4f1f571..cefdcc72 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/DefaultInitialSyncProgressService.kt @@ -61,13 +61,13 @@ class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgr parent?.incrementProgress(endedTask.offset + (endedTask.totalProgress * endedTask.parentWeight).toInt()) } if (endedTask?.parent == null) { - this@DefaultInitialSyncProgressService.status.postValue(null) + status.postValue(null) } } fun endAll() { rootTask = null - this@DefaultInitialSyncProgressService.status.postValue(null) + status.postValue(null) } @@ -96,7 +96,7 @@ class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgr } if (parent == null) { Timber.e("--- ${leaf().nameRes}: ${currentProgress}") - this@DefaultInitialSyncProgressService.status.postValue( + status.postValue( InitialSyncProgressService.Status(leaf().nameRes, currentProgress) ) } @@ -105,7 +105,7 @@ class DefaultInitialSyncProgressService @Inject constructor() : InitialSyncProgr } -public inline fun reportSubtask(reporter: DefaultInitialSyncProgressService?, nameRes: Int, totalProgress: Int, parentWeight: Float = 1f, block: () -> T): T { +inline fun reportSubtask(reporter: DefaultInitialSyncProgressService?, nameRes: Int, totalProgress: Int, parentWeight: Float = 1f, block: () -> T): T { reporter?.startTask(nameRes, totalProgress, parentWeight) return block().also { reporter?.endTask(nameRes) @@ -113,8 +113,8 @@ public inline fun reportSubtask(reporter: DefaultInitialSyncProgressService? } -public inline fun Map.mapWithProgress(reporter: DefaultInitialSyncProgressService?, taskId: Int, weight: Float, transform: (Map.Entry) -> R): List { - val total = this.count() +inline fun Map.mapWithProgress(reporter: DefaultInitialSyncProgressService?, taskId: Int, weight: Float, transform: (Map.Entry) -> R): List { + val total = count() var current = 0 reporter?.startTask(taskId, 100, weight) return this.map { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt index 8d018d61..f918e784 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt @@ -36,7 +36,7 @@ internal class SyncResponseHandler @Inject constructor(private val roomSyncHandl fun handleResponse(syncResponse: SyncResponse, fromToken: String?, isCatchingUp: Boolean): Try { return Try { val isInitialSync = fromToken == null - Timber.v("Start handling sync, is InitialSync: ${isInitialSync}") + Timber.v("Start handling sync, is InitialSync: $isInitialSync") val reporter = initialSyncProgressService.takeIf { isInitialSync } if (!cryptoManager.isStarted()) { @@ -68,7 +68,7 @@ internal class SyncResponseHandler @Inject constructor(private val roomSyncHandl } reportSubtask(reporter, R.string.initial_sync_start_importing_account_data, 100, 0.1f) { - Timber.v("Handle accoundData") + Timber.v("Handle accountData") if (syncResponse.accountData != null) { userAccountDataSyncHandler.handle(syncResponse.accountData) } diff --git a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt index e06bcaa2..774bdfb9 100755 --- a/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt +++ b/vector/src/main/java/im/vector/riotx/features/rageshake/BugReporter.kt @@ -51,7 +51,7 @@ import javax.inject.Singleton * BugReporter creates and sends the bug reports. */ @Singleton -class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSessionHolder){ +class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSessionHolder) { var inMultiWindowMode = false companion object { @@ -72,7 +72,7 @@ class BugReporter @Inject constructor(private val activeSessionHolder: ActiveSes private var mBugReportCall: Call? = null - // boolean to cancel the bug reportSubtask + // boolean to cancel the bug report private val mIsCancelled = false /** From fc302c1b5ad2c902c39f88db2a32c8f6213bfc0f Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 9 Jul 2019 17:35:50 +0200 Subject: [PATCH 08/10] FIx / crash notification drawer empty nam --- .../riotx/features/notifications/NotificationDrawerManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/riotx/features/notifications/NotificationDrawerManager.kt b/vector/src/main/java/im/vector/riotx/features/notifications/NotificationDrawerManager.kt index 1e529bc6..b588fd15 100644 --- a/vector/src/main/java/im/vector/riotx/features/notifications/NotificationDrawerManager.kt +++ b/vector/src/main/java/im/vector/riotx/features/notifications/NotificationDrawerManager.kt @@ -184,7 +184,7 @@ class NotificationDrawerManager @Inject constructor(private val context: Context val session = activeSessionHolder.getActiveSession() val user = session.getUser(session.sessionParams.credentials.userId) - val myUserDisplayName = user?.displayName ?: "" + val myUserDisplayName = user?.displayName ?: session.sessionParams.credentials.userId val myUserAvatarUrl = session.contentUrlResolver().resolveThumbnail(user?.avatarUrl, avatarSize, avatarSize, ContentUrlResolver.ThumbnailMethod.SCALE) synchronized(eventList) { From c9931e3ba330e8d13324e240207704372dca2bda Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 9 Jul 2019 17:36:08 +0200 Subject: [PATCH 09/10] Block interaction on initial sync --- .../main/java/im/vector/riotx/features/home/HomeActivity.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt index 612ba804..67d1af4e 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/HomeActivity.kt @@ -123,6 +123,9 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable { if (sprogress == null) { waiting_view.isVisible = false } else { + waiting_view.setOnClickListener { + //block interactions + } waiting_view_status_horizontal_progress.apply { isIndeterminate = false max = 100 From 6cb94dd4d6da4e268e47e828d1d5f6e4d2755c4f Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 9 Jul 2019 17:42:53 +0200 Subject: [PATCH 10/10] Fine tune task weights + more measure --- .../session/sync/SyncResponseHandler.kt | 66 ++++++++++++------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt index f918e784..d680a318 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncResponseHandler.kt @@ -39,39 +39,61 @@ internal class SyncResponseHandler @Inject constructor(private val roomSyncHandl Timber.v("Start handling sync, is InitialSync: $isInitialSync") val reporter = initialSyncProgressService.takeIf { isInitialSync } - if (!cryptoManager.isStarted()) { - Timber.v("Should start cryptoManager") - cryptoManager.start(isInitialSync) + measureTimeMillis { + if (!cryptoManager.isStarted()) { + Timber.v("Should start cryptoManager") + cryptoManager.start(isInitialSync) + } + }.also { + Timber.v("Finish handling start cryptoManager in $it ms") } val measure = measureTimeMillis { // Handle the to device events before the room ones // to ensure to decrypt them properly - Timber.v("Handle toDevice") - reportSubtask(reporter, R.string.initial_sync_start_importing_account_crypto, 100, 0.2f) { - if (syncResponse.toDevice != null) { - cryptoSyncHandler.handleToDevice(syncResponse.toDevice, reporter) - } - } - Timber.v("Handle rooms") - - reportSubtask(reporter, R.string.initial_sync_start_importing_account_rooms, 100, 0.5f) { - if (syncResponse.rooms != null) { - roomSyncHandler.handle(syncResponse.rooms, reporter) + measureTimeMillis { + Timber.v("Handle toDevice") + reportSubtask(reporter, R.string.initial_sync_start_importing_account_crypto, 100, 0.1f) { + if (syncResponse.toDevice != null) { + cryptoSyncHandler.handleToDevice(syncResponse.toDevice, reporter) + } } + }.also { + Timber.v("Finish handling toDevice in $it ms") } - reportSubtask(reporter, R.string.initial_sync_start_importing_account_groups, 100, 0.2f) { - Timber.v("Handle groups") - if (syncResponse.groups != null) { - groupSyncHandler.handle(syncResponse.groups, reporter) + measureTimeMillis { + Timber.v("Handle rooms") + + reportSubtask(reporter, R.string.initial_sync_start_importing_account_rooms, 100, 0.7f) { + if (syncResponse.rooms != null) { + roomSyncHandler.handle(syncResponse.rooms, reporter) + } } + }.also { + Timber.v("Finish handling rooms in $it ms") } - reportSubtask(reporter, R.string.initial_sync_start_importing_account_data, 100, 0.1f) { - Timber.v("Handle accountData") - if (syncResponse.accountData != null) { - userAccountDataSyncHandler.handle(syncResponse.accountData) + + measureTimeMillis { + reportSubtask(reporter, R.string.initial_sync_start_importing_account_groups, 100, 0.1f) { + Timber.v("Handle groups") + if (syncResponse.groups != null) { + groupSyncHandler.handle(syncResponse.groups, reporter) + } } + }.also { + Timber.v("Finish handling groups in $it ms") + } + + measureTimeMillis { + reportSubtask(reporter, R.string.initial_sync_start_importing_account_data, 100, 0.1f) { + Timber.v("Handle accountData") + if (syncResponse.accountData != null) { + userAccountDataSyncHandler.handle(syncResponse.accountData) + } + } + }.also { + Timber.v("Finish handling accountData in $it ms") } Timber.v("On sync completed")