/* LinkingAtmosphericPressureProfile.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.linking.beacon.profile; import android.content.Intent; import android.util.Log; import org.deviceconnect.android.deviceplugin.linking.BuildConfig; import org.deviceconnect.android.deviceplugin.linking.LinkingApplication; import org.deviceconnect.android.deviceplugin.linking.LinkingDevicePluginService; import org.deviceconnect.android.deviceplugin.linking.beacon.LinkingBeaconManager; import org.deviceconnect.android.deviceplugin.linking.beacon.data.AtmosphericPressureData; import org.deviceconnect.android.deviceplugin.linking.beacon.data.LinkingBeacon; import org.deviceconnect.android.deviceplugin.linking.beacon.service.LinkingBeaconService; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.AtmosphericPressureProfile; import org.deviceconnect.android.profile.api.DConnectApi; import org.deviceconnect.android.profile.api.GetApi; import org.deviceconnect.message.DConnectMessage; public class LinkingAtmosphericPressureProfile extends AtmosphericPressureProfile { private static final String TAG = "LinkingPlugin"; private static final int TIMEOUT = 30 * 1000; public LinkingAtmosphericPressureProfile() { addApi(mGetAtmosphericPressure); } private final DConnectApi mGetAtmosphericPressure = new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { LinkingBeaconManager mgr = getLinkingBeaconManager(); LinkingBeacon beacon = ((LinkingBeaconService) getService()).getLinkingBeacon(); AtmosphericPressureData apd = beacon.getAtmosphericPressureData(); if (apd != null && System.currentTimeMillis() - apd.getTimeStamp() < TIMEOUT) { setAtmosphericPressureToResponse(response, apd); mgr.startBeaconScanWithTimeout(TIMEOUT); return true; } mgr.addOnBeaconAtmosphericPressureEventListener(new OnBeaconAtmosphericPressureEventListenerImpl(mgr, beacon) { @Override public void onCleanup() { mBeaconManager.removeOnBeaconAtmosphericPressureEventListener(this); } @Override public void onDisableScan(final String message) { if (mCleanupFlag) { return; } if (BuildConfig.DEBUG) { Log.i(TAG, "onAtmosphericPressure: disable scan."); } MessageUtils.setIllegalDeviceStateError(response, message); sendResponse(response); } @Override public void onTimeout() { if (mCleanupFlag) { return; } if (BuildConfig.DEBUG) { Log.i(TAG, "onAtmosphericPressure: timeout"); } MessageUtils.setTimeoutError(response); sendResponse(response); } @Override public synchronized void onAtmosphericPressure(final LinkingBeacon beacon, final AtmosphericPressureData atmosphericPressure) { if (mCleanupFlag || !beacon.equals(mBeacon)) { return; } if (BuildConfig.DEBUG) { Log.i(TAG, "onAtmosphericPressure: beacon=" + beacon.getDisplayName() + " atmosphericPressure=" + atmosphericPressure.getValue()); } setAtmosphericPressureToResponse(response, atmosphericPressure); sendResponse(response); cleanup(); } }); mgr.startBeaconScanWithTimeout(TIMEOUT); return false; } }; private void setAtmosphericPressureToResponse(final Intent response, final AtmosphericPressureData atmosphericPressureData) { setResult(response, DConnectMessage.RESULT_OK); setAtmosphericPressure(response, atmosphericPressureData.getValue()); setTimeStamp(response, atmosphericPressureData.getTimeStamp()); } private LinkingBeaconManager getLinkingBeaconManager() { LinkingApplication app = getLinkingApplication(); return app.getLinkingBeaconManager(); } private LinkingApplication getLinkingApplication() { LinkingDevicePluginService service = (LinkingDevicePluginService) getContext(); return (LinkingApplication) service.getApplication(); } private abstract class OnBeaconAtmosphericPressureEventListenerImpl extends TimeoutSchedule implements LinkingBeaconManager.OnBeaconAtmosphericPressureEventListener { OnBeaconAtmosphericPressureEventListenerImpl(final LinkingBeaconManager mgr, final LinkingBeacon beacon) { super(mgr, beacon); } } }