Skip to content

Instantly share code, notes, and snippets.

@r0b0t3d
Last active July 18, 2023 03:06
Show Gist options
  • Save r0b0t3d/1877de009cc2741900e67ded0b26d927 to your computer and use it in GitHub Desktop.
Save r0b0t3d/1877de009cc2741900e67ded0b26d927 to your computer and use it in GitHub Desktop.
Add option for react-native-bootsplash to use custom xml
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
index 83dbff8..aae4fae 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
@@ -4,6 +4,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.content.Context;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
@@ -19,8 +20,15 @@ public class RNBootSplash {
private static boolean mInitialized = false;
private static int mDrawableResId = -1;
+ private static int mLayoutResId = -1;
private static boolean mIsVisible = false;
+ public static void initLayout(int layoutResId, Activity activity) {
+ mLayoutResId = layoutResId;
+ mInitialized = true;
+ RNBootSplash.show(activity, 0.0f);
+ }
+
public static void init(final int drawableResId, @NonNull final Activity activity) {
if (!mInitialized) {
mDrawableResId = drawableResId;
@@ -40,17 +48,20 @@ public class RNBootSplash {
mIsVisible = true;
Context context = activity.getApplicationContext();
- LinearLayout layout = new LinearLayout(context);
- LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- View view = new View(context);
int roundedDuration = duration.intValue();
-
- view.setBackgroundResource(mDrawableResId);
+ LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ ViewGroup layout = null;
+ if (mDrawableResId != -1) {
+ layout = new LinearLayout(context);
+ View view = new View(context);
+ view.setBackgroundResource(mDrawableResId);
+ layout.setLayoutTransition(null);
+ ((LinearLayout)layout).setOrientation(LinearLayout.VERTICAL);
+ layout.addView(view, params);
+ } else {
+ layout = (ViewGroup) LayoutInflater.from(activity).inflate(mLayoutResId, null, false);
+ }
layout.setId(R.id.bootsplash_layout_id);
- layout.setLayoutTransition(null);
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.addView(view, params);
-
if (roundedDuration <= 0) {
activity.addContentView(layout, params);
} else {
@@ -78,7 +89,7 @@ public class RNBootSplash {
mIsVisible = false;
- final LinearLayout layout = activity.findViewById(R.id.bootsplash_layout_id);
+ final ViewGroup layout = activity.findViewById(R.id.bootsplash_layout_id);
if (layout == null) {
return;
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
index ed3f243..03008e0 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
@@ -3,6 +3,7 @@ package com.zoontek.rnbootsplash;
import android.app.Activity;
import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
public class RNBootSplash {
@@ -10,4 +11,8 @@ public class RNBootSplash {
public static void init(final @DrawableRes int drawableResId, @NonNull final Activity activity) {
RNBootSplashModule.init(drawableResId, activity);
}
+
+ public static void initLayout(final @LayoutRes int layoutRes, @NonNull final Activity activity) {
+ RNBootSplashModule.initLayout(layoutRes, activity);
+ }
}
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
index fca937f..3948074 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
@@ -4,6 +4,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.content.Context;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
@@ -30,12 +31,15 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
private static final int ANIMATION_DURATION = 220;
private static int mDrawableResId = -1;
+ private static int mLayoutResId = -1;
private static boolean mSplashVisible = false;
private static boolean mAppPaused = true;
private static boolean mFadeOption = false;
- @Nullable private static String mTaskToRunOnResume = null;
- @Nullable private static Promise mPendingPromise = null;
+ @Nullable
+ private static String mTaskToRunOnResume = null;
+ @Nullable
+ private static Promise mPendingPromise = null;
public RNBootSplashModule(ReactApplicationContext reactContext) {
super(reactContext);
@@ -64,6 +68,11 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
RNBootSplashModule.show(activity, false);
}
+ public static void initLayout(int layoutResId, Activity activity) {
+ mLayoutResId = layoutResId;
+ RNBootSplashModule.show(activity, false);
+ }
+
@Override
public void onHostDestroy() {
mAppPaused = true;
@@ -110,16 +119,19 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
mSplashVisible = true;
Context context = activity.getApplicationContext();
- LinearLayout layout = new LinearLayout(context);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- View view = new View(context);
-
- view.setBackgroundResource(mDrawableResId);
+ ViewGroup layout = null;
+ if (mDrawableResId != -1) {
+ layout = new LinearLayout(context);
+ View view = new View(context);
+ view.setBackgroundResource(mDrawableResId);
+ layout.setLayoutTransition(null);
+ ((LinearLayout) layout).setOrientation(LinearLayout.VERTICAL);
+ layout.addView(view, params);
+ } else {
+ layout = (ViewGroup) LayoutInflater.from(activity).inflate(mLayoutResId, null, false);
+ }
layout.setId(R.id.bootsplash_layout_id);
- layout.setLayoutTransition(null);
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.addView(view, params);
-
if (fade) {
layout.setAlpha(0.0f);
activity.addContentView(layout, params);
@@ -196,7 +208,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
@ReactMethod
public void show(final boolean fade, final Promise promise) {
- if (mDrawableResId == -1) {
+ if (mDrawableResId == -1 && mLayoutResId == -1) {
promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
return;
}
@@ -219,7 +231,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
@ReactMethod
public void hide(final boolean fade, final Promise promise) {
- if (mDrawableResId == -1) {
+ if (mDrawableResId == -1 && mLayoutResId == -1) {
promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
return;
}
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
index ed3f243..03008e0 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
@@ -3,6 +3,7 @@ package com.zoontek.rnbootsplash;
import android.app.Activity;
import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
public class RNBootSplash {
@@ -10,4 +11,8 @@ public class RNBootSplash {
public static void init(final @DrawableRes int drawableResId, @NonNull final Activity activity) {
RNBootSplashModule.init(drawableResId, activity);
}
+
+ public static void initLayout(final @LayoutRes int layoutRes, @NonNull final Activity activity) {
+ RNBootSplashModule.initLayout(layoutRes, activity);
+ }
}
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
index 2ea93d4..474b7f4 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
@@ -4,6 +4,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.content.Context;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
@@ -12,6 +13,7 @@ import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import com.facebook.react.ReactApplication;
@@ -38,6 +40,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
}
private static int mDrawableResId = -1;
+ private static int mLayoutResId = -1;
private final ArrayList<RNBootSplashTask> mTaskQueue = new ArrayList<>();
private Status mStatus = Status.HIDDEN;
@@ -46,7 +49,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
public RNBootSplashModule(ReactApplicationContext reactContext) {
super(reactContext);
- if (mDrawableResId != -1) {
+ if (mDrawableResId != -1 || mLayoutResId != -1) {
mStatus = Status.VISIBLE;
}
@@ -58,16 +61,20 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
return MODULE_NAME;
}
- private static LinearLayout getLayout(@NonNull Activity activity, LayoutParams params) {
+ private static ViewGroup getLayout(@NonNull Activity activity, LayoutParams params) {
Context context = activity.getApplicationContext();
- LinearLayout layout = new LinearLayout(context);
- View view = new View(context);
-
- view.setBackgroundResource(mDrawableResId);
+ ViewGroup layout;
+ if (mDrawableResId != -1) {
+ layout = new LinearLayout(context);
+ View view = new View(context);
+ view.setBackgroundResource(mDrawableResId);
+ layout.setLayoutTransition(null);
+ ((LinearLayout) layout).setOrientation(LinearLayout.VERTICAL);
+ layout.addView(view, params);
+ } else {
+ layout = (ViewGroup) LayoutInflater.from(activity).inflate(mLayoutResId, null, false);
+ }
layout.setId(R.id.bootsplash_layout_id);
- layout.setLayoutTransition(null);
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.addView(view, params);
return layout;
}
@@ -91,6 +98,24 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
});
}
+ public static void initLayout(@LayoutRes int layoutResId, final Activity activity) {
+ mLayoutResId = layoutResId;
+ UiThreadUtil.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (activity == null
+ || activity.isFinishing()
+ || activity.findViewById(R.id.bootsplash_layout_id) != null) {
+ return;
+ }
+
+ LayoutParams params = new LayoutParams(
+ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ activity.addContentView(getLayout(activity, params), params);
+ }
+ });
+ }
+
@Override
public void onCatalystInstanceDestroy() {
super.onCatalystInstanceDestroy();
@@ -145,7 +170,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
}
private void shiftNextTask() {
- boolean shouldSkipTick = mDrawableResId == -1
+ boolean shouldSkipTick = (mDrawableResId == -1 && mLayoutResId == -1)
|| mStatus == Status.TRANSITIONING
|| mIsAppInBackground
|| mTaskQueue.isEmpty();
@@ -188,7 +213,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
LayoutParams params = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- LinearLayout layout = getLayout(activity, params);
+ ViewGroup layout = getLayout(activity, params);
if (task.getFade()) {
layout.setAlpha(0.0f);
@@ -233,7 +258,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
return;
}
- final LinearLayout layout = activity.findViewById(R.id.bootsplash_layout_id);
+ final ViewGroup layout = activity.findViewById(R.id.bootsplash_layout_id);
if (layout == null) {
promise.resolve(true); // splash screen is already hidden
@@ -276,7 +301,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
@ReactMethod
public void show(final boolean fade, final Promise promise) {
- if (mDrawableResId == -1) {
+ if (mDrawableResId == -1 && mLayoutResId == -1) {
promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
} else {
mTaskQueue.add(new RNBootSplashTask(RNBootSplashTask.Type.SHOW, fade, promise));
@@ -286,7 +311,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
@ReactMethod
public void hide(final boolean fade, final Promise promise) {
- if (mDrawableResId == -1) {
+ if (mDrawableResId == -1 && mLayoutResId == -1) {
promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
} else {
mTaskQueue.add(new RNBootSplashTask(RNBootSplashTask.Type.HIDE, fade, promise));
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
index ed3f243..03008e0 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
@@ -3,6 +3,7 @@ package com.zoontek.rnbootsplash;
import android.app.Activity;
import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
public class RNBootSplash {
@@ -10,4 +11,8 @@ public class RNBootSplash {
public static void init(final @DrawableRes int drawableResId, @NonNull final Activity activity) {
RNBootSplashModule.init(drawableResId, activity);
}
+
+ public static void initLayout(final @LayoutRes int layoutRes, @NonNull final Activity activity) {
+ RNBootSplashModule.initLayout(layoutRes, activity);
+ }
}
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
index 0111b5d..5a064dc 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
@@ -4,6 +4,7 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.content.Context;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
@@ -41,7 +42,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
}
private static int mDrawableResId = -1;
-
+ private static int mLayoutResId = -1;
private final ArrayList<RNBootSplashTask> mTaskQueue = new ArrayList<>();
private Status mStatus = Status.HIDDEN;
private boolean mIsAppInBackground = false;
@@ -61,16 +62,21 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
return MODULE_NAME;
}
- private static LinearLayout getLayout(@NonNull Activity activity, LayoutParams params) {
+ private static ViewGroup getLayout(@NonNull Activity activity, LayoutParams params) {
Context context = activity.getApplicationContext();
- LinearLayout layout = new LinearLayout(context);
- View view = new View(context);
+ ViewGroup layout;
+ if (mDrawableResId != -1) {
+ layout = new LinearLayout(context);
+ View view = new View(context);
- view.setBackgroundResource(mDrawableResId);
+ view.setBackgroundResource(mDrawableResId);
+ layout.addView(view, params);
+ ((LinearLayout)layout).setOrientation(LinearLayout.VERTICAL);
+ } else {
+ layout = (ViewGroup) LayoutInflater.from(activity).inflate(mLayoutResId, null, false);
+ }
layout.setId(R.id.bootsplash_layout_id);
layout.setLayoutTransition(null);
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.addView(view, params);
return layout;
}
@@ -94,6 +100,24 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
});
}
+ public static void initLayout(int layoutResId, final Activity activity) {
+ mLayoutResId = layoutResId;
+ UiThreadUtil.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (activity == null
+ || activity.isFinishing()
+ || activity.findViewById(R.id.bootsplash_layout_id) != null) {
+ return;
+ }
+
+ LayoutParams params = new LayoutParams(
+ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ activity.addContentView(getLayout(activity, params), params);
+ }
+ });
+ }
+
@Override
public void onCatalystInstanceDestroy() {
super.onCatalystInstanceDestroy();
@@ -148,7 +172,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
}
private void shiftNextTask() {
- boolean shouldSkipTick = mDrawableResId == -1
+ boolean shouldSkipTick = (mDrawableResId == -1 && mLayoutResId == -1)
|| mStatus == Status.TRANSITIONING_TO_VISIBLE
|| mStatus == Status.TRANSITIONING_TO_HIDDEN
|| mIsAppInBackground
@@ -202,7 +226,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
LayoutParams params = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- LinearLayout layout = getLayout(activity, params);
+ ViewGroup layout = getLayout(activity, params);
if (task.getFade()) {
layout.setAlpha(0.0f);
@@ -288,7 +312,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
@ReactMethod
public void show(final boolean fade, final Promise promise) {
- if (mDrawableResId == -1) {
+ if (mDrawableResId == -1 && mLayoutResId == -1) {
promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
} else {
mTaskQueue.add(new RNBootSplashTask(RNBootSplashTask.Type.SHOW, fade, promise));
@@ -298,7 +322,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
@ReactMethod
public void hide(final boolean fade, final Promise promise) {
- if (mDrawableResId == -1) {
+ if (mDrawableResId == -1 && mLayoutResId == -1) {
promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
} else {
mTaskQueue.add(new RNBootSplashTask(RNBootSplashTask.Type.HIDE, fade, promise));
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
index ed3f243..03008e0 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
@@ -3,6 +3,7 @@ package com.zoontek.rnbootsplash;
import android.app.Activity;
import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
public class RNBootSplash {
@@ -10,4 +11,8 @@ public class RNBootSplash {
public static void init(final @DrawableRes int drawableResId, @NonNull final Activity activity) {
RNBootSplashModule.init(drawableResId, activity);
}
+
+ public static void initLayout(final @LayoutRes int layoutRes, @NonNull final Activity activity) {
+ RNBootSplashModule.initLayout(layoutRes, activity);
+ }
}
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
index db52c9e..5f25b74 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
@@ -3,6 +3,7 @@ package com.zoontek.rnbootsplash;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
@@ -39,6 +40,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
}
private static int mDrawableResId = -1;
+ private static int mLayoutResId = -1;
private static final ArrayList<RNBootSplashTask> mTaskQueue = new ArrayList<>();
private static Status mStatus = Status.HIDDEN;
private static boolean mIsAppInBackground = false;
@@ -53,16 +55,19 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
return MODULE_NAME;
}
- private static LinearLayout getLayout(@NonNull Activity activity, LayoutParams params) {
- LinearLayout layout = new LinearLayout(activity);
- View view = new View(activity);
-
- view.setBackgroundResource(mDrawableResId);
+ private static ViewGroup getLayout(@NonNull Activity activity, LayoutParams params) {
+ ViewGroup layout;
+ if (mDrawableResId != -1) {
+ layout = new LinearLayout(activity);
+ View view = new View(activity);
+ view.setBackgroundResource(mDrawableResId);
+ ((LinearLayout)layout).setOrientation(LinearLayout.VERTICAL);
+ layout.addView(view, params);
+ } else {
+ layout = (ViewGroup) LayoutInflater.from(activity).inflate(mLayoutResId, null, false);
+ }
layout.setId(R.id.bootsplash_layout_id);
layout.setLayoutTransition(null);
- layout.setOrientation(LinearLayout.VERTICAL);
- layout.addView(view, params);
-
return layout;
}
@@ -86,6 +91,21 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
});
}
+ public static void initLayout(int layoutResId, final Activity activity) {
+ mLayoutResId = layoutResId;
+ UiThreadUtil.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (activity == null || activity.isFinishing() || activity.findViewById(R.id.bootsplash_layout_id) != null) {
+ return;
+ }
+ LayoutParams params = new LayoutParams(
+ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+ activity.addContentView(getLayout(activity, params), params);
+ }
+ });
+ }
+
@Override
public void onHostDestroy() {
mIsAppInBackground = true;
@@ -103,7 +123,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
}
private void shiftNextTask() {
- boolean shouldSkipTick = mDrawableResId == -1
+ boolean shouldSkipTick = (mDrawableResId == -1 && mLayoutResId == -1)
|| mStatus == Status.TRANSITIONING_TO_VISIBLE
|| mStatus == Status.TRANSITIONING_TO_HIDDEN
|| mIsAppInBackground
@@ -157,7 +177,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
LayoutParams params = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- LinearLayout layout = getLayout(activity, params);
+ ViewGroup layout = getLayout(activity, params);
if (task.getFade()) {
layout.setAlpha(0.0f);
@@ -243,7 +263,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
@ReactMethod
public void show(final boolean fade, final Promise promise) {
- if (mDrawableResId == -1) {
+ if (mDrawableResId == -1 && mLayoutResId == -1) {
promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
} else {
mTaskQueue.add(new RNBootSplashTask(RNBootSplashTask.Type.SHOW, fade, promise));
@@ -253,7 +273,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
@ReactMethod
public void hide(final boolean fade, final Promise promise) {
- if (mDrawableResId == -1) {
+ if (mDrawableResId == -1 && mLayoutResId == -1) {
promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
} else {
mTaskQueue.add(new RNBootSplashTask(RNBootSplashTask.Type.HIDE, fade, promise));
@byteab
Copy link

byteab commented Sep 23, 2020

is there any way to also pass a style
like the way I did with splash-screen
SplashScreen.show(this, R.style.SplashTheme);

@r0b0t3d
Copy link
Author

r0b0t3d commented Sep 23, 2020

Above patch just use MainActivity to show/hide the custom view. So if you'd like to pass custom style, just need to do it on your MainActivity.

@msvargas
Copy link

@r0b0t3d

Update patch 3.2.4

diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
index ed3f243..e1f3844 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplash.java
@@ -3,6 +3,7 @@ package com.zoontek.rnbootsplash;
 import android.app.Activity;
 
 import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
 import androidx.annotation.NonNull;
 
 public class RNBootSplash {
@@ -10,4 +11,7 @@ public class RNBootSplash {
   public static void init(final @DrawableRes int drawableResId, @NonNull final Activity activity) {
     RNBootSplashModule.init(drawableResId, activity);
   }
+  public static void initLayout(final @LayoutRes int layoutRes, @NonNull final Activity activity) {
+     RNBootSplashModule.initLayout(layoutRes, activity);
+  }
 }
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashActivity.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashActivity.java
index 9d39f60..0d232c1 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashActivity.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashActivity.java
@@ -3,6 +3,7 @@ package com.zoontek.rnbootsplash;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
+import android.view.WindowManager;
 
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatActivity;
@@ -51,5 +52,7 @@ public class RNBootSplashActivity extends AppCompatActivity {
   protected void onCreate(@Nullable Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     forwardIntentToMainActivity(getIntent());
+    // Set the Secure flag for this Window
+    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
   }
 }
diff --git a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
index db52c9e..4e25f3c 100644
--- a/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
+++ b/node_modules/react-native-bootsplash/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java
@@ -7,8 +7,9 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
-import android.widget.LinearLayout;
-import android.widget.LinearLayout.LayoutParams;
+import android.widget.RelativeLayout.LayoutParams;
+import android.view.LayoutInflater;
+import android.widget.RelativeLayout;
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
@@ -39,6 +40,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
   }
 
   private static int mDrawableResId = -1;
+  private static int mLayoutResId = -1;
   private static final ArrayList<RNBootSplashTask> mTaskQueue = new ArrayList<>();
   private static Status mStatus = Status.HIDDEN;
   private static boolean mIsAppInBackground = false;
@@ -53,19 +55,41 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
     return MODULE_NAME;
   }
 
-  private static LinearLayout getLayout(@NonNull Activity activity, LayoutParams params) {
-    LinearLayout layout = new LinearLayout(activity);
-    View view = new View(activity);
+  private static ViewGroup getLayout(@NonNull Activity activity, LayoutParams params) {
+    ViewGroup layout;
+    if (mDrawableResId != -1) {
+      layout = new RelativeLayout(activity);
+      View view = new View(activity);
 
-    view.setBackgroundResource(mDrawableResId);
+      view.setBackgroundResource(mDrawableResId);
+      layout.addView(view, params);
+    }else{
+      layout = (ViewGroup) LayoutInflater.from(activity).inflate(mLayoutResId, null, false);
+    }
     layout.setId(R.id.bootsplash_layout_id);
     layout.setLayoutTransition(null);
-    layout.setOrientation(LinearLayout.VERTICAL);
-    layout.addView(view, params);
 
     return layout;
   }
 
+  public static void initLayout(int layoutResId, final Activity activity) {
+    mLayoutResId = layoutResId;
+    UiThreadUtil.runOnUiThread(new Runnable() {
+      @Override
+      public void run() {
+        if (activity == null
+                || activity.isFinishing()
+                || activity.findViewById(R.id.bootsplash_layout_id) != null) {
+          return;
+        }
+
+        LayoutParams params = new LayoutParams(
+                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
+        activity.addContentView(getLayout(activity, params), params);
+      }
+    });
+  }
+
   protected static void init(final @DrawableRes int drawableResId, final Activity activity) {
     UiThreadUtil.runOnUiThread(new Runnable() {
       @Override
@@ -103,7 +127,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
   }
 
   private void shiftNextTask() {
-    boolean shouldSkipTick = mDrawableResId == -1
+    boolean shouldSkipTick = (mDrawableResId == -1 && mLayoutResId == -1)
       || mStatus == Status.TRANSITIONING_TO_VISIBLE
       || mStatus == Status.TRANSITIONING_TO_HIDDEN
       || mIsAppInBackground
@@ -157,7 +181,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
 
         LayoutParams params = new LayoutParams(
           LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
-        LinearLayout layout = getLayout(activity, params);
+        ViewGroup layout = getLayout(activity, params);
 
         if (task.getFade()) {
           layout.setAlpha(0.0f);
@@ -200,7 +224,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
           return;
         }
 
-        final LinearLayout layout = activity.findViewById(R.id.bootsplash_layout_id);
+        final RelativeLayout layout = activity.findViewById(R.id.bootsplash_layout_id);
 
         if (layout == null) {
           promise.resolve(true); // splash screen is already hidden
@@ -243,7 +267,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
 
   @ReactMethod
   public void show(final boolean fade, final Promise promise) {
-    if (mDrawableResId == -1) {
+    if (mDrawableResId == -1 && mLayoutResId == -1) {
       promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
     } else {
       mTaskQueue.add(new RNBootSplashTask(RNBootSplashTask.Type.SHOW, fade, promise));
@@ -253,7 +277,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
 
   @ReactMethod
   public void hide(final boolean fade, final Promise promise) {
-    if (mDrawableResId == -1) {
+    if (mDrawableResId == -1 && mLayoutResId == -1) {
       promise.reject("uninitialized_module", "react-native-bootsplash has not been initialized");
     } else {
       mTaskQueue.add(new RNBootSplashTask(RNBootSplashTask.Type.HIDE, fade, promise));

@viLeeKorn
Copy link

@r0b0t3d
tried to add this for 3.2.6 bootsplash. After showing splash app died.

@r0b0t3d
Copy link
Author

r0b0t3d commented Dec 20, 2021

@viLeeKorn just added file react-native-bootsplash+3.2.6.patch. Please try it

@jaredcat
Copy link

jaredcat commented Jun 23, 2022

@r0b0t3d I'm using react-native-bootsplash+3.2.6.patch with 3.2.6 (technically 3.2.7) of react-native-bootsplash but when call RNBootSplash.hide(); my app is crashing. Any ideas?

Nvm. My layout file was using RelativeLayout swapped it to LinearLayout

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment