Check connected before send

pull/152/head
M66B 7 years ago
parent d32b55d2c5
commit 7257d74a5e

@ -138,89 +138,104 @@ public class ServiceSend extends LifecycleService {
@Override @Override
public void onAvailable(Network network) { public void onAvailable(Network network) {
Log.i("Service send available=" + network); Log.i("Service send available=" + network);
if (isConnected())
run();
}
if (thread == null || !thread.isAlive()) { @Override
thread = new Thread(new Runnable() { public void onCapabilitiesChanged(Network network, NetworkCapabilities caps) {
@Override Log.i("Service send caps=" + caps);
public void run() { if (isConnected())
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); run();
PowerManager.WakeLock wl = pm.newWakeLock( }
PowerManager.PARTIAL_WAKE_LOCK, BuildConfig.APPLICATION_ID + ":send");
try {
wl.acquire();
DB db = DB.getInstance(ServiceSend.this);
EntityFolder outbox = db.folder().getOutbox();
try {
db.folder().setFolderError(outbox.id, null);
db.folder().setFolderSyncState(outbox.id, "syncing");
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
List<EntityOperation> ops = db.operation().getOperations(outbox.id);
Log.i(outbox.name + " pending operations=" + ops.size());
for (EntityOperation op : ops) {
EntityMessage message = null;
try {
Log.i(outbox.name +
" start op=" + op.id + "/" + op.name +
" msg=" + op.message +
" args=" + op.args);
switch (op.name) {
case EntityOperation.SYNC:
db.folder().setFolderError(outbox.id, null);
break;
case EntityOperation.SEND:
message = db.message().getMessage(op.message);
if (message == null)
throw new MessageRemovedException();
send(message);
break;
default:
throw new IllegalArgumentException("Unknown operation=" + op.name);
}
db.operation().deleteOperation(op.id); private boolean isConnected() {
} catch (Throwable ex) { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
Log.e(ex); NetworkInfo ni = cm.getActiveNetworkInfo();
return (ni != null && ni.isConnected());
if (message != null) }
db.message().setMessageError(message.id, Helper.formatThrowable(ex));
private void run() {
if (ex instanceof MessageRemovedException || if (thread != null && thread.isAlive())
ex instanceof SendFailedException || return;
ex instanceof IllegalArgumentException)
db.operation().deleteOperation(op.id); thread = new Thread(new Runnable() {
else @Override
throw ex; public void run() {
} finally { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
Log.i(outbox.name + " end op=" + op.id + "/" + op.name); PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, BuildConfig.APPLICATION_ID + ":send");
try {
wl.acquire();
DB db = DB.getInstance(ServiceSend.this);
EntityFolder outbox = db.folder().getOutbox();
try {
db.folder().setFolderError(outbox.id, null);
db.folder().setFolderSyncState(outbox.id, "syncing");
List<EntityOperation> ops = db.operation().getOperations(outbox.id);
Log.i(outbox.name + " pending operations=" + ops.size());
for (EntityOperation op : ops) {
EntityMessage message = null;
try {
Log.i(outbox.name +
" start op=" + op.id + "/" + op.name +
" msg=" + op.message +
" args=" + op.args);
switch (op.name) {
case EntityOperation.SYNC:
db.folder().setFolderError(outbox.id, null);
break;
case EntityOperation.SEND:
message = db.message().getMessage(op.message);
if (message == null)
throw new MessageRemovedException();
send(message);
break;
default:
throw new IllegalArgumentException("Unknown operation=" + op.name);
} }
NetworkInfo ni = cm.getActiveNetworkInfo(); db.operation().deleteOperation(op.id);
if (ni == null || !ni.isConnected()) } catch (Throwable ex) {
break; Log.e(ex);
if (message != null)
db.message().setMessageError(message.id, Helper.formatThrowable(ex));
if (ex instanceof MessageRemovedException ||
ex instanceof SendFailedException ||
ex instanceof IllegalArgumentException)
db.operation().deleteOperation(op.id);
else
throw ex;
} finally {
Log.i(outbox.name + " end op=" + op.id + "/" + op.name);
} }
if (db.operation().getOperations(outbox.id).size() == 0) if (!isConnected())
stopSelf(); break;
} catch (Throwable ex) {
Log.e(outbox.name, ex);
db.folder().setFolderError(outbox.id, Helper.formatThrowable(ex, true));
} finally {
db.folder().setFolderState(outbox.id, null);
db.folder().setFolderSyncState(outbox.id, null);
} }
if (db.operation().getOperations(outbox.id).size() == 0)
stopSelf();
} catch (Throwable ex) {
Log.e(outbox.name, ex);
db.folder().setFolderError(outbox.id, Helper.formatThrowable(ex, true));
} finally { } finally {
wl.release(); db.folder().setFolderState(outbox.id, null);
db.folder().setFolderSyncState(outbox.id, null);
} }
} finally {
wl.release();
} }
}); }
thread.start(); });
} thread.start();
} }
}; };

Loading…
Cancel
Save