From 697ad142e0c301bfb028faf93ff5c0cd3296aa49 Mon Sep 17 00:00:00 2001 From: Roman Tsisyk Date: Wed, 18 Aug 2021 18:50:21 +0300 Subject: [PATCH] [android] Fix download progress (#1119) * [android] Fix download progress mTrackingIds (Java) and g_completionHandlers (C++) do the same job. Signed-off-by: Roman Tsisyk Signed-off-by: Alexander Borsuk Co-authored-by: Alexander Borsuk --- .../com/mapswithme/maps/DownloaderAdapter.cpp | 7 +++++ .../maps/downloader/MapDownloadManager.java | 4 +-- .../MapDownloadProgressTracker.java | 28 ++++++------------- .../maps/downloader/MapManager.java | 1 + 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/android/jni/com/mapswithme/maps/DownloaderAdapter.cpp b/android/jni/com/mapswithme/maps/DownloaderAdapter.cpp index 93dddffa1e..f5a720b5c3 100644 --- a/android/jni/com/mapswithme/maps/DownloaderAdapter.cpp +++ b/android/jni/com/mapswithme/maps/DownloaderAdapter.cpp @@ -198,4 +198,11 @@ Java_com_mapswithme_maps_downloader_MapManager_nativeOnDownloadProgress(JNIEnv * it->second.second(static_cast(bytesDownloaded), static_cast(bytesTotal)); } + +JNIEXPORT jboolean JNICALL +Java_com_mapswithme_maps_downloader_MapManager_nativeHasPendingDownloads(JNIEnv *, jclass) +{ + return !g_completionHandlers.empty(); +} + } // extern "C" diff --git a/android/src/com/mapswithme/maps/downloader/MapDownloadManager.java b/android/src/com/mapswithme/maps/downloader/MapDownloadManager.java index 5a01bef325..4658e2966f 100644 --- a/android/src/com/mapswithme/maps/downloader/MapDownloadManager.java +++ b/android/src/com/mapswithme/maps/downloader/MapDownloadManager.java @@ -136,7 +136,7 @@ public class MapDownloadManager requestId = id; } - mProgressTracker.add(requestId); + startProgressTracking(); return requestId; } @@ -144,13 +144,11 @@ public class MapDownloadManager @MainThread public void remove(long requestId) { - mProgressTracker.remove(requestId); mDownloadManager.remove(requestId); } public void onDownloadFinished(boolean status, long id) { - mProgressTracker.remove(id); MapManager.nativeOnDownloadFinished(status, id); } diff --git a/android/src/com/mapswithme/maps/downloader/MapDownloadProgressTracker.java b/android/src/com/mapswithme/maps/downloader/MapDownloadProgressTracker.java index e78e24638c..b673708383 100644 --- a/android/src/com/mapswithme/maps/downloader/MapDownloadProgressTracker.java +++ b/android/src/com/mapswithme/maps/downloader/MapDownloadProgressTracker.java @@ -5,14 +5,12 @@ import android.content.Context; import android.database.Cursor; import androidx.annotation.NonNull; + import com.mapswithme.util.Utils; import com.mapswithme.util.concurrency.UiThread; import com.mapswithme.util.log.Logger; import com.mapswithme.util.log.LoggerFactory; -import java.util.HashSet; -import java.util.Set; - public class MapDownloadProgressTracker { private static final Logger LOGGER = LoggerFactory.INSTANCE.getLogger(LoggerFactory.Type.DOWNLOADER); @@ -22,8 +20,6 @@ public class MapDownloadProgressTracker @NonNull private final DownloadManager mDownloadManager; - @NonNull - private final Set mTrackingIds = new HashSet<>(); private boolean mTrackingEnabled = false; private final Runnable mTrackingMethod = this::trackProgress; @@ -44,7 +40,8 @@ public class MapDownloadProgressTracker return; mTrackingEnabled = true; - trackProgress(); + // Delayed start, because g_completionHandlers are empty until enquee() method finishes. + UiThread.runLater(mTrackingMethod, PROGRESS_TRACKING_INTERVAL_MILLISECONDS); } public void stop() @@ -53,21 +50,17 @@ public class MapDownloadProgressTracker UiThread.cancelDelayedTasks(mTrackingMethod); } - public void add(long id) - { - mTrackingIds.add(id); - } - - public void remove(long id) - { - mTrackingIds.remove(id); - } - private void trackProgress() { if (!mTrackingEnabled) return; + if (!MapManager.nativeHasPendingDownloads()) + { + mTrackingEnabled = false; + return; + } + DownloadManager.Query query = new DownloadManager.Query(); query.setFilterByStatus(DownloadManager.STATUS_RUNNING); Cursor cursor = null; @@ -80,9 +73,6 @@ public class MapDownloadProgressTracker for (int i = 0; i < count; ++i) { long id = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_ID)); - if (!mTrackingIds.contains(id)) - continue; - long bytesDownloaded = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); long bytesTotal = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); diff --git a/android/src/com/mapswithme/maps/downloader/MapManager.java b/android/src/com/mapswithme/maps/downloader/MapManager.java index e8acc8d509..07cb84df95 100644 --- a/android/src/com/mapswithme/maps/downloader/MapManager.java +++ b/android/src/com/mapswithme/maps/downloader/MapManager.java @@ -418,4 +418,5 @@ public final class MapManager public static native void nativeOnDownloadFinished(boolean status, long id); public static native void nativeOnDownloadProgress(long id, long bytesDownloaded, long bytesTotal); + public static native boolean nativeHasPendingDownloads(); }