summaryrefslogtreecommitdiffstats
path: root/mobile/android/android-components/components/compose/engine
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-15 03:35:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-15 03:35:49 +0000
commitd8bbc7858622b6d9c278469aab701ca0b609cddf (patch)
treeeff41dc61d9f714852212739e6b3738b82a2af87 /mobile/android/android-components/components/compose/engine
parentReleasing progress-linux version 125.0.3-1~progress7.99u1. (diff)
downloadfirefox-d8bbc7858622b6d9c278469aab701ca0b609cddf.tar.xz
firefox-d8bbc7858622b6d9c278469aab701ca0b609cddf.zip
Merging upstream version 126.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mobile/android/android-components/components/compose/engine')
-rw-r--r--mobile/android/android-components/components/compose/engine/README.md19
-rw-r--r--mobile/android/android-components/components/compose/engine/build.gradle61
-rw-r--r--mobile/android/android-components/components/compose/engine/proguard-rules.pro21
-rw-r--r--mobile/android/android-components/components/compose/engine/src/main/AndroidManifest.xml4
-rw-r--r--mobile/android/android-components/components/compose/engine/src/main/java/mozilla/components/compose/engine/WebContent.kt62
-rw-r--r--mobile/android/android-components/components/compose/engine/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker2
-rw-r--r--mobile/android/android-components/components/compose/engine/src/test/resources/robolectric.properties1
7 files changed, 170 insertions, 0 deletions
diff --git a/mobile/android/android-components/components/compose/engine/README.md b/mobile/android/android-components/components/compose/engine/README.md
new file mode 100644
index 0000000000..4ea4cd1be2
--- /dev/null
+++ b/mobile/android/android-components/components/compose/engine/README.md
@@ -0,0 +1,19 @@
+# [Android Components](../../../README.md) > Compose > Engine
+
+A component for integrating a `concept-engine` implementation into Jetpack Compose UI.
+
+## Usage
+
+### Setting up the dependency
+
+Use Gradle to download the library from [maven.mozilla.org](https://maven.mozilla.org/) ([Setup repository](../../../README.md#maven-repository)):
+
+```Groovy
+implementation "org.mozilla.components:compose-engine:{latest-version}"
+```
+
+## License
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/
diff --git a/mobile/android/android-components/components/compose/engine/build.gradle b/mobile/android/android-components/components/compose/engine/build.gradle
new file mode 100644
index 0000000000..5bbeb6d699
--- /dev/null
+++ b/mobile/android/android-components/components/compose/engine/build.gradle
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+
+android {
+ defaultConfig {
+ minSdkVersion config.minSdkVersion
+ compileSdk config.compileSdkVersion
+ targetSdkVersion config.targetSdkVersion
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ buildFeatures {
+ compose true
+ }
+
+ composeOptions {
+ kotlinCompilerExtensionVersion = Versions.compose_compiler
+ }
+
+ namespace 'mozilla.components.compose.engine'
+}
+
+dependencies {
+ implementation project(":browser-state")
+ implementation project(":concept-engine")
+ implementation project(":support-ktx")
+
+ implementation ComponentsDependencies.androidx_compose_ui
+ implementation ComponentsDependencies.androidx_compose_ui_tooling_preview
+ implementation ComponentsDependencies.androidx_compose_foundation
+ implementation ComponentsDependencies.androidx_compose_material
+
+ debugImplementation ComponentsDependencies.androidx_compose_ui_tooling
+
+ testImplementation project(':support-test')
+ testImplementation ComponentsDependencies.androidx_compose_ui_test
+ testImplementation ComponentsDependencies.androidx_test_core
+ testImplementation ComponentsDependencies.androidx_test_junit
+ testImplementation ComponentsDependencies.testing_robolectric
+
+ androidTestImplementation ComponentsDependencies.androidx_test_junit
+ androidTestImplementation ComponentsDependencies.androidx_compose_ui_test_manifest
+ androidTestImplementation ComponentsDependencies.androidx_compose_ui_test
+ androidTestImplementation ComponentsDependencies.testing_mockito
+}
+
+apply from: '../../../android-lint.gradle'
+apply from: '../../../publish.gradle'
+ext.configurePublish(config.componentsGroupId, archivesBaseName, project.ext.description)
diff --git a/mobile/android/android-components/components/compose/engine/proguard-rules.pro b/mobile/android/android-components/components/compose/engine/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/mobile/android/android-components/components/compose/engine/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/mobile/android/android-components/components/compose/engine/src/main/AndroidManifest.xml b/mobile/android/android-components/components/compose/engine/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..e16cda1d34
--- /dev/null
+++ b/mobile/android/android-components/components/compose/engine/src/main/AndroidManifest.xml
@@ -0,0 +1,4 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<manifest />
diff --git a/mobile/android/android-components/components/compose/engine/src/main/java/mozilla/components/compose/engine/WebContent.kt b/mobile/android/android-components/components/compose/engine/src/main/java/mozilla/components/compose/engine/WebContent.kt
new file mode 100644
index 0000000000..0d2bfb02f1
--- /dev/null
+++ b/mobile/android/android-components/components/compose/engine/src/main/java/mozilla/components/compose/engine/WebContent.kt
@@ -0,0 +1,62 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package mozilla.components.compose.engine
+
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.viewinterop.AndroidView
+import mozilla.components.browser.state.action.EngineAction
+import mozilla.components.browser.state.helper.Target
+import mozilla.components.browser.state.store.BrowserStore
+import mozilla.components.concept.engine.Engine
+import mozilla.components.concept.engine.EngineView
+
+/**
+ * Composes an [EngineView] obtained from the given [Engine] and renders the web content of the
+ * [target] from the [store] on it.
+ */
+@Composable
+fun WebContent(
+ engine: Engine,
+ store: BrowserStore,
+ target: Target,
+) {
+ val selectedTab = target.observeAsComposableStateFrom(
+ store = store,
+ observe = { tab ->
+ // Render if the tab itself changed or when the state of the linked engine session changes
+ arrayOf(
+ tab?.id,
+ tab?.engineState?.engineSession,
+ tab?.engineState?.crashed,
+ tab?.content?.firstContentfulPaint,
+ )
+ },
+ )
+
+ AndroidView(
+ modifier = Modifier.fillMaxSize(),
+ factory = { context -> engine.createView(context).asView() },
+ update = { view ->
+ val engineView = view as EngineView
+
+ val tab = selectedTab.value
+ if (tab == null) {
+ engineView.release()
+ } else {
+ val session = tab.engineState.engineSession
+ if (session == null) {
+ // This tab does not have an EngineSession that we can render yet. Let's dispatch an
+ // action to request creating one. Once one was created and linked to this session, this
+ // method will get invoked again.
+ store.dispatch(EngineAction.CreateEngineSessionAction(tab.id))
+ } else {
+ engineView.render(session)
+ }
+ }
+ },
+ )
+}
diff --git a/mobile/android/android-components/components/compose/engine/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/mobile/android/android-components/components/compose/engine/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
new file mode 100644
index 0000000000..cf1c399ea8
--- /dev/null
+++ b/mobile/android/android-components/components/compose/engine/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
@@ -0,0 +1,2 @@
+mock-maker-inline
+// This allows mocking final classes (classes are final by default in Kotlin)
diff --git a/mobile/android/android-components/components/compose/engine/src/test/resources/robolectric.properties b/mobile/android/android-components/components/compose/engine/src/test/resources/robolectric.properties
new file mode 100644
index 0000000000..932b01b9eb
--- /dev/null
+++ b/mobile/android/android-components/components/compose/engine/src/test/resources/robolectric.properties
@@ -0,0 +1 @@
+sdk=28