|
|
|
@ -23,11 +23,9 @@ import android.app.Notification;
|
|
|
|
|
import android.app.NotificationManager;
|
|
|
|
|
import android.app.PendingIntent;
|
|
|
|
|
import android.content.BroadcastReceiver;
|
|
|
|
|
import android.content.ComponentName;
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
import android.content.Intent;
|
|
|
|
|
import android.content.IntentFilter;
|
|
|
|
|
import android.content.ServiceConnection;
|
|
|
|
|
import android.media.RingtoneManager;
|
|
|
|
|
import android.net.ConnectivityManager;
|
|
|
|
|
import android.net.Network;
|
|
|
|
@ -35,10 +33,8 @@ import android.net.NetworkCapabilities;
|
|
|
|
|
import android.net.NetworkInfo;
|
|
|
|
|
import android.net.NetworkRequest;
|
|
|
|
|
import android.net.Uri;
|
|
|
|
|
import android.os.Binder;
|
|
|
|
|
import android.os.Build;
|
|
|
|
|
import android.os.Bundle;
|
|
|
|
|
import android.os.IBinder;
|
|
|
|
|
import android.os.SystemClock;
|
|
|
|
|
import android.preference.PreferenceManager;
|
|
|
|
|
import android.text.TextUtils;
|
|
|
|
@ -186,39 +182,43 @@ public class ServiceSynchronize extends LifecycleService {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
|
|
|
|
Log.i(Helper.TAG, "Service start intent=" + intent);
|
|
|
|
|
Log.i(Helper.TAG, "Service command intent=" + intent);
|
|
|
|
|
super.onStartCommand(intent, flags, startId);
|
|
|
|
|
|
|
|
|
|
if (intent != null && "unseen".equals(intent.getAction())) {
|
|
|
|
|
Bundle args = new Bundle();
|
|
|
|
|
args.putLong("time", new Date().getTime());
|
|
|
|
|
if (intent != null)
|
|
|
|
|
if ("reload".equals(intent.getAction()))
|
|
|
|
|
serviceManager.restart();
|
|
|
|
|
else if ("unseen".equals(intent.getAction())) {
|
|
|
|
|
Bundle args = new Bundle();
|
|
|
|
|
args.putLong("time", new Date().getTime());
|
|
|
|
|
|
|
|
|
|
new SimpleTask<Void>() {
|
|
|
|
|
@Override
|
|
|
|
|
protected Void onLoad(Context context, Bundle args) {
|
|
|
|
|
long time = args.getLong("time");
|
|
|
|
|
new SimpleTask<Void>() {
|
|
|
|
|
@Override
|
|
|
|
|
protected Void onLoad(Context context, Bundle args) {
|
|
|
|
|
long time = args.getLong("time");
|
|
|
|
|
|
|
|
|
|
DB db = DB.getInstance(context);
|
|
|
|
|
try {
|
|
|
|
|
db.beginTransaction();
|
|
|
|
|
DB db = DB.getInstance(context);
|
|
|
|
|
try {
|
|
|
|
|
db.beginTransaction();
|
|
|
|
|
|
|
|
|
|
for (EntityAccount account : db.account().getAccounts(true))
|
|
|
|
|
db.account().setAccountSeenUntil(account.id, time);
|
|
|
|
|
for (EntityAccount account : db.account().getAccounts(true))
|
|
|
|
|
db.account().setAccountSeenUntil(account.id, time);
|
|
|
|
|
|
|
|
|
|
db.setTransactionSuccessful();
|
|
|
|
|
} finally {
|
|
|
|
|
db.endTransaction();
|
|
|
|
|
db.setTransactionSuccessful();
|
|
|
|
|
} finally {
|
|
|
|
|
db.endTransaction();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
@Override
|
|
|
|
|
protected void onLoaded(Bundle args, Void data) {
|
|
|
|
|
Log.i(Helper.TAG, "Updated seen until");
|
|
|
|
|
}
|
|
|
|
|
}.load(ServiceSynchronize.this, args);
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
protected void onLoaded(Bundle args, Void data) {
|
|
|
|
|
Log.i(Helper.TAG, "Updated seen until");
|
|
|
|
|
}
|
|
|
|
|
}.load(ServiceSynchronize.this, args);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return START_STICKY;
|
|
|
|
|
}
|
|
|
|
@ -1490,6 +1490,23 @@ public class ServiceSynchronize extends LifecycleService {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void restart() {
|
|
|
|
|
lifecycle.submit(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
Log.i(Helper.TAG, "Stopping service");
|
|
|
|
|
stop(true);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
lifecycle.submit(new Runnable() {
|
|
|
|
|
@Override
|
|
|
|
|
public void run() {
|
|
|
|
|
Log.i(Helper.TAG, "Starting service");
|
|
|
|
|
start();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private BroadcastReceiver outboxReceiver = new BroadcastReceiver() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onReceive(Context context, Intent intent) {
|
|
|
|
@ -1541,66 +1558,15 @@ public class ServiceSynchronize extends LifecycleService {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private IBinder binder = new LocalBinder();
|
|
|
|
|
|
|
|
|
|
private class LocalBinder extends Binder {
|
|
|
|
|
ServiceSynchronize getService() {
|
|
|
|
|
return ServiceSynchronize.this;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public IBinder onBind(Intent intent) {
|
|
|
|
|
return binder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void quit() {
|
|
|
|
|
Log.i(Helper.TAG, "Service quit");
|
|
|
|
|
serviceManager.stop(false);
|
|
|
|
|
Log.i(Helper.TAG, "Service quited");
|
|
|
|
|
stopSelf();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void start(Context context) {
|
|
|
|
|
ContextCompat.startForegroundService(context, new Intent(context, ServiceSynchronize.class));
|
|
|
|
|
ContextCompat.startForegroundService(context,
|
|
|
|
|
new Intent(context, ServiceSynchronize.class));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void stopSynchronous(Context context, String reason) {
|
|
|
|
|
Log.i(Helper.TAG, "Stop because of '" + reason + "'");
|
|
|
|
|
|
|
|
|
|
final Semaphore semaphore = new Semaphore(0, true);
|
|
|
|
|
ServiceConnection connection = new ServiceConnection() {
|
|
|
|
|
@Override
|
|
|
|
|
public void onServiceConnected(ComponentName componentName, IBinder binder) {
|
|
|
|
|
Log.i(Helper.TAG, "Service connected");
|
|
|
|
|
((LocalBinder) binder).getService().quit();
|
|
|
|
|
semaphore.release();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onServiceDisconnected(ComponentName componentName) {
|
|
|
|
|
Log.i(Helper.TAG, "Service disconnected");
|
|
|
|
|
semaphore.release();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onBindingDied(ComponentName name) {
|
|
|
|
|
Log.i(Helper.TAG, "Service died");
|
|
|
|
|
semaphore.release();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Intent intent = new Intent(context, ServiceSynchronize.class);
|
|
|
|
|
boolean exists = context.getApplicationContext().bindService(intent, connection, Context.BIND_AUTO_CREATE);
|
|
|
|
|
Log.i(Helper.TAG, "Service exists=" + exists);
|
|
|
|
|
|
|
|
|
|
if (exists) {
|
|
|
|
|
Log.i(Helper.TAG, "Service stopping");
|
|
|
|
|
acquire(semaphore, "service");
|
|
|
|
|
context.getApplicationContext().unbindService(connection);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Log.i(Helper.TAG, "Service stopped");
|
|
|
|
|
public static void reload(Context context, String reason) {
|
|
|
|
|
Log.i(Helper.TAG, "Reload because of '" + reason + "'");
|
|
|
|
|
ContextCompat.startForegroundService(context,
|
|
|
|
|
new Intent(context, ServiceSynchronize.class).setAction("reload"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class ServiceState {
|
|
|
|
|