打点
This commit is contained in:
parent
3eaccb2e67
commit
77f316faef
@ -23,6 +23,7 @@ import relax.offline.music.database.AppFavoriteDBManager
|
||||
import relax.offline.music.firebase.RemoteConfig
|
||||
import relax.offline.music.http.CommonIpInfoUtil
|
||||
import relax.offline.music.http.UploadEventName
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
import relax.offline.music.util.AppLifecycleHandler
|
||||
import java.io.BufferedReader
|
||||
import java.io.InputStreamReader
|
||||
@ -114,6 +115,7 @@ class App : Application() {
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
AnalysisUtil.logEvent(AnalysisUtil.USER_LAUNCH)
|
||||
app = this
|
||||
AppLifecycleHandler(this)
|
||||
CommonIpInfoUtil.shared.initIPInfo()
|
||||
|
||||
@ -5,6 +5,7 @@ import android.os.Bundle
|
||||
import android.os.CountDownTimer
|
||||
import com.gyf.immersionbar.ktx.immersionBar
|
||||
import relax.offline.music.databinding.ActivityLaunchBinding
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
class LaunchActivity : MoBaseActivity() {
|
||||
private lateinit var binding: ActivityLaunchBinding
|
||||
@ -46,6 +47,7 @@ class LaunchActivity : MoBaseActivity() {
|
||||
} else {
|
||||
startActivity(Intent(this, PrimaryActivity::class.java))
|
||||
}
|
||||
AnalysisUtil.logEvent(AnalysisUtil.LAUNCH_PV)
|
||||
finish()
|
||||
}
|
||||
}
|
||||
@ -18,6 +18,7 @@ import relax.offline.music.databinding.ActivityMainBinding
|
||||
import relax.offline.music.fragment.HomeFragment
|
||||
import relax.offline.music.fragment.ImportFragment
|
||||
import relax.offline.music.media.LocalMediaControllerManager
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
import relax.offline.music.util.getAudioDurationFromAssets
|
||||
|
||||
|
||||
@ -192,7 +193,9 @@ class MainActivity : BaseActivity() {
|
||||
binding.apply {
|
||||
homeImg.setImageResource(
|
||||
when (index) {
|
||||
0 -> R.drawable.home_select_icon
|
||||
0 ->{
|
||||
R.drawable.home_select_icon
|
||||
}
|
||||
else -> R.drawable.home_unselect_icon
|
||||
}
|
||||
)
|
||||
|
||||
@ -120,7 +120,7 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope
|
||||
}
|
||||
|
||||
private fun initPlayerListener() {
|
||||
if (this !is MoPlayDetailsActivity) {
|
||||
if (this !is MoPlayDetailsActivity && this !is LaunchActivity) {
|
||||
if (playerListener == null) {
|
||||
LogTag.LogD(TAG, "MoBaseActivity initPlayerListener")
|
||||
meController?.addListener(getPlayerListener())
|
||||
@ -161,7 +161,16 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope
|
||||
musicPlayerView.updateProgressState(meController)
|
||||
|
||||
when (playbackState) {
|
||||
Player.STATE_IDLE -> {
|
||||
LogTag.LogD(TAG, "base STATE_IDLE")
|
||||
}
|
||||
|
||||
Player.STATE_BUFFERING -> {
|
||||
LogTag.LogD(TAG, "base STATE_BUFFERING")
|
||||
}
|
||||
|
||||
Player.STATE_READY -> {
|
||||
LogTag.LogD(TAG, "base STATE_READY")
|
||||
musicPlayerView.updateSetProgress(meController)
|
||||
}
|
||||
|
||||
@ -174,6 +183,7 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope
|
||||
playWhenReady: Boolean,
|
||||
reason: Int
|
||||
) {
|
||||
LogTag.LogD(TAG, "base onPlayWhenReadyChanged $playWhenReady")
|
||||
musicPlayerView.updatePlayState(playWhenReady)
|
||||
val meController = MediaControllerManager.getController()
|
||||
if (meController != null) {
|
||||
@ -266,7 +276,8 @@ abstract class MoBaseActivity : AppCompatActivity(), CoroutineScope by MainScope
|
||||
"CH",
|
||||
"BE",
|
||||
"MO",
|
||||
"SG")
|
||||
"SG"
|
||||
)
|
||||
// 检查是否包含当前的国家代码
|
||||
LogTag.LogD(TAG, "withPermission ipCountryCode->${appStore.ipCountryCode}")
|
||||
if (appStore.ipCountryCode in restrictedCountries) {
|
||||
|
||||
@ -42,8 +42,11 @@ import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.selects.select
|
||||
import org.json.JSONObject
|
||||
import relax.offline.music.App
|
||||
import relax.offline.music.bean.FavoriteBean
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
import relax.offline.music.util.LogTag
|
||||
|
||||
@OptIn(UnstableApi::class)
|
||||
class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
|
||||
@ -74,6 +77,8 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
|
||||
private var comeFrom: Class<*>? = null
|
||||
private var playListAdapter: PlayListAdapter? = null
|
||||
|
||||
private var startPlayTime = 0L
|
||||
|
||||
private fun initImmersionBar() {
|
||||
immersionBar {
|
||||
statusBarDarkFont(false)
|
||||
@ -199,13 +204,36 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
|
||||
is Request.OnFavorites -> {
|
||||
if (meController != null && meController.currentMediaItem != null) {
|
||||
val currentMediaItem = meController.currentMediaItem
|
||||
val jsonObject = JSONObject()
|
||||
jsonObject.put(
|
||||
"song_title",
|
||||
"${currentMediaItem?.mediaMetadata?.title}"
|
||||
)
|
||||
val songMap = mutableMapOf(
|
||||
Pair(
|
||||
AnalysisUtil.PARAM_VALUE,
|
||||
jsonObject.toString()
|
||||
)
|
||||
)
|
||||
val currentFavoriteBean =
|
||||
App.appFavoriteDBManager.getFavoriteBeanByID(currentMediaItem?.mediaId!!)
|
||||
if (currentFavoriteBean != null) {
|
||||
currentFavoriteBean.isFavorite = !currentFavoriteBean.isFavorite
|
||||
App.appFavoriteDBManager.updateFavoriteBean(currentFavoriteBean)
|
||||
if (currentFavoriteBean.isFavorite) {
|
||||
AnalysisUtil.logEvent(
|
||||
AnalysisUtil.PLAYER_B_LOVE_CLICK,
|
||||
songMap
|
||||
)
|
||||
} else {
|
||||
AnalysisUtil.logEvent(
|
||||
AnalysisUtil.PLAYER_B_UN_LOVE_CLICK,
|
||||
songMap
|
||||
)
|
||||
}
|
||||
} else {
|
||||
insertFavoriteData(currentMediaItem)
|
||||
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_LOVE_CLICK, songMap)
|
||||
}
|
||||
requests.trySend(Request.UpdateFavorite(currentMediaItem.mediaId))
|
||||
}
|
||||
@ -213,6 +241,18 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
|
||||
|
||||
is Request.OnDownload -> {
|
||||
insertOfflineData(it.mediaItem)
|
||||
val jsonObject = JSONObject()
|
||||
jsonObject.put(
|
||||
"download_id",
|
||||
"${it.mediaItem.mediaId}"
|
||||
)
|
||||
val songMap = mutableMapOf(
|
||||
Pair(
|
||||
AnalysisUtil.PARAM_VALUE,
|
||||
jsonObject.toString()
|
||||
)
|
||||
)
|
||||
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_DOWNLOAD_CLICK, songMap)
|
||||
}
|
||||
|
||||
is Request.UpdateFavorite -> {
|
||||
@ -272,6 +312,19 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
|
||||
binding.downloadLoading.visibility = View.GONE
|
||||
binding.downloadImg.setImageResource(R.drawable.download_done_icon)
|
||||
binding.downloadImg.visibility = View.VISIBLE
|
||||
|
||||
val jsonObject = JSONObject()
|
||||
jsonObject.put(
|
||||
"download_id",
|
||||
download.request.id
|
||||
)
|
||||
val songMap = mutableMapOf(
|
||||
Pair(
|
||||
AnalysisUtil.PARAM_VALUE,
|
||||
jsonObject.toString()
|
||||
)
|
||||
)
|
||||
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_DOWNLOAD_SUCCESS_ACTION, songMap)
|
||||
}
|
||||
|
||||
Download.STATE_FAILED -> {
|
||||
@ -644,12 +697,21 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
|
||||
override fun onPlaybackStateChanged(playbackState: Int) {
|
||||
when (playbackState) {
|
||||
Player.STATE_BUFFERING -> {
|
||||
startPlayTime = System.currentTimeMillis()
|
||||
LogD(TAG, "details STATE_BUFFERING")
|
||||
binding.loadingView.visibility = View.VISIBLE
|
||||
binding.disableClicksLayout.visibility = View.VISIBLE
|
||||
binding.playbackErrorLayout.visibility = View.GONE
|
||||
}
|
||||
|
||||
Player.STATE_READY -> {
|
||||
val jsonObject = JSONObject()
|
||||
jsonObject.put("play_time", System.currentTimeMillis() - startPlayTime)
|
||||
val map = mutableMapOf(Pair(AnalysisUtil.PARAM_VALUE, jsonObject.toString()))
|
||||
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_DELAY_ACTION, map)
|
||||
startPlayTime = 0L
|
||||
LogD(TAG, "details STATE_READY")
|
||||
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_SUCCESS_ACTION)
|
||||
binding.playbackErrorLayout.visibility = View.GONE
|
||||
binding.loadingView.visibility = View.GONE
|
||||
binding.disableClicksLayout.visibility = View.GONE
|
||||
@ -677,6 +739,8 @@ class MoPlayDetailsActivity : MoBaseActivity(), Player.Listener {
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
meController?.removeListener(playerListener)
|
||||
|
||||
AnalysisUtil.logEvent(AnalysisUtil.PLAYER_B_PV)
|
||||
}
|
||||
|
||||
private fun updateProgressUi() {
|
||||
|
||||
@ -11,6 +11,7 @@ import relax.offline.music.fragment.MoMeFragment
|
||||
import relax.offline.music.fragment.SearchFragment
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.selects.select
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
class PrimaryActivity : MoBaseActivity(), SearchFragment.SearchFragmentCancelClickListener {
|
||||
/**
|
||||
@ -87,7 +88,9 @@ class PrimaryActivity : MoBaseActivity(), SearchFragment.SearchFragmentCancelCli
|
||||
binding.apply {
|
||||
homeImg.setImageResource(
|
||||
when (index) {
|
||||
0 -> R.drawable.home_select_icon
|
||||
0 -> {
|
||||
R.drawable.home_select_icon
|
||||
}
|
||||
else -> R.drawable.home_unselect_icon
|
||||
}
|
||||
)
|
||||
|
||||
@ -10,6 +10,7 @@ import relax.offline.music.R
|
||||
import relax.offline.music.activity.PlayDetailsActivity
|
||||
import relax.offline.music.bean.Audio
|
||||
import relax.offline.music.databinding.RealHumanVoiceLayoutBinding
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
import relax.offline.music.util.convertMillisToMinutesAndSecondsString
|
||||
import relax.offline.music.util.getAudioDurationFromAssets
|
||||
|
||||
@ -32,6 +33,8 @@ class RealHumanVoiceAdapter(
|
||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_A_PV)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -12,6 +12,7 @@ import relax.offline.music.activity.MoPlayDetailsActivity
|
||||
import relax.offline.music.databinding.MusicResponsiveItemBinding
|
||||
import relax.offline.music.innertube.models.MusicCarouselShelfRenderer
|
||||
import relax.offline.music.media.MediaControllerManager
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
class ResponsiveListAdapter(
|
||||
private val context: Context,
|
||||
@ -68,6 +69,9 @@ class ResponsiveListAdapter(
|
||||
holder.bind(url, name, desc, videoId)
|
||||
|
||||
holder.itemView.setOnClickListener {
|
||||
//离开上报,那就跳走上报。
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_PV)
|
||||
|
||||
val intent = Intent(context, MoPlayDetailsActivity::class.java)
|
||||
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_VIDEO_ID, videoId)
|
||||
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_PLAY_LIST_ID, playlistId)
|
||||
@ -81,6 +85,10 @@ class ResponsiveListAdapter(
|
||||
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_NAME, name)
|
||||
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_DESC, desc)
|
||||
context.startActivity(intent)
|
||||
|
||||
if(itemClickListener!=null){
|
||||
itemClickListener?.onItemClick(position)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -31,6 +31,9 @@ class SearchResultOtherAdapter(
|
||||
holder.bind(bean)
|
||||
|
||||
holder.itemView.setOnClickListener {
|
||||
if (itemClickListener != null) {
|
||||
itemClickListener?.onItemClick(position)
|
||||
}
|
||||
LogTag.LogD(
|
||||
LogTag.VO_ACT_LOG,
|
||||
"SearchResultOtherAdapter bean.pageType->${bean.pageType}"
|
||||
|
||||
@ -11,6 +11,7 @@ import relax.offline.music.R
|
||||
import relax.offline.music.activity.PlayDetailsActivity
|
||||
import relax.offline.music.bean.Audio
|
||||
import relax.offline.music.databinding.SoundsOfAppliancesLayoutBinding
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
import relax.offline.music.util.convertMillisToMinutesAndSecondsString
|
||||
import relax.offline.music.util.getAudioDurationFromAssets
|
||||
|
||||
@ -34,6 +35,8 @@ class SoundsOfAppliancesAdapter(
|
||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
// mediaPlayer.setDataSource(this, Uri.parse("file:///android_asset/${audio.file}"))
|
||||
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_A_PV)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@ import relax.offline.music.R
|
||||
import relax.offline.music.activity.PlayDetailsActivity
|
||||
import relax.offline.music.bean.Audio
|
||||
import relax.offline.music.databinding.SoundsOfNatureLayoutBinding
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
import relax.offline.music.util.convertMillisToMinutesAndSecondsString
|
||||
import relax.offline.music.util.getAudioDurationFromAssets
|
||||
|
||||
@ -34,6 +35,8 @@ class SoundsOfNatureAdapter(
|
||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
||||
context.startActivity(intent)
|
||||
// mediaPlayer.setDataSource(this, Uri.parse("file:///android_asset/${audio.file}"))
|
||||
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_A_PV)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -11,6 +11,7 @@ import relax.offline.music.activity.MoPlayDetailsActivity
|
||||
import relax.offline.music.activity.MoSingerDetailsActivity
|
||||
import relax.offline.music.databinding.MusicTowRowItemBinding
|
||||
import relax.offline.music.innertube.models.MusicCarouselShelfRenderer
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
class TowRowListAdapter(
|
||||
private val context: Activity,
|
||||
@ -69,6 +70,12 @@ class TowRowListAdapter(
|
||||
holder.bind(url = url, name = name, desc = desc)
|
||||
|
||||
holder.itemView.setOnClickListener {
|
||||
//离开上报,那就跳走上报。
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_PV)
|
||||
if (itemClickListener != null) {
|
||||
itemClickListener?.onItemClick(position)
|
||||
}
|
||||
|
||||
if (browseId.isNullOrEmpty()) {
|
||||
val intent = Intent(context, MoPlayDetailsActivity::class.java)
|
||||
intent.putExtra(MoPlayDetailsActivity.PLAY_DETAILS_VIDEO_ID, videoId)
|
||||
|
||||
@ -13,6 +13,7 @@ import relax.offline.music.adapter.RealHumanVoiceAdapter
|
||||
import relax.offline.music.adapter.SoundsOfAppliancesAdapter
|
||||
import relax.offline.music.adapter.SoundsOfNatureAdapter
|
||||
import relax.offline.music.databinding.FragmentHomeBinding
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
import relax.offline.music.util.GridSpacingItemDecoration
|
||||
|
||||
class HomeFragment : Fragment() {
|
||||
@ -106,9 +107,16 @@ class HomeFragment : Fragment() {
|
||||
super.onHiddenChanged(hidden)
|
||||
if (!hidden) {
|
||||
initImmersionBar()
|
||||
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_A_PV)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_A_PV)
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
@SuppressLint("NotifyDataSetChanged")
|
||||
private fun notifyDataSetChanged() {
|
||||
soundsOfAppliancesAdapter?.notifyDataSetChanged()
|
||||
|
||||
@ -15,6 +15,7 @@ import relax.offline.music.view.MusicTowRowListView
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.selects.select
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
class MoHomeFragment : MoBaseFragment<FragmentMoHomeBinding>() {
|
||||
|
||||
@ -70,6 +71,7 @@ class MoHomeFragment : MoBaseFragment<FragmentMoHomeBinding>() {
|
||||
private suspend fun initData() {
|
||||
showLoadingUi()
|
||||
Innertube.homePage(appStore.myVisitorData)?.onSuccess {
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_MODULE_SHOW_SUCCESS_ACTION)
|
||||
showDataUi()
|
||||
if (it.homePage.isNotEmpty()) {
|
||||
for (home: Innertube.HomePage in it.homePage) {
|
||||
@ -134,7 +136,7 @@ class MoHomeFragment : MoBaseFragment<FragmentMoHomeBinding>() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun fragmentOnResume(){
|
||||
private fun fragmentOnResume() {
|
||||
refreshAdapters()
|
||||
}
|
||||
|
||||
@ -146,6 +148,7 @@ class MoHomeFragment : MoBaseFragment<FragmentMoHomeBinding>() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
initImmersionBar()
|
||||
@ -155,9 +158,18 @@ class MoHomeFragment : MoBaseFragment<FragmentMoHomeBinding>() {
|
||||
super.onHiddenChanged(hidden)
|
||||
if (!hidden) {
|
||||
initImmersionBar()
|
||||
} else {
|
||||
//离开上报,那就隐藏上报。
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_PV)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
//离开上报
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_PV)
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
private fun showDataUi() {
|
||||
binding.loadingLayout.visibility = View.GONE
|
||||
binding.noContentLayout.visibility = View.GONE
|
||||
|
||||
@ -14,6 +14,7 @@ import relax.offline.music.activity.MoLikedSongsActivity
|
||||
import relax.offline.music.activity.MoOfflineSongsActivity
|
||||
import relax.offline.music.activity.SettingsActivity
|
||||
import relax.offline.music.databinding.FragmentMoMeBinding
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
class MoMeFragment : MoBaseFragment<FragmentMoMeBinding>() {
|
||||
|
||||
@ -61,12 +62,14 @@ class MoMeFragment : MoBaseFragment<FragmentMoMeBinding>() {
|
||||
val intent = Intent(requireActivity(), SettingsActivity::class.java)
|
||||
intent.putExtra(SettingsActivity.FROM_TO_SETTING, MoMeFragment::class.java)
|
||||
startActivity(intent)
|
||||
AnalysisUtil.logEvent(AnalysisUtil.ME_B_PV)
|
||||
}
|
||||
binding.likedSongsBtn.setOnClickListener {
|
||||
val count = binding.likedSongsTv.text.toString().trim().toInt()
|
||||
if (count > 0) {
|
||||
val intent = Intent(context, MoLikedSongsActivity::class.java)
|
||||
startActivity(intent)
|
||||
AnalysisUtil.logEvent(AnalysisUtil.ME_B_PV)
|
||||
} else {
|
||||
Toast.makeText(
|
||||
activity,
|
||||
@ -80,6 +83,7 @@ class MoMeFragment : MoBaseFragment<FragmentMoMeBinding>() {
|
||||
if (count > 0) {
|
||||
val intent = Intent(context, MoOfflineSongsActivity::class.java)
|
||||
startActivity(intent)
|
||||
AnalysisUtil.logEvent(AnalysisUtil.ME_B_PV)
|
||||
} else {
|
||||
Toast.makeText(
|
||||
activity,
|
||||
@ -111,6 +115,8 @@ class MoMeFragment : MoBaseFragment<FragmentMoMeBinding>() {
|
||||
super.onHiddenChanged(hidden)
|
||||
if (!hidden) {
|
||||
initImmersionBar()
|
||||
} else {
|
||||
AnalysisUtil.logEvent(AnalysisUtil.ME_B_PV)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -34,6 +34,8 @@ import relax.offline.music.view.SearchResultOtherView
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.selects.select
|
||||
import org.json.JSONObject
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
class SearchFragment : MoBaseFragment<FragmentSearchBinding>(), TextWatcher,
|
||||
View.OnFocusChangeListener, SearchSuggestionsAdapter.OnItemClickListener,
|
||||
@ -150,6 +152,7 @@ class SearchFragment : MoBaseFragment<FragmentSearchBinding>(), TextWatcher,
|
||||
?.onSuccess { suggestionsList ->
|
||||
LogTag.LogD(TAG, "suggestionsList->${suggestionsList?.size}")
|
||||
if (suggestionsList != null) {
|
||||
AnalysisUtil.logEvent(AnalysisUtil.SEARCH_SUG_SHOW)
|
||||
showSearchSuggestions()
|
||||
searchSuggestionsList.clear()
|
||||
searchSuggestionsList.addAll(suggestionsList)
|
||||
@ -164,9 +167,9 @@ class SearchFragment : MoBaseFragment<FragmentSearchBinding>(), TextWatcher,
|
||||
}
|
||||
|
||||
is Request.SearchData -> {
|
||||
showLoadingLayout()
|
||||
binding.contentLayout.removeAllViews()
|
||||
binding.searchEdit.clearFocus()
|
||||
showLoadingLayout()
|
||||
val input = it.input
|
||||
if (input.isNotEmpty()) {
|
||||
searchHistorySet.clear()
|
||||
@ -176,29 +179,34 @@ class SearchFragment : MoBaseFragment<FragmentSearchBinding>(), TextWatcher,
|
||||
}
|
||||
appStore.searchHistoryStore = searchHistorySet
|
||||
updateHistoryUi()
|
||||
|
||||
Innertube.moSearchPage(SearchBody(query = input))?.onSuccess { result ->
|
||||
showResultContent()
|
||||
for (dataPage: Innertube.SearchDataPage in result) {
|
||||
LogTag.LogD(TAG,"moSearchPage dataPage->$dataPage")
|
||||
if (dataPage.type == 1) {//type为1的是最佳结果。
|
||||
binding.contentLayout.addView(
|
||||
SearchResultOptimalView(requireActivity(), dataPage)
|
||||
)
|
||||
} else if (dataPage.type == 2) {//type为2的是其他搜索结果。
|
||||
if (dataPage.searchResultList.isNotEmpty()) {//如何数据集合为空就不添加view
|
||||
AnalysisUtil.logEvent(AnalysisUtil.SEARCH_RESULT_PV)
|
||||
Innertube.moSearchPage(SearchBody(query = input))
|
||||
?.onSuccess { result ->
|
||||
AnalysisUtil.logEvent(AnalysisUtil.SEARCH_RESULT_SUCCESS_ACTION)
|
||||
showResultContent()
|
||||
for (dataPage: Innertube.SearchDataPage in result) {
|
||||
LogTag.LogD(TAG, "moSearchPage dataPage->$dataPage")
|
||||
if (dataPage.type == 1) {//type为1的是最佳结果。
|
||||
binding.contentLayout.addView(
|
||||
SearchResultOtherView(
|
||||
SearchResultOptimalView(
|
||||
requireActivity(),
|
||||
dataPage
|
||||
)
|
||||
)
|
||||
} else if (dataPage.type == 2) {//type为2的是其他搜索结果。
|
||||
if (dataPage.searchResultList.isNotEmpty()) {//如何数据集合为空就不添加view
|
||||
binding.contentLayout.addView(
|
||||
SearchResultOtherView(
|
||||
requireActivity(),
|
||||
dataPage
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}?.onFailure {
|
||||
showNoContentLayout()
|
||||
}
|
||||
}?.onFailure {
|
||||
showNoContentLayout()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -215,6 +223,9 @@ class SearchFragment : MoBaseFragment<FragmentSearchBinding>(), TextWatcher,
|
||||
binding.searchEdit.clearFocus()
|
||||
binding.searchEdit.text.clear()
|
||||
binding.contentLayout.removeAllViews()
|
||||
|
||||
//隐藏上报
|
||||
AnalysisUtil.logEvent(AnalysisUtil.SEARCH_PV)
|
||||
}
|
||||
}
|
||||
|
||||
@ -225,6 +236,12 @@ class SearchFragment : MoBaseFragment<FragmentSearchBinding>(), TextWatcher,
|
||||
|
||||
override fun onItemClick(position: Int) {
|
||||
binding.searchEdit.setText(searchSuggestionsList[position])
|
||||
val jsonObject = JSONObject()
|
||||
jsonObject.put("search_sug_string", searchSuggestionsList[position])
|
||||
val map = mutableMapOf(
|
||||
Pair(AnalysisUtil.PARAM_VALUE, jsonObject.toString())
|
||||
)
|
||||
AnalysisUtil.logEvent(AnalysisUtil.SEARCH_SUG_CLICK, map)
|
||||
requests.trySend(Request.SearchData(searchSuggestionsList[position]))
|
||||
}
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ package relax.offline.music.media
|
||||
import android.content.ComponentName
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import androidx.annotation.OptIn
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.MediaMetadata
|
||||
import androidx.media3.common.Player
|
||||
@ -20,7 +21,7 @@ import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
@UnstableApi
|
||||
@OptIn(UnstableApi::class)
|
||||
object LocalMediaControllerManager {
|
||||
private var mediaController: MediaController? = null
|
||||
private var controllerFuture: ListenableFuture<MediaController>? = null
|
||||
|
||||
@ -12,9 +12,23 @@ object AnalysisUtil {
|
||||
|
||||
const val USER_LAUNCH = "user_launch"//用户启动
|
||||
const val LAUNCH_PV = "launch_pv"//启动页曝光
|
||||
const val home_a_pv = "home_a_pv"//A面首页曝光
|
||||
const val home_b_pv = "home_b_pv"//B面首页曝光
|
||||
|
||||
const val HOME_A_PV = "home_a_pv"//A面首页曝光
|
||||
const val HOME_B_PV = "home_b_pv"//B面首页曝光
|
||||
const val HOME_B_MODULE_SHOW_SUCCESS_ACTION = "home_b_module_show_success_action"//首页资源曝光成功
|
||||
const val HOME_B_MODULE_CLICK = "home_b_module_click"//点击首页模块
|
||||
const val ME_B_PV = "me_b_pv"//B面我的曝光
|
||||
const val PLAYER_B_PV = "player_b_pv"//B面播放器曝光
|
||||
const val PLAYER_B_DELAY_ACTION = "player_b_delay_action"//统计加载时间
|
||||
const val PLAYER_B_SUCCESS_ACTION = "player_b_success_action"//播放成功
|
||||
const val PLAYER_B_LOVE_CLICK = "player_b_love_click"//点击收藏
|
||||
const val PLAYER_B_UN_LOVE_CLICK = "player_b_un_love_click"//点击收藏
|
||||
const val PLAYER_B_DOWNLOAD_CLICK = "player_b_download_click"//点击下载
|
||||
const val PLAYER_B_DOWNLOAD_SUCCESS_ACTION = "player_b_download_success_action"//下载成功
|
||||
const val SEARCH_PV = "search_pv"//B面搜索曝光
|
||||
const val SEARCH_SUG_SHOW = "search_sug_show"//搜索SUG曝光
|
||||
const val SEARCH_SUG_CLICK = "search_sug_click"//点击sug结果
|
||||
const val SEARCH_RESULT_PV = "search_result_pv"//搜索结果曝光
|
||||
const val SEARCH_RESULT_SUCCESS_ACTION = "search_result_success_action"//搜索有结果
|
||||
|
||||
private var firebaseAnalytics: FirebaseAnalytics? = null
|
||||
|
||||
@ -25,7 +39,6 @@ object AnalysisUtil {
|
||||
}
|
||||
} catch (ignore: Exception) {
|
||||
}
|
||||
|
||||
if (myParam != null) {
|
||||
val bundle = Bundle()
|
||||
try {
|
||||
|
||||
@ -19,6 +19,7 @@ import relax.offline.music.R
|
||||
import relax.offline.music.activity.MoPlayDetailsActivity
|
||||
import relax.offline.music.activity.PrimaryActivity
|
||||
import relax.offline.music.media.MediaControllerManager
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
@SuppressLint("ViewConstructor")
|
||||
class MusicPlayerView(
|
||||
|
||||
@ -5,9 +5,11 @@ import android.content.Context
|
||||
import android.widget.TextView
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import org.json.JSONObject
|
||||
import relax.offline.music.R
|
||||
import relax.offline.music.adapter.ResponsiveListAdapter
|
||||
import relax.offline.music.innertube.Innertube
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
@SuppressLint("ViewConstructor")
|
||||
class MusicResponsiveListView(context: Context, homePage: Innertube.HomePage) :
|
||||
@ -23,6 +25,14 @@ class MusicResponsiveListView(context: Context, homePage: Innertube.HomePage) :
|
||||
val rv = contentView?.findViewById<RecyclerView>(R.id.rv)
|
||||
|
||||
adapter = ResponsiveListAdapter(context, homePage.contents)
|
||||
adapter?.setOnItemClickListener(object : ResponsiveListAdapter.OnItemClickListener {
|
||||
override fun onItemClick(position: Int) {
|
||||
val jsonObject = JSONObject()
|
||||
jsonObject.put("moduleName", homePage.title)
|
||||
val map = mutableMapOf(Pair(AnalysisUtil.PARAM_VALUE, jsonObject.toString()))
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_MODULE_CLICK, map)
|
||||
}
|
||||
})
|
||||
rv?.layoutManager = GridLayoutManager(context, 3, GridLayoutManager.HORIZONTAL, false)
|
||||
rv?.adapter = adapter
|
||||
}
|
||||
|
||||
@ -5,9 +5,11 @@ import android.app.Activity
|
||||
import android.widget.TextView
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import org.json.JSONObject
|
||||
import relax.offline.music.R
|
||||
import relax.offline.music.adapter.TowRowListAdapter
|
||||
import relax.offline.music.innertube.Innertube
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
@SuppressLint("ViewConstructor")
|
||||
class MusicTowRowListView(context: Activity, homePage: Innertube.HomePage) : ModuleView(context) {
|
||||
@ -19,6 +21,14 @@ class MusicTowRowListView(context: Activity, homePage: Innertube.HomePage) : Mod
|
||||
val rv = contentView?.findViewById<RecyclerView>(R.id.rv)
|
||||
|
||||
val adapter = TowRowListAdapter(context, homePage.contents)
|
||||
adapter.setOnItemClickListener(object : TowRowListAdapter.OnItemClickListener {
|
||||
override fun onItemClick(position: Int) {
|
||||
val jsonObject = JSONObject()
|
||||
jsonObject.put("moduleName", homePage.title)
|
||||
val map = mutableMapOf(Pair(AnalysisUtil.PARAM_VALUE, jsonObject.toString()))
|
||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_MODULE_CLICK, map)
|
||||
}
|
||||
})
|
||||
rv?.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
|
||||
rv?.adapter = adapter
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@ import relax.offline.music.activity.MoListDetailsActivity
|
||||
import relax.offline.music.activity.MoPlayDetailsActivity
|
||||
import relax.offline.music.activity.MoSingerDetailsActivity
|
||||
import relax.offline.music.innertube.Innertube
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
@SuppressLint("ViewConstructor")
|
||||
class SearchResultOptimalView(context: Context, data: Innertube.SearchDataPage) :
|
||||
@ -37,6 +38,7 @@ class SearchResultOptimalView(context: Context, data: Innertube.SearchDataPage)
|
||||
|
||||
val playBtn = contentView?.findViewById<LinearLayout>(R.id.playBtn)
|
||||
playBtn?.setOnClickListener {
|
||||
AnalysisUtil.logEvent(AnalysisUtil.SEARCH_PV)
|
||||
if (optimalBean != null) {
|
||||
if (!optimalBean.videoId.isNullOrEmpty()) {
|
||||
val intent = Intent(context, MoPlayDetailsActivity::class.java)
|
||||
|
||||
@ -11,6 +11,7 @@ import relax.offline.music.R
|
||||
import relax.offline.music.activity.MoSearchMoreActivity
|
||||
import relax.offline.music.adapter.SearchResultOtherAdapter
|
||||
import relax.offline.music.innertube.Innertube
|
||||
import relax.offline.music.util.AnalysisUtil
|
||||
|
||||
@SuppressLint("ViewConstructor")
|
||||
class SearchResultOtherView(context: Context, data: Innertube.SearchDataPage) :
|
||||
@ -22,6 +23,7 @@ class SearchResultOtherView(context: Context, data: Innertube.SearchDataPage) :
|
||||
|
||||
val moreBtn = contentView?.findViewById<LinearLayout>(R.id.moreBtn)
|
||||
moreBtn?.setOnClickListener {
|
||||
AnalysisUtil.logEvent(AnalysisUtil.SEARCH_PV)
|
||||
val intent = Intent(context, MoSearchMoreActivity::class.java)
|
||||
intent.putExtra(MoSearchMoreActivity.SEARCH_MORE_QUERY, data.query)
|
||||
intent.putExtra(MoSearchMoreActivity.SEARCH_MORE_PARAMS, data.params)
|
||||
@ -30,6 +32,11 @@ class SearchResultOtherView(context: Context, data: Innertube.SearchDataPage) :
|
||||
|
||||
val rv = contentView?.findViewById<RecyclerView>(R.id.rv)
|
||||
val adapter = SearchResultOtherAdapter(context, data.searchResultList)
|
||||
adapter.setOnItemClickListener(object :SearchResultOtherAdapter.OnItemClickListener{
|
||||
override fun onItemClick(position: Int) {
|
||||
AnalysisUtil.logEvent(AnalysisUtil.SEARCH_PV)
|
||||
}
|
||||
})
|
||||
rv?.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
|
||||
rv?.adapter = adapter
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user