diff --git a/.github/workflows/snapshot_tests.yml b/.github/workflows/snapshot_tests.yml
new file mode 100644
index 0000000..24ae2f9
--- /dev/null
+++ b/.github/workflows/snapshot_tests.yml
@@ -0,0 +1,58 @@
+name: Snapshot tests
+
+on:
+  workflow_run:
+    workflows: [Validate]
+    types:
+      - completed
+
+jobs:
+  snapshot-tests:
+   runs-on: ubuntu-latest
+   steps:
+     - name: 'Download artifact'
+       uses: actions/github-script@v6
+       with:
+         script: |
+           # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_run
+           let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              run_id: context.payload.workflow_run.id,
+           });
+           let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
+             return artifact.name == "apks"
+           })[0];
+           let download = await github.rest.actions.downloadArtifact({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              artifact_id: matchArtifact.id,
+              archive_format: 'zip',
+           });
+           let fs = require('fs');
+           fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/apks.zip`, Buffer.from(download.data));
+     - name: Unzip artifact
+       run: |
+         unzip apks.zip
+         ls -l
+         ls -l apks
+     - name: Run tests
+       uses: emulator-wtf/run-tests@master
+       with:
+         api-token: ${{ secrets.EW_API_TOKEN }}
+         app: apks/snapshot-tests-debug.apk
+         test: apks/snapshot-tests-debug-androidTest.apk
+         devices: |
+           model=Pixel2,version=23
+           model=Pixel2,version=31
+         outputs-dir: build/test-results
+         directories-to-pull: /sdcard/Download/
+     - name: 'Post PR comment'
+       uses: mshick/add-pr-comment@v2
+       if: github.event_name == 'pull_request'
+       with:
+         message-id: ${{ github.sha }}
+         message: |
+           **Snapshot Tests**
+           **API 23**: [Report](https://happo.io/a/27/report/${{ github.sha }}-android23) [Diff](https://happo.io/a/27/p/27/compare/master-android23/${{ github.sha }}-android23)
+           **API 31**: [Report](https://happo.io/a/27/report/${{ github.sha }}-android31) [Diff](https://happo.io/a/27/p/27/compare/master-android31/${{ github.sha }}-android31)
\ No newline at end of file
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
index 3b32479..baa6aa2 100644
--- a/.github/workflows/validate.yml
+++ b/.github/workflows/validate.yml
@@ -10,13 +10,13 @@
   gradle-wrapper:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v2
+      - uses: actions/checkout@v3
       - uses: gradle/wrapper-validation-action@v1
   lint:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout the code
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Setup JDK
         uses: actions/setup-java@v2
         with:
@@ -38,7 +38,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout the code
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Setup JDK
         uses: actions/setup-java@v2
         with:
@@ -60,7 +60,7 @@
     runs-on: ubuntu-latest
     steps:
       - name: Checkout the code
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Setup env
         shell: bash
         run: |
@@ -76,31 +76,20 @@
           cache: 'gradle'
       - name: Build app
         run: ./gradlew snapshot-tests:assembleDebug snapshot-tests:assembleDebugAndroidTest --no-daemon
-      - name: Run tests
-        uses: emulator-wtf/run-tests@master
+      - name: Upload artifact
+        uses: actions/upload-artifact@v3
         with:
-          api-token: ${{ env.EW_API_TOKEN }}
-          app: snapshot-tests/build/outputs/apk/debug/snapshot-tests-debug.apk
-          test: snapshot-tests/build/outputs/apk/androidTest/debug/snapshot-tests-debug-androidTest.apk
-          devices: |
-            model=Pixel2,version=23
-            model=Pixel2,version=31
-          outputs-dir: build/test-results
-      - uses: mshick/add-pr-comment@v2
-        if: github.event_name == 'pull_request'
-        with:
-          message-id: ${{ github.sha }}
-          message: |
-            **Snapshot Tests**
-            **API 23**: [Report](https://happo.io/a/27/report/${{ github.sha }}-android23) [Diff](https://happo.io/a/27/p/27/compare/master-android23/${{ github.sha }}-android23)
-            **API 31**: [Report](https://happo.io/a/27/report/${{ github.sha }}-android31) [Diff](https://happo.io/a/27/p/27/compare/master-android31/${{ github.sha }}-android31)
+          name: apks
+          path: |
+            snapshot-tests/build/outputs/apk/androidTest/snapshot-tests-debug-androidTest.apk
+            snapshot-tests/build/outputs/apk/debug/snapshot-tests-debug.apk
   deploy:
     if: github.event_name == 'push' && github.repository == 'airbnb/lottie-android' && github.ref == 'refs/heads/master'
     runs-on: ubuntu-latest
     needs: [lint, unit-test, gradle-wrapper, snapshot-tests]
     steps:
       - name: Checkout the code
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Setup JDK
         uses: actions/setup-java@v2
         with:
diff --git a/.gitignore b/.gitignore
index 4b54189..dd0dd43 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
 
 # From https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore
 # User-specific stuff
+.idea/kotlinc.xml
 .idea/**/workspace.xml
 .idea/**/tasks.xml
 .idea/**/usage.statistics.xml
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index cfaf1ff..d9bb782 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -5,10 +5,6 @@
       <option name="ANNOTATION_PARAMETER_WRAP" value="1" />
     </JavaCodeStyleSettings>
     <JetCodeStyleSettings>
-      <option name="PACKAGES_TO_USE_STAR_IMPORTS">
-        <value />
-      </option>
-      <option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
       <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
     </JetCodeStyleSettings>
     <codeStyleSettings language="Groovy">
diff --git a/snapshot-tests/build.gradle b/snapshot-tests/build.gradle
index e3933df..80fd816 100644
--- a/snapshot-tests/build.gradle
+++ b/snapshot-tests/build.gradle
@@ -9,7 +9,7 @@
   defaultConfig {
     applicationId "com.airbnb.lottie.snapshots"
     minSdk 21
-    targetSdk 30
+    targetSdk 29
     versionCode 1
     versionName VERSION_NAME
     testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/snapshot-tests/src/androidTest/java/com/airbnb/lottie/snapshots/LottieSnapshotTest.kt b/snapshot-tests/src/androidTest/java/com/airbnb/lottie/snapshots/LottieSnapshotTest.kt
index 8dfd190..51a7b6a 100644
--- a/snapshot-tests/src/androidTest/java/com/airbnb/lottie/snapshots/LottieSnapshotTest.kt
+++ b/snapshot-tests/src/androidTest/java/com/airbnb/lottie/snapshots/LottieSnapshotTest.kt
@@ -6,6 +6,7 @@
 import android.content.res.Configuration
 import android.util.Log
 import android.widget.FrameLayout
+import androidx.compose.animation.core.snap
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.rules.ActivityScenarioRule
 import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -60,7 +61,7 @@
     @get:Rule
     val permissionRule: GrantPermissionRule = GrantPermissionRule.grant(
         Manifest.permission.WRITE_EXTERNAL_STORAGE,
-        Manifest.permission.READ_EXTERNAL_STORAGE
+        Manifest.permission.READ_EXTERNAL_STORAGE,
     )
 
     lateinit var testCaseContext: SnapshotTestCaseContext
@@ -80,6 +81,7 @@
                 activity.updateUiForSnapshot(name, variant)
             }
         }
+        snapshotter.setupCacheDir()
         testCaseContext = object : SnapshotTestCaseContext {
             override val context: Context = context
             override val snapshotter: HappoSnapshotter = this@LottieSnapshotTest.snapshotter
@@ -118,26 +120,26 @@
     fun testAll() = runBlocking {
         val testCases = listOf(
             CustomBoundsTestCase(),
-            ColorStateListColorFilterTestCase(),
-            FailureTestCase(),
-            FrameBoundariesTestCase(),
-            ScaleTypesTestCase(),
-            ComposeScaleTypesTestCase(),
-            DynamicPropertiesTestCase(),
-            MarkersTestCase(),
-            AssetsTestCase(),
-            TextTestCase(),
-            PartialFrameProgressTestCase(),
-            NightModeTestCase(),
-            ApplyOpacityToLayerTestCase(),
-            OutlineMasksAndMattesTestCase(),
-            LargeCompositionSoftwareRendering(),
-            ComposeDynamicPropertiesTestCase(),
-            ProdAnimationsTestCase(),
-            ClipChildrenTestCase(),
-            SoftwareRenderingDynamicPropertiesInvalidationTestCase(),
-            SeekBarTestCase(),
-            CompositionFrameRate(),
+//            ColorStateListColorFilterTestCase(),
+//            FailureTestCase(),
+//            FrameBoundariesTestCase(),
+//            ScaleTypesTestCase(),
+//            ComposeScaleTypesTestCase(),
+//            DynamicPropertiesTestCase(),
+//            MarkersTestCase(),
+//            AssetsTestCase(),
+//            TextTestCase(),
+//            PartialFrameProgressTestCase(),
+//            NightModeTestCase(),
+//            ApplyOpacityToLayerTestCase(),
+//            OutlineMasksAndMattesTestCase(),
+//            LargeCompositionSoftwareRendering(),
+//            ComposeDynamicPropertiesTestCase(),
+//            ProdAnimationsTestCase(),
+//            ClipChildrenTestCase(),
+//            SoftwareRenderingDynamicPropertiesInvalidationTestCase(),
+//            SeekBarTestCase(),
+//            CompositionFrameRate(),
         )
 
         withTimeout(TimeUnit.MINUTES.toMillis(45)) {
diff --git a/snapshot-tests/src/androidTest/java/com/airbnb/lottie/snapshots/utils/HappoSnapshotter.kt b/snapshot-tests/src/androidTest/java/com/airbnb/lottie/snapshots/utils/HappoSnapshotter.kt
index 8ee8169..4c68723 100644
--- a/snapshot-tests/src/androidTest/java/com/airbnb/lottie/snapshots/utils/HappoSnapshotter.kt
+++ b/snapshot-tests/src/androidTest/java/com/airbnb/lottie/snapshots/utils/HappoSnapshotter.kt
@@ -2,37 +2,24 @@
 
 import android.content.Context
 import android.graphics.Bitmap
-import android.os.Build
+import android.os.Environment
 import android.util.Log
 import com.airbnb.lottie.L
-import com.airbnb.lottie.snapshots.BuildConfig
-import com.amazonaws.auth.BasicAWSCredentials
-import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver
-import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility
-import com.amazonaws.services.s3.AmazonS3Client
-import com.amazonaws.services.s3.model.CannedAccessControlList
 import com.google.gson.JsonArray
-import com.google.gson.JsonElement
 import com.google.gson.JsonObject
-import kotlinx.coroutines.*
-import okhttp3.*
-import okhttp3.MediaType.Companion.toMediaType
-import okhttp3.RequestBody.Companion.toRequestBody
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+import java.io.BufferedInputStream
+import java.io.BufferedOutputStream
 import java.io.ByteArrayOutputStream
 import java.io.File
+import java.io.FileInputStream
 import java.io.FileOutputStream
-import java.io.IOException
 import java.math.BigInteger
-import java.net.URLEncoder
-import java.nio.charset.Charset
 import java.security.MessageDigest
-import java.util.*
-import kotlin.coroutines.CoroutineContext
-import kotlin.coroutines.resume
-import kotlin.coroutines.resumeWithException
-import kotlin.coroutines.suspendCoroutine
-
-private const val TAG = "HappoSnapshotter"
+import java.util.UUID
+import java.util.zip.ZipEntry
+import java.util.zip.ZipOutputStream
 
 /**
  * Use this class to record Bitmap snapshots and upload them to happo.
@@ -42,35 +29,44 @@
  *    2) Call finalizeAndUpload
  */
 class HappoSnapshotter(
-        private val context: Context,
-        private val onSnapshotRecorded: (snapshotName: String, snapshotVariant: String) -> Unit,
+    private val context: Context,
+    private val onSnapshotRecorded: (snapshotName: String, snapshotVariant: String) -> Unit,
 ) {
-    private val recordJob = Job()
-    private val recordScope = CoroutineScope(Dispatchers.IO + recordJob)
-
     private val bucket = "lottie-happo"
-    private val happoApiKey = BuildConfig.HappoApiKey
-    private val happoSecretKey = BuildConfig.HappoSecretKey
-    private val gitBranch = URLEncoder.encode((BuildConfig.GIT_BRANCH).replace("/", "_"), "UTF-8")
-    private val androidVersion = "android${Build.VERSION.SDK_INT}"
-    private val reportNamePrefixes = listOf(BuildConfig.GIT_SHA, gitBranch, BuildConfig.VERSION_NAME).filter { it.isNotBlank() }
-    // Use this when running snapshots locally.
-    // private val reportNamePrefixes = listOf(System.currentTimeMillis().toString()).filter { it.isNotBlank() }
-    private val reportNames = reportNamePrefixes.map { "$it-$androidVersion" }
+    private val cacheDir by lazy {
+        val file = File("/sdcard/Download", "lottie")
+        if (!file.exists()) {
+            if (!file.mkdirs()) {
+                throw IllegalStateException("Unable to make cache dir.")
+            }
+        }
+        file
+    }
+    private val snapshotTempDir by lazy {
+        val file = File(cacheDir, "snapshots-temp")
+        if (!file.exists()) {
+            if (!file.mkdirs()) {
+                throw IllegalStateException("Unable to make cache dir.")
+            }
+        }
+        file
+    }
+    private val snapshotDir by lazy {
+        val file = File(cacheDir, "snapshots")
+        if (!file.exists()) {
+            if (!file.mkdirs()) {
+                throw IllegalStateException("Unable to make cache dir.")
+            }
+        }
+        file
+    }
 
-    private val okhttp = OkHttpClient()
-
-    private val transferUtility = TransferUtility.builder()
-            .context(context)
-            .s3Client(AmazonS3Client(BasicAWSCredentials(BuildConfig.S3AccessKey, BuildConfig.S3SecretKey)))
-            .defaultBucket(bucket)
-            .build()
     private val snapshots = mutableListOf<Snapshot>()
 
     suspend fun record(bitmap: Bitmap, animationName: String, variant: String) = withContext(Dispatchers.IO) {
         val tempUuid = UUID.randomUUID().toString()
-        val file = File(context.cacheDir, "$tempUuid.png")
-        @Suppress("BlockingMethodInNonBlockingContext")
+        val file = File(snapshotTempDir, "$tempUuid.png")
+
         val fileOutputStream = FileOutputStream(file)
         val byteOutputStream = ByteArrayOutputStream()
         val outputStream = TeeOutputStream(fileOutputStream, byteOutputStream)
@@ -78,10 +74,12 @@
         bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
         val md5 = byteOutputStream.toByteArray().md5
         val key = "snapshots/$md5.png"
-        val md5File = File(context.cacheDir, "$md5.png")
-        file.renameTo(md5File)
+        val md5File = File(snapshotDir, "$md5.png")
+        if (!file.renameTo(md5File)) {
+            throw IllegalStateException("Unable to rename ${file.absolutePath} to ${md5File.absolutePath}")
+        }
+        Log.d("Gabe", "Renamed file to ${md5File.absolutePath}")
 
-        recordScope.launch { uploadDeferred(key, md5File) }
         Log.d(L.TAG, "Adding snapshot for $animationName-$variant")
         synchronized(snapshots) {
             snapshots += Snapshot(bucket, key, bitmap.width, bitmap.height, animationName, variant)
@@ -89,16 +87,15 @@
         onSnapshotRecorded(animationName, variant)
     }
 
-    suspend fun finalizeReportAndUpload() {
-        val recordJobStart = System.currentTimeMillis()
-        fun Job.activeJobs() = children.filter { it.isActive }.count()
-        var activeJobs = recordJob.activeJobs()
-        while (activeJobs > 0) {
-            activeJobs = recordJob.activeJobs()
-            Log.d(L.TAG, "Waiting for record $activeJobs jobs to finish.")
-            delay(1000)
+    fun setupCacheDir() {
+        val files = cacheDir.listFiles() ?: return
+        for (file in files) {
+            file.deleteRecursively()
         }
-        recordJob.children.forEach { it.join() }
+    }
+
+    fun finalizeReportAndUpload() {
+        val recordJobStart = System.currentTimeMillis()
         Log.d(L.TAG, "Waited ${System.currentTimeMillis() - recordJobStart}ms for recordings to finish saving.")
         val json = JsonObject()
         val snaps = JsonArray()
@@ -107,45 +104,11 @@
             snaps.add(s.toJson())
         }
         Log.d(L.TAG, "Finished creating snapshot report")
-        reportNames.forEach { reportName ->
-        Log.d(L.TAG, "Uploading $reportName")
-            upload(reportName, json)
+        val reportFile = File(cacheDir, "report.json")
+        FileOutputStream(reportFile).use { fos ->
+            fos.write(json.toString().toByteArray())
         }
-    }
-
-    private suspend fun upload(reportName: String, json: JsonElement) {
-        val body = json.toString().toRequestBody("application/json".toMediaType())
-        val request = Request.Builder()
-                .addHeader("Authorization", Credentials.basic(happoApiKey, happoSecretKey, Charset.forName("UTF-8")))
-                .url("https://happo.io/api/reports/$reportName")
-                .post(body)
-                .build()
-
-        val response = okhttp.executeDeferred(request)
-        if (response.isSuccessful) {
-            Log.d(TAG, "Uploaded $reportName to happo")
-        } else {
-            @Suppress("BlockingMethodInNonBlockingContext")
-            throw IllegalStateException("Failed to upload $reportName to Happo. Failed with code ${response.code}. " + response.body?.string())
-        }
-    }
-
-    private suspend fun uploadDeferred(key: String, file: File): TransferObserver {
-        return retry { _, _ ->
-            transferUtility.upload(key, file, CannedAccessControlList.PublicRead).await()
-        }
-    }
-
-    private suspend fun OkHttpClient.executeDeferred(request: Request): Response = suspendCoroutine { continuation ->
-        newCall(request).enqueue(object : Callback {
-            override fun onFailure(call: Call, e: IOException) {
-                continuation.resumeWithException(e)
-            }
-
-            override fun onResponse(call: Call, response: Response) {
-                continuation.resume(response)
-            }
-        })
+        createZip()
     }
 
     private val ByteArray.md5: String
@@ -154,4 +117,20 @@
             digest.update(this, 0, this.size)
             return BigInteger(1, digest.digest()).toString(16)
         }
+
+    private fun createZip() {
+        val files = (snapshotDir.listFiles() ?: emptyArray()) + File(cacheDir, "report.json")
+        ZipOutputStream(BufferedOutputStream(FileOutputStream("/sdcard/Download/snapshots.zip"))).use { out ->
+            for (file in files) {
+                FileInputStream(file).use { fi ->
+                    BufferedInputStream(fi).use { origin ->
+                        val entryName = file.absolutePath.substring(file.absolutePath.lastIndexOf("/"))
+                        val entry = ZipEntry(entryName)
+                        out.putNextEntry(entry)
+                        origin.copyTo(out, 1024)
+                    }
+                }
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/snapshot-tests/src/main/AndroidManifest.xml b/snapshot-tests/src/main/AndroidManifest.xml
index 0004b3b..3eca9ac 100644
--- a/snapshot-tests/src/main/AndroidManifest.xml
+++ b/snapshot-tests/src/main/AndroidManifest.xml
@@ -1,15 +1,26 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
     package="com.airbnb.lottie.snapshots">
+    <uses-permission
+        android:name="android.permission.READ_EXTERNAL_STORAGE"
+        android:maxSdkVersion="31"
+        tools:ignore="ScopedStorage" />
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+        android:maxSdkVersion="31"
+        tools:ignore="ScopedStorage" />
 
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission
+        android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
+        tools:ignore="ScopedStorage" />
 
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:largeHeap="true"
+        android:requestLegacyExternalStorage="true"
         android:roundIcon="@mipmap/ic_launcher"
         android:theme="@style/Theme.LottieCompose">
 
