diff options
author | Łukasz Paczos <lukas.paczos@gmail.com> | 2019-08-08 14:19:22 +0200 |
---|---|---|
committer | Łukasz Paczos <lukas.paczos@gmail.com> | 2019-08-29 12:48:26 +0200 |
commit | d6a60f053bf8123fb0a2caeb9390d89b65d7b868 (patch) | |
tree | ab9cc94dd2fb4148e84af5e71e7f53c83d7671d3 | |
parent | 6a4e431dbef4c036b5b27b9972caea70bfc269fb (diff) | |
download | qtlocation-mapboxgl-d6a60f053bf8123fb0a2caeb9390d89b65d7b868.tar.gz |
test
5 files changed, 290 insertions, 10 deletions
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" /> </activity> - <activity - android:name=".activity.offline.DownloadRegionActivity" - android:description="@string/description_region" - android:label="@string/activity_region"> + <activity android:name=".activity.offline.DownloadNotCompletingActivity" + android:description="@string/description_region" + android:label="@string/activity_region"> <meta-data - android:name="@string/category" - android:value="@string/category_offline" /> + android:name="@string/category" + android:value="@string/category_offline" /> <meta-data - android:name="android.support.PARENT_ACTIVITY" - android:value=".activity.FeatureOverviewActivity" /> - </activity> + android:name="android.support.PARENT_ACTIVITY" + android:value=".activity.FeatureOverviewActivity" /> + </activity> <!-- For Instrumentation tests --> + <!--<activity + android:name=".activity.offline.DownloadRegionActivity" + android:description="@string/description_region" + android:label="@string/activity_region"> + <meta-data + android:name="@string/category" + android:value="@string/category_offline" /> + <meta-data + android:name="android.support.PARENT_ACTIVITY" + android:value=".activity.FeatureOverviewActivity" /> + </activity> --> <!-- For Instrumentation tests --> <activity android:name=".activity.style.RuntimeStyleTimingTestActivity" diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/BaseOfflineTestActivity.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/BaseOfflineTestActivity.kt new file mode 100644 index 0000000000..7f93ef5103 --- /dev/null +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/BaseOfflineTestActivity.kt @@ -0,0 +1,92 @@ +package com.mapbox.mapboxsdk.testapp.activity.offline + +import android.os.Bundle +import android.os.Handler +import android.support.v7.app.AppCompatActivity +import android.widget.TextView +import com.mapbox.mapboxsdk.offline.OfflineManager +import com.mapbox.mapboxsdk.offline.OfflineRegion +import com.mapbox.mapboxsdk.testapp.R +import kotlinx.coroutines.* +import timber.log.Timber +import kotlin.coroutines.CoroutineContext +import kotlin.coroutines.resume + +abstract class BaseOfflineTestActivity : AppCompatActivity(), CoroutineScope { + + protected lateinit var handler: Handler + protected lateinit var offlineManager: OfflineManager + + private var job = SupervisorJob() + override val coroutineContext: CoroutineContext + get() = Dispatchers.Main + job + + private val logView: TextView by lazy { + findViewById<TextView>(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<out OfflineRegion>) { + 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 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".activity.offline.DownloadNotCompletingActivity"> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <TextView + android:id="@+id/log_text" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:textSize="8sp" + tools:text="Log text container"/> + + </FrameLayout> + + <TextView + android:id="@+id/download_status" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="16dp" + android:text="Not downloading" + android:textSize="8dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + /> + +</android.support.constraint.ConstraintLayout>
\ No newline at end of file |