/* VibrationData.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 org.deviceconnect.android.deviceplugin.linking.util.ByteUtil; public class VibrationData { private static final byte[] HEADER = { (byte) 0xB1, (byte) 0x03, (byte) 0x00, (byte) 0x00 }; private byte[] mSource; private byte[] mHeader = new byte[4];//ヘッダ。固定値(0xB1,0x03,0x00,0x00) private byte mVibrationId;//バイブレーション項目ID。固定値(0x10) private int mVibrationChildCount;//バイブレーションパターン選択数 private byte mVibrationDefaultSettingId;//バイブレーションデフォルト設定ID。子項目の中でのデフォルト設定IDを示す。 private int mVibrationNameLangCount;//項目名言語数。"2"固定。 private Name[] mVibrationNames; private Setting mPattern; public Setting getPattern() { return mPattern; } public class Setting { private byte mId;//ID private int mChildCount;//子項目数 private byte mDefaultSettingId;//デフォルト設定ID private int mNameLangCount;//項目名言語数 private Name[] mNames; private Setting[] mChildren; public byte getId() { return mId; } public int getChildCount() { return mChildCount; } public byte getDefaultSettingId() { return mDefaultSettingId; } public int getNameLangCount() { return mNameLangCount; } public Name getName(int index) { return mNames[index]; } public Name[] getNames() { return mNames; } public Setting getChild(int index) { return mChildren[index]; } public Setting[] getChildren() { return mChildren; } @Override public String toString() { return Setting.class.getSimpleName() + ":{mId:" + ByteUtil.byteToHex(mId) + ", mChildCount:" + mChildCount + ", mDefaultSettingId:" + ByteUtil.byteToHex(mDefaultSettingId) + "," + " mNameLangCount:" + mNameLangCount + ", mNames:" + toString(mNames) + ", mChildren:" + toString(mChildren) + "}"; } private String toString(Object[] list) { if (list == null) { return ""; } String s = "["; for (Object obj : list) { s += obj.toString() + " "; } s += "]"; return s; } } public class Name { private String mNameLang;//言語。"ja"固定。 private int mSize;//名前のサイズ。 private String mName;//項目名(UTF-8)。 public String getNameLang() { return mNameLang; } public int getSize() { return mSize; } public String getName() { return mName; } @Override public String toString() { return Name.class.getSimpleName() + ":{mNameLang:" + mNameLang + ", mSize:" + mSize + ", mName:" + mName + "}"; } } public VibrationData(final byte[] vibration) { mSource = vibration; int index = 0; mHeader[0] = vibration[index++]; mHeader[1] = vibration[index++]; mHeader[2] = vibration[index++]; mHeader[3] = vibration[index++]; for (int i = 0; i < HEADER.length; i++) { if (mHeader[i] != HEADER[i]) { throw new IllegalArgumentException("Header is invalid."); } } mVibrationId = vibration[index++]; if (mVibrationId != 0x10) { throw new IllegalArgumentException("バイブレーション項目ID is invalid."); } mVibrationChildCount = vibration[index++]; mVibrationDefaultSettingId = vibration[index++]; mVibrationNameLangCount = vibration[index++] & 0xFF; mVibrationNames = new Name[mVibrationNameLangCount]; index = extractName(vibration, index, mVibrationNameLangCount, mVibrationNames); Setting pattern = new Setting(); if (mVibrationChildCount > 0) { pattern.mChildren = new Setting[mVibrationChildCount]; for (int i = 0; i < mVibrationChildCount; i++) { Setting child = new Setting(); index = makeSetting(child, mSource, index, true); pattern.mChildren[i] = child; } } mPattern = pattern; } private int makeSetting(Setting setting, byte[] source, int offset, boolean isChild) { setting.mId = source[offset++]; setting.mChildCount = source[offset++] & 0xFF; if (!isChild) { setting.mDefaultSettingId = source[offset++]; } setting.mNameLangCount = source[offset++] & 0xFF; setting.mNames = new Name[setting.mNameLangCount]; offset = extractName(source, offset, setting.mNameLangCount, setting.mNames); return offset; } private int extractName(byte[] source, int offset, int count, Name[] names) { for (int i = 0; i < count; i++) { names[i] = new Name(); byte[] tmp = new byte[2]; tmp[0] = source[offset++]; tmp[1] = source[offset++]; names[i].mNameLang = ByteUtil.binaryToString(tmp); int size = source[offset++] & 0xFF; names[i].mSize = size; tmp = new byte[size]; for (int j = 0; j < size; j++) { tmp[j] = source[offset++]; } names[i].mName = ByteUtil.binaryToString(tmp); } return offset; } @Override public String toString() { return new StringBuilder("{mHeader: ") .append(ByteUtil.binaryToHex(mHeader)) .append(", mVibrationId: ") .append(ByteUtil.byteToHex(mVibrationId)) .append(", mVibrationChildCount: ") .append(mVibrationChildCount) .append(", mVibrationDefaultSettingId: ") .append(ByteUtil.byteToHex(mVibrationDefaultSettingId)) .append(", mVibrationNameLangCount: ") .append(mVibrationNameLangCount) .append(", mVibrationNames: ") .append(toString(mVibrationNames)) .append(", pattern: ") .append(mPattern.toString()) .append("}") .toString(); } private String toString(Object[] list) { if (list == null) { return ""; } String s = "["; for (Object obj : list) { s += obj.toString() + " "; } s += "]"; return s; } }