/*
RemoveEventsRequest.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.manager.request;
import android.content.Intent;
import android.util.SparseArray;
import org.deviceconnect.android.manager.DevicePlugin;
import org.deviceconnect.android.profile.DConnectProfile;
import org.deviceconnect.message.intent.message.IntentDConnectMessage;
import java.util.List;
import java.util.UUID;
import java.util.logging.Logger;
/**
* 各デバイスプラグインにイベント解除要求を行う.
* @author NTT DOCOMO, INC.
*/
public class RemoveEventsRequest extends DConnectRequest {
/** レスポンスが返ってきた個数. */
private int mResponseCount;
/** リクエストコードを格納する配列. */
private SparseArray<DevicePlugin> mRequestCodeArray = new SparseArray<DevicePlugin>();
/** ロガー. */
private final Logger mLogger = Logger.getLogger("dconnect.manager");
/** ロックオブジェクト. */
private final Object mLockObj = new Object();
@Override
public void setResponse(final Intent response) {
// リクエストコードを取得
int requestCode = response.getIntExtra(
IntentDConnectMessage.EXTRA_REQUEST_CODE, -1);
if (requestCode == -1) {
mLogger.warning("Illegal requestCode. requestCode=" + requestCode);
return;
}
// レスポンス個数を追加
mResponseCount++;
synchronized (mLockObj) {
mLockObj.notifyAll();
}
}
@Override
public boolean hasRequestCode(final int requestCode) {
return mRequestCodeArray.get(requestCode) != null;
}
@Override
public void run() {
if (mRequest == null) {
throw new RuntimeException("mRequest is null.");
}
if (mPluginMgr == null) {
throw new RuntimeException("mDevicePluginManager is null.");
}
List<DevicePlugin> plugins = mPluginMgr.getDevicePlugins();
for (int i = 0; i < plugins.size(); i++) {
DevicePlugin plugin = plugins.get(i);
// 送信用のIntentを作成
Intent request = createRequestMessage(mRequest, plugin);
String sessionKey = DConnectProfile.getSessionKey(request);
if (sessionKey != null) {
mPluginMgr.appendPluginIdToSessionKey(request, plugin);
}
// リクエストコード作成
int requestCode = UUID.randomUUID().hashCode();
mRequestCodeArray.put(requestCode, plugin);
request.setComponent(plugin.getComponentName());
request.putExtra(IntentDConnectMessage.EXTRA_REQUEST_CODE, requestCode);
mContext.sendBroadcast(request);
}
// 各デバイスのレスポンスを待つ
long start = System.currentTimeMillis();
while (plugins.size() > 0 && mResponseCount < plugins.size()) {
synchronized (mLockObj) {
try {
mLockObj.wait(mTimeout);
} catch (InterruptedException e) {
// do nothing.
mLogger.warning("Exception ouccered in wait.");
}
}
// タイムアウトチェック
if (System.currentTimeMillis() - start > mTimeout) {
break;
}
}
// パラメータを設定する
mResponse = new Intent(IntentDConnectMessage.ACTION_RESPONSE);
mResponse.putExtra(IntentDConnectMessage.EXTRA_RESULT,
IntentDConnectMessage.RESULT_OK);
// レスポンスを返却する
sendResponse(mResponse);
}
}