From cbda2b196ab79a8a025395656125c55f8dbf5e50 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 25 Feb 2025 21:50:41 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20-=2010=EC=B4=88=20=EC=9D=B4?= =?UTF-8?q?=EC=A0=84/=EC=9D=B4=ED=9B=84=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../player/AudioContentPlayerFragment.kt | 20 ++++++++++ .../player/AudioContentPlayerService.kt | 35 ++++++++++++++++++ .../res/drawable-xxhdpi/ic_player_next_10.png | Bin 0 -> 2905 bytes .../res/drawable-xxhdpi/ic_player_next_15.png | Bin 2851 -> 0 bytes .../res/drawable-xxhdpi/ic_player_prev_10.png | Bin 0 -> 2927 bytes .../res/drawable-xxhdpi/ic_player_prev_15.png | Bin 2920 -> 0 bytes .../layout/fragment_audio_content_player.xml | 25 ++++++++++++- 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100755 app/src/main/res/drawable-xxhdpi/ic_player_next_10.png delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_player_next_15.png create mode 100755 app/src/main/res/drawable-xxhdpi/ic_player_prev_10.png delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_player_prev_15.png diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/player/AudioContentPlayerFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/player/AudioContentPlayerFragment.kt index 2e24868..617a145 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/player/AudioContentPlayerFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/player/AudioContentPlayerFragment.kt @@ -353,6 +353,26 @@ class AudioContentPlayerFragment( } } + binding.ivSeekForward10.setOnClickListener { + mediaController?.let { + val sessionCommand = SessionCommand( + "SEEK_FORWARD", + Bundle.EMPTY + ) + it.sendCustomCommand(sessionCommand, Bundle.EMPTY) + } + } + + binding.ivSeekBackward10.setOnClickListener { + mediaController?.let { + val sessionCommand = SessionCommand( + "SEEK_BACKWARD", + Bundle.EMPTY + ) + it.sendCustomCommand(sessionCommand, Bundle.EMPTY) + } + } + binding.sbProgress.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged( seekBar: SeekBar?, diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/player/AudioContentPlayerService.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/player/AudioContentPlayerService.kt index d5b3299..bf5b259 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/player/AudioContentPlayerService.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/player/AudioContentPlayerService.kt @@ -130,6 +130,8 @@ class AudioContentPlayerService : MediaSessionService() { .add(SessionCommand("PLAY_PREVIOUS_CONTENT", Bundle.EMPTY)) .add(SessionCommand("PLAY_SELECTED_CONTENT", Bundle.EMPTY)) .add(SessionCommand("GET_PLAYLIST", Bundle.EMPTY)) + .add(SessionCommand("SEEK_FORWARD", Bundle.EMPTY)) + .add(SessionCommand("SEEK_BACKWARD", Bundle.EMPTY)) .build() return MediaSession.ConnectionResult.AcceptedResultBuilder(session) @@ -176,6 +178,16 @@ class AudioContentPlayerService : MediaSessionService() { Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS)) } + "SEEK_FORWARD" -> { + playSeekForward() + Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS)) + } + + "SEEK_BACKWARD" -> { + playSeekBackward() + Futures.immediateFuture(SessionResult(SessionResult.RESULT_SUCCESS)) + } + "GET_PLAYLIST" -> { val extras = Bundle().apply { putParcelableArrayList( @@ -227,6 +239,25 @@ class AudioContentPlayerService : MediaSessionService() { } } + private fun playSeekForward() { + val currentPosition = player!!.currentPosition + val duration = player!!.duration + var newPosition = currentPosition + SEEK_INTERVAL_MS + if (newPosition > duration) { + newPosition = duration + } + player!!.seekTo(newPosition) + } + + private fun playSeekBackward() { + val currentPosition = player!!.currentPosition + var newPosition = currentPosition - SEEK_INTERVAL_MS + if (newPosition < 0) { + newPosition = 0 + } + player!!.seekTo(newPosition) + } + private fun urlGenerateSuccess( content: AudioContentPlaylistContent, contentUrl: String @@ -318,4 +349,8 @@ class AudioContentPlayerService : MediaSessionService() { ) ) } + + companion object { + private const val SEEK_INTERVAL_MS = 10 * 1000 + } } diff --git a/app/src/main/res/drawable-xxhdpi/ic_player_next_10.png b/app/src/main/res/drawable-xxhdpi/ic_player_next_10.png new file mode 100755 index 0000000000000000000000000000000000000000..c5ae6d15f68b8a08331ab195bd785ad06677c5cf GIT binary patch literal 2905 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 BbSeM< diff --git a/app/src/main/res/drawable-xxhdpi/ic_player_prev_10.png b/app/src/main/res/drawable-xxhdpi/ic_player_prev_10.png new file mode 100755 index 0000000000000000000000000000000000000000..90d7a57ad24bd3b062a46f3bee6023dd883139ea GIT binary patch literal 2927 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 Ze*ppaBE#1OM0fxI002ovPDHLkV1k}kfe!!x literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_player_prev_15.png b/app/src/main/res/drawable-xxhdpi/ic_player_prev_15.png deleted file mode 100755 index 98004577f533136d0a05ba63fea64dd6c459c2df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2920 zcmV-u3zzhXP)gpCxlqm2M->^;uuE5xUjEqVRtRQPHUXt z`zNTA-@2*~zkK<^$b1*)#CkunI3&S$M>wAo>48dt&(6+9IKh|MGTfPm_wL;ri9<48 zqsmP($a#zBldgjt75hNNu7c;e-?cSwif7O*;_({d9!a^lF+IuMyLX@Bq8;}U!9INW zaDp3s55oP0^L-)L9VA7tnt6xcW^*&NhF1d9CF3IehsR#Y*KUOEqMERQRtcexAoSn# zZZaRdrSSKS@jG8iM|dMJ?`(=I#r4`07jVxfVe`<7uqzkh#> z8}n(2HAk*R?p0tFcU15(n-_ocBFPeyTC>*8CY*}go4{q_ve`p%eecMx1M6l6hhh%E zoQd3vz}gHNnLcBE3t^uvqf4%W!69#4G1tqf$gK{VbS|)pyJz}LJ5UZ}g`rnsy(|SH zBj$K5Ez+65yffJ}s1SD~Ye1RE?3Qh_o!p7Q6qoKt3I+?-N!%2QjDd`2VyKf@eSQ7< zbto<1T;Q~KO0I|B=2%B@Q`pt1ZRI)8$NjpE`q-(!DlRQIGJURX+>xv?Xa>G5XhOA8 zA3GDcLflyg#woI3>wVD zU4{9^ZNs1oUhRe9Bf9FwO~+OR)~PkLT+|?zrINAZ`tKo!DKQFK=qa3k$4+2IGQ{Cqdl$Y;JCjWIo_( zWW@^!Tru1i#BB%%T1;cexSsz=O&SYaA#SYVuH1-FSHOzLhT@&N?czoPbDC($aNmi} zbPVDyfVMW`d^v=-nIr!D`_hcaRLJ0fvlk@L3aE2U!B(wlw*zSj-v$ln%5b+2%f5rp zkBU6a+1VKbnx<=$ChTLD1wk(sm)}ft=ds1#W;?UA6@h&m5u&*H6&VJ`QZR=Z$G(#0 z|MwVA3k%Gf4>#Ir-fGoN$2Nas;bzi05BGHem!#&)AovrpWFZUYat+St7Y{-G#kIP( z%5c6B$|~zHouF{@9vAfB^78VBSOV9YNK0@b9nK{`Y`DX7vi@4Qi1n`^JMd{oDu~4DYeUadvgEb~mo{bk-7j@34Wj zPEZ%$Duc1@*c|KK`d|;~UEslBkQj<1u{l-(b0Efu@)0=E;ktieQ8Vko^ABA7k8+(t zDG^8TZzIsk7jM}_(m~*A5?)A%ew0Swh(l%{&~0jS>Iee3PSKFayw&oCD-}4nXaf)` z%DkP;>$Ye=vkCUmVTuNmkdWU|;cB*TFi#Bsh;HtJi zyK6PePD%tP03xdD~IE={NIzHeAtrntdpM0Dtsx>h0ie6o`L=&B+G@2|>LX9SO{l&6VNNtkB3%R@uuIEI5ZQocowQxYo+{ z*j)QLk(MZ!@IJK}1PKD?P>a2}aA@~h2TR$hHF({q9xuRjlOgx&&cuQsZ~@HM1wkbva>Q)6 zSLLaWr){st(x7k7g3&~>vf$vNOQ6UV8Dq1=E*7|>H*IJrp4d(!a$>=n#(|yhoPHYP zLcI_V;I3t#KYzX%1hCntLnjxGGb<$?>#i)KJEBogm)i*p^980!cttqrD#S1#XE{Xa z`!G4aIk=YJCD$ufXHygxNmz!G>vhT0V}TlQpC~a5UDg?Ec2NhL>Y%N*QuD17rdcE~ zmRM@gy1-f&#rbj!f_JtN#VU~Qpqeko@MW!S4V*;Ls3T0N`G&6dCs-wL4M&FJr0!H8 zCj#q9%te)Gas(^3fQC@uo<~v>XYJsER6u*dimNHIUa?qgmdBaEoc1E-T*$3vG+#A} zte3e@nzXf@39PArjtw6TLquH+H{&!ECk0t|DskFXsaBli%iBtJy=t)CYuag5tv8Vd zI2D*yj61R@*>woGGN@}dU6W*yUO?xA4J8>=4}z=yjk@M2U*05g&eF+fQc1GwHzBIN z&KhWP%_ti$x?f`_0&50UldI-v)0=g!j}5ayQW884WkEU{4>rvFPuVGm99JH#ca6

`0T~u`eys+u|<>IV#E}i3{)+b<_T; zr6krwY;UB)eJy%j-B%{Etk_-;x{du&!N<;iYwyc9D@5ir)PqIaf_=g!Ah)P9wR07x zH?kM&b1Oui<-LH*K3q0yR+r3XP*m_0=U&R21=wuxYn!mB(<9L++k0zH(=JtH=HWc* zXRhN6uU6Ps?N+KJnvW_L&(Iz@*0l#xvH)DSJ~)sL@Ggad)>%gudlS$C4t)^XR#^GH z>uPH&53BGpM+V{8s1Bb+6<BRmgngDIb;*hDX>^PDh@LJ#$jvH%ov8cvjF#??r=oXFTdcAJ# zMPcfCBRrmP5w#bPEn!r3$OcTHp#GWi_No?0;go^Xl_suNk1@nV!eOjldvgEEpQfHzsp&P zOm|=t{4|9kPJ9+M%gP9xg_ex~i$T#aBY4wkL7Z;H+#C}$i5Rp^d>1v#N(yX(5itas zSvC`vAu9g^?tMG^oiq + + + +