diff --git a/CHANGELOG.android.txt b/CHANGELOG.android.txt
index e69de29..b751613 100755
--- a/CHANGELOG.android.txt
+++ b/CHANGELOG.android.txt
@@ -0,0 +1 @@
+- We have improved the UI for users who use three-button navigation when edge-to-edge mode is enabled.
\ No newline at end of file
diff --git a/android/app/build.gradle b/android/app/build.gradle
index a6c22fb..24c58e6 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,56 +1,19 @@
apply plugin: "com.android.application"
apply plugin: "com.facebook.react"
-apply plugin: "kotlin-android"
apply plugin: "com.google.gms.google-services"
apply plugin: "com.google.firebase.crashlytics"
+apply plugin: "kotlin-android"
apply plugin: "kotlin-kapt"
+apply plugin: 'org.jetbrains.kotlin.plugin.compose'
apply plugin: "androidx.navigation.safeargs.kotlin"
-/**
- * This is the configuration block to customize your React Native Android app.
- * By default you don't need to apply any configuration, just uncomment the lines you need.
- */
react {
- /* Folders */
- // The root of your project, i.e. where "package.json" lives. Default is '../..'
- // root = file("../../")
- // The folder where the react-native NPM package is. Default is ../../node_modules/react-native
- // reactNativeDir = file("../../node_modules/react-native")
- // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
- // codegenDir = file("../../node_modules/@react-native/codegen")
- // The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js
- // cliFile = file("../../node_modules/react-native/cli.js")
/* Variants */
// The list of variants to that are debuggable. For those we're going to
// skip the bundling of the JS bundle and the assets. By default is just 'debug'.
// If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
debuggableVariants = ["productionDebug", "productionRelease"]
- /* Bundling */
- // A list containing the node command and its flags. Default is just 'node'.
- // nodeExecutableAndArgs = ["node"]
- //
- // The command to run when bundling. By default is 'bundle'
- // bundleCommand = "ram-bundle"
- //
- // The path to the CLI configuration file. Default is empty.
- // bundleConfig = file(../rn-cli.config.js)
- //
- // The name of the generated asset file containing your JS bundle
- // bundleAssetName = "MyApplication.android.bundle"
- //
- // The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
- // entryFile = file("../js/MyApplication.android.js")
- //
- // A list of extra flags to pass to the 'bundle' commands.
- // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
- // extraPackagerArgs = []
- /* Hermes Commands */
- // The hermes compiler command to run. By default it is 'hermesc'
- // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
- //
- // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
- // hermesFlags = ["-O", "-output-source-map"]
- //
+
/* Autolinking */
autolinkLibrariesWithApp()
}
@@ -60,27 +23,6 @@ react {
*/
def enableProguardInReleaseBuilds = false
-/**
- * The preferred build flavor of JavaScriptCore (JSC)
- *
- * For example, to use the international variant, you can use:
- * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
- *
- * The international variant includes ICU i18n library and necessary data
- * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
- * give correct results when using with locales other than en-US. Note that
- * this variant is about 6MiB larger per architecture than default.
- */
-def jscFlavor = "org.webkit:android-jsc:+"
-
-/**
- * Whether to load react from source or use the prepacked package
- *
- * Keep false for faster compilation and avoid the need for an NDK to be installed.
- * Use true if you want to debug and modify RN source, say for patching.
- */
-def reactNativeFromSource = BUILD_RN_FROM_SOURCE.toBoolean()
-
android {
ndkVersion rootProject.ndkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
@@ -91,14 +33,15 @@ android {
applicationId "com.mendix.developerapp.mx10"
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
- versionCode 301
- versionName "3.0.1"
+ versionCode 519
+ versionName "10.24.4"
missingDimensionStrategy "react-native-camera", "general"
testBuildType System.getProperty("testBuildType", "debug")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField "boolean", "DETOX", "false"
buildConfigField "String", "RUNTIME_URL", '""'
buildConfigField "boolean", "OTA", "false"
+ manifestPlaceholders["cookieEncryption"] = project.hasProperty("mendixnative.cookieEncryption") ? project.property("mendixnative.cookieEncryption") : "false"
}
signingConfigs {
debug {
@@ -117,7 +60,7 @@ android {
}
release {
Properties releaseProps = new Properties()
- def propFile = new File('./local.properties')
+ def propFile = new File('./keystores/debug.keystore.properties')
if (propFile.canRead()) {
releaseProps.load(new FileInputStream(propFile))
@@ -169,13 +112,7 @@ android {
dependencies {
// React Native Core
- if (reactNativeFromSource) {
- implementation project(":ReactAndroid")
- } else {
- implementation "com.facebook.react:react-android"
- }
-
- // Javascript engine
+ implementation "com.facebook.react:react-android:0.77.3"
implementation("com.facebook.react:hermes-android")
// Mendix dependencies
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 18da74b..95bc7b5 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,7 +1,6 @@
+ xmlns:tools="http://schemas.android.com/tools">
@@ -74,7 +73,7 @@
android:supportsRtl="true">
-
+
diff --git a/android/app/src/main/assets/sample_apps.json b/android/app/src/main/assets/sample_apps.json
index eef7c7e..2313e19 100644
--- a/android/app/src/main/assets/sample_apps.json
+++ b/android/app/src/main/assets/sample_apps.json
@@ -26,7 +26,7 @@
"id": "lato_bikes_app",
"name": "Lato Bikes",
"description": "Control your Lato Bike via your device",
- "runtimeUrl": "https://lato-bicycles.mendixcloud.com",
+ "runtimeUrl": "https://customer.lato-bicycles.com",
"backgroundImageName": "lato_bikes_app"
},
{
@@ -42,13 +42,6 @@
"description": "Showcases Atlas 3",
"runtimeUrl": "https://atlasdesignsystem.mendixcloud.com",
"backgroundImageName": "atlas_ref_app"
- },
- {
- "id": "mendix_ar",
- "name": "Mendix AR",
- "description": "Showcases possible Mendix AR applications",
- "runtimeUrl": "https://ar-examples-2.mendixcloud.com",
- "backgroundImageName": "ar_app"
}
]
-}
+}
\ No newline at end of file
diff --git a/android/app/src/main/assets/sampleapps.zip b/android/app/src/main/assets/sampleapps.zip
index 00270f9..83033c4 100644
Binary files a/android/app/src/main/assets/sampleapps.zip and b/android/app/src/main/assets/sampleapps.zip differ
diff --git a/android/app/src/main/java/com/mendix/developerapp/firebase/FirebaseMessagingService.kt b/android/app/src/main/java/com/mendix/developerapp/firebase/FirebaseMessagingService.kt
index cebc310..3ad9eaf 100644
--- a/android/app/src/main/java/com/mendix/developerapp/firebase/FirebaseMessagingService.kt
+++ b/android/app/src/main/java/com/mendix/developerapp/firebase/FirebaseMessagingService.kt
@@ -66,7 +66,7 @@ class FirebaseMessagingService: com.google.firebase.messaging.FirebaseMessagingS
val intent = Intent(Intent.ACTION_VIEW).apply {
this.data = uri
}
- return PendingIntent.getActivity(context, MENDIX_AD_NOTIFICATION_ID, intent, PendingIntent.FLAG_ONE_SHOT)
+ return PendingIntent.getActivity(context, MENDIX_AD_NOTIFICATION_ID, intent, PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE)
}
private fun safeParseStringToUri(url: String?): Uri? {
diff --git a/android/app/src/main/java/com/mendix/developerapp/utilities/EmptyDevLoadingViewController.kt b/android/app/src/main/java/com/mendix/developerapp/utilities/EmptyDevLoadingViewController.kt
deleted file mode 100644
index 2043a2a..0000000
--- a/android/app/src/main/java/com/mendix/developerapp/utilities/EmptyDevLoadingViewController.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.mendix.developerapp.utilities
-
-import android.app.Activity
-import android.view.View
-import com.facebook.react.bridge.JavaJSExecutor
-import com.facebook.react.bridge.JavaScriptExecutorFactory
-import com.facebook.react.devsupport.DefaultDevLoadingViewImplementation
-import com.facebook.react.devsupport.ReactInstanceDevHelper
-
-class EmptyDevLoadingViewController() : DefaultDevLoadingViewImplementation(EmptyReactInstanceDevHelper()) {
- override fun showMessage(message: String) {}
- override fun hide() {}
- override fun updateProgress(status: String?, done: Int?, total: Int?) {}
-}
-
-private class EmptyReactInstanceDevHelper : ReactInstanceDevHelper {
- override fun onReloadWithJSDebugger(proxyExecutorFactory: JavaJSExecutor.Factory?) {}
-
- override fun onJSBundleLoadedFromServer() {}
-
- override fun toggleElementInspector() {}
-
- override fun getCurrentActivity(): Activity? = null
-
- override fun getJavaScriptExecutorFactory(): JavaScriptExecutorFactory? = null
-
- override fun createRootView(appKey: String?): View? = null
-
- override fun destroyRootView(rootView: View?) {}
-}
diff --git a/android/app/src/main/res/layout/fragment_mendix_project_traditional.xml b/android/app/src/main/res/layout/fragment_mendix_project_traditional.xml
new file mode 100644
index 0000000..55036c1
--- /dev/null
+++ b/android/app/src/main/res/layout/fragment_mendix_project_traditional.xml
@@ -0,0 +1,5 @@
+
+
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 103f006..1ca2394 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -1,4 +1,4 @@
- Make It Native 10
+ Make It Native
diff --git a/android/app/src/production/AndroidManifest.xml b/android/app/src/production/AndroidManifest.xml
index dd90c0d..9467bb0 100644
--- a/android/app/src/production/AndroidManifest.xml
+++ b/android/app/src/production/AndroidManifest.xml
@@ -5,7 +5,7 @@
,
+ permissions: Array,
requestCode: Int,
listener: PermissionListener?
) {
diff --git a/android/app/src/production/java/com/mendix/developerapp/loading/MendixProjectLoaderScreen.kt b/android/app/src/production/java/com/mendix/developerapp/loading/MendixProjectLoaderScreen.kt
index 09d3588..2f1e246 100644
--- a/android/app/src/production/java/com/mendix/developerapp/loading/MendixProjectLoaderScreen.kt
+++ b/android/app/src/production/java/com/mendix/developerapp/loading/MendixProjectLoaderScreen.kt
@@ -45,7 +45,7 @@ fun MendixProjectLoaderScreen(viewModel: ProjectLoaderViewModel) {
errorMessageTitle = stringResource(R.string.error_version_title)
primaryButtonText = stringResource(R.string.button_min_versions_guide)
secondaryButtonText = stringResource(R.string.button_custom_developer_app_guide)
- primaryButtonOnPress = { viewModel.openInBrowser.invoke("https://docs.mendix.com/refguide/mobile/distributing-mobile-apps/building-native-apps/how-to-min-versions/") }
+ primaryButtonOnPress = { viewModel.openInBrowser.invoke("https://docs.mendix.com/refguide/mobile/getting-started-with-mobile/prerequisites/#get-min-app") }
secondaryButtonOnPress = { viewModel.openInBrowser.invoke("https://docs.mendix.com/howto8/mobile/how-to-devapps/") }
}
diff --git a/android/app/src/production/java/com/mendix/developerapp/mendixapp/MendixProjectFragment.kt b/android/app/src/production/java/com/mendix/developerapp/mendixapp/MendixProjectFragment.kt
index e4241ff..3f36f17 100644
--- a/android/app/src/production/java/com/mendix/developerapp/mendixapp/MendixProjectFragment.kt
+++ b/android/app/src/production/java/com/mendix/developerapp/mendixapp/MendixProjectFragment.kt
@@ -2,9 +2,8 @@ package com.mendix.developerapp.mendixapp
import android.os.Bundle
import androidx.navigation.fragment.findNavController
-import com.facebook.react.devsupport.overrideDevLoadingViewController
+import com.facebook.react.devsupport.DefaultDevLoadingViewImplementation
import com.facebook.react.devsupport.setBundleDownloadListener
-import com.mendix.developerapp.utilities.EmptyDevLoadingViewController
import com.mendix.mendixnative.react.MxConfiguration
class MendixProjectFragment : MendixProjectFragmentBase() {
@@ -23,8 +22,10 @@ class MendixProjectFragment : MendixProjectFragmentBase() {
// Setting up our download listener
reactNativeHost.reactInstanceManager.devSupportManager.apply {
setBundleDownloadListener(this, viewModel.devServerCallback)
- overrideDevLoadingViewController(this, EmptyDevLoadingViewController())
}
+
+ // This now uses built-in RN mechanism to show bundling progress.
+ DefaultDevLoadingViewImplementation.setDevLoadingEnabled(true);
}
override fun onCloseProjectSelected() {
diff --git a/android/app/src/production/java/com/mendix/developerapp/mendixapp/MendixProjectFragmentBase.kt b/android/app/src/production/java/com/mendix/developerapp/mendixapp/MendixProjectFragmentBase.kt
index 69c4928..1023a6a 100644
--- a/android/app/src/production/java/com/mendix/developerapp/mendixapp/MendixProjectFragmentBase.kt
+++ b/android/app/src/production/java/com/mendix/developerapp/mendixapp/MendixProjectFragmentBase.kt
@@ -5,34 +5,24 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
-import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.viewModels
import com.mendix.developerapp.MendixBaseFragment
+import com.mendix.developerapp.R
import com.mendix.developerapp.loading.ProjectLoaderViewModel
-import com.mendix.developerapp.ui.theme.MyApplicationTheme
import com.mendix.developerapp.utilities.GlobalTouchEventListener
import org.devio.rn.splashscreen.SplashScreen
open class MendixProjectFragmentBase : MendixBaseFragment(), GlobalTouchEventListener {
- private lateinit var composeView: ComposeView
protected val viewModel: ProjectLoaderViewModel by viewModels()
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
-
- composeView.setContent {
- MyApplicationTheme {
- MendixProjectScreen(viewModel)
- }
- }
- }
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
- val view = super.onCreateView(inflater, container, savedInstanceState)
+ val rootView = inflater.inflate(R.layout.fragment_mendix_project_traditional, container, false)
+ val reactNativeContainer = rootView.findViewById(R.id.react_native_container)
+ val reactRootView = super.onCreateView(inflater, container, savedInstanceState)
viewModel.status.observe(viewLifecycleOwner) {
if (it === ProjectLoaderViewModel.STATUS_SUCCESS) {
@@ -42,22 +32,13 @@ open class MendixProjectFragmentBase : MendixBaseFragment(), GlobalTouchEventLis
}
}
- /**
- * Why aren't we just attaching to ReactRootView directly? ReactRootView is fairly special.
- * Layouting is actually handled by the UIManagerModule, which means whatever child is added out of React Native's context
- * to the ReactRootView is basically ignored and gets no layout call nor parameters.
- */
- val frameLayout = FrameLayout(requireContext())
- frameLayout.layoutParams = FrameLayout.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT
+ reactNativeContainer.addView(reactRootView,
+ FrameLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
)
- frameLayout.addView(view)
-
- viewModel.setRNFrameLayout(frameLayout)
- return ComposeView(requireContext()).also {
- composeView = it
- }
+ return rootView
}
-}
\ No newline at end of file
+}
diff --git a/android/app/src/production/java/com/mendix/developerapp/ui/component/welcomepage/WelcomePage.kt b/android/app/src/production/java/com/mendix/developerapp/ui/component/welcomepage/WelcomePage.kt
index 212c5d4..718c26f 100644
--- a/android/app/src/production/java/com/mendix/developerapp/ui/component/welcomepage/WelcomePage.kt
+++ b/android/app/src/production/java/com/mendix/developerapp/ui/component/welcomepage/WelcomePage.kt
@@ -49,7 +49,7 @@ fun WelcomePage(
.padding(28.dp)) {
Column(
verticalArrangement = Arrangement.SpaceAround,
- modifier = Modifier.height(270.dp)
+ modifier = Modifier.heightIn(min = 270.dp)
) {
// Icon
Image(
diff --git a/android/app/src/production/res/menu/menu_bottom_nav.xml b/android/app/src/production/res/menu/menu_bottom_nav.xml
index 29fc747..75f56b2 100644
--- a/android/app/src/production/res/menu/menu_bottom_nav.xml
+++ b/android/app/src/production/res/menu/menu_bottom_nav.xml
@@ -8,10 +8,15 @@
android:id="@+id/nav_history"
android:icon="@drawable/ic_history"
android:title="@string/bottom_nav_history"
- />
+ />
+
+ />
\ No newline at end of file
diff --git a/android/app/src/production/res/values/styles.xml b/android/app/src/production/res/values/styles.xml
index c95f382..fa1169f 100644
--- a/android/app/src/production/res/values/styles.xml
+++ b/android/app/src/production/res/values/styles.xml
@@ -1,11 +1,11 @@
-