Skip to content

Commit

Permalink
Fixed mute button
Browse files Browse the repository at this point in the history
  • Loading branch information
roeiedri committed Mar 28, 2021
1 parent f8d4cab commit a538052
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 21 deletions.
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="audioid.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package com.chooloo.www.koler.ui.call
import android.net.Uri
import android.os.Bundle
import com.chooloo.www.koler.R
import com.chooloo.www.koler.data.CallDetails
import com.chooloo.www.koler.databinding.ActivityCallBinding
import com.chooloo.www.koler.ui.base.BaseActivity
import com.chooloo.www.koler.ui.callactions.CallActionsFragment
import com.chooloo.www.koler.util.*
import com.chooloo.www.koler.data.CallDetails
import com.chooloo.www.koler.util.audio.AudioManager
import com.chooloo.www.koler.util.audio.AudioManager.AudioMode.MODE_IN_CALL
import com.chooloo.www.koler.util.call.CallManager

class CallActivity : BaseActivity(), CallContract.View {
Expand Down Expand Up @@ -63,6 +65,7 @@ class CallActivity : BaseActivity(), CallContract.View {
disableKeyboard()
setShowWhenLocked()
CallManager.registerListener(_callListener)
// AudioManager(this).audioMode = MODE_IN_CALL
}

override fun onDestroy() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
package com.chooloo.www.koler.ui.callactions

import android.media.AudioManager
import android.media.AudioManager.MODE_IN_CALL
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import com.chooloo.www.koler.databinding.FragmentCallActionsBinding
import com.chooloo.www.koler.ui.base.BaseFragment
import com.chooloo.www.koler.ui.base.BottomFragment
import com.chooloo.www.koler.ui.dialpad.DialpadFragment
import com.chooloo.www.koler.util.audio.AudioManager
import com.chooloo.www.koler.util.audio.AudioManager.AudioMode.MODE_IN_CALL

class CallActionsFragment : BaseFragment(), CallActionsContract.View {
private val _audioManager by lazy { AudioManager(_activity.applicationContext) }
private val _presenter by lazy { CallActionsPresenter<CallActionsContract.View>() }
private val _binding by lazy { FragmentCallActionsBinding.inflate(layoutInflater) }
private val _bottomDialpadFragment by lazy { BottomFragment(DialpadFragment.newInstance(false)) }
private val _audioManager by lazy { _activity.getSystemService(AppCompatActivity.AUDIO_SERVICE) as AudioManager }

companion object {
fun newInstance() = CallActionsFragment()
Expand All @@ -28,10 +27,9 @@ class CallActionsFragment : BaseFragment(), CallActionsContract.View {
) = _binding.root

override fun onSetup() {
_audioManager.audioMode = MODE_IN_CALL
_presenter.attach(this)

_audioManager.mode = MODE_IN_CALL

_binding.apply {
callActionHold.setOnClickListener { _presenter.onHoldClick() }
callActionAddCall.setOnClickListener { _presenter.onAddCallClick() }
Expand Down Expand Up @@ -61,10 +59,10 @@ class CallActionsFragment : BaseFragment(), CallActionsContract.View {
}

override fun toggleSpeaker(isSpeaker: Boolean) {
_audioManager.isSpeakerphoneOn = isSpeaker
_audioManager.isSpeakerOn = isSpeaker
}

override fun toggleMute(isMute: Boolean) {
_audioManager.isMicrophoneMute = isMute
_audioManager.isMuted = isMute
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ class CallActionsPresenter<V : CallActionsContract.View> :
}

override fun onHoldClick() {
_isHolding = !_isHolding.also { CallManager.hold(!it) }
_isHolding = !_isHolding
CallManager.hold(_isHolding)
}

override fun onMuteClick() {
_isMuted = !_isMuted.also { mvpView?.toggleMute(!it) }
_isMuted = !_isMuted
mvpView?.toggleMute(_isMuted)
}

override fun onRecordClick() {
Expand All @@ -38,7 +40,8 @@ class CallActionsPresenter<V : CallActionsContract.View> :
}

override fun onSpeakerClick() {
_isSpeaker = !_isSpeaker.also { mvpView?.toggleSpeaker(!it) }
_isSpeaker = !_isSpeaker
mvpView?.toggleSpeaker(_isSpeaker)
}

override fun onKeypadKey(keyCode: Int, event: KeyEvent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class CallNotification(private val context: Context) {
companion object {
const val ID = 420
const val CHANNEL_ID = "call_notification_channel"
const val PRIORITY = NotificationCompat.PRIORITY_MAX
const val PRIORITY = NotificationCompat.PRIORITY_HIGH
}

private val sAnswer by lazy { context.getString(R.string.action_answer) }
Expand Down Expand Up @@ -113,6 +113,7 @@ class CallNotification(private val context: Context) {
.setColor(context.getAttrColor(R.attr.colorSecondary))
.setOngoing(true)
.setColorized(true)
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
.setContentTitle(callDetails.contact.name ?: callDetails.contact.number)
if (callDetails.callState == RINGING) {
builder.addAction(R.drawable.ic_call_black_24dp, sAnswer, _answerPendingIntent)
Expand Down
40 changes: 40 additions & 0 deletions app/src/main/java/com/chooloo/www/koler/util/audio/AudioManager.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.chooloo.www.koler.util.audio

import android.content.Context
import android.content.Context.AUDIO_SERVICE
import android.media.AudioManager

class AudioManager(private val context: Context) {
private val _audioManager by lazy { context.getSystemService(AUDIO_SERVICE) as AudioManager }

enum class AudioMode(val mode: Int) {
MODE_NORMAL(AudioManager.MODE_NORMAL),
MODE_IN_CALL(AudioManager.MODE_IN_CALL),
MODE_CURRENT(AudioManager.MODE_CURRENT),
MODE_RINGTONE(AudioManager.MODE_RINGTONE),
MODE_IN_COMMUNICATION(AudioManager.MODE_IN_COMMUNICATION)
}

val isPhoneSilent: Boolean
get() = _audioManager.ringerMode == AudioManager.RINGER_MODE_SILENT ||
_audioManager.ringerMode == AudioManager.RINGER_MODE_VIBRATE

var audioMode: AudioMode
get() = AudioMode.values().associateBy(AudioMode::mode)
.getOrDefault(_audioManager.mode, AudioMode.MODE_NORMAL)
set(value) {
_audioManager.mode = value.mode
}

var isSpeakerOn: Boolean
get() = _audioManager.isSpeakerphoneOn
set(value) {
_audioManager.isSpeakerphoneOn = value
}

var isMuted: Boolean
get() = _audioManager.isMicrophoneMute
set(value) {
_audioManager.isMicrophoneMute = value
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
package com.chooloo.www.koler.util

import android.content.Context
import android.media.AudioManager
import android.media.AudioManager.STREAM_DTMF
import android.media.ToneGenerator
import android.os.Build
import android.os.VibrationEffect
import android.os.Vibrator
import android.view.KeyEvent
import com.chooloo.www.koler.util.audio.AudioManager
import java.util.*

// Stream type used to play the DTMF tones off call, and mapped to the volume control keys
const val DIAL_TONE_STREAM_TYPE = AudioManager.STREAM_DTMF
const val DIAL_TONE_STREAM_TYPE = STREAM_DTMF
const val TONE_RELATIVE_VOLUME = 80 // The DTMF tone volume relative to other sounds in the stream
const val TONE_LENGTH_MS = 150 // The length of DTMF tones in milliseconds
const val SHORT_VIBRATE_LENGTH: Long = 20
Expand Down Expand Up @@ -38,7 +39,7 @@ val toneGeneratorLock = Any()
* @param durationMs tone length.
*/
fun Context.playTone(tone: Int, durationMs: Int) {
if (tone != -1 && isPhoneSilent()) {
if (tone != -1 && AudioManager(this).isPhoneSilent) {
synchronized(toneGeneratorLock) {
ToneGenerator(DIAL_TONE_STREAM_TYPE, TONE_RELATIVE_VOLUME).startTone(
tone,
Expand Down Expand Up @@ -79,7 +80,3 @@ fun Context.vibrate(millis: Long = DEFAULT_VIBRATE_LENGTH) {
}
}

fun Context.isPhoneSilent(): Boolean {
val ringerMode = (getSystemService(Context.AUDIO_SERVICE) as AudioManager).ringerMode
return ringerMode == AudioManager.RINGER_MODE_SILENT || ringerMode == AudioManager.RINGER_MODE_VIBRATE
}

0 comments on commit a538052

Please sign in to comment.