| package com.airbnb.lottie.samples |
| |
| 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.children |
| import androidx.core.view.doOnNextLayout |
| import com.airbnb.lottie.L |
| import com.airbnb.lottie.LottieAnimationView |
| import com.airbnb.lottie.LottieCompositionFactory |
| import kotlinx.android.synthetic.main.activity_film_strip_snapshots.* |
| import java.io.File |
| import java.io.FileInputStream |
| import java.io.FileOutputStream |
| import kotlin.IllegalStateException |
| |
| private const val RC_PERMISSION = 12345 |
| |
| class FilmStripSnapshotActivity : AppCompatActivity() { |
| |
| private val rootDir = "${Environment.getExternalStorageDirectory()}/lottie" |
| private val animationsDir = File("$rootDir/animations") |
| private val snapshotsDir = File("$rootDir/snapshots") |
| private val dummyBitmap by lazy { BitmapFactory.decodeResource(resources, R.drawable.airbnb) } |
| |
| 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) |
| setContentView(R.layout.activity_film_strip_snapshots) |
| Log.i(L.TAG, "Starting Snapshots") |
| |
| if (!animationsDir.exists() || !animationsDir.isDirectory) throw IllegalStateException("Animations directory ($animationsDir) does not exist!") |
| if (!snapshotsDir.exists()) snapshotsDir.mkdirs() |
| |
| 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 |
| } |
| |
| Log.d(L.TAG, "Found ${animationsDir.listFiles().size} files.") |
| animationsDir.listFiles() |
| .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) |
| filmStripView.setComposition(composition) |
| canvas.clear() |
| filmStripView.draw(canvas) |
| |
| val outputFileName = file.name.replace(".json", ".png") |
| 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) |
| } |
| } |