package com.kaltura.playersdk.helpers;
import android.net.Uri;
import android.support.annotation.NonNull;
import org.json.JSONArray;
import org.json.JSONObject;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.security.NoSuchAlgorithmException;
/**
* Created by nissopa on 6/7/15.
*/
public class KStringUtilities {
public static String JavaScriptPrefix = "javascript:NativeBridge.videoPlayer.";
private static String AddJSListener = "addJsListener";
private static String RemoveJSListener = "removeJsListener";
private static String AsyncEvaluate = "asyncEvaluate";
private static String SetKDPAttribute = "setKDPAttribute";
private static String TriggerEvent = "trigger";
private static String SendNotification = "sendNotification";
public static String LocalContentId = "localContentId";
private String string;
private String argsString;
public KStringUtilities(String string) {
this.string = string;
this.argsString = null;
}
public boolean isJSFrame() {
return this.string.startsWith("js-frame:");
}
public boolean isEmbedFrame() {
return this.string.contains("mwEmbedFrame.php");
}
public boolean isPlay() {
return this.string.equals("play");
}
public boolean isSeeked() {
return this.string.equals("seeked");
}
public boolean isTimeUpdate() {
return this.string.equals("timeupdate");
}
public boolean isEnded() {
return this.string.equals("ended");
}
public boolean isError() {
return this.string.equals("error");
}
public boolean canPlay() {
return this.string.equals("canplay");
}
public static boolean isHLSSource(String src) {
return src.contains(".m3u8");
}
public static boolean isToggleFullScreen(String event) {
return event.equals("toggleFullscreen");
}
public String[] fetchArgs() {
if (this.argsString != null && this.argsString.length() > 3) {
try {
String value = URLDecoder.decode(this.argsString, "UTF-8");
if (value != null && value.length() > 2) {
JSONArray jsonArr = new JSONArray(value);
String[] params = new String[jsonArr.length()];
for (int i = 0; i < jsonArr.length(); i++) {
params[i] = jsonArr.getString(i);
}
return params;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
public String getArgsString() {
return this.argsString;
}
public String getAction() {
String[] arr = this.string.split(":");
if (arr.length > 1) {
if (arr.length > 3) {
this.argsString = arr[3].equals("%5B%5D") ? null : arr[3];
}
return arr[1];
}
return null;
}
public enum Attribute {
src, currentTime, visible, licenseUri, nativeAction, doubleClickRequestAds, language, textTrackSelected, audioTrackSelected, goLive, chromecastAppId, playerError;
}
static public String addEventListener(String event) {
return JSMethod(AddJSListener, "'" + event + "'");
}
static public String removeEventListener(String event) {
return JSMethod(RemoveJSListener, "'" + event + "'");
}
static public String asyncEvaluate(String expression, String evaluateID) {
return JSMethod(AsyncEvaluate, "'" + expression + "'", "'" + evaluateID + "'");
}
static public String setKDPAttribute(String pluginName, String propertyName, String value) {
return JSMethod(SetKDPAttribute, "'" + pluginName + "'", "'" + propertyName + "'", value);
}
//adding 2 setKDPAttribute for String and JSON inorder not to create backwards compatibility problems (fixing the missing "'" in both value sides)
static public String setKDPAttribute(String pluginName, String propertyName, JSONObject value) {
return JSMethod(SetKDPAttribute, "'" + pluginName + "'", "'" + propertyName + "'", value.toString());
}
static public String setStringKDPAttribute(String pluginName, String propertyName, String value) {
return JSMethod(SetKDPAttribute, "'" + pluginName + "'", "'" + propertyName + "'", "'" + value + "'");
}
static public String triggerEvent(String event, String value) {
return JSMethod(TriggerEvent, "'" + event + "'", "'" + value + "'");
}
static public String triggerEventWithJSON(String event, String jsonString) {
return JSMethod(TriggerEvent, "'" + event + "'", jsonString);
}
static public String sendNotification(String notificationName, String params) {
return JSMethod(SendNotification, "'" + notificationName + "'," + params);
}
static public String[] fetchArgs(String jsonString) {
if (jsonString != null && jsonString.length() > 3) {
try {
String value = URLDecoder.decode(jsonString, "UTF-8");
if (value != null && value.length() > 2) {
JSONArray jsonArr = new JSONArray(value);
String[] params = new String[jsonArr.length()];
for (int i = 0; i < jsonArr.length(); i++) {
params[i] = jsonArr.getString(i);
}
return params;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
static private String JSMethod(String action, String params) {
if (params.equals("null")) {
return JavaScriptPrefix + action + "()";
}
return JavaScriptPrefix + action +"(" + params + ")";
}
static private String JSMethod(String action, String param1, String param2) {
return JavaScriptPrefix + action + "(" + param1 + "," + param2 + ")";
}
static private String JSMethod(String action, String param1, String param2, String param3) {
return JavaScriptPrefix + action + "(" + param1 + "," + param2 + "," + param3 +")";
}
static public Method isMethodImplemented(Object obj, String methodName) {
Method[] methods = obj.getClass().getDeclaredMethods();
for (Method m : methods) {
if (m.getName().contains(methodName)) {
return m;
}
}
return null;
}
static public Attribute attributeEnumFromString(String value) {
try {
return Attribute.valueOf(value);
} catch (IllegalArgumentException e) {
return null;
}
}
public static String extractFragmentParam(Uri url, String name) {
return new Uri.Builder().encodedQuery(url.getEncodedFragment()).build().getQueryParameter(name);
}
static public String md5(String string) {
return md5(string.getBytes());
}
static public String md5(byte[] data) {
try {
// Create MD5 Hash
java.security.MessageDigest digest = java.security.MessageDigest
.getInstance("MD5");
digest.update(data);
byte messageDigest[] = digest.digest();
return toHexString(messageDigest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
@NonNull
public static String toHexString(byte[] bytes) {
// Create Hex String
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String h = Integer.toHexString(0xFF & b);
hexString.append(h.length() == 1 ? "0" : "").append(h);
}
return hexString.toString();
}
}