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

Commit d1d99f52 authored by moezbhatti's avatar moezbhatti
Browse files

Support for Q Roles

Closes #1409
parent 24e185ee
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -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
@@ -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 {
+13 −4
Original line number Original line Diff line number Diff line
@@ -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
@@ -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) {
+6 −0
Original line number Original line Diff line number Diff line
@@ -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
@@ -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()
@@ -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)
    }
    }
+1 −0
Original line number Original line Diff line number Diff line
@@ -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()
+2 −2
Original line number Original line Diff line number Diff line
@@ -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))
                }
                }
@@ -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