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()) {