From 3dc12ef829d9bcd6a2a85a7456eb24f304c15c66 Mon Sep 17 00:00:00 2001
From: lmw <125975490@qq.com>
Date: 星期五, 28 二月 2025 17:05:37 +0800
Subject: [PATCH] 首页字体优化

---
 app/src/main/java/com/sinata/xqmuse/MainActivity.kt |  415 ++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 367 insertions(+), 48 deletions(-)

diff --git a/app/src/main/java/com/sinata/xqmuse/MainActivity.kt b/app/src/main/java/com/sinata/xqmuse/MainActivity.kt
index 9978b5e..2890343 100644
--- a/app/src/main/java/com/sinata/xqmuse/MainActivity.kt
+++ b/app/src/main/java/com/sinata/xqmuse/MainActivity.kt
@@ -1,49 +1,242 @@
 package com.sinata.xqmuse
 
+import android.annotation.SuppressLint
 import android.content.Intent
+import android.os.Handler
+import android.os.Looper
+import android.os.Message
+import android.provider.Settings
+import android.util.Log
+import android.view.View
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentPagerAdapter
 import cn.sinata.xldutils.gone
 import cn.sinata.xldutils.utils.SPUtils
+import cn.sinata.xldutils.visible
 import com.flyco.tablayout.listener.CustomTabEntity
 import com.flyco.tablayout.listener.OnTabSelectListener
-import com.github.zackratos.ultimatebar.UltimateBar
+import com.google.gson.Gson
 import com.sinata.xqmuse.dialog.TipDialog
 import com.sinata.xqmuse.network.HttpManager
-import com.sinata.xqmuse.network.entity.UserInfo
+import com.sinata.xqmuse.network.entity.VoiceDetail
+import com.sinata.xqmuse.network.entity.req.ReqAnswer
 import com.sinata.xqmuse.network.request
 import com.sinata.xqmuse.ui.TransparentStatusBarActivity
 import com.sinata.xqmuse.ui.course.CourseFragment
 import com.sinata.xqmuse.ui.discovery.DiscoveryFragment
+import com.sinata.xqmuse.ui.guide.GuideActivity
 import com.sinata.xqmuse.ui.home.HomeFragment
+import com.sinata.xqmuse.ui.login.LoginActivity
 import com.sinata.xqmuse.ui.mine.MineFragment
 import com.sinata.xqmuse.ui.mine.ShareActivity
 import com.sinata.xqmuse.ui.tree.TreeFragment
+import com.sinata.xqmuse.utils.AudioUtils
 import com.sinata.xqmuse.utils.Const
 import com.sinata.xqmuse.utils.event.EmptyEvent
+import com.sinata.xqmuse.utils.event.IntEvent
 import kotlinx.android.synthetic.main.activity_main.*
-import kotlinx.android.synthetic.main.fragment_home.*
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.jetbrains.anko.startActivity
+import org.jetbrains.anko.toast
+import xyz.doikki.videoplayer.player.VideoView
 
-class MainActivity : TransparentStatusBarActivity(), OnTabSelectListener{
+class MainActivity : TransparentStatusBarActivity(), OnTabSelectListener,AudioUtils.OnAudioStatusUpdateListener {
     override fun setContentView() = R.layout.activity_main
 
     private val fragments    = arrayListOf<Fragment>()
-    var homeData: UserInfo? = null //个人信息
+
+    var teacherVideoView:VideoView? = null
+    private var bgPlayer:AudioUtils? = null//背景音乐播放器
+    private var thinkBgPlayer:AudioUtils? = null//冥想背景音播放器
+//    private var thinkPlayer:AudioUtils? = null//冥想背景音播放器
+
+    private var guideAudio:String? = null
+    private var guidePlayer:AudioUtils? = null//引导音频播放器
+
+    private var thinkHandler:Handler? = null //冥想时间相关
+    private var inGuide = false //true 引导中...
+
+    private val isFirst by lazy { intent.getBooleanExtra("isFirst",false) } //首次安装,需要到导师引导页
+
+    private val MSG_PROGRESS = 0//疗愈进度+1
+    private val MSG_TODAY = 1//今日疗愈更新计时
+    private val MSG_COUNTDOWN = 2//疗愈倒计时
+
+    private var lastTodayTime = 0L //上一次今日疗愈获取的时间
+
+    private var startTime = 0L //开始疗愈的时间戳
+
+    var hasTreeFirstShow = false //此字段用来判断 树苗的首次弹窗是否已经触发,和isFirst字段配合使用
+    var isBGMChanged = false //此字段用来判断 在疗愈播放中,修改了背景音乐,在疗愈结束后 需要更新BGM音源
 
     override fun initClick() {
+        player_close.setOnClickListener {
+            TipDialog.show(supportFragmentManager,"是否关闭当前音频?",object :TipDialog.OnClickCallback{
+                override fun onOk() {
+                    EventBus.getDefault().post(EmptyEvent(Const.EventCode.FINISH_THINK))
+                }
+
+                override fun onCancel() {
+                }
+            },"确认","取消")
+        }
+
+        cl_player.setOnClickListener {
+            voice?.goDetail(this)
+        }
+
+        player_play.setOnClickListener {
+            playing = !playing
+            if (playing){
+                player_play.setImageResource(R.mipmap.player_pause)
+                thinkBgPlayer?.resume()
+//                thinkPlayer?.resume()
+                thinkHandler?.sendEmptyMessage(MSG_PROGRESS)
+                startTime = System.currentTimeMillis()
+            }else{
+                player_play.setImageResource(R.mipmap.player_start)
+                thinkBgPlayer?.pause()
+//                thinkPlayer?.pause()
+                thinkHandler?.removeMessages(MSG_PROGRESS)
+                saveThinkRecord()
+            }
+            (fragments[0] as HomeFragment).refreshTodayPlayingState()
+        }
     }
 
     override fun initView() {
+        EventBus.getDefault().register(this)
         titleBar.gone()
         useWhiteTitle()
+        startBgm()
         initTab()
-        EventBus.getDefault().register(this)
-        getData()
         if (!intent.getStringExtra("code").isNullOrEmpty()){
             startActivity<ShareActivity>("code" to intent.getStringExtra("code"))
+        }
+        if (isFirst) //解决首次安装启动eventbus注册慢的问题
+            startActivity<GuideActivity>()
+
+        thinkHandler = object :Handler(Looper.myLooper()!!){
+            override fun handleMessage(msg: Message) {
+                super.handleMessage(msg)
+                when(msg.what){
+                    MSG_PROGRESS->{
+                        currentPosition = thinkBgPlayer?.currentPosition ?:0
+                        EventBus.getDefault().post(EmptyEvent(Const.EventCode.GOT_THINK_POSITION))
+                        sendEmptyMessageDelayed(MSG_PROGRESS,1000)
+                    }
+                    MSG_COUNTDOWN->{
+                        if (System.currentTimeMillis()>= finishTime)
+                            EventBus.getDefault().post(EmptyEvent(Const.EventCode.FINISH_THINK))
+                        else
+                            sendEmptyMessageDelayed(MSG_COUNTDOWN,1000)
+                    }
+                    MSG_TODAY->{
+                        if (System.currentTimeMillis() - lastTodayTime > 60000) { //距离上次刷新过去了1分钟
+                            Log.e(Const.Tag,"已经过1分钟,需要重新获取今日疗愈数据")
+                            lastTodayTime = System.currentTimeMillis()
+                            (fragments[0] as HomeFragment).getToday()
+                        }
+                        sendEmptyMessageDelayed(MSG_TODAY,5000)
+                    }
+                }
+            }
+        }
+        lastTodayTime = System.currentTimeMillis()
+        startTodayCheck()
+    }
+
+    private fun startGuide() {
+        if (guidePlayer == null)
+            guidePlayer = AudioUtils()
+        if (guideAudio.isNullOrEmpty())
+            HttpManager.getPlan().request(this){_,data->
+                guideAudio = data
+                if (inGuide){
+                    guidePlayer?.setVolume(0.6f)
+                    guidePlayer?.loopPlayMusic(this,data)
+                }
+            }
+        else{
+            guidePlayer?.setVolume(0.6f)
+            guidePlayer?.loopPlayMusic(this,guideAudio)
+        }
+    }
+
+    private fun startBgm() {
+        HttpManager.getHomeBackgroundMusicByUserId().request(this){_,data->
+            if (!data?.audioFile.isNullOrEmpty()){
+                if (bgPlayer == null)
+                    bgPlayer = AudioUtils()
+                val volume = SPUtils.instance().getInt(Const.User.VOLUME,50)
+                bgPlayer?.setVolume(volume.toFloat()/100)
+                bgPlayer?.loopPlayMusic(this,data?.audioFile)
+            }
+            (fragments[0] as HomeFragment).changeBg(data?.imageUrl?:"",data?.backUrl?:"")
+        }
+    }
+
+    /**
+     * 开始冥想
+     */
+    private fun startThink() {
+        bgPlayer?.pause()
+        index = 0
+        if (voice?.meditationMusicList?.isNullOrEmpty() == false){
+            if (thinkBgPlayer == null){
+                thinkBgPlayer = AudioUtils()
+                thinkBgPlayer!!.setOnAudioStatusUpdateListener(this)
+            }
+            val volume = SPUtils.instance().getInt(Const.User.VOLUME_THINK,50)
+            thinkBgPlayer?.setVolume(volume.toFloat()/100)
+            thinkBgPlayer?.startPlayMusic(this, voice?.meditationMusicList?.get(index))
+            currentDuration = voice?.meditationSecondList?.get(index)?:0
+            EventBus.getDefault().post(EmptyEvent(Const.EventCode.GOT_THINK_DURATION))
+            playing = true
+            cl_player.visible()
+            tv_player.text = voice?.meditationTitle
+            iv_player.setImageURI(voice?.coverUrl?.split(",")?.firstOrNull())
+            player_play.setImageResource(R.mipmap.player_pause)
+            thinkHandler?.sendEmptyMessage(MSG_PROGRESS)
+            startTime = System.currentTimeMillis()  //记录开始冥想的时间
+            (fragments[0] as HomeFragment).refreshTodayPlayingState() //对比当前音频是否是每日疗愈
+        }
+    }
+
+    /**
+     * 停止冥想
+     */
+    private fun finishThink(){
+        saveThinkRecord()
+        voice = null
+        index = 0
+        finishTime = 0L
+        thinkBgPlayer?.stopPlayMusic(true)
+        playing = false
+        thinkHandler?.removeMessages(0)
+        cl_player.gone()
+        (fragments[0] as HomeFragment).refreshTodayPlayingState() //对比当前音频是否是每日疗愈
+        if (XQApplication.isForeground){
+            if (isBGMChanged) //BGM已经被切换,重新播放新BGM
+                startBgm()
+            else //BGM未改变,直接续播
+                bgPlayer?.resume()
+        }
+    }
+
+    /**
+     * 保存冥想记录
+     */
+    private fun saveThinkRecord() {
+        if (voice == null||startTime == 0L||SPUtils.instance().getString(Const.User.TOKEN).isNullOrEmpty())
+            return
+        val time = ((System.currentTimeMillis() - startTime) / 1000).toInt()
+        startTime = 0L
+        HttpManager.saveViewingHistory(voice?.id?:"", time).request(this,false,{ _, _->
+            Log.e(Const.Tag,"冥想记录成功:$time 秒")
+        }){_,_->
+            Log.e(Const.Tag,"冥想记录失败:$time 秒")
         }
     }
 
@@ -55,7 +248,7 @@
     }
 
     private fun initTab() {
-        val titles = arrayListOf("首页","课程","","疗愈馆","我的")
+        val titles = arrayListOf("疗愈","课程","","疗愈馆","我的")
         val iconChecked = arrayListOf(
             R.mipmap.home_selected,
             R.mipmap.play_selected,
@@ -100,77 +293,203 @@
     }
 
     override fun onTabSelect(position: Int) {
+        if (position == 4 && SPUtils.instance().getString(Const.User.TOKEN).isNullOrEmpty()){
+            toast("请先登录")
+            startActivity<LoginActivity>()
+            tab_bar.currentTab = 0
+            return
+        }
         view_pager.currentItem = position
-        UltimateBar.with(this@MainActivity)
-            .statusDark(position != 0&&position!=1)
-            .create().immersionBar() //沉浸状态栏
-
+        if (position == 2){
+            (fragments[2] as TreeFragment).getTree()
+            if (cl_player.visibility == View.VISIBLE){
+                cl_player.alpha = 0f
+                cl_player.gone()
+            }
+        }else{
+            if (cl_player.alpha == 0f){
+                cl_player.visible()
+                cl_player.alpha = 1f
+            }
+        }
+        if (position == 4){
+            (fragments[4] as MineFragment).queryUnread()
+        }
+        if (position != 1)
+            EventBus.getDefault().post(EmptyEvent(Const.EventCode.PAUSE_TEACHER_VIDEO))
+        if (position == 0)
+            startTodayCheck()
+        else
+            stopTodayCheck()
     }
 
     override fun onTabReselect(position: Int) {
     }
 
     @Subscribe
-    fun onSwitch(e:EmptyEvent){
-        if (e.code == Const.EventCode.SWITCH_HOME){
+    fun onEvent(e:EmptyEvent){
+        if (e.code == Const.EventCode.CHANGE_USER){
             tab_bar.currentTab = 0
             onTabSelect(0)
-        }else if(e.code == Const.EventCode.CHANGE_STARTCLASS){
+            (fragments[0] as HomeFragment).refreshData()
+            checkAnswer()
+        }else if (e.code == Const.EventCode.SWITCH_HOME){
+            tab_bar.currentTab = 0
+            onTabSelect(0)
+        }else if (e.code == Const.EventCode.SWITCH_COURSE){
             tab_bar.currentTab = 1
             onTabSelect(1)
-        }else if(e.code == Const.EventCode.SWITCH_DISCOVERY){
-            tab_bar.currentTab = 2
-            onTabSelect(2)
         }else if(e.code == Const.EventCode.CHANGE_EXPLORE){
             tab_bar.currentTab = 3
             onTabSelect(3)
+        }else if(e.code == Const.EventCode.APP_FOREGROUND){
+            if (voice==null)
+                bgPlayer?.resume()
+        }else if(e.code == Const.EventCode.APP_BACKGROUND){
+            bgPlayer?.pause()
+        }else if(e.code == Const.EventCode.CHANGE_BGM){
+            if (voice == null)
+                startBgm()
+            else
+                isBGMChanged = true //正在播放疗愈,无法立即切换背景音乐
+        }else if(e.code == Const.EventCode.START_THINK){
+            startThink()
+        }else if(e.code == Const.EventCode.FINISH_THINK){
+            finishThink()
+        }else if(e.code == Const.EventCode.PAUSE_OR_RESUME_THINK){
+            player_play.callOnClick()
+        }else if(e.code == Const.EventCode.CHANGE_THINK_VOLUME){
+            val v = SPUtils.instance().getInt(Const.User.VOLUME_THINK,50)
+            thinkBgPlayer?.setVolume(v.toFloat()/100)
+        }else if(e.code == Const.EventCode.START_GUIDE_AUDIO){
+            inGuide = true
+            startGuide()
+            bgPlayer?.pause()
+            thinkBgPlayer?.pause()
+        }else if(e.code == Const.EventCode.FINISH_GUIDE_AUDIO){
+            inGuide = false
+            guidePlayer?.stopPlayMusic(false)
+            if (voice!=null&& playing){
+                thinkBgPlayer?.resume()
+            }
+            if (voice == null)
+                bgPlayer?.resume()
+        }else if(e.code == Const.EventCode.REFRESH_PRIVATE){ //重新答题后,刷新私人定制
+            (fragments[0] as HomeFragment).getPrivacy()
+        }else if(e.code == Const.EventCode.THINK_TIMER){ //开启倒计时
+            thinkHandler?.sendEmptyMessage(MSG_COUNTDOWN)
         }
     }
 
     @Subscribe
-    fun refreshUser(e:EmptyEvent){
-        if (e.code == Const.EventCode.USER_INFO_CHANGED)
-            getData()
+    fun onIntEvent(e:IntEvent){
+        if (e.code == Const.EventCode.THINK_SEEK_PROGRESS){
+            thinkBgPlayer?.seekTo(e.i)
+            player_play.callOnClick()
+        }
     }
 
-    private fun getData() {
-        HttpManager.getUserInfo().request(this){_,data->
-            homeData = data
-            homeData?.apply {
-                SPUtils.instance().put(Const.User.USER_ID,id).put(Const.User.USER_PHONE,phone).apply()
-                //判断数据是否完善
-                val isHint = SPUtils.instance().getBoolean("isHint") //true 已经提示过
-                if (!isHint && (weight.isNullOrEmpty() || birthday.isNullOrEmpty() || height.isNullOrEmpty() || height.toInt() == 0 || waistline.isNullOrEmpty()|| waistline.toInt() == 0)) {
-                    SPUtils.instance().put("isHint",true).apply()
-                    TipDialog.show(
-                        supportFragmentManager,
-                        "完善身体数据后获得更好推荐",
-                        object : TipDialog.OnClickCallback {
-                            override fun onOk() {
-                            }
-
-                            override fun onCancel() {
-                            }
-                        },
-                        "现在就去",
-                        "以后再去"
-                    )
-                }
+    @SuppressLint("HardwareIds")
+    private fun checkAnswer() {
+        val answer = SPUtils.instance().getString(Const.User.ANSWER)
+        if (!answer.isNullOrEmpty()){ //已登录并且有答案
+            val reqAnswer = Gson().fromJson(answer, ReqAnswer::class.java)
+            reqAnswer?.device = Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)
+            HttpManager.saveUserAnswers(reqAnswer).request(this,false,success = { _, _->
+                SPUtils.instance().put(Const.User.ANSWER,"").apply()
+                Log.e(Const.Tag,"私人定制已保存")
+                (fragments[0] as HomeFragment).getPrivacy()
+            }){_,_->
             }
-            EventBus.getDefault().post(EmptyEvent(Const.EventCode.REFRESH_USER_INFO))
         }
+    }
+
+
+    private fun startTodayCheck(){
+        thinkHandler?.sendEmptyMessage(MSG_TODAY)
+    }
+
+    private fun stopTodayCheck(){
+        thinkHandler?.removeMessages(MSG_TODAY)
     }
 
     override fun onResume() {
         super.onResume()
-        if (tab_bar.currentTab == 2)
-            (fragments[2] as DiscoveryFragment).getUnread()
+        if (view_pager.currentItem == 4){
+            (fragments[4] as MineFragment).queryUnread()
+        } else if (view_pager.currentItem == 0){
+            startTodayCheck()
+        } else if (view_pager.currentItem == 2){
+            (fragments[2] as TreeFragment).getTree()
+        }
+        if (isFirst&&!hasTreeFirstShow&&!SPUtils.instance().getString(Const.User.ANSWER).isNullOrEmpty()){ //如果是第一次安装并且还没显示树苗打卡引导并且答完题了 就去树苗引导
+            tab_bar.currentTab = 2
+            onTabSelect(2)
+            (fragments[2] as TreeFragment).showFirst()
+            hasTreeFirstShow = true
+        }
+        if (XQApplication.finishAnswer){
+            XQApplication.finishAnswer = false
+            tab_bar.currentTab = 2
+            onTabSelect(2)
+        }
     }
 
-
+    override fun onPause() {
+        super.onPause()
+        stopTodayCheck()
+    }
 
     override fun onDestroy() {
         super.onDestroy()
+        bgPlayer?.stopPlayMusic(false)
         EventBus.getDefault().unregister(this)
     }
+
+    override fun onUpdate(db: Double, time: Long) {
+    }
+
+    override fun onStop(filePath: String?) {
+    }
+
+    override fun onStartPlay() {
+    }
+
+    override fun onFinishPlay() {
+        if (voice == null) //说明是手动关闭的,不需要处理下一步播放逻辑
+            return
+        if (isRecycle){ //单曲
+            if (playing)
+                thinkBgPlayer?.startPlayMusic(this, voice?.meditationMusicList?.get(index))
+        }else{//顺序
+            index++
+            if (index>=voice?.meditationMusicList?.size?:0)//列表已播完
+                EventBus.getDefault().post(EmptyEvent(Const.EventCode.FINISH_THINK))
+            else{
+                currentDuration = voice?.meditationSecondList?.get(index)?:0
+                EventBus.getDefault().post(EmptyEvent(Const.EventCode.GOT_THINK_DURATION))
+                if (playing)
+                    thinkBgPlayer?.startPlayMusic(this, voice?.meditationMusicList?.get(index))
+            }
+        }
+    }
+
+    override fun onGetDuration(duration: Int) {
+
+    }
+
+    override fun onBackPressed() {
+        if (teacherVideoView?.onBackPressed() != true)
+            super.onBackPressed()
+    }
+
+    companion object{ //冥想播放相关参数
+        var playing = false //true播放中
+        var isRecycle = false //true单曲循环播放
+        var voice: VoiceDetail? = null //冥想详情
+        var index = 0 //当前播放序号
+        var currentDuration = 0 //当前音频长度(秒)
+        var currentPosition = 0L //当前音频进度(毫秒)
+        var finishTime = 0L //自动结束的时间戳
+    }
 }
\ No newline at end of file

--
Gitblit v1.7.1