@ -194,10 +194,8 @@ public class ServiceSynchronize extends LifecycleService {
try {
try {
db . beginTransaction ( ) ;
db . beginTransaction ( ) ;
for ( EntityAccount account : db . account ( ) . getAccounts ( true ) ) {
for ( EntityAccount account : db . account ( ) . getAccounts ( true ) )
account . seen_until = time ;
db . account ( ) . setAccountSeenUntil ( account . id , time ) ;
db . account ( ) . updateAccount ( account ) ;
}
db . setTransactionSuccessful ( ) ;
db . setTransactionSuccessful ( ) ;
} finally {
} finally {
@ -327,6 +325,9 @@ public class ServiceSynchronize extends LifecycleService {
boolean debug = PreferenceManager . getDefaultSharedPreferences ( this ) . getBoolean ( "debug" , false ) ;
boolean debug = PreferenceManager . getDefaultSharedPreferences ( this ) . getBoolean ( "debug" , false ) ;
Log . i ( Helper . TAG , account . name + " start " ) ;
Log . i ( Helper . TAG , account . name + " start " ) ;
final DB db = DB . getInstance ( ServiceSynchronize . this ) ;
db . account ( ) . setAccountState ( account . id , "connecting" ) ;
while ( state . running ) {
while ( state . running ) {
IMAPStore istore = null ;
IMAPStore istore = null ;
try {
try {
@ -335,6 +336,7 @@ public class ServiceSynchronize extends LifecycleService {
props . setProperty ( "mail.mime.address.strict" , "false" ) ;
props . setProperty ( "mail.mime.address.strict" , "false" ) ;
props . setProperty ( "mail.mime.decodetext.strict" , "false" ) ;
props . setProperty ( "mail.mime.decodetext.strict" , "false" ) ;
/ / props . put ( "mail.imaps.minidletime" , "5000" ) ;
/ / props . put ( "mail.imaps.minidletime" , "5000" ) ;
final Session isession = Session . getInstance ( props , null ) ;
final Session isession = Session . getInstance ( props , null ) ;
isession . setDebug ( debug ) ;
isession . setDebug ( debug ) ;
/ / adb - t 1 logcat | grep "eu.faircode.email\|System.out"
/ / adb - t 1 logcat | grep "eu.faircode.email\|System.out"
@ -347,11 +349,6 @@ public class ServiceSynchronize extends LifecycleService {
@Override
@Override
public void notification ( StoreEvent e ) {
public void notification ( StoreEvent e ) {
Log . i ( Helper . TAG , account . name + " event: " + e . getMessage ( ) ) ;
Log . i ( Helper . TAG , account . name + " event: " + e . getMessage ( ) ) ;
/ / Check connection
synchronized ( state ) {
state . notifyAll ( ) ;
}
}
}
} ) ;
} ) ;
istore . addFolderListener ( new FolderAdapter ( ) {
istore . addFolderListener ( new FolderAdapter ( ) {
@ -379,9 +376,8 @@ public class ServiceSynchronize extends LifecycleService {
public void opened ( ConnectionEvent e ) {
public void opened ( ConnectionEvent e ) {
Log . i ( Helper . TAG , account . name + " opened" ) ;
Log . i ( Helper . TAG , account . name + " opened" ) ;
DB db = DB . getInstance ( ServiceSynchronize . this ) ;
db . account ( ) . setAccountState ( account . id , "connected" ) ;
account . error = null ;
db . account ( ) . setAccountError ( account . id , null ) ;
db . account ( ) . updateAccount ( account ) ;
try {
try {
synchronizeFolders ( account , fstore ) ;
synchronizeFolders ( account , fstore ) ;
@ -397,24 +393,25 @@ public class ServiceSynchronize extends LifecycleService {
try {
try {
Log . i ( Helper . TAG , folder . name + " start" ) ;
Log . i ( Helper . TAG , folder . name + " start" ) ;
db . folder ( ) . setFolderState ( folder . id , "connecting" ) ;
ifolder = ( IMAPFolder ) fstore . getFolder ( folder . name ) ;
ifolder = ( IMAPFolder ) fstore . getFolder ( folder . name ) ;
ifolder . open ( Folder . READ_WRITE ) ;
ifolder . open ( Folder . READ_WRITE ) ;
db . folder ( ) . setFolderState ( folder . id , "connected" ) ;
db . folder ( ) . setFolderError ( folder . id , null ) ;
synchronized ( mapFolder ) {
synchronized ( mapFolder ) {
mapFolder . put ( folder . id , ifolder ) ;
mapFolder . put ( folder . id , ifolder ) ;
}
}
folder . error = null ;
DB . getInstance ( ServiceSynchronize . this ) . folder ( ) . updateFolder ( folder ) ;
monitorFolder ( account , folder , fstore , ifolder , state ) ;
monitorFolder ( account , folder , fstore , ifolder , state ) ;
} catch ( Throwable ex ) {
} catch ( Throwable ex ) {
Log . e ( Helper . TAG , folder . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
Log . e ( Helper . TAG , folder . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
reportError ( account . name , folder . name , ex ) ;
reportError ( account . name , folder . name , ex ) ;
folder . error = Helper . formatThrowable ( ex ) ;
db . folder ( ) . setFolderError ( folder . id , Helper . formatThrowable ( ex ) ) ;
DB . getInstance ( ServiceSynchronize . this ) . folder ( ) . updateFolder ( folder ) ;
/ / Cascade up
/ / Cascade up
if ( ! ( ex instanceof FolderNotFoundException ) )
if ( ! ( ex instanceof FolderNotFoundException ) )
@ -431,7 +428,10 @@ public class ServiceSynchronize extends LifecycleService {
Log . w ( Helper . TAG , folder . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
Log . w ( Helper . TAG , folder . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
}
}
}
}
Log . i ( Helper . TAG , folder . name + " stop" ) ;
db . folder ( ) . setFolderState ( folder . id , null ) ;
Log . i ( Helper . TAG , folder . name + " stopped" ) ;
}
}
}
}
} , "sync.folder." + folder . id ) . start ( ) ;
} , "sync.folder." + folder . id ) . start ( ) ;
@ -455,8 +455,7 @@ public class ServiceSynchronize extends LifecycleService {
Log . e ( Helper . TAG , account . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
Log . e ( Helper . TAG , account . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
reportError ( account . name , null , ex ) ;
reportError ( account . name , null , ex ) ;
account . error = Helper . formatThrowable ( ex ) ;
db . account ( ) . setAccountError ( account . id , Helper . formatThrowable ( ex ) ) ;
db . account ( ) . updateAccount ( account ) ;
/ / Cascade up
/ / Cascade up
try {
try {
@ -471,6 +470,8 @@ public class ServiceSynchronize extends LifecycleService {
public void disconnected ( ConnectionEvent e ) {
public void disconnected ( ConnectionEvent e ) {
Log . e ( Helper . TAG , account . name + " disconnected" ) ;
Log . e ( Helper . TAG , account . name + " disconnected" ) ;
db . account ( ) . setAccountState ( account . id , null ) ;
LocalBroadcastManager lbm = LocalBroadcastManager . getInstance ( ServiceSynchronize . this ) ;
LocalBroadcastManager lbm = LocalBroadcastManager . getInstance ( ServiceSynchronize . this ) ;
lbm . unregisterReceiver ( processReceiver ) ;
lbm . unregisterReceiver ( processReceiver ) ;
@ -582,8 +583,7 @@ public class ServiceSynchronize extends LifecycleService {
Log . e ( Helper . TAG , account . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
Log . e ( Helper . TAG , account . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
reportError ( account . name , null , ex ) ;
reportError ( account . name , null , ex ) ;
account . error = Helper . formatThrowable ( ex ) ;
db . account ( ) . setAccountError ( account . id , Helper . formatThrowable ( ex ) ) ;
DB . getInstance ( this ) . account ( ) . updateAccount ( account ) ;
} finally {
} finally {
if ( istore ! = null ) {
if ( istore ! = null ) {
try {
try {
@ -603,6 +603,8 @@ public class ServiceSynchronize extends LifecycleService {
}
}
}
}
db . account ( ) . setAccountState ( account . id , null ) ;
Log . i ( Helper . TAG , account . name + " stopped" ) ;
Log . i ( Helper . TAG , account . name + " stopped" ) ;
}
}
@ -685,8 +687,7 @@ public class ServiceSynchronize extends LifecycleService {
Log . e ( Helper . TAG , folder . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
Log . e ( Helper . TAG , folder . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
reportError ( account . name , folder . name , ex ) ;
reportError ( account . name , folder . name , ex ) ;
folder . error = Helper . formatThrowable ( ex ) ;
DB . getInstance ( ServiceSynchronize . this ) . folder ( ) . setFolderError ( folder . id , Helper . formatThrowable ( ex ) ) ;
DB . getInstance ( ServiceSynchronize . this ) . folder ( ) . updateFolder ( folder ) ;
/ / Cascade up
/ / Cascade up
try {
try {
@ -721,8 +722,7 @@ public class ServiceSynchronize extends LifecycleService {
Log . e ( Helper . TAG , folder . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
Log . e ( Helper . TAG , folder . name + " " + ex + "\n" + Log . getStackTraceString ( ex ) ) ;
reportError ( account . name , folder . name , ex ) ;
reportError ( account . name , folder . name , ex ) ;
folder . error = Helper . formatThrowable ( ex ) ;
DB . getInstance ( ServiceSynchronize . this ) . folder ( ) . setFolderError ( folder . id , Helper . formatThrowable ( ex ) ) ;
DB . getInstance ( ServiceSynchronize . this ) . folder ( ) . updateFolder ( folder ) ;
/ / Cascade up
/ / Cascade up
try {
try {
@ -798,8 +798,7 @@ public class ServiceSynchronize extends LifecycleService {
/ / Operation succeeded
/ / Operation succeeded
db . operation ( ) . deleteOperation ( op . id ) ;
db . operation ( ) . deleteOperation ( op . id ) ;
} catch ( Throwable ex ) {
} catch ( Throwable ex ) {
message . error = Helper . formatThrowable ( ex ) ;
db . message ( ) . setMessageError ( message . id , Helper . formatThrowable ( ex ) ) ;
db . message ( ) . updateMessage ( message ) ;
if ( BuildConfig . DEBUG & & ex instanceof NullPointerException ) {
if ( BuildConfig . DEBUG & & ex instanceof NullPointerException ) {
db . operation ( ) . deleteOperation ( op . id ) ;
db . operation ( ) . deleteOperation ( op . id ) ;
@ -843,8 +842,7 @@ public class ServiceSynchronize extends LifecycleService {
imessage . setFlag ( Flags . Flag . SEEN , seen ) ;
imessage . setFlag ( Flags . Flag . SEEN , seen ) ;
message . seen = seen ;
db . message ( ) . setMessageSeen ( message . id , seen ) ;
db . message ( ) . updateMessage ( message ) ;
}
}
private void doAdd ( EntityFolder folder , Session isession , IMAPFolder ifolder , EntityMessage message , JSONArray jargs , DB db ) throws MessagingException , JSONException {
private void doAdd ( EntityFolder folder , Session isession , IMAPFolder ifolder , EntityMessage message , JSONArray jargs , DB db ) throws MessagingException , JSONException {
@ -863,8 +861,7 @@ public class ServiceSynchronize extends LifecycleService {
}
}
}
}
message . uid = uid [ 0 ] . uid ;
db . message ( ) . setMessageUid ( message . id , uid [ 0 ] . uid ) ;
db . message ( ) . updateMessage ( message ) ;
Log . i ( Helper . TAG , "Appended uid=" + message . uid ) ;
Log . i ( Helper . TAG , "Appended uid=" + message . uid ) ;
}
}
@ -950,8 +947,7 @@ public class ServiceSynchronize extends LifecycleService {
" to " + TextUtils . join ( ", " , to ) ) ;
" to " + TextUtils . join ( ", " , to ) ) ;
} catch ( SMTPSendFailedException ex ) {
} catch ( SMTPSendFailedException ex ) {
/ / TODO : response codes : https : / / www . ietf . org / rfc / rfc821 . txt
/ / TODO : response codes : https : / / www . ietf . org / rfc / rfc821 . txt
message . error = Helper . formatThrowable ( ex ) ;
db . message ( ) . setMessageError ( message . id , Helper . formatThrowable ( ex ) ) ;
db . message ( ) . updateMessage ( message ) ;
throw ex ;
throw ex ;
}
}
@ -1024,17 +1020,15 @@ public class ServiceSynchronize extends LifecycleService {
os . write ( buffer , 0 , len ) ;
os . write ( buffer , 0 , len ) ;
/ / Update progress
/ / Update progress
if ( attachment . size ! = null ) {
if ( attachment . size ! = null )
attachment . progress = size * 100 / attachment . size ;
db . attachment ( ) . setProgress ( attachment . id , size * 100 / attachment . size ) ;
db . attachment ( ) . updateAttachment ( attachment ) ;
Log . i ( Helper . TAG , folder . name + " progress %=" + attachment . progress ) ;
}
}
}
/ / Store attachment data
/ / Store attachment data
attachment . size = size ;
attachment . size = size ;
attachment . progress = null ;
attachment . progress = null ;
attachment . filename = file . getName ( ) ;
attachment . filename = file . getName ( ) ;
db . attachment ( ) . updateAttachment ( attachment ) ;
} finally {
} finally {
try {
try {
if ( is ! = null )
if ( is ! = null )
@ -1044,7 +1038,6 @@ public class ServiceSynchronize extends LifecycleService {
os . close ( ) ;
os . close ( ) ;
}
}
}
}
db . attachment ( ) . updateAttachment ( attachment ) ;
Log . i ( Helper . TAG , folder . name + " downloaded bytes=" + attachment . size ) ;
Log . i ( Helper . TAG , folder . name + " downloaded bytes=" + attachment . size ) ;
} catch ( Throwable ex ) {
} catch ( Throwable ex ) {
/ / Reset progress on failure
/ / Reset progress on failure
@ -1350,6 +1343,7 @@ public class ServiceSynchronize extends LifecycleService {
} else
} else
for ( final EntityAccount account : accounts ) {
for ( final EntityAccount account : accounts ) {
Log . i ( Helper . TAG , account . host + "/" + account . user + " run" ) ;
Log . i ( Helper . TAG , account . host + "/" + account . user + " run" ) ;
new Thread ( new Runnable ( ) {
new Thread ( new Runnable ( ) {
@Override
@Override
public void run ( ) {
public void run ( ) {