/*
SonyCameraDeviceService
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.sonycamera;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import org.deviceconnect.android.deviceplugin.sonycamera.profile.SonyCameraSystemProfile;
import org.deviceconnect.android.deviceplugin.sonycamera.service.SonyCameraService;
import org.deviceconnect.android.deviceplugin.sonycamera.utils.SonyCameraUtil;
import org.deviceconnect.android.event.Event;
import org.deviceconnect.android.event.EventManager;
import org.deviceconnect.android.message.DConnectMessageService;
import org.deviceconnect.android.profile.SystemProfile;
import java.util.List;
import java.util.logging.Logger;
/**
* SonyCameraデバイスプラグイン用サービス.
* @author NTT DOCOMO, INC.
*/
public class SonyCameraDeviceService extends DConnectMessageService {
/**
* ロガー.
*/
private Logger mLogger = Logger.getLogger("sonycamera.dplugin");
/**
* SonyCamera管理クラス.
*/
private SonyCameraManager mSonyCameraManager;
@Override
public void onCreate() {
super.onCreate();
mSonyCameraManager = new SonyCameraManager(this);
mSonyCameraManager.setOnSonyCameraManagerListener(new SonyCameraManager.OnSonyCameraManagerListener() {
@Override
public void onTakePicture(final String postImageUrl) {
notifyTakePhoto(mSonyCameraManager.getServiceId(), postImageUrl);
}
@Override
public void onAdded(final SonyCameraService service) {
getServiceProvider().addService(service);
}
@Override
public void onError() {
}
});
for (SonyCameraService service : mSonyCameraManager.getSonyCameraServices()) {
getServiceProvider().addService(service);
}
WifiManager wifiMgr = getWifiManager();
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
if (SonyCameraUtil.checkSSID(wifiInfo.getSSID())) {
mSonyCameraManager.connectSonyCamera();
}
}
@Override
public void onDestroy() {
mSonyCameraManager.disconnectSonyCamera();
super.onDestroy();
}
@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
if (intent == null) {
return START_STICKY;
}
String action = intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
mLogger.info("Received: WIFI_STATE_CHANGED_ACTION");
int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
if (state == WifiManager.WIFI_STATE_ENABLED) {
WifiManager wifiMgr = getWifiManager();
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
if (SonyCameraUtil.checkSSID(wifiInfo.getSSID())) {
mSonyCameraManager.connectSonyCamera();
} else {
mSonyCameraManager.disconnectSonyCamera();
}
} else if (state == WifiManager.WIFI_STATE_DISABLED) {
mSonyCameraManager.disconnectSonyCamera();
}
return START_STICKY;
} else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
mLogger.info("Received: NETWORK_STATE_CHANGED_ACTION");
NetworkInfo ni = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if (ni != null) {
NetworkInfo.State state = ni.getState();
int type = ni.getType();
mLogger.info("Active network: type = " + ni.getTypeName()
+ ", connected = " + ni.isConnected()
+ ", available = " + ni.isAvailable()
+ ", state = " + ni.getDetailedState());
if (ni.isConnected() && state == NetworkInfo.State.CONNECTED && type == ConnectivityManager.TYPE_WIFI) {
WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
mLogger.info("Active Wi-Fi: SSID = " + wifiInfo.getSSID()
+ ", supplicantState = " + wifiInfo.getSupplicantState());
if (SonyCameraUtil.checkSSID(wifiInfo.getSSID())) {
mSonyCameraManager.connectSonyCamera();
} else {
mSonyCameraManager.disconnectSonyCamera();
}
}
} else {
mLogger.info("No active network. ");
}
return START_STICKY;
}
return super.onStartCommand(intent, flags, startId);
}
@Override
protected void onManagerUninstalled() {
// Managerアンインストール検知時の処理。
if (BuildConfig.DEBUG) {
mLogger.info("Plug-in : onManagerUninstalled");
}
}
@Override
protected void onManagerTerminated() {
// Manager正常終了通知受信時の処理。
if (BuildConfig.DEBUG) {
mLogger.info("Plug-in : onManagerTerminated");
}
}
@Override
protected void onManagerEventTransmitDisconnected(String sessionKey) {
// ManagerのEvent送信経路切断通知受信時の処理。
if (BuildConfig.DEBUG) {
mLogger.info("Plug-in : onManagerEventTransmitDisconnected");
}
if (sessionKey != null) {
EventManager.INSTANCE.removeEvents(sessionKey);
} else {
EventManager.INSTANCE.removeAll();
}
}
@Override
protected void onDevicePluginReset() {
// Device Plug-inへのReset要求受信時の処理。
if (BuildConfig.DEBUG) {
mLogger.info("Plug-in : onDevicePluginReset");
}
EventManager.INSTANCE.removeAll();
mSonyCameraManager.resetSonyCamera();
}
@Override
protected SystemProfile getSystemProfile() {
return new SonyCameraSystemProfile();
}
/**
* SonyCameraManagerのインスタンスを取得します.
* @return SonyCameraManagerのインスタンス
*/
public SonyCameraManager getSonyCameraManager() {
return mSonyCameraManager;
}
/**
* WifiManagerを取得する.
* @return WifiManagerのインスタンス
*/
private WifiManager getWifiManager() {
return (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
}
/**
* 写真撮影を通知する.
*
* @param serviceId サービスID
* @param uri 写真へのURI
*/
private void notifyTakePhoto(final String serviceId, final String uri) {
if (serviceId == null) {
return;
}
List<Event> eventList = EventManager.INSTANCE.getEventList(serviceId,
"mediaStreamRecording", null, "onPhoto");
for (Event evt : eventList) {
Bundle photo = new Bundle();
photo.putString("uri", uri);
photo.putString("mimeType", "image/jpg");
Intent intent = EventManager.createEventMessage(evt);
intent.putExtra("photo", photo);
sendEvent(intent, evt.getAccessToken());
}
}
}