package com.yidianling.muse.helper import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.graphics.PixelFormat import android.graphics.Point import android.os.Bundle import android.text.TextUtils import android.view.Gravity import android.view.View import android.view.WindowManager import androidx.core.view.ViewCompat import com.alibaba.android.arouter.launcher.ARouter import com.ydl.media.audio.AudioPlayer import com.ydl.media.view.PlayTypeEnum import com.yidianling.common.tools.RxImageTool class MeditationPlayWindowController { companion object { @SuppressLint("StaticFieldLeak") private var mPlayerFloatView: MeditationFloatWindow? = null //已添加悬浮窗页面全路径名 private var showingPageName: String? = null private var wm: WindowManager? = null var isCanClick = true var playingType = PlayTypeEnum.PLAY_TYPE_NONE var playTempData = hashMapOf<String, String>() /** * 如果有音频正在播放则显示 */ fun showIfPlaying(context: Context) { if (MediaPlayerManager.getInstance(context)?.isPlaying() == true) { show(context) mPlayerFloatView?.updatePlayState() } else { hide() } } /** * 显示悬浮控件 */ fun show( context: Context, playTypeEnum: PlayTypeEnum = PlayTypeEnum.PLAY_TYPE_NONE, playData: HashMap<String, String> = hashMapOf<String, String>() ) { playingType = playTypeEnum if (playData.size > 0) { this.playTempData.putAll(playData) } if (mPlayerFloatView == null) { mPlayerFloatView = MeditationFloatWindow(context) mPlayerFloatView?.addFloatClickListener(object : MeditationFloatWindow.FloatViewPlayListener { override fun onPauseClick() { } override fun onStartClick() { } override fun onPlayFinish() { } }) } if (showingPageName != context::class.qualifiedName) { mPlayerFloatView?.resetWm(context) addFloatToWm(context) } mPlayerFloatView?.resetView() mPlayerFloatView?.visibility = View.VISIBLE mPlayerFloatView?.setPlayingState() } fun hide() { mPlayerFloatView?.visibility = View.GONE } fun addClickListener(listener: MeditationFloatWindow.FloatViewPlayListener) { mPlayerFloatView?.addFloatClickListener(listener) } fun removeClickListener(listener: MeditationFloatWindow.FloatViewPlayListener) { mPlayerFloatView?.removeFloatClickListener(listener) } fun isShow(context: Context): Boolean { return !TextUtils.isEmpty(showingPageName) && showingPageName == context::class.qualifiedName && mPlayerFloatView?.visibility == View.VISIBLE } fun removeView(context: Context) { if (TextUtils.isEmpty(showingPageName) || showingPageName != context::class.qualifiedName) { return } mPlayerFloatView?.visibility = View.GONE wm?.removeViewImmediate(mPlayerFloatView) showingPageName = "" wm = null } fun onDestroy() { if (mPlayerFloatView != null) { if (!TextUtils.isEmpty(showingPageName)) { wm?.removeViewImmediate(mPlayerFloatView) showingPageName = "" } mPlayerFloatView?.onDestroy() mPlayerFloatView?.removeAllViews() } } fun setPlayingState(context: Context) { show(context) mPlayerFloatView?.setPlayingState() } fun updatePlayState() { mPlayerFloatView?.updatePlayState() } private fun addFloatToWm(context: Context) { if (wm != null && !TextUtils.isEmpty(showingPageName)) { if (ViewCompat.isAttachedToWindow(mPlayerFloatView!!)) { // if (context is Activity && !(context.isFinishing)){ // wm?.removeViewImmediate(mPlayerFloatView) // } wm?.removeViewImmediate(mPlayerFloatView) } wm = null } //获取WindowManager wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager //设置LayoutParams(全局变量)相关参数 val wmParams = mPlayerFloatView?.wmParams wmParams?.type = WindowManager.LayoutParams.TYPE_APPLICATION //设置window type wmParams?.format = PixelFormat.RGBA_8888 //设置图片格式,效果为背景透明 //设置Window flag wmParams?.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE wmParams?.gravity = Gravity.LEFT or Gravity.TOP //调整悬浮窗口至左上角 //以屏幕左上角为原点,设置x、y初始值 val size = Point() wm?.defaultDisplay?.getSize(size) wmParams?.x = 0 wmParams?.y = size.y * 5 / 6 //设置悬浮窗口长宽数据 wmParams?.width = WindowManager.LayoutParams.MATCH_PARENT wmParams?.height = RxImageTool.dp2px(56f) //显示myFloatView图像 wm?.addView(mPlayerFloatView, wmParams) showingPageName = context::class.qualifiedName!! } /** * 打开播放中的页面详情 */ fun startPlayingActivity(context: Context?, fullScreen: Int = 0) { if (playingType == PlayTypeEnum.PLAY_TYPE_FM) { //FM播放页 startFMPlayActivity(context) } else if (playingType == PlayTypeEnum.PLAY_TYPE_COURSE) { var url = AudioPlayer.get().playMusic?.path //课程播放页 startCoursePlayActivity(context, 1, fullScreen, url, true) } } fun startCoursePlayActivity( context: Context?, from: Int, fullScreen: Int = 0, coursePlayUrl: String? = "", isFromFloatView: Boolean = false ) { ARouter.getInstance() .build("/course/play") .withInt("course_id", playTempData["course_id"]?.toInt() ?: 0) .withInt("course_type", 0) .withString("coursePlayUrl", coursePlayUrl) .withInt("from", from) .withBoolean("isFromFloatView", isFromFloatView) .withInt("fullScreen", fullScreen) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .navigation() } fun startFMPlayActivity(context: Context?) { val bundle = Bundle() bundle.putInt("id", playTempData["fmId"]?.toInt() ?: 0) ARouter.getInstance().build("/fm/detail") .withBundle("bundle", bundle) .navigation() } /** * 获取FM播放Id */ fun getFmId(): Int { return playTempData["fmId"]?.toInt() ?: 0 } } }