From 77f316faef4eea34b3a7b5b8fe8add19a3d514de Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Thu, 30 May 2024 14:49:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/relax/offline/music/App.kt | 2 + .../offline/music/activity/LaunchActivity.kt | 2 + .../offline/music/activity/MainActivity.kt | 5 +- .../offline/music/activity/MoBaseActivity.kt | 15 ++++- .../music/activity/MoPlayDetailsActivity.kt | 64 +++++++++++++++++++ .../offline/music/activity/PrimaryActivity.kt | 5 +- .../music/adapter/RealHumanVoiceAdapter.kt | 3 + .../music/adapter/ResponsiveListAdapter.kt | 8 +++ .../music/adapter/SearchResultOtherAdapter.kt | 3 + .../adapter/SoundsOfAppliancesAdapter.kt | 3 + .../music/adapter/SoundsOfNatureAdapter.kt | 3 + .../music/adapter/TowRowListAdapter.kt | 7 ++ .../offline/music/fragment/HomeFragment.kt | 8 +++ .../offline/music/fragment/MoHomeFragment.kt | 14 +++- .../offline/music/fragment/MoMeFragment.kt | 6 ++ .../offline/music/fragment/SearchFragment.kt | 49 +++++++++----- .../media/LocalMediaControllerManager.kt | 3 +- .../relax/offline/music/util/AnalysisUtil.kt | 21 ++++-- .../offline/music/view/MusicPlayerView.kt | 1 + .../music/view/MusicResponsiveListView.kt | 10 +++ .../offline/music/view/MusicTowRowListView.kt | 10 +++ .../music/view/SearchResultOptimalView.kt | 2 + .../music/view/SearchResultOtherView.kt | 7 ++ 23 files changed, 225 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/relax/offline/music/App.kt b/app/src/main/java/relax/offline/music/App.kt index 940fea3..2159ea1 100644 --- a/app/src/main/java/relax/offline/music/App.kt +++ b/app/src/main/java/relax/offline/music/App.kt @@ -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() diff --git a/app/src/main/java/relax/offline/music/activity/LaunchActivity.kt b/app/src/main/java/relax/offline/music/activity/LaunchActivity.kt index 6b4f674..f9e5af7 100644 --- a/app/src/main/java/relax/offline/music/activity/LaunchActivity.kt +++ b/app/src/main/java/relax/offline/music/activity/LaunchActivity.kt @@ -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() } } \ No newline at end of file diff --git a/app/src/main/java/relax/offline/music/activity/MainActivity.kt b/app/src/main/java/relax/offline/music/activity/MainActivity.kt index 305e3ef..57eeff0 100644 --- a/app/src/main/java/relax/offline/music/activity/MainActivity.kt +++ b/app/src/main/java/relax/offline/music/activity/MainActivity.kt @@ -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 } ) diff --git a/app/src/main/java/relax/offline/music/activity/MoBaseActivity.kt b/app/src/main/java/relax/offline/music/activity/MoBaseActivity.kt index 6a1302b..6165f33 100644 --- a/app/src/main/java/relax/offline/music/activity/MoBaseActivity.kt +++ b/app/src/main/java/relax/offline/music/activity/MoBaseActivity.kt @@ -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) { diff --git a/app/src/main/java/relax/offline/music/activity/MoPlayDetailsActivity.kt b/app/src/main/java/relax/offline/music/activity/MoPlayDetailsActivity.kt index da2f9f7..acda377 100644 --- a/app/src/main/java/relax/offline/music/activity/MoPlayDetailsActivity.kt +++ b/app/src/main/java/relax/offline/music/activity/MoPlayDetailsActivity.kt @@ -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() { diff --git a/app/src/main/java/relax/offline/music/activity/PrimaryActivity.kt b/app/src/main/java/relax/offline/music/activity/PrimaryActivity.kt index eb68318..82fa30c 100644 --- a/app/src/main/java/relax/offline/music/activity/PrimaryActivity.kt +++ b/app/src/main/java/relax/offline/music/activity/PrimaryActivity.kt @@ -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 } ) diff --git a/app/src/main/java/relax/offline/music/adapter/RealHumanVoiceAdapter.kt b/app/src/main/java/relax/offline/music/adapter/RealHumanVoiceAdapter.kt index 24dd1fc..d46271c 100644 --- a/app/src/main/java/relax/offline/music/adapter/RealHumanVoiceAdapter.kt +++ b/app/src/main/java/relax/offline/music/adapter/RealHumanVoiceAdapter.kt @@ -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) } } diff --git a/app/src/main/java/relax/offline/music/adapter/ResponsiveListAdapter.kt b/app/src/main/java/relax/offline/music/adapter/ResponsiveListAdapter.kt index a182967..8fb63a7 100644 --- a/app/src/main/java/relax/offline/music/adapter/ResponsiveListAdapter.kt +++ b/app/src/main/java/relax/offline/music/adapter/ResponsiveListAdapter.kt @@ -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) + } } } diff --git a/app/src/main/java/relax/offline/music/adapter/SearchResultOtherAdapter.kt b/app/src/main/java/relax/offline/music/adapter/SearchResultOtherAdapter.kt index 5f6cd42..2aa37b6 100644 --- a/app/src/main/java/relax/offline/music/adapter/SearchResultOtherAdapter.kt +++ b/app/src/main/java/relax/offline/music/adapter/SearchResultOtherAdapter.kt @@ -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}" diff --git a/app/src/main/java/relax/offline/music/adapter/SoundsOfAppliancesAdapter.kt b/app/src/main/java/relax/offline/music/adapter/SoundsOfAppliancesAdapter.kt index 2fe3c62..365a78c 100644 --- a/app/src/main/java/relax/offline/music/adapter/SoundsOfAppliancesAdapter.kt +++ b/app/src/main/java/relax/offline/music/adapter/SoundsOfAppliancesAdapter.kt @@ -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) } } diff --git a/app/src/main/java/relax/offline/music/adapter/SoundsOfNatureAdapter.kt b/app/src/main/java/relax/offline/music/adapter/SoundsOfNatureAdapter.kt index 9e19a26..a72dde6 100644 --- a/app/src/main/java/relax/offline/music/adapter/SoundsOfNatureAdapter.kt +++ b/app/src/main/java/relax/offline/music/adapter/SoundsOfNatureAdapter.kt @@ -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) } } diff --git a/app/src/main/java/relax/offline/music/adapter/TowRowListAdapter.kt b/app/src/main/java/relax/offline/music/adapter/TowRowListAdapter.kt index 8de5f26..c939b92 100644 --- a/app/src/main/java/relax/offline/music/adapter/TowRowListAdapter.kt +++ b/app/src/main/java/relax/offline/music/adapter/TowRowListAdapter.kt @@ -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) diff --git a/app/src/main/java/relax/offline/music/fragment/HomeFragment.kt b/app/src/main/java/relax/offline/music/fragment/HomeFragment.kt index 4f9f9ee..7084c5f 100644 --- a/app/src/main/java/relax/offline/music/fragment/HomeFragment.kt +++ b/app/src/main/java/relax/offline/music/fragment/HomeFragment.kt @@ -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() diff --git a/app/src/main/java/relax/offline/music/fragment/MoHomeFragment.kt b/app/src/main/java/relax/offline/music/fragment/MoHomeFragment.kt index a110bf3..6f3fbea 100644 --- a/app/src/main/java/relax/offline/music/fragment/MoHomeFragment.kt +++ b/app/src/main/java/relax/offline/music/fragment/MoHomeFragment.kt @@ -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() { @@ -70,6 +71,7 @@ class MoHomeFragment : MoBaseFragment() { 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() { } } - private fun fragmentOnResume(){ + private fun fragmentOnResume() { refreshAdapters() } @@ -146,6 +148,7 @@ class MoHomeFragment : MoBaseFragment() { } } } + override fun onResume() { super.onResume() initImmersionBar() @@ -155,9 +158,18 @@ class MoHomeFragment : MoBaseFragment() { 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 diff --git a/app/src/main/java/relax/offline/music/fragment/MoMeFragment.kt b/app/src/main/java/relax/offline/music/fragment/MoMeFragment.kt index dec1829..7e66452 100644 --- a/app/src/main/java/relax/offline/music/fragment/MoMeFragment.kt +++ b/app/src/main/java/relax/offline/music/fragment/MoMeFragment.kt @@ -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() { @@ -61,12 +62,14 @@ class MoMeFragment : MoBaseFragment() { 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() { 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() { super.onHiddenChanged(hidden) if (!hidden) { initImmersionBar() + } else { + AnalysisUtil.logEvent(AnalysisUtil.ME_B_PV) } } } \ No newline at end of file diff --git a/app/src/main/java/relax/offline/music/fragment/SearchFragment.kt b/app/src/main/java/relax/offline/music/fragment/SearchFragment.kt index 68d9886..228e268 100644 --- a/app/src/main/java/relax/offline/music/fragment/SearchFragment.kt +++ b/app/src/main/java/relax/offline/music/fragment/SearchFragment.kt @@ -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(), TextWatcher, View.OnFocusChangeListener, SearchSuggestionsAdapter.OnItemClickListener, @@ -150,6 +152,7 @@ class SearchFragment : MoBaseFragment(), 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(), 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(), 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(), TextWatcher, binding.searchEdit.clearFocus() binding.searchEdit.text.clear() binding.contentLayout.removeAllViews() + + //隐藏上报 + AnalysisUtil.logEvent(AnalysisUtil.SEARCH_PV) } } @@ -225,6 +236,12 @@ class SearchFragment : MoBaseFragment(), 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])) } diff --git a/app/src/main/java/relax/offline/music/media/LocalMediaControllerManager.kt b/app/src/main/java/relax/offline/music/media/LocalMediaControllerManager.kt index 3fe88b9..b6e0799 100644 --- a/app/src/main/java/relax/offline/music/media/LocalMediaControllerManager.kt +++ b/app/src/main/java/relax/offline/music/media/LocalMediaControllerManager.kt @@ -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? = null diff --git a/app/src/main/java/relax/offline/music/util/AnalysisUtil.kt b/app/src/main/java/relax/offline/music/util/AnalysisUtil.kt index 47aff61..9d66cd7 100644 --- a/app/src/main/java/relax/offline/music/util/AnalysisUtil.kt +++ b/app/src/main/java/relax/offline/music/util/AnalysisUtil.kt @@ -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 { diff --git a/app/src/main/java/relax/offline/music/view/MusicPlayerView.kt b/app/src/main/java/relax/offline/music/view/MusicPlayerView.kt index c528a92..4739575 100644 --- a/app/src/main/java/relax/offline/music/view/MusicPlayerView.kt +++ b/app/src/main/java/relax/offline/music/view/MusicPlayerView.kt @@ -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( diff --git a/app/src/main/java/relax/offline/music/view/MusicResponsiveListView.kt b/app/src/main/java/relax/offline/music/view/MusicResponsiveListView.kt index 0e3d2dd..f7f059c 100644 --- a/app/src/main/java/relax/offline/music/view/MusicResponsiveListView.kt +++ b/app/src/main/java/relax/offline/music/view/MusicResponsiveListView.kt @@ -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(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 } diff --git a/app/src/main/java/relax/offline/music/view/MusicTowRowListView.kt b/app/src/main/java/relax/offline/music/view/MusicTowRowListView.kt index 7daa4db..d71900f 100644 --- a/app/src/main/java/relax/offline/music/view/MusicTowRowListView.kt +++ b/app/src/main/java/relax/offline/music/view/MusicTowRowListView.kt @@ -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(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 } diff --git a/app/src/main/java/relax/offline/music/view/SearchResultOptimalView.kt b/app/src/main/java/relax/offline/music/view/SearchResultOptimalView.kt index ca5433f..29ae76b 100644 --- a/app/src/main/java/relax/offline/music/view/SearchResultOptimalView.kt +++ b/app/src/main/java/relax/offline/music/view/SearchResultOptimalView.kt @@ -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(R.id.playBtn) playBtn?.setOnClickListener { + AnalysisUtil.logEvent(AnalysisUtil.SEARCH_PV) if (optimalBean != null) { if (!optimalBean.videoId.isNullOrEmpty()) { val intent = Intent(context, MoPlayDetailsActivity::class.java) diff --git a/app/src/main/java/relax/offline/music/view/SearchResultOtherView.kt b/app/src/main/java/relax/offline/music/view/SearchResultOtherView.kt index 9267245..fb7062d 100644 --- a/app/src/main/java/relax/offline/music/view/SearchResultOtherView.kt +++ b/app/src/main/java/relax/offline/music/view/SearchResultOtherView.kt @@ -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(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(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