Skip to content

Commit b19b4e7

Browse files
authored
Merge pull request #314 from virxkane/cloud-sync-service-bound
Cloud sync service has been remade to a bound service
2 parents 682fb3e + a54d475 commit b19b4e7

4 files changed

Lines changed: 257 additions & 184 deletions

File tree

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ buildscript {
77
mavenCentral()
88
}
99
dependencies {
10-
classpath 'com.android.tools.build:gradle:7.0.1'
10+
classpath 'com.android.tools.build:gradle:7.0.2'
1111
// NOTE: Do not place your application dependencies here; they belong
1212
// in the individual module build.gradle files
1313
}

android/src/org/coolreader/CoolReader.java

Lines changed: 63 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)