summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commitd6a60f053bf8123fb0a2caeb9390d89b65d7b868 (patch)
treeab9cc94dd2fb4148e84af5e71e7f53c83d7671d3
parent6a4e431dbef4c036b5b27b9972caea70bfc269fb (diff)
downloadqtlocation-mapboxgl-d6a60f053bf8123fb0a2caeb9390d89b65d7b868.tar.gz
test
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/build.gradle6
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/AndroidManifest.xml28
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/BaseOfflineTestActivity.kt92
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/offline/DownloadNotCompletingActivity.kt140
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/main/res/layout/activity_download_not_completing.xml34
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