summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/utils/FileUtils.kt
blob: 457ad928dbda9fe38e2ed677297e4886cd92cda4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.mapbox.mapboxsdk.testapp.utils

import android.content.Context
import android.os.AsyncTask
import java.io.File
import java.io.FileOutputStream
import java.lang.ref.WeakReference

class FileUtils {

  /**
   * Task that copies a file from the assets directory to a provided directory.
   * The asset's name is going to be kept in the new directory.
   */
  class CopyFileFromAssetsTask(context: Context, listener: OnFileCopiedFromAssetsListener) : AsyncTask<String, Void, Boolean>() {
    private val contextWeakReference: WeakReference<Context> = WeakReference(context)
    private val listenerWeakReference: WeakReference<OnFileCopiedFromAssetsListener> = WeakReference(listener)

    override fun doInBackground(vararg strings: String): Boolean? {
      val assetName = strings[0]
      val destinationPath = strings[1]
      
      contextWeakReference.get()?.let {
        try {
          copyAsset(it, assetName, destinationPath)
        } catch (ex: Exception) {
          return false
        }
      }

      return true
    }

    override fun onCancelled() {
      listenerWeakReference.get()?.onError()
    }

    override fun onPostExecute(result: Boolean) {
      if (result) {
        listenerWeakReference.get()?.onFileCopiedFromAssets()
      } else {
        listenerWeakReference.get()?.onError()
      }
    }

    private fun copyAsset(context: Context, assetName: String, destinationPath: String) {
      val bufferSize = 1024
      val assetManager = context.assets
      val inputStream = assetManager.open(assetName)
      val outputStream = FileOutputStream(File(destinationPath, assetName))
      try {
        inputStream.copyTo(outputStream, bufferSize)
      } finally {
        inputStream.close()
        outputStream.flush()
        outputStream.close()
      }
    }
  }

  interface OnFileCopiedFromAssetsListener {
    fun onFileCopiedFromAssets()
    fun onError()
  }
}