Loading data/src/main/java/com/moez/QKSMS/manager/PermissionManagerImpl.kt +7 −1 Original line number Original line Diff line number Diff line Loading @@ -19,8 +19,10 @@ package com.moez.QKSMS.manager package com.moez.QKSMS.manager import android.Manifest import android.Manifest import android.app.role.RoleManager import android.content.Context import android.content.Context import android.content.pm.PackageManager.PERMISSION_GRANTED import android.content.pm.PackageManager.PERMISSION_GRANTED import android.os.Build import android.provider.Telephony import android.provider.Telephony import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat import javax.inject.Inject import javax.inject.Inject Loading @@ -28,7 +30,11 @@ import javax.inject.Inject class PermissionManagerImpl @Inject constructor(private val context: Context) : PermissionManager { class PermissionManagerImpl @Inject constructor(private val context: Context) : PermissionManager { override fun isDefaultSms(): Boolean { override fun isDefaultSms(): Boolean { return Telephony.Sms.getDefaultSmsPackage(context) == context.packageName return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { context.getSystemService(RoleManager::class.java)?.isRoleHeld(RoleManager.ROLE_SMS) == true } else { Telephony.Sms.getDefaultSmsPackage(context) == context.packageName } } } override fun hasReadSms(): Boolean { override fun hasReadSms(): Boolean { Loading presentation/src/main/java/com/moez/QKSMS/common/Navigator.kt +13 −4 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,8 @@ */ */ package com.moez.QKSMS.common package com.moez.QKSMS.common import android.app.Activity import android.app.role.RoleManager import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException import android.content.Context import android.content.Context import android.content.Intent import android.content.Intent Loading Loading @@ -78,12 +80,19 @@ class Navigator @Inject constructor( startActivity(intent) startActivity(intent) } } fun showDefaultSmsDialog() { /** * This won't work unless we use startActivityForResult */ fun showDefaultSmsDialog(context: Activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val roleManager = context.getSystemService(RoleManager::class.java) as RoleManager val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS) context.startActivityForResult(intent, 42389) } else { val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT) val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT) if (Telephony.Sms.getDefaultSmsPackage(context) != context.packageName) { intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.packageName) intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.packageName) context.startActivity(intent) } } startActivity(intent) } } fun showCompose(body: String? = null, images: List<Uri>? = null) { fun showCompose(body: String? = null, images: List<Uri>? = null) { Loading presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeActivity.kt +6 −0 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,7 @@ import com.google.android.material.snackbar.Snackbar import com.jakewharton.rxbinding2.view.clicks import com.jakewharton.rxbinding2.view.clicks import com.jakewharton.rxbinding2.widget.textChanges import com.jakewharton.rxbinding2.widget.textChanges import com.moez.QKSMS.R import com.moez.QKSMS.R import com.moez.QKSMS.common.Navigator import com.moez.QKSMS.common.base.QkThemedActivity import com.moez.QKSMS.common.base.QkThemedActivity import com.moez.QKSMS.common.util.DateFormatter import com.moez.QKSMS.common.util.DateFormatter import com.moez.QKSMS.common.util.extensions.autoScrollToStart import com.moez.QKSMS.common.util.extensions.autoScrollToStart Loading Loading @@ -78,6 +79,7 @@ class ComposeActivity : QkThemedActivity(), ComposeView { @Inject lateinit var contactsAdapter: ContactAdapter @Inject lateinit var contactsAdapter: ContactAdapter @Inject lateinit var dateFormatter: DateFormatter @Inject lateinit var dateFormatter: DateFormatter @Inject lateinit var messageAdapter: MessagesAdapter @Inject lateinit var messageAdapter: MessagesAdapter @Inject lateinit var navigator: Navigator @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject lateinit var viewModelFactory: ViewModelProvider.Factory override val activityVisibleIntent: Subject<Boolean> = PublishSubject.create() override val activityVisibleIntent: Subject<Boolean> = PublishSubject.create() Loading Loading @@ -250,6 +252,10 @@ class ComposeActivity : QkThemedActivity(), ComposeView { .show() .show() } } override fun requestDefaultSms() { navigator.showDefaultSmsDialog(this) } override fun requestStoragePermission() { override fun requestStoragePermission() { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 0) ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 0) } } Loading presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeView.kt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,7 @@ interface ComposeView : QkView<ComposeState> { fun clearSelection() fun clearSelection() fun showDetails(details: String) fun showDetails(details: String) fun requestDefaultSms() fun requestStoragePermission() fun requestStoragePermission() fun requestSmsPermission() fun requestSmsPermission() fun requestCamera() fun requestCamera() Loading presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeViewModel.kt +2 −2 Original line number Original line Diff line number Diff line Loading @@ -357,7 +357,7 @@ class ComposeViewModel @Inject constructor( // Delete the messages // Delete the messages view.optionsItemIntent view.optionsItemIntent .filter { it == R.id.delete } .filter { it == R.id.delete } .filter { permissionManager.isDefaultSms().also { if (!it) navigator.showDefaultSmsDialog() } } .filter { permissionManager.isDefaultSms().also { if (!it) view.requestDefaultSms() } } .withLatestFrom(view.messagesSelectedIntent, conversation) { _, messages, conversation -> .withLatestFrom(view.messagesSelectedIntent, conversation) { _, messages, conversation -> deleteMessages.execute(DeleteMessages.Params(messages, conversation.id)) deleteMessages.execute(DeleteMessages.Params(messages, conversation.id)) } } Loading Loading @@ -631,7 +631,7 @@ class ComposeViewModel @Inject constructor( // Send a message when the send button is clicked, and disable editing mode if it's enabled // Send a message when the send button is clicked, and disable editing mode if it's enabled view.sendIntent view.sendIntent .filter { permissionManager.isDefaultSms().also { if (!it) navigator.showDefaultSmsDialog() } } .filter { permissionManager.isDefaultSms().also { if (!it) view.requestDefaultSms() } } .filter { permissionManager.hasSendSms().also { if (!it) view.requestSmsPermission() } } .filter { permissionManager.hasSendSms().also { if (!it) view.requestSmsPermission() } } .withLatestFrom(view.textChangedIntent) { _, body -> body } .withLatestFrom(view.textChangedIntent) { _, body -> body } .map { body -> body.toString() } .map { body -> body.toString() } Loading Loading
data/src/main/java/com/moez/QKSMS/manager/PermissionManagerImpl.kt +7 −1 Original line number Original line Diff line number Diff line Loading @@ -19,8 +19,10 @@ package com.moez.QKSMS.manager package com.moez.QKSMS.manager import android.Manifest import android.Manifest import android.app.role.RoleManager import android.content.Context import android.content.Context import android.content.pm.PackageManager.PERMISSION_GRANTED import android.content.pm.PackageManager.PERMISSION_GRANTED import android.os.Build import android.provider.Telephony import android.provider.Telephony import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat import javax.inject.Inject import javax.inject.Inject Loading @@ -28,7 +30,11 @@ import javax.inject.Inject class PermissionManagerImpl @Inject constructor(private val context: Context) : PermissionManager { class PermissionManagerImpl @Inject constructor(private val context: Context) : PermissionManager { override fun isDefaultSms(): Boolean { override fun isDefaultSms(): Boolean { return Telephony.Sms.getDefaultSmsPackage(context) == context.packageName return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { context.getSystemService(RoleManager::class.java)?.isRoleHeld(RoleManager.ROLE_SMS) == true } else { Telephony.Sms.getDefaultSmsPackage(context) == context.packageName } } } override fun hasReadSms(): Boolean { override fun hasReadSms(): Boolean { Loading
presentation/src/main/java/com/moez/QKSMS/common/Navigator.kt +13 −4 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,8 @@ */ */ package com.moez.QKSMS.common package com.moez.QKSMS.common import android.app.Activity import android.app.role.RoleManager import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException import android.content.Context import android.content.Context import android.content.Intent import android.content.Intent Loading Loading @@ -78,12 +80,19 @@ class Navigator @Inject constructor( startActivity(intent) startActivity(intent) } } fun showDefaultSmsDialog() { /** * This won't work unless we use startActivityForResult */ fun showDefaultSmsDialog(context: Activity) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { val roleManager = context.getSystemService(RoleManager::class.java) as RoleManager val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_SMS) context.startActivityForResult(intent, 42389) } else { val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT) val intent = Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT) if (Telephony.Sms.getDefaultSmsPackage(context) != context.packageName) { intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.packageName) intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, context.packageName) context.startActivity(intent) } } startActivity(intent) } } fun showCompose(body: String? = null, images: List<Uri>? = null) { fun showCompose(body: String? = null, images: List<Uri>? = null) { Loading
presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeActivity.kt +6 −0 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,7 @@ import com.google.android.material.snackbar.Snackbar import com.jakewharton.rxbinding2.view.clicks import com.jakewharton.rxbinding2.view.clicks import com.jakewharton.rxbinding2.widget.textChanges import com.jakewharton.rxbinding2.widget.textChanges import com.moez.QKSMS.R import com.moez.QKSMS.R import com.moez.QKSMS.common.Navigator import com.moez.QKSMS.common.base.QkThemedActivity import com.moez.QKSMS.common.base.QkThemedActivity import com.moez.QKSMS.common.util.DateFormatter import com.moez.QKSMS.common.util.DateFormatter import com.moez.QKSMS.common.util.extensions.autoScrollToStart import com.moez.QKSMS.common.util.extensions.autoScrollToStart Loading Loading @@ -78,6 +79,7 @@ class ComposeActivity : QkThemedActivity(), ComposeView { @Inject lateinit var contactsAdapter: ContactAdapter @Inject lateinit var contactsAdapter: ContactAdapter @Inject lateinit var dateFormatter: DateFormatter @Inject lateinit var dateFormatter: DateFormatter @Inject lateinit var messageAdapter: MessagesAdapter @Inject lateinit var messageAdapter: MessagesAdapter @Inject lateinit var navigator: Navigator @Inject lateinit var viewModelFactory: ViewModelProvider.Factory @Inject lateinit var viewModelFactory: ViewModelProvider.Factory override val activityVisibleIntent: Subject<Boolean> = PublishSubject.create() override val activityVisibleIntent: Subject<Boolean> = PublishSubject.create() Loading Loading @@ -250,6 +252,10 @@ class ComposeActivity : QkThemedActivity(), ComposeView { .show() .show() } } override fun requestDefaultSms() { navigator.showDefaultSmsDialog(this) } override fun requestStoragePermission() { override fun requestStoragePermission() { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 0) ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 0) } } Loading
presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeView.kt +1 −0 Original line number Original line Diff line number Diff line Loading @@ -61,6 +61,7 @@ interface ComposeView : QkView<ComposeState> { fun clearSelection() fun clearSelection() fun showDetails(details: String) fun showDetails(details: String) fun requestDefaultSms() fun requestStoragePermission() fun requestStoragePermission() fun requestSmsPermission() fun requestSmsPermission() fun requestCamera() fun requestCamera() Loading
presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeViewModel.kt +2 −2 Original line number Original line Diff line number Diff line Loading @@ -357,7 +357,7 @@ class ComposeViewModel @Inject constructor( // Delete the messages // Delete the messages view.optionsItemIntent view.optionsItemIntent .filter { it == R.id.delete } .filter { it == R.id.delete } .filter { permissionManager.isDefaultSms().also { if (!it) navigator.showDefaultSmsDialog() } } .filter { permissionManager.isDefaultSms().also { if (!it) view.requestDefaultSms() } } .withLatestFrom(view.messagesSelectedIntent, conversation) { _, messages, conversation -> .withLatestFrom(view.messagesSelectedIntent, conversation) { _, messages, conversation -> deleteMessages.execute(DeleteMessages.Params(messages, conversation.id)) deleteMessages.execute(DeleteMessages.Params(messages, conversation.id)) } } Loading Loading @@ -631,7 +631,7 @@ class ComposeViewModel @Inject constructor( // Send a message when the send button is clicked, and disable editing mode if it's enabled // Send a message when the send button is clicked, and disable editing mode if it's enabled view.sendIntent view.sendIntent .filter { permissionManager.isDefaultSms().also { if (!it) navigator.showDefaultSmsDialog() } } .filter { permissionManager.isDefaultSms().also { if (!it) view.requestDefaultSms() } } .filter { permissionManager.hasSendSms().also { if (!it) view.requestSmsPermission() } } .filter { permissionManager.hasSendSms().also { if (!it) view.requestSmsPermission() } } .withLatestFrom(view.textChangedIntent) { _, body -> body } .withLatestFrom(view.textChangedIntent) { _, body -> body } .map { body -> body.toString() } .map { body -> body.toString() } Loading