/*
ThetaDeviceService
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.theta;
import com.theta360.lib.PtpipInitiator;
import com.theta360.lib.ThetaException;
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDevice;
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceClient;
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceEventListener;
import org.deviceconnect.android.deviceplugin.theta.core.ThetaDeviceManager;
import org.deviceconnect.android.deviceplugin.theta.profile.ThetaMediaStreamRecordingProfile;
import org.deviceconnect.android.deviceplugin.theta.profile.ThetaOmnidirectionalImageProfile;
import org.deviceconnect.android.deviceplugin.theta.profile.ThetaSystemProfile;
import org.deviceconnect.android.deviceplugin.theta.service.ThetaImageService;
import org.deviceconnect.android.deviceplugin.theta.service.ThetaService;
import org.deviceconnect.android.event.EventManager;
import org.deviceconnect.android.event.cache.MemoryCacheController;
import org.deviceconnect.android.message.DConnectMessageService;
import org.deviceconnect.android.profile.OmnidirectionalImageProfile;
import org.deviceconnect.android.profile.SystemProfile;
import org.deviceconnect.android.provider.FileManager;
import org.deviceconnect.android.service.DConnectService;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
* Theta Device Service.
*
* @author NTT DOCOMO, INC.
*/
public class ThetaDeviceService extends DConnectMessageService
implements ThetaDeviceEventListener {
/** ロガー. */
private final Logger mLogger = Logger.getLogger("theta.dplugin");
private static final String TYPE_NONE = "none";
private ThetaDeviceManager mDeviceMgr;
private ThetaDeviceClient mClient;
private FileManager mFileMgr;
private ThetaMediaStreamRecordingProfile mThetaMediaStreamRecording;
@Override
public void onCreate() {
super.onCreate();
ThetaDeviceApplication app = (ThetaDeviceApplication) getApplication();
mDeviceMgr = app.getDeviceManager();
mDeviceMgr.registerDeviceEventListener(this);
mDeviceMgr.checkConnectedDevice();
mClient = new ThetaDeviceClient(mDeviceMgr);
mFileMgr = new FileManager(this);
EventManager.INSTANCE.setController(new MemoryCacheController());
getServiceProvider().addService(new ThetaImageService(app.getHeadTracker()));
}
@Override
public void onDestroy() {
mDeviceMgr.unregisterDeviceEventListener(this);
try {
PtpipInitiator.close();
} catch (ThetaException e) {
// Nothing to do.
}
super.onDestroy();
}
@Override
protected SystemProfile getSystemProfile() {
return new ThetaSystemProfile();
}
@Override
public void onConnected(final ThetaDevice device) {
DConnectService service = getServiceProvider().getService(device.getId());
if (service == null) {
service = new ThetaService(device, mClient, mFileMgr);
getServiceProvider().addService(service);
mThetaMediaStreamRecording = (ThetaMediaStreamRecordingProfile)service.getProfile(ThetaMediaStreamRecordingProfile.PROFILE_NAME);
}
service.setOnline(true);
}
@Override
public void onDisconnected(final ThetaDevice device) {
if (getServiceProvider().hasService(device.getId())) {
DConnectService service = getServiceProvider().getService(device.getId());
service.setOnline(false);
}
}
@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");
}
resetPluginResource();
}
/**
* リソースリセット処理.
*/
private void resetPluginResource() {
/** 全イベント削除. */
EventManager.INSTANCE.removeAll();
/** 記録処理・プレビュー停止 */
if (mThetaMediaStreamRecording != null) {
mThetaMediaStreamRecording.forcedStopRecording();
}
List<ThetaOmnidirectionalImageProfile> omnidirectionalImageProfiles = new ArrayList<>();
for (DConnectService service : getServiceProvider().getServiceList()) {
ThetaOmnidirectionalImageProfile profile = (ThetaOmnidirectionalImageProfile) service.getProfile(OmnidirectionalImageProfile.PROFILE_NAME);
if (profile != null && !omnidirectionalImageProfiles.contains(profile)) {
omnidirectionalImageProfiles.add(profile);
}
}
for (ThetaOmnidirectionalImageProfile profile : omnidirectionalImageProfiles) {
profile.forceStopPreview();
}
}
}