forked from upstream-mirrors/OpenTracks
110 lines
2.7 KiB
Java
110 lines
2.7 KiB
Java
/*
|
|
* Copyright 2009 Google Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
* use this file except in compliance with the License. You may obtain a copy of
|
|
* the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations under
|
|
* the License.
|
|
*/
|
|
|
|
package com.google.android.apps.mytracks.services;
|
|
|
|
import com.google.android.apps.mytracks.MyTracksConstants;
|
|
|
|
import android.util.Log;
|
|
|
|
import java.util.Date;
|
|
import java.util.Timer;
|
|
import java.util.TimerTask;
|
|
|
|
/**
|
|
* This class will periodically announce the user's trip statistics.
|
|
*
|
|
* @author Sandor Dornbush
|
|
*/
|
|
public class PeriodicTaskExecuter {
|
|
|
|
private final PeriodicTask task;
|
|
private final TrackRecordingService service;
|
|
|
|
/**
|
|
* A timer to schedule the announcements.
|
|
* This is non-null if the task is in started (scheduled) state.
|
|
*/
|
|
private Timer timer;
|
|
|
|
public PeriodicTaskExecuter(PeriodicTask task,
|
|
TrackRecordingService service) {
|
|
this.task = task;
|
|
this.service = service;
|
|
}
|
|
|
|
/**
|
|
* Schedules the task at the given interval.
|
|
*
|
|
* @param interval The interval in milliseconds
|
|
*/
|
|
public void scheduleTask(long interval) {
|
|
// TODO: Decouple service from this class once and forever.
|
|
if (!service.isRecording()) {
|
|
return;
|
|
}
|
|
|
|
if (timer != null) {
|
|
timer.cancel();
|
|
timer.purge();
|
|
} else {
|
|
// First start, or we were previously shut down.
|
|
task.start();
|
|
}
|
|
|
|
timer = new Timer();
|
|
if (interval <= 0) {
|
|
return;
|
|
}
|
|
|
|
long now = System.currentTimeMillis();
|
|
long next = service.getTripStatistics().getStartTime();
|
|
if (next < now) {
|
|
next = now + interval - ((now - next) % interval);
|
|
}
|
|
|
|
Date start = new Date(next);
|
|
Log.i(MyTracksConstants.TAG,
|
|
task.getClass().getSimpleName() + " scheduled to start at " + start
|
|
+ " every " + interval + " milliseconds.");
|
|
timer.scheduleAtFixedRate(new PeriodicTimerTask(), start, interval);
|
|
}
|
|
|
|
/**
|
|
* Cleans up this object.
|
|
*/
|
|
public void shutdown() {
|
|
Log.i(MyTracksConstants.TAG,
|
|
task.getClass().getSimpleName() + " shutting down.");
|
|
if (timer != null) {
|
|
timer.cancel();
|
|
timer.purge();
|
|
timer = null;
|
|
task.shutdown();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The timer task to announce the trip status.
|
|
*/
|
|
private class PeriodicTimerTask extends TimerTask {
|
|
@Override
|
|
public void run() {
|
|
task.run(service);
|
|
}
|
|
}
|
|
}
|