diff --git a/ring-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt b/ring-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt index 979be2d02b307062a62ec30150b7229c5e482e31..49dbe4b434cf1acf450238689206027ddfe12ffe 100644 --- a/ring-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt +++ b/ring-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt @@ -40,34 +40,36 @@ import javax.inject.Inject import javax.inject.Named class ConversationPresenter @Inject constructor( - private val mContactService: ContactService, - private val mAccountService: AccountService, - private val mHardwareService: HardwareService, - private val mConversationFacade: ConversationFacade, - private val mVCardService: VCardService, + private val contactService: ContactService, + private val accountService: AccountService, + private val hardwareService: HardwareService, + private val conversationFacade: ConversationFacade, + private val vCardService: VCardService, val deviceRuntimeService: DeviceRuntimeService, - private val mPreferencesService: PreferencesService, - @param:Named("UiScheduler") private var mUiScheduler: Scheduler + private val preferencesService: PreferencesService, + @param:Named("UiScheduler") private val uiScheduler: Scheduler ) : RootPresenter<ConversationView>() { private var mConversation: Conversation? = null private var mConversationUri: Uri? = null private var mConversationDisposable: CompositeDisposable? = null - private val mVisibilityDisposable = CompositeDisposable() + private val mVisibilityDisposable = CompositeDisposable().apply { + mCompositeDisposable.add(this) + } private val mConversationSubject: Subject<Conversation> = BehaviorSubject.create() fun init(conversationUri: Uri, accountId: String) { if (conversationUri == mConversationUri) return Log.w(TAG, "init $conversationUri $accountId") - val settings = mPreferencesService.settings + val settings = preferencesService.settings view?.setSettings(settings.enableReadIndicator, settings.enableLinkPreviews) mConversationUri = conversationUri - mCompositeDisposable.add(mConversationFacade.getAccountSubject(accountId) + mCompositeDisposable.add(conversationFacade.getAccountSubject(accountId) .flatMap { a: Account -> - mConversationFacade.loadConversationHistory(a, conversationUri) - .observeOn(mUiScheduler) + conversationFacade.loadConversationHistory(a, conversationUri) + .observeOn(uiScheduler) .doOnSuccess { c: Conversation -> setConversation(a, c) } } - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe({}) { e: Throwable -> Log.e(TAG, "Error loading conversation", e) view?.goToHome() @@ -104,8 +106,8 @@ class ConversationPresenter @Inject constructor( .subscribe({ conversation: Conversation -> conversation.isVisible = true updateOngoingCallView(conversation) - mAccountService.getAccount(conversation.accountId)?.let { account -> - mConversationFacade.readMessages(account, conversation, !isBubble)} + accountService.getAccount(conversation.accountId)?.let { account -> + conversationFacade.readMessages(account, conversation, !isBubble)} }) { e -> Log.e(TAG, "Error loading conversation", e) }) } @@ -151,8 +153,8 @@ class ConversationPresenter @Inject constructor( view.hideNumberSpinner() disposable.add(c.mode .switchMapSingle { mode: Conversation.Mode -> - mContactService.getLoadedContact(c.accountId, c.contacts, true) - .observeOn(mUiScheduler) + contactService.getLoadedContact(c.accountId, c.contacts, true) + .observeOn(uiScheduler) .doOnSuccess { contacts -> initContact(account, c, contacts, mode, this.view!!) } } .subscribe()) @@ -160,11 +162,11 @@ class ConversationPresenter @Inject constructor( .switchMap { mode: Conversation.Mode -> if (mode === Conversation.Mode.Legacy || mode === Conversation.Mode.Request) c.contact!!.conversationUri else Observable.empty() } - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe { uri: Uri -> init(uri, account.accountId) }) - disposable.add(Observable.combineLatest(mHardwareService.connectivityState, mAccountService.getObservableAccount(account)) + disposable.add(Observable.combineLatest(hardwareService.connectivityState, accountService.getObservableAccount(account)) { isConnected: Boolean, a: Account -> isConnected || a.isRegistered } - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe { isOk: Boolean -> this.view?.let { v -> if (!isOk) v.displayNetworkErrorPanel() else if (!account.isEnabled) { @@ -175,23 +177,23 @@ class ConversationPresenter @Inject constructor( } }) disposable.add(c.sortedHistory - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe({ conversation: List<Interaction> -> this.view?.refreshView(conversation) }) { e: Throwable -> Log.e(TAG, "Can't update element", e) }) disposable.add(c.cleared - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe({ conversation: List<Interaction> -> this.view?.refreshView(conversation) }) { e: Throwable -> Log.e(TAG, "Can't update elements", e) }) disposable.add(c.contactUpdates .switchMap { contacts -> - Observable.merge(mContactService.observeLoadedContact(c.accountId, contacts, true)) + Observable.merge(contactService.observeLoadedContact(c.accountId, contacts, true)) } - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe { contact: ContactViewModel -> this.view?.updateContact(contact) }) disposable.add(c.updatedElements - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe({ elementTuple -> val v = this.view ?: return@subscribe when (elementTuple.second) { @@ -203,30 +205,30 @@ class ConversationPresenter @Inject constructor( ) if (showTypingIndicator()) { disposable.add(c.composingStatus - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe { composingStatus: ComposingStatus -> this.view?.setComposingStatus(composingStatus) }) } disposable.add(c.getLastDisplayed() - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe { interaction: Interaction -> this.view?.setLastDisplayed(interaction) }) disposable.add(c.calls - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe({ updateOngoingCallView(c) }) { e: Throwable -> Log.e(TAG, "Can't update call view", e) }) disposable.add(c.getColor() - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe({ integer: Int -> this.view?.setConversationColor(integer) }) { e: Throwable -> Log.e(TAG, "Can't update conversation color", e) }) disposable.add(c.getSymbol() - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe({ symbol: CharSequence -> this.view?.setConversationSymbol(symbol) }) { e: Throwable -> Log.e(TAG, "Can't update conversation color", e) }) disposable.add(account .getLocationUpdates(c.uri) - .observeOn(mUiScheduler) + .observeOn(uiScheduler) .subscribe { Log.e(TAG, "getLocationUpdates: update") this.view?.showMap(c.accountId, c.uri.uri, false) @@ -235,7 +237,7 @@ class ConversationPresenter @Inject constructor( } fun loadMore() { - mConversationDisposable?.add(mAccountService.loadMore(mConversation!!).subscribe({}) {}) + mConversationDisposable?.add(accountService.loadMore(mConversation!!).subscribe({}) {}) } fun openContact() { @@ -249,9 +251,9 @@ class ConversationPresenter @Inject constructor( } val conference = conversation.currentCall if (conversation.isSwarm || conference == null || !conference.isOnGoing) { - mConversationFacade.sendTextMessage(conversation, conversation.uri, message).subscribe() + conversationFacade.sendTextMessage(conversation, conversation.uri, message).subscribe() } else { - mConversationFacade.sendTextMessage(conversation, conference, message) + conversationFacade.sendTextMessage(conversation, conference, message) } } @@ -261,7 +263,7 @@ class ConversationPresenter @Inject constructor( fun sendFile(file: File) { mCompositeDisposable.add(mConversationSubject.firstElement().subscribe({ conversation -> - mConversationFacade.sendFile(conversation, conversation.uri, file).subscribe() + conversationFacade.sendFile(conversation, conversation.uri, file).subscribe() }) {e -> Log.e(TAG, "Can't send file", e)}) } @@ -298,21 +300,21 @@ class ConversationPresenter @Inject constructor( } fun deleteConversationItem(element: Interaction) { - mConversationFacade.deleteConversationItem(mConversation!!, element) + conversationFacade.deleteConversationItem(mConversation!!, element) } fun cancelMessage(message: Interaction) { - mConversationFacade.cancelMessage(message) + conversationFacade.cancelMessage(message) } private fun sendTrustRequest() { val conversation = mConversation ?: return val contact = conversation.contact ?: return contact.status = Contact.Status.REQUEST_SENT - mVCardService.loadSmallVCardWithDefault(conversation.accountId, VCardService.MAX_SIZE_REQUEST) + vCardService.loadSmallVCardWithDefault(conversation.accountId, VCardService.MAX_SIZE_REQUEST) .subscribeOn(Schedulers.computation()) - .subscribe({ vCard -> mAccountService.sendTrustRequest(conversation, contact.uri, Blob.fromString(VCardUtils.vcardToString(vCard)))}) - { mAccountService.sendTrustRequest(conversation, contact.uri, null) } + .subscribe({ vCard -> accountService.sendTrustRequest(conversation, contact.uri, Blob.fromString(VCardUtils.vcardToString(vCard)))}) + { accountService.sendTrustRequest(conversation, contact.uri, null) } } fun clickOnGoingPane() { @@ -325,7 +327,7 @@ class ConversationPresenter @Inject constructor( } fun goToCall(withCamera: Boolean) { - if (!withCamera && !mHardwareService.hasMicrophone()) { + if (!withCamera && !hardwareService.hasMicrophone()) { view!!.displayErrorToast(Error.NO_MICROPHONE) return } @@ -353,15 +355,15 @@ class ConversationPresenter @Inject constructor( fun onBlockIncomingContactRequest() { mConversation?.let { conversation -> - mConversationFacade.discardRequest(conversation.accountId, conversation.uri) - mAccountService.removeContact(conversation.accountId, conversation.uri.host, true) + conversationFacade.discardRequest(conversation.accountId, conversation.uri) + accountService.removeContact(conversation.accountId, conversation.uri.host, true) } view?.goToHome() } fun onRefuseIncomingContactRequest() { mConversation?.let { conversation -> - mConversationFacade.discardRequest(conversation.accountId, conversation.uri) + conversationFacade.discardRequest(conversation.accountId, conversation.uri) } view?.goToHome() } @@ -373,7 +375,7 @@ class ConversationPresenter @Inject constructor( conversation.clearHistory(true) conversation.setMode(Conversation.Mode.Syncing) } - mConversationFacade.acceptRequest(conversation.accountId, conversation.uri) + conversationFacade.acceptRequest(conversation.accountId, conversation.uri) } view?.switchToConversationView() } @@ -400,8 +402,8 @@ class ConversationPresenter @Inject constructor( } fun cameraPermissionChanged(isGranted: Boolean) { - if (isGranted && mHardwareService.isVideoAvailable) { - mHardwareService.initVideo() + if (isGranted && hardwareService.isVideoAvailable) { + hardwareService.initVideo() .onErrorComplete() .subscribe() } @@ -422,24 +424,20 @@ class ConversationPresenter @Inject constructor( fun onComposingChanged(hasMessage: Boolean) { if (showTypingIndicator()) { mConversation?.let { conversation -> - mConversationFacade.setIsComposing(conversation.accountId, conversation.uri, hasMessage) + conversationFacade.setIsComposing(conversation.accountId, conversation.uri, hasMessage) } } } private fun showTypingIndicator(): Boolean { - return mPreferencesService.settings.enableTypingIndicator + return preferencesService.settings.enableTypingIndicator } private fun showReadIndicator(): Boolean { - return mPreferencesService.settings.enableReadIndicator + return preferencesService.settings.enableReadIndicator } companion object { private val TAG = ConversationPresenter::class.simpleName!! } - - init { - mCompositeDisposable.add(mVisibilityDisposable) - } } \ No newline at end of file diff --git a/ring-android/libjamiclient/src/main/kotlin/net/jami/services/ConversationFacade.kt b/ring-android/libjamiclient/src/main/kotlin/net/jami/services/ConversationFacade.kt index 26fd3d8d86b916d4d422863e773df888b533f9dc..00760f6123dce71d8e868350f28fc59e319437b4 100644 --- a/ring-android/libjamiclient/src/main/kotlin/net/jami/services/ConversationFacade.kt +++ b/ring-android/libjamiclient/src/main/kotlin/net/jami/services/ConversationFacade.kt @@ -234,7 +234,7 @@ class ConversationFacade( */ fun loadConversationHistory(account: Account, conversationUri: Uri): Single<Conversation> { val conversation = account.getByUri(conversationUri) - ?: return Single.error(RuntimeException("Can't get conversation")) + ?: return Single.error(RuntimeException("Can't get conversation $conversationUri")) synchronized(conversation) { if ((!conversation.isSwarm && conversation.id == null) || (conversation.isSwarm && conversation.mode.blockingFirst() == Conversation.Mode.Request)) { return Single.just(conversation)