blob: bcc91479f5ef8e5e09d7b8a984751af7a4f530fd [file] [log] [blame]
package com.airbnb.lottie.samples.testing
import android.Manifest
import android.content.pm.PackageManager
import android.graphics.*
import android.os.Bundle
import android.os.Environment
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.doOnNextLayout
import com.airbnb.lottie.L
import com.airbnb.lottie.LottieCompositionFactory
import com.airbnb.lottie.samples.databinding.FilmStripSnapshotsActivityBinding
import com.airbnb.lottie.samples.utils.viewBinding
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
private const val RC_PERMISSION = 12345
class FilmStripSnapshotActivity : AppCompatActivity() {
private val binding: FilmStripSnapshotsActivityBinding by viewBinding()
// TODO: fix this.
@Suppress("DEPRECATION")
private val rootDir = "${Environment.getExternalStorageDirectory()}/lottie"
private val animationsDir = File("$rootDir/animations")
private val snapshotsDir = File("$rootDir/snapshots")
private val bitmap = Bitmap.createBitmap(1000, 1000, Bitmap.Config.ARGB_8888)
private val canvas = Canvas(bitmap)
private val clearPaint = Paint().apply {
xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i(L.TAG, "Starting Snapshots")
if (!animationsDir.exists() || !animationsDir.isDirectory) throw IllegalStateException("Animations directory ($animationsDir) does not exist!")
if (!snapshotsDir.exists()) snapshotsDir.mkdirs()
binding.filmStripView.doOnNextLayout {
createSnapshots()
Log.i(L.TAG, "Finished Snapshots")
finish()
}
}
private fun hasStoragePermission() = hasPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
private fun hasPermission(permission: String) = ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
private fun requirePermissions() {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), RC_PERMISSION)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
RC_PERMISSION -> if (grantResults.firstOrNull() == PackageManager.PERMISSION_GRANTED) {
createSnapshots()
} else {
Log.w(L.TAG, "Permission not granted. Finishing.")
finish()
}
}
}
private fun createSnapshots() {
if (!hasStoragePermission()) {
requirePermissions()
return
}
val files = animationsDir.listFiles() ?: emptyArray()
Log.d(L.TAG, "Found ${files.size} files.")
files
.filter { it.name.endsWith(".json") }
.forEach { file ->
Log.d(L.TAG, "Creating snapshotFilmstrip for ${file.name}")
val fis = FileInputStream(file)
val result = LottieCompositionFactory.fromJsonInputStreamSync(fis, file.name)
val composition = result.value ?: throw IllegalStateException("Unable to parse composition for $file", result.exception)
binding.filmStripView.setComposition(composition)
canvas.clear()
binding.filmStripView.draw(canvas)
val outputFileName = file.name.replace(".json", ".png")
@Suppress("DEPRECATION")
val outputFilePath = "${Environment.getExternalStorageDirectory()}/lottie/snapshots/$outputFileName"
FileOutputStream(outputFilePath).use {
bitmap.compress(Bitmap.CompressFormat.PNG, 100, it)
}
}
}
private fun Canvas.clear() {
drawRect(canvas.clipBounds, clearPaint)
}
}