From 73887558fa93e0683de8a181c30e61408aec5a67 Mon Sep 17 00:00:00 2001 From: Moez Bhatti Date: Mon, 11 Jun 2018 20:16:16 -0400 Subject: [PATCH] Add support for Android 5.0 --- android-smsmms/build.gradle | 2 +- .../android/send_message/SmsManagerFactory.kt | 3 +- data/build.gradle | 2 +- .../java/compat/SubscriptionInfoCompat.kt | 32 +++++++++ .../java/compat/SubscriptionManagerCompat.kt | 69 +++++++++++++++++++ .../java/receiver/RemoteMessagingReceiver.kt | 6 +- .../java/util/ActiveSubscriptionObservable.kt | 43 ++++++++++++ .../main/java/util/SubscriptionUtilsImpl.kt | 69 ------------------- domain/build.gradle | 2 +- .../src/main/java/util/SubscriptionUtils.kt | 14 ---- presentation/build.gradle | 2 +- .../src/main/java/common/widget/AvatarView.kt | 22 +++--- .../java/common/widget/GroupAvatarView.kt | 6 ++ .../java/feature/compose/ComposeActivity.kt | 7 ++ .../main/java/feature/compose/ComposeState.kt | 3 +- .../java/feature/compose/ComposeViewModel.kt | 10 +-- .../java/feature/compose/MessagesAdapter.kt | 6 +- .../java/feature/qkreply/QkReplyActivity.kt | 10 +++ .../main/java/feature/qkreply/QkReplyState.kt | 4 +- .../java/feature/qkreply/QkReplyViewModel.kt | 10 +-- .../src/main/java/injection/AppModule.kt | 8 --- 21 files changed, 205 insertions(+), 125 deletions(-) create mode 100644 data/src/main/java/compat/SubscriptionInfoCompat.kt create mode 100644 data/src/main/java/compat/SubscriptionManagerCompat.kt create mode 100644 data/src/main/java/util/ActiveSubscriptionObservable.kt delete mode 100644 data/src/main/java/util/SubscriptionUtilsImpl.kt delete mode 100644 domain/src/main/java/util/SubscriptionUtils.kt diff --git a/android-smsmms/build.gradle b/android-smsmms/build.gradle index 1c8cc0c0..8e93643e 100644 --- a/android-smsmms/build.gradle +++ b/android-smsmms/build.gradle @@ -23,7 +23,7 @@ android { compileSdkVersion 25 defaultConfig { - minSdkVersion 22 + minSdkVersion 21 targetSdkVersion 25 versionCode 1 versionName "1.0" diff --git a/android-smsmms/src/main/java/com/klinker/android/send_message/SmsManagerFactory.kt b/android-smsmms/src/main/java/com/klinker/android/send_message/SmsManagerFactory.kt index 624c75b9..1f0e447c 100755 --- a/android-smsmms/src/main/java/com/klinker/android/send_message/SmsManagerFactory.kt +++ b/android-smsmms/src/main/java/com/klinker/android/send_message/SmsManagerFactory.kt @@ -1,5 +1,6 @@ package com.klinker.android.send_message +import android.os.Build import android.telephony.SmsManager object SmsManagerFactory { @@ -9,7 +10,7 @@ object SmsManagerFactory { fun createSmsManager(subscriptionId: Int): SmsManager { var manager: SmsManager? = null - if (subscriptionId != -1) { + if (subscriptionId != -1 && Build.VERSION.SDK_INT >= 22) { try { manager = SmsManager.getSmsManagerForSubscriptionId(subscriptionId) } catch (e: Exception) { diff --git a/data/build.gradle b/data/build.gradle index 43a87db2..e58f1548 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -6,7 +6,7 @@ android { compileSdkVersion 27 defaultConfig { - minSdkVersion 22 + minSdkVersion 21 targetSdkVersion 27 } } diff --git a/data/src/main/java/compat/SubscriptionInfoCompat.kt b/data/src/main/java/compat/SubscriptionInfoCompat.kt new file mode 100644 index 00000000..7cce63f3 --- /dev/null +++ b/data/src/main/java/compat/SubscriptionInfoCompat.kt @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2017 Moez Bhatti + * + * This file is part of QKSMS. + * + * QKSMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QKSMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QKSMS. If not, see . + */ +package compat + +import android.annotation.TargetApi +import android.os.Build +import android.telephony.SubscriptionInfo + +@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1) +data class SubscriptionInfoCompat(private val subscriptionInfo: SubscriptionInfo) { + + val subscriptionId get() = subscriptionInfo.subscriptionId + + val simSlotIndex get() = subscriptionInfo.simSlotIndex + +} \ No newline at end of file diff --git a/data/src/main/java/compat/SubscriptionManagerCompat.kt b/data/src/main/java/compat/SubscriptionManagerCompat.kt new file mode 100644 index 00000000..a564e242 --- /dev/null +++ b/data/src/main/java/compat/SubscriptionManagerCompat.kt @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2017 Moez Bhatti + * + * This file is part of QKSMS. + * + * QKSMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QKSMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QKSMS. If not, see . + */ +package compat + +import android.content.Context +import android.os.Build +import android.telephony.SubscriptionManager +import manager.PermissionManager +import javax.inject.Inject + +class SubscriptionManagerCompat @Inject constructor(context: Context, private val permissions: PermissionManager) { + + private val subscriptionManager: SubscriptionManager? + get() = field?.takeIf { permissions.hasPhone() } + + val activeSubscriptionInfoList: List + get() { + return if (Build.VERSION.SDK_INT >= 22) { + subscriptionManager?.activeSubscriptionInfoList?.map { SubscriptionInfoCompat(it) } ?: listOf() + } else listOf() + } + + init { + subscriptionManager = if (Build.VERSION.SDK_INT >= 22) SubscriptionManager.from(context) else null + } + + fun addOnSubscriptionsChangedListener(listener: OnSubscriptionsChangedListener) { + if (Build.VERSION.SDK_INT >= 22) { + subscriptionManager?.addOnSubscriptionsChangedListener(listener.listener) + } + } + + fun removeOnSubscriptionsChangedListener(listener: OnSubscriptionsChangedListener) { + if (Build.VERSION.SDK_INT >= 22) { + subscriptionManager?.removeOnSubscriptionsChangedListener(listener.listener) + } + } + + abstract class OnSubscriptionsChangedListener { + + val listener: SubscriptionManager.OnSubscriptionsChangedListener? = if (Build.VERSION.SDK_INT >= 22) { + object : SubscriptionManager.OnSubscriptionsChangedListener() { + override fun onSubscriptionsChanged() { + this@OnSubscriptionsChangedListener.onSubscriptionsChanged() + } + } + } else null + + abstract fun onSubscriptionsChanged() + + } + +} \ No newline at end of file diff --git a/data/src/main/java/receiver/RemoteMessagingReceiver.kt b/data/src/main/java/receiver/RemoteMessagingReceiver.kt index a0b7d5d9..fde382ee 100644 --- a/data/src/main/java/receiver/RemoteMessagingReceiver.kt +++ b/data/src/main/java/receiver/RemoteMessagingReceiver.kt @@ -22,11 +22,11 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.support.v4.app.RemoteInput +import compat.SubscriptionManagerCompat import dagger.android.AndroidInjection import interactor.MarkRead import interactor.SendMessage import repository.MessageRepository -import util.SubscriptionUtils import javax.inject.Inject class RemoteMessagingReceiver : BroadcastReceiver() { @@ -34,7 +34,7 @@ class RemoteMessagingReceiver : BroadcastReceiver() { @Inject lateinit var markRead: MarkRead @Inject lateinit var messageRepo: MessageRepository @Inject lateinit var sendMessage: SendMessage - @Inject lateinit var subUtils: SubscriptionUtils + @Inject lateinit var subscriptionManager: SubscriptionManagerCompat override fun onReceive(context: Context, intent: Intent) { AndroidInjection.inject(this, context) @@ -47,7 +47,7 @@ class RemoteMessagingReceiver : BroadcastReceiver() { markRead.execute(threadId) val lastMessage = messageRepo.getMessages(threadId).lastOrNull() - val subId = subUtils.subscriptions.firstOrNull { it.subscriptionId == lastMessage?.subId }?.subscriptionId ?: -1 + val subId = subscriptionManager.activeSubscriptionInfoList.firstOrNull { it.subscriptionId == lastMessage?.subId }?.subscriptionId ?: -1 val addresses = messageRepo.getConversation(threadId)?.recipients?.map { it.address } ?: return val pendingRepository = goAsync() diff --git a/data/src/main/java/util/ActiveSubscriptionObservable.kt b/data/src/main/java/util/ActiveSubscriptionObservable.kt new file mode 100644 index 00000000..075a57b7 --- /dev/null +++ b/data/src/main/java/util/ActiveSubscriptionObservable.kt @@ -0,0 +1,43 @@ +package util + +import compat.SubscriptionInfoCompat +import compat.SubscriptionManagerCompat +import io.reactivex.Observable +import io.reactivex.Observer +import io.reactivex.disposables.Disposable + +class ActiveSubscriptionObservable( + private val subscriptionManager: SubscriptionManagerCompat +) : Observable>() { + + override fun subscribeActual(observer: Observer>) { + observer.onNext(subscriptionManager.activeSubscriptionInfoList) + + val listener = Listener(subscriptionManager, observer) + observer.onSubscribe(listener) + subscriptionManager.addOnSubscriptionsChangedListener(listener) + } + + internal class Listener( + private val subscriptionManager: SubscriptionManagerCompat, + private val observer: Observer> + ) : Disposable, SubscriptionManagerCompat.OnSubscriptionsChangedListener() { + + private var disposed: Boolean = false + + override fun onSubscriptionsChanged() { + if (!isDisposed) { + observer.onNext(subscriptionManager.activeSubscriptionInfoList) + } + } + + override fun isDisposed(): Boolean = disposed + + override fun dispose() { + disposed = true + subscriptionManager.removeOnSubscriptionsChangedListener(this) + } + + } + +} \ No newline at end of file diff --git a/data/src/main/java/util/SubscriptionUtilsImpl.kt b/data/src/main/java/util/SubscriptionUtilsImpl.kt deleted file mode 100644 index 9fa5c2a3..00000000 --- a/data/src/main/java/util/SubscriptionUtilsImpl.kt +++ /dev/null @@ -1,69 +0,0 @@ -package util - -import android.content.Context -import android.telephony.PhoneNumberUtils -import android.telephony.SubscriptionInfo -import android.telephony.SubscriptionManager -import io.reactivex.Observable -import io.reactivex.Observer -import io.reactivex.disposables.Disposable -import manager.PermissionManager -import javax.inject.Inject - -class SubscriptionUtilsImpl @Inject constructor( - context: Context, - private val permissions: PermissionManager -) : SubscriptionUtils { - - /** - * If we don't have the phone permission, then return a null [SubscriptionManager] - */ - private val subscriptionManager: SubscriptionManager? = SubscriptionManager.from(context) - get() = field?.takeIf { permissions.hasPhone() } - - override val subscriptions: List - get() = subscriptionManager?.activeSubscriptionInfoList ?: listOf() - - override val subscriptionsObservable: Observable> = ActiveSubscriptionObservable(subscriptionManager) - - override fun getSubIdForAddress(address: String): Int { - return subscriptions.firstOrNull { PhoneNumberUtils.compare(it.number, address) }?.subscriptionId ?: -1 - } - -} - -class ActiveSubscriptionObservable( - private val subscriptionManager: SubscriptionManager? -) : Observable>() { - - override fun subscribeActual(observer: Observer>) { - observer.onNext(subscriptionManager?.activeSubscriptionInfoList ?: listOf()) - - val listener = Listener(subscriptionManager, observer) - observer.onSubscribe(listener) - subscriptionManager?.addOnSubscriptionsChangedListener(listener) - } - - internal class Listener( - private val subscriptionManager: SubscriptionManager?, - private val observer: Observer> - ) : Disposable, SubscriptionManager.OnSubscriptionsChangedListener() { - - private var disposed: Boolean = false - - override fun onSubscriptionsChanged() { - if (!isDisposed) { - observer.onNext(subscriptionManager?.activeSubscriptionInfoList ?: listOf()) - } - } - - override fun isDisposed(): Boolean = disposed - - override fun dispose() { - disposed = true - subscriptionManager?.removeOnSubscriptionsChangedListener(this) - } - - } - -} \ No newline at end of file diff --git a/domain/build.gradle b/domain/build.gradle index f7aa73a0..e14e4f62 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -7,7 +7,7 @@ android { compileSdkVersion 27 defaultConfig { - minSdkVersion 22 + minSdkVersion 21 targetSdkVersion 27 } } diff --git a/domain/src/main/java/util/SubscriptionUtils.kt b/domain/src/main/java/util/SubscriptionUtils.kt deleted file mode 100644 index 62759c0d..00000000 --- a/domain/src/main/java/util/SubscriptionUtils.kt +++ /dev/null @@ -1,14 +0,0 @@ -package util - -import android.telephony.SubscriptionInfo -import io.reactivex.Observable - -interface SubscriptionUtils { - - val subscriptions: List - - val subscriptionsObservable: Observable> - - fun getSubIdForAddress(address: String): Int - -} \ No newline at end of file diff --git a/presentation/build.gradle b/presentation/build.gradle index 2fa99db0..170c67d2 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -11,7 +11,7 @@ android { defaultConfig { applicationId "com.moez.QKSMS" - minSdkVersion 22 + minSdkVersion 21 targetSdkVersion 27 versionCode 173 versionName "3.3.2" diff --git a/presentation/src/main/java/common/widget/AvatarView.kt b/presentation/src/main/java/common/widget/AvatarView.kt index a0bf3950..73c15891 100644 --- a/presentation/src/main/java/common/widget/AvatarView.kt +++ b/presentation/src/main/java/common/widget/AvatarView.kt @@ -49,12 +49,7 @@ class AvatarView @JvmOverloads constructor(context: Context, attrs: AttributeSet set(value) { if (field == value) return field = value - - colors.theme(value).run { - setBackgroundTint(theme) - initial.setTextColor(textPrimary) - icon.setTint(textPrimary) - } + applyTheme(value) } private var lookupKey: String? = null @@ -106,16 +101,19 @@ class AvatarView @JvmOverloads constructor(context: Context, attrs: AttributeSet super.onFinishInflate() if (!isInEditMode) { - colors.theme(threadId).run { - setBackgroundTint(theme) - initial.setTextColor(textPrimary) - icon.setTint(textPrimary) - } - + applyTheme(threadId) updateView() } } + fun applyTheme(threadId: Long) { + colors.theme(threadId).run { + setBackgroundTint(theme) + initial.setTextColor(textPrimary) + icon.setTint(textPrimary) + } + } + private fun updateView() { if (name?.isNotEmpty() == true) { initial.text = name?.substring(0, 1) diff --git a/presentation/src/main/java/common/widget/GroupAvatarView.kt b/presentation/src/main/java/common/widget/GroupAvatarView.kt index 757b3834..2d0f3352 100644 --- a/presentation/src/main/java/common/widget/GroupAvatarView.kt +++ b/presentation/src/main/java/common/widget/GroupAvatarView.kt @@ -19,6 +19,7 @@ package common.widget import android.content.Context +import android.os.Build import android.support.constraint.ConstraintLayout import android.util.AttributeSet import android.view.View @@ -47,6 +48,11 @@ class GroupAvatarView @JvmOverloads constructor(context: Context, attrs: Attribu avatars.forEach { avatar -> avatar.setBackgroundResource(R.drawable.rectangle) + + // If we're on API 21 we need to reapply the tint after changing the background + if (Build.VERSION.SDK_INT < 22) { + avatar.applyTheme(0) + } } if (!isInEditMode) { diff --git a/presentation/src/main/java/feature/compose/ComposeActivity.kt b/presentation/src/main/java/feature/compose/ComposeActivity.kt index bd637b0a..40190bd9 100644 --- a/presentation/src/main/java/feature/compose/ComposeActivity.kt +++ b/presentation/src/main/java/feature/compose/ComposeActivity.kt @@ -26,6 +26,7 @@ import android.content.ContentValues import android.content.Intent import android.graphics.PorterDuff import android.net.Uri +import android.os.Build import android.os.Bundle import android.provider.MediaStore import android.support.v4.app.ActivityCompat @@ -40,6 +41,7 @@ import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.base.QkThemedActivity import common.util.extensions.autoScrollToStart +import common.util.extensions.resolveThemeColor import common.util.extensions.scrapViews import common.util.extensions.setBackgroundTint import common.util.extensions.setTint @@ -134,6 +136,11 @@ class ComposeActivity : QkThemedActivity(), ComposeView { .subscribe { messageList.scrapViews() } window.callback = ComposeWindowCallback(window.callback, this) + + // These theme attributes don't apply themselves on API 21 + if (Build.VERSION.SDK_INT <= 22) { + composeBackground.setBackgroundTint(resolveThemeColor(R.attr.composeBackground)) + } } override fun onStart() { diff --git a/presentation/src/main/java/feature/compose/ComposeState.kt b/presentation/src/main/java/feature/compose/ComposeState.kt index e24c5589..14649f17 100644 --- a/presentation/src/main/java/feature/compose/ComposeState.kt +++ b/presentation/src/main/java/feature/compose/ComposeState.kt @@ -19,6 +19,7 @@ package feature.compose import android.telephony.SubscriptionInfo +import compat.SubscriptionInfoCompat import io.realm.RealmResults import model.Attachment import model.Contact @@ -44,6 +45,6 @@ data class ComposeState( val attachments: List = ArrayList(), val attaching: Boolean = false, val remaining: String = "", - val subscription: SubscriptionInfo? = null, + val subscription: SubscriptionInfoCompat? = null, val canSend: Boolean = false ) \ No newline at end of file diff --git a/presentation/src/main/java/feature/compose/ComposeViewModel.kt b/presentation/src/main/java/feature/compose/ComposeViewModel.kt index 332da0ff..eacf3aa0 100644 --- a/presentation/src/main/java/feature/compose/ComposeViewModel.kt +++ b/presentation/src/main/java/feature/compose/ComposeViewModel.kt @@ -31,6 +31,7 @@ import common.Navigator import common.base.QkViewModel import common.util.ClipboardUtils import common.util.extensions.makeToast +import compat.SubscriptionManagerCompat import filter.ContactFilter import interactor.CancelDelayedMessage import interactor.ContactSync @@ -56,7 +57,7 @@ import model.Message import model.PhoneNumber import repository.ContactRepository import repository.MessageRepository -import util.SubscriptionUtils +import util.ActiveSubscriptionObservable import util.extensions.asObservable import util.extensions.isImage import util.extensions.mapNotNull @@ -80,7 +81,7 @@ class ComposeViewModel @Inject constructor( private val permissionManager: PermissionManager, private val retrySending: RetrySending, private val sendMessage: SendMessage, - private val subUtils: SubscriptionUtils, + private val subscriptionManager: SubscriptionManagerCompat, private val syncContacts: ContactSync ) : QkViewModel(ComposeState(query = intent.extras?.getString("query") ?: "")) { @@ -211,7 +212,8 @@ class ComposeViewModel @Inject constructor( .map { messages -> messages.lastOrNull()?.subId ?: -1 } .distinctUntilChanged() - disposables += Observables.combineLatest(latestSubId, subUtils.subscriptionsObservable) { subId, subs -> + val subscriptions = ActiveSubscriptionObservable(subscriptionManager) + disposables += Observables.combineLatest(latestSubId, subscriptions) { subId, subs -> val sub = if (subs.size > 1) subs.firstOrNull { it.subscriptionId == subId } ?: subs[0] else null newState { copy(subscription = sub) } }.subscribe() @@ -523,7 +525,7 @@ class ComposeViewModel @Inject constructor( // Toggle to the next sim slot view.changeSimIntent .withLatestFrom(state) { _, state -> - val subs = subUtils.subscriptions + val subs = subscriptionManager.activeSubscriptionInfoList val subIndex = subs.indexOfFirst { it.subscriptionId == state.subscription?.subscriptionId } val subscription = when { subIndex == -1 -> null diff --git a/presentation/src/main/java/feature/compose/MessagesAdapter.kt b/presentation/src/main/java/feature/compose/MessagesAdapter.kt index 0a5c40e2..181eb6f5 100644 --- a/presentation/src/main/java/feature/compose/MessagesAdapter.kt +++ b/presentation/src/main/java/feature/compose/MessagesAdapter.kt @@ -48,6 +48,7 @@ import common.util.extensions.setPadding import common.util.extensions.setTint import common.util.extensions.setVisible import common.widget.BubbleImageView.Style.* +import compat.SubscriptionManagerCompat import ezvcard.Ezvcard import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers @@ -64,7 +65,6 @@ import model.Conversation import model.Message import model.Recipient import util.Preferences -import util.SubscriptionUtils import util.extensions.isImage import util.extensions.isVCard import util.extensions.isVideo @@ -78,7 +78,7 @@ class MessagesAdapter @Inject constructor( private val dateFormatter: DateFormatter, private val navigator: Navigator, private val prefs: Preferences, - private val subUtils: SubscriptionUtils + private val subscriptionManager: SubscriptionManagerCompat ) : QkRealmAdapter() { companion object { @@ -123,7 +123,7 @@ class MessagesAdapter @Inject constructor( private val contactCache = ContactCache() private val expanded = HashMap() private val disposables = CompositeDisposable() - private val subs = subUtils.subscriptions + private val subs = subscriptionManager.activeSubscriptionInfoList var theme: Colors.Theme = colors.theme() diff --git a/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt b/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt index bcf16622..3c820729 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyActivity.kt @@ -20,6 +20,7 @@ package feature.qkreply import android.arch.lifecycle.ViewModelProvider import android.arch.lifecycle.ViewModelProviders +import android.os.Build import android.os.Bundle import android.support.v7.widget.LinearLayoutManager import android.view.Menu @@ -34,6 +35,7 @@ import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.base.QkThemedActivity import common.util.extensions.autoScrollToStart +import common.util.extensions.resolveThemeColor import common.util.extensions.setBackgroundTint import common.util.extensions.setTint import common.util.extensions.setVisible @@ -80,6 +82,14 @@ class QkReplyActivity : QkThemedActivity(), QkReplyView { messages.layoutManager = LinearLayoutManager(this).apply { stackFromEnd = true } messages.adapter = adapter + + // These theme attributes don't apply themselves on API 21 + if (Build.VERSION.SDK_INT <= 22) { + toolbar.setBackgroundTint(resolveThemeColor(R.attr.colorPrimary)) + background.setBackgroundTint(resolveThemeColor(R.attr.composeBackground)) + composeBackground.setBackgroundTint(resolveThemeColor(R.attr.composeBackground)) + composeBackgroundGradient.setBackgroundTint(resolveThemeColor(R.attr.composeBackground)) + } } override fun render(state: QkReplyState) { diff --git a/presentation/src/main/java/feature/qkreply/QkReplyState.kt b/presentation/src/main/java/feature/qkreply/QkReplyState.kt index 1f4a8feb..78f10196 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyState.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyState.kt @@ -18,7 +18,7 @@ */ package feature.qkreply -import android.telephony.SubscriptionInfo +import compat.SubscriptionInfoCompat import io.realm.RealmResults import model.Conversation import model.Message @@ -29,6 +29,6 @@ data class QkReplyState( val expanded: Boolean = false, val data: Pair>? = null, val remaining: String = "", - val subscription: SubscriptionInfo? = null, + val subscription: SubscriptionInfoCompat? = null, val canSend: Boolean = false ) \ No newline at end of file diff --git a/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt b/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt index d2fdb4ce..35148b1d 100644 --- a/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt +++ b/presentation/src/main/java/feature/qkreply/QkReplyViewModel.kt @@ -24,6 +24,7 @@ import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.Navigator import common.base.QkViewModel +import compat.SubscriptionManagerCompat import interactor.MarkRead import interactor.SendMessage import io.reactivex.rxkotlin.Observables @@ -36,7 +37,7 @@ import io.realm.RealmResults import model.Conversation import model.Message import repository.MessageRepository -import util.SubscriptionUtils +import util.ActiveSubscriptionObservable import util.extensions.asObservable import util.extensions.mapNotNull import java.util.concurrent.TimeUnit @@ -49,7 +50,7 @@ class QkReplyViewModel @Inject constructor( private val messageRepo: MessageRepository, private val navigator: Navigator, private val sendMessage: SendMessage, - private val subUtils: SubscriptionUtils + private val subscriptionManager: SubscriptionManagerCompat ) : QkViewModel(QkReplyState()) { private val conversation by lazy { @@ -89,7 +90,8 @@ class QkReplyViewModel @Inject constructor( .map { messages -> messages.lastOrNull()?.subId ?: -1 } .distinctUntilChanged() - disposables += Observables.combineLatest(latestSubId, subUtils.subscriptionsObservable) { subId, subs -> + val subscriptions = ActiveSubscriptionObservable(subscriptionManager) + disposables += Observables.combineLatest(latestSubId, subscriptions) { subId, subs -> val sub = if (subs.size > 1) subs.firstOrNull { it.subscriptionId == subId } ?: subs[0] else null newState { copy(subscription = sub) } }.subscribe() @@ -189,7 +191,7 @@ class QkReplyViewModel @Inject constructor( // Toggle to the next sim slot view.changeSimIntent .withLatestFrom(state) { _, state -> - val subs = subUtils.subscriptions + val subs = subscriptionManager.activeSubscriptionInfoList val subIndex = subs.indexOfFirst { it.subscriptionId == state.subscription?.subscriptionId } val subscription = when { subIndex == -1 -> null diff --git a/presentation/src/main/java/injection/AppModule.kt b/presentation/src/main/java/injection/AppModule.kt index 4ac2bcca..1efb8016 100644 --- a/presentation/src/main/java/injection/AppModule.kt +++ b/presentation/src/main/java/injection/AppModule.kt @@ -59,8 +59,6 @@ import repository.MessageRepository import repository.MessageRepositoryImpl import repository.SyncRepository import repository.SyncRepositoryImpl -import util.SubscriptionUtils -import util.SubscriptionUtilsImpl import javax.inject.Singleton @Module @@ -139,10 +137,4 @@ class AppModule(private var application: Application) { @Provides fun provideSyncRepository(repository: SyncRepositoryImpl): SyncRepository = repository - - // Utils - - @Provides - fun provideSubscriptionUtils(utils: SubscriptionUtilsImpl): SubscriptionUtils = utils - } \ No newline at end of file