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