Skip to content

Commit 93d540d

Browse files
committed
add earphone plugged listener
1 parent b4615ef commit 93d540d

File tree

6 files changed

+83
-15
lines changed

6 files changed

+83
-15
lines changed

app/src/main/java/com/junnanhao/next/player/IPlayer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import com.junnanhao.next.data.model.Song
66
* Created by Jonas on 2017/5/26.
77
* define interfaces of player
88
*/
9-
@Suppress("UNUSED")
109
interface IPlayer {
1110
fun play(): Boolean
1211
fun play(song: Song): Boolean
@@ -17,4 +16,5 @@ interface IPlayer {
1716
fun getPlayingSong(): Song?
1817
fun seekTo(position: Int): Boolean
1918
fun release()
19+
fun duck()
2020
}

app/src/main/java/com/junnanhao/next/player/Player.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class Player private constructor() : IPlayer {
3434
player.setOnPreparedListener {
3535
playbackCallback?.onPrepared(currentSong)
3636
player.start()
37+
player.setVolume(1.0f, 1.0f)
3738
}
3839
player.setOnErrorListener { mp, what, extra ->
3940
playbackCallback?.onComplete()
@@ -52,6 +53,11 @@ class Player private constructor() : IPlayer {
5253
return false
5354
}
5455

56+
override fun duck() {
57+
if (isPlaying())
58+
player.setVolume(0.1f, 0.1f)
59+
}
60+
5561

5662
override fun play(song: Song): Boolean {
5763
playList.reset(song = song)

app/src/main/java/com/junnanhao/next/ui/player/PlayerContract.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import com.junnanhao.next.data.model.Song
88
* Created by Jonas on 2017/5/27.
99
* player contract
1010
*/
11-
@Suppress("UNUSED")
1211
interface PlayerContract {
1312
interface View : BaseView<Presenter> {
1413
fun showError(error:String)
@@ -22,6 +21,7 @@ interface PlayerContract {
2221
fun next()
2322
fun pause()
2423
fun play()
24+
fun duck()
2525
fun playPause()
2626
fun scan()
2727
}

app/src/main/java/com/junnanhao/next/ui/player/PlayerFragment.kt

Lines changed: 69 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.junnanhao.next.ui.player
22

33
import android.Manifest
4+
import android.content.BroadcastReceiver
45
import android.content.Context
6+
import android.content.Intent
7+
import android.content.IntentFilter
58
import android.graphics.*
69
import android.os.Bundle
710
import android.support.v4.app.Fragment
@@ -18,6 +21,7 @@ import android.support.v4.view.GestureDetectorCompat
1821
import timber.log.Timber
1922
import android.graphics.drawable.BitmapDrawable
2023
import android.graphics.drawable.Drawable
24+
import android.media.AudioManager
2125
import android.support.v4.content.ContextCompat
2226
import android.support.v7.graphics.Palette
2327
import android.view.*
@@ -55,6 +59,8 @@ class PlayerFragment : Fragment(), PlayerContract.View {
5559
}
5660

5761
lateinit var mDetector: GestureDetectorCompat
62+
lateinit var mBecomingNoisyReceiver: BroadcastReceiver
63+
lateinit var mHeadphonePluggedReceiver: BroadcastReceiver
5864

5965
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
6066
val view: View = inflater!!.inflate(R.layout.frag_player, container, false)
@@ -64,19 +70,43 @@ class PlayerFragment : Fragment(), PlayerContract.View {
6470
return view
6571
}
6672

67-
fun measure() {
68-
val wm: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
69-
val size: Point = Point()
70-
wm.defaultDisplay.getSize(size)
71-
rect = Rect(0,
72-
(size.y * 0.2).toInt(),
73-
size.x,
74-
(size.y * 0.8).toInt())
75-
}
76-
77-
7873
override fun onCreate(savedInstanceState: Bundle?) {
7974
super.onCreate(savedInstanceState)
75+
val result = (context.getSystemService(Context.AUDIO_SERVICE) as AudioManager).requestAudioFocus({
76+
focusChange: Int ->
77+
when (focusChange) {
78+
AudioManager.AUDIOFOCUS_GAIN -> mPresenter.play()
79+
AudioManager.AUDIOFOCUS_LOSS -> mPresenter.pause()
80+
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
81+
mPresenter.pause()
82+
}
83+
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> mPresenter.pause()
84+
}
85+
}, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN)
86+
87+
if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
88+
Toast.makeText(context, getString(R.string.warning_cannot_get_audio_focus), Toast.LENGTH_SHORT).show()
89+
}
90+
91+
mBecomingNoisyReceiver = object : BroadcastReceiver() {
92+
override fun onReceive(context: Context?, intent: Intent?) {
93+
if (intent?.getAction().equals(AudioManager.ACTION_AUDIO_BECOMING_NOISY)) {
94+
Timber.wtf("become noisy")
95+
mPresenter.pause()
96+
}
97+
}
98+
}
99+
mHeadphonePluggedReceiver = object : BroadcastReceiver() {
100+
override fun onReceive(context: Context?, intent: Intent?) {
101+
if (intent?.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
102+
if (intent?.getIntExtra("state", -1) == 1) {
103+
Timber.wtf("Headset is plugged")
104+
mPresenter.start()
105+
}
106+
}
107+
}
108+
}
109+
80110
mDetector = GestureDetectorCompat(context, object : GestureDetector.SimpleOnGestureListener() {
81111
override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
82112
Timber.wtf("fling")
@@ -106,6 +136,32 @@ class PlayerFragment : Fragment(), PlayerContract.View {
106136
})
107137
}
108138

139+
140+
override fun onStart() {
141+
super.onStart()
142+
activity.registerReceiver(mBecomingNoisyReceiver,
143+
IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY))
144+
activity.registerReceiver(mHeadphonePluggedReceiver,
145+
IntentFilter(Intent.ACTION_HEADSET_PLUG))
146+
}
147+
148+
override fun onDestroy() {
149+
super.onDestroy()
150+
activity.unregisterReceiver(mBecomingNoisyReceiver)
151+
activity.unregisterReceiver(mHeadphonePluggedReceiver)
152+
}
153+
154+
155+
fun measure() {
156+
val wm: WindowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
157+
val size: Point = Point()
158+
wm.defaultDisplay.getSize(size)
159+
rect = Rect(0,
160+
(size.y * 0.2).toInt(),
161+
size.x,
162+
(size.y * 0.8).toInt())
163+
}
164+
109165
@OnClick(R.id.container)
110166
fun play() {
111167
mPresenter.playPause()
@@ -191,6 +247,7 @@ class PlayerFragment : Fragment(), PlayerContract.View {
191247
artist.setText("")
192248
}
193249

250+
194251
fun Drawable.toBitmap(): Bitmap {
195252
if (this is BitmapDrawable) {
196253
return bitmap
@@ -206,4 +263,5 @@ class PlayerFragment : Fragment(), PlayerContract.View {
206263
return bitmap
207264
}
208265

266+
209267
}

app/src/main/java/com/junnanhao/next/ui/player/PlayerPresenter.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
package com.junnanhao.next.ui.player
2-
32
import com.junnanhao.next.data.SongsRepository
43
import com.junnanhao.next.data.model.Song
54
import com.junnanhao.next.player.PlaybackCallback
@@ -37,13 +36,13 @@ class PlayerPresenter @Inject constructor(
3736
}
3837
}
3938

39+
4040
override fun scan() {
4141
mSongsRepository.scanMusic()
4242
.observeOn(AndroidSchedulers.mainThread())
4343
.subscribe({ next() },
4444
{ throwable: Throwable? -> Timber.wtf(throwable) },
4545
{ scanned = true })
46-
4746
}
4847

4948
@Inject
@@ -55,6 +54,10 @@ class PlayerPresenter @Inject constructor(
5554
player.play()
5655
}
5756

57+
override fun duck() {
58+
player.duck()
59+
}
60+
5861
override fun playPause() {
5962
if (player.isPlaying()) {
6063
pause()

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@
99
<string name="loading">Loading...</string>
1010
<string name="require_permission">Please grant permission</string>
1111
<string name="permission_reason">to scan local music files</string>
12+
<string name="warning_cannot_get_audio_focus">Could not get audio focus</string>
1213
</resources>

0 commit comments

Comments
 (0)