/* ChromeCastNotificationProfile.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.chromecast.profile; import android.content.Intent; import org.deviceconnect.android.deviceplugin.chromecast.ChromeCastService; import org.deviceconnect.android.deviceplugin.chromecast.core.ChromeCastMessage; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.NotificationProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.DeleteApi; import org.deviceconnect.android.profile.api.PostApi; import org.deviceconnect.message.DConnectMessage; import org.json.JSONException; import org.json.JSONObject; /** * Notification プロファイル (Chromecast). * <p> * Chromecastのノーティフィケーションの操作機能を提供する * </p> * @author NTT DOCOMO, INC. */ public class ChromeCastNotificationProfile extends NotificationProfile implements ChromeCastConstants { /** Chromecastが無効になっているときのエラーメッセージ. */ private static final String ERROR_MESSAGE_DEVICE_NOT_ENABLED = "Chromecast is not enabled."; /** 通知ID. 全リクエストに対して共通. */ private static final String COMMON_ID = "dConnectDeviceChromeCast"; public ChromeCastNotificationProfile() { addApi(mPostNotificationApi); addApi(mDeleteNotificationApi); } /** * デバイスが有効か否かを返す<br/>. * デバイスが無効の場合、レスポンスにエラーを設定する * * @param response レスポンス * @param app ChromeCastMediaPlayer * @return デバイスが有効か否か(有効: true, 無効: false) */ private boolean isDeviceEnable(final Intent response, final ChromeCastMessage app) { if (!app.isDeviceEnable()) { MessageUtils.setIllegalDeviceStateError(response, ERROR_MESSAGE_DEVICE_NOT_ENABLED); setResult(response, DConnectMessage.RESULT_ERROR); return false; } return true; } private final DConnectApi mPostNotificationApi = new PostApi() { @Override public String getAttribute() { return ATTRIBUTE_NOTIFY; } @Override public boolean onRequest(final Intent request, final Intent response) { final String serviceId = getServiceID(request); final String body = NotificationProfile.getBody(request); final NotificationType type = NotificationProfile.getType(request); ((ChromeCastService) getContext()).connectChromeCast(serviceId, new ChromeCastService.Callback() { @Override public void onResponse(final boolean connected) { if (!connected) { MessageUtils.setIllegalDeviceStateError(response, "The chromecast is not in local network."); sendResponse(response); return; } ChromeCastMessage app = ((ChromeCastService) getContext()).getChromeCastMessage(); if (body == null) { MessageUtils.setInvalidRequestParameterError(response, "body is null"); response.putExtra(DConnectMessage.EXTRA_RESULT, DConnectMessage.RESULT_ERROR); sendResponse(response); return; } switch (type) { case PHONE: break; case MAIL: break; case SMS: break; case EVENT: break; default: MessageUtils.setInvalidRequestParameterError(response, "type is null or invalid"); response.putExtra(DConnectMessage.EXTRA_RESULT, DConnectMessage.RESULT_ERROR); sendResponse(response); return; } if (!isDeviceEnable(response, app)) { sendResponse(response); return; } try { JSONObject json = new JSONObject(); json.put(KEY_FUNCTION, FUNCTION_POST_NOTIFICATION); json.put(KEY_TYPE, type.getValue()); json.put(KEY_MESSAGE, body); setNotificationId(response, COMMON_ID); app.sendMessage(response, json.toString()); } catch (JSONException e) { MessageUtils.setUnknownError(response); sendResponse(response); } } }); return false; } }; private final DConnectApi mDeleteNotificationApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_NOTIFY; } @Override public boolean onRequest(final Intent request, final Intent response) { final String serviceId = getServiceID(request); final String notificationId = NotificationProfile.getNotificationId(request); ((ChromeCastService) getContext()).connectChromeCast(serviceId, new ChromeCastService.Callback() { @Override public void onResponse(final boolean connected) { if (!connected) { MessageUtils.setIllegalDeviceStateError(response, "The chromecast is not in local network."); sendResponse(response); return; } if (notificationId == null || !COMMON_ID.equals(notificationId)) { MessageUtils.setInvalidRequestParameterError(response, "notificationId is invalid."); sendResponse(response); return; } ChromeCastMessage app = ((ChromeCastService) getContext()).getChromeCastMessage(); if (!isDeviceEnable(response, app)) { sendResponse(response); return; } try { JSONObject json = new JSONObject(); json.put(KEY_FUNCTION, FUNCTION_DELETE_NOTIFICATION); app.sendMessage(response, json.toString()); } catch (JSONException e) { MessageUtils.setUnknownError(response); sendResponse(response); } } }); return false; } }; }