From 6385a5707020e6fd64e8d47c8e73dbd7cfd48073 Mon Sep 17 00:00:00 2001 From: Moez Bhatti Date: Thu, 7 Jun 2018 14:23:07 -0400 Subject: [PATCH] Fix crash when phone permission not granted --- .../java/manager/PermissionManagerImpl.kt | 2 + .../java/util/ActiveSubscriptionObservable.kt | 59 ------------------- .../main/java/util/SubscriptionUtilsImpl.kt | 52 +++++++++++++++- .../main/java/manager/PermissionManager.kt | 2 + 4 files changed, 53 insertions(+), 62 deletions(-) delete mode 100644 data/src/main/java/util/ActiveSubscriptionObservable.kt diff --git a/data/src/main/java/manager/PermissionManagerImpl.kt b/data/src/main/java/manager/PermissionManagerImpl.kt index c4d6c066..8b7dc578 100644 --- a/data/src/main/java/manager/PermissionManagerImpl.kt +++ b/data/src/main/java/manager/PermissionManagerImpl.kt @@ -39,6 +39,8 @@ class PermissionManagerImpl @Inject constructor(private val context: Context) : override fun hasContacts(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PERMISSION_GRANTED + override fun hasPhone(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PERMISSION_GRANTED + override fun hasStorage(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PERMISSION_GRANTED } \ No newline at end of file diff --git a/data/src/main/java/util/ActiveSubscriptionObservable.kt b/data/src/main/java/util/ActiveSubscriptionObservable.kt deleted file mode 100644 index 9f2792c3..00000000 --- a/data/src/main/java/util/ActiveSubscriptionObservable.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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 util - -import android.telephony.SubscriptionInfo -import android.telephony.SubscriptionManager -import io.reactivex.Observable -import io.reactivex.Observer -import io.reactivex.disposables.Disposable - -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/data/src/main/java/util/SubscriptionUtilsImpl.kt b/data/src/main/java/util/SubscriptionUtilsImpl.kt index 4356272a..9fa5c2a3 100644 --- a/data/src/main/java/util/SubscriptionUtilsImpl.kt +++ b/data/src/main/java/util/SubscriptionUtilsImpl.kt @@ -5,14 +5,24 @@ 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) : SubscriptionUtils { +class SubscriptionUtilsImpl @Inject constructor( + context: Context, + private val permissions: PermissionManager +) : SubscriptionUtils { - private val subscriptionManager = SubscriptionManager.from(context) + /** + * 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() + get() = subscriptionManager?.activeSubscriptionInfoList ?: listOf() override val subscriptionsObservable: Observable> = ActiveSubscriptionObservable(subscriptionManager) @@ -20,4 +30,40 @@ class SubscriptionUtilsImpl @Inject constructor(context: Context) : Subscription 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/src/main/java/manager/PermissionManager.kt b/domain/src/main/java/manager/PermissionManager.kt index c0716299..b1a98aca 100644 --- a/domain/src/main/java/manager/PermissionManager.kt +++ b/domain/src/main/java/manager/PermissionManager.kt @@ -28,6 +28,8 @@ interface PermissionManager { fun hasContacts(): Boolean + fun hasPhone(): Boolean + fun hasStorage(): Boolean } \ No newline at end of file