/* HitoeDeviceService Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.hitoe; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Handler; import android.util.Log; import org.deviceconnect.android.deviceplugin.hitoe.data.HitoeDevice; import org.deviceconnect.android.deviceplugin.hitoe.data.HitoeManager; import org.deviceconnect.android.deviceplugin.hitoe.profile.HitoeServiceDiscoveryProfile; import org.deviceconnect.android.deviceplugin.hitoe.profile.HitoeSystemProfile; import org.deviceconnect.android.event.EventManager; import org.deviceconnect.android.event.cache.MemoryCacheController; import org.deviceconnect.android.message.DConnectMessageService; import org.deviceconnect.android.profile.SystemProfile; import org.deviceconnect.android.service.DConnectService; import java.util.List; /** * This service provide Hitoe Profile. * @author NTT DOCOMO, INC. */ public class HitoeDeviceService extends DConnectMessageService { /** * Tag. */ private final String TAG = "HitoeDeviceService"; /** * Instance of handler. */ private final Handler mHandler = new Handler(); /** * Received a event that Bluetooth has been changed. */ private final BroadcastReceiver mSensorReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { String action = intent.getAction(); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); if (state == BluetoothAdapter.STATE_ON) { getManager().start(); } else if (state == BluetoothAdapter.STATE_OFF) { getManager().stop(); } } } }; /** * Connected Hitoe's info listener. */ private final HitoeManager.OnHitoeConnectionListener mOnHitoeConnectionListener = new HitoeManager.OnHitoeConnectionListener() { @Override public void onConnected(final HitoeDevice device) { DConnectService service = new HitoeService(getManager(), device); service.setOnline(true); getServiceProvider().addService(service); } @Override public void onConnectFailed(final HitoeDevice device) { if (device == null) { return; } DConnectService service = getServiceProvider().getService(device.getId()); if (service != null) { service.setOnline(false); } } @Override public void onDiscovery(final List<HitoeDevice> devices) { for (HitoeDevice device: devices) { if (device.getPinCode() != null) { DConnectService service = new HitoeService(getManager(), device); getServiceProvider().addService(service); } } } @Override public void onDisconnected(final int res, final HitoeDevice device) { DConnectService service = getServiceProvider().getService(device.getId()); if (service != null) { service.setOnline(false); } } @Override public void onDeleted(final HitoeDevice device) { DConnectService service = getServiceProvider().getService(device.getId()); if (service != null) { getServiceProvider().removeService(service); } } }; @Override public void onCreate() { super.onCreate(); HitoeApplication app = (HitoeApplication) getApplication(); app.initialize(); EventManager.INSTANCE.setController(new MemoryCacheController()); getManager().addHitoeConnectionListener(mOnHitoeConnectionListener); registerBluetoothFilter(); addProfile(new HitoeServiceDiscoveryProfile(getServiceProvider())); HitoeManager mgr = getManager(); if (mgr != null) { List<HitoeDevice> devices = mgr.getRegisterDevices(); for (HitoeDevice device : devices) { if (device.getPinCode() != null) { getServiceProvider().addService(new HitoeService(mgr, device)); } } } } @Override public void onDestroy() { super.onDestroy(); unregisterBluetoothFilter(); getManager().stop(); } @Override protected SystemProfile getSystemProfile() { return new HitoeSystemProfile(); } @Override protected void onManagerUninstalled() { if (BuildConfig.DEBUG) { Log.d(TAG, "onManagerUninstalled"); } getManager().stop(); EventManager.INSTANCE.removeAll(); removeAllServices(); } @Override protected void onManagerTerminated() { if (BuildConfig.DEBUG) { Log.d(TAG, "onManagerTerminated"); } EventManager.INSTANCE.removeAll(); removeAllServices(); } @Override protected void onManagerEventTransmitDisconnected(final String sessionKey) { if (BuildConfig.DEBUG) { Log.d(TAG, "onManagerEventTransmitDisconnected: " + sessionKey); } if (sessionKey != null) { EventManager.INSTANCE.removeEvents(sessionKey); } else { EventManager.INSTANCE.removeAll(); } } @Override protected void onDevicePluginReset() { if (BuildConfig.DEBUG) { Log.d(TAG, "onDevicePluginReset"); } resetService(); } /** * Register a BroadcastReceiver of Bluetooth event. */ private void registerBluetoothFilter() { IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); registerReceiver(mSensorReceiver, filter, null, mHandler); } /** * Unregister a previously registered BroadcastReceiver. */ private void unregisterBluetoothFilter() { unregisterReceiver(mSensorReceiver); } /** * Gets a instance of HeartRateManager. * * @return HeartRateManager */ private HitoeManager getManager() { HitoeApplication app = (HitoeApplication) getApplication(); return app.getHitoeManager(); } /** * Remove All service. */ private void removeAllServices() { List<DConnectService> services = getServiceProvider().getServiceList(); for (DConnectService service : services) { getServiceProvider().removeService(service); } } /** * Reset service. */ private void resetService() { removeAllServices(); HitoeManager mgr = getManager(); if (mgr != null) { List<HitoeDevice> devices = mgr.getRegisterDevices(); for (HitoeDevice device : devices) { if (device.getPinCode() != null) { getServiceProvider().addService(new HitoeService(mgr, device)); } } } } }