/* ChromeCastMessage.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.core; import android.content.Intent; import com.google.android.gms.cast.Cast; import com.google.android.gms.cast.Cast.MessageReceivedCallback; import com.google.android.gms.cast.CastDevice; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import org.deviceconnect.android.deviceplugin.chromecast.BuildConfig; import java.io.IOException; /** * Chromecast Message クラス. * * <p> * メッセージ機能を提供する * </p> * @author NTT DOCOMO, INC. */ public class ChromeCastMessage implements ChromeCastController.Callbacks { /** Message Channel. */ private MessageChannel mMessageChannel; /** Chromecast Application. */ private ChromeCastController mApplication; /** メッセージの宛先. */ private String mUrn = null; /** メッセージのコールバック. */ private Callbacks mCallbacks; /** * Chromecastでのメッセージの受信状況を通知する. * * @author NTT DOCOMO, INC. * */ private class MessageChannel implements MessageReceivedCallback { /** * メッセージの宛先. */ private String mUrn = null; /** * コンストラクタ. * * @param urn メッセージの宛先(名前空間) */ public MessageChannel(final String urn) { this.mUrn = urn; } /** * メッセージの宛先(名前空間)を取得する. * * @return 名前空間 */ public String getNamespace() { return mUrn; } @Override public void onMessageReceived(final CastDevice castDevice, final String namespace, final String message) { } } /** * Chromecastでのメッセージ処理の結果を通知するコールバックのインターフェース. * * @author NTT DOCOMO, INC. */ public interface Callbacks { /** * メッセージ処理の結果を通知する. * * @param response レスポンス * @param result メッセージ処理結果 * @param message メッセージ処理のステータス */ void onChromeCastMessageResult(final Intent response, final Status result, final String message); } /** * コールバックを登録する. * * @param callbacks コールバック */ public void setCallbacks(final Callbacks callbacks) { this.mCallbacks = callbacks; } /** * コンストラクタ. * * @param application ChromeCastApplication * @param urn メッセージの宛先(名前空間) */ public ChromeCastMessage(final ChromeCastController application, final String urn) { this.mApplication = application; this.mApplication.addCallbacks(this); this.mUrn = urn; } /** * デバイスが有効か否かを返す. * * @return デバイスが有効か否か(有効: true, 無効: false) */ public boolean isDeviceEnable() { try { return (mApplication.getGoogleApiClient() != null); } catch (IllegalStateException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } return false; } } @Override public void onAttach() { mMessageChannel = new MessageChannel(this.mUrn); try { Cast.CastApi.setMessageReceivedCallbacks(mApplication.getGoogleApiClient(), mMessageChannel.getNamespace(), mMessageChannel); } catch (IllegalStateException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } catch (IOException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } } @Override public void onDetach() { if (mMessageChannel != null) { try { Cast.CastApi.removeMessageReceivedCallbacks(mApplication.getGoogleApiClient(), mMessageChannel.getNamespace()); } catch (IllegalStateException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } catch (IOException e) { if (BuildConfig.DEBUG) { e.printStackTrace(); } } mMessageChannel = null; } } /** * メッセージを送信する. * * @param response レスポンス * @param message メッセージ */ public void sendMessage(final Intent response, final String message) { try { if (mApplication.getGoogleApiClient() != null && mMessageChannel != null) { Cast.CastApi.sendMessage(mApplication.getGoogleApiClient(), mMessageChannel.getNamespace(), message) .setResultCallback(new ResultCallback<Status>() { @Override public void onResult(final Status result) { mCallbacks.onChromeCastMessageResult(response, result, null); } }); } } catch (IllegalStateException e) { mCallbacks.onChromeCastMessageResult(response, null, null); } } }