/*
TimeoutSchedule.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 org.deviceconnect.android.deviceplugin.linking.R;
import org.deviceconnect.android.deviceplugin.linking.beacon.LinkingBeaconManager;
import org.deviceconnect.android.deviceplugin.linking.beacon.LinkingBeaconUtil;
import org.deviceconnect.android.deviceplugin.linking.beacon.data.LinkingBeacon;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
abstract class TimeoutSchedule implements Runnable, LinkingBeaconManager.OnBeaconScanStateListener {
private static final int TIMEOUT = 30 * 1000;
private ScheduledExecutorService mExecutorService = Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture<?> mScheduledFuture;
protected LinkingBeaconManager mBeaconManager;
protected LinkingBeacon mBeacon;
protected boolean mCleanupFlag;
TimeoutSchedule(final LinkingBeaconManager manager, final LinkingBeacon beacon) {
this(manager, beacon, TIMEOUT);
}
TimeoutSchedule(final LinkingBeaconManager manager, final LinkingBeacon beacon, final long delay) {
mBeaconManager = manager;
mBeacon = beacon;
mScheduledFuture = mExecutorService.schedule(this, delay, TimeUnit.MILLISECONDS);
mBeaconManager.addOnBeaconScanStateListener(this);
}
protected void cleanup() {
if (mCleanupFlag) {
return;
}
mCleanupFlag = true;
onCleanup();
mBeaconManager.removeOnBeaconScanStateListener(this);
mScheduledFuture.cancel(false);
mExecutorService.shutdown();
}
@Override
public synchronized void run() {
onTimeout();
cleanup();
}
@Override
public synchronized void onScanState(final LinkingBeaconUtil.ScanState state, final LinkingBeaconUtil.ScanDetail detail) {
if (state != LinkingBeaconUtil.ScanState.RESULT_OK || detail != LinkingBeaconUtil.ScanDetail.DETAIL_OK) {
String message;
switch (detail) {
case DETAIL_TIMEOUT:
message = mBeaconManager.getContext().getString(R.string.linking_beacon_scan_detail_timeout);
break;
case DETAIL_META_DATA_NONE:
message = mBeaconManager.getContext().getString(R.string.linking_beacon_scan_detail_meta_data_none);
break;
case DETAIL_BT_DISABLED:
message = mBeaconManager.getContext().getString(R.string.linking_beacon_scan_detail_bt_disabled);
break;
case DETAIL_SDA_DISABLED:
message = mBeaconManager.getContext().getString(R.string.linking_beacon_scan_detail_sda_disabled);
break;
case DETAIL_PERMISSION_DENIED:
message = mBeaconManager.getContext().getString(R.string.linking_beacon_scan_detail_permission_denied);
break;
default:
message = "Unknown";
break;
}
onDisableScan(message);
cleanup();
}
}
public abstract void onDisableScan(String message);
public abstract void onCleanup();
public abstract void onTimeout();
}