Skip to content

Commit

Permalink
Merge pull request #7096 from zoontek/embed-bootsplash-lite
Browse files Browse the repository at this point in the history
Embed react-native-bootsplash lite module
  • Loading branch information
NikkiWines authored Jan 20, 2022
2 parents afb3547 + 111cee1 commit 669c0d9
Show file tree
Hide file tree
Showing 24 changed files with 431 additions and 654 deletions.
5 changes: 0 additions & 5 deletions __mocks__/react-native-bootsplash.js

This file was deleted.

2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
</activity>

<activity
android:name="com.zoontek.rnbootsplash.RNBootSplashActivity"
android:name=".bootsplash.BootSplashActivity"
android:theme="@style/BootTheme"
android:launchMode="singleTask">

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import android.os.Bundle;
import android.content.pm.ActivityInfo;
import com.expensify.chat.bootsplash.BootSplash;
import com.facebook.react.ReactActivity;
import com.zoontek.rnbootsplash.RNBootSplash;

public class MainActivity extends ReactActivity {

Expand All @@ -22,6 +22,6 @@ protected void onCreate(Bundle savedInstanceState) {
if (getResources().getBoolean(R.bool.portrait_only)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
RNBootSplash.init(R.drawable.bootsplash, MainActivity.this); // <- display the generated bootsplash.xml drawable over our MainActivity
BootSplash.init(R.drawable.bootsplash, MainActivity.this); // <- display the generated bootsplash.xml drawable over our MainActivity
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import android.content.Context;
import android.database.CursorWindow;
import androidx.multidex.MultiDexApplication;
import com.expensify.chat.bootsplash.BootSplashPackage;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.existfragger.rnimagesize.RNImageSizePackage;
Expand Down Expand Up @@ -33,6 +34,7 @@ protected List<ReactPackage> getPackages() {
List<ReactPackage> packages = new PackageList(this).getPackages();
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
packages.add(new BootSplashPackage());
packages.add(new ExpensifyAppPackage());

return packages;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.expensify.chat.bootsplash;

import android.app.Activity;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;

public class BootSplash {

public static void init(final @DrawableRes int drawableResId, @NonNull final Activity activity) {
BootSplashModule.init(drawableResId, activity);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.expensify.chat.bootsplash;

import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.expensify.chat.MainActivity;

public class BootSplashActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
forwardIntentToMainActivity(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
forwardIntentToMainActivity(intent);
}

protected void forwardIntentToMainActivity(Intent intent) {
Intent intentCopy = (Intent) intent.clone();
intentCopy.setClass(this, MainActivity.class);

startActivity(intentCopy);
finish();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package com.expensify.chat.bootsplash;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import androidx.annotation.DrawableRes;
import com.expensify.chat.R;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.module.annotations.ReactModule;
import java.util.Timer;
import java.util.TimerTask;

@ReactModule(name = BootSplashModule.MODULE_NAME)
public class BootSplashModule extends ReactContextBaseJavaModule {

public static final String MODULE_NAME = "BootSplash";
private static int mDrawableResId = -1;
private static boolean mSplashVisible = false;

public BootSplashModule(ReactApplicationContext reactContext) {
super(reactContext);
}

@Override
public String getName() {
return MODULE_NAME;
}

protected static void init(final @DrawableRes int drawableResId, final Activity activity) {
UiThreadUtil.runOnUiThread(new Runnable() {
@Override
public void run() {
if (activity == null
|| activity.isFinishing()
|| activity.findViewById(R.id.bootsplash_layout_id) != null) {
return;
}

mDrawableResId = drawableResId;
mSplashVisible = true;

LinearLayout layout = new LinearLayout(activity);
layout.setId(R.id.bootsplash_layout_id);
layout.setLayoutTransition(null);
layout.setOrientation(LinearLayout.VERTICAL);

View view = new View(activity);
view.setBackgroundResource(mDrawableResId);

LayoutParams params = new LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

layout.addView(view, params);
activity.addContentView(layout, params);
}
});
}

private void waitAndHide() {
final Timer timer = new Timer();

timer.schedule(new TimerTask() {
@Override
public void run() {
hide();
timer.cancel();
}
}, 250);
}

@ReactMethod
public void hide() {
if (mDrawableResId == -1)
return;

UiThreadUtil.runOnUiThread(new Runnable() {
@Override
public void run() {
final Activity activity = getReactApplicationContext().getCurrentActivity();

if (activity == null || activity.isFinishing()) {
waitAndHide();
return;
}

final LinearLayout layout = activity.findViewById(R.id.bootsplash_layout_id);

// check if splash screen is already hidden
if (layout == null)
return;

final ViewGroup parent = (ViewGroup) layout.getParent();

layout
.animate()
.setDuration(250)
.alpha(0.0f)
.setInterpolator(new AccelerateInterpolator())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);

if (parent != null)
parent.removeView(layout);

mDrawableResId = -1;
mSplashVisible = false;
}
}).start();
}
});
}

@ReactMethod
public void getVisibilityStatus(final Promise promise) {
promise.resolve(mSplashVisible ? "visible" : "hidden");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.expensify.chat.bootsplash;

import androidx.annotation.NonNull;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class BootSplashPackage implements ReactPackage {

@NonNull
@Override
public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
return Arrays.<NativeModule>asList(new BootSplashModule(reactContext));
}

@NonNull
@Override
public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
3 changes: 3 additions & 0 deletions android/app/src/main/res/values/ids.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<resources>
<item type="id" name="bootsplash_layout_id" />
</resources>
10 changes: 6 additions & 4 deletions ios/NewExpensify.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@
7041848526A8E47D00E09F4D /* RCTStartupTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */; };
7041848626A8E47D00E09F4D /* RCTStartupTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7041848426A8E47D00E09F4D /* RCTStartupTimer.m */; };
70CF6E82262E297300711ADC /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 70CF6E81262E297300711ADC /* BootSplash.storyboard */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
8821A238A081483FA947BC4E /* GTAmericaExp-RgIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */; };
DB77016704074197AB6633BB /* GTAmericaExpMono-RgIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 5150E5D0D7F74DBA8D7C1914 /* GTAmericaExpMono-RgIt.otf */; };
DD79042B2792E76D004484B4 /* RCTBootSplash.m in Sources */ = {isa = PBXBuildFile; fileRef = DD79042A2792E76D004484B4 /* RCTBootSplash.m */; };
E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = E9DF872C2525201700607FDC /* AirshipConfig.plist */; };
ED814D34526B415CAFA0451E /* GTAmericaExpMono-BdIt.otf in Resources */ = {isa = PBXBuildFile; fileRef = 3981452A2C7340EBBA2B9BD1 /* GTAmericaExpMono-BdIt.otf */; };
F0C450EA2705020500FD2970 /* colors.json in Resources */ = {isa = PBXBuildFile; fileRef = F0C450E92705020500FD2970 /* colors.json */; };
Expand Down Expand Up @@ -71,7 +71,6 @@
7041848426A8E47D00E09F4D /* RCTStartupTimer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = RCTStartupTimer.m; path = NewExpensify/RCTStartupTimer.m; sourceTree = "<group>"; };
70CF6E81262E297300711ADC /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = NewExpensify/BootSplash.storyboard; sourceTree = "<group>"; };
7CB4AF830F19EA63E0811FB7 /* Pods-NewExpensify-NewExpensifyTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify-NewExpensifyTests.release.xcconfig"; path = "Target Support Files/Pods-NewExpensify-NewExpensifyTests/Pods-NewExpensify-NewExpensifyTests.release.xcconfig"; sourceTree = "<group>"; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = NewExpensify/LaunchScreen.storyboard; sourceTree = "<group>"; };
8437A5A38F2047E0BCCD7C2F /* GTAmericaExpMono-Rg.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExpMono-Rg.otf"; path = "../assets/fonts/GTAmericaExpMono-Rg.otf"; sourceTree = "<group>"; };
8C7003903C1E4957824899BB /* GTAmericaExp-Regular.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Regular.otf"; path = "../assets/fonts/GTAmericaExp-Regular.otf"; sourceTree = "<group>"; };
918D7FEFF96242E6B5F5E14D /* GTAmericaExp-RgIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-RgIt.otf"; path = "../assets/fonts/GTAmericaExp-RgIt.otf"; sourceTree = "<group>"; };
Expand All @@ -82,6 +81,8 @@
AE65058949E14DA5A2D5435D /* GTAmericaExp-Medium.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-Medium.otf"; path = "../assets/fonts/GTAmericaExp-Medium.otf"; sourceTree = "<group>"; };
C5F758EA4C130AB3A7F26F58 /* Pods-NewExpensify.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-NewExpensify.release.xcconfig"; path = "Target Support Files/Pods-NewExpensify/Pods-NewExpensify.release.xcconfig"; sourceTree = "<group>"; };
DB5A1365442D4419AF6F08E5 /* GTAmericaExp-MdIt.otf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "GTAmericaExp-MdIt.otf"; path = "../assets/fonts/GTAmericaExp-MdIt.otf"; sourceTree = "<group>"; };
DD7904292792E76D004484B4 /* RCTBootSplash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RCTBootSplash.h; path = NewExpensify/RCTBootSplash.h; sourceTree = "<group>"; };
DD79042A2792E76D004484B4 /* RCTBootSplash.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RCTBootSplash.m; path = NewExpensify/RCTBootSplash.m; sourceTree = "<group>"; };
E9DF872C2525201700607FDC /* AirshipConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = AirshipConfig.plist; sourceTree = "<group>"; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };
Expand Down Expand Up @@ -138,7 +139,6 @@
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
70CF6E81262E297300711ADC /* BootSplash.storyboard */,
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
13B07FB71A68108700A75B9A /* main.m */,
0F5E534E263B73D5004CA14F /* EnvironmentChecker.h */,
0F5E534F263B73FD004CA14F /* EnvironmentChecker.m */,
Expand Down Expand Up @@ -168,6 +168,8 @@
isa = PBXGroup;
children = (
F0C450E92705020500FD2970 /* colors.json */,
DD7904292792E76D004484B4 /* RCTBootSplash.h */,
DD79042A2792E76D004484B4 /* RCTBootSplash.m */,
7041848326A8E40900E09F4D /* RCTStartupTimer.h */,
7041848426A8E47D00E09F4D /* RCTStartupTimer.m */,
18D050DF262400AF000D658B /* BridgingFile.swift */,
Expand Down Expand Up @@ -322,7 +324,6 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,
0F5BE0CE252686330097D869 /* GoogleService-Info.plist in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
E9DF872D2525201700607FDC /* AirshipConfig.plist in Resources */,
Expand Down Expand Up @@ -779,6 +780,7 @@
18D050E0262400AF000D658B /* BridgingFile.swift in Sources */,
0F5E5350263B73FD004CA14F /* EnvironmentChecker.m in Sources */,
7041848526A8E47D00E09F4D /* RCTStartupTimer.m in Sources */,
DD79042B2792E76D004484B4 /* RCTBootSplash.m in Sources */,
13B07FC11A68108700A75B9A /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
6 changes: 3 additions & 3 deletions ios/NewExpensify/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
#import <React/RCTLinkingManager.h>
#import <React/RCTRootView.h>
#import <Firebase.h>
#import "RCTStartupTimer.h"

#import "RNBootSplash.h"
#import "RCTBootSplash.h"
#import "RCTStartupTimer.h"

#import <UserNotifications/UserNotifications.h>

Expand Down Expand Up @@ -54,7 +54,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];

[RNBootSplash initWithStoryboard:@"BootSplash" rootView:rootView]; // <- initialization using the storyboard file name
[RCTBootSplash initWithStoryboard:@"BootSplash" rootView:rootView]; // <- initialization using the storyboard file name

// Define UNUserNotificationCenter
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
Expand Down
27 changes: 0 additions & 27 deletions ios/NewExpensify/LaunchScreen.storyboard

This file was deleted.

16 changes: 16 additions & 0 deletions ios/NewExpensify/RCTBootSplash.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// RCTBootSplash.h
// NewExpensify
//
// Created by Mathieu Acthernoene on 07/01/2022.
//

#import <React/RCTBridgeModule.h>
#import <React/RCTRootView.h>

@interface RCTBootSplash : NSObject <RCTBridgeModule>

+ (void)initWithStoryboard:(NSString * _Nonnull)storyboardName
rootView:(RCTRootView * _Nullable)rootView;

@end
Loading

0 comments on commit 669c0d9

Please sign in to comment.