3737import java .util .ArrayList ;
3838import java .util .Calendar ;
3939import java .util .HashMap ;
40+ import java .util .concurrent .Executors ;
41+ import java .util .concurrent .ScheduledExecutorService ;
42+ import java .util .concurrent .ScheduledFuture ;
43+ import java .util .concurrent .TimeUnit ;
4044
4145import pl .selvin .android .autocontentprovider .content .AutoContentProvider ;
4246import pl .selvin .android .autocontentprovider .db .TableInfo ;
@@ -48,13 +52,16 @@ public abstract class BaseContentProvider extends AutoContentProvider {
4852 public final static String DATABASE_OPERATION_TYPE_UPGRADE = "DATABASE_OPERATION_TYPE_UPGRADE" ;
4953 public final static String DATABASE_OPERATION_TYPE_CREATE = "DATABASE_OPERATION_TYPE_CREATE" ;
5054 public final static String ACTION_SYNC_FRAMEWORK_DATABASE = "ACTION_SYNC_FRAMEWORK_DATABASE" ;
51- private static final String DATABASE_OPERATION_TYPE = "DATABASE_OPERATION_TYPE" ;
55+ private final static String DATABASE_OPERATION_TYPE = "DATABASE_OPERATION_TYPE" ;
56+ private final static long PING_DELAY_SECONDS = 60 ;
5257 protected final RequestExecutor executor ;
5358 private final SyncContentHelper syncContentHelper ;
59+ private final ScheduledExecutorService pingExecutor ;
5460
5561 public BaseContentProvider (SyncContentHelper contentHelper , Logger logger , SupportSQLiteOpenHelperFactoryProvider supportSQLiteOpenHelperFactoryProvider , RequestExecutor executor ) {
5662 super (contentHelper , logger , supportSQLiteOpenHelperFactoryProvider );
5763 syncContentHelper = contentHelper ;
64+ pingExecutor = Executors .newScheduledThreadPool (1 );
5865 this .executor = executor ;
5966 }
6067
@@ -123,6 +130,8 @@ public Stats sync(String service, String scope, String params, Stats stats) {
123130 final String download = String .format (syncContentHelper .DOWNLOAD_SERVICE_URI , service , scope , params );
124131 final String upload = String .format (syncContentHelper .UPLOAD_SERVICE_URI , service , scope , params );
125132 final String scopeServerBlob = String .format ("%s.%s.%s" , service , scope , SYNC .serverBlob );
133+ final ScheduledFuture <?> scheduledFuture =
134+ pingExecutor .scheduleWithFixedDelay (executor ::doPing , PING_DELAY_SECONDS , PING_DELAY_SECONDS , TimeUnit .SECONDS );
126135 String serverBlob = null ;
127136 final Cursor cur = db .query (
128137 SupportSQLiteQueryBuilder .builder (BlobsTable .NAME ).columns (new String []{BlobsTable .C_VALUE })
@@ -172,7 +181,6 @@ public Stats sync(String service, String scope, String params, Stats stats) {
172181
173182 }
174183 logger .LogD (getClass (), serviceRequestUrl );
175- long startTime = System .currentTimeMillis ();
176184 result = executeRequest (requestMethod , serviceRequestUrl , contentProducer );
177185 if (result .status == 200 ) {
178186 if (contentProducer != null )
@@ -211,10 +219,6 @@ public Stats sync(String service, String scope, String params, Stats stats) {
211219 meta .tempId = null ;
212220 values .clear ();
213221 while (jp .nextToken () != JsonToken .END_OBJECT ) {
214- final long currentTime = System .currentTimeMillis ();
215- if (currentTime - startTime > 1000 * 30 ) {
216- startTime = doPing (startTime , currentTime );
217- }
218222 name = jp .getCurrentName ();
219223 current = jp .nextToken ();
220224 switch (current ) {
@@ -318,7 +322,7 @@ public Stats sync(String service, String scope, String params, Stats stats) {
318322 logger .LogD (clazz , "*Sync* has resolve conflicts: " + resolveConflicts );
319323 } else {
320324 boolean fixed = false ;
321- final String error = result .getError () ;
325+ final String error = result .error ;
322326 if (error != null ) {
323327 if (error .contains ("00-00-00-05-00-00-00-00-00-00-00-01" ) && !serializationException ) {
324328 //nasty 500: System.Runtime.Serialization.SerializationException ... using upload instead download with the same serverBlob should help
@@ -394,14 +398,10 @@ public Stats sync(String service, String scope, String params, Stats stats) {
394398 db .insert (BlobsTable .NAME , SQLiteDatabase .CONFLICT_REPLACE , cv );
395399 }
396400 logger .LogTimeD (clazz , "*Sync* time" , start );
401+ scheduledFuture .cancel (true );
397402 return stats ;
398403 }
399404
400- @ SuppressWarnings ("UnusedParameters" )
401- public long doPing (long startTime , long currentTime ) {
402- return currentTime ;
403- }
404-
405405 protected RequestExecutor .Result executeRequest (int requestMethod , String serviceRequestUrl , final ISyncContentProducer syncContentProducer ) throws IOException {
406406 return executor .execute (requestMethod , serviceRequestUrl , syncContentProducer );
407407 }
0 commit comments