package org.jraf.android.bikey.app.smartwatchsender;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import android.content.Context;
import android.net.Uri;
import io.reactivex.schedulers.Schedulers;
import org.jraf.android.bikey.backend.location.Speedometer;
import org.jraf.android.bikey.backend.ride.RideListener;
import org.jraf.android.bikey.backend.ride.RideManager;
import org.jraf.android.util.log.Log;
/**
* Abstract class to send values to smartwatches.
*/
public abstract class SmartwatchSender {
protected static long SEND_VALUES_RATE_S = 3;
protected Uri mActiveRideUri;
protected long mInitialDuration;
protected long mActivatedDate;
protected ScheduledExecutorService mScheduledExecutorService;
protected Speedometer mSpeedometer = new Speedometer();
public void startSending(Context context) {
Log.d();
// Ride updates
RideManager.get().addListener(mRideListener);
// Speed updates
mSpeedometer.startListening();
}
public void stopSending() {
Log.d();
// Ride updates
RideManager.get().removeListener(mRideListener);
// Speed updates
mSpeedometer.stopListening();
// Stop the scheduled task
if (mScheduledExecutorService != null) {
mScheduledExecutorService.shutdown();
mScheduledExecutorService = null;
}
}
private RideListener mRideListener = new RideListener() {
@Override
public void onActivated(Uri rideUri) {
Log.d();
mActiveRideUri = rideUri;
Schedulers.io().scheduleDirect(() -> {
mInitialDuration = RideManager.get().getDuration(rideUri);
mActivatedDate = RideManager.get().getActivatedDate(rideUri).getTime();
// Start the scheduled task now
if (mScheduledExecutorService == null) {
mScheduledExecutorService = Executors.newScheduledThreadPool(1);
}
mScheduledExecutorService.scheduleAtFixedRate(mSendValueRunnable, 0, SEND_VALUES_RATE_S, TimeUnit.SECONDS);
}
);
}
@Override
public void onPaused(Uri rideUri) {
mActiveRideUri = null;
}
};
private Runnable mSendValueRunnable = new Runnable() {
@Override
public void run() {
if (mActiveRideUri == null) return;
sendValues();
}
};
protected abstract void sendValues();
}