Merge pull request #609 from vector-im/feature/remove_event_bus

Stop sending bus event from SDK to App.
This commit is contained in:
Benoit Marty 2019-10-09 12:47:06 +02:00 committed by GitHub
commit c2682c7f4b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 103 additions and 47 deletions

View file

@ -19,6 +19,7 @@ package im.vector.matrix.android.api.session
import androidx.annotation.MainThread import androidx.annotation.MainThread
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.auth.data.SessionParams
import im.vector.matrix.android.api.failure.ConsentNotGivenError
import im.vector.matrix.android.api.pushrules.PushRuleService import im.vector.matrix.android.api.pushrules.PushRuleService
import im.vector.matrix.android.api.session.cache.CacheService import im.vector.matrix.android.api.session.cache.CacheService
import im.vector.matrix.android.api.session.content.ContentUploadStateTracker import im.vector.matrix.android.api.session.content.ContentUploadStateTracker
@ -140,6 +141,11 @@ interface Session :
*/ */
fun onInvalidToken() fun onInvalidToken()
/**
* A M_CONSENT_NOT_GIVEN error has been received from the homeserver
*/
fun onConsentNotGivenError(consentNotGivenError: ConsentNotGivenError)
} }
} }

View file

@ -23,6 +23,7 @@ import androidx.lifecycle.LiveData
import dagger.Lazy import dagger.Lazy
import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.auth.data.SessionParams import im.vector.matrix.android.api.auth.data.SessionParams
import im.vector.matrix.android.api.failure.ConsentNotGivenError
import im.vector.matrix.android.api.pushrules.PushRuleService import im.vector.matrix.android.api.pushrules.PushRuleService
import im.vector.matrix.android.api.session.InitialSyncProgressService import im.vector.matrix.android.api.session.InitialSyncProgressService
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
@ -45,6 +46,9 @@ import im.vector.matrix.android.internal.crypto.DefaultCryptoService
import im.vector.matrix.android.internal.database.LiveEntityObserver import im.vector.matrix.android.internal.database.LiveEntityObserver
import im.vector.matrix.android.internal.session.sync.job.SyncThread import im.vector.matrix.android.internal.session.sync.job.SyncThread
import im.vector.matrix.android.internal.session.sync.job.SyncWorker import im.vector.matrix.android.internal.session.sync.job.SyncWorker
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Provider import javax.inject.Provider
@ -96,6 +100,7 @@ internal class DefaultSession @Inject constructor(override val sessionParams: Se
assert(!isOpen) assert(!isOpen)
isOpen = true isOpen = true
liveEntityObservers.forEach { it.start() } liveEntityObservers.forEach { it.start() }
EventBus.getDefault().register(this)
} }
override fun requireBackgroundSync() { override fun requireBackgroundSync() {
@ -135,6 +140,7 @@ internal class DefaultSession @Inject constructor(override val sessionParams: Se
liveEntityObservers.forEach { it.dispose() } liveEntityObservers.forEach { it.dispose() }
cryptoService.get().close() cryptoService.get().close()
isOpen = false isOpen = false
EventBus.getDefault().unregister(this)
} }
override fun syncState(): LiveData<SyncState> { override fun syncState(): LiveData<SyncState> {
@ -163,6 +169,11 @@ internal class DefaultSession @Inject constructor(override val sessionParams: Se
}) })
} }
@Subscribe(threadMode = ThreadMode.MAIN)
fun onConsentNotGivenError(consentNotGivenError: ConsentNotGivenError) {
sessionListeners.dispatchConsentNotGiven(consentNotGivenError)
}
override fun contentUrlResolver() = contentUrlResolver override fun contentUrlResolver() = contentUrlResolver
override fun contentUploadProgressTracker() = contentUploadProgressTracker override fun contentUploadProgressTracker() = contentUploadProgressTracker

View file

@ -16,19 +16,32 @@
package im.vector.matrix.android.internal.session package im.vector.matrix.android.internal.session
import im.vector.matrix.android.api.failure.ConsentNotGivenError
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
import javax.inject.Inject import javax.inject.Inject
internal class SessionListeners @Inject constructor(){ internal class SessionListeners @Inject constructor() {
private val listeners = ArrayList<Session.Listener>() private val listeners = ArrayList<Session.Listener>()
fun addListener(listener: Session.Listener) { fun addListener(listener: Session.Listener) {
listeners.add(listener) synchronized(listeners) {
listeners.add(listener)
}
} }
fun removeListener(listener: Session.Listener) { fun removeListener(listener: Session.Listener) {
listeners.remove(listener) synchronized(listeners) {
listeners.remove(listener)
}
}
fun dispatchConsentNotGiven(consentNotGivenError: ConsentNotGivenError) {
synchronized(listeners) {
listeners.forEach {
it.onConsentNotGivenError(consentNotGivenError)
}
}
} }
} }

View file

@ -288,9 +288,6 @@ dependencies {
implementation 'me.saket:better-link-movement-method:2.2.0' implementation 'me.saket:better-link-movement-method:2.2.0'
implementation 'com.google.android:flexbox:1.1.1' implementation 'com.google.android:flexbox:1.1.1'
// Bus
implementation 'org.greenrobot:eventbus:3.1.1'
// Passphrase strength helper // Passphrase strength helper
implementation 'com.nulab-inc:zxcvbn:1.2.7' implementation 'com.nulab-inc:zxcvbn:1.2.7'

View file

@ -49,6 +49,7 @@ import im.vector.riotx.features.notifications.NotificationDrawerManager
import im.vector.riotx.features.notifications.NotificationUtils import im.vector.riotx.features.notifications.NotificationUtils
import im.vector.riotx.features.notifications.PushRuleTriggerListener import im.vector.riotx.features.notifications.PushRuleTriggerListener
import im.vector.riotx.features.rageshake.VectorUncaughtExceptionHandler import im.vector.riotx.features.rageshake.VectorUncaughtExceptionHandler
import im.vector.riotx.features.session.SessionListener
import im.vector.riotx.features.settings.VectorPreferences import im.vector.riotx.features.settings.VectorPreferences
import im.vector.riotx.features.version.VersionProvider import im.vector.riotx.features.version.VersionProvider
import im.vector.riotx.push.fcm.FcmHelper import im.vector.riotx.push.fcm.FcmHelper
@ -68,6 +69,7 @@ class VectorApplication : Application(), HasVectorInjector, MatrixConfiguration.
@Inject lateinit var emojiCompatWrapper: EmojiCompatWrapper @Inject lateinit var emojiCompatWrapper: EmojiCompatWrapper
@Inject lateinit var vectorUncaughtExceptionHandler: VectorUncaughtExceptionHandler @Inject lateinit var vectorUncaughtExceptionHandler: VectorUncaughtExceptionHandler
@Inject lateinit var activeSessionHolder: ActiveSessionHolder @Inject lateinit var activeSessionHolder: ActiveSessionHolder
@Inject lateinit var sessionListener: SessionListener
@Inject lateinit var notificationDrawerManager: NotificationDrawerManager @Inject lateinit var notificationDrawerManager: NotificationDrawerManager
@Inject lateinit var pushRuleTriggerListener: PushRuleTriggerListener @Inject lateinit var pushRuleTriggerListener: PushRuleTriggerListener
@Inject lateinit var vectorPreferences: VectorPreferences @Inject lateinit var vectorPreferences: VectorPreferences
@ -117,7 +119,7 @@ class VectorApplication : Application(), HasVectorInjector, MatrixConfiguration.
if (authenticator.hasAuthenticatedSessions() && !activeSessionHolder.hasActiveSession()) { if (authenticator.hasAuthenticatedSessions() && !activeSessionHolder.hasActiveSession()) {
val lastAuthenticatedSession = authenticator.getLastAuthenticatedSession()!! val lastAuthenticatedSession = authenticator.getLastAuthenticatedSession()!!
activeSessionHolder.setActiveSession(lastAuthenticatedSession) activeSessionHolder.setActiveSession(lastAuthenticatedSession)
lastAuthenticatedSession.configureAndStart(pushRuleTriggerListener) lastAuthenticatedSession.configureAndStart(pushRuleTriggerListener, sessionListener)
} }
ProcessLifecycleOwner.get().lifecycle.addObserver(object : LifecycleObserver { ProcessLifecycleOwner.get().lifecycle.addObserver(object : LifecycleObserver {

View file

@ -40,6 +40,7 @@ import im.vector.riotx.features.notifications.*
import im.vector.riotx.features.rageshake.BugReporter import im.vector.riotx.features.rageshake.BugReporter
import im.vector.riotx.features.rageshake.VectorFileLogger import im.vector.riotx.features.rageshake.VectorFileLogger
import im.vector.riotx.features.rageshake.VectorUncaughtExceptionHandler import im.vector.riotx.features.rageshake.VectorUncaughtExceptionHandler
import im.vector.riotx.features.session.SessionListener
import im.vector.riotx.features.settings.VectorPreferences import im.vector.riotx.features.settings.VectorPreferences
import im.vector.riotx.features.ui.UiStateRepository import im.vector.riotx.features.ui.UiStateRepository
import javax.inject.Singleton import javax.inject.Singleton
@ -54,6 +55,8 @@ interface VectorComponent {
fun matrix(): Matrix fun matrix(): Matrix
fun sessionListener(): SessionListener
fun currentSession(): Session fun currentSession(): Session
fun notificationUtils(): NotificationUtils fun notificationUtils(): NotificationUtils

View file

@ -21,10 +21,13 @@ import androidx.lifecycle.ProcessLifecycleOwner
import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.sync.FilterService import im.vector.matrix.android.api.session.sync.FilterService
import im.vector.riotx.features.notifications.PushRuleTriggerListener import im.vector.riotx.features.notifications.PushRuleTriggerListener
import im.vector.riotx.features.session.SessionListener
import timber.log.Timber import timber.log.Timber
fun Session.configureAndStart(pushRuleTriggerListener: PushRuleTriggerListener) { fun Session.configureAndStart(pushRuleTriggerListener: PushRuleTriggerListener,
sessionListener: SessionListener) {
open() open()
addListener(sessionListener)
setFilter(FilterService.FilterPreset.RiotFilter) setFilter(FilterService.FilterPreset.RiotFilter)
Timber.i("Configure and start session for ${this.myUserId}") Timber.i("Configure and start session for ${this.myUserId}")
val isAtLeastStarted = ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED) val isAtLeastStarted = ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)

View file

@ -36,11 +36,11 @@ import butterknife.Unbinder
import com.airbnb.mvrx.BaseMvRxActivity import com.airbnb.mvrx.BaseMvRxActivity
import com.bumptech.glide.util.Util import com.bumptech.glide.util.Util
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import im.vector.matrix.android.api.failure.ConsentNotGivenError
import im.vector.riotx.BuildConfig import im.vector.riotx.BuildConfig
import im.vector.riotx.R import im.vector.riotx.R
import im.vector.riotx.core.di.* import im.vector.riotx.core.di.*
import im.vector.riotx.core.dialogs.DialogLocker import im.vector.riotx.core.dialogs.DialogLocker
import im.vector.riotx.core.extensions.observeEvent
import im.vector.riotx.core.utils.toast import im.vector.riotx.core.utils.toast
import im.vector.riotx.features.configuration.VectorConfiguration import im.vector.riotx.features.configuration.VectorConfiguration
import im.vector.riotx.features.consent.ConsentNotGivenHelper import im.vector.riotx.features.consent.ConsentNotGivenHelper
@ -48,14 +48,12 @@ import im.vector.riotx.features.navigation.Navigator
import im.vector.riotx.features.rageshake.BugReportActivity import im.vector.riotx.features.rageshake.BugReportActivity
import im.vector.riotx.features.rageshake.BugReporter import im.vector.riotx.features.rageshake.BugReporter
import im.vector.riotx.features.rageshake.RageShake import im.vector.riotx.features.rageshake.RageShake
import im.vector.riotx.features.session.SessionListener
import im.vector.riotx.features.themes.ActivityOtherThemes import im.vector.riotx.features.themes.ActivityOtherThemes
import im.vector.riotx.features.themes.ThemeUtils import im.vector.riotx.features.themes.ThemeUtils
import im.vector.riotx.receivers.DebugReceiver import im.vector.riotx.receivers.DebugReceiver
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import timber.log.Timber import timber.log.Timber
import kotlin.system.measureTimeMillis import kotlin.system.measureTimeMillis
@ -76,6 +74,7 @@ abstract class VectorBaseActivity : BaseMvRxActivity(), HasScreenInjector {
protected lateinit var viewModelFactory: ViewModelProvider.Factory protected lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var configurationViewModel: ConfigurationViewModel private lateinit var configurationViewModel: ConfigurationViewModel
private lateinit var sessionListener: SessionListener
protected lateinit var bugReporter: BugReporter protected lateinit var bugReporter: BugReporter
private lateinit var rageShake: RageShake private lateinit var rageShake: RageShake
protected lateinit var navigator: Navigator protected lateinit var navigator: Navigator
@ -132,6 +131,7 @@ abstract class VectorBaseActivity : BaseMvRxActivity(), HasScreenInjector {
viewModelFactory = screenComponent.viewModelFactory() viewModelFactory = screenComponent.viewModelFactory()
configurationViewModel = ViewModelProviders.of(this, viewModelFactory).get(ConfigurationViewModel::class.java) configurationViewModel = ViewModelProviders.of(this, viewModelFactory).get(ConfigurationViewModel::class.java)
bugReporter = screenComponent.bugReporter() bugReporter = screenComponent.bugReporter()
// Shake detector
rageShake = screenComponent.rageShake() rageShake = screenComponent.rageShake()
navigator = screenComponent.navigator() navigator = screenComponent.navigator()
activeSessionHolder = screenComponent.activeSessionHolder() activeSessionHolder = screenComponent.activeSessionHolder()
@ -143,7 +143,11 @@ abstract class VectorBaseActivity : BaseMvRxActivity(), HasScreenInjector {
} }
}) })
// Shake detector sessionListener = getVectorComponent().sessionListener()
sessionListener.consentNotGivenLiveData.observeEvent(this) {
consentNotGivenHelper.displayDialog(it.consentUri,
activeSessionHolder.getActiveSession().sessionParams.homeServerConnectionConfig.homeServerUri.host ?: "")
}
doBeforeSetContentView() doBeforeSetContentView()
@ -408,22 +412,6 @@ abstract class VectorBaseActivity : BaseMvRxActivity(), HasScreenInjector {
.apply { restorables.add(this) } .apply { restorables.add(this) }
} }
override fun onStart() {
super.onStart()
EventBus.getDefault().register(this)
}
override fun onStop() {
super.onStop()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onConsentNotGivenError(consentNotGivenError: ConsentNotGivenError) {
consentNotGivenHelper.displayDialog(consentNotGivenError.consentUri,
activeSessionHolder.getActiveSession().sessionParams.homeServerConnectionConfig.homeServerUri.host ?: "")
}
/* ========================================================================================== /* ==========================================================================================
* Temporary method * Temporary method
* ========================================================================================== */ * ========================================================================================== */

View file

@ -40,7 +40,7 @@ class HomeActivityViewModel @AssistedInject constructor(@Assisted initialState:
private val session: Session, private val session: Session,
private val selectedGroupStore: SelectedGroupStore, private val selectedGroupStore: SelectedGroupStore,
private val homeRoomListStore: HomeRoomListObservableStore private val homeRoomListStore: HomeRoomListObservableStore
) : VectorViewModel<EmptyState>(initialState), Session.Listener { ) : VectorViewModel<EmptyState>(initialState) {
@AssistedInject.Factory @AssistedInject.Factory
interface Factory { interface Factory {
@ -58,7 +58,6 @@ class HomeActivityViewModel @AssistedInject constructor(@Assisted initialState:
init { init {
session.addListener(this)
observeRoomAndGroup() observeRoomAndGroup()
} }
@ -96,17 +95,4 @@ class HomeActivityViewModel @AssistedInject constructor(@Assisted initialState:
.disposeOnClear() .disposeOnClear()
} }
override fun onCleared() {
super.onCleared()
session.removeListener(this)
}
/* ==========================================================================================
* Session listener
* ========================================================================================== */
override fun onInvalidToken() {
}
} }

View file

@ -34,12 +34,14 @@ import im.vector.riotx.core.extensions.configureAndStart
import im.vector.riotx.core.platform.VectorViewModel import im.vector.riotx.core.platform.VectorViewModel
import im.vector.riotx.core.utils.LiveEvent import im.vector.riotx.core.utils.LiveEvent
import im.vector.riotx.features.notifications.PushRuleTriggerListener import im.vector.riotx.features.notifications.PushRuleTriggerListener
import im.vector.riotx.features.session.SessionListener
import timber.log.Timber import timber.log.Timber
class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginViewState, class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginViewState,
private val authenticator: Authenticator, private val authenticator: Authenticator,
private val activeSessionHolder: ActiveSessionHolder, private val activeSessionHolder: ActiveSessionHolder,
private val pushRuleTriggerListener: PushRuleTriggerListener) private val pushRuleTriggerListener: PushRuleTriggerListener,
private val sessionListener: SessionListener)
: VectorViewModel<LoginViewState>(initialState) { : VectorViewModel<LoginViewState>(initialState) {
@AssistedInject.Factory @AssistedInject.Factory
@ -114,7 +116,7 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi
private fun onSessionCreated(session: Session) { private fun onSessionCreated(session: Session) {
activeSessionHolder.setActiveSession(session) activeSessionHolder.setActiveSession(session)
session.configureAndStart(pushRuleTriggerListener) session.configureAndStart(pushRuleTriggerListener, sessionListener)
setState { setState {
copy( copy(
@ -139,7 +141,7 @@ class LoginViewModel @AssistedInject constructor(@Assisted initialState: LoginVi
private fun handleUpdateHomeserver(action: LoginActions.UpdateHomeServer) = withState { state -> private fun handleUpdateHomeserver(action: LoginActions.UpdateHomeServer) = withState { state ->
var newConfig : HomeServerConnectionConfig? = null var newConfig: HomeServerConnectionConfig? = null
Try { Try {
val homeServerUri = action.homeServerUrl val homeServerUri = action.homeServerUrl
newConfig = HomeServerConnectionConfig.Builder() newConfig = HomeServerConnectionConfig.Builder()

View file

@ -0,0 +1,45 @@
/*
* 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.riotx.features.session
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import im.vector.matrix.android.api.failure.ConsentNotGivenError
import im.vector.matrix.android.api.session.Session
import im.vector.riotx.core.extensions.postLiveEvent
import im.vector.riotx.core.utils.LiveEvent
import timber.log.Timber
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class SessionListener @Inject constructor() : Session.Listener {
private val _consentNotGivenLiveData = MutableLiveData<LiveEvent<ConsentNotGivenError>>()
val consentNotGivenLiveData: LiveData<LiveEvent<ConsentNotGivenError>>
get() = _consentNotGivenLiveData
override fun onInvalidToken() {
// TODO Handle this error
Timber.e("Token is not valid anymore: handle this properly")
}
override fun onConsentNotGivenError(consentNotGivenError: ConsentNotGivenError) {
_consentNotGivenLiveData.postLiveEvent(consentNotGivenError)
}
}