Skip to content

Commit f6aaf60

Browse files
Pablo Guardioladzinad
authored andcommitted
fix copilot anr executing copy to and remove in a separate io thread (#6876)
1 parent 10a3b12 commit f6aaf60

File tree

4 files changed

+23
-10
lines changed

4 files changed

+23
-10
lines changed

libnavigation-copilot/src/main/java/com/mapbox/navigation/copilot/HistoryAttachmentsUtils.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package com.mapbox.navigation.copilot
33
import android.util.Base64
44
import com.mapbox.navigation.copilot.internal.CopilotMetadata
55
import com.mapbox.navigation.core.BuildConfig
6+
import kotlinx.coroutines.Dispatchers
7+
import kotlinx.coroutines.withContext
68
import org.json.JSONObject
79
import java.io.File
810
import java.text.SimpleDateFormat
@@ -60,11 +62,10 @@ internal object HistoryAttachmentsUtils {
6062

6163
fun delete(file: File): Boolean = file.delete()
6264

63-
fun copyToAndRemove(from: File, filename: String): File {
64-
val to = from.copyTo(File(from.parent, filename))
65-
from.delete()
66-
return to
67-
}
65+
suspend fun copyToAndRemove(from: File, filename: String): File =
66+
withContext(Dispatchers.IO) {
67+
File(from.parent, filename).also { from.renameTo(it) }
68+
}
6869

6970
private fun decode(str: String): JSONObject {
7071
val requiredLength = (str.length - 1) / 4 * 4 + 4

libnavigation-copilot/src/main/java/com/mapbox/navigation/copilot/MapboxCopilotImpl.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import com.mapbox.navigation.core.internal.telemetry.UserFeedbackCallback
3535
import com.mapbox.navigation.core.internal.telemetry.registerUserFeedbackCallback
3636
import com.mapbox.navigation.core.internal.telemetry.unregisterUserFeedbackCallback
3737
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
38+
import com.mapbox.navigation.utils.internal.InternalJobControlFactory
39+
import kotlinx.coroutines.launch
3840
import java.io.File
3941
import java.util.Locale
4042

@@ -48,6 +50,7 @@ internal class MapboxCopilotImpl(
4850
private val mapboxNavigation: MapboxNavigation,
4951
) {
5052

53+
private val mainJobController by lazy { InternalJobControlFactory.createMainScopeJobControl() }
5154
private val activeGuidanceHistoryEvents = mutableSetOf<HistoryEventDTO>()
5255
private val copilotHistoryRecorder = mapboxNavigation.retrieveCopilotHistoryRecorder()
5356
private var currentHistoryRecordingSessionState: HistoryRecordingSessionState = Idle
@@ -277,7 +280,9 @@ internal class MapboxCopilotImpl(
277280
val drive = buildNavigationSession()
278281
stopRecording { historyFilePath ->
279282
if (hasFeedback || !shouldSendHistoryOnlyWithFeedback) {
280-
pushHistoryFile(historyFilePath, drive)
283+
mainJobController.scope.launch {
284+
pushHistoryFile(historyFilePath, drive)
285+
}
281286
}
282287
}
283288
}
@@ -310,7 +315,7 @@ internal class MapboxCopilotImpl(
310315
return context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0
311316
}
312317

313-
private fun pushHistoryFile(historyFilePath: String, drive: CopilotMetadata) {
318+
private suspend fun pushHistoryFile(historyFilePath: String, drive: CopilotMetadata) {
314319
val metadata = buildAttachmentMetadata(drive)
315320
val uploadOptions = buildUploadOptions(historyFilePath, metadata)
316321
HistoryUploadWorker.uploadHistory(
@@ -335,7 +340,7 @@ internal class MapboxCopilotImpl(
335340
)
336341
}
337342

338-
private fun buildUploadOptions(
343+
private suspend fun buildUploadOptions(
339344
filePath: String,
340345
metadata: AttachmentMetadata,
341346
): UploadOptions {

libnavigation-copilot/src/test/java/com/mapbox/navigation/copilot/HistoryUploadWorkerTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.mapbox.navigation.copilot.internal.PushStatus
1818
import com.mapbox.navigation.copilot.internal.PushStatusObserver
1919
import com.mapbox.navigation.utils.internal.logD
2020
import io.mockk.Runs
21+
import io.mockk.coEvery
2122
import io.mockk.every
2223
import io.mockk.just
2324
import io.mockk.mockk
@@ -446,7 +447,7 @@ class HistoryUploadWorkerTest {
446447
mockkObject(HistoryAttachmentsUtils)
447448
val fileSlot = slot<File>()
448449
val mockedFile = mockk<File>(relaxed = true)
449-
every { copyToAndRemove(capture(fileSlot), any()) } answers {
450+
coEvery { copyToAndRemove(capture(fileSlot), any()) } coAnswers {
450451
every { mockedFile.absolutePath } returns fileSlot.captured.toString()
451452
mockedFile
452453
}

libnavigation-copilot/src/test/java/com/mapbox/navigation/copilot/MapboxCopilotImplTest.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ import com.mapbox.navigation.core.internal.telemetry.UserFeedbackCallback
3030
import com.mapbox.navigation.core.internal.telemetry.registerUserFeedbackCallback
3131
import com.mapbox.navigation.core.internal.telemetry.unregisterUserFeedbackCallback
3232
import com.mapbox.navigation.core.lifecycle.MapboxNavigationApp
33+
import com.mapbox.navigation.testing.MainCoroutineRule
3334
import com.mapbox.navigation.utils.internal.logD
3435
import io.mockk.Runs
36+
import io.mockk.coEvery
3537
import io.mockk.every
3638
import io.mockk.just
3739
import io.mockk.mockk
@@ -44,6 +46,7 @@ import io.mockk.verifyOrder
4446
import org.junit.After
4547
import org.junit.Assert.assertEquals
4648
import org.junit.Assert.assertTrue
49+
import org.junit.Rule
4750
import org.junit.Test
4851
import java.io.File
4952
import java.util.Locale
@@ -58,6 +61,9 @@ import java.util.Locale
5861
@OptIn(ExperimentalPreviewMapboxNavigationAPI::class)
5962
class MapboxCopilotImplTest {
6063

64+
@get:Rule
65+
val coroutineRule = MainCoroutineRule()
66+
6167
@After
6268
fun teardown() {
6369
unmockkAll()
@@ -2458,7 +2464,7 @@ class MapboxCopilotImplTest {
24582464
mockkObject(HistoryAttachmentsUtils)
24592465
val fileSlot = slot<File>()
24602466
val mockedFile = mockk<File>(relaxed = true)
2461-
every { copyToAndRemove(capture(fileSlot), any()) } answers {
2467+
coEvery { copyToAndRemove(capture(fileSlot), any()) } coAnswers {
24622468
every { mockedFile.absolutePath } returns fileSlot.captured.toString()
24632469
mockedFile
24642470
}

0 commit comments

Comments
 (0)