Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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