package org.deviceconnect.android.deviceplugin.linking.linking.profile;
import org.deviceconnect.android.deviceplugin.linking.linking.LinkingDevice;
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 {
private static final int TIMEOUT = 30;
private ScheduledExecutorService mExecutorService = Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture<?> mScheduledFuture;
protected LinkingDevice mDevice;
protected boolean mCleanupFlag;
TimeoutSchedule(final LinkingDevice device) {
this(device, TIMEOUT);
}
TimeoutSchedule(final LinkingDevice device, final long delay) {
mDevice = device;
mScheduledFuture = mExecutorService.schedule(this, delay, TimeUnit.SECONDS);
}
protected void cleanup() {
if (mCleanupFlag) {
return;
}
mCleanupFlag = true;
onCleanup();
mScheduledFuture.cancel(false);
mExecutorService.shutdown();
}
@Override
public synchronized void run() {
onTimeout();
cleanup();
}
public abstract void onCleanup();
public abstract void onTimeout();
}