<lambda>null1 package expo.modules.updates.loader
2 
3 import android.content.Context
4 import android.util.Log
5 import expo.modules.updates.UpdatesConfiguration
6 import expo.modules.updates.UpdatesUtils
7 import expo.modules.updates.db.entity.AssetEntity
8 import expo.modules.updates.manifest.EmbeddedManifest
9 import expo.modules.updates.manifest.UpdateManifest
10 import java.io.File
11 import java.io.IOException
12 import java.security.NoSuchAlgorithmException
13 
14 /**
15  * Utility class for Loader and its subclasses, to allow for easy mocking
16  */
17 open class LoaderFiles {
18   fun fileExists(destination: File): Boolean {
19     return destination.exists()
20   }
21 
22   fun readEmbeddedManifest(
23     context: Context,
24     configuration: UpdatesConfiguration
25   ): UpdateManifest? {
26     return EmbeddedManifest.get(context, configuration)
27   }
28 
29   @Throws(NoSuchAlgorithmException::class, IOException::class)
30   fun copyAssetAndGetHash(asset: AssetEntity, destination: File, context: Context): ByteArray {
31     return if (asset.embeddedAssetFilename != null) {
32       copyContextAssetAndGetHash(asset, destination, context)
33     } else if (asset.resourcesFilename != null && asset.resourcesFolder != null) {
34       copyResourceAndGetHash(asset, destination, context)
35     } else {
36       throw AssertionError("Failed to copy embedded asset " + asset.key + " from APK assets or resources because not enough information was provided.")
37     }
38   }
39 
40   @Throws(NoSuchAlgorithmException::class, IOException::class)
41   internal fun copyContextAssetAndGetHash(
42     asset: AssetEntity,
43     destination: File,
44     context: Context
45   ): ByteArray {
46     try {
47       context.assets.open(asset.embeddedAssetFilename!!)
48         .use { inputStream -> return UpdatesUtils.verifySHA256AndWriteToFile(inputStream, destination, null) }
49     } catch (e: Exception) {
50       Log.e(TAG, "Failed to copy asset " + asset.embeddedAssetFilename, e)
51       throw e
52     }
53   }
54 
55   @Throws(NoSuchAlgorithmException::class, IOException::class)
56   internal fun copyResourceAndGetHash(
57     asset: AssetEntity,
58     destination: File,
59     context: Context
60   ): ByteArray {
61     val id = context.resources.getIdentifier(
62       asset.resourcesFilename,
63       asset.resourcesFolder,
64       context.packageName
65     )
66     try {
67       context.resources.openRawResource(id)
68         .use { inputStream -> return UpdatesUtils.verifySHA256AndWriteToFile(inputStream, destination, null) }
69     } catch (e: Exception) {
70       Log.e(TAG, "Failed to copy asset " + asset.embeddedAssetFilename, e)
71       throw e
72     }
73   }
74 
75   companion object {
76     private val TAG = LoaderFiles::class.java.simpleName
77   }
78 }
79