Repository: Adyen/adyen-android
Pull request #2071: Setup UI module
Author: login: OscarSpruit
Labels: name: Chore
description: [PRs only] Indicates any task that does not need to be mentioned in the public release notes
Created: 2025-04-10T10:38:49Z | Merged: 2025-04-14T08:44:42Z

## Description
Setup UI module

COAND-1084


Diff:
diff --git a/settings.gradle b/settings.gradle
index 75c21c3575..3845b42ede 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -69,6 +69,7 @@ include ':3ds2',
         ':test-core',
         ':twint',
         ':twint-action',
+        ':ui',
         ':ui-core',
         ':upi',
         ':voucher',
diff --git a/ui/api/ui.api b/ui/api/ui.api
new file mode 100644
index 0000000000..9479824700
--- /dev/null
+++ b/ui/api/ui.api
@@ -0,0 +1,8 @@
+public final class com/adyen/checkout/ui/core/BuildConfig {
+	public static final field BUILD_TYPE Ljava/lang/String;
+	public static final field CHECKOUT_VERSION Ljava/lang/String;
+	public static final field DEBUG Z
+	public static final field LIBRARY_PACKAGE_NAME Ljava/lang/String;
+	public fun <init> ()V
+}
+
diff --git a/ui/build.gradle b/ui/build.gradle
new file mode 100644
index 0000000000..bfe956874b
--- /dev/null
+++ b/ui/build.gradle
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2025 Adyen N.V.
+ *
+ * This file is open source and available under the MIT license. See the LICENSE file for more info.
+ *
+ * Created by oscars on 10/4/2025.
+ */
+
+plugins {
+    alias libs.plugins.android.library
+    alias libs.plugins.kotlin.android
+    alias libs.plugins.kotlin.parcelize
+}
+
+// Maven artifact
+ext.mavenArtifactId = "ui"
+ext.mavenArtifactName = "Adyen Checkout UI"
+ext.mavenArtifactDescription = "UI and styling foundation for Adyen Checkout."
+
+apply from: "${rootDir}/config/gradle/sharedTasks.gradle"
+
+android {
+    namespace 'com.adyen.checkout.ui.core'
+    compileSdk libs.versions.compile.sdk.get().toInteger()
+
+    defaultConfig {
+        minSdk libs.versions.min.sdk.get().toInteger()
+        targetSdk libs.versions.target.sdk.get().toInteger()
+
+        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
+        consumerProguardFiles "consumer-rules.pro"
+    }
+}
+
+dependencies {
+
+}
diff --git a/ui/consumer-rules.pro b/ui/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/ui/src/main/AndroidManifest.xml b/ui/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..792194c7b0
--- /dev/null
+++ b/ui/src/main/AndroidManifest.xml
@@ -0,0 +1,9 @@
+<!--
+  ~ Copyright (c) 2025 Adyen N.V.
+  ~
+  ~ This file is open source and available under the MIT license. See the LICENSE file for more info.
+  ~
+  ~ Created by oscars on 10/4/2025.
+  -->
+
+<manifest />
diff --git a/ui/src/main/java/com/adyen/checkout/ui/Placeholder.kt b/ui/src/main/java/com/adyen/checkout/ui/Placeholder.kt
new file mode 100644
index 0000000000..bb91fb2f81
--- /dev/null
+++ b/ui/src/main/java/com/adyen/checkout/ui/Placeholder.kt
@@ -0,0 +1,12 @@
+/*
+ * Copyright (c) 2025 Adyen N.V.
+ *
+ * This file is open source and available under the MIT license. See the LICENSE file for more info.
+ *
+ * Created by oscars on 10/4/2025.
+ */
+
+package com.adyen.checkout.ui
+
+@Suppress("UnusedPrivateClass")
+private class Placeholder


Reviews:
user: login: araratthehero
body: Looks good to me.
After fixing the detekt issue, it can be merged.
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T07:25:48Z
user: login: araratthehero
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T07:27:19Z
user: login: OscarSpruit
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T08:05:14Z
user: login: github-actions[bot]
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T08:07:58Z
user: login: ozgur00
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T08:39:56Z

Review comments:
path: settings.gradle
user: login: araratthehero
body: @OscarSpruit Is it possible to remove the newly added dependencies?
created_at: 2025-04-14T07:27:18Z
author_association: CONTRIBUTOR
path: settings.gradle
user: login: OscarSpruit
body: Hmm I didn't explicitly add any dependencies, so I guess these are the lowest versions either defined by us or the android plugin. Those should be overridden once explicit dependencies are added, so I think it's okay to leave it like this
created_at: 2025-04-14T08:05:14Z
author_association: CONTRIBUTOR
path: settings.gradle
user: login: github-actions[bot]
body: Some dependencies have been modified in this PR, review the modifications in the comments before merging.

<!-- dependency-check-comment-tag -->
created_at: 2025-04-14T08:07:58Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-04-14T08:07:55Z
body: The following dependencies have been modified in this PR:
```diff
--- 
+++ 
@@ -122,6 +122,7 @@
 org.jetbrains.kotlin:kotlin-stdlib-common:2.0.20
 org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.10
 org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.10
+org.jetbrains.kotlin:kotlin-stdlib:1.9.25
 org.jetbrains.kotlin:kotlin-stdlib:2.0.0
 org.jetbrains.kotlin:kotlin-stdlib:2.0.20
 org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0
@@ -136,6 +137,7 @@
 org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3
 org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3
 org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3
+org.jetbrains:annotations:13.0
 org.jetbrains:annotations:23.0.0
 project :3ds2
 project :ach

```
To check the affected modules run the `dependencyList` gradle task with `includeModules=true`.
    
<!-- thollander/actions-comment-pull-request "dependency_changes" -->
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-14T08:10:04Z
body: # ✅ No public API changes

<!-- thollander/actions-comment-pull-request "api_changes" -->
author_association: CONTRIBUTOR
user: login: sonarqubecloud[bot]
created_at: 2025-04-14T08:15:18Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=Adyen_adyen-android&pullRequest=2071) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=Adyen_adyen-android&pullRequest=2071&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=Adyen_adyen-android&pullRequest=2071&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=Adyen_adyen-android&pullRequest=2071&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=Adyen_adyen-android&pullRequest=2071&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=Adyen_adyen-android&pullRequest=2071&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=Adyen_adyen-android&pullRequest=2071)


author_association: NONE