From beefb4dac64c5d261f7a70f6dff2b4c4d58e8797 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Fri, 16 Jul 2021 12:39:18 +0200 Subject: [PATCH] feat(splash-screen): Add layoutName configuration option for Android --- splash-screen/README.md | 5 +- .../plugins/splashscreen/SplashScreen.java | 72 +++++++++++-------- .../splashscreen/SplashScreenConfig.java | 9 +++ .../splashscreen/SplashScreenPlugin.java | 3 + splash-screen/src/definitions.ts | 11 +++ 5 files changed, 71 insertions(+), 29 deletions(-) diff --git a/splash-screen/README.md b/splash-screen/README.md index 0a4020e0a..92cb8b3a7 100644 --- a/splash-screen/README.md +++ b/splash-screen/README.md @@ -84,6 +84,7 @@ These config values are available: | **`spinnerColor`** | string | Color of the spinner in hex format, #RRGGBB or #RRGGBBAA. | | 1.0.0 | | **`splashFullScreen`** | boolean | Hide the status bar on the Splash Screen. Only available on Android. | | 1.0.0 | | **`splashImmersive`** | boolean | Hide the status bar and the software navigation buttons on the Splash Screen. Only available on Android. | | 1.0.0 | +| **`layoutName`** | string | Allows to specify a layout xml file that would be used as the splash layout instead of the default ImageView. Only available on Android. | | 1.1.0 | ### Examples @@ -103,7 +104,8 @@ In `capacitor.config.json`: "iosSpinnerStyle": "small", "spinnerColor": "#999999", "splashFullScreen": true, - "splashImmersive": true + "splashImmersive": true, + "layoutName": "launch_screen" } } } @@ -130,6 +132,7 @@ const config: CapacitorConfig = { spinnerColor: "#999999", splashFullScreen: true, splashImmersive: true, + layoutName: "launch_screen", }, }, }; diff --git a/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreen.java b/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreen.java index a745e8651..cdcc1a354 100644 --- a/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreen.java +++ b/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreen.java @@ -1,6 +1,7 @@ package com.capacitorjs.plugins.splashscreen; import android.animation.Animator; +import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -9,10 +10,9 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.os.Handler; -import android.view.Gravity; -import android.view.View; -import android.view.WindowManager; +import android.view.*; import android.view.animation.LinearInterpolator; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ProgressBar; import androidx.appcompat.app.AppCompatActivity; @@ -23,7 +23,7 @@ */ public class SplashScreen { - private ImageView splashImage; + private View splashImage; private ProgressBar spinnerBar; private WindowManager windowManager; private boolean isVisible = false; @@ -83,33 +83,56 @@ public void onDestroy() { private void buildViews() { if (splashImage == null) { - int splashId = context.getResources().getIdentifier(config.getResourceName(), "drawable", context.getPackageName()); + int splashId = 0; Drawable splash; - try { - splash = context.getResources().getDrawable(splashId, context.getTheme()); - } catch (Resources.NotFoundException ex) { - Logger.warn("No splash screen found, not displaying"); - return; + if (config.getLayoutName() != null) { + splashId = context.getResources().getIdentifier(config.getLayoutName(), "layout", context.getPackageName()); + if (splashId == 0) { + Logger.warn("Layout not found, defaulting to ImageView"); + } } + if (splashId != 0) { + Activity activity = (Activity) context; + LayoutInflater inflator = activity.getLayoutInflater(); + ViewGroup root = new FrameLayout(context); + root.setLayoutParams( + new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) + ); + splashImage = inflator.inflate(splashId, root, false); + } else { + splashId = context.getResources().getIdentifier(config.getResourceName(), "drawable", context.getPackageName()); + try { + splash = context.getResources().getDrawable(splashId, context.getTheme()); + } catch (Resources.NotFoundException ex) { + Logger.warn("No splash screen found, not displaying"); + return; + } - if (splash instanceof Animatable) { - ((Animatable) splash).start(); - } + if (splash instanceof Animatable) { + ((Animatable) splash).start(); + } - if (splash instanceof LayerDrawable) { - LayerDrawable layeredSplash = (LayerDrawable) splash; + if (splash instanceof LayerDrawable) { + LayerDrawable layeredSplash = (LayerDrawable) splash; - for (int i = 0; i < layeredSplash.getNumberOfLayers(); i++) { - Drawable layerDrawable = layeredSplash.getDrawable(i); + for (int i = 0; i < layeredSplash.getNumberOfLayers(); i++) { + Drawable layerDrawable = layeredSplash.getDrawable(i); - if (layerDrawable instanceof Animatable) { - ((Animatable) layerDrawable).start(); + if (layerDrawable instanceof Animatable) { + ((Animatable) layerDrawable).start(); + } } } - } - splashImage = new ImageView(context); + splashImage = new ImageView(context); + // Stops flickers dead in their tracks + // https://stackoverflow.com/a/21847579/32140 + ImageView imageView = (ImageView) splashImage; + imageView.setDrawingCacheEnabled(true); + imageView.setScaleType(config.getScaleType()); + imageView.setImageDrawable(splash); + } splashImage.setFitsSystemWindows(true); @@ -126,16 +149,9 @@ private void buildViews() { splashImage.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); } - // Stops flickers dead in their tracks - // https://stackoverflow.com/a/21847579/32140 - splashImage.setDrawingCacheEnabled(true); - if (config.getBackgroundColor() != null) { splashImage.setBackgroundColor(config.getBackgroundColor()); } - - splashImage.setScaleType(config.getScaleType()); - splashImage.setImageDrawable(splash); } if (spinnerBar == null) { diff --git a/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreenConfig.java b/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreenConfig.java index 642d611b5..e88615a43 100644 --- a/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreenConfig.java +++ b/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreenConfig.java @@ -15,6 +15,7 @@ public class SplashScreenConfig { private boolean immersive = false; private boolean fullScreen = false; private ScaleType scaleType = ScaleType.FIT_XY; + private String layoutName; public Integer getBackgroundColor() { return backgroundColor; @@ -99,4 +100,12 @@ public ScaleType getScaleType() { public void setScaleType(ScaleType scaleType) { this.scaleType = scaleType; } + + public String getLayoutName() { + return layoutName; + } + + public void setLayoutName(String layoutName) { + this.layoutName = layoutName; + } } diff --git a/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreenPlugin.java b/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreenPlugin.java index 70c22ffdb..f24afc53f 100644 --- a/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreenPlugin.java +++ b/splash-screen/android/src/main/java/com/capacitorjs/plugins/splashscreen/SplashScreenPlugin.java @@ -141,6 +141,9 @@ private SplashScreenConfig getSplashScreenConfig() { Boolean showSpinner = getConfig().getBoolean("showSpinner", config.isShowSpinner()); config.setShowSpinner(showSpinner); + if (getConfig().getString("layoutName") != null) { + config.setLayoutName(getConfig().getString("layoutName")); + } return config; } diff --git a/splash-screen/src/definitions.ts b/splash-screen/src/definitions.ts index bc91ef1e4..01b19e1c3 100644 --- a/splash-screen/src/definitions.ts +++ b/splash-screen/src/definitions.ts @@ -124,6 +124,17 @@ declare module '@capacitor/cli' { * @example true */ splashImmersive?: boolean; + + /** + * Allows to specify a layout xml file that would be used + * as the splash layout instead of the default ImageView. + * + * Only available on Android. + * + * @since 1.1.0 + * @example "launch_screen" + */ + layoutName?: string; }; } }