Skip to content

Commit

Permalink
Merge pull request #455 from Chooloo/fix/ussd
Browse files Browse the repository at this point in the history
Added Mmi and secret codes options to dialer #164
  • Loading branch information
roeiedri authored Jun 4, 2022
2 parents eda1538 + 84f5289 commit ea9b321
Show file tree
Hide file tree
Showing 15 changed files with 135 additions and 87 deletions.
2 changes: 2 additions & 0 deletions chooloolib/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.chooloo.www.chooloolib">

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ package com.chooloo.www.chooloolib.di.module
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentManager
import com.chooloo.www.chooloolib.interactor.call.CallNavigationsInteractor
import com.chooloo.www.chooloolib.interactor.call.CallNavigationsInteractorImpl
import com.chooloo.www.chooloolib.interactor.dialog.DialogsInteractor
import com.chooloo.www.chooloolib.interactor.dialog.DialogsInteractorImpl
import com.chooloo.www.chooloolib.interactor.prompt.PromptsInteractor
Expand Down Expand Up @@ -41,8 +39,5 @@ class ActivityModule {

@Binds
fun bindPromptsInteractor(promptsInteractorImpl: PromptsInteractorImpl): PromptsInteractor

@Binds
fun bindCallNavigationsInteractor(callNavigationsInteractorImpl: CallNavigationsInteractorImpl): CallNavigationsInteractor
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.os.PowerManager
import android.os.Vibrator
import android.telecom.TelecomManager
import android.telephony.SubscriptionManager
import android.telephony.TelephonyManager
import android.view.inputmethod.InputMethodManager
import androidx.core.app.NotificationManagerCompat
import com.chooloo.www.chooloolib.di.factory.contentresolver.ContentResolverFactory
Expand Down Expand Up @@ -50,6 +51,8 @@ import com.chooloo.www.chooloolib.interactor.sim.SimsInteractor
import com.chooloo.www.chooloolib.interactor.sim.SimsInteractorImpl
import com.chooloo.www.chooloolib.interactor.string.StringsInteractor
import com.chooloo.www.chooloolib.interactor.string.StringsInteractorImpl
import com.chooloo.www.chooloolib.interactor.telecom.TelecomInteractor
import com.chooloo.www.chooloolib.interactor.telecom.TelecomInteractorImpl
import com.chooloo.www.chooloolib.repository.calls.CallsRepository
import com.chooloo.www.chooloolib.repository.calls.CallsRepositoryImpl
import com.chooloo.www.chooloolib.repository.contacts.ContactsRepository
Expand Down Expand Up @@ -97,6 +100,10 @@ class ApplicationModule {
fun provideKeyguardManager(@ApplicationContext context: Context): KeyguardManager =
context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager

@Provides
fun provideTelephonyManager(@ApplicationContext context: Context): TelephonyManager =
context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

@Provides
fun provideClipboardManager(@ApplicationContext context: Context): ClipboardManager =
context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
Expand Down Expand Up @@ -177,6 +184,9 @@ class ApplicationModule {
@Binds
fun bindBlockedInteractor(blockedInteractorImpl: BlockedInteractorImpl): BlockedInteractor

@Binds
fun bindTelecomInteractor(telecomInteractorImpl: TelecomInteractorImpl): TelecomInteractor

@Binds
fun bindRecentsInteractor(recentsInteractorImpl: RecentsInteractorImpl): RecentsInteractor

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.chooloo.www.chooloolib.interactor.telecom

import com.chooloo.www.chooloolib.interactor.base.BaseInteractor
import com.chooloo.www.chooloolib.model.SimAccount

interface TelecomInteractor : BaseInteractor<TelecomInteractor.Listener> {
interface Listener {}

fun handleMmi(code: String): Boolean
fun handleSecretCode(code: String): Boolean
fun handleSpecialChars(code: String): Boolean
fun callVoicemail()
fun callNumber(number: String, simAccount: SimAccount? = null)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.chooloo.www.chooloolib.interactor.telecom

import android.Manifest
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.VoicemailContract
import android.telecom.PhoneAccount
import android.telecom.TelecomManager
import android.telephony.TelephonyManager
import androidx.annotation.RequiresPermission
import com.chooloo.www.chooloolib.model.SimAccount
import com.chooloo.www.chooloolib.util.CallUtils
import com.chooloo.www.chooloolib.util.PhoneNumberUtils
import com.chooloo.www.chooloolib.util.baseobservable.BaseObservable
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class TelecomInteractorImpl @Inject constructor(
private val telecomManager: TelecomManager,
private val telephonyManager: TelephonyManager,
@ApplicationContext private val context: Context
) : BaseObservable<TelecomInteractor.Listener>(), TelecomInteractor {
private val SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE"

override fun handleMmi(code: String) = telecomManager.handleMmi(code)

override fun handleSecretCode(code: String): Boolean {
if (!PhoneNumberUtils.isSecretCode(code)) {
return false;
}

val secretCode: String = code.substring(4, code.length - 4)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
telephonyManager.sendDialerSpecialCode(secretCode)
} else {
// System service call is not supported pre-O, so must use a broadcast for N-.
val intent = Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://$secretCode"))
context.sendBroadcast(intent)
}
return true;
}

override fun handleSpecialChars(code: String) = handleMmi(code) || handleSecretCode(code)

@RequiresPermission(Manifest.permission.CALL_PHONE)
override fun callVoicemail() {
telecomManager.placeCall(Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null), Bundle())
}

@RequiresPermission(allOf = [Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE])
override fun callNumber(number: String, simAccount: SimAccount?) {
val extras = Bundle()
simAccount?.phoneAccountHandle?.let {
extras.putParcelable(VoicemailContract.EXTRA_PHONE_ACCOUNT_HANDLE, it)
}
telecomManager.placeCall(CallUtils.getCallURI(number), extras)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.os.Bundle
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import com.chooloo.www.chooloolib.adapter.AccountsAdapter
import com.chooloo.www.chooloolib.interactor.call.CallNavigationsInteractor
import com.chooloo.www.chooloolib.interactor.telecom.TelecomInteractor
import com.chooloo.www.chooloolib.model.RawContactAccount
import com.chooloo.www.chooloolib.ui.briefcontact.BriefContactFragment.Companion.ARG_CONTACT_ID
import com.chooloo.www.chooloolib.ui.list.ListFragment
Expand All @@ -18,14 +18,14 @@ class AccountsFragment @Inject constructor() :
override val viewState: AccountsViewState by activityViewModels()

@Inject override lateinit var adapter: AccountsAdapter
@Inject lateinit var callNavigations: CallNavigationsInteractor
@Inject lateinit var telecomInteractor: TelecomInteractor


override fun onSetup() {
viewState.onContactId(args.getLong(ARG_CONTACT_ID))
super.onSetup()
viewState.callEvent.observe(this@AccountsFragment) {
it.ifNew?.let(callNavigations::call)
it.ifNew?.let(telecomInteractor::callNumber)
}
binding.itemsScrollView.fastScroller.isVisible = false
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import androidx.fragment.app.viewModels
import com.chooloo.www.chooloolib.R
import com.chooloo.www.chooloolib.databinding.BriefContactBinding
import com.chooloo.www.chooloolib.di.factory.fragment.FragmentFactory
import com.chooloo.www.chooloolib.interactor.call.CallNavigationsInteractor
import com.chooloo.www.chooloolib.interactor.dialog.DialogsInteractor
import com.chooloo.www.chooloolib.interactor.permission.PermissionsInteractor
import com.chooloo.www.chooloolib.interactor.prompt.PromptsInteractor
import com.chooloo.www.chooloolib.interactor.telecom.TelecomInteractor
import com.chooloo.www.chooloolib.ui.accounts.AccountsViewState
import com.chooloo.www.chooloolib.ui.base.BaseFragment
import com.chooloo.www.chooloolib.ui.phones.PhonesViewState
Expand All @@ -32,7 +32,7 @@ open class BriefContactFragment @Inject constructor() : BaseFragment<BriefContac
@Inject lateinit var dialogs: DialogsInteractor
@Inject lateinit var fragmentFactory: FragmentFactory
@Inject lateinit var permissions: PermissionsInteractor
@Inject lateinit var callNavigations: CallNavigationsInteractor
@Inject lateinit var telecomInteractor: TelecomInteractor


override fun onSetup() {
Expand Down Expand Up @@ -83,7 +83,7 @@ open class BriefContactFragment @Inject constructor() : BaseFragment<BriefContac
}

callEvent.observe(this@BriefContactFragment) {
it.ifNew?.let(callNavigations::call)
it.ifNew?.let(telecomInteractor::callNumber)
}

confirmContactDeleteEvent.observe(this@BriefContactFragment) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import com.chooloo.www.chooloolib.di.factory.fragment.FragmentFactory
import com.chooloo.www.chooloolib.interactor.call.CallNavigationsInteractor
import com.chooloo.www.chooloolib.interactor.telecom.TelecomInteractor
import com.chooloo.www.chooloolib.ui.contacts.ContactsSuggestionsViewState
import com.chooloo.www.chooloolib.ui.dialpad.DialpadFragment
import dagger.hilt.android.AndroidEntryPoint
Expand All @@ -21,8 +21,8 @@ class DialerFragment @Inject constructor() : DialpadFragment() {
private val suggestionsViewState: ContactsSuggestionsViewState by activityViewModels()
private val _suggestionsFragment by lazy { fragmentFactory.getContactsSuggestionsFragment() }

@Inject lateinit var callNavigations: CallNavigationsInteractor
@Inject lateinit var fragmentFactory: FragmentFactory
@Inject lateinit var telecomInteractor: TelecomInteractor


override fun onSetup() {
Expand Down Expand Up @@ -61,6 +61,7 @@ class DialerFragment @Inject constructor() : DialpadFragment() {
viewState.apply {
text.observe(this@DialerFragment) {
suggestionsViewState.onFilterChanged(it)
telecomInteractor.handleSpecialChars(it)
}

isSuggestionsVisible.observe(this@DialerFragment) {
Expand Down Expand Up @@ -100,11 +101,11 @@ class DialerFragment @Inject constructor() : DialpadFragment() {
}

callNumberEvent.observe(this@DialerFragment) {
it.ifNew?.let(callNavigations::call)
it.ifNew?.let(telecomInteractor::callNumber)
}

callVoicemailEvent.observe(this@DialerFragment) {
it.ifNew?.let { callNavigations.callVoicemail() }
it.ifNew?.let { telecomInteractor.callVoicemail() }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.os.Bundle
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import com.chooloo.www.chooloolib.adapter.PhonesAdapter
import com.chooloo.www.chooloolib.interactor.call.CallNavigationsInteractor
import com.chooloo.www.chooloolib.interactor.telecom.TelecomInteractor
import com.chooloo.www.chooloolib.model.PhoneAccount
import com.chooloo.www.chooloolib.ui.briefcontact.BriefContactFragment.Companion.ARG_CONTACT_ID
import com.chooloo.www.chooloolib.ui.list.ListFragment
Expand All @@ -15,15 +15,14 @@ import javax.inject.Inject
class PhonesFragment @Inject constructor() : ListFragment<PhoneAccount, PhonesViewState>() {
override val viewState: PhonesViewState by activityViewModels()

@Inject lateinit var callNavigations: CallNavigationsInteractor
@Inject override lateinit var adapter: PhonesAdapter

@Inject lateinit var telecomInteractor: TelecomInteractor

override fun onSetup() {
viewState.onContactId(args.getLong(ARG_CONTACT_ID))
super.onSetup()
viewState.callEvent.observe(this@PhonesFragment) {
it.ifNew?.let(callNavigations::call)
it.ifNew?.let(telecomInteractor::callNumber)
}
binding.itemsScrollView.fastScroller.isVisible = false
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import androidx.fragment.app.viewModels
import com.chooloo.www.chooloolib.R
import com.chooloo.www.chooloolib.databinding.RecentBinding
import com.chooloo.www.chooloolib.di.factory.fragment.FragmentFactory
import com.chooloo.www.chooloolib.interactor.call.CallNavigationsInteractor
import com.chooloo.www.chooloolib.interactor.dialog.DialogsInteractor
import com.chooloo.www.chooloolib.interactor.prompt.PromptsInteractor
import com.chooloo.www.chooloolib.interactor.telecom.TelecomInteractor
import com.chooloo.www.chooloolib.ui.base.BaseFragment
import com.chooloo.www.chooloolib.ui.recents.RecentsViewState
import dagger.hilt.android.AndroidEntryPoint
Expand All @@ -25,7 +25,7 @@ class RecentFragment @Inject constructor() : BaseFragment<RecentViewState>() {
@Inject lateinit var prompts: PromptsInteractor
@Inject lateinit var dialogs: DialogsInteractor
@Inject lateinit var fragmentFactory: FragmentFactory
@Inject lateinit var callNavigations: CallNavigationsInteractor
@Inject lateinit var telecomInteractor: TelecomInteractor


override fun onSetup() {
Expand Down Expand Up @@ -101,7 +101,7 @@ class RecentFragment @Inject constructor() : BaseFragment<RecentViewState>() {


callEvent.observe(this@RecentFragment) { ev ->
ev.ifNew?.let(callNavigations::call)
ev.ifNew?.let(telecomInteractor::callNumber)
}

showContactEvent.observe(this@RecentFragment) { ev ->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.chooloo.www.chooloolib.util

import android.net.Uri
import android.telecom.PhoneAccount

object CallUtils {
fun getCallURI(number: String) = if (PhoneNumberUtils.isUri(number)) {
Uri.fromParts(PhoneAccount.SCHEME_SIP, number, null);
} else {
Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.chooloo.www.chooloolib.util


object PhoneNumberUtils {
fun isMmi(number: String) =
(number.startsWith("**04") || number.startsWith("**05")) && number.endsWith("#")

fun isUri(number: String?) =
number != null && (number.contains("@") || number.contains("%40"))

fun isSecretCode(number: String) =
number.length > 8 && number.startsWith("*#*#") && number.endsWith("#*#*")
}
Loading

0 comments on commit ea9b321

Please sign in to comment.