Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e70269b7 authored by Moez Bhatti's avatar Moez Bhatti Committed by Dayona Joseph
Browse files

Long-press to copy phone number

Closes #1348
parent aef8c22e
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -90,7 +90,9 @@ class ConversationInfoController(
        showBackButton(true)
        showBackButton(true)
    }
    }


    override fun contactClicks(): Observable<Long> = recipientAdapter.contactClicks
    override fun recipientClicks(): Observable<Long> = recipientAdapter.recipientClicks

    override fun recipientLongClicks(): Observable<Long> = recipientAdapter.recipientLongClicks


    override fun themeClicks(): Observable<Long> = recipientAdapter.themeClicks
    override fun themeClicks(): Observable<Long> = recipientAdapter.themeClicks


+18 −1
Original line number Original line Diff line number Diff line
@@ -18,9 +18,13 @@
 */
 */
package com.moez.QKSMS.feature.conversationinfo
package com.moez.QKSMS.feature.conversationinfo


import android.content.Context
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.Lifecycle
import com.moez.QKSMS.R
import com.moez.QKSMS.common.Navigator
import com.moez.QKSMS.common.Navigator
import com.moez.QKSMS.common.base.QkPresenter
import com.moez.QKSMS.common.base.QkPresenter
import com.moez.QKSMS.common.util.ClipboardUtils
import com.moez.QKSMS.common.util.extensions.makeToast
import com.moez.QKSMS.extensions.asObservable
import com.moez.QKSMS.extensions.asObservable
import com.moez.QKSMS.extensions.mapNotNull
import com.moez.QKSMS.extensions.mapNotNull
import com.moez.QKSMS.interactor.DeleteConversations
import com.moez.QKSMS.interactor.DeleteConversations
@@ -32,6 +36,7 @@ import com.moez.QKSMS.repository.ConversationRepository
import com.moez.QKSMS.repository.MessageRepository
import com.moez.QKSMS.repository.MessageRepository
import com.uber.autodispose.android.lifecycle.scope
import com.uber.autodispose.android.lifecycle.scope
import com.uber.autodispose.autoDisposable
import com.uber.autodispose.autoDisposable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.rxkotlin.plusAssign
import io.reactivex.rxkotlin.plusAssign
import io.reactivex.rxkotlin.withLatestFrom
import io.reactivex.rxkotlin.withLatestFrom
import io.reactivex.subjects.BehaviorSubject
import io.reactivex.subjects.BehaviorSubject
@@ -42,6 +47,7 @@ import javax.inject.Named
class ConversationInfoPresenter @Inject constructor(
class ConversationInfoPresenter @Inject constructor(
    @Named("threadId") threadId: Long,
    @Named("threadId") threadId: Long,
    messageRepo: MessageRepository,
    messageRepo: MessageRepository,
    private val context: Context,
    private val conversationRepo: ConversationRepository,
    private val conversationRepo: ConversationRepository,
    private val deleteConversations: DeleteConversations,
    private val deleteConversations: DeleteConversations,
    private val markArchived: MarkArchived,
    private val markArchived: MarkArchived,
@@ -100,7 +106,7 @@ class ConversationInfoPresenter @Inject constructor(
        super.bindIntents(view)
        super.bindIntents(view)


        // Add or display the contact
        // Add or display the contact
        view.contactClicks()
        view.recipientClicks()
                .mapNotNull(conversationRepo::getRecipient)
                .mapNotNull(conversationRepo::getRecipient)
                .doOnNext { recipient ->
                .doOnNext { recipient ->
                    recipient.contact?.lookupKey?.let(navigator::showContact)
                    recipient.contact?.lookupKey?.let(navigator::showContact)
@@ -109,6 +115,17 @@ class ConversationInfoPresenter @Inject constructor(
                .autoDisposable(view.scope(Lifecycle.Event.ON_DESTROY)) // ... this should be the default
                .autoDisposable(view.scope(Lifecycle.Event.ON_DESTROY)) // ... this should be the default
                .subscribe()
                .subscribe()


        // Copy phone number
        view.recipientLongClicks()
                .mapNotNull(conversationRepo::getRecipient)
                .map { recipient -> recipient.address }
                .observeOn(AndroidSchedulers.mainThread())
                .autoDisposable(view.scope())
                .subscribe { address ->
                    ClipboardUtils.copy(context, address)
                    context.makeToast(R.string.info_copied_address)
                }

        // Show the theme settings for the conversation
        // Show the theme settings for the conversation
        view.themeClicks()
        view.themeClicks()
                .autoDisposable(view.scope())
                .autoDisposable(view.scope())
+2 −1
Original line number Original line Diff line number Diff line
@@ -23,7 +23,8 @@ import io.reactivex.Observable


interface ConversationInfoView : QkViewContract<ConversationInfoState> {
interface ConversationInfoView : QkViewContract<ConversationInfoState> {


    fun contactClicks(): Observable<Long>
    fun recipientClicks(): Observable<Long>
    fun recipientLongClicks(): Observable<Long>
    fun themeClicks(): Observable<Long>
    fun themeClicks(): Observable<Long>
    fun nameClicks(): Observable<*>
    fun nameClicks(): Observable<*>
    fun nameChanges(): Observable<String>
    fun nameChanges(): Observable<String>
+9 −2
Original line number Original line Diff line number Diff line
@@ -36,7 +36,8 @@ class ConversationRecipientAdapter @Inject constructor(
    private val colors: Colors
    private val colors: Colors
) : QkRealmAdapter<Recipient>() {
) : QkRealmAdapter<Recipient>() {


    val contactClicks: Subject<Long> = PublishSubject.create()
    val recipientClicks: Subject<Long> = PublishSubject.create()
    val recipientLongClicks: Subject<Long> = PublishSubject.create()
    val themeClicks: Subject<Long> = PublishSubject.create()
    val themeClicks: Subject<Long> = PublishSubject.create()


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QkViewHolder {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QkViewHolder {
@@ -45,7 +46,13 @@ class ConversationRecipientAdapter @Inject constructor(
        return QkViewHolder(view).apply {
        return QkViewHolder(view).apply {
            view.setOnClickListener {
            view.setOnClickListener {
                val recipient = getItem(adapterPosition) ?: return@setOnClickListener
                val recipient = getItem(adapterPosition) ?: return@setOnClickListener
                contactClicks.onNext(recipient.id)
                recipientClicks.onNext(recipient.id)
            }

            view.setOnLongClickListener {
                val recipient = getItem(adapterPosition) ?: return@setOnLongClickListener false
                recipientLongClicks.onNext(recipient.id)
                return@setOnLongClickListener true
            }
            }


            view.theme.setOnClickListener {
            view.theme.setOnClickListener {
+1 −0
Original line number Original line Diff line number Diff line
@@ -136,6 +136,7 @@
    <string name="message_status_failed">Failed to send. Tap to try again</string>
    <string name="message_status_failed">Failed to send. Tap to try again</string>


    <string name="info_title">Details</string>
    <string name="info_title">Details</string>
    <string name="info_copied_address">Address copied</string>
    <string name="info_name">Conversation title</string>
    <string name="info_name">Conversation title</string>
    <string name="info_notifications">Notifications</string>
    <string name="info_notifications">Notifications</string>
    <string name="info_theme">Theme</string>
    <string name="info_theme">Theme</string>