lmw
2025-04-03 8d72ec1b07a4fe0863b41b1140a8c0e679867b93
save
11个文件已修改
102 ■■■■ 已修改文件
.idea/jarRepositories.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/sinata/xqmuse/MainActivity.kt 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/sinata/xqmuse/ui/course/TeacherFragment.kt 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/sinata/xqmuse/ui/home/HomeFragment.kt 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/sinata/xqmuse/ui/mine/MineFragment.kt 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/sinata/xqmuse/utils/AudioUtils.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/sinata/xqmuse/utils/cache/PreloadManager.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
build.gradle 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.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>
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进行解码
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()
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
@@ -51,7 +52,9 @@
        getData()
        adapter.setOnItemClickListener { view, position ->
            showDialog()
            HttpManager.getPayCourseInfoById(list[position].id).requestByF(this,success = { _, data->
            HttpManager.getPayCourseInfoById(list[position].id).requestByF(
                this,
                success = { _, data ->
                dismissDialog()
                data?.goDetail(requireContext())
            }){_,_->
@@ -69,12 +72,20 @@
    private fun getData(){
        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())
            adapter.notifyDataSetChanged()
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.*
@@ -52,7 +52,9 @@
        adapter.callback = object :StringCallback{
            override fun onResult(rst: String) {
                showDialog()
                HttpManager.getMeditationDetails(rst).requestByF(this@HomeFragment,success = {_,data->
                HttpManager.getMeditationDetails(rst).requestByF(
                    this@HomeFragment,
                    success = { _, data ->
                    dismissDialog()
                    data?.goDetail(requireContext())
                }){_,_->
@@ -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,7 +118,9 @@
                        iv_play_today.setImageResource(R.mipmap.play)
                }else{
                    showDialog()
                    HttpManager.getMeditationDetails(today!!.meditationId).requestByF(this,success = {_,data->
                    HttpManager.getMeditationDetails(today!!.meditationId).requestByF(
                        this,
                        success = { _, data ->
                        dismissDialog()
                        if (data?.chargeType == 2&&data.isVip != 1){ //会员免费
                            startActivity<VipActivity>()
@@ -118,7 +128,8 @@
                            startActivity<BuyVoiceActivity>("id" to data.id)
                        }else{
                            if (ThinkAudioService.playing)
                                EventBus.getDefault().post(EmptyEvent(Const.EventCode.FINISH_THINK))
                                    EventBus.getDefault()
                                        .post(EmptyEvent(Const.EventCode.FINISH_THINK))
                            ThinkAudioService.voice = data
                            EventBus.getDefault().post(EmptyEvent(Const.EventCode.START_THINK))
                        }
@@ -130,7 +141,9 @@
        }
        banner_privacy.setOnBannerListener { data, position ->
            showDialog()
            HttpManager.getMeditationDetails(privacy[position].id).requestByF(this,success = {_,data->
            HttpManager.getMeditationDetails(privacy[position].id).requestByF(
                this,
                success = { _, data ->
                dismissDialog()
                data?.goDetail(requireContext())
            }){_,_->
@@ -145,7 +158,9 @@
            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()){
@@ -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 = ""
                }
            }
app/src/main/java/com/sinata/xqmuse/ui/home/adapter/VoiceGridAdapter.kt
@@ -36,5 +36,4 @@
            }
        }
    }
}
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
app/src/main/java/com/sinata/xqmuse/ui/mine/ShareActivity.kt
@@ -89,6 +89,8 @@
                                    Log.e(Const.Tag, e.message ?:"")
                                    toast("保存失败")
                                }
                            else
                                toast("缺少文件存储权限")
                        }
                    }
                }
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);
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);
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 {