1 package host.exp.exponent.experience.splashscreen 2 3 import android.content.Context 4 import android.view.View 5 import android.view.animation.AccelerateDecelerateInterpolator 6 import android.view.animation.AlphaAnimation 7 import com.squareup.picasso.Callback 8 import com.squareup.picasso.Picasso 9 import expo.modules.splashscreen.SplashScreenView 10 import expo.modules.splashscreen.SplashScreenViewProvider 11 import expo.modules.manifests.core.Manifest 12 import host.exp.exponent.analytics.EXL 13 14 /** 15 * SplashScreenView provider that parses manifest and extracts splash configuration. 16 * It allows reconfiguration of the SplashScreenImage. 17 */ 18 class ManagedAppSplashScreenViewProvider( 19 private var config: ManagedAppSplashScreenConfiguration 20 ) : SplashScreenViewProvider { 21 private lateinit var splashScreenView: SplashScreenView 22 23 companion object { 24 private const val TAG: String = "ExperienceSplashScreenManifestBasedResourceProvider" 25 } createSplashScreenViewnull26 override fun createSplashScreenView(context: Context): View { 27 splashScreenView = SplashScreenView(context) 28 configureSplashScreenView(context, config, null) 29 return splashScreenView 30 } 31 updateSplashScreenViewWithManifestnull32 fun updateSplashScreenViewWithManifest(context: Context, manifest: Manifest) { 33 val previousConfig = config 34 config = ManagedAppSplashScreenConfiguration.parseManifest(manifest) 35 configureSplashScreenView(context, config, previousConfig) 36 } 37 configureSplashScreenViewnull38 private fun configureSplashScreenView( 39 context: Context, 40 config: ManagedAppSplashScreenConfiguration, 41 previousConfig: ManagedAppSplashScreenConfiguration? 42 ) { 43 splashScreenView.setBackgroundColor(config.backgroundColor) 44 // Only re-create the image view when the imageUrl or resizeMode changes 45 if (previousConfig == null || 46 config.resizeMode != previousConfig.resizeMode || 47 !config.imageUrl.equals(previousConfig.imageUrl) 48 ) { 49 splashScreenView.configureImageViewResizeMode(config.resizeMode) 50 configureSplashScreenImageView(context, config) 51 } 52 } 53 configureSplashScreenImageViewnull54 private fun configureSplashScreenImageView(context: Context, config: ManagedAppSplashScreenConfiguration) { 55 splashScreenView.imageView.visibility = View.GONE 56 if (config.imageUrl == null) { 57 return 58 } 59 Picasso.with(context).load(config.imageUrl).into( 60 splashScreenView.imageView, 61 object : Callback { 62 override fun onSuccess() { 63 splashScreenView.imageView.visibility = View.VISIBLE 64 splashScreenView.imageView.animation = AlphaAnimation(0.0f, 1.0f).also { 65 it.duration = 300 66 it.interpolator = AccelerateDecelerateInterpolator() 67 it.fillAfter = true 68 } 69 } 70 71 override fun onError() { 72 EXL.e(TAG, "Couldn't load image at url " + config.imageUrl) 73 } 74 } 75 ) 76 } 77 } 78