diff --git a/android/app/build.gradle b/android/app/build.gradle index f481197a2..8a8d5f063 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -130,7 +130,6 @@ android { applicationId "com.mattermost.rnbeta" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - missingDimensionStrategy "RNN.reactNativeVersion", "reactNative60" versionCode 274 versionName "1.29.0" multiDexEnabled = true @@ -240,35 +239,8 @@ dependencies { implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.google.firebase:firebase-messaging:17.3.4' - implementation project(':react-native-document-picker') - implementation project(':react-native-keychain') - implementation project(':react-native-doc-viewer') - implementation project(':react-native-video') - implementation project(':react-native-navigation') - implementation project(':react-native-image-picker') - implementation project(':react-native-device-info') implementation project(':reactnativenotifications') - implementation project(':react-native-cookies') - implementation project(':react-native-linear-gradient') - implementation project(':react-native-vector-icons') - implementation project(':react-native-svg') - implementation project(':react-native-local-auth') - implementation project(':jail-monkey') - implementation project(':react-native-youtube') - implementation project(':react-native-exception-handler') - implementation project(':rn-fetch-blob') - implementation project(':react-native-webview') - implementation project(':react-native-gesture-handler') - implementation project(':@react-native-community_async-storage') - implementation project(':@react-native-community_netinfo') - implementation project(':@sentry_react-native') - implementation project(':react-native-android-open-settings') - implementation project(':react-native-haptic-feedback') - implementation project(':react-native-hw-keyboard-event') - implementation project(':react-native-permissions') - - implementation project(':react-native-fast-image') // For animated GIF support implementation 'com.facebook.fresco:fresco:2.0.0' implementation 'com.facebook.fresco:animated-gif:2.0.0' @@ -285,3 +257,4 @@ task copyDownloadableDepsToLibs(type: Copy) { } apply plugin: 'com.google.gms.google-services' +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java b/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java index 230f8195a..dc3cbd73d 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java @@ -1,50 +1,20 @@ package com.mattermost.rnbeta; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import android.content.Context; import android.content.RestrictionsManager; import android.os.Bundle; import android.util.Log; -import android.view.KeyEvent; import java.io.File; import java.util.HashMap; -import java.util.Arrays; import java.util.List; import java.util.Map; +import com.mattermost.share.RealPathUtil; import com.mattermost.share.ShareModule; -import com.learnium.RNDeviceInfo.RNDeviceModule; -import com.imagepicker.ImagePickerModule; -import com.psykar.cookiemanager.CookieManagerModule; -import com.oblador.vectoricons.VectorIconsModule; -import com.wix.reactnativenotifications.RNNotificationsModule; -import io.tradle.react.LocalAuthModule; -import com.gantix.JailMonkey.JailMonkeyModule; -import com.RNFetchBlob.RNFetchBlob; -import com.masteratul.exceptionhandler.ReactNativeExceptionHandlerModule; -import com.inprogress.reactnativeyoutube.YouTubeStandaloneModule; -import com.philipphecht.RNDocViewerModule; -import io.github.elyx0.reactnativedocumentpicker.DocumentPickerModule; -import com.oblador.keychain.KeychainModule; -import com.reactnativecommunity.asyncstorage.AsyncStorageModule; -import com.reactnativecommunity.netinfo.NetInfoModule; -import com.reactnativecommunity.webview.RNCWebViewPackage; -import io.sentry.RNSentryModule; -import com.dylanvann.fastimage.FastImageViewPackage; -import com.levelasquez.androidopensettings.AndroidOpenSettings; -import com.mkuczera.RNReactNativeHapticFeedbackModule; -import com.reactnativecommunity.rnpermissions.RNPermissionsModule; - -import com.reactnativecommunity.webview.RNCWebViewPackage; -import com.brentvatne.react.ReactVideoPackage; -import com.BV.LinearGradient.LinearGradientPackage; -import com.horcrux.svg.SvgPackage; -import com.swmansion.gesturehandler.react.RNGestureHandlerPackage; +import com.wix.reactnativenotifications.RNNotificationsPackage; import com.reactnativenavigation.NavigationApplication; -import com.reactnativenavigation.react.NavigationReactNativeHost; -import com.reactnativenavigation.react.ReactGateway; import com.wix.reactnativenotifications.core.notification.INotificationsApplication; import com.wix.reactnativenotifications.core.notification.IPushNotification; import com.wix.reactnativenotifications.core.notificationdrawer.IPushNotificationsDrawer; @@ -53,6 +23,7 @@ import com.wix.reactnativenotifications.core.AppLaunchHelper; import com.wix.reactnativenotifications.core.AppLifecycleFacade; import com.wix.reactnativenotifications.core.JsIOHelper; +import com.facebook.react.PackageList; import com.facebook.react.ReactPackage; import com.facebook.react.ReactNativeHost; import com.facebook.react.TurboReactPackage; @@ -68,10 +39,6 @@ import com.facebook.react.module.model.ReactModuleInfoProvider; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.soloader.SoLoader; -import com.mattermost.share.RealPathUtil; - -import com.github.emilioicai.hwkeyboardevent.HWKeyboardEventPackage; - public class MainApplication extends NavigationApplication implements INotificationsApplication, INotificationsDrawerApplication { public static MainApplication instance; @@ -87,78 +54,34 @@ public class MainApplication extends NavigationApplication implements INotificat private Bundle mManagedConfig = null; - @Override - protected ReactGateway createReactGateway() { - ReactNativeHost host = new NavigationReactNativeHost(this, isDebug(), createAdditionalReactPackages()) { - @Override - protected String getJSMainModuleName() { - return "index"; - } - }; - return new ReactGateway(this, isDebug(), host); - } +private final ReactNativeHost mReactNativeHost = + new ReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } - @Override - public boolean isDebug() { - return BuildConfig.DEBUG; - } - - @NonNull - @Override - public List createAdditionalReactPackages() { - // Add the packages you require here. - // No need to add RnnPackage and MainReactPackage - return Arrays.asList( - new TurboReactPackage() { + @Override + protected List getPackages() { + @SuppressWarnings("UnnecessaryLocalVariable") + List 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 RNNotificationsPackage(MainApplication.this)); + packages.add(new RNPasteableTextInputPackage()); + packages.add( + new TurboReactPackage() { @Override public NativeModule getModule(String name, ReactApplicationContext reactContext) { switch (name) { - case "MattermostShare": - return new ShareModule(instance, reactContext); - case "RNDeviceInfo": - return new RNDeviceModule(reactContext, false); - case "ImagePickerManager": - return new ImagePickerModule(reactContext, R.style.DefaultExplainingPermissionsTheme); - case "RNCookieManagerAndroid": - return new CookieManagerModule(reactContext); - case "RNVectorIconsModule": - return new VectorIconsModule(reactContext); - case "WixRNNotifications": - return new RNNotificationsModule(instance, reactContext); - case "RNLocalAuth": - return new LocalAuthModule(reactContext); - case "JailMonkey": - return new JailMonkeyModule(reactContext, false); - case "RNFetchBlob": - return new RNFetchBlob(reactContext); case "MattermostManaged": return MattermostManagedModule.getInstance(reactContext); + case "MattermostShare": + return new ShareModule(instance, reactContext); case "NotificationPreferences": return NotificationPreferencesModule.getInstance(instance, reactContext); case "RNTextInputReset": return new RNTextInputResetModule(reactContext); - case "ReactNativeExceptionHandler": - return new ReactNativeExceptionHandlerModule(reactContext); - case "YouTubeStandaloneModule": - return new YouTubeStandaloneModule(reactContext); - case "RNDocViewer": - return new RNDocViewerModule(reactContext); - case "RNDocumentPicker": - return new DocumentPickerModule(reactContext); - case "RNKeychainManager": - return new KeychainModule(reactContext); - case "RNSentry": - return new RNSentryModule(reactContext); - case AsyncStorageModule.NAME: - return new AsyncStorageModule(reactContext); - case NetInfoModule.NAME: - return new NetInfoModule(reactContext); - case "RNAndroidOpenSettings": - return new AndroidOpenSettings(reactContext); - case "RNReactNativeHapticFeedbackModule": - return new RNReactNativeHapticFeedbackModule(reactContext); - case "RNPermissions": - return new RNPermissionsModule(reactContext); default: throw new IllegalArgumentException("Could not find module " + name); } @@ -171,43 +94,28 @@ public class MainApplication extends NavigationApplication implements INotificat public Map getReactModuleInfos() { Map map = new HashMap<>(); map.put("MattermostManaged", new ReactModuleInfo("MattermostManaged", "com.mattermost.rnbeta.MattermostManagedModule", false, false, false, false, false)); + map.put("MattermostShare", new ReactModuleInfo("MattermostShare", "com.mattermost.share.ShareModule", false, false, true, false, false)); map.put("NotificationPreferences", new ReactModuleInfo("NotificationPreferences", "com.mattermost.rnbeta.NotificationPreferencesModule", false, false, false, false, false)); map.put("RNTextInputReset", new ReactModuleInfo("RNTextInputReset", "com.mattermost.rnbeta.RNTextInputResetModule", false, false, false, false, false)); - - map.put("MattermostShare", new ReactModuleInfo("MattermostShare", "com.mattermost.share.ShareModule", false, false, true, false, false)); - map.put("RNDeviceInfo", new ReactModuleInfo("RNDeviceInfo", "com.learnium.RNDeviceInfo.RNDeviceModule", false, false, true, false, false)); - map.put("ImagePickerManager", new ReactModuleInfo("ImagePickerManager", "com.imagepicker.ImagePickerModule", false, false, false, false, false)); - map.put("RNCookieManagerAndroid", new ReactModuleInfo("RNCookieManagerAndroid", "com.psykar.cookiemanager.CookieManagerModule", false, false, false, false, false)); - map.put("RNVectorIconsModule", new ReactModuleInfo("RNVectorIconsModule", "com.oblador.vectoricons.VectorIconsModule", false, false, false, false, false)); - map.put("WixRNNotifications", new ReactModuleInfo("WixRNNotifications", "com.wix.reactnativenotifications.RNNotificationsModule", false, false, false, false, false)); - map.put("RNLocalAuth", new ReactModuleInfo("RNLocalAuth", "io.tradle.react.LocalAuthModule", false, false, false, false, false)); - map.put("JailMonkey", new ReactModuleInfo("JailMonkey", "com.gantix.JailMonkey.JailMonkeyModule", false, false, true, false, false)); - map.put("RNFetchBlob", new ReactModuleInfo("RNFetchBlob", "com.RNFetchBlob.RNFetchBlob", false, false, true, false, false)); - map.put("ReactNativeExceptionHandler", new ReactModuleInfo("ReactNativeExceptionHandler", "com.masteratul.exceptionhandler.ReactNativeExceptionHandlerModule", false, false, false, false, false)); - map.put("YouTubeStandaloneModule", new ReactModuleInfo("YouTubeStandaloneModule", "com.inprogress.reactnativeyoutube.YouTubeStandaloneModule", false, false, false, false, false)); - map.put("RNDocViewer", new ReactModuleInfo("RNDocViewer", "com.philipphecht.RNDocViewerModule", false, false, false, false, false)); - map.put("RNDocumentPicker", new ReactModuleInfo("RNDocumentPicker", "io.github.elyx0.reactnativedocumentpicker.DocumentPickerModule", false, false, false, false, false)); - map.put("RNKeychainManager", new ReactModuleInfo("RNKeychainManager", "com.oblador.keychain.KeychainModule", false, false, true, false, false)); - map.put("RNSentry", new ReactModuleInfo("RNSentry", "com.sentry.RNSentryModule", false, false, true, false, false)); - map.put(AsyncStorageModule.NAME, new ReactModuleInfo(AsyncStorageModule.NAME, "com.reactnativecommunity.asyncstorage.AsyncStorageModule", false, false, false, false, false)); - map.put(NetInfoModule.NAME, new ReactModuleInfo(NetInfoModule.NAME, "com.reactnativecommunity.netinfo.NetInfoModule", false, false, false, false, false)); - map.put("RNAndroidOpenSettings", new ReactModuleInfo("RNAndroidOpenSettings", "com.levelasquez.androidopensettings.AndroidOpenSettings", false, false, false, false, false)); - map.put("RNReactNativeHapticFeedbackModule", new ReactModuleInfo("RNReactNativeHapticFeedback", "com.mkuczera.RNReactNativeHapticFeedbackModule", false, false, false, false, false)); - map.put("RNPermissions", new ReactModuleInfo("RNPermissions", "com.reactnativecommunity.rnpermissions.RNPermissionsModule", false, false, false, false, false)); return map; } }; } - }, - new FastImageViewPackage(), - new RNCWebViewPackage(), - new SvgPackage(), - new LinearGradientPackage(), - new ReactVideoPackage(), - new RNGestureHandlerPackage(), - new RNPasteableTextInputPackage(), - new HWKeyboardEventPackage() - ); + } + ); + + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; } @Override @@ -243,14 +151,11 @@ public class MainApplication extends NavigationApplication implements INotificat } public ReactContext getRunningReactContext() { - final ReactGateway reactGateway = getReactGateway(); - - if (reactGateway == null) { + if (mReactNativeHost == null) { return null; } - return reactGateway - .getReactNativeHost() + return mReactNativeHost .getReactInstanceManager() .getCurrentReactContext(); } diff --git a/android/build.gradle b/android/build.gradle index d374922ce..dc0e1741d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,6 +7,9 @@ buildscript { compileSdkVersion = 28 targetSdkVersion = 28 supportLibVersion = "28.0.0" + kotlinVersion = "1.3.61" + RNNKotlinVersion = kotlinVersion + } repositories { jcenter() @@ -17,6 +20,7 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.4.2' classpath 'com.google.gms:google-services:4.2.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/android/settings.gradle b/android/settings.gradle index be7912111..96a34c969 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,57 +1,5 @@ rootProject.name = 'Mattermost' -include ':@sentry_react-native' -project(':@sentry_react-native').projectDir = new File(rootProject.projectDir, '../node_modules/@sentry/react-native/android') -include ':react-native-android-open-settings' -project(':react-native-android-open-settings').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-android-open-settings/android') -include ':react-native-permissions' -project(':react-native-permissions').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-permissions/android') -include ':react-native-fast-image' -project(':react-native-fast-image').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fast-image/android') -include ':react-native-haptic-feedback' -project(':react-native-haptic-feedback').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-haptic-feedback/android') -include ':react-native-gesture-handler' -project(':react-native-gesture-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-gesture-handler/android') -include ':react-native-document-picker' -project(':react-native-document-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-document-picker/android') -include ':react-native-keychain' -project(':react-native-keychain').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keychain/android') -include ':react-native-doc-viewer' -project(':react-native-doc-viewer').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-doc-viewer/android') -include ':react-native-video' -project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android') -include ':react-native-youtube' -project(':react-native-youtube').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-youtube/android') -include ':react-native-exception-handler' -project(':react-native-exception-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-exception-handler/android') -include ':rn-fetch-blob' -project(':rn-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/rn-fetch-blob/android') -include ':jail-monkey' -project(':jail-monkey').projectDir = new File(rootProject.projectDir, '../node_modules/jail-monkey/android') -include ':react-native-local-auth' -project(':react-native-local-auth').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-local-auth/android') -include ':react-native-navigation' -project(':react-native-navigation').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-navigation/lib/android/app/') -include ':react-native-image-picker' -project(':react-native-image-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-picker/android') -include ':react-native-device-info' -project(':react-native-device-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-device-info/android') -include ':react-native-cookies' -project(':react-native-cookies').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-cookies/android') -include ':react-native-vector-icons' -project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') include ':reactnativenotifications' project(':reactnativenotifications').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-notifications/android/app') - +apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' -include ':react-native-svg' -project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') -include ':react-native-linear-gradient' -project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android') -include ':react-native-webview' -project(':react-native-webview').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-webview/android') -include ':@react-native-community_async-storage' -project(':@react-native-community_async-storage').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/async-storage/android') -include ':@react-native-community_netinfo' -project(':@react-native-community_netinfo').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/netinfo/android') -include ':react-native-hw-keyboard-event' -project(':react-native-hw-keyboard-event').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-hw-keyboard-event/android') diff --git a/app/actions/navigation/index.js b/app/actions/navigation/index.js index 3bda5eee4..12c326a49 100644 --- a/app/actions/navigation/index.js +++ b/app/actions/navigation/index.js @@ -27,7 +27,7 @@ export function resetToChannel(passProps = {}) { passProps, options: { layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, statusBar: { visible: true, @@ -91,6 +91,10 @@ export function resetToSelectServer(allowOtherServers) { allowOtherServers, }, options: { + layout: { + backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, + }, statusBar: { visible: true, }, @@ -117,7 +121,7 @@ export function resetToTeams(name, title, passProps = {}, options = {}) { const theme = getThemeFromState(); const defaultOptions = { layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, statusBar: { visible: true, @@ -159,8 +163,9 @@ export function goToScreen(name, title, passProps = {}, options = {}) { const componentId = EphemeralStore.getNavigationTopComponentId(); const defaultOptions = { layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, + popGesture: true, sideMenu: { left: {enabled: false}, right: {enabled: false}, @@ -215,8 +220,9 @@ export async function popToRoot() { export function showModal(name, title, passProps = {}, options = {}) { const theme = getThemeFromState(); const defaultOptions = { + modalPresentationStyle: Platform.select({ios: 'fullScreen', android: 'none'}), layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, statusBar: { visible: true, @@ -260,7 +266,7 @@ export function showModalOverCurrentContext(name, passProps = {}, options = {}) const defaultOptions = { modalPresentationStyle: 'overCurrentContext', layout: { - backgroundColor: 'transparent', + componentBackgroundColor: 'transparent', }, topBar: { visible: false, @@ -268,6 +274,7 @@ export function showModalOverCurrentContext(name, passProps = {}, options = {}) }, animations: { showModal: { + waitForRender: true, enabled: animationsEnabled, alpha: { from: 0, diff --git a/app/actions/navigation/index.test.js b/app/actions/navigation/index.test.js index 2f9c26c3a..e778f6c50 100644 --- a/app/actions/navigation/index.test.js +++ b/app/actions/navigation/index.test.js @@ -42,7 +42,7 @@ describe('app/actions/navigation', () => { passProps, options: { layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, statusBar: { visible: true, @@ -83,6 +83,10 @@ describe('app/actions/navigation', () => { allowOtherServers, }, options: { + layout: { + backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, + }, statusBar: { visible: true, }, @@ -113,7 +117,7 @@ describe('app/actions/navigation', () => { const defaultOptions = { layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, statusBar: { visible: true, @@ -158,8 +162,9 @@ describe('app/actions/navigation', () => { const defaultOptions = { layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, + popGesture: true, sideMenu: { left: {enabled: false}, right: {enabled: false}, @@ -216,8 +221,9 @@ describe('app/actions/navigation', () => { const showModal = jest.spyOn(Navigation, 'showModal'); const defaultOptions = { + modalPresentationStyle: Platform.select({ios: 'fullScreen', android: 'none'}), layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, statusBar: { visible: true, @@ -266,7 +272,7 @@ describe('app/actions/navigation', () => { const showModalOverCurrentContextOptions = { modalPresentationStyle: 'overCurrentContext', layout: { - backgroundColor: 'transparent', + componentBackgroundColor: 'transparent', }, topBar: { visible: false, @@ -274,6 +280,7 @@ describe('app/actions/navigation', () => { }, animations: { showModal: { + waitForRender: true, enabled: animationsEnabled, alpha: { from: 0, @@ -292,8 +299,9 @@ describe('app/actions/navigation', () => { }, }; const showModalOptions = { + modalPresentationStyle: Platform.select({ios: 'fullScreen', android: 'none'}), layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, statusBar: { visible: true, @@ -349,8 +357,9 @@ describe('app/actions/navigation', () => { }, }; const defaultOptions = { + modalPresentationStyle: Platform.select({ios: 'fullScreen', android: 'none'}), layout: { - backgroundColor: theme.centerChannelBg, + componentBackgroundColor: theme.centerChannelBg, }, statusBar: { visible: true, diff --git a/app/constants/view.js b/app/constants/view.js index 60a186651..5277b3d07 100644 --- a/app/constants/view.js +++ b/app/constants/view.js @@ -2,6 +2,10 @@ // See LICENSE.txt for license information. import keyMirror from 'mattermost-redux/utils/key_mirror'; +import DeviceInfo from 'react-native-device-info'; + +// The iPhone 11 and iPhone 11 Pro Max have a navbar height of 44 and iPhone 11 Pro has 32 +const IPHONE_11_LANDSCAPE_HEIGHT = ['iPhone 11', 'iPhone 11 Pro Max']; export const UpgradeTypes = { CAN_UPGRADE: 'can_upgrade', @@ -104,7 +108,7 @@ export default { MAX_CHANNELNAME_LENGTH: 64, ANDROID_TOP_LANDSCAPE: 46, ANDROID_TOP_PORTRAIT: 56, - IOS_TOP_LANDSCAPE: 32, + IOS_TOP_LANDSCAPE: IPHONE_11_LANDSCAPE_HEIGHT.includes(DeviceInfo.getModel()) ? 44 : 32, IOS_TOP_PORTRAIT: 64, IOS_INSETS_TOP_PORTRAIT: 88, STATUS_BAR_HEIGHT: 20, diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 37d679b4e..5d8dab95b 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -268,8 +268,10 @@ PODS: - React - ReactNativeKeyboardTrackingView (5.6.1): - React - - ReactNativeNavigation (3.2.0): + - ReactNativeNavigation (6.1.1): - React + - React-RCTImage + - React-RCTText - rn-fetch-blob (0.12.0): - React-Core - RNCAsyncStorage (1.7.1): @@ -548,7 +550,7 @@ SPEC CHECKSUMS: ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd ReactNativeExceptionHandler: 8025d98049c25f186835a3af732dd7c9974d6dce ReactNativeKeyboardTrackingView: a240a6a0dba852bb107109a7ec7e98b884055977 - ReactNativeNavigation: aad255980f20cc5d2001ed37972319f3789fea70 + ReactNativeNavigation: 8f781c932c53011889d4952c90589e22d982dbb3 rn-fetch-blob: 17961aec08caae68bb8fc0e5b40f93b3acfa6932 RNCAsyncStorage: 8539fc80a0075fcc9c8e2dff84cd22dc5bf1dacf RNDeviceInfo: fd8296de6fca8b743cdc499b896f48e8a9f1faf5 diff --git a/package-lock.json b/package-lock.json index 6f3f4e9b5..98c019ca4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12788,9 +12788,9 @@ "from": "github:mattermost/react-native-local-auth#cc9ce2f468fbf7b431dfad3191a31aaa9227a6ab" }, "react-native-navigation": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-native-navigation/-/react-native-navigation-3.2.0.tgz", - "integrity": "sha512-HfdLkwiEEIBGyg0cspSzL/gk+tQ1bfbiF5VvzGcB5t0ym1RRUpkfcf+Uv0P0SoKNDQ6UlUTGCUrjnqfVivwK9w==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/react-native-navigation/-/react-native-navigation-6.1.1.tgz", + "integrity": "sha512-ayXko0oTqnC+vDglpPBZ/s6DYzHKX1YXkk/liCTyxMR7Hlf+WZ77HxFOcNW38sXYIxd1cW9ldkQgQ7nTIbUGAg==", "requires": { "hoist-non-react-statics": "3.x.x", "lodash": "4.17.x", @@ -12800,9 +12800,9 @@ }, "dependencies": { "hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { "react-is": "^16.7.0" } diff --git a/package.json b/package.json index 4c3d6d608..c201c2c51 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "react-native-keychain": "4.0.5", "react-native-linear-gradient": "2.5.6", "react-native-local-auth": "github:mattermost/react-native-local-auth#cc9ce2f468fbf7b431dfad3191a31aaa9227a6ab", - "react-native-navigation": "3.2.0", + "react-native-navigation": "6.1.1", "react-native-notifications": "2.0.6", "react-native-passcode-status": "1.1.2", "react-native-permissions": "2.0.9", diff --git a/patches/react-native-navigation+3.2.0.patch b/patches/react-native-navigation+3.2.0.patch deleted file mode 100644 index 12a568833..000000000 --- a/patches/react-native-navigation+3.2.0.patch +++ /dev/null @@ -1,121 +0,0 @@ -diff --git a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java -index 82b434b..858ca59 100644 ---- a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java -+++ b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java -@@ -26,6 +26,7 @@ import com.reactnativenavigation.viewcontrollers.ViewController; - import com.reactnativenavigation.viewcontrollers.navigator.Navigator; - - import java.util.ArrayList; -+import java.lang.ClassCastException; - - import androidx.annotation.NonNull; - import androidx.annotation.Nullable; -@@ -54,14 +55,18 @@ public class NavigationModule extends ReactContextBaseJavaModule { - reactContext.addLifecycleEventListener(new LifecycleEventListenerAdapter() { - @Override - public void onHostResume() { -- eventEmitter = new EventEmitter(reactContext); -- navigator().setEventEmitter(eventEmitter); -- layoutFactory.init( -- activity(), -- eventEmitter, -- navigator().getChildRegistry(), -- ((NavigationApplication) activity().getApplication()).getExternalComponents() -- ); -+ try { -+ eventEmitter = new EventEmitter(reactContext); -+ navigator().setEventEmitter(eventEmitter); -+ layoutFactory.init( -+ activity(), -+ eventEmitter, -+ navigator().getChildRegistry(), -+ ((NavigationApplication) activity().getApplication()).getExternalComponents() -+ ); -+ } catch (ClassCastException e) { -+ // The most current activity is not a NavigationActivity -+ } - } - }); - } -diff --git a/node_modules/react-native-navigation/lib/ios/RNNCommandsHandler.m b/node_modules/react-native-navigation/lib/ios/RNNCommandsHandler.m -index 2d34f5a..82e7bcc 100644 ---- a/node_modules/react-native-navigation/lib/ios/RNNCommandsHandler.m -+++ b/node_modules/react-native-navigation/lib/ios/RNNCommandsHandler.m -@@ -69,7 +69,7 @@ - (void)setRoot:(NSDictionary*)layout commandId:(NSString*)commandId completion: - } - } - -- [_modalManager dismissAllModalsAnimated:NO]; -+ [_modalManager dismissAllModalsAnimated:NO completion:nil]; - - UIViewController *vc = [_controllerFactory createLayout:layout[@"root"]]; - -@@ -289,10 +289,9 @@ - (void)dismissAllModals:(NSDictionary *)mergeOptions commandId:(NSString*)comma - [CATransaction begin]; - [CATransaction setCompletionBlock:^{ - [_eventEmitter sendOnNavigationCommandCompletion:dismissAllModals commandId:commandId params:@{}]; -- completion(); - }]; - RNNNavigationOptions* options = [[RNNNavigationOptions alloc] initWithDict:mergeOptions]; -- [_modalManager dismissAllModalsAnimated:[options.animations.dismissModal.enable getWithDefaultValue:YES]]; -+ [_modalManager dismissAllModalsAnimated:[options.animations.dismissModal.enable getWithDefaultValue:YES] completion:completion]; - - [CATransaction commit]; - } -diff --git a/node_modules/react-native-navigation/lib/ios/RNNModalManager.h b/node_modules/react-native-navigation/lib/ios/RNNModalManager.h -index 9809db0..a602c92 100644 ---- a/node_modules/react-native-navigation/lib/ios/RNNModalManager.h -+++ b/node_modules/react-native-navigation/lib/ios/RNNModalManager.h -@@ -19,6 +19,6 @@ typedef void (^RNNTransitionRejectionBlock)(NSString *code, NSString *message, N - - (void)showModal:(UIViewController *)viewController animated:(BOOL)animated completion:(RNNTransitionWithComponentIdCompletionBlock)completion; - - (void)showModal:(UIViewController *)viewController animated:(BOOL)animated hasCustomAnimation:(BOOL)hasCustomAnimation completion:(RNNTransitionWithComponentIdCompletionBlock)completion; - - (void)dismissModal:(UIViewController *)viewController completion:(RNNTransitionCompletionBlock)completion; --- (void)dismissAllModalsAnimated:(BOOL)animated; -+- (void)dismissAllModalsAnimated:(BOOL)animated completion:(RNNTransitionCompletionBlock)completion; - - @end -diff --git a/node_modules/react-native-navigation/lib/ios/RNNModalManager.m b/node_modules/react-native-navigation/lib/ios/RNNModalManager.m -index 91adb14..8aa3935 100644 ---- a/node_modules/react-native-navigation/lib/ios/RNNModalManager.m -+++ b/node_modules/react-native-navigation/lib/ios/RNNModalManager.m -@@ -50,9 +50,16 @@ - (void)dismissModal:(UIViewController *)viewController completion:(RNNTransitio - } - } - ---(void)dismissAllModalsAnimated:(BOOL)animated { -+-(void)dismissAllModalsAnimated:(BOOL)animated completion:(RNNTransitionCompletionBlock)completion { -+ if (!_presentedModals || !_presentedModals.count) { -+ if (completion) { -+ completion(); -+ } -+ return; -+ } -+ - UIViewController *root = UIApplication.sharedApplication.delegate.window.rootViewController; -- [root dismissViewControllerAnimated:animated completion:nil]; -+ [root dismissViewControllerAnimated:animated completion:completion]; - [_delegate dismissedMultipleModals:_presentedModals]; - [_pendingModalIdsToDismiss removeAllObjects]; - [_presentedModals removeAllObjects]; -diff --git a/node_modules/react-native-navigation/lib/ios/ReactNativeNavigationTests/RNNModalManagerTest.m b/node_modules/react-native-navigation/lib/ios/ReactNativeNavigationTests/RNNModalManagerTest.m -index 1f9df16..23b6528 100644 ---- a/node_modules/react-native-navigation/lib/ios/ReactNativeNavigationTests/RNNModalManagerTest.m -+++ b/node_modules/react-native-navigation/lib/ios/ReactNativeNavigationTests/RNNModalManagerTest.m -@@ -51,7 +51,7 @@ - (void)testDismissMultipleModalsInvokeDelegateWithCorrectParameters { - [_modalManager showModal:_vc3 animated:NO completion:nil]; - - _modalManager.delegate = self; -- [_modalManager dismissAllModalsAnimated:NO]; -+ [_modalManager dismissAllModalsAnimated:NO completion:nil]; - - XCTAssertTrue(_modalDismissedCount == 3); - } -@@ -87,7 +87,7 @@ - (void)testDismissAllModals_AfterDismissingPreviousModal_InvokeDelegateWithCorr - [_modalManager dismissModal:_vc2 completion:nil]; - - XCTAssertTrue(_modalDismissedCount == 1); -- [_modalManager dismissAllModalsAnimated:NO]; -+ [_modalManager dismissAllModalsAnimated:NO completion:nil]; - XCTAssertTrue(_modalDismissedCount == 2); - } - diff --git a/patches/react-native-navigation+6.1.1.patch b/patches/react-native-navigation+6.1.1.patch new file mode 100644 index 000000000..9853e31b1 --- /dev/null +++ b/patches/react-native-navigation+6.1.1.patch @@ -0,0 +1,55 @@ +diff --git a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java +index 260ed81..0caba42 100644 +--- a/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java ++++ b/node_modules/react-native-navigation/lib/android/app/src/main/java/com/reactnativenavigation/react/NavigationModule.java +@@ -28,6 +28,7 @@ import com.reactnativenavigation.viewcontrollers.ViewController; + import com.reactnativenavigation.viewcontrollers.navigator.Navigator; + + import java.util.ArrayList; ++import java.lang.ClassCastException; + + import androidx.annotation.NonNull; + import androidx.annotation.Nullable; +@@ -56,14 +57,18 @@ public class NavigationModule extends ReactContextBaseJavaModule { + reactContext.addLifecycleEventListener(new LifecycleEventListenerAdapter() { + @Override + public void onHostResume() { +- eventEmitter = new EventEmitter(reactContext); +- navigator().setEventEmitter(eventEmitter); +- layoutFactory.init( +- activity(), +- eventEmitter, +- navigator().getChildRegistry(), +- ((NavigationApplication) activity().getApplication()).getExternalComponents() +- ); ++ try { ++ eventEmitter = new EventEmitter(reactContext); ++ navigator().setEventEmitter(eventEmitter); ++ layoutFactory.init( ++ activity(), ++ eventEmitter, ++ navigator().getChildRegistry(), ++ ((NavigationApplication) activity().getApplication()).getExternalComponents() ++ ); ++ } catch (ClassCastException e) { ++ // The most current activity is not a NavigationActivity ++ } + } + }); + } +diff --git a/node_modules/react-native-navigation/lib/ios/RNNCommandsHandler.m b/node_modules/react-native-navigation/lib/ios/RNNCommandsHandler.m +index 7719499..5b245ba 100644 +--- a/node_modules/react-native-navigation/lib/ios/RNNCommandsHandler.m ++++ b/node_modules/react-native-navigation/lib/ios/RNNCommandsHandler.m +@@ -295,10 +295,9 @@ - (void)dismissAllModals:(NSDictionary *)mergeOptions commandId:(NSString*)comma + [CATransaction begin]; + [CATransaction setCompletionBlock:^{ + [_eventEmitter sendOnNavigationCommandCompletion:dismissAllModals commandId:commandId params:@{}]; +- completion(); + }]; + RNNNavigationOptions* options = [[RNNNavigationOptions alloc] initWithDict:mergeOptions]; +- [_modalManager dismissAllModalsAnimated:[options.animations.dismissModal.enable getWithDefaultValue:YES] completion:nil]; ++ [_modalManager dismissAllModalsAnimated:[options.animations.dismissModal.enable getWithDefaultValue:YES] completion:completion]; + + [CATransaction commit]; + } diff --git a/react-native.config.js b/react-native.config.js index b311e1f72..ce4c13cd8 100644 --- a/react-native.config.js +++ b/react-native.config.js @@ -2,6 +2,13 @@ // See LICENSE.txt for license information. module.exports = { + dependencies: { + 'react-native-notifications': { + platforms: { + android: null, + }, + }, + }, assets: [ './assets/fonts', ],