call: prevent race condition in time update

Change-Id: If11005576cf0c6b3a10b3ec5244f475e32cab760
Reviewed-by: Sebastien Blin <sebastien.blin@savoirfairelinux.com>
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
index 94cb01e..29dc76b 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
@@ -470,7 +470,8 @@
 
     @Override
     public void updateTime(final long duration) {
-        getActivity().runOnUiThread(() -> mCallStatusTxt.setText(String.format(Locale.getDefault(), "%d:%02d:%02d", duration / 3600, duration % 3600 / 60, duration % 60)));
+        if (mCallStatusTxt != null)
+            mCallStatusTxt.setText(String.format(Locale.getDefault(), "%d:%02d:%02d", duration / 3600, duration % 3600 / 60, duration % 60));
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
index ad51598..e8566e3 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
@@ -326,7 +326,8 @@
 
     @Override
     public void updateTime(final long duration) {
-        getActivity().runOnUiThread(() -> mCallStatusTxt.setText(String.format(Locale.getDefault(), "%d:%02d:%02d", duration / 3600, duration % 3600 / 60, duration % 60)));
+        if (mCallStatusTxt != null)
+            mCallStatusTxt.setText(String.format(Locale.getDefault(), "%d:%02d:%02d", duration / 3600, duration % 3600 / 60, duration % 60));
     }
 
     @Override
diff --git a/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java b/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
index e282c82..890732b 100644
--- a/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
+++ b/ring-android/libringclient/src/main/java/cx/ring/call/CallPresenter.java
@@ -20,8 +20,6 @@
  */
 package cx.ring.call;
 
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
@@ -36,6 +34,7 @@
 import cx.ring.utils.Log;
 import cx.ring.utils.StringUtils;
 import io.reactivex.Scheduler;
+import io.reactivex.disposables.Disposable;
 
 public class CallPresenter extends RootPresenter<CallView> {
 
@@ -55,8 +54,8 @@
     private int previewWidth = -1;
     private int previewHeight = -1;
 
-    private ScheduledExecutorService executor;
     private Runnable timeRunnable = this::updateTime;
+    private Disposable timeUpdateTask = null;
 
     @Inject
     @Named("UiScheduler")
@@ -232,8 +231,9 @@
     }
 
     private void finish() {
-        if (executor != null && !executor.isShutdown()) {
-            executor.shutdown();
+        if (timeUpdateTask != null && !timeUpdateTask.isDisposed()) {
+            timeUpdateTask.dispose();
+            timeUpdateTask = null;
         }
         mSipCall = null;
         getView().finish();
@@ -263,10 +263,9 @@
                 mHardwareService.setPreviewSettings();
                 view.displayVideoSurface(true);
             }
-            if (executor == null || executor.isShutdown()) {
-                executor = Executors.newSingleThreadScheduledExecutor();
-                executor.scheduleAtFixedRate(timeRunnable, 0, 1, TimeUnit.SECONDS);
-            }
+            if (timeUpdateTask != null)
+                timeUpdateTask.dispose();
+            timeUpdateTask = mUiScheduler.schedulePeriodicallyDirect(timeRunnable, 0, 1, TimeUnit.SECONDS);
         } else if (mSipCall.isRinging()) {
             if (mSipCall.isIncoming()) {
                 if (mAccountService.getAccount(mSipCall.getAccount()).isAutoanswerEnabled()) {