/* LinkingUtil.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.linking.linking; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; import android.util.Log; import org.deviceconnect.android.deviceplugin.linking.BuildConfig; public final class LinkingUtil { private static final String TAG = "LinkingPlugin"; public static final int LINKING_APP_VERSION = 20152; public static final String EXTRA_APP_NAME = ".sda.extra.APP_NAME"; public static final String EXTRA_DEVICE_ID = ".sda.extra.DEVICE_ID"; public static final String EXTRA_DEVICE_UID = ".sda.extra.DEVICE_UID"; public static final String EXTRA_INFORMATION = ".sda.extra.INFORMATION"; public static final String ACTION_SENSOR_DATA = "com.nttdocomo.android.smartdeviceagent.action.SENSOR_DATA"; public static final String ACTION_SENSOR_STOP = "com.nttdocomo.android.smartdeviceagent.action.STOP_SENSOR"; public static final String ACTION_START_SENSOR = "com.nttdocomo.android.smartdeviceagent.action.START_SENSOR"; public static final String ACTION_START_SENSOR_RESULT = "com.nttdocomo.android.smartdeviceagent.action.START_SENSOR_RESULT"; public static final Uri URI_DEVICES = Uri.parse("content://com.nttdocomo.android.smartdeviceagent/devices"); public static final String PACKAGE_NAME = "com.nttdocomo.android.smartdeviceagent"; public static final String ACTIVITY_NAME = "com.nttdocomo.android.smartdeviceagent.RequestStartActivity"; public static final String RECEIVER_NAME = "com.nttdocomo.android.smartdeviceagent.RequestReceiver"; public static final String EXTRA_SENSOR_TYPE = "com.nttdocomo.android.smartdeviceagent.extra.SENSOR_TYPE"; public static final String EXTRA_BD_ADDRESS = "com.nttdocomo.android.smartdeviceagent.extra.BD_ADDRESS"; public static final String EXTRA_SENSOR_INTERVAL = "com.nttdocomo.android.smartdeviceagent.extra.SENSOR_INTERVAL"; public static final String EXTRA_SENSOR_DURATION = "com.nttdocomo.android.smartdeviceagent.extra.SENSOR_DURATION"; public static final String EXTRA_X_THRESHOLD = "com.nttdocomo.android.smartdeviceagent.extra.X_THRESHOLD"; public static final String EXTRA_Y_THRESHOLD = "com.nttdocomo.android.smartdeviceagent.extra.Y_THRESHOLD"; public static final String EXTRA_Z_THRESHOLD = "com.nttdocomo.android.smartdeviceagent.extra.Z_THRESHOLD"; public static final String EXTRA_CONTENT_SENSOR_DATA = "com.nttdocomo.android.smartdeviceagent.extra.CONTENT_SENSOR_DATA"; public static final String DEVICE_ID = "DEVICE_ID"; public static final String DEVICE_UID = "DEVICE_UID"; public static final String DEVICE_BUTTON_ID = "DEVICE_BUTTON_ID"; public static final String DEVICE_NAME = "DEVICE_NAME"; public static final String RECEIVE_TIME = "RECEIVE_TIME"; public static final String BD_ADDRESS = "BD_ADDRESS"; public static final String CAPABILITY = "CAPABILITY"; public static final String EX_SENSOR_TYPE = "EX_SENSOR_TYPE"; public static final String RANGE = "RANGE"; public static final String RANGE_SETTING = "RANGE_SETTING"; public enum Result { RESULT_OK(-1), RESULT_CANCEL(1), RESULT_DEVICE_OFF(4), RESULT_CONNECT_FAILURE(5), RESULT_CONFLICT(6), RESULT_PARAM_ERROR(7), RESULT_SENSOR_UNSUPPORTED(8), RESULT_OTHER_ERROR (0); private int mValue; Result(int value) { mValue = value; } public int getValue() { return mValue; } public static Result valueOf(int value) { for (Result type : values()) { if (type.getValue() == value) { return type; } } return null; } } private LinkingUtil() { } public static IlluminationData.Setting getDefaultColorSettingOfLight(final LinkingDevice device) { byte[] illumination = device.getIllumination(); if (illumination == null) { return null; } try { IlluminationData data = new IlluminationData(illumination); for (IlluminationData.Setting setting : data.getColor().getChildren()) { if (!setting.getName(0).getName().toLowerCase().contains("off")) { return setting; } } return null; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } return null; } } public static IlluminationData.Setting getDefaultPatternSettingOfLight(final LinkingDevice device) { byte[] illumination = device.getIllumination(); if (illumination == null) { return null; } try { IlluminationData data = new IlluminationData(illumination); for (IlluminationData.Setting setting : data.getPattern().getChildren()) { if (!setting.getName(0).getName().toLowerCase().contains("off")) { return setting; } } return null; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } return null; } } public static IlluminationData.Setting getDefaultOffSettingOfLight(final LinkingDevice device) { byte[] illumination = device.getIllumination(); if (illumination == null) { return null; } try { IlluminationData data = new IlluminationData(illumination); for (IlluminationData.Setting setting : data.getPattern().getChildren()) { if (setting.getName(0).getName().toLowerCase().contains("off")) { return setting; } } return null; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } return null; } } public static Integer getDefaultOffSettingOfLightId(final LinkingDevice device) { IlluminationData.Setting setting = getDefaultOffSettingOfLight(device); if (setting != null) { return (int) setting.getId(); } return null; } public static VibrationData.Setting getDefaultOnSettingOfVibration(final LinkingDevice device) { byte[] vibration = device.getVibration(); if (vibration == null) { return null; } try { VibrationData data = new VibrationData(vibration); for (VibrationData.Setting setting : data.getPattern().getChildren()) { if (!setting.getName(0).getName().toLowerCase().contains("off")) { return setting; } } return null; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } return null; } } public static VibrationData.Setting getDefaultOffSettingOfVibration(final LinkingDevice device) { byte[] vibration = device.getVibration(); if (vibration == null) { return null; } try { VibrationData data = new VibrationData(vibration); for (VibrationData.Setting setting : data.getPattern().getChildren()) { if (setting.getName(0).getName().toLowerCase().contains("off")) { return setting; } } return null; } catch (Exception e) { if (BuildConfig.DEBUG) { Log.w(TAG, "", e); } return null; } } public static Integer getDefaultOffSettingOfVibrationId(final LinkingDevice device) { VibrationData.Setting setting = getDefaultOffSettingOfVibration(device); if (setting != null) { return (int) setting.getId(); } return null; } public static void startGooglePlay(final Context context) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + PACKAGE_NAME)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } public static void startLinkingApp(final Context context) { context.startActivity(context.getPackageManager().getLaunchIntentForPackage(PACKAGE_NAME)); } public static boolean isApplicationInstalled(final Context context) { try { context.getPackageManager().getPackageInfo(PACKAGE_NAME, PackageManager.GET_META_DATA); return true; } catch (PackageManager.NameNotFoundException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } return false; } public static int getVersionCode(final Context context) { PackageManager pm = context.getPackageManager(); int versionCode = 0; try{ PackageInfo packageInfo = pm.getPackageInfo(PACKAGE_NAME, 0); versionCode = packageInfo.versionCode; }catch(PackageManager.NameNotFoundException e){ e.printStackTrace(); } return versionCode; } public static int byteToShort(final byte[] buf) { return (((buf[1] << 8) & 0xFF00) | (buf[0] & 0xff)); } public static int byteToInt(final byte[] buf) { return ((buf[3] << 24) & 0xFF000000) | ((buf[2] << 16) & 0xFF0000) | ((buf[1] << 8) & 0xFF00) | (buf[0] & 0xFF); } public static int floatToIntIEEE754(final float value, final int fraction, final int exponent, final boolean sign) { float tmpValue = Math.abs(value); int mask = mask(fraction); int bias = (int) Math.pow(2, exponent - 1) - 1; int integer = (int) Math.floor(tmpValue); float decimal = tmpValue - (float) integer; int d = getDecimal(decimal, fraction); int v = (integer << fraction); v |= d; int count = 0; if (integer > 0) { count = getCount(integer, exponent); v = (v >> count) & mask; } else { int bit = (1 << (fraction - 1)); for (int i = 0; i < fraction; i++) { v = ((v << 1) & mask); count--; if ((v & bit) != 0) { break; } } v = ((v << 1) & mask); count--; } bias += count; v = (bias << fraction) | v; if (sign && value < 0) { v = (v | (1 << (exponent + fraction))); } return v; } private static int getCount(final int v, final int exponent) { int result = 0; int bit = 1; for (int i = 0; i < exponent; i++) { if ((v & bit) != 0) { result = i; } bit <<= 1; } return result; } private static int getDecimal(float value, int fraction) { int v = 0; while (fraction > 0) { fraction--; float tmp = value * 2; if (tmp < 1.0f) { value = tmp; } else if (tmp > 1) { v |= (1 << fraction); value = tmp - 1.0f; } else { v |= (1 << fraction); break; } } return v; } public static float intToFloatIEEE754(final int value, final int fraction, final int exponent, final boolean sign) { if (value == 0) { return 0.0f; } int mantissa = value & mask(fraction); int bais = (value >> fraction) & mask(exponent); bais -= Math.pow(2, exponent - 1) - 1; int integer = 0; float decimal = 0; if (bais >= 0) { { int t = 1; int bit = 1 << (fraction - bais); for (int p = fraction - bais; p < fraction; p++) { if ((mantissa & bit) != 0) { integer += t; } t <<= 1; bit <<= 1; } integer += t; } { int t = 1; int bit = 1 << (fraction - bais - 1); for (int p = fraction - bais - 1; p > 0; p--) { if ((mantissa & bit) != 0) { decimal += pow(t); } t++; bit >>= 1; } } } else { int t = Math.abs(bais); int bit = 1 << (fraction - 1); decimal += pow(t); for (int p = fraction; p >= 0; p--) { t++; if ((mantissa & bit) != 0) { decimal += pow(t); } bit >>= 1; } } if (sign) { int bit = 1 << (fraction + exponent); if ((value & bit) != 0) { return -(integer + decimal); } } return integer + decimal; } private static double pow(final int count) { double t = 1; for (int i = 0; i < count; i++) { t = t / 2.0; } return t; } private static int mask(final int value) { int t = 1; for (int i = 0; i < value - 1; i++) { t = t | (t << 1); } return t; } }