/* SWVibrationProfile.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.sw.profile; import android.content.Intent; import com.sonyericsson.extras.liveware.aef.control.Control; import org.deviceconnect.android.deviceplugin.sw.SWConstants; import org.deviceconnect.android.deviceplugin.sw.service.SWService; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.VibrationProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.DeleteApi; import org.deviceconnect.android.profile.api.PutApi; import org.deviceconnect.android.service.DConnectService; import org.deviceconnect.message.DConnectMessage; /** * SonySWデバイスプラグインの{@link VibrationProfile}実装. * @author NTT DOCOMO, INC. */ public class SWVibrationProfile extends VibrationProfile { private final DConnectApi mPutVibrateApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_VIBRATE; } @Override public boolean onRequest(final Intent request, final Intent response) { long[] pattern = parsePattern(getPattern(request)); if (pattern == null) { MessageUtils.setInvalidRequestParameterError(response); return true; } runThread(getService(), pattern); setResult(response, DConnectMessage.RESULT_OK); return true; } }; private final DConnectApi mDeleteVibrateApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_VIBRATE; } @Override public boolean onRequest(final Intent request, final Intent response) { Intent intent = new Intent(Control.Intents.CONTROL_STOP_VIBRATE_INTENT); sendToHostApp(intent); setResult(response, DConnectMessage.RESULT_OK); return true; } }; public SWVibrationProfile(final SWService.WatchType type) { addApi(mPutVibrateApi); switch (type) { case SW2: break; case MN2: addApi(mDeleteVibrateApi); break; default: break; } } /** * リクエストパラメータ省略時のバイブレーション鳴動時間. * * @return デフォルト鳴動時間 */ @Override protected long getMaxVibrationTime() { return SWConstants.MAX_VIBRATION_TIME; } /** * SmartExtensionAPIの仕様とDeviceConnectのpatternの仕様が違うため. * 非同期で処理をDeviceConnect側の仕様に合わせる 例) pattern=100,10,50 で * 100msec振動、10msec止まる、50msec振動 * * @param service サービス * @param origPattern 振動パターン */ private void runThread(final DConnectService service, final long[] origPattern) { Thread thread = new Thread() { public void run() { long[] pattern; if (origPattern.length % 2 != 0) { pattern = new long[origPattern.length + 1]; for (int i = 0; i < origPattern.length; i++) { pattern[i] = origPattern[i]; } pattern[pattern.length - 1] = 0; } else { pattern = origPattern; } long prevInterval = 0; for (int cnt = 0; cnt < pattern.length; cnt += 2) { try { if (prevInterval > 0) { Thread.sleep(prevInterval); } } catch (InterruptedException e) { // スレッドに対して割り込まれたら終了 return; } long on = (pattern[cnt] > 0) ? pattern[cnt] : 0; long off = (pattern[cnt + 1] > 0) ? pattern[cnt + 1] : 0; prevInterval = on + off; intentPut((int) on, (int) off, 1, service); } } }; thread.start(); } /** * intent送信. * * @param onDuration 振動時間 * @param offDuration 振動しない時間 * @param repeats 繰り返し回数 * @param service サービス */ protected void intentPut(final int onDuration, final int offDuration, final int repeats, final DConnectService service) { if (onDuration <= 0) { return; } int onDURATION; if (onDuration > SWConstants.MAX_VIBRATION_TIME) { onDURATION = SWConstants.MAX_VIBRATION_TIME; } else { onDURATION = onDuration; } Intent intent = new Intent(Control.Intents.CONTROL_VIBRATE_INTENT); intent.putExtra(Control.Intents.EXTRA_ON_DURATION, onDURATION); intent.putExtra(Control.Intents.EXTRA_OFF_DURATION, offDuration); intent.putExtra(Control.Intents.EXTRA_REPEATS, repeats); sendToHostApp(intent); } private void sendToHostApp(final Intent request) { ((SWService) getService()).sendRequest(request); } }