@@ -98,8 +98,8 @@ public class CoolReader extends BaseActivity {
9898 private final SyncOptions mGoogleDriveSyncOpts = new SyncOptions ();
9999 private boolean mSyncGoogleDriveEnabledPrev = false ;
100100 private int mSyncGoogleDriveErrorsCount = 0 ;
101- private Synchronizer mGoogleDriveSync = null ;
102- private OnSyncStatusListener mGoogleDriveSyncStatusListener = null ;
101+ private Synchronizer mGoogleDriveSync ;
102+ private OnSyncStatusListener mGoogleDriveSyncStatusListener ;
103103 private Timer mGoogleDriveAutoSaveTimer = null ;
104104 private SyncServiceAccessor syncServiceAccessor = null ;
105105 // can be add more synchronizers
@@ -418,6 +418,12 @@ public void applyAppSetting(String key, String value) {
418418 private void buildGoogleDriveSynchronizer () {
419419 if (!BuildConfig .GSUITE_AVAILABLE )
420420 return ;
421+ if (null != syncServiceAccessor && null != mGoogleDriveSync ) {
422+ if (!syncServiceAccessor .isServiceBound ()) {
423+ // lost connection to service, nullify sync instance
424+ mGoogleDriveSync = null ;
425+ }
426+ }
421427 if (null != mGoogleDriveSync )
422428 return ;
423429 // build synchronizer instance
@@ -584,19 +590,8 @@ public void onFileNotFound(FileInfo fileInfo) {
584590 showToast (R .string .sync_info_no_such_document , docInfo );
585591 }
586592 };
587- }
588- }
589-
590- private void checkNinitSyncService () {
591- if (null == syncServiceAccessor ) {
592593 syncServiceAccessor = new SyncServiceAccessor (this );
593594 }
594- // If the sync service is destroyed for any reason,
595- // we must assign the synchronizer object & status listener again.
596- syncServiceAccessor .bind (sync -> {
597- sync .setSynchronizer (mGoogleDriveSync );
598- sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
599- });
600595 }
601596
602597 private void updateGoogleDriveSynchronizer () {
@@ -625,13 +620,11 @@ private void updateGoogleDriveSynchronizer() {
625620 public void run () {
626621 if (activityIsRunning && null != mGoogleDriveSync ) {
627622 //mGoogleDriveSync.startSyncTo(getCurrentBookInfo(), Synchronizer.SYNC_FLAG_QUIETLY);
628- checkNinitSyncService ();
629- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCTO , Uri .EMPTY , CoolReader .this , SyncService .class );
630- Bundle data = new Bundle ();
631- data .putParcelable ("bookInfo" , getCurrentBookInfo ());
632- data .putInt ("flags" , Synchronizer .SYNC_FLAG_QUIETLY );
633- syncIntent .putExtras (data );
634- startService (syncIntent );
623+ syncServiceAccessor .bind (sync -> {
624+ sync .setSynchronizer (mGoogleDriveSync );
625+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
626+ sync .startSyncTo (getCurrentBookInfo (), Synchronizer .SYNC_FLAG_QUIETLY );
627+ });
635628 }
636629 }
637630 }, mGoogleDriveSyncOpts .AutoSavePeriod * 60000L , mGoogleDriveSyncOpts .AutoSavePeriod * 60000L );
@@ -682,13 +675,11 @@ public void forceSyncToGoogleDrive() {
682675 buildGoogleDriveSynchronizer ();
683676 mGoogleDriveSync .setBookmarksKeepAlive (mGoogleDriveSyncOpts .DataKeepAlive );
684677 //mGoogleDriveSync.startSyncTo(getCurrentBookInfo(), Synchronizer.SYNC_FLAG_SHOW_SIGN_IN | Synchronizer.SYNC_FLAG_FORCE | Synchronizer.SYNC_FLAG_SHOW_PROGRESS | Synchronizer.SYNC_FLAG_ASK_CHANGED);
685- checkNinitSyncService ();
686- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCTO , Uri .EMPTY , CoolReader .this , SyncService .class );
687- Bundle data = new Bundle ();
688- data .putParcelable ("bookInfo" , getCurrentBookInfo ());
689- data .putInt ("flags" , Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_FORCE | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | Synchronizer .SYNC_FLAG_ASK_CHANGED );
690- syncIntent .putExtras (data );
691- startService (syncIntent );
678+ syncServiceAccessor .bind (sync -> {
679+ sync .setSynchronizer (mGoogleDriveSync );
680+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
681+ sync .startSyncTo (getCurrentBookInfo (), Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_FORCE | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | Synchronizer .SYNC_FLAG_ASK_CHANGED );
682+ });
692683 }
693684 }
694685
@@ -700,12 +691,11 @@ public void forceSyncFromGoogleDrive() {
700691 buildGoogleDriveSynchronizer ();
701692 mGoogleDriveSync .setBookmarksKeepAlive (mGoogleDriveSyncOpts .DataKeepAlive );
702693 //mGoogleDriveSync.startSyncFrom(Synchronizer.SYNC_FLAG_SHOW_SIGN_IN | Synchronizer.SYNC_FLAG_FORCE | Synchronizer.SYNC_FLAG_SHOW_PROGRESS | Synchronizer.SYNC_FLAG_ASK_CHANGED);
703- checkNinitSyncService ();
704- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCFROM , Uri .EMPTY , this , SyncService .class );
705- Bundle data = new Bundle ();
706- data .putInt ("flags" , Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_FORCE | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | Synchronizer .SYNC_FLAG_ASK_CHANGED );
707- syncIntent .putExtras (data );
708- startService (syncIntent );
694+ syncServiceAccessor .bind (sync -> {
695+ sync .setSynchronizer (mGoogleDriveSync );
696+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
697+ sync .startSyncFrom (Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_FORCE | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | Synchronizer .SYNC_FLAG_ASK_CHANGED );
698+ });
709699 }
710700 }
711701
@@ -879,13 +869,16 @@ protected void onPause() {
879869 if (BuildConfig .GSUITE_AVAILABLE && Build .VERSION .SDK_INT >= Build .VERSION_CODES .ICE_CREAM_SANDWICH ) {
880870 if (mGoogleDriveSyncOpts .Enabled && mGoogleDriveSync != null ) {
881871 //mGoogleDriveSync.startSyncTo(getCurrentBookInfo(), Synchronizer.SYNC_FLAG_QUIETLY | Synchronizer.SYNC_FLAG_SHOW_PROGRESS);
882- checkNinitSyncService ();
883- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCTO , Uri .EMPTY , CoolReader .this , SyncService .class );
884- Bundle data = new Bundle ();
885- data .putParcelable ("bookInfo" , getCurrentBookInfo ());
886- data .putInt ("flags" , Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS );
887- syncIntent .putExtras (data );
888- startService (syncIntent );
872+ syncServiceAccessor .bind (sync -> {
873+ sync .setSynchronizer (mGoogleDriveSync );
874+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
875+ sync .startSyncTo (getCurrentBookInfo (), Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS );
876+ });
877+ try {
878+ // start SyncService to prevent service destroying on unbinding in onDestroy()
879+ Intent intent = new Intent (SyncService .SYNC_ACTION_NOOP , Uri .EMPTY , this , SyncService .class );
880+ startService (intent );
881+ } catch (Exception ignored ) {}
889882 }
890883 }
891884 super .onPause ();
@@ -958,21 +951,18 @@ protected void onResume() {
958951 // If the file is opened from an external file manager, we must disable the "currently reading book" sync operation with google drive.
959952 if (null == mFileToOpenFromExt ) {
960953 //mGoogleDriveSync.startSyncFrom(Synchronizer.SYNC_FLAG_SHOW_SIGN_IN | Synchronizer.SYNC_FLAG_QUIETLY | Synchronizer.SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts.AskConfirmations ? Synchronizer.SYNC_FLAG_ASK_CHANGED : 0));
961- checkNinitSyncService ();
962- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCFROM , Uri .EMPTY , this , SyncService .class );
963- Bundle data = new Bundle ();
964- data .putInt ("flags" , Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts .AskConfirmations ? Synchronizer .SYNC_FLAG_ASK_CHANGED : 0 ));
965- syncIntent .putExtras (data );
966- startService (syncIntent );
954+ syncServiceAccessor .bind (sync -> {
955+ sync .setSynchronizer (mGoogleDriveSync );
956+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
957+ sync .startSyncFrom (Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts .AskConfirmations ? Synchronizer .SYNC_FLAG_ASK_CHANGED : 0 ));
958+ });
967959 } else {
968960 //mGoogleDriveSync.startSyncFromOnly(Synchronizer.SYNC_FLAG_SHOW_SIGN_IN | Synchronizer.SYNC_FLAG_QUIETLY | Synchronizer.SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts.AskConfirmations ? Synchronizer.SYNC_FLAG_ASK_CHANGED : 0), Synchronizer.SyncTarget.SETTINGS, Synchronizer.SyncTarget.BOOKMARKS);
969- checkNinitSyncService ();
970- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCFROM_ONLY , Uri .EMPTY , this , SyncService .class );
971- Bundle data = new Bundle ();
972- data .putInt ("flags" , Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts .AskConfirmations ? Synchronizer .SYNC_FLAG_ASK_CHANGED : 0 ));
973- data .putIntArray ("targets" , new int []{ Synchronizer .SyncTarget .SETTINGS .ordinal (), Synchronizer .SyncTarget .BOOKMARKS .ordinal () });
974- syncIntent .putExtras (data );
975- startService (syncIntent );
961+ syncServiceAccessor .bind (sync -> {
962+ sync .setSynchronizer (mGoogleDriveSync );
963+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
964+ sync .startSyncFromOnly (Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts .AskConfirmations ? Synchronizer .SYNC_FLAG_ASK_CHANGED : 0 ), Synchronizer .SyncTarget .SETTINGS , Synchronizer .SyncTarget .BOOKMARKS );
965+ });
976966 }
977967 }
978968 }
@@ -1236,12 +1226,11 @@ public void onSettingsChanged(Properties props, Properties oldProps) {
12361226 if (mGoogleDriveSyncOpts .Enabled && !mSyncGoogleDriveEnabledPrev && null != mGoogleDriveSync ) {
12371227 // if cloud sync has just been enabled in options dialog
12381228 //mGoogleDriveSync.startSyncFrom(Synchronizer.SYNC_FLAG_SHOW_SIGN_IN | Synchronizer.SYNC_FLAG_QUIETLY | Synchronizer.SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts.AskConfirmations ? Synchronizer.SYNC_FLAG_ASK_CHANGED : 0) );
1239- checkNinitSyncService ();
1240- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCFROM , Uri .EMPTY , this , SyncService .class );
1241- Bundle data = new Bundle ();
1242- data .putInt ("flags" , Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts .AskConfirmations ? Synchronizer .SYNC_FLAG_ASK_CHANGED : 0 ));
1243- syncIntent .putExtras (data );
1244- startService (syncIntent );
1229+ syncServiceAccessor .bind (sync -> {
1230+ sync .setSynchronizer (mGoogleDriveSync );
1231+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
1232+ sync .startSyncFrom (Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS | (mGoogleDriveSyncOpts .AskConfirmations ? Synchronizer .SYNC_FLAG_ASK_CHANGED : 0 ) );
1233+ });
12451234 mSyncGoogleDriveEnabledPrev = mGoogleDriveSyncOpts .Enabled ;
12461235 return ;
12471236 }
@@ -1257,14 +1246,11 @@ public void onSettingsChanged(Properties props, Properties oldProps) {
12571246 // After setting changed in OptionsDialog
12581247 log .d ("Some settings is changed, uploading to cloud..." );
12591248 //mGoogleDriveSync.startSyncToOnly(null, Synchronizer.SYNC_FLAG_SHOW_SIGN_IN | Synchronizer.SYNC_FLAG_QUIETLY | Synchronizer.SYNC_FLAG_SHOW_PROGRESS, Synchronizer.SyncTarget.SETTINGS);
1260- checkNinitSyncService ();
1261- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCTO_ONLY , Uri .EMPTY , CoolReader .this , SyncService .class );
1262- Bundle data = new Bundle ();
1263- data .putParcelable ("bookInfo" , null );
1264- data .putInt ("flags" , Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS );
1265- data .putIntArray ("targets" , new int []{ Synchronizer .SyncTarget .SETTINGS .ordinal () });
1266- syncIntent .putExtras (data );
1267- startService (syncIntent );
1249+ syncServiceAccessor .bind (sync -> {
1250+ sync .setSynchronizer (mGoogleDriveSync );
1251+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
1252+ sync .startSyncToOnly (null , Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS , Synchronizer .SyncTarget .SETTINGS );
1253+ });
12681254 }
12691255 }
12701256 }, 500 );
@@ -1329,14 +1315,11 @@ public void showRootWindow() {
13291315 // Save bookmarks and current reading position on the cloud
13301316 if (mGoogleDriveSyncOpts .Enabled && null != mGoogleDriveSync ) {
13311317 //mGoogleDriveSync.startSyncToOnly(getCurrentBookInfo(), Synchronizer.SYNC_FLAG_QUIETLY, Synchronizer.SyncTarget.BOOKMARKS);
1332- checkNinitSyncService ();
1333- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCTO_ONLY , Uri .EMPTY , CoolReader .this , SyncService .class );
1334- Bundle data = new Bundle ();
1335- data .putParcelable ("bookInfo" , getCurrentBookInfo ());
1336- data .putInt ("flags" , Synchronizer .SYNC_FLAG_QUIETLY );
1337- data .putIntArray ("targets" , new int []{ Synchronizer .SyncTarget .BOOKMARKS .ordinal () });
1338- syncIntent .putExtras (data );
1339- startService (syncIntent );
1318+ syncServiceAccessor .bind (sync -> {
1319+ sync .setSynchronizer (mGoogleDriveSync );
1320+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
1321+ sync .startSyncToOnly (getCurrentBookInfo (), Synchronizer .SYNC_FLAG_QUIETLY , Synchronizer .SyncTarget .BOOKMARKS );
1322+ });
13401323 }
13411324 }
13421325 }
@@ -1491,20 +1474,11 @@ public void loadDocument(final String item, final Runnable doneCallback, final R
14911474 targets .add (Synchronizer .SyncTarget .CURRENTBOOKBODY );
14921475 if (!targets .isEmpty ()) {
14931476 //mGoogleDriveSync.startSyncToOnly(getCurrentBookInfo(), Synchronizer.SYNC_FLAG_SHOW_SIGN_IN | Synchronizer.SYNC_FLAG_QUIETLY | Synchronizer.SYNC_FLAG_SHOW_PROGRESS, targets.toArray(new Synchronizer.SyncTarget[0]));
1494- checkNinitSyncService ();
1495- Intent syncIntent = new Intent (SyncService .SYNC_ACTION_SYNCTO_ONLY , Uri .EMPTY , CoolReader .this , SyncService .class );
1496- Bundle data = new Bundle ();
1497- data .putParcelable ("bookInfo" , getCurrentBookInfo ());
1498- data .putInt ("flags" , Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS );
1499- int [] targets_int = new int [targets .size ()];
1500- int i = 0 ;
1501- for (Synchronizer .SyncTarget target : targets ) {
1502- targets_int [i ] = target .ordinal ();
1503- i ++;
1504- }
1505- data .putIntArray ("targets" , targets_int );
1506- syncIntent .putExtras (data );
1507- startService (syncIntent );
1477+ syncServiceAccessor .bind (sync -> {
1478+ sync .setSynchronizer (mGoogleDriveSync );
1479+ sync .setOnSyncStatusListener (mGoogleDriveSyncStatusListener );
1480+ sync .startSyncToOnly (getCurrentBookInfo (), Synchronizer .SYNC_FLAG_SHOW_SIGN_IN | Synchronizer .SYNC_FLAG_QUIETLY | Synchronizer .SYNC_FLAG_SHOW_PROGRESS , targets .toArray (new Synchronizer .SyncTarget [0 ]));
1481+ });
15081482 }
15091483 }
15101484 }
0 commit comments