mirror of https://github.com/tasks/tasks
Add InjectingService
parent
de9e68fba0
commit
c10a704ea8
@ -1,163 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright (c) 2012 Todoroo Inc
|
|
||||||
*
|
|
||||||
* See the file "LICENSE" for the full license governing this code.
|
|
||||||
*/
|
|
||||||
package com.todoroo.astrid.sync;
|
|
||||||
|
|
||||||
import android.app.AlarmManager;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.app.Service;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.IBinder;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import com.todoroo.andlib.service.ContextManager;
|
|
||||||
import com.todoroo.andlib.utility.DateUtilities;
|
|
||||||
import com.todoroo.andlib.utility.Preferences;
|
|
||||||
import com.todoroo.astrid.api.AstridApiConstants;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs synchronization service logic in background service to avoid
|
|
||||||
* ANR (application not responding) messages.
|
|
||||||
* <p>
|
|
||||||
* Starting this service
|
|
||||||
* schedules a repeating alarm which handles
|
|
||||||
* synchronization with your serv
|
|
||||||
*
|
|
||||||
* @author Tim Su
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
abstract public class SyncV2BackgroundService extends Service {
|
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(SyncV2BackgroundService.class);
|
|
||||||
|
|
||||||
/** Minimum time before an auto-sync */
|
|
||||||
private static final long AUTO_SYNC_MIN_OFFSET = 5*60*1000L;
|
|
||||||
|
|
||||||
abstract protected SyncV2Provider getSyncProvider();
|
|
||||||
|
|
||||||
abstract protected SyncProviderUtilities getSyncUtilities();
|
|
||||||
|
|
||||||
private final AtomicBoolean started = new AtomicBoolean(false);
|
|
||||||
|
|
||||||
/** Receive the alarm - start the synchronize service! */
|
|
||||||
@Override
|
|
||||||
public void onStart(Intent intent, int startId) {
|
|
||||||
try {
|
|
||||||
if(intent != null && !started.getAndSet(true)) {
|
|
||||||
startSynchronization(this);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("{}-bg-sync", getSyncUtilities().getIdentifier(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Start the actual synchronization */
|
|
||||||
private void startSynchronization(final Context context) {
|
|
||||||
if(context == null || context.getResources() == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContextManager.setContext(context);
|
|
||||||
|
|
||||||
if(!getSyncUtilities().isLoggedIn()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SyncV2Provider provider = getSyncProvider();
|
|
||||||
if (provider.isActive()) {
|
|
||||||
provider.synchronizeActiveTasks(false, new SyncResultCallbackAdapter() {
|
|
||||||
@Override
|
|
||||||
public void finished() {
|
|
||||||
getSyncUtilities().recordSuccessfulSync();
|
|
||||||
context.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBinder onBind(Intent intent) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- alarm management
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Schedules repeating alarm for auto-synchronization
|
|
||||||
*/
|
|
||||||
public void scheduleService() {
|
|
||||||
int syncFrequencySeconds = 0;
|
|
||||||
try {
|
|
||||||
syncFrequencySeconds = Preferences.getIntegerFromString(
|
|
||||||
getSyncUtilities().getSyncIntervalKey(), -1);
|
|
||||||
} catch(ClassCastException e) {
|
|
||||||
Preferences.setStringFromInteger(getSyncUtilities().getSyncIntervalKey(), 0);
|
|
||||||
}
|
|
||||||
Context context = ContextManager.getContext();
|
|
||||||
if(syncFrequencySeconds <= 0) {
|
|
||||||
unscheduleService(context);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// figure out synchronization frequency
|
|
||||||
long interval = 1000L * syncFrequencySeconds;
|
|
||||||
long offset = computeNextSyncOffset(interval);
|
|
||||||
|
|
||||||
// give a little padding
|
|
||||||
offset = Math.max(offset, AUTO_SYNC_MIN_OFFSET);
|
|
||||||
|
|
||||||
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
|
||||||
PendingIntent pendingIntent = PendingIntent.getService(context, getSyncUtilities().getSyncIntervalKey(),
|
|
||||||
createAlarmIntent(context), PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
|
|
||||||
Log.i("Astrid", "Autosync set for " + offset / 1000 //$NON-NLS-1$ //$NON-NLS-2$
|
|
||||||
+ " seconds repeating every " + syncFrequencySeconds); //$NON-NLS-1$
|
|
||||||
|
|
||||||
// cancel all existing
|
|
||||||
am.cancel(pendingIntent);
|
|
||||||
|
|
||||||
// schedule new
|
|
||||||
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + offset,
|
|
||||||
interval, pendingIntent);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes repeating alarm for auto-synchronization
|
|
||||||
*/
|
|
||||||
private void unscheduleService(Context context) {
|
|
||||||
AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
|
|
||||||
PendingIntent pendingIntent = PendingIntent.getService(context, getSyncUtilities().getSyncIntervalKey(),
|
|
||||||
createAlarmIntent(context), PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
am.cancel(pendingIntent);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Create the alarm intent */
|
|
||||||
private Intent createAlarmIntent(Context context) {
|
|
||||||
return new Intent(context, getClass());
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- utility methods
|
|
||||||
|
|
||||||
private long computeNextSyncOffset(long interval) {
|
|
||||||
// figure out last synchronize time
|
|
||||||
long lastSyncDate = getSyncUtilities().getLastSyncDate();
|
|
||||||
|
|
||||||
// if user never synchronized, give them a full offset period before bg sync
|
|
||||||
if(lastSyncDate != 0) {
|
|
||||||
return Math.max(0, lastSyncDate + interval - DateUtilities.now());
|
|
||||||
} else {
|
|
||||||
return interval;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
package org.tasks.injection;
|
||||||
|
|
||||||
|
import android.app.Service;
|
||||||
|
|
||||||
|
public abstract class InjectingService extends Service {
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
|
||||||
|
((Injector) getApplication()).inject(this, new ServiceModule());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
package org.tasks.injection;
|
||||||
|
|
||||||
|
import com.todoroo.astrid.gtasks.GtasksBackgroundService;
|
||||||
|
import com.todoroo.astrid.reminders.ReminderSchedulingService;
|
||||||
|
|
||||||
|
import dagger.Module;
|
||||||
|
|
||||||
|
@Module(library = true,
|
||||||
|
injects = {
|
||||||
|
GtasksBackgroundService.class,
|
||||||
|
ReminderSchedulingService.class
|
||||||
|
})
|
||||||
|
public class ServiceModule {
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue