<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