From d6a60f053bf8123fb0a2caeb9390d89b65d7b868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Paczos?= Date: Thu, 8 Aug 2019 14:19:22 +0200 Subject: test --- .../android/MapboxGLAndroidSDKTestApp/build.gradle | 6 +- .../src/main/AndroidManifest.xml | 28 +++-- .../activity/offline/BaseOfflineTestActivity.kt | 92 ++++++++++++++ .../offline/DownloadNotCompletingActivity.kt | 140 +++++++++++++++++++++ .../layout/activity_download_not_completing.xml | 34 +++++ 5 files changed, 290 insertions(+), 10 deletions(-) create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/BaseOfflineTestActivity.kt create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/DownloadNotCompletingActivity.kt create mode 100644 platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_download_not_completing.xml diff --git a/platform/android/MapboxGLAndroidSDKTestApp/build.gradle b/platform/android/MapboxGLAndroidSDKTestApp/build.gradle index bcdafd55d5..9527b1d216 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/build.gradle +++ b/platform/android/MapboxGLAndroidSDKTestApp/build.gradle @@ -69,9 +69,14 @@ dependencies { implementation dependenciesList.gmsLocation implementation dependenciesList.timber + implementation 'com.android.support.constraint:constraint-layout:1.1.3' debugImplementation dependenciesList.leakCanaryDebug releaseImplementation dependenciesList.leakCanaryRelease + // Coroutines + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.1" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.1" + androidTestImplementation dependenciesList.supportAnnotations androidTestImplementation dependenciesList.testRunner androidTestImplementation dependenciesList.testRules @@ -88,6 +93,5 @@ apply from: "${rootDir}/gradle/gradle-checkstyle.gradle" apply from: "${rootDir}/gradle/gradle-lint.gradle" - apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml index 73c9b97f20..8e151e70e2 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml @@ -976,17 +976,27 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activity.FeatureOverviewActivity" /> - + + android:name="@string/category" + android:value="@string/category_offline" /> - + android:name="android.support.PARENT_ACTIVITY" + android:value=".activity.FeatureOverviewActivity" /> + + (R.id.log_text) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + handler = Handler() + offlineManager = OfflineManager.getInstance(this) + } + + override fun onDestroy() { + handler.removeCallbacksAndMessages(null) + coroutineContext.cancel() + super.onDestroy() + } + + protected fun logMessage(message: String) { + Timber.d(message) + logView.append(message) + logView.append("\n") + } + + fun deleteOldOfflineRegions(onCompleted: () -> Unit) { + offlineManager.listOfflineRegions(object : OfflineManager.ListOfflineRegionsCallback { + override fun onList(offlineRegions: Array) { + val count = offlineRegions.size + var remainingCount = count + if (count > 0) { + logMessage("Deleting $count old regions...") + offlineRegions.forEach { + it.delete(object : OfflineRegion.OfflineRegionDeleteCallback { + override fun onDelete() { + Timber.d("Deleted region with id ${it.id}") + onProcessed() + } + + override fun onError(error: String) { + Timber.e("Failed to delete region: $error") + onProcessed() + } + + private fun onProcessed() { + remainingCount-- + if (remainingCount == 0) { + logMessage("Done deleting") + onCompleted() + } + } + }) + } + } else { + onCompleted() + } + } + + override fun onError(error: String) { + logMessage("Failed to list offline regions: $error") + onCompleted() + } + }) + } + + suspend fun deleteOldOfflineRegions() { + return suspendCancellableCoroutine { continuation -> + deleteOldOfflineRegions { continuation.resume(Unit) } + } + } +} \ No newline at end of file diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/DownloadNotCompletingActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/DownloadNotCompletingActivity.kt new file mode 100644 index 0000000000..ba4b86b9d4 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/DownloadNotCompletingActivity.kt @@ -0,0 +1,140 @@ +package com.mapbox.mapboxsdk.testapp.activity.offline + +import android.os.Bundle +import com.mapbox.mapboxsdk.geometry.LatLngBounds +import com.mapbox.mapboxsdk.maps.Style +import com.mapbox.mapboxsdk.offline.* +import com.mapbox.mapboxsdk.testapp.R +import kotlinx.android.synthetic.main.activity_download_not_completing.* +import timber.log.Timber +import java.util.concurrent.TimeUnit + +private const val STOP_INTERVAL = 1000L +private const val STATUS_UPDATE_TIMEOUT_MS = 30_000L + +class DownloadNotCompletingActivity : BaseOfflineTestActivity(), OfflineRegion.OfflineRegionObserver { + + private var offlineRegion: OfflineRegion? = null + private var previousCompletedResourceCount: Long = 0 + private var previousUpdateTimestamp: Long = 0 + private var nextStop = STOP_INTERVAL + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContentView(R.layout.activity_download_not_completing) + + deleteOldOfflineRegions { + createOfflineRegion() + } + } + + override fun onDestroy() { + offlineRegion?.let { + it.setObserver(null) + + it.delete(object : OfflineRegion.OfflineRegionDeleteCallback { + override fun onDelete() { + } + + override fun onError(error: String?) { + } + }) + } + + super.onDestroy() + } + + private fun createOfflineRegion() { + val definition = OfflineTilePyramidRegionDefinition( + Style.OUTDOORS, + LatLngBounds.from(61.3, 24.0, 61.0, 23.6), + 1.0, + 15.0, + resources.displayMetrics.density) + + logMessage("Creating offline region") + offlineManager.createOfflineRegion(definition, byteArrayOf(), object : OfflineManager.CreateOfflineRegionCallback { + override fun onCreate(region: OfflineRegion) { + logMessage("Region with id ${region.id} created") + offlineRegion = region + + startDownload(region) + } + + override fun onError(error: String) { + logMessage("Failed to create offline region: $error") + } + }) + } + + private fun startDownload(region: OfflineRegion) { + logMessage("Downloading...") + + region.setObserver(this) + region.setDownloadState(OfflineRegion.STATE_ACTIVE) + + previousUpdateTimestamp = System.currentTimeMillis() + handler.postDelayed(object : Runnable { + override fun run() { + if (System.currentTimeMillis() > previousUpdateTimestamp + STATUS_UPDATE_TIMEOUT_MS) { + logMessage("FAILURE! No progress in ${TimeUnit.MILLISECONDS.toSeconds(STATUS_UPDATE_TIMEOUT_MS)} seconds") + } else { + handler.postDelayed(this, 500) + } + } + }, 500) + } + + private fun pauseDownload(region: OfflineRegion) { + handler.removeCallbacksAndMessages(null) + + region.setDownloadState(OfflineRegion.STATE_INACTIVE) + handler.postDelayed({ startDownload(region) }, 500) + + "Paused".let { + logMessage(it) + download_status.text = it + } + } + + override fun onStatusChanged(status: OfflineRegionStatus) { + val downloadProgressText = "Downloaded ${status.completedResourceCount}/${status.requiredResourceCount}" + Timber.d(downloadProgressText) + if (status.isComplete) { + if (status.downloadState == OfflineRegion.STATE_INACTIVE) { + val statusText = "Completed" + logMessage("SUCCESS! $statusText") + download_status.text = statusText + offlineRegion?.setObserver(null) + handler.removeCallbacksAndMessages(null) + } else { + logMessage("Completed, inactivating download") + offlineRegion?.setDownloadState(OfflineRegion.STATE_INACTIVE) + } + } else { + download_status.text = downloadProgressText + if (previousCompletedResourceCount < nextStop && status.completedResourceCount >= nextStop) { + nextStop += STOP_INTERVAL + offlineRegion?.let { pauseDownload(it) } + } + } + + if (status.completedResourceCount > status.requiredResourceCount && + status.isRequiredResourceCountPrecise && + previousCompletedResourceCount <= status.requiredResourceCount) { + logMessage("FAILURE! Completed > required") + } + + previousCompletedResourceCount = status.completedResourceCount + previousUpdateTimestamp = System.currentTimeMillis() + } + + override fun onError(error: OfflineRegionError) { + logMessage("Error: $error") + } + + override fun mapboxTileCountLimitExceeded(limit: Long) { + logMessage("Error: tile count limit exceeded") + } +} diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_download_not_completing.xml b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_download_not_completing.xml new file mode 100644 index 0000000000..cd4aa0c323 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_download_not_completing.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.1