package com.applicaster.oasisplayer.chromecast import android.app.MediaRouteButton import android.content.Context import android.view.Gravity import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver import android.widget.LinearLayout import com.applicaster.oasisplayer.R import de.prosiebensat1digital.oasisplayer.player_api.OasisPlayer class CastButtonInjector{ fun inject(context: Context, oasisPlayer: OasisPlayer, completion: (MediaRouteButton) -> Unit?) { oasisPlayer.defaultUi?.viewTreeObserver?.addOnGlobalLayoutListener( object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { val viewGroup = getViewGroupForInjection(oasisPlayer) if (viewGroup != null) { val mediaRouteButton = createMediaRouteButton(context) if (mediaRouteButton != null) { val params = createMediaButtonLayoutParams() viewGroup.addView(mediaRouteButton, 0, params) completion.invoke(mediaRouteButton) oasisPlayer.defaultUi?.viewTreeObserver?.removeOnGlobalLayoutListener( this ) } } } } ) } private fun getViewGroupForInjection(oasisPlayer: OasisPlayer): ViewGroup? { val view = getOasisLogoView(oasisPlayer) return view?.parent as? ViewGroup } private fun getOasisLogoView(oasisPlayer: OasisPlayer) = oasisPlayer.defaultUi?.findViewById(R.id.logo) @Suppress("UNNECESSARY_SAFE_CALL") //handling for potential issue on HMS devices private fun createMediaRouteButton(context: Context): android.app.MediaRouteButton? { val mediaRouteButton = MediaRouteButton(context) mediaRouteButton?.visibility = View.GONE mediaRouteButton?.setPadding(0, 0, 0, 0) return mediaRouteButton } private fun createMediaButtonLayoutParams(): LinearLayout.LayoutParams { val params = LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ) params.gravity = Gravity.CENTER return params } }