diff --git a/SampleApplications/AndroidApp/build.gradle b/SampleApplications/AndroidApp/build.gradle
new file mode 100644
index 00000000..f7eeabac
--- /dev/null
+++ b/SampleApplications/AndroidApp/build.gradle
@@ -0,0 +1,44 @@
+plugins {
+ id 'com.android.application'
+ id 'kotlin-android'
+}
+
+android {
+ compileSdk 31
+
+ defaultConfig {
+ applicationId "net.codinux.banking.fints4k.android"
+ minSdk 21
+ targetSdk 31
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+ buildFeatures {
+ viewBinding true
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.0.0'
+ implementation 'com.google.android.material:material:1.0.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ implementation 'androidx.navigation:navigation-fragment-ktx:2.0.0-rc02'
+ implementation 'androidx.navigation:navigation-ui-ktx:2.0.0-rc02'
+}
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/proguard-rules.pro b/SampleApplications/AndroidApp/proguard-rules.pro
new file mode 100644
index 00000000..481bb434
--- /dev/null
+++ b/SampleApplications/AndroidApp/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
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/AndroidManifest.xml b/SampleApplications/AndroidApp/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..893fcd62
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/AndroidManifest.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/FirstFragment.kt b/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/FirstFragment.kt
new file mode 100644
index 00000000..89e259f8
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/FirstFragment.kt
@@ -0,0 +1,44 @@
+package net.codinux.banking.fints4k.android
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.navigation.fragment.findNavController
+import net.codinux.banking.fints4k.android.databinding.FragmentFirstBinding
+
+/**
+ * A simple [Fragment] subclass as the default destination in the navigation.
+ */
+class FirstFragment : Fragment() {
+
+ private var _binding: FragmentFirstBinding? = null
+
+ // This property is only valid between onCreateView and
+ // onDestroyView.
+ private val binding get() = _binding!!
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+
+ _binding = FragmentFirstBinding.inflate(inflater, container, false)
+ return binding.root
+
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ binding.buttonFirst.setOnClickListener {
+ findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
+ }
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/MainActivity.kt b/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/MainActivity.kt
new file mode 100644
index 00000000..29005f9b
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/MainActivity.kt
@@ -0,0 +1,58 @@
+package net.codinux.banking.fints4k.android
+
+import android.os.Bundle
+import com.google.android.material.snackbar.Snackbar
+import androidx.appcompat.app.AppCompatActivity
+import androidx.navigation.findNavController
+import androidx.navigation.ui.AppBarConfiguration
+import androidx.navigation.ui.navigateUp
+import androidx.navigation.ui.setupActionBarWithNavController
+import android.view.Menu
+import android.view.MenuItem
+import net.codinux.banking.fints4k.android.databinding.ActivityMainBinding
+
+class MainActivity : AppCompatActivity() {
+
+ private lateinit var appBarConfiguration: AppBarConfiguration
+ private lateinit var binding: ActivityMainBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ setSupportActionBar(binding.toolbar)
+
+ val navController = findNavController(R.id.nav_host_fragment_content_main)
+ appBarConfiguration = AppBarConfiguration(navController.graph)
+ setupActionBarWithNavController(navController, appBarConfiguration)
+
+ binding.fab.setOnClickListener { view ->
+ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
+ .setAction("Action", null).show()
+ }
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ menuInflater.inflate(R.menu.menu_main, menu)
+ return true
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ return when (item.itemId) {
+ R.id.action_settings -> true
+ else -> super.onOptionsItemSelected(item)
+ }
+ }
+
+ override fun onSupportNavigateUp(): Boolean {
+ val navController = findNavController(R.id.nav_host_fragment_content_main)
+ return navController.navigateUp(appBarConfiguration)
+ || super.onSupportNavigateUp()
+ }
+}
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/SecondFragment.kt b/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/SecondFragment.kt
new file mode 100644
index 00000000..4ced8d5b
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/java/net/codinux/banking/fints4k/android/SecondFragment.kt
@@ -0,0 +1,44 @@
+package net.codinux.banking.fints4k.android
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.navigation.fragment.findNavController
+import net.codinux.banking.fints4k.android.databinding.FragmentSecondBinding
+
+/**
+ * A simple [Fragment] subclass as the second destination in the navigation.
+ */
+class SecondFragment : Fragment() {
+
+ private var _binding: FragmentSecondBinding? = null
+
+ // This property is only valid between onCreateView and
+ // onDestroyView.
+ private val binding get() = _binding!!
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+
+ _binding = FragmentSecondBinding.inflate(inflater, container, false)
+ return binding.root
+
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ binding.buttonSecond.setOnClickListener {
+ findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment)
+ }
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+}
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/SampleApplications/AndroidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 00000000..1ee14938
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/drawable/ic_launcher_background.xml b/SampleApplications/AndroidApp/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000..956b344d
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SampleApplications/AndroidApp/src/main/res/layout/activity_main.xml b/SampleApplications/AndroidApp/src/main/res/layout/activity_main.xml
new file mode 100644
index 00000000..5e1143ec
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/layout/activity_main.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/layout/content_main.xml b/SampleApplications/AndroidApp/src/main/res/layout/content_main.xml
new file mode 100644
index 00000000..f2418499
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/layout/content_main.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/layout/fragment_first.xml b/SampleApplications/AndroidApp/src/main/res/layout/fragment_first.xml
new file mode 100644
index 00000000..eea7f450
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/layout/fragment_first.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/layout/fragment_second.xml b/SampleApplications/AndroidApp/src/main/res/layout/fragment_second.xml
new file mode 100644
index 00000000..d513ae92
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/layout/fragment_second.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/menu/menu_main.xml b/SampleApplications/AndroidApp/src/main/res/menu/menu_main.xml
new file mode 100644
index 00000000..f39da1a3
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/menu/menu_main.xml
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/SampleApplications/AndroidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000..bbd3e021
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/SampleApplications/AndroidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000..bbd3e021
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-hdpi/ic_launcher.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 00000000..c209e78e
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..b2dfe3d1
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-mdpi/ic_launcher.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 00000000..4f0f1d64
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..62b611da
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 00000000..948a3070
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..1b9a6956
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 00000000..28d4b77f
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..9287f508
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 00000000..aa7d6427
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/SampleApplications/AndroidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..9126ae37
Binary files /dev/null and b/SampleApplications/AndroidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/SampleApplications/AndroidApp/src/main/res/navigation/nav_graph.xml b/SampleApplications/AndroidApp/src/main/res/navigation/nav_graph.xml
new file mode 100644
index 00000000..f6864894
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/navigation/nav_graph.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/values-land/dimens.xml b/SampleApplications/AndroidApp/src/main/res/values-land/dimens.xml
new file mode 100644
index 00000000..22d7f004
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/values-land/dimens.xml
@@ -0,0 +1,3 @@
+
+ 48dp
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/values-night/themes.xml b/SampleApplications/AndroidApp/src/main/res/values-night/themes.xml
new file mode 100644
index 00000000..afa257fb
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/values-night/themes.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/values-w1240dp/dimens.xml b/SampleApplications/AndroidApp/src/main/res/values-w1240dp/dimens.xml
new file mode 100644
index 00000000..d73f4a35
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/values-w1240dp/dimens.xml
@@ -0,0 +1,3 @@
+
+ 200dp
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/values-w600dp/dimens.xml b/SampleApplications/AndroidApp/src/main/res/values-w600dp/dimens.xml
new file mode 100644
index 00000000..22d7f004
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/values-w600dp/dimens.xml
@@ -0,0 +1,3 @@
+
+ 48dp
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/values/colors.xml b/SampleApplications/AndroidApp/src/main/res/values/colors.xml
new file mode 100644
index 00000000..f8c6127d
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/values/dimens.xml b/SampleApplications/AndroidApp/src/main/res/values/dimens.xml
new file mode 100644
index 00000000..125df871
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/values/dimens.xml
@@ -0,0 +1,3 @@
+
+ 16dp
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/values/strings.xml b/SampleApplications/AndroidApp/src/main/res/values/strings.xml
new file mode 100644
index 00000000..43e62b1f
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/values/strings.xml
@@ -0,0 +1,12 @@
+
+ fints4k Android
+ Settings
+
+ First Fragment
+ Second Fragment
+ Next
+ Previous
+
+ Hello first fragment
+ Hello second fragment. Arg: %1$s
+
\ No newline at end of file
diff --git a/SampleApplications/AndroidApp/src/main/res/values/themes.xml b/SampleApplications/AndroidApp/src/main/res/values/themes.xml
new file mode 100644
index 00000000..3e76cd8e
--- /dev/null
+++ b/SampleApplications/AndroidApp/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index d9a44c4f..2a325761 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,10 +29,9 @@ buildscript {
}
dependencies {
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
- // Nexus staging plugin has to be downgraded to 0.10.0 to be applicable to sub projects, see https://github.com/UweTrottmann/SeriesGuide/commit/ca33e8ad2fa6cc5c426450c8aef3417ba073ca7f
- classpath "io.codearte.gradle.nexus:gradle-nexus-staging-plugin:0.10.0"
+ classpath "com.android.tools.build:gradle:7.0.0"
}
}
diff --git a/gradle.properties b/gradle.properties
index 155302ba..53ea2e0d 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -8,4 +8,7 @@ org.gradle.jvmargs=-Xmx3072m
kotlinVersion=1.6.0
coroutinesVersion=1.6.0
-ktorVersion=2.0.0-beta-1
\ No newline at end of file
+ktorVersion=2.0.0-beta-1
+
+android.useAndroidX=true
+android.enableJetifier=true
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index c9ff7a07..e35f1a51 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -11,3 +11,9 @@ rootProject.name = "fints4kProject"
include ":fints4k"
include ":multiplatform-utils"
+
+
+// Sample applications
+
+include("SampleApplications:AndroidApp")
+findProject(":SampleApplications:AndroidApp")?.name = "AndroidApp"