From 8d72ec1b07a4fe0863b41b1140a8c0e679867b93 Mon Sep 17 00:00:00 2001
From: lmw <125975490@qq.com>
Date: 星期四, 03 四月 2025 17:44:29 +0800
Subject: [PATCH] save

---
 .idea/jarRepositories.xml                                               |    5 +
 app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt        |   31 +++++++---
 app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt             |    4 +
 build.gradle                                                            |    6 +
 app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java     |    2 
 app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt             |  100 ++++++++++++++++++++-------------
 app/src/main/java/com/sinata/xqmuse/MainActivity.kt                     |    9 ++
 app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt |    1 
 app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt            |    2 
 app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java               |   11 +++
 app/build.gradle                                                        |    5 -
 11 files changed, 114 insertions(+), 62 deletions(-)

diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 1e2d92c..d598aab 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -31,5 +31,10 @@
       <option name="name" value="MavenRepo" />
       <option name="url" value="https://repo.maven.apache.org/maven2/" />
     </remote-repository>
+    <remote-repository>
+      <option name="id" value="maven" />
+      <option name="name" value="maven" />
+      <option name="url" value="https://maven.aliyun.com/repository/jcenter/" />
+    </remote-repository>
   </component>
 </project>
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 3e6dbab..8279096 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@
         applicationId "com.sinata.xqmuse"
         minSdkVersion 23
         targetSdkVersion 30
-        versionCode 10
-        versionName "1.81"
+        versionCode 11
+        versionName "1.82"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
 
@@ -117,7 +117,6 @@
     implementation 'io.github.lucksiege:pictureselector:v2.7.0-rc02'
     implementation 'com.github.penfeizhou.android.animation:apng:2.26.0' //动画
     implementation 'com.amap.api:location:latest.integration' //定位
-
 
     //播放器
     implementation 'xyz.doikki.android.dkplayer:dkplayer-java:3.3.7'// # 必选,内部默认使用系统mediaplayer进行解码
diff --git a/app/src/main/java/com/sinata/xqmuse/MainActivity.kt b/app/src/main/java/com/sinata/xqmuse/MainActivity.kt
index 0c67e6f..2faca71 100644
--- a/app/src/main/java/com/sinata/xqmuse/MainActivity.kt
+++ b/app/src/main/java/com/sinata/xqmuse/MainActivity.kt
@@ -137,6 +137,9 @@
                     MSG_PROGRESS -> {
                         EventBus.getDefault().post(EmptyEvent(Const.EventCode.SERVICE_AUDIO_PROGRESS))
                         sendEmptyMessageDelayed(MSG_PROGRESS, 1000)
+                        if (System.currentTimeMillis() - startTime >= 60000){
+                            saveThinkRecord()
+                        }
                     }
                     MSG_COUNTDOWN -> {
                         if (System.currentTimeMillis() >= ThinkAudioService.finishTime)
@@ -273,7 +276,7 @@
         if (ThinkAudioService.voice == null||startTime == 0L||SPUtils.instance().getString(Const.User.TOKEN).isNullOrEmpty())
             return
         val time = ((System.currentTimeMillis() - startTime) / 1000).toInt()
-        startTime = 0L
+        startTime = System.currentTimeMillis()
         HttpManager.saveViewingHistory(ThinkAudioService.voice?.id ?: "", time).request(this, false, { _, _ ->
             Log.e(Const.Tag, "冥想记录成功:$time 秒")
         }){ _, _->
@@ -339,7 +342,9 @@
             startActivity<LoginActivity>()
             tab_bar.currentTab = 0
             return
-        }
+        }else
+            (fragments[4] as MineFragment).showUserInfo()
+
         view_pager.currentItem = position
         if (position == 2){
             (fragments[2] as TreeFragment).getTree()
diff --git a/app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt b/app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt
index 04c3498..024fe1e 100644
--- a/app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt
+++ b/app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt
@@ -14,6 +14,7 @@
 import com.sinata.xqmuse.network.requestByF
 import com.sinata.xqmuse.ui.course.adapter.CourseGridAdapter
 import com.sinata.xqmuse.utils.Const
+import com.sinata.xqmuse.utils.cache.ProxyVideoCacheManager
 import com.sinata.xqmuse.utils.event.EmptyEvent
 import kotlinx.android.synthetic.main.fragment_teacher.*
 import org.greenrobot.eventbus.EventBus
@@ -46,15 +47,17 @@
         webView.webViewClient = object : WebViewClient() {}
         webView.backgroundColor = 0
         webView.background.alpha = 0
-        rv_course.layoutManager = GridLayoutManager(requireContext(),2)
+        rv_course.layoutManager = GridLayoutManager(requireContext(), 2)
         rv_course.adapter = adapter
         getData()
         adapter.setOnItemClickListener { view, position ->
             showDialog()
-            HttpManager.getPayCourseInfoById(list[position].id).requestByF(this,success = { _, data->
-                dismissDialog()
-                data?.goDetail(requireContext())
-            }){_,_->
+            HttpManager.getPayCourseInfoById(list[position].id).requestByF(
+                this,
+                success = { _, data ->
+                    dismissDialog()
+                    data?.goDetail(requireContext())
+                }){ _, _->
                 dismissDialog()
             }
         }
@@ -67,22 +70,30 @@
     }
 
     private fun getData(){
-        HttpManager.getCoursePageList().requestByF(this){_,data->
+        HttpManager.getCoursePageList().requestByF(this){ _, data->
             (requireActivity() as MainActivity).teacherVideoView = mVideoView
-            mVideoView.setUrl(data?.videoUrl)
+            val cacheServer = ProxyVideoCacheManager.getProxy(context)
+            val proxyUrl = cacheServer.getProxyUrl(data?.videoUrl)
+            mVideoView.setUrl(proxyUrl)
             iv_cover.setImageURI(data?.coverUrl)
             iv_play_teacher.visible()
             val sHead =
                 "<html><head><meta name=\"viewport\" content=\"width=device-width, " + "initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes\" />" + "<style>img{max-width:100% !important;height:auto !important;}</style>" + "<style>body{max-width:100% !important;}</style>" + "</head><body>"
-            webView!!.loadDataWithBaseURL(null, sHead + data?.tutorIntroduction, "text/html", "utf-8", null)
+            webView!!.loadDataWithBaseURL(
+                null,
+                sHead + data?.tutorIntroduction,
+                "text/html",
+                "utf-8",
+                null
+            )
             list.clear()
-            list.addAll(data?.list?: arrayListOf())
+            list.addAll(data?.list ?: arrayListOf())
             adapter.notifyDataSetChanged()
         }
     }
 
     @Subscribe
-    fun pause(e:EmptyEvent){
+    fun pause(e: EmptyEvent){
         if (e.code == Const.EventCode.PAUSE_TEACHER_VIDEO)
             mVideoView.pause()
     }
diff --git a/app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt b/app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt
index 484e879..0e4991d 100644
--- a/app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt
+++ b/app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt
@@ -9,7 +9,6 @@
 import cn.sinata.xldutils.visible
 import com.google.android.exoplayer2.upstream.DataSpec
 import com.google.android.exoplayer2.upstream.RawResourceDataSource
-import com.sinata.xqmuse.MainActivity
 import com.sinata.xqmuse.R
 import com.sinata.xqmuse.ThinkAudioService
 import com.sinata.xqmuse.network.HttpManager
@@ -24,6 +23,7 @@
 import com.sinata.xqmuse.ui.login.LoginActivity
 import com.sinata.xqmuse.ui.mine.VipActivity
 import com.sinata.xqmuse.utils.Const
+import com.sinata.xqmuse.utils.cache.ProxyVideoCacheManager
 import com.sinata.xqmuse.utils.event.EmptyEvent
 import com.sinata.xqmuse.utils.interfaces.StringCallback
 import kotlinx.android.synthetic.main.fragment_home.*
@@ -38,13 +38,13 @@
     private val topMenuAdapter = TopMenuAdapter(topMenu)
     private var today:HomeItem? = null //今日冥想
     private val privacy = arrayListOf<CommonItemBean>() //私人订制
-    private val privacyAdapter by lazy { HomeBannerAdapter(privacy,requireContext()) }
+    private val privacyAdapter by lazy { HomeBannerAdapter(privacy, requireContext()) }
 
     private val list = arrayListOf<HomeListBean>()
     private val adapter = HomeAdapter(list)
 
     override fun onFirstVisibleToUser() {
-        rv_menu.layoutManager = GridLayoutManager(requireContext(),4)
+        rv_menu.layoutManager = GridLayoutManager(requireContext(), 4)
         rv_menu.adapter = topMenuAdapter
         banner_privacy.adapter = privacyAdapter
         rv_list.layoutManager = LinearLayoutManager(requireContext())
@@ -52,10 +52,12 @@
         adapter.callback = object :StringCallback{
             override fun onResult(rst: String) {
                 showDialog()
-                HttpManager.getMeditationDetails(rst).requestByF(this@HomeFragment,success = {_,data->
-                    dismissDialog()
-                    data?.goDetail(requireContext())
-                }){_,_->
+                HttpManager.getMeditationDetails(rst).requestByF(
+                    this@HomeFragment,
+                    success = { _, data ->
+                        dismissDialog()
+                        data?.goDetail(requireContext())
+                    }){ _, _->
                     dismissDialog()
                 }
             }
@@ -85,7 +87,7 @@
         tv_3.setOnClickListener {
             HttpManager.getH5(4).requestByF(this){ _, data->
                 data?.let {
-                    startActivity<H5Activity>("title" to "新手冥想指南","url" to it.content)
+                    startActivity<H5Activity>("title" to "新手冥想指南", "url" to it.content)
                 }
             }
         }
@@ -96,12 +98,18 @@
             startActivity<BGMSettingActivity>()
         }
         topMenuAdapter.setOnItemClickListener { view, position ->
-            startActivity<TypeVoiceActivity>("title" to topMenu[position].categoryName,"id" to topMenu[position].id)
+            startActivity<TypeVoiceActivity>(
+                "title" to topMenu[position].categoryName,
+                "id" to topMenu[position].id
+            )
         }
         iv_today.setOnClickListener {
             if (today!=null){
                 if (today?.isShow == 1){ //跳转播放微电影
-                    startActivity<MicroVideoActivity>("url" to today?.meditationVideo?.videoUrl,"title" to today?.meditationVideo?.title)
+                    startActivity<MicroVideoActivity>(
+                        "url" to today?.meditationVideo?.videoUrl,
+                        "title" to today?.meditationVideo?.title
+                    )
                 }else if (ThinkAudioService.voice?.id == today?.meditationId){
                     EventBus.getDefault().post(EmptyEvent(Const.EventCode.PAUSE_OR_RESUME_THINK))
                     if (ThinkAudioService.playing) //播放中
@@ -110,19 +118,22 @@
                         iv_play_today.setImageResource(R.mipmap.play)
                 }else{
                     showDialog()
-                    HttpManager.getMeditationDetails(today!!.meditationId).requestByF(this,success = {_,data->
-                        dismissDialog()
-                        if (data?.chargeType == 2&&data.isVip != 1){ //会员免费
-                            startActivity<VipActivity>()
-                        }else if (data?.chargeType == 3&&data.isBuy != 1){ //单独收费且未购买
-                            startActivity<BuyVoiceActivity>("id" to data.id)
-                        }else{
-                            if (ThinkAudioService.playing)
-                                EventBus.getDefault().post(EmptyEvent(Const.EventCode.FINISH_THINK))
-                            ThinkAudioService.voice = data
-                            EventBus.getDefault().post(EmptyEvent(Const.EventCode.START_THINK))
-                        }
-                    }){_,_->
+                    HttpManager.getMeditationDetails(today!!.meditationId).requestByF(
+                        this,
+                        success = { _, data ->
+                            dismissDialog()
+                            if (data?.chargeType == 2 && data.isVip != 1) { //会员免费
+                                startActivity<VipActivity>()
+                            } else if (data?.chargeType == 3 && data.isBuy != 1) { //单独收费且未购买
+                                startActivity<BuyVoiceActivity>("id" to data.id)
+                            } else {
+                                if (ThinkAudioService.playing)
+                                    EventBus.getDefault()
+                                        .post(EmptyEvent(Const.EventCode.FINISH_THINK))
+                                ThinkAudioService.voice = data
+                                EventBus.getDefault().post(EmptyEvent(Const.EventCode.START_THINK))
+                            }
+                        }){ _, _->
                         dismissDialog()
                     }
                 }
@@ -130,22 +141,26 @@
         }
         banner_privacy.setOnBannerListener { data, position ->
             showDialog()
-            HttpManager.getMeditationDetails(privacy[position].id).requestByF(this,success = {_,data->
-                dismissDialog()
-                data?.goDetail(requireContext())
-            }){_,_->
+            HttpManager.getMeditationDetails(privacy[position].id).requestByF(
+                this,
+                success = { _, data ->
+                    dismissDialog()
+                    data?.goDetail(requireContext())
+                }){ _, _->
                 dismissDialog()
             }
         }
         iv_pri_empty.setOnClickListener { startActivity<LoginActivity>() }
     }
 
-    fun changeBg(bg:String,video:String){
+    fun changeBg(bg: String, video: String){
         if (video.isNotEmpty()){
             iv_home.invisible()
             player.visible()
             player.release()
-            player.setUrl(video)
+            val cacheServer = ProxyVideoCacheManager.getProxy(context)
+            val proxyUrl = cacheServer.getProxyUrl(video)
+            player.setUrl(proxyUrl)
             player.setLooping(true)
             player.start()
         } else if (bg.isNotEmpty()){
@@ -173,17 +188,17 @@
     }
 
     private fun getTopMenu(){
-        HttpManager.getCategoryListByType(1).requestByF(this){_,data->
+        HttpManager.getCategoryListByType(1).requestByF(this){ _, data->
             topMenu.clear()
-            topMenu.addAll(data?: arrayListOf())
+            topMenu.addAll(data ?: arrayListOf())
             topMenuAdapter.notifyDataSetChanged()
         }
     }
 
     private fun getBottomMenu(){
-        HttpManager.getCategoryListByType(2).requestByF(this){_,data->
+        HttpManager.getCategoryListByType(2).requestByF(this){ _, data->
             adapter.menus.clear()
-            adapter.menus.addAll(data?: arrayListOf())
+            adapter.menus.addAll(data ?: arrayListOf())
             if (list.isNotEmpty()){
                 list.add(1, HomeListBean(null, arrayListOf()))
                 adapter.notifyDataSetChanged()
@@ -192,7 +207,7 @@
     }
 
     fun getToday() {
-        HttpManager.getTodayMeditation().requestByF(this){_,data->
+        HttpManager.getTodayMeditation().requestByF(this){ _, data->
             today = data
             if (data?.isShow == 0){
                 tv_1.text = "每日疗愈"
@@ -202,7 +217,9 @@
                 }else{
                     iv_daily_empty.gone()
                     iv_today.setImageURI(today?.imageUrl)
-                    tv_length_today.text = "${today?.clientMeditationVO?.meditationTitle?.ellipsize(12)} | ${"%02d:%02d".format((data?.time?:0)/60,(data?.time?:0)%60)}"
+                    tv_length_today.text = "${today?.clientMeditationVO?.meditationTitle?.ellipsize(
+                        12
+                    )} | ${"%02d:%02d".format((data?.time ?: 0) / 60, (data?.time ?: 0) % 60)}"
                     tv_today_count.text = "${(today?.clientMeditationVO?.realLearnedNum?:0)+(today?.clientMeditationVO?.virtualLearnedNum?:0)}人已参加学习"
                 }
             }else{
@@ -213,7 +230,10 @@
                 }else{
                     iv_daily_empty.gone()
                     iv_today.setImageURI(today?.meditationVideo?.imageUrl)
-                    tv_length_today.text = "${today?.meditationVideo?.title?.ellipsize(18)} | ${"%02d:%02d".format((today?.meditationVideo?.videoSecond?:0)/60,(today?.meditationVideo?.videoSecond?:0)%60)}"
+                    tv_length_today.text = "${today?.meditationVideo?.title?.ellipsize(18)} | ${"%02d:%02d".format(
+                        (today?.meditationVideo?.videoSecond ?: 0) / 60,
+                        (today?.meditationVideo?.videoSecond ?: 0) % 60
+                    )}"
                     tv_today_count.text = ""
                 }
             }
@@ -228,17 +248,17 @@
     }
 
     fun getPrivacy() {
-        HttpManager.getPersonalityPlan().requestByF(this){_,data->
+        HttpManager.getPersonalityPlan().requestByF(this){ _, data->
             privacy.clear()
-            privacy.addAll(data?: arrayListOf())
+            privacy.addAll(data ?: arrayListOf())
             privacyAdapter.notifyDataSetChanged()
         }
     }
 
     private fun getList() {
-        HttpManager.getMeditationAndCateList().requestByF(this){_,data->
+        HttpManager.getMeditationAndCateList().requestByF(this){ _, data->
             list.clear()
-            list.addAll(data?: arrayListOf())
+            list.addAll(data ?: arrayListOf())
             if (adapter.menus.isNotEmpty()){
                 list.add(1, HomeListBean(null, arrayListOf()))
                 adapter.notifyDataSetChanged()
diff --git a/app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt b/app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt
index f2f9d87..1f0c94a 100644
--- a/app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt
+++ b/app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt
@@ -36,5 +36,4 @@
             }
         }
     }
-
 }
diff --git a/app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt b/app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt
index 4fe242a..4ed3d35 100644
--- a/app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt
+++ b/app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt
@@ -98,7 +98,9 @@
         }
     }
 
-    private fun showUserInfo() {
+    fun showUserInfo() {
+        if (!isAdded)
+            return
         if (!SPUtils.instance().getString(Const.User.TOKEN).isNullOrEmpty())
             HttpManager.getUserInfo().requestByF(this){_,data->
                 userInfo = data
diff --git a/app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt b/app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt
index c900d65..a848b27 100644
--- a/app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt
+++ b/app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt
@@ -89,6 +89,8 @@
                                     Log.e(Const.Tag, e.message ?:"")
                                     toast("保存失败")
                                 }
+                            else
+                                toast("缺少文件存储权限")
                         }
                     }
                 }
diff --git a/app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java b/app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java
index 042d34c..35baa80 100644
--- a/app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java
+++ b/app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java
@@ -9,12 +9,15 @@
 import android.os.Handler;
 import android.util.Log;
 
+import com.danikula.videocache.HttpProxyCacheServer;
 import com.google.android.exoplayer2.ExoPlayer;
 import com.google.android.exoplayer2.MediaItem;
 import com.google.android.exoplayer2.PlaybackException;
 import com.google.android.exoplayer2.Player;
 import com.google.android.exoplayer2.SimpleExoPlayer;
 import com.google.android.exoplayer2.source.MediaSource;
+import com.sinata.xqmuse.utils.cache.PreloadManager;
+import com.sinata.xqmuse.utils.cache.ProxyVideoCacheManager;
 import com.sinata.xqmuse.utils.exo.ExoMediaPlayer;
 import com.sinata.xqmuse.utils.exo.ExoMediaPlayerFactory;
 
@@ -241,7 +244,9 @@
         isPause = false;
         try {
             Log.e("mmp", "开始播放 path:" + filePath);
-            MediaItem mediaItem = MediaItem.fromUri(Uri.parse(filePath));
+            HttpProxyCacheServer cacheServer = ProxyVideoCacheManager.getProxy(context);
+            String proxyUrl = cacheServer.getProxyUrl(filePath);
+            MediaItem mediaItem = MediaItem.fromUri(Uri.parse(proxyUrl));
             mMediaPlayer.setMediaItem(mediaItem);
             mMediaPlayer.prepare();
             mMediaPlayer.play();
@@ -286,7 +291,9 @@
         isPause = false;
         try {
             Log.e("mmp", "循环播放 path:" + filePath);
-            MediaItem mediaItem = MediaItem.fromUri(Uri.parse(filePath));
+            HttpProxyCacheServer cacheServer = ProxyVideoCacheManager.getProxy(context);
+            String proxyUrl = cacheServer.getProxyUrl(filePath);
+            MediaItem mediaItem = MediaItem.fromUri(Uri.parse(proxyUrl));
             mMediaPlayer.setMediaItem(mediaItem);
             mMediaPlayer.prepare();
             mMediaPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);
diff --git a/app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java b/app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java
index f4371d8..2b599f2 100644
--- a/app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java
+++ b/app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java
@@ -44,7 +44,7 @@
     /**
      * 预加载的大小,每个视频预加载1M,这个参数可根据实际情况调整
      */
-    public static final int PRELOAD_LENGTH = 1024 * 1024;
+    public static final int PRELOAD_LENGTH = 5 * 1024 * 1024;
 
     private PreloadManager(Context context) {
         mHttpProxyCacheServer = ProxyVideoCacheManager.getProxy(context);
diff --git a/build.gradle b/build.gradle
index 8445697..2844087 100644
--- a/build.gradle
+++ b/build.gradle
@@ -7,7 +7,8 @@
     ext.retrofit_version = '2.3.0'
     repositories {
         google()
-        jcenter()
+        mavenCentral()
+        maven { url 'https://maven.aliyun.com/repository/jcenter/' }
         maven { url 'https://jitpack.io' }
     }
     dependencies {
@@ -22,7 +23,8 @@
 allprojects {
     repositories {
         google()
-        jcenter()
+        mavenCentral()
+        maven { url 'https://maven.aliyun.com/repository/jcenter/' }
         maven { url 'https://jitpack.io' }
         // 支付宝 SDK AAR 包所需的配置
         flatDir {

--
Gitblit v1.7.1