/*
TestUniqueProfile.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.test.profile.unique;
import android.content.Intent;
import android.os.Bundle;
import org.deviceconnect.android.deviceplugin.test.UnitTestDeviceService;
import org.deviceconnect.android.deviceplugin.test.profile.Util;
import org.deviceconnect.android.event.Event;
import org.deviceconnect.android.event.EventError;
import org.deviceconnect.android.event.EventManager;
import org.deviceconnect.android.message.MessageUtils;
import org.deviceconnect.android.profile.DConnectProfile;
import org.deviceconnect.message.DConnectMessage;
import org.deviceconnect.message.intent.message.IntentDConnectMessage;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
* 独自プロファイルテスト用プロファイル.
* @author NTT DOCOMO, INC.
*/
public class TestUniqueProfile extends DConnectProfile {
/**
* プロファイル名: {@value} .
*/
public static final String PROFILE_NAME = "unique";
/**
* インターフェース名: {@value} .
*/
public static final String INTERFACE_TEST = "test";
/**
* 属性名: {@value} .
*/
public static final String ATTRIBUTE_PING = "ping";
/**
* 属性名: {@value} .
*/
public static final String ATTRIBUTE_HEAVY = "heavy";
/**
* 属性名: {@value} .
*/
public static final String ATTRIBUTE_EVENT = "event";
/**
* パラメータ: {@value}.
*/
public static final String PARAM_PATH = "path";
/**
* パラメータ: {@value}.
*/
public static final String PARAM_KEY = "key";
/**
* パラメータ: {@value}.
*/
public static final String PARAM_TIME = "time";
/**
* イベントのタイマー.
*/
private Timer mEventTimer;
@Override
public String getProfileName() {
return PROFILE_NAME;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
final String inter = getInterface(request);
final String attribute = getAttribute(request);
final String path = createPath(request);
final String action = request.getAction();
final String key = request.getStringExtra(PARAM_KEY);
final String serviceId = getServiceID(request);
if (inter == null && ATTRIBUTE_EVENT.equals(attribute)) {
if (IntentDConnectMessage.ACTION_PUT.equals(action)) {
new Thread(new Runnable() {
@Override
public void run() {
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
// 定期的イベントの開始
startEvent(serviceId);
} else {
MessageUtils.setUnknownError(response, "event error: " + error.name());
}
response.putExtra(PARAM_KEY, key);
((UnitTestDeviceService) getContext()).sendResponse(response);
}
}).start();
return false;
} else if (IntentDConnectMessage.ACTION_DELETE.equals(action)) {
new Thread(new Runnable() {
@Override
public void run() {
// 定期的イベントの停止
stopEvent();
EventManager.INSTANCE.removeEvent(request);
setResult(response, DConnectMessage.RESULT_OK);
response.putExtra(PARAM_KEY, key);
((UnitTestDeviceService) getContext()).sendResponse(response);
}
}).start();
return false;
} else {
MessageUtils.setUnknownAttributeError(response);
return true;
}
} else if (inter == null && ATTRIBUTE_HEAVY.equals(attribute)) {
if (key == null) {
MessageUtils.setInvalidRequestParameterError(response);
return true;
}
new Thread(new Runnable() {
@Override
public void run() {
try {
setResult(response, DConnectMessage.RESULT_OK);
response.putExtra(PARAM_KEY, key);
Thread.sleep(1000);
} catch (InterruptedException e) {
MessageUtils.setUnknownError(response, "thread is interrupted. key=" + key);
}
((UnitTestDeviceService) getContext()).sendResponse(response);
}
}).start();
return false;
} else if ((inter == null && attribute == null)
|| (inter == null && ATTRIBUTE_PING.equals(attribute))
|| (INTERFACE_TEST.equals(inter) && ATTRIBUTE_PING.equals(attribute))) {
setResult(response, DConnectMessage.RESULT_OK);
setPath(response, path);
Bundle params = request.getExtras();
response.putExtra("key1", params.getString("key1"));
response.putExtra("key2", params.getString("key2"));
response.putExtra("key3", params.getString("key3"));
response.putExtra("key4", params.getString("key4"));
return true;
} else {
MessageUtils.setUnknownAttributeError(response);
return true;
}
}
/**
* Start Event.
* @param serviceId serviceId
*/
private synchronized void startEvent(final String serviceId) {
if (mEventTimer == null) {
mEventTimer = new Timer(true);
TimerTask task = new TimerTask() {
@Override
public void run() {
List<Event> events = EventManager.INSTANCE.getEventList(
serviceId, getProfileName(), null, ATTRIBUTE_EVENT);
for (Event event : events) {
Intent eventMsg = EventManager.createEventMessage(event);
eventMsg.putExtra(PARAM_TIME, System.currentTimeMillis());
Util.sendBroadcast(getContext(), eventMsg, 0);
}
}
};
mEventTimer.schedule(task, 0, 500);
}
}
/**
* Stop Event.
*/
private synchronized void stopEvent() {
if (mEventTimer != null) {
mEventTimer.cancel();
mEventTimer = null;
}
}
/**
* Set Path.
* @param response Response
* @param path Path
*/
private void setPath(final Intent response, final String path) {
response.putExtra(PARAM_PATH, path);
}
/**
* Create Path.
* @param request Request
* @return Create Path
*/
private String createPath(final Intent request) {
String action = request.getAction();
if (action == null) {
return null;
}
String method;
if (IntentDConnectMessage.ACTION_GET.equals(action)) {
method = "GET";
} else if (IntentDConnectMessage.ACTION_POST.equals(action)) {
method = "POST";
} else if (IntentDConnectMessage.ACTION_PUT.equals(action)) {
method = "PUT";
} else if (IntentDConnectMessage.ACTION_DELETE.equals(action)) {
method = "DELETE";
} else {
return null;
}
String inter = getInterface(request);
String attribute = getAttribute(request);
StringBuilder builder = new StringBuilder();
builder.append(method);
builder.append(" /");
builder.append(PROFILE_NAME);
if (inter != null) {
builder.append("/");
builder.append(inter);
}
if (attribute != null) {
builder.append("/");
builder.append(attribute);
}
return builder.toString();
}
}