Cache on demand store connections

pull/152/head
M66B 7 years ago
parent fb5752f708
commit 1ff0dd0fac

@ -10,6 +10,8 @@ import android.os.PowerManager;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; import java.util.Properties;
import javax.mail.Folder; import javax.mail.Folder;
@ -21,6 +23,7 @@ import androidx.annotation.Nullable;
public class ServiceUI extends IntentService { public class ServiceUI extends IntentService {
private PowerManager.WakeLock wl; private PowerManager.WakeLock wl;
private Map<EntityAccount, Store> accountStore = new HashMap<>();
static final int PI_WHY = 1; static final int PI_WHY = 1;
static final int PI_SUMMARY = 2; static final int PI_SUMMARY = 2;
@ -51,7 +54,31 @@ public class ServiceUI extends IntentService {
@Override @Override
public void onDestroy() { public void onDestroy() {
Log.i("Service UI destroy"); Log.i("Service UI destroy");
wl.release();
final DB db = DB.getInstance(this);
new Thread(new Runnable() {
@Override
public void run() {
try {
for (EntityAccount account : accountStore.keySet())
try {
Log.i(account.name + " closing");
db.account().setAccountState(account.id, "closing");
accountStore.get(account).close();
} catch (Throwable ex) {
Log.w(ex);
} finally {
Log.i(account.name + " closed");
db.account().setAccountState(account.id, null);
}
accountStore.clear();
} finally {
wl.release();
}
}
}).start();
super.onDestroy(); super.onDestroy();
} }
@ -251,7 +278,7 @@ public class ServiceUI extends IntentService {
if (account == null) if (account == null)
return; return;
Store istore = null; Folder ifolder = null;
try { try {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean debug = (prefs.getBoolean("debug", false) || BuildConfig.BETA_RELEASE); boolean debug = (prefs.getBoolean("debug", false) || BuildConfig.BETA_RELEASE);
@ -261,20 +288,26 @@ public class ServiceUI extends IntentService {
final Session isession = Session.getInstance(props, null); final Session isession = Session.getInstance(props, null);
isession.setDebug(debug); isession.setDebug(debug);
// Connect account Store istore = accountStore.get(account.id);
Log.i(account.name + " connecting"); if (istore == null || !istore.isConnected()) {
db.account().setAccountState(account.id, "connecting"); // Connect account
istore = isession.getStore(account.getProtocol()); Log.i(account.name + " connecting");
Helper.connect(this, istore, account); db.account().setAccountState(account.id, "connecting");
db.account().setAccountState(account.id, "connected"); istore = isession.getStore(account.getProtocol());
db.account().setAccountConnected(account.id, new Date().getTime()); Helper.connect(this, istore, account);
db.account().setAccountError(account.id, null); db.account().setAccountState(account.id, "connected");
Log.i(account.name + " connected"); db.account().setAccountConnected(account.id, new Date().getTime());
db.account().setAccountError(account.id, null);
Log.i(account.name + " connected");
accountStore.put(account, istore);
} else
Log.i(account + " reusing connection");
// Connect folder // Connect folder
Log.i(folder.name + " connecting"); Log.i(folder.name + " connecting");
db.folder().setFolderState(folder.id, "connecting"); db.folder().setFolderState(folder.id, "connecting");
Folder ifolder = istore.getFolder(folder.name); ifolder = istore.getFolder(folder.name);
ifolder.open(Folder.READ_WRITE); ifolder.open(Folder.READ_WRITE);
db.folder().setFolderState(folder.id, "connected"); db.folder().setFolderState(folder.id, "connected");
db.folder().setFolderError(folder.id, null); db.folder().setFolderError(folder.id, null);
@ -289,23 +322,18 @@ public class ServiceUI extends IntentService {
db.account().setAccountError(account.id, Helper.formatThrowable(ex)); db.account().setAccountError(account.id, Helper.formatThrowable(ex));
db.folder().setFolderError(folder.id, Helper.formatThrowable(ex, false)); db.folder().setFolderError(folder.id, Helper.formatThrowable(ex, false));
} finally { } finally {
if (istore != null) { if (ifolder != null)
Log.i(account.name + " closing");
db.account().setAccountState(account.id, "closing");
db.folder().setFolderState(folder.id, "closing");
try { try {
istore.close(); Log.i(folder.name + " closing");
db.folder().setFolderState(folder.id, "closing");
ifolder.close();
} catch (MessagingException ex) { } catch (MessagingException ex) {
Log.e(ex); Log.w(ex);
} finally {
Log.i(folder.name + " closed");
db.folder().setFolderState(folder.id, null);
db.folder().setFolderSyncState(folder.id, null);
} }
Log.i(account.name + " closed");
}
db.account().setAccountState(account.id, null);
db.folder().setFolderState(folder.id, null);
db.folder().setFolderSyncState(folder.id, null);
} }
} }

Loading…
Cancel
Save