package com.kaltura.playersdk.casting; import com.google.android.gms.cast.Cast; import com.google.android.gms.cast.CastDevice; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import static com.kaltura.playersdk.utils.LogUtils.LOGD; /** * Created by nissimpardo on 07/12/15. */ public class KCastKalturaChannel implements Cast.MessageReceivedCallback { private static final String TAG = "KCastKalturaChannel"; private String mNameSpace; private KCastKalturaChannelListener mListener; public interface KCastKalturaChannelListener { void readyForMedia(String[] castParams); void ccOnSenderConnected(int numOfSendersConnected); void ccOnSenderDisconnected(int numOfSendersConnected); void ccUpdateAdDuration(int adDuration); void ccUserInitiatedPlay(); void ccReceiverAdOpen(); void ccReceiverAdComplete(); void textTeacksRecived(HashMap<String,Integer> textTrackHash); void videoTracksReceived(List<Integer> videoTracksList); void onCastReceiverError(String errorMsg, int errorCode); } public KCastKalturaChannel(String nameSpace, KCastKalturaChannelListener listener) { mNameSpace = nameSpace; mListener = listener; } public String getNamespace() { return mNameSpace; } @Override public void onMessageReceived(CastDevice castDevice, String s, String s1) { LOGD(TAG, "onMessageReceived <" + s + "> <" + s1 + ">"); if (s1.startsWith("readyForMedia")) { String[] params = s1.split("\\|"); if (params.length == 3) { mListener.readyForMedia(Arrays.copyOfRange(params, 1, 3)); } } else if (s1.contains("userInitiatedPlay")){ LOGD(TAG, "onMessageReceived userInitiatedPlay"); //mListener.ccUserInitiatedPlay(); } else if (s1.startsWith("chromecastReceiverAdDuration")) { String[] params = s1.split("\\|"); if (params.length == 2) { if (params[1] != null) { LOGD(TAG, "onMessageReceived chromecastReceiverAdDuration = " + params[1]); //mListener.ccUpdateAdDuration(Integer.valueOf(params[1])); } } } else if (s1.contains("chromecastReceiverAdOpen")){ LOGD(TAG, "onMessageReceived chromecastReceiverAdOpen"); mListener.ccReceiverAdOpen(); } else if (s1.contains("chromecastReceiverAdComplete")){ LOGD(TAG, "onMessageReceived chromecastReceiverAdComplete"); mListener.ccReceiverAdComplete(); } else if (s1.startsWith("chromecastReceiverOnSenderConnected")) { String[] params = s1.split("\\|"); if (params.length == 2) { if (params[1] != null) { LOGD(TAG, "onMessageReceived chromecastReceiverOnSenderConnected = " + params[1]); mListener.ccOnSenderConnected(Integer.valueOf(params[1])); } } } else if (s1.startsWith("chromecastReceiverOnSenderDisconnected")) { String[] params = s1.split("\\|"); if (params.length == 2) { if (params[1] != null) { LOGD(TAG, "onMessageReceived chromecastReceiverOnSenderDisconnected = " + params[1]); mListener.ccOnSenderDisconnected(Integer.valueOf(params[1])); } } } else if (s1.contains("\"Data Loaded\"")){ //mListener.dataLoaded(); } else if (s1.contains("\"aborted\"")){ //mListener.dataAborted(); } else if (s1.toLowerCase().contains("\"error\"")){ List<String> errMessage = parseErrormessage(s1); mListener.onCastReceiverError(errMessage.get(0),Integer.valueOf(errMessage.get(1))); } else if (s1.contains("\"captions\"")){ mListener.textTeacksRecived(parseCaptions(s1)); } else if (s1.contains("\"video_bitrates\"")) { mListener.videoTracksReceived(parseVideoBitrates(s1)); } } public HashMap<String,Integer> parseCaptions(String captions) { //{"captions":{"1":"eng","2":"fra","3":"spa","4":"ara","5":"nld","6":"jpn","7":"rus"} HashMap<String,Integer> captionsHash = new HashMap<String,Integer>(); captions = captions.replaceAll("\\{", "").replaceAll("\\}", "").replaceAll("\"", "").replaceAll("captions:", ""); String [] elements = captions.split(","); for (String elm : elements) { String [] keyVal = elm.split(":"); captionsHash.put(keyVal[1],Integer.valueOf(keyVal[0])); } return captionsHash; } public List<Integer> parseVideoBitrates(String videoBitrates) { //{"video_bitrates":[409600,814080,1536000]} List<Integer> videoBitratesList = new ArrayList<Integer>(); videoBitrates = videoBitrates.replaceAll("\\{", "").replaceAll("\\}", "").replaceAll("\"", "").replaceAll("video_bitrates:", ""); videoBitrates = videoBitrates.replaceAll("\\[", "").replaceAll("\\]", ""); String [] elements = videoBitrates.split(","); for (String elm : elements) { videoBitratesList.add(Integer.valueOf(elm)); } return videoBitratesList; } public List<String> parseErrormessage(String errorMsg) { List<String> errorParams = new ArrayList<>(); //onMessageReceived <urn:x-cast:com.kaltura.cast.player> <mediaHostState: Fatal Error: code = 3> errorMsg = errorMsg.replaceAll(" ", ""); if (errorMsg.contains(":") && errorMsg.contains("code=")) { String[] erorrParts = errorMsg.split(":"); if (erorrParts.length != 2) { errorParams.add(erorrParts[0]); String[] codeParts = erorrParts[1].split("="); errorParams.add(codeParts[1]); } return errorParams; } errorParams.add(errorMsg); errorParams.add("-1"); return errorParams; } }