package com.airbnb.lottie.samples

import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.airbnb.lottie.LottieComposition
import com.airbnb.lottie.LottieCompositionFactory
import com.airbnb.lottie.LottieDrawable
import com.airbnb.lottie.model.LottieCompositionCache
import kotlinx.android.synthetic.main.activity_simple_animation.*
import kotlinx.android.synthetic.main.activity_simple_animation.view.*
import java.lang.IllegalArgumentException

/**
 * Useful for performance debugging.
 * adb shell am start -n com.airbnb.lottie/.samples.SimpleAnimationActivity --es animation LottieLogo1.json --activity-clear-top
 */
class SimpleAnimationActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_simple_animation)
        var composition: LottieComposition? = null
        parse.setOnClickListener {
            val assetName = intent.extras?.getString("animation") ?: ""
            LottieCompositionCache.getInstance().clear()
            val start = System.currentTimeMillis()
            composition = LottieCompositionFactory.fromAssetSync(this, assetName).value
                    ?: throw IllegalArgumentException("Invalid composition $assetName")
            Toast.makeText(this@SimpleAnimationActivity, "Done ${System.currentTimeMillis() - start}", Toast.LENGTH_SHORT).show()
        }

        setComposition.setOnClickListener {
            val start = System.currentTimeMillis()
            val drawable = LottieDrawable()
            drawable.setComposition(composition)
            Toast.makeText(this@SimpleAnimationActivity, "Done ${System.currentTimeMillis() - start}", Toast.LENGTH_SHORT).show()
        }

        play.setOnClickListener {
            composition?.let { animationView.setComposition(it) }
            animationView.playAnimation()
        }
    }
}