[media]
[video 收束]
This commit is contained in:
yangyakun
2025-07-22 17:44:00 +08:00
parent 163bd8f9d0
commit 03963e18f3
31 changed files with 241 additions and 200 deletions

View File

@@ -25,7 +25,7 @@ import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.mogo.och.charter.passenger.R
import com.mogo.och.charter.passenger.utils.FullVideoUtils
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.skin.widget.SkinImageView
import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack
import com.shuyu.gsyvideoplayer.utils.GSYVideoType

View File

@@ -8,7 +8,6 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.main.MainMoGoApplication
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
@@ -19,11 +18,10 @@ import com.mogo.och.charter.passenger.ui.softcontrol.layoutmanage.CarouselLayout
import com.mogo.och.charter.passenger.ui.softcontrol.layoutmanage.CarouselZoomPostLayoutListener
import com.mogo.och.charter.passenger.ui.softcontrol.layoutmanage.CenterScrollListener
import com.mogo.och.charter.passenger.ui.video.adapter.RecyclerVideoAdapter
import com.mogo.och.common.module.wigets.media.IMediaDataSourceListener
import com.mogo.och.common.module.wigets.media.MediaDataSourceManager
import com.mogo.och.common.module.wigets.media.MediaFileCacheManager
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.common.module.wigets.media.MediaPlayLogger
import com.mogo.och.common.module.biz.media.IVideoListener
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
import kotlinx.android.synthetic.main.charter_p_video_fragment.view.rvVideoPlaylist
import kotlin.math.floor
@@ -80,7 +78,7 @@ class VideoView @JvmOverloads constructor(
}
}
prePlayerPosition = centerItemPosition
MediaPlayLogger.printInfoLog("pageSelect, currentPosition=$prePlayerPosition")
OchChainLogManager.writeChainLogMedia("Info", "pageSelect, currentPosition=$prePlayerPosition")
}
override fun pageStop() {
@@ -122,11 +120,11 @@ class VideoView @JvmOverloads constructor(
override fun onAttachedToWindow() {
super.onAttachedToWindow()
MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext)
MediaDataSourceManager.init(TAG, object : IMediaDataSourceListener {
MediaManager.Video.createCacheFileDir()
MediaManager.addListener(TAG,object :IVideoListener{
override fun onMediaDataSourceChanged(list: List<MediaItem>) {
val isNewData = mediaList.isNotEmpty()
MediaPlayLogger.printInfoLog("onMediaDataSourceChangedisNewData=$isNewData, dataSize=${list.size}, list=${GsonUtils.toJson(list)}")
OchChainLogManager.writeChainLogMedia("Info", "onMediaDataSourceChangedisNewData=$isNewData, dataSize=${list.size}, list=${GsonUtils.toJson(list)}")
val localMediaList = mutableListOf<TaxiPassengerVideoPlay>()
list.forEach {
val taxiPassengerVideoPlay = TaxiPassengerVideoPlay(
@@ -140,17 +138,18 @@ class VideoView @JvmOverloads constructor(
if (isNewData) {
if (!isVisible) {
updateMediaListDataAndView(localMediaList)
MediaPlayLogger.printInfoLog("onMediaDataSourceChanged, 宣传视频数据已更新")
OchChainLogManager.writeChainLogMedia("Info", "onMediaDataSourceChanged, 宣传视频数据已更新")
} else {
mNewMediaList.clear()
mNewMediaList.addAll(localMediaList)
}
} else {
updateMediaListDataAndView(localMediaList)
MediaPlayLogger.printInfoLog("onMediaDataSourceChanged, 宣传视频数据已更新")
OchChainLogManager.writeChainLogMedia("Info", "onMediaDataSourceChanged, 宣传视频数据已更新")
}
}
})
MediaManager.Video.init()
}
private fun updateMediaListDataAndView(newList: MutableList<TaxiPassengerVideoPlay>) {
@@ -169,7 +168,8 @@ class VideoView @JvmOverloads constructor(
}
override fun onDetachedFromWindow() {
MediaDataSourceManager.unInit(TAG)
MediaManager.Video.unInit()
MediaManager.removeListener(TAG)
super.onDetachedFromWindow()
}
@@ -193,7 +193,7 @@ class VideoView @JvmOverloads constructor(
if (mNewMediaList.isNotEmpty()) {
updateMediaListDataAndView(mNewMediaList)
mNewMediaList.clear()
MediaPlayLogger.printInfoLog("onVisibilityChanged, 宣传视频数据已更新")
OchChainLogManager.writeChainLogMedia("Info", "onVisibilityChanged, 宣传视频数据已更新")
}
} catch (e: Exception) {
e.printStackTrace()

View File

@@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.mogo.och.common.module.wigets.media.MediaItem;
import com.mogo.och.common.module.biz.media.data.MediaItem;
import com.mogo.och.common.module.wigets.toast.ToastCharterUtils;
import com.mogo.och.charter.passenger.R;
import com.mogo.och.charter.passenger.bean.TaxiPassengerVideoPlay;

View File

@@ -2,4 +2,17 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mogo.och.biz">
<application>
<activity
android:name="com.mogo.och.biz.media.video.MediaPlayerActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize"
android:enabled="true"
android:exported="true"
android:resizeableActivity="false"
android:resumeWhilePausing="true"
android:screenOrientation="landscape"
android:stateNotNeeded="true"
android:theme="@style/Main"
android:windowSoftInputMode="adjustPan|stateHidden" />
</application>
</manifest>

View File

@@ -3,16 +3,23 @@ package com.mogo.och.biz.media
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.function.call.base.CallerBase
import com.mogo.eagle.core.function.main.MainMoGoApplication
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils
import com.mogo.och.biz.media.audition.AuditionManager
import com.mogo.och.biz.media.tts.VoiceIn
import com.mogo.och.biz.media.tts.VoiceOut
import com.mogo.och.biz.media.video.MediaDataSourceManager
import com.mogo.och.biz.media.video.MediaPlayerActivity
import com.mogo.och.biz.media.video.VideoPlayerFragment
import com.mogo.och.common.module.biz.media.IVideoListener
import com.mogo.och.common.module.biz.media.MediaService
import com.mogo.och.common.module.biz.media.MusicDataChangeListener
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.biz.media.data.MusicData
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.biz.media.video.MediaFileCacheManager
import com.mogo.tts.base.IMogoTTSCallback
import com.mogo.tts.base.LangTtsEntity
@@ -57,6 +64,12 @@ class MediaProvider : MediaService, CallerBase<IVideoListener>() {
}
}
fun invokeMediaDataChange(newDataList: List<MediaItem>) {
M_LISTENERS.forEach {
it.value.onMediaDataSourceChanged(newDataList)
}
}
override fun setTTSFocusChange(speaking: Boolean) {
AudioFocusManager.setTTSFocusChange(speaking)
}
@@ -136,6 +149,26 @@ class MediaProvider : MediaService, CallerBase<IVideoListener>() {
VoiceOut.showNoticeOut(notice)
}
override fun startSecondAds() {
MultiDisplayUtils.startActWithSecond(ActivityUtils.getTopActivity(), MediaPlayerActivity::class.java)
}
override fun getAdFragment(): VideoPlayerFragment {
return VideoPlayerFragment()
}
override fun createCacheFileDir() {
MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext)
}
override fun initMediaData() {
MediaDataSourceManager.init()
}
override fun unInitMediaData() {
MediaDataSourceManager.unInit()
}
override fun stopTTs() {
VoiceIn.stopCurrentTts()
}

View File

@@ -3,6 +3,7 @@ package com.mogo.och.biz.media
import android.annotation.SuppressLint
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.constant.OchCommonConst
object MediaServiceManager {
@@ -13,6 +14,12 @@ object MediaServiceManager {
private var mediaService: MediaProvider? =
ARouter.getInstance().build(OchCommonConst.BIZ_Media).navigation() as MediaProvider
fun invokeMediaSourceDataChange(newDataList: List<MediaItem>) {
mediaService?.invokeMediaDataChange(newDataList)
}
fun invokeCreateCacheFileDir() {
mediaService?.createCacheFileDir()
}
}

View File

@@ -15,8 +15,8 @@ import com.mogo.och.common.module.biz.media.data.MusicData
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager.EVENT_KEY_INFE_WITH_MUSIC
import com.mogo.och.common.module.utils.FileUtils
import com.mogo.och.common.module.wigets.media.MediaBeanManager
import com.mogo.och.common.module.wigets.media.MediaPlayLogger
import com.mogo.och.biz.media.video.MediaBeanManager
import com.mogo.och.biz.media.video.MediaPlayLogger
import java.io.File
import java.io.FileOutputStream
import java.io.IOException

View File

@@ -1,10 +1,11 @@
package com.mogo.och.common.module.wigets.media
package com.mogo.och.biz.media.video
import com.google.gson.reflect.TypeToken
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.Vehicle
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.biz.media.data.MusicData
object MediaBeanManager {
@@ -72,56 +73,13 @@ object MediaBeanManager {
}
}
data class MediaDataWithVehicleList(val musicDataWithEnvList: MutableList<MediaDataWithVehicle>) {
}
data class MediaDataWithVehicle(
val B1: B1,
val B2: B2,
val T1T2: T1T2,
val M1: M1,
val B1: MediaVehicle,
val B2: MediaVehicle,
val T1T2: MediaVehicle,
val M1: MediaVehicle,
)
data class B1(val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
data class B2(val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
data class T1T2(val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
data class M1(val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
data class MediaBean(
val medias: MutableList<MediaItem>,
val musics: MutableList<MusicData>,
)
data class MediaItem(
var priority: Int,
var fileUrl: String,
var fileType: Int,
var coverImageUrl: String,
var title: String,
val isTemp: Boolean = false
) {
companion object {
const val MEDIA_TYPE_IMAGE = 1
const val MEDIA_TYPE_VIDEO = 2
const val PriorityConfi = 2
const val PriorityAd = 1
const val PrioritySite = 0
// 站点优先级 0
// 广告优先级 1
// 本地配置是 2
}
fun isImageType(): Boolean {
return this.fileType == MEDIA_TYPE_IMAGE
}
fun isVideoType(): Boolean {
return this.fileType == MEDIA_TYPE_VIDEO
}
data class MediaVehicle (val medias: MutableList<MediaItem>, val musics: MutableList<MusicData>)
}

View File

@@ -1,31 +1,30 @@
package com.mogo.och.common.module.wigets.media
package com.mogo.och.biz.media.video
import android.annotation.SuppressLint
import android.content.Context
import android.text.TextUtils
import com.google.gson.reflect.TypeToken
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.debug.DebugConfig
import com.mogo.commons.env.ProjectUtils
import com.mogo.eagle.core.data.BaseData
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.NetworkUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.biz.media.MediaServiceManager
import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.biz.media.data.MediaItem.Companion.MEDIA_TYPE_IMAGE
import com.mogo.och.common.module.biz.media.data.MediaItem.Companion.MEDIA_TYPE_VIDEO
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.network.OchCommonSubscribeImpl
import com.mogo.och.common.module.network.interceptor.transformTry
import com.mogo.och.common.module.wigets.media.MediaItem.Companion.MEDIA_TYPE_IMAGE
import com.mogo.och.common.module.wigets.media.MediaItem.Companion.MEDIA_TYPE_VIDEO
import io.reactivex.Observable
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Query
import java.util.concurrent.ConcurrentHashMap
/**
* 广告视频数据源 管理类
@@ -64,23 +63,19 @@ object MediaDataSourceManager {
private var mHasEverGetMediaDataFromMis = false
private val mMediaDataSourceListenerMap: ConcurrentHashMap<String, IMediaDataSourceListener> =
ConcurrentHashMap()
private val getAdDataSourceLoopRunnable = Runnable {
startGetMediaDataSourceLoop()
}
fun init(tag: String, dataSourceListener: IMediaDataSourceListener) {
if (!mMediaDataSourceListenerMap.containsKey(tag)) {
mMediaDataSourceListenerMap[tag] = dataSourceListener
}
fun init() {
MediaPlayLogger.printInfoLog("init, 初始化环境 isSassProject=${ProjectUtils.isSaas()}")
if (ProjectUtils.isSaas()||ProjectUtils.isDali()) {
if(ProjectUtils.isSaas()){
mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getEagleMisUrl()).create(IMediaNetworkApi::class.java)
mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getEagleMisUrl()).create(
IMediaNetworkApi::class.java)
}else if(ProjectUtils.isDali()){
mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(IMediaNetworkApi::class.java)
mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(
IMediaNetworkApi::class.java)
}
MediaPlayLogger.printInfoLog("init, 开始检查后台配置数据")
startGetMediaDataSourceLoop()
@@ -92,12 +87,9 @@ object MediaDataSourceManager {
}
}
fun unInit(tag: String) {
fun unInit() {
MediaPlayLogger.printInfoLog("unInit")
removeGetMediaDataSourceLoop()
if (mMediaDataSourceListenerMap.containsKey(tag)) {
mMediaDataSourceListenerMap.remove(tag)
}
mLastMediaDataSourceList.clear()
}
@@ -226,19 +218,12 @@ object MediaDataSourceManager {
private fun updateMediaDataSource(newDataList: List<MediaItem>) {
mLastMediaDataSourceList.clear()
mLastMediaDataSourceList.addAll(newDataList)
mMediaDataSourceListenerMap.forEach {
val listener = it.value
listener.onMediaDataSourceChanged(newDataList)
}
MediaServiceManager.invokeMediaSourceDataChange(newDataList)
MediaPlayLogger.printInfoLog("下发新MediaData给监听者dataSize=${newDataList.size}")
}
}
interface IMediaDataSourceListener {
fun onMediaDataSourceChanged(list: List<MediaItem>)
}
interface IMediaNetworkApi {
@Headers("Content-type:application/json;charset=UTF-8")
@GET("/platform/biz/adv/screen/advs")

View File

@@ -1,10 +1,9 @@
package com.mogo.och.common.module.wigets.media
package com.mogo.och.biz.media.video
import android.content.Context
import android.os.Environment
import android.text.TextUtils
import android.util.Log
import com.mogo.eagle.core.utilcode.download.DownloadUtils
import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener
import com.mogo.eagle.core.utilcode.util.EncryptUtils
import com.mogo.och.common.module.manager.download.DownloadManager
@@ -59,7 +58,7 @@ object MediaFileCacheManager {
* 获取文件缓存的缓存path, 文件名以base64编码避免 中文命名重复文件名的影响
*/
fun getCacheFileFullPathByUrl(context: Context, mediaUrl: String): String {
return getFileCacheDir(context) +File.separator +getCacheFileName(mediaUrl)
return getFileCacheDir(context) +File.separator + getCacheFileName(mediaUrl)
}
/**

View File

@@ -1,7 +1,5 @@
package com.mogo.och.common.module.wigets.media
package com.mogo.och.biz.media.video
import AdvanceImageView
import AdvanceVideoView
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
@@ -13,8 +11,9 @@ import androidx.viewpager.widget.ViewPager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.CountDownTimer
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.wigets.media.MediaLoopPlayView.Companion.IMAGE_COUNT_DOWN_SECONDS
import com.mogo.och.common.module.wigets.media.MediaLoopPlayView.Companion.TAG
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.biz.media.video.MediaLoopPlayView.Companion.IMAGE_COUNT_DOWN_SECONDS
import com.mogo.och.biz.media.video.MediaLoopPlayView.Companion.TAG
import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack
class MediaLoopPlayView @JvmOverloads constructor(
@@ -93,7 +92,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
fun setMediaData(list: MutableList<MediaItem>) {
if (list.isEmpty()) {
MediaPlayLogger.printInfoLog( "setMediaData, list为空")
MediaPlayLogger.printInfoLog("setMediaData, list为空")
return
}
@@ -162,7 +161,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
videoView.initVideoUrlData(item.fileUrl, item.coverImageUrl,item.priority,item.isTemp)
mItemViewList.add(videoView)
} else {
MediaPlayLogger.printErrorLog( "addItemView 不支持的文件类型:${item.fileType}")
MediaPlayLogger.printErrorLog("addItemView 不支持的文件类型:${item.fileType}")
}
}
@@ -340,7 +339,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
}
override fun onFinish() {
MediaPlayLogger.printInfoLog( "mImageCountDownTimer, 倒计时${IMAGE_COUNT_DOWN_SECONDS}秒, onFinish")
MediaPlayLogger.printInfoLog("mImageCountDownTimer, 倒计时${IMAGE_COUNT_DOWN_SECONDS}秒, onFinish")
playNextItemView(false)
}
}.start()
@@ -404,7 +403,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
}
fun setPause() {
MediaPlayLogger.printInfoLog("${MediaLoopPlayView.TAG}, setPause")
MediaPlayLogger.printInfoLog("$TAG, setPause")
if (mItemViewList.size <= 0) {
return
}
@@ -418,7 +417,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter
}
fun setResume() {
MediaPlayLogger.printInfoLog("${MediaLoopPlayView.TAG}, setResume")
MediaPlayLogger.printInfoLog("$TAG, setResume")
if (mItemViewList.size <= 0) {
return
}

View File

@@ -1,9 +1,10 @@
package com.mogo.och.common.module.wigets.media
package com.mogo.och.biz.media.video
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.mogo.commons.utils.MogoAnalyticUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -32,13 +33,7 @@ object MediaPlayLogger {
*/
private fun trackEvent(level: String, msg: String) {
ProcessLifecycleOwner.get().lifecycleScope.launch(Dispatchers.IO) {
val map: MutableMap<String, Any> = HashMap()
map["level"] = level
map["msg"] = msg
MogoAnalyticUtils.track(
MEDIA_PLAY_PROCESS_KEY_NODE_LOG,
map
)
OchChainLogManager.writeChainLogMedia(level,msg)
}
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.common.module.wigets.media
package com.mogo.och.biz.media.video
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

View File

@@ -1,3 +1,5 @@
package com.mogo.och.biz.media.video
import android.content.Context
import android.graphics.Bitmap
import android.media.AudioManager
@@ -21,10 +23,7 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.mogo.och.common.module.utils.CustomManager
import com.mogo.och.common.module.R
import com.mogo.och.common.module.wigets.media.MediaFileCacheManager
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.common.module.wigets.media.MediaLoopPlayView
import com.mogo.och.common.module.wigets.media.MediaPlayLogger
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.skin.utils.SkinResources
import com.mogo.skin.widget.SkinImageView
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder

View File

@@ -1,4 +1,4 @@
package com.mogo.och.common.module.wigets.media
package com.mogo.och.biz.media.video
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.mvp.Presenter
@@ -8,16 +8,18 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.R
import com.mogo.och.biz.R
import com.mogo.och.biz.media.MediaServiceManager
import com.mogo.och.common.module.biz.media.IVideoListener
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.manager.download.DownloadManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.utils.RxUtils
import com.shuyu.gsyvideoplayer.GSYVideoManager
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.fragment_video_player.acb_add_site_video
import kotlinx.android.synthetic.main.fragment_video_player.imageVideoRotationView
import kotlinx.android.synthetic.main.biz_fragment_video_player.acb_add_site_video
import kotlinx.android.synthetic.main.biz_fragment_video_player.imageVideoRotationView
/**
* @author: wangmingjun
@@ -33,7 +35,7 @@ class VideoPlayerFragment :
private var arrayListOf = mutableListOf<MediaItem>()
override fun getLayoutId(): Int {
return R.layout.fragment_video_player
return R.layout.biz_fragment_video_player
}
override fun createPresenter(): MediaPlayerPresenter {
@@ -52,33 +54,34 @@ class VideoPlayerFragment :
setHightPriorityMediaItem(siteList)
}
MediaManager.addListener(TAG,this)
MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext)
MediaDataSourceManager.init(TAG, object : IMediaDataSourceListener {
override fun onMediaDataSourceChanged(list: List<MediaItem>) {
val isNewData = arrayListOf.isNotEmpty()
CallerLogger.d(
TAG, "onMediaDataSourceChangedisNewData=$isNewData, list=${GsonUtils.toJson(list)}"
)
arrayListOf.clear()
arrayListOf.addAll(list)
UiThreadHandler.post {
if (isNewData) {
imageVideoRotationView?.setNewMediaData(arrayListOf)
} else {
imageVideoRotationView?.setMediaData(arrayListOf)
}
}
MediaServiceManager.invokeCreateCacheFileDir()
MediaDataSourceManager.init()
}
override fun onMediaDataSourceChanged(list: List<MediaItem>) {
val isNewData = arrayListOf.isNotEmpty()
CallerLogger.d(
TAG,
"onMediaDataSourceChangedisNewData=$isNewData, list=${GsonUtils.toJson(list)}"
)
arrayListOf.clear()
arrayListOf.addAll(list)
UiThreadHandler.post {
if (isNewData) {
imageVideoRotationView?.setNewMediaData(arrayListOf)
} else {
imageVideoRotationView?.setMediaData(arrayListOf)
}
})
}
}
fun setHightPriorityMediaItem(list: MutableList<MediaItem>){
context?.let {context->
val cacheList = list.filter {
if(!MediaFileCacheManager.isLocalCacheFileExists(context,it.fileUrl)){
if(!MediaFileCacheManager.isLocalCacheFileExists(context, it.fileUrl)){
DownloadManager.downloadVideoFile(it.fileUrl,null)
}
MediaFileCacheManager.isLocalCacheFileExists(context,it.fileUrl)
MediaFileCacheManager.isLocalCacheFileExists(context, it.fileUrl)
}
ThreadUtils.runOnUiThread {
imageVideoRotationView.setsetHightPriorityMediaItem(cacheList.toMutableList())
@@ -99,7 +102,7 @@ class VideoPlayerFragment :
}
override fun onDestroy() {
MediaDataSourceManager.unInit(TAG)
MediaDataSourceManager.unInit()
GSYVideoManager.releaseAllVideos()
MediaManager.removeListener(TAG)
super.onDestroy()

View File

@@ -4,7 +4,7 @@
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- 图片或视频广告-->
<com.mogo.och.common.module.wigets.media.MediaLoopPlayView
<com.mogo.och.biz.media.video.MediaLoopPlayView
android:id="@+id/imageVideoRotationView"
android:layout_width="match_parent"
android:layout_height="match_parent" />

View File

@@ -45,7 +45,6 @@ import com.mogo.och.common.module.biz.order.OrderManager
import com.mogo.och.common.module.debug.location.MogoLocationExit
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.view.DebugFloatWindow
import com.mogo.och.common.module.wigets.media.MediaBeanManager
import com.zhjt.mogo.adas.data.bean.AutopilotStatistics
import mogo.telematics.pad.MessagePad
import mogo_msg.MogoReportMsg
@@ -78,7 +77,6 @@ object DebugDataDispatch {
const val scanner = "scanner"
const val ota = "ota"
const val video = "video"
const val mediaMusic = "mediaAndMusic"
const val vlmMessage = "vlmMessage"
const val vlmImage = "vlmImage"
const val pncAction = "pncAction"
@@ -148,11 +146,6 @@ object DebugDataDispatch {
CallerVlmManager.invokeVllmImage(time.toDouble(),byteArray)
}
}
mediaMusic -> {
val musicList = MediaBeanManager.getMusicList()
val mediaList = MediaBeanManager.getMediaList()
CallerLogger.d(TAG,"${mediaList}\n${musicList}")
}
video -> {
val ota = intent.getIntExtra("video",0)
// rtmp://video.zhidaozhixing.com/live/861130041693196C_2

View File

@@ -1,17 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mogo.och.common.module">
<application>
<activity
android:name=".wigets.media.MediaPlayerActivity"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize"
android:enabled="true"
android:exported="true"
android:resizeableActivity="false"
android:resumeWhilePausing="true"
android:screenOrientation="landscape"
android:stateNotNeeded="true"
android:theme="@style/Main"
android:windowSoftInputMode="adjustPan|stateHidden" />
</application>
</manifest>

View File

@@ -1,16 +1,18 @@
package com.mogo.och.common.module.biz.media
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.biz.media.data.MusicData
import com.mogo.och.common.module.wigets.media.MediaItem
interface IVideoListener {
fun diapatchMedia(list :MutableList<MediaItem>)
fun diapatchMedia(list :MutableList<MediaItem>){}
fun setMediaPause(){}
fun setMediaResume(){}
fun onMediaDataSourceChanged(list: List<MediaItem>){}
}
interface MusicDataChangeListener{

View File

@@ -1,9 +1,10 @@
package com.mogo.och.common.module.biz.media
import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.biz.media.data.MusicData
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.tts.base.IMogoTTSCallback
import com.mogo.tts.base.LangTtsEntity
@@ -91,6 +92,27 @@ object MediaManager {
}
object Video{
fun startSecondAds(){
mediaService?.startSecondAds()
}
fun getAdFragment(): Fragment? {
return mediaService?.getAdFragment()
}
fun createCacheFileDir() {
mediaService?.createCacheFileDir()
}
fun init() {
mediaService?.initMediaData()
}
fun unInit() {
mediaService?.unInitMediaData()
}
}
object Tts{
fun loadOuttts(){

View File

@@ -1,8 +1,9 @@
package com.mogo.och.common.module.biz.media
import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.facade.template.IProvider
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.biz.media.data.MusicData
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.tts.base.IMogoTTSCallback
import com.mogo.tts.base.LangTtsEntity
@@ -58,4 +59,14 @@ interface MediaService : IProvider {
fun showNoticeOut(notice: String?)
fun startSecondAds()
fun getAdFragment() :Fragment
fun createCacheFileDir()
fun initMediaData()
fun unInitMediaData()
}

View File

@@ -0,0 +1,33 @@
package com.mogo.och.common.module.biz.media.data
data class MediaItem(
var priority: Int,
var fileUrl: String,
var fileType: Int,
var coverImageUrl: String,
var title: String,
val isTemp: Boolean = false
) {
companion object {
const val MEDIA_TYPE_IMAGE = 1
const val MEDIA_TYPE_VIDEO = 2
const val PriorityConfi = 2
const val PriorityAd = 1
const val PrioritySite = 0
// 站点优先级 0
// 广告优先级 1
// 本地配置是 2
}
fun isImageType(): Boolean {
return this.fileType == MEDIA_TYPE_IMAGE
}
fun isVideoType(): Boolean {
return this.fileType == MEDIA_TYPE_VIDEO
}
}

View File

@@ -68,6 +68,11 @@ object OchChainLogManager {
const val EVENT_KEY_INFO_BRIDGE = "analytics_event_och_bridge"
const val EVENT_KEY_INFO_MEDIA = "analytics_event_och_media"
fun writeChainLogMedia(title: String,info: String) {
writeChainLog(title, info, true, EVENT_KEY_INFO_MEDIA)
}
fun writeCHainLogBridge(title: String,info: String) {
writeChainLog(title, info, false, EVENT_KEY_INFO_BRIDGE)

View File

@@ -3,6 +3,7 @@ package com.mogo.och.shuttle.weaknet.passenger.ui
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.fragment.app.Fragment
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.function.call.hmi.CallerRoadV2NEventWindowListenerManager
@@ -17,7 +18,6 @@ import com.mogo.och.common.module.manager.transform.OchTransform
import com.mogo.och.common.module.manager.transform.OchTransformDispatch
import com.mogo.och.shuttle.weaknet.passenger.R
import com.mogo.och.shuttle.weaknet.passenger.presenter.PM2Presenter
import com.mogo.och.common.module.wigets.media.VideoPlayerFragment
import com.mogo.och.shuttle.weaknet.passenger.ui.line.PM2DrivingInfoFragment
import com.mogo.och.shuttle.weaknet.passenger.ui.map.PM2HPMapFragment
import com.mogo.och.shuttle.weaknet.passenger.ui.mind.AIMessageManager
@@ -40,7 +40,7 @@ class PM2BaseFragment :
private var drivingFragment: PM2DrivingInfoFragment? = null
private var hdMapFragment: PM2HPMapFragment? = null
private var mediaFragment: VideoPlayerFragment? = null
private var mediaFragment: Fragment? = null
// 视频直播流
private val ochTransform = object : OchTransformDispatch {
@@ -99,7 +99,9 @@ class PM2BaseFragment :
childFragmentManager.beginTransaction().add(R.id.hd_map_fragment, hdMapFragment!!)
.show(hdMapFragment!!).commitAllowingStateLoss()
if (mediaFragment == null) mediaFragment = VideoPlayerFragment()
if (mediaFragment == null) {
mediaFragment = MediaManager.Video.getAdFragment()
}
childFragmentManager.beginTransaction().add(R.id.video_fragment, mediaFragment!!)
.show(mediaFragment!!).commitAllowingStateLoss()

View File

@@ -6,13 +6,10 @@ import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.ActivityUtils
import com.mogo.eagle.core.utilcode.util.DeviceUtils
import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.biz.provider.CommonServiceImpl
import com.mogo.och.common.module.wigets.media.MediaPlayerActivity
import com.mogo.och.shuttle.weaknet.passenger.model.TicketModel
import com.mogo.och.shuttle.weaknet.passenger.ui.widget.BusPStatusBarView
import com.mogo.och.shuttle.weaknet.passenger.ui.BusPassengerRouteFragment
@@ -49,7 +46,7 @@ class ShuttlePassengerProvider : CommonServiceImpl() {
override fun getFragment(): Fragment {
if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) && DeviceUtils.isEB5Model()) {
MultiDisplayUtils.startActWithSecond(ActivityUtils.getTopActivity(), MediaPlayerActivity::class.java)
MediaManager.Video.startSecondAds()
}
if(mPM2Fragment==null){
mPM2Fragment = if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) {

View File

@@ -25,6 +25,7 @@ import com.mogo.och.bridge.autopilot.location.OchLocationManager
import com.mogo.och.bridge.distance.IDistanceListener
import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager
import com.mogo.och.common.module.biz.birdge.BridgeManager
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.constant.OchCommonConst
import com.mogo.och.common.module.manager.download.DownloadManager
import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager
@@ -37,7 +38,6 @@ import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg
import com.mogo.och.common.module.network.OchCommonServiceCallback
import com.mogo.och.common.module.utils.DateTimeUtil
import com.mogo.och.common.module.utils.PinYinUtil
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.data.bean.BusRoutesResult
import com.mogo.och.data.bean.BusStationBean
import com.mogo.och.data.bean.BusTransferData

View File

@@ -12,18 +12,15 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.mogo.eagle.core.function.main.MainMoGoApplication
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager
import com.mogo.och.common.module.wigets.media.IMediaDataSourceListener
import com.mogo.och.common.module.wigets.media.MediaDataSourceManager
import com.mogo.och.common.module.wigets.media.MediaFileCacheManager
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.common.module.wigets.media.MediaPlayLogger
import com.mogo.och.common.module.biz.media.IVideoListener
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.unmanned.passenger.ui.video.RecyclerVideoAdapterNew.OnThumbImageClilckListener
import com.mogo.och.unmanned.passenger.widget.ConsultVideoPlayer
@@ -95,17 +92,16 @@ internal class InfoVideoView @JvmOverloads constructor(
override fun onAttachedToWindow() {
super.onAttachedToWindow()
MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext)
MediaDataSourceManager.init(TAG, object : IMediaDataSourceListener {
MediaManager.Video.createCacheFileDir()
MediaManager.addListener(TAG,object :IVideoListener{
override fun onMediaDataSourceChanged(list: List<MediaItem>) {
val isNewData = mediaList.isNotEmpty()
MediaPlayLogger.printInfoLog(
OchChainLogManager.writeChainLogMedia("info",
"onMediaDataSourceChangedisNewData=$isNewData, dataSize=${list.size}, list=${
GsonUtils.toJson(
list
)
}"
)
GsonUtils.toJson(
list
)
}")
val localMediaList = mutableListOf<TaxiPassengerVideoPlay>()
list.forEach {
val taxiPassengerVideoPlay = TaxiPassengerVideoPlay(
@@ -119,17 +115,18 @@ internal class InfoVideoView @JvmOverloads constructor(
if (isNewData) {
if (!isVisible) {
updateMediaListDataAndView(localMediaList)
MediaPlayLogger.printInfoLog("onMediaDataSourceChanged, 宣传视频数据已更新")
OchChainLogManager.writeChainLogMedia("info","onMediaDataSourceChanged, 宣传视频数据已更新")
} else {
mNewMediaList.clear()
mNewMediaList.addAll(localMediaList)
}
} else {
updateMediaListDataAndView(localMediaList)
MediaPlayLogger.printInfoLog("onMediaDataSourceChanged, 宣传视频数据已更新")
OchChainLogManager.writeChainLogMedia("info","onMediaDataSourceChanged, 宣传视频数据已更新")
}
}
})
MediaManager.Video.init()
}
private fun updateMediaListDataAndView(newList: MutableList<TaxiPassengerVideoPlay>) {
@@ -224,7 +221,8 @@ internal class InfoVideoView @JvmOverloads constructor(
}
override fun onDetachedFromWindow() {
MediaDataSourceManager.unInit(TAG)
MediaManager.removeListener(TAG)
MediaManager.Video.unInit()
GSYVideoManager.releaseAllVideos()
super.onDetachedFromWindow()
}

View File

@@ -12,7 +12,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
import com.mogo.och.common.module.wigets.media.MediaItem;
import com.mogo.och.common.module.biz.media.data.MediaItem;
import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay;
import com.mogo.och.unmanned.taxi.passenger.R;
import com.mogo.skin.utils.SkinResources;

View File

@@ -9,7 +9,7 @@ import androidx.appcompat.widget.AppCompatTextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.unmanned.taxi.passenger.R
import com.mogo.skin.utils.SkinResources

View File

@@ -27,7 +27,7 @@ import com.mogo.eagle.core.utilcode.util.TimeTransformUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.wigets.media.MediaItem
import com.mogo.och.common.module.biz.media.data.MediaItem
import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay
import com.mogo.och.unmanned.passenger.ui.statusview.StatusBarView
import com.mogo.och.unmanned.passenger.ui.video.FullVideoUtils

View File

@@ -87,12 +87,12 @@
</LinearLayout>
<TextView
android:id="@+id/tvAnswer"
style="@style/AIMsgTextTitle"
tools:text="前方道路施工" />
<com.youth.banner.Banner
android:id="@+id/picBanner"
android:layout_width="match_parent"