package com.ydl.component

import android.Manifest
import android.annotation.SuppressLint
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.graphics.PixelFormat
import android.media.MediaPlayer
import android.net.Uri
import android.os.Build
import android.os.IBinder
import android.provider.Settings
import android.text.TextUtils
import android.util.DisplayMetrics
import android.util.Log
import android.view.*
import android.widget.ImageView
import android.widget.TextView
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.bumptech.glide.Glide
import com.mobile.auth.gatewayauth.PhoneNumberAuthHelper
import com.tbruyelle.rxpermissions2.RxPermissions
import com.tencent.qcloud.tuicore.calling.trtccalling.model.TRTCCalling
import com.tencent.qcloud.tuicore.calling.videocall.Constant
import com.tencent.qcloud.tuicore.calling.videocall.YDLInvitionActivity
import com.umeng.analytics.MobclickAgent
import com.ydl.audioim.YDLavManager
import com.ydl.component.music.FragmentContainerActivity
import com.ydl.component.mvp.DemoContract
import com.ydl.component.mvp.DemoPresenter
import com.ydl.component.route.PlatformTempCommonRouteImpl
import com.ydl.component.rtc.MDTLoginActivity
import com.ydl.confide.home.ConfideHomeActivity
import com.ydl.media.audio.PlayService
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.mvp.lce.BaseLceActivity
import com.ydl.ydlcommon.router.YdlCommonRouterManager
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.yidianling.common.tools.LogUtil
import com.yidianling.common.tools.ToastUtil
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.fm.api.service.IFMService
import com.yidianling.home.http.MuseHttp
import com.yidianling.muse.activity.PlayMeditationActivity
import com.yidianling.muse.bean.MeditationPlayModuleBean
import com.yidianling.muse.constants.MuseBIConstants
import com.yidianling.muse.event.MeditationFloatEvent
import com.yidianling.muse.helper.FloatViewTouchListener
import com.yidianling.muse.helper.MediaPlayerManager
import com.yidianling.muse.utils.MediaPlayerTimeUtil
import com.yidianling.tests.home.NewTestHomeActivity
import com.yidianling.user.api.service.IUserService
import com.yidianling.user.ui.collect.CollectSexAndBirthActivity
import com.yidianling.user.ui.login.OneKeyLoginHelp
import com.yidianling.user.widget.SecretDescriptionDialog
import com.yidianling.user.widget.SecretDialog
import com.yidianling.user.widget.SecretDialog.OnSecretDialogListener
import de.greenrobot.event.EventBus
import io.feeeei.circleseekbar.CircleSeekBar
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.math.roundToInt


/**
 * Created by haorui on 2019-09-01 .
 * Des:
 */
@Route(path = "/main/main")
class MainActivity : BaseLceActivity<DemoContract.View, DemoContract.Presenter>(),
    DemoContract.View {
    //    private var secretDescriptionDialog: SecretDescriptionDialog? = null
    private var serviceConnection: ServiceConnection? = null

    private var secretDialog: SecretDialog? = null
    protected var playService: PlayService? = null

    private var mFloatDisposable:Disposable?=null

    override fun getContentViewId(): Int {
        return R.id.lce_content_view
    }

    override fun getStateViewId(): Int {
        return R.id.lce_state_view
    }

    override fun setData(data: String) {
        tv_content.text = data
    }

    override fun createPresenter(): DemoContract.Presenter {
        return DemoPresenter()
    }

    override fun layoutResId(): Int {
        return R.layout.activity_main
    }

    override fun initDataAndEvent() {

        EventBus.getDefault().register(this)
        //线上
//        YDLavManager.instances.init(this, "3387e9b251f3491e9221a9877e8f7830")
        //测试
        YDLavManager.instances.init(this, "13b1536698f64905a1e7e5bb978ba821")

        YdlCommonRouterManager.initYdlCommonRoute(PlatformTempCommonRouteImpl())
        // 初始化一键登录sdk
        OneKeyLoginHelp.sdkInit(
            this,
            OneKeyLoginHelp.YDL_USER_APP,
            PhoneNumberAuthHelper.SERVICE_TYPE_LOGIN
        )
        bindService()

        initMeditationObserver()

        reLoadData()
        requestPermission()
        bt_mdt.setOnClickListener {
            val intent = Intent(this, MDTLoginActivity::class.java)
            startActivity(intent)
        }

        tv_user.setOnClickListener {
            reLoadData()
        }

        tv_home?.setOnClickListener {
            mPresenter.loadHome()
        }

        bt_to_other.setOnClickListener {
//            ARouter.getInstance().build("/user/login")
//                .withBoolean("bind_phone", false)
//                .withBoolean("isFromGuide", true)
//                .navigation()
            OneKeyLoginHelp.startLogin(this, false)
        }
        bt_to_consultant.setOnClickListener {
            //            ARouter.getInstance()
//                .build("/consult/hot_search")
//                .withString(
//                    HOT_SEARCH_DOCTOR_NAME,
//                    this.resources?.getString(R.string.platform_search_hint)
//                )
//                .navigation()
            FragmentContainerActivity.start(this, "ExpertSearchFragment")
        }
        bt_to_music.setOnClickListener {
            FragmentContainerActivity.start(this)
        }
        bt_to_im.setOnClickListener {
            FragmentContainerActivity.start(this, "NewMultiMessageFragment")
        }
        bt_to_dynamic.setOnClickListener {
            FragmentContainerActivity.start(this, "TrendsHomeFragment")
        }
        bt_to_tests.setOnClickListener {
            startActivity(Intent(this, NewTestHomeActivity::class.java))
            //                                SecretActivity.Companion.startProtocol(this, it.data.getContent());
//             secretDescriptionDialog = SecretDescriptionDialog(
//                this@MainActivity,
//               "122342453653456345674356",
//                object : OnSecretDescriptionDialogListener {
//                    override fun onCancel() {
//                        secretDescriptionDialog!!.dismiss()
//                        showEnsureDialog()
//                    }
//
//                    override fun onSure() {
//                        secretDescriptionDialog!!.dismiss()
//                    }
//                })
//            secretDescriptionDialog!!.setCanceledOnTouchOutside(false)
//            secretDescriptionDialog!!.show()

        }
        bt_to_collect_info.setOnClickListener {
            startActivity(Intent(this, CollectSexAndBirthActivity::class.java))
        }
        bt_to_confide.setOnClickListener {
            YDLavManager.instances.login(
                ModularServiceManager.provide(IUserService::class.java).getUserInfo()?.uid
            )
            startActivity(Intent(this, ConfideHomeActivity::class.java))
        }

        ModularServiceManager.provide(IConsultantService::class.java).requestGuideData()
        bt_to_muse.setOnClickListener {

            ARouter.getInstance().build("/muse/play")
                .navigation()

            val list =
                ModularServiceManager.provide(IConsultantService::class.java).getGuideImage(1)
            list?.forEach {
                LogUtil.e(it.toString())
            }
            //            YDLRouterManager.router(IYDLRouterConstant.ROUTER_MUSE_CENTER,
//                YDLRouterParams().putExtra
//            ("url", "http://video.yidianling.com/2019/05/30/746851e2f335baf5f44499f4fb49d3a9.mp3"))

//            YDLRouterManager.router(
//                IYDLRouterConstant.ROUTER_MUSE,
//                YDLRouterParams().putExtra(
//                    IYDLRouterConstant.MUSIC_URL,
//                    "http://video.yidianling.com/2019/05/30/e6d4a71e8c895f2156a2ff37d93ca3a9.mp3"
//                )
//                    .putExtra(
//                        IYDLRouterConstant.DATA_JSON, "{\n" +
//                                "        \"muses\": [{\n" +
//                                "        \"id\": 6,\n" +
//                                "        \"name\": \"冥想基础介绍-1-什么是冥想？\",\n" +
//                                "        \"audioUrl\":\n" +
//                                "        \"http://video.yidianling.com/2019/05/30/e6d4a71e8c895f2156a2ff37d93ca3a9.mp3\",\n" +
//                                "        \"backgroundUrl\":\n" +
//                                "        \"https://img.yidianling.com/file/2019/06/10/i4qdax82ok2aizq3.png\",\n" +
//                                "        \"effectCode\": 1,\n" +
//                                "        \"category\": 2,\n" +
//                                "        \"playCount\": 929,\n" +
//                                "        \"sort\": 255,\n" +
//                                "        \"isDelete\": 1,\n" +
//                                "        \"createTime\": \"May 30, 2019 4:45:17 PM\",\n" +
//                                "        \"updateTime\": \"Jun 10, 2019 7:14:23 PM\"\n" +
//                                "    }]\n" +
//                                "    }"
//                    )
//            )
        }

        bt_to_fm.setOnClickListener {
            startActivity(ModularServiceManager.provide(IFMService::class.java).fmListIntent(this))
//            YDLRouterManager.router(IYDLRouterConstant.ROUTER_FM_LIST)
        }

        bt_to_course.setOnClickListener {
            ARouter.getInstance().build("/course/home")
                .navigation()
        }
        bt_to_home.setOnClickListener {
            FragmentContainerActivity.start(this, "YdlHomeFragment")
        }
        bt_to_mine.setOnClickListener {
            FragmentContainerActivity.start(this, "MineFragment")
        }

        bt_to_privacy.setOnClickListener {
            startActivity(Intent(this@MainActivity, TestAppActivity::class.java))
        }
    }


    override fun reLoadData() {
        mPresenter.loadHome()
    }


    @SuppressLint("CheckResult")
    private fun requestPermission() {
        val rxPermissions = RxPermissions(this)
        rxPermissions.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE)
            .subscribe { permission ->
                when {
                    permission.granted -> {
                        ToastUtil.toastShort("Permission Success")
                    }
                    permission.shouldShowRequestPermissionRationale -> {
                        requestPermission()
                    }
                    else -> {
                        ToastUtil.toastLong(
                            this,
                            getString(R.string.platform_need_storage_permission_hint)
                        )
                        val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
                        val uri = Uri.fromParts("package", packageName, null)
                        intent.data = uri
                        startActivity(intent)
                        finish()
                    }
                }
            }

    }

    private fun bindService() {
        val intent = Intent()
        intent.setClass(this, PlayService::class.java!!)
        serviceConnection = PlayServiceConnection()
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
    }

    private fun initMeditationObserver(){
        mFloatDisposable = Observable.interval(500,TimeUnit.MILLISECONDS)
            .filter { true }
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe {
                if (!windowIsShow && mToShowWindow){
                    showWindow()
                }else if (windowIsShow && !mToShowWindow){
                    hideFloatWindow()
                }
                mCurrentMeditation?.let { it1 -> updateFloatView(it1) }
            }
    }

    override fun onResume() {
        super.onResume()
        MobclickAgent.onResume(this)

//        ModularServiceManager.provide(IConsultantService::class.java)
//            .
//            (this)

        val trtcCalling = TRTCCalling.sharedInstance(this)
        if (!TextUtils.isEmpty(trtcCalling.mRoomId) && !TextUtils.isEmpty(trtcCalling.mUserId)) {
            val intent = Intent(mContext, YDLInvitionActivity::class.java)
            intent.putExtra(Constant.ROOM_ID, trtcCalling.mRoomId)
            intent.putExtra(Constant.USER_ID, trtcCalling.mUserId)
            intent.putExtra(Constant.INVITE_ID, trtcCalling.mInviteId)
            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            mContext.startActivity(intent)
        }
    }

    override fun onPause() {
        super.onPause()

//        ModularServiceManager.provide(IConsultantService::class.java).hideConsultAssistantDialog()
    }

    fun onEvent(event: MeditationFloatEvent) {

    }

    @SuppressLint("MissingSuperCall")
    override fun onDestroy() {
        if (serviceConnection != null) {
            unbindService(serviceConnection)
        }

        MediaPlayerManager.getInstance(this)?.stop()

        hideFloatWindow()

        mDisposable?.dispose()
        mFloatDisposable?.dispose()

        if (EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().unregister(this)
        }
        super.onDestroy()
    }

    private inner class PlayServiceConnection : ServiceConnection {
        override fun onServiceConnected(name: ComponentName, service: IBinder) {
            playService = (service as PlayService.PlayBinder).service
        }

        override fun onServiceDisconnected(name: ComponentName) {
            Log.e(javaClass.simpleName, "service disconnected")
        }
    }

    private fun showEnsureDialog() {
        secretDialog = SecretDialog(this, object : OnSecretDialogListener {
            override fun onCancel() {
                secretDialog!!.dismiss()
//                finishAll()
//                Process.killProcess(Process.myPid())
//                System.exit(0)
            }

            override fun onSure() {
                secretDialog!!.dismiss()
            }
        })
        secretDialog!!.setCanceledOnTouchOutside(false)
        secretDialog!!.show()
    }

    private lateinit var mWindowManager: WindowManager
    private var floatRootView: View? = null

    private var ivClose: ImageView? = null
    private var ivCover: ImageView? = null
    private var tvTitle: TextView? = null
    private var ivProgress: CircleSeekBar? = null
    private var ivPlayOrPause: ImageView? = null

    private var mMediaPlayer: MediaPlayer? = null

    private var mTimer = Timer()

    private var mCurrentMeditation: MeditationPlayModuleBean.MeditationDetail? = null

    private var mMeditations = mutableListOf<MeditationPlayModuleBean.MeditationDetail>()

    private var windowIsShow = false

    private var mToShowWindow = false

    private var mUpdate = false

    private var mObservable: Observable<Long>? = null
    private var mObserver: Observer<Long>? = null

    private var currentMediaId:Long? = null

    private var mDisposable:Disposable?=null

    private var currentMeditationIndex = 0

    private fun showWindow() {
        mWindowManager = getSystemService(WINDOW_SERVICE) as WindowManager
        val outMetrics = DisplayMetrics()
        mWindowManager.defaultDisplay.getMetrics(outMetrics)
        var layoutParams = WindowManager.LayoutParams().apply {
            type = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
            } else {
                WindowManager.LayoutParams.TYPE_PHONE
            }
            flags =
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            format = PixelFormat.RGBA_8888
            width = outMetrics.widthPixels - dp2px(32F)
            height = ViewGroup.LayoutParams.WRAP_CONTENT
            gravity = Gravity.LEFT or Gravity.TOP

            x = outMetrics.widthPixels /2 - width / 2
            y = outMetrics.heightPixels - dp2px(140F)
        }
        floatRootView =
            LayoutInflater.from(this).inflate(com.yidianling.muse.R.layout.layout_meditation_play_float_view, null)
        ivClose = floatRootView?.findViewById(com.yidianling.muse.R.id.iv_close)
        ivCover = floatRootView?.findViewById(com.yidianling.muse.R.id.iv_cover)
        tvTitle = floatRootView?.findViewById(com.yidianling.muse.R.id.tv_title)
        ivProgress = floatRootView?.findViewById(com.yidianling.muse.R.id.progress_bar)
        ivPlayOrPause = floatRootView?.findViewById(com.yidianling.muse.R.id.iv_play_status)
        floatRootView?.setOnTouchListener(FloatViewTouchListener(layoutParams, mWindowManager))
        mWindowManager.addView(floatRootView, layoutParams)
        windowIsShow = true
    }

    fun onEventMainThread(event: Any) {
        if (event is com.ydl.ydlcommon.event.MeditationFloatEvent){
            mToShowWindow = event.show
            if (event.show!=null && !event.show) {
                if (event.stop == true){
                    try {
                        mMediaPlayer?.stop()
                    }catch (e:Exception){

                    }
                }
            }
        }

        if (event is MeditationFloatEvent){
            mToShowWindow = event.show

            if (event.time!=null){
                if (event.time!! >0){
                    initRxTimeOff(event.time!!)
                }else{
                    mDisposable?.dispose()
                }
            }else{
                if (event.show!=null && !event.show) {
                    if (event.stop == true){
                        try {
                            mMediaPlayer?.stop()
                        }catch (e:Exception){

                        }
                    }
                }
            }
            if (event.show!=null && event.show && event.meditation != null && event.meditations!=null) {
                mCurrentMeditation = event.meditation
                mMeditations.addAll(event.meditations!!)
            }
        }


    }

    private fun updateFloatView(meditation: MeditationPlayModuleBean.MeditationDetail) {

        currentMediaId = meditation.mediaId
        MediaPlayerManager.getInstance(this)?.setMediaId(currentMediaId)

        mMediaPlayer = MediaPlayerManager.getInstance(this)?.getMediaPlayer()
        tvTitle?.setOnClickListener {
            //悬浮窗暂停点击事件
            ActionCountUtils.count(MuseBIConstants.YDL_MUSE_MEDITATION_WINDOW_CLICK,"")

            val intent = Intent(this, PlayMeditationActivity::class.java)
            intent.putExtra("MEDIA_ID", meditation.mediaId)
            intent.putExtra("MEDITATION_ID", meditation.meditationId)
            intent.putExtra("MEDITATION_TYPE", meditation.meditationType)
            intent.putExtra("MEDIA_COVER_URL", meditation.coverImageUrl)
            intent.putExtra("MEDIA_URL", meditation.mediaUrl)

            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            startActivity(intent)
        }
        ivCover?.setOnClickListener {
            //悬浮窗暂停点击事件
            ActionCountUtils.count(MuseBIConstants.YDL_MUSE_MEDITATION_WINDOW_CLICK,"")

            val intent = Intent(this, PlayMeditationActivity::class.java)
            intent.putExtra("MEDIA_ID", meditation.mediaId)
            intent.putExtra("MEDITATION_ID", meditation.meditationId)
            intent.putExtra("MEDITATION_TYPE", meditation.meditationType)
            intent.putExtra("MEDIA_COVER_URL", meditation.coverImageUrl)
            intent.putExtra("MEDIA_URL", meditation.mediaUrl)

            intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
            startActivity(intent)
        }

        if (mMediaPlayer?.isPlaying == true) {
            ivPlayOrPause?.setImageResource(com.yidianling.muse.R.drawable.icon_meditation_float_play)
        } else {
            ivPlayOrPause?.setImageResource(com.yidianling.muse.R.drawable.icon_meditation_float_pause)
        }

        ivProgress?.maxProcess = mMediaPlayer?.duration ?: 0
        ivProgress?.curProcess = mMediaPlayer?.currentPosition ?: 0

        Glide.with(floatRootView!!)
            .load(meditation.coverImageUrl)
            .into(ivCover!!)

        tvTitle?.text = meditation.title

        ivPlayOrPause?.setOnClickListener {
            if (mMediaPlayer?.isPlaying == true) {
                //悬浮窗暂停点击事件
                ActionCountUtils.count(MuseBIConstants.YDL_MUSE_MEDITATION_WINDOW_PAUSE_CLICK,"")

                MediaPlayerManager.getInstance(this)?.pause()
                if (meditation.meditationId != null && meditation.mediaId != null) {
                    MuseHttp.getInstance().postMeditationPlayRecord(
                        meditationId = meditation.meditationId!!.toInt(),
                        isQuit = 1, mediaId = meditation.mediaId!!,
                        playTime = (ivProgress?.curProcess?.div(1000.00))?.roundToInt() ?: 0,
                        isComplete = 0
                    )
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe({

                        }, {
                            object : ThrowableConsumer() {
                                override fun accept(msg: String) {

                                }
                            }
                        })
                }
            } else {
                //悬浮窗播放点击事件
                ActionCountUtils.count(MuseBIConstants.YDL_MUSE_MEDITATION_WINDOW_PLAY_CLICK,"")
                MediaPlayerManager.getInstance(this)?.play()
            }
            if (mMediaPlayer?.isPlaying == true) {
                ivPlayOrPause?.setImageResource(com.yidianling.muse.R.drawable.icon_meditation_float_play)
            } else {
                ivPlayOrPause?.setImageResource(com.yidianling.muse.R.drawable.icon_meditation_float_pause)
            }
        }

        mTimer.schedule(object : TimerTask() {
            override fun run() {
                ivProgress?.curProcess = mMediaPlayer?.currentPosition ?: 0
            }
        }, 0, 50)

        mMediaPlayer?.setOnCompletionListener {

            val duration = meditation?.duration?.toInt()?:0
            val currentDuration = (mMediaPlayer?.currentPosition?:0)/1000
            if(meditation.mediaId!=null && meditation.meditationId!=null){
                val playTime = (ivProgress?.curProcess?.div(1000.00))?.roundToInt() ?: 0
                if(duration == currentDuration){
                    MediaPlayerTimeUtil.uploadPlayRecord(
                        meditationId = meditation.meditationId.toInt(),
                        mediaId = meditation.mediaId,
                        isQuit = 0,
                        playTime = playTime,
                        isComplete = 1
                    )
                }
            }
            switchSound()
            if (mMediaPlayer?.isPlaying == true) {
                ivPlayOrPause?.setImageResource(com.yidianling.muse.R.drawable.icon_meditation_float_play)
            } else {
                ivPlayOrPause?.setImageResource(com.yidianling.muse.R.drawable.icon_meditation_float_pause)
            }
        }

        ivClose?.setOnClickListener {
            //悬浮窗关闭点击事件
            ActionCountUtils.count(MuseBIConstants.YDL_MUSE_MEDITATION_WINDOW_CLOSE_CLICK,"")

            if(meditation.mediaId!=null && meditation.meditationId!=null){
                val playTime = (ivProgress?.curProcess?.div(1000.00))?.roundToInt() ?: 0
                MediaPlayerTimeUtil.uploadPlayRecord(
                    meditationId = meditation.meditationId.toInt(),
                    mediaId = meditation.mediaId,
                    isQuit = 0,
                    playTime = playTime,
                    isComplete = 0
                )
            }

            MediaPlayerManager.getInstance(this)?.stop()
            hideFloatWindow()
        }

        mUpdate = false

    }

    private fun hideFloatWindow() {
        if (floatRootView != null && floatRootView?.windowToken != null) {
            if (mWindowManager != null) {
                mWindowManager.removeViewImmediate(floatRootView)
            }
        }
        windowIsShow = false
    }

    private fun switchSound() {
        mMeditations?.forEachIndexed { index, meditationDetail ->
            if (meditationDetail.mediaId == mCurrentMeditation?.mediaId) {
                currentMeditationIndex = index
            }
        }
        if (currentMeditationIndex < mMeditations.size - 1) {
            mCurrentMeditation = mMeditations[currentMeditationIndex + 1]
        } else {
            mCurrentMeditation = mMeditations[0]
        }
        mUpdate = true
        updateFloatView(mCurrentMeditation!!)

        initMediaPlayer(mCurrentMeditation!!.mediaUrl)

    }

    private fun initMediaPlayer(path: String) {
        MediaPlayerManager.getInstance(this)?.setAudioPath(path)
        MediaPlayerManager.getInstance(this)
            ?.setOnPreparedListener(object : MediaPlayerManager.OnMediaPlayerManagerListener {
                override fun onPrepared(mediaPlayer: MediaPlayer) {
                    MediaPlayerManager.getInstance(this@MainActivity)?.play()
                }
            })
    }


    private fun dp2px(dp: Float): Int {
        val scale = resources.displayMetrics.density
        return (dp * scale + 0.5f).toInt()
    }

    private fun initRxTimeOff(time: Long) {
        mObservable = Observable.interval(0, 1, TimeUnit.SECONDS)
            .take(time / 1000 + 1)
            .map { t -> time - t * 1000 }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())

        mObserver = object : Observer<Long> {
            override fun onSubscribe(d: Disposable) {
                mDisposable = d
            }

            override fun onNext(t: Long) {

            }

            override fun onError(e: Throwable) {

            }

            override fun onComplete() {
                if (mMediaPlayer?.isPlaying == true) {
                    mMediaPlayer?.stop()
                    ivPlayOrPause?.setImageResource(com.yidianling.muse.R.drawable.icon_meditation_float_pause)
                }
                hideFloatWindow()
            }
        }

        if (mObserver != null && mObserver is Observer<Long>) {
            mObservable?.subscribe(mObserver as Observer<Long>)
        }

        if (mDisposable?.isDisposed == true && mObserver != null && mObserver is Observer<Long>) {
            mObservable?.subscribe(mObserver as Observer<Long>)
        }

    }

}
