diff --git a/androidApp/build.gradle b/androidApp/build.gradle deleted file mode 100644 index 1d59c15..0000000 --- a/androidApp/build.gradle +++ /dev/null @@ -1,66 +0,0 @@ -plugins{ - alias(libs.plugins.androidApplication) - alias(libs.plugins.kotlinAndroid) - alias(libs.plugins.compose.compiler) -} - -android { - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - signingConfigs { - release { - storeFile file("../default_key_store.jks") - storePassword "mifos1234" - keyAlias "mifos-passcode" - keyPassword "mifos1234" - } - } - compileSdk 35 - defaultConfig { - namespace "com.mifos.passcode" - minSdk 24 - targetSdk 35 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - buildTypes { - release { - signingConfig signingConfigs.release - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - buildFeatures { - compose true - } - composeOptions { - kotlinCompilerExtensionVersion = "1.5.2" - } - kotlinOptions { - jvmTarget = '17' - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation(project(":compose")) - implementation project(':shared') - implementation(libs.compose.ui) - implementation(libs.compose.ui.tooling.preview) - implementation(libs.compose.material3) - implementation(libs.androidx.activity.compose) - implementation libs.androidx.appcompat - debugImplementation(libs.compose.ui.tooling) - implementation (libs.androidx.navigation.compose.v276) - implementation (libs.androidx.biometric) -} -repositories { - mavenCentral() -} - -configurations.implementation { - exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8' -} diff --git a/androidApp/src/main/java/com/mifos/passcode/MainActivity.kt b/androidApp/src/main/java/com/mifos/passcode/MainActivity.kt deleted file mode 100644 index f5430c3..0000000 --- a/androidApp/src/main/java/com/mifos/passcode/MainActivity.kt +++ /dev/null @@ -1,80 +0,0 @@ -package com.mifos.passcode - -import android.content.Intent -import android.os.Bundle -import androidx.activity.compose.setContent -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.fragment.app.FragmentActivity -import com.mifos.shared.BiometricUtilAndroidImpl -import com.mifos.shared.CipherUtilAndroidImpl -import com.mifos.shared.utility.PreferenceManager -import com.mifos.shared.PasscodeRepository -import com.mifos.shared.PasscodeRepositoryImpl -import com.mifos.shared.viewmodels.BiometricAuthorizationViewModel -import androidx.lifecycle.viewmodel.compose.viewModel -import com.mifos.shared.component.PasscodeScreen - - -class MainActivity : FragmentActivity() { - private val bioMetricUtil by lazy { - BiometricUtilAndroidImpl(this, CipherUtilAndroidImpl()) - } - private lateinit var passcodeRepository: PasscodeRepository - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - bioMetricUtil.preparePrompt( - title= getString(R.string.biometric_auth_title), - subtitle = "", - description = getString(R.string.biometric_auth_description) - ) - passcodeRepository = PasscodeRepositoryImpl(PreferenceManager()) - setContent { - val biometricViewModel: BiometricAuthorizationViewModel = viewModel() - - PasscodeScreen( - onForgotButton = { onPasscodeForgot() }, - onSkipButton = { onPasscodeSkip() }, - onPasscodeConfirm = { onPassCodeReceive(it) }, - onPasscodeRejected = { onPasscodeReject() }, - bioMetricUtil = bioMetricUtil, - biometricAuthorizationViewModel = biometricViewModel, - onBiometricAuthSuccess = { launchNextActivity() } - ) - } - } - - private fun onPassCodeReceive(passcode: String) { - if (passcodeRepository.getSavedPasscode() == passcode) { - launchNextActivity() - } - } - - private fun onPasscodeReject() {} - - private fun onPasscodeForgot() { - // Add logic to redirect user to login page - } - - private fun onPasscodeSkip() { - finish() - } - - private fun launchNextActivity() { - startActivity(Intent(this, LoginActivity::class.java)) - finish() - } -} -@Composable -fun GreetingView(text: String) { - Text(text = text) -} - -//@Preview -//@Composable -//fun DefaultPreview() { -// MyApplicationTheme { -// GreetingView("Hello, Android!") -// } -//} \ No newline at end of file diff --git a/androidApp/src/main/res/values/strings.xml b/androidApp/src/main/res/values/strings.xml deleted file mode 100644 index bf3e104..0000000 --- a/androidApp/src/main/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - mobile_passcode - Login - Unlock Mifos - Confirm your screen lock pattern, PIN, password, or fingerprint to unlock - diff --git a/androidApp/.gitignore b/app/.gitignore similarity index 100% rename from androidApp/.gitignore rename to app/.gitignore diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..439e5e4 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,81 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'com.google.devtools.ksp' +apply plugin: 'com.google.dagger.hilt.android' + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + signingConfigs { + release { + storeFile file("../default_key_store.jks") + storePassword "mifos1234" + keyAlias "mifos-passcode" + keyPassword "mifos1234" + } + } + compileSdk 34 + defaultConfig { + namespace "com.mifos.passcode" + minSdk 21 + targetSdk 34 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + signingConfig signingConfigs.release + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + buildFeatures { + compose true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.2" + } + kotlinOptions { + jvmTarget = '17' + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.6.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test:runner:1.6.0-alpha04' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.0-alpha01' + implementation project(':mifos-passcode') + //implementation 'com.mifos.mobile:mifos-passcode:1.0.0' + implementation "androidx.core:core-ktx:+" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + implementation(project(":compose")) + + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") + implementation("androidx.activity:activity-compose:1.8.2") + implementation(platform("androidx.compose:compose-bom:2023.03.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3") + debugImplementation 'androidx.compose.ui:ui-tooling' + debugImplementation 'androidx.compose.ui:ui-test-manifest' + + + // Hilt Implementation + implementation 'com.google.dagger:hilt-android:2.48.1' + ksp("com.google.dagger:hilt-compiler:2.48.1") +} +repositories { + mavenCentral() +} + +configurations.implementation { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8' +} diff --git a/androidApp/proguard-rules.pro b/app/proguard-rules.pro similarity index 100% rename from androidApp/proguard-rules.pro rename to app/proguard-rules.pro diff --git a/androidApp/src/androidTest/java/com/mifos/passcode/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/mifos/passcode/ExampleInstrumentedTest.java similarity index 100% rename from androidApp/src/androidTest/java/com/mifos/passcode/ExampleInstrumentedTest.java rename to app/src/androidTest/java/com/mifos/passcode/ExampleInstrumentedTest.java diff --git a/androidApp/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml similarity index 88% rename from androidApp/src/main/AndroidManifest.xml rename to app/src/main/AndroidManifest.xml index 58ef7ed..46b319e 100644 --- a/androidApp/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,8 +7,9 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" + android:name=".MifosApplication" android:theme="@style/AppTheme" > - diff --git a/app/src/main/java/com/mifos/passcode/BaseActivity.kt b/app/src/main/java/com/mifos/passcode/BaseActivity.kt new file mode 100644 index 0000000..7160e67 --- /dev/null +++ b/app/src/main/java/com/mifos/passcode/BaseActivity.kt @@ -0,0 +1,12 @@ +package com.mifos.passcode + +import com.mifos.mobile.passcode.BasePassCodeActivity + +/** + * Created by dilpreet on 19/01/18. + */ +class BaseActivity : BasePassCodeActivity() { + override val passCodeClass: Class<*> + get() =//name of the activity which extends MifosPassCodeActivity + PassCodeActivity::class.java +} \ No newline at end of file diff --git a/androidApp/src/main/java/com/mifos/passcode/LoginActivity.kt b/app/src/main/java/com/mifos/passcode/LoginActivity.kt similarity index 100% rename from androidApp/src/main/java/com/mifos/passcode/LoginActivity.kt rename to app/src/main/java/com/mifos/passcode/LoginActivity.kt diff --git a/app/src/main/java/com/mifos/passcode/MifosApplication.kt b/app/src/main/java/com/mifos/passcode/MifosApplication.kt new file mode 100644 index 0000000..8b33a7c --- /dev/null +++ b/app/src/main/java/com/mifos/passcode/MifosApplication.kt @@ -0,0 +1,18 @@ +package com.mifos.passcode + +import android.app.Application +import com.mifos.mobile.passcode.utils.ForegroundChecker.Companion.init +import dagger.hilt.android.HiltAndroidApp + +/** + * Created by dilpreet on 19/01/18. + */ + +@HiltAndroidApp +class MifosApplication : Application() { + override fun onCreate() { + super.onCreate() + //need to initialize this + init(this) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mifos/passcode/PassCodeActivity.kt b/app/src/main/java/com/mifos/passcode/PassCodeActivity.kt new file mode 100644 index 0000000..21251d1 --- /dev/null +++ b/app/src/main/java/com/mifos/passcode/PassCodeActivity.kt @@ -0,0 +1,57 @@ +package com.mifos.passcode + +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.activity.compose.setContent +import androidx.appcompat.app.AppCompatActivity +import com.mifos.compose.PasscodeRepository +import com.mifos.compose.component.PasscodeScreen +import com.mifos.compose.theme.MifosPasscodeTheme +import com.mifos.compose.utility.PreferenceManager +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +/** + * Created by dilpreet on 19/01/18. + */ +@AndroidEntryPoint +class PassCodeActivity : AppCompatActivity() { + + @Inject + lateinit var passcodeRepository: PasscodeRepository + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + MifosPasscodeTheme { + PasscodeScreen( + onForgotButton = { onPasscodeForgot() }, + onSkipButton = { onPasscodeSkip() }, + onPasscodeConfirm = { onPassCodeReceive(it) }, + onPasscodeRejected = { onPasscodeReject() } + ) + } + } + } + + private fun onPassCodeReceive(passcode: String) { + if (passcodeRepository.getSavedPasscode() == passcode) { + startActivity(Intent(this, LoginActivity::class.java)) + Toast.makeText(this, "New Screen", Toast.LENGTH_SHORT).show() + finish() + } + } + + private fun onPasscodeReject() {} + + private fun onPasscodeForgot() { + // Add logic to redirect user to login page + Toast.makeText(this, "Forgot Passcode", Toast.LENGTH_SHORT).show() + } + + private fun onPasscodeSkip() { + Toast.makeText(this, "Skip Button", Toast.LENGTH_SHORT).show() + finish() + } +} \ No newline at end of file diff --git a/androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from androidApp/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/androidApp/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from androidApp/src/main/res/drawable/ic_launcher_background.xml rename to app/src/main/res/drawable/ic_launcher_background.xml diff --git a/androidApp/src/main/res/drawable/mifos_logo.jpg b/app/src/main/res/drawable/mifos_logo.jpg similarity index 100% rename from androidApp/src/main/res/drawable/mifos_logo.jpg rename to app/src/main/res/drawable/mifos_logo.jpg diff --git a/androidApp/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml similarity index 100% rename from androidApp/src/main/res/layout/activity_login.xml rename to app/src/main/res/layout/activity_login.xml diff --git a/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from androidApp/src/main/res/mipmap-hdpi/ic_launcher.png rename to app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from androidApp/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from androidApp/src/main/res/mipmap-mdpi/ic_launcher.png rename to app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from androidApp/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from androidApp/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from androidApp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/androidApp/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml similarity index 100% rename from androidApp/src/main/res/values/colors.xml rename to app/src/main/res/values/colors.xml diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..69c4f03 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + mobile_passcode + Login + diff --git a/androidApp/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml similarity index 100% rename from androidApp/src/main/res/values/styles.xml rename to app/src/main/res/values/styles.xml diff --git a/androidApp/src/test/java/com/mifos/passcode/ExampleUnitTest.java b/app/src/test/java/com/mifos/passcode/ExampleUnitTest.java similarity index 100% rename from androidApp/src/test/java/com/mifos/passcode/ExampleUnitTest.java rename to app/src/test/java/com/mifos/passcode/ExampleUnitTest.java diff --git a/build.gradle b/build.gradle index 6652e41..0e6bf33 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + buildscript { ext.kotlin_version = '1.7.20' @@ -8,27 +10,18 @@ buildscript { } dependencies { - classpath libs.gradle - classpath libs.gradle.bintray.plugin - classpath libs.android.maven.gradle.plugin + classpath 'com.android.tools.build:gradle:8.3.1' + classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } - plugins { - //trick: for the same plugin versions in all sub-modules - alias(libs.plugins.androidApplication).apply(false) - alias(libs.plugins.androidLibrary).apply(false) - alias(libs.plugins.kotlinAndroid).apply(false) - alias(libs.plugins.kotlinMultiplatform).apply(false) - alias(libs.plugins.kotlinCocoapods).apply(false) - alias(libs.plugins.compose.compiler).apply(false) - alias(libs.plugins.dagger.hilt).apply(false) - alias(libs.plugins.devToolsKsp).apply(false) + id 'com.google.dagger.hilt.android' version '2.48.1' apply false + id "com.google.devtools.ksp" version "1.9.0-1.0.12" } - allprojects { repositories { google() @@ -40,4 +33,4 @@ allprojects { tasks.register('clean', Delete) { delete rootProject.buildDir -} \ No newline at end of file +} diff --git a/compose/build.gradle b/compose/build.gradle index 3179e9d..d6530bf 100644 --- a/compose/build.gradle +++ b/compose/build.gradle @@ -1,14 +1,13 @@ plugins { - alias(libs.plugins.androidLibrary) - alias(libs.plugins.kotlinAndroid) - alias(libs.plugins.dagger.hilt) - alias(libs.plugins.devToolsKsp) - alias(libs.plugins.compose.compiler) + id 'com.android.library' + id 'org.jetbrains.kotlin.android' + id 'com.google.devtools.ksp' + id 'com.google.dagger.hilt.android' } android { namespace 'com.mifos.compose' - compileSdk 35 + compileSdk 34 defaultConfig { minSdk 21 @@ -40,29 +39,29 @@ android { dependencies { - implementation libs.androidx.core.ktx.v1131 - implementation libs.kotlin.bom.v180 - implementation libs.appcompat - implementation libs.material - implementation project(':shared') - testImplementation libs.junit - androidTestImplementation libs.ext.junit - androidTestImplementation libs.espresso.core - implementation(libs.lifecycle.runtime.ktx) - implementation(libs.androidx.activity.compose.v182) - implementation(libs.compose.bom) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) - implementation(libs.androidx.ui.tooling.preview) - implementation(libs.androidx.material3) - implementation libs.androidx.material.icons.extended - implementation libs.androidx.lifecycle.runtime.compose - debugImplementation libs.androidx.ui.tooling - debugImplementation libs.androidx.ui.test.manifest + implementation 'androidx.core:core-ktx:1.12.0' + implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0') + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.6.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") + implementation("androidx.activity:activity-compose:1.8.2") + implementation(platform("androidx.compose:compose-bom:2023.03.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3") + implementation "androidx.compose.material:material-icons-extended" + implementation "androidx.lifecycle:lifecycle-runtime-compose" + debugImplementation 'androidx.compose.ui:ui-tooling' + debugImplementation 'androidx.compose.ui:ui-test-manifest' // Hilt Implementation - implementation libs.hilt.android - ksp(libs.hilt.compiler) - implementation(libs.androidx.hilt.navigation.compose.v120) + implementation 'com.google.dagger:hilt-android:2.48.1' + ksp("com.google.dagger:hilt-compiler:2.48.1") + implementation("androidx.hilt:hilt-navigation-compose:1.0.0") } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml deleted file mode 100644 index 1e864b0..0000000 --- a/gradle/libs.versions.toml +++ /dev/null @@ -1,114 +0,0 @@ -[versions] -activityComposeVersion = "1.8.2" -agp = "8.3.0" -androidMavenGradlePlugin = "2.1" -androidxNavigationCompose = "2.7.6" -cmpPreference = "1.0.0" -coreKtxVersion = "1.13.1" -espressoCoreVersion = "3.6.0-alpha01" -gradle = "8.3.1" -gradleBintrayPlugin = "1.7.3" -hiltCompiler = "2.48.1" -hiltNavigationComposeVersion = "1.2.0" -kotlin = "2.0.0" -compose = "1.5.4" -compose-material3 = "1.1.2" -androidx-activityCompose = "1.8.0" -kotlinBom = "1.8.0" -kotlinStdlibJdk8 = "1.7.20" -kvault = "1.12.0" -lifecycleViewmodelKtx = "2.8.1" -compose-plugin = "1.6.10" -multiplatformSettings = "1.0.0" -navigationCompose = "2.7.7" -navigationComposeVersion = "2.7.0-alpha07" -dagger-hilt = "2.48.1" -fragmentKtx = "1.8.2" -biometricKtx = "1.1.0" -devToolsKsp = "2.0.10-1.0.24" -coreKtx = "1.12.0" -appcompat = "1.4.1" -material = "1.6.0" -junit = "4.13.2" -extJunit = "1.1.5" -espressoCore = "3.5.1" -lifecycleRuntimeKtx = "2.7.0" -activityCompose = "1.8.2" -composeBom = "2023.03.00" -composeUi = "1.6.8" -material3 = "1.6.8" -hiltAndroid = "2.48.1" -hiltNavigationCompose = "1.0.0" -runner = "1.6.0-alpha04" -sonner = "0.3.8" -uiToolingPreviewAndroid = "1.6.8" -uiAndroid = "1.6.8" -appcompatVersion = "1.7.0" - -[libraries] -android-maven-gradle-plugin = { module = "com.github.dcendents:android-maven-gradle-plugin", version.ref = "androidMavenGradlePlugin" } -androidx-activity-compose-v182 = { module = "androidx.activity:activity-compose", version.ref = "activityComposeVersion" } -androidx-biometric = { module = "androidx.biometric:biometric", version.ref = "biometricKtx" } -androidx-core-ktx-v1131 = { module = "androidx.core:core-ktx", version.ref = "coreKtxVersion" } -androidx-espresso-core-v360alpha01 = { module = "androidx.test.espresso:espresso-core", version.ref = "espressoCoreVersion" } -androidx-hilt-navigation-compose-v120 = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationComposeVersion" } -androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose" } -androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } -androidx-material3 = { module = "androidx.compose.material3:material3" } -androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" } -androidx-navigation-compose-v276 = { module = "androidx.navigation:navigation-compose", version.ref = "androidxNavigationCompose" } -androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } -androidx-ui = { module = "androidx.compose.ui:ui" } -androidx-ui-graphics = { module = "androidx.compose.ui:ui-graphics" } -androidx-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" } -androidx-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } -androidx-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } -cmp-preference = { module = "network.chaintech:cmp-preference", version.ref = "cmpPreference" } -gradle = { module = "com.android.tools.build:gradle", version.ref = "gradle" } -gradle-bintray-plugin = { module = "com.jfrog.bintray.gradle:gradle-bintray-plugin", version.ref = "gradleBintrayPlugin" } -hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hiltCompiler" } -kotlin-bom-v180 = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlinBom" } -kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlinStdlibJdk8" } -kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } -androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activityCompose" } -compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" } -compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" } -compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" } -compose-foundation = { module = "androidx.compose.foundation:foundation", version.ref = "compose" } -compose-material3 = { module = "androidx.compose.material3:material3", version.ref = "compose-material3" } -androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel", version.ref = "lifecycleViewmodelKtx" } -kvault = { module = "com.liftric:kvault", version.ref = "kvault" } -multiplatform-settings-no-arg = { module = "com.russhwolf:multiplatform-settings-no-arg", version.ref = "multiplatformSettings" } -navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigationComposeVersion" } -androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" } -androidx-biometric-ktx = { group = "androidx.biometric", name = "biometric-ktx", version.ref = "biometricKtx" } -core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } -kotlin-bom = { group = "org.jetbrains.kotlin", name = "kotlin-bom", version.ref = "kotlin" } -appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } -material = { group = "com.google.android.material", name = "material", version.ref = "material" } -junit = { group = "junit", name = "junit", version.ref = "junit" } -ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "extJunit" } -espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } -lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" } -compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } -compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics", version.ref = "composeUi" } -material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended", version.ref = "material3" } -lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycleRuntimeKtx" } -sonner = { module = "io.github.dokar3:sonner", version.ref = "sonner" } -ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version.ref = "composeUi" } -hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hiltAndroid" } -hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigationCompose" } -androidx-ui-tooling-preview-android = { group = "androidx.compose.ui", name = "ui-tooling-preview-android", version.ref = "uiToolingPreviewAndroid" } -androidx-ui-android = { group = "androidx.compose.ui", name = "ui-android", version.ref = "uiAndroid" } -androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompatVersion" } - -[plugins] -androidApplication = { id = "com.android.application", version.ref = "agp" } -androidLibrary = { id = "com.android.library", version.ref = "agp" } -kotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } -kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } -devToolsKsp = { id = "com.google.devtools.ksp", version.ref = "devToolsKsp" } -kotlinCocoapods = { id = "org.jetbrains.kotlin.native.cocoapods", version.ref = "kotlin" } -compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } -dagger-hilt = { id = "com.google.dagger.hilt.android", version.ref = "dagger-hilt" } -jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c2239c8..65bc83b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,4 @@ -#Wed Aug 14 15:44:40 IST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip zipStorePath=wrapper/dists diff --git a/iosApp/Podfile b/iosApp/Podfile deleted file mode 100644 index 3fd8aca..0000000 --- a/iosApp/Podfile +++ /dev/null @@ -1,5 +0,0 @@ -target 'iosApp' do - use_frameworks! - platform :ios, '16.0' - pod 'shared', :path => '../shared' -end \ No newline at end of file diff --git a/iosApp/Podfile.lock b/iosApp/Podfile.lock deleted file mode 100644 index d2bfea5..0000000 --- a/iosApp/Podfile.lock +++ /dev/null @@ -1,16 +0,0 @@ -PODS: - - shared (1.0) - -DEPENDENCIES: - - shared (from `../shared`) - -EXTERNAL SOURCES: - shared: - :path: "../shared" - -SPEC CHECKSUMS: - shared: 476f8f613e223c690e3b4311f65291534e4fa034 - -PODFILE CHECKSUM: 78d6cc1b71b232202c48a29d4e6c34972c534c73 - -COCOAPODS: 1.15.2 diff --git a/iosApp/Pods/Local Podspecs/shared.podspec.json b/iosApp/Pods/Local Podspecs/shared.podspec.json deleted file mode 100644 index 7620349..0000000 --- a/iosApp/Pods/Local Podspecs/shared.podspec.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "shared", - "version": "1.0", - "homepage": "Link to the Shared Module homepage", - "source": { - "http": "" - }, - "authors": "", - "license": "", - "summary": "Some description for the Shared Module", - "vendored_frameworks": "build/cocoapods/framework/shared.framework", - "libraries": "c++", - "platforms": { - "ios": "16.0" - }, - "xcconfig": { - "ENABLE_USER_SCRIPT_SANDBOXING": "NO" - }, - "pod_target_xcconfig": { - "KOTLIN_PROJECT_PATH": ":shared", - "PRODUCT_MODULE_NAME": "shared" - }, - "script_phases": [ - { - "name": "Build shared", - "execution_position": "before_compile", - "shell_path": "/bin/sh", - "script": " if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n" - } - ], - "resources": [ - "build/compose/cocoapods/compose-resources" - ] -} diff --git a/iosApp/Pods/Manifest.lock b/iosApp/Pods/Manifest.lock deleted file mode 100644 index d2bfea5..0000000 --- a/iosApp/Pods/Manifest.lock +++ /dev/null @@ -1,16 +0,0 @@ -PODS: - - shared (1.0) - -DEPENDENCIES: - - shared (from `../shared`) - -EXTERNAL SOURCES: - shared: - :path: "../shared" - -SPEC CHECKSUMS: - shared: 476f8f613e223c690e3b4311f65291534e4fa034 - -PODFILE CHECKSUM: 78d6cc1b71b232202c48a29d4e6c34972c534c73 - -COCOAPODS: 1.15.2 diff --git a/iosApp/Pods/Pods.xcodeproj/project.pbxproj b/iosApp/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index 677c883..0000000 --- a/iosApp/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,553 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXAggregateTarget section */ - 8777C9F6889E59EFFD631D80AEE9048B /* shared */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 8349D8E2EC974421A14EF8ABFF6AD6DC /* Build configuration list for PBXAggregateTarget "shared" */; - buildPhases = ( - BEA8885189D408D600647BDC228A6A20 /* [CP-User] Build shared */, - ); - dependencies = ( - ); - name = shared; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 648F16425FEF89525AE0325F5A984B86 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; - 8749C8E8DC500B064FA0BC7A78C38A2A /* Pods-iosApp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BC3BD8CAFAE0C8EB92CD04E5FC24E61 /* Pods-iosApp-dummy.m */; }; - 8801CBFD38B946597BD07145B2EEFC9F /* Pods-iosApp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 70E8DFC7821955063C886C71258CBE53 /* Pods-iosApp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 3B3DD97234976EAE23DEF848B521F3BD /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8777C9F6889E59EFFD631D80AEE9048B; - remoteInfo = shared; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 257390D34074D2442461A69FE6970CBD /* Pods-iosApp-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-iosApp-resources.sh"; sourceTree = ""; }; - 4D3E6DCB9CAB65A8A05C467E2BBC1F0D /* Pods-iosApp-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-iosApp-acknowledgements.markdown"; sourceTree = ""; }; - 4DAD13487B641E6B9D7476999E775A45 /* shared.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = shared.debug.xcconfig; sourceTree = ""; }; - 6A3C5EB0586A09C512019B6B6A2DE103 /* Pods-iosApp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-iosApp-Info.plist"; sourceTree = ""; }; - 70E8DFC7821955063C886C71258CBE53 /* Pods-iosApp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-iosApp-umbrella.h"; sourceTree = ""; }; - 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 9BC3BD8CAFAE0C8EB92CD04E5FC24E61 /* Pods-iosApp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-iosApp-dummy.m"; sourceTree = ""; }; - 9C49AEBC7AA7C80C03295804C6F07963 /* Pods-iosApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-iosApp.release.xcconfig"; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - B097DD7534E741D5C41838011D755842 /* Pods-iosApp */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-iosApp"; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - CE6991E448B5709365FFBCAB5EF9A9B4 /* shared.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = shared.framework; path = build/cocoapods/framework/shared.framework; sourceTree = ""; }; - E2E6BF268E792329201BC2BF5DE0B8DB /* shared.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = shared.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - E39BE12967CFA5BCDF680F7E8376943C /* shared.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = shared.release.xcconfig; sourceTree = ""; }; - F064C0D7CE795102A652A82AEBBA7514 /* compose-resources */ = {isa = PBXFileReference; includeInIndex = 1; name = "compose-resources"; path = "build/compose/cocoapods/compose-resources"; sourceTree = ""; }; - F6DF6FB4000E345BDEE186C956C36ABF /* Pods-iosApp-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-iosApp-acknowledgements.plist"; sourceTree = ""; }; - F981EE0C95E2DFD40CA16F05D2C35B8A /* Pods-iosApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-iosApp.debug.xcconfig"; sourceTree = ""; }; - FB978CA3A69A4DEF4DC035E9CD8D83A4 /* Pods-iosApp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-iosApp.modulemap"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - CC3CD5459C4A5476C5A93268587E63E7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 648F16425FEF89525AE0325F5A984B86 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 11C970DEAE48C6D0282DFE54684F53F1 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 4C16E8CC03E90AF9CABF8C82B813AE97 /* Pods-iosApp */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 1F86AA6785DF34AFD5A71790761717DE /* Products */ = { - isa = PBXGroup; - children = ( - B097DD7534E741D5C41838011D755842 /* Pods-iosApp */, - ); - name = Products; - sourceTree = ""; - }; - 244B481B25AE39ED2811E8ED93C90033 /* Frameworks */ = { - isa = PBXGroup; - children = ( - CE6991E448B5709365FFBCAB5EF9A9B4 /* shared.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 2E499C4A5F1591C71B6F87A09468D6A7 /* Support Files */ = { - isa = PBXGroup; - children = ( - 4DAD13487B641E6B9D7476999E775A45 /* shared.debug.xcconfig */, - E39BE12967CFA5BCDF680F7E8376943C /* shared.release.xcconfig */, - ); - name = "Support Files"; - path = "../iosApp/Pods/Target Support Files/shared"; - sourceTree = ""; - }; - 40443BD2A1BD6FFE32B582A00ABBCF31 /* shared */ = { - isa = PBXGroup; - children = ( - F064C0D7CE795102A652A82AEBBA7514 /* compose-resources */, - 244B481B25AE39ED2811E8ED93C90033 /* Frameworks */, - 4A34E35645B6AB5ADA95001E5FA8730B /* Pod */, - 2E499C4A5F1591C71B6F87A09468D6A7 /* Support Files */, - ); - name = shared; - path = ../../shared; - sourceTree = ""; - }; - 4A34E35645B6AB5ADA95001E5FA8730B /* Pod */ = { - isa = PBXGroup; - children = ( - E2E6BF268E792329201BC2BF5DE0B8DB /* shared.podspec */, - ); - name = Pod; - sourceTree = ""; - }; - 4C16E8CC03E90AF9CABF8C82B813AE97 /* Pods-iosApp */ = { - isa = PBXGroup; - children = ( - FB978CA3A69A4DEF4DC035E9CD8D83A4 /* Pods-iosApp.modulemap */, - 4D3E6DCB9CAB65A8A05C467E2BBC1F0D /* Pods-iosApp-acknowledgements.markdown */, - F6DF6FB4000E345BDEE186C956C36ABF /* Pods-iosApp-acknowledgements.plist */, - 9BC3BD8CAFAE0C8EB92CD04E5FC24E61 /* Pods-iosApp-dummy.m */, - 6A3C5EB0586A09C512019B6B6A2DE103 /* Pods-iosApp-Info.plist */, - 257390D34074D2442461A69FE6970CBD /* Pods-iosApp-resources.sh */, - 70E8DFC7821955063C886C71258CBE53 /* Pods-iosApp-umbrella.h */, - F981EE0C95E2DFD40CA16F05D2C35B8A /* Pods-iosApp.debug.xcconfig */, - 9C49AEBC7AA7C80C03295804C6F07963 /* Pods-iosApp.release.xcconfig */, - ); - name = "Pods-iosApp"; - path = "Target Support Files/Pods-iosApp"; - sourceTree = ""; - }; - 578452D2E740E91742655AC8F1636D1F /* iOS */ = { - isa = PBXGroup; - children = ( - 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, - ); - name = iOS; - sourceTree = ""; - }; - 58AAD176B64323B9974E5B70EC8B12DC /* Development Pods */ = { - isa = PBXGroup; - children = ( - 40443BD2A1BD6FFE32B582A00ABBCF31 /* shared */, - ); - name = "Development Pods"; - sourceTree = ""; - }; - CF1408CF629C7361332E53B88F7BD30C = { - isa = PBXGroup; - children = ( - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - 58AAD176B64323B9974E5B70EC8B12DC /* Development Pods */, - D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, - 1F86AA6785DF34AFD5A71790761717DE /* Products */, - 11C970DEAE48C6D0282DFE54684F53F1 /* Targets Support Files */, - ); - sourceTree = ""; - }; - D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 578452D2E740E91742655AC8F1636D1F /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - DA71CB665A4F7860DB550FAA48FB6AD2 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 8801CBFD38B946597BD07145B2EEFC9F /* Pods-iosApp-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - ED39C638569286489CD697A6C8964146 /* Pods-iosApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9F1E85ECB672A0CC96333A6C6DF60EE6 /* Build configuration list for PBXNativeTarget "Pods-iosApp" */; - buildPhases = ( - DA71CB665A4F7860DB550FAA48FB6AD2 /* Headers */, - EB28A529759E3D2117E28CE3CB8387D3 /* Sources */, - CC3CD5459C4A5476C5A93268587E63E7 /* Frameworks */, - 0EC1C62FF9B25EAB2D236D122EAF4C98 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 6D08CF75140F29DD6A6970543E494B09 /* PBXTargetDependency */, - ); - name = "Pods-iosApp"; - productName = Pods_iosApp; - productReference = B097DD7534E741D5C41838011D755842 /* Pods-iosApp */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - BFDFE7DC352907FC980B868725387E98 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1500; - LastUpgradeCheck = 1500; - }; - buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 12.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - Base, - en, - ); - mainGroup = CF1408CF629C7361332E53B88F7BD30C; - minimizedProjectReferenceProxies = 0; - productRefGroup = 1F86AA6785DF34AFD5A71790761717DE /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - ED39C638569286489CD697A6C8964146 /* Pods-iosApp */, - 8777C9F6889E59EFFD631D80AEE9048B /* shared */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 0EC1C62FF9B25EAB2D236D122EAF4C98 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - BEA8885189D408D600647BDC228A6A20 /* [CP-User] Build shared */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - name = "[CP-User] Build shared"; - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = " if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=\"$CONFIGURATION\"\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - EB28A529759E3D2117E28CE3CB8387D3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8749C8E8DC500B064FA0BC7A78C38A2A /* Pods-iosApp-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 6D08CF75140F29DD6A6970543E494B09 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = shared; - target = 8777C9F6889E59EFFD631D80AEE9048B /* shared */; - targetProxy = 3B3DD97234976EAE23DEF848B521F3BD /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 03527EFE33C6B1E7347416F7E6E66403 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9C49AEBC7AA7C80C03295804C6F07963 /* Pods-iosApp.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 27E9609BB6FEB3D98AC297415D73EE7D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E39BE12967CFA5BCDF680F7E8376943C /* shared.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CLANG_ENABLE_OBJC_WEAK = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 30E0B9EFD9A5C45D0D351231E81B30B3 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 5.0; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Release; - }; - 5D61A0D386909A90D35FAA1B9A95207D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F981EE0C95E2DFD40CA16F05D2C35B8A /* Pods-iosApp.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-iosApp/Pods-iosApp.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - B25A1C2429B15FBB86AA4312053B69E4 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4DAD13487B641E6B9D7476999E775A45 /* shared.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CLANG_ENABLE_OBJC_WEAK = NO; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - F4FF6A0D1970CA9705974E3CB2134802 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F4FF6A0D1970CA9705974E3CB2134802 /* Debug */, - 30E0B9EFD9A5C45D0D351231E81B30B3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 8349D8E2EC974421A14EF8ABFF6AD6DC /* Build configuration list for PBXAggregateTarget "shared" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B25A1C2429B15FBB86AA4312053B69E4 /* Debug */, - 27E9609BB6FEB3D98AC297415D73EE7D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 9F1E85ECB672A0CC96333A6C6DF60EE6 /* Build configuration list for PBXNativeTarget "Pods-iosApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5D61A0D386909A90D35FAA1B9A95207D /* Debug */, - 03527EFE33C6B1E7347416F7E6E66403 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; -} diff --git a/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/Pods-iosApp.xcscheme b/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/Pods-iosApp.xcscheme deleted file mode 100644 index d58b01a..0000000 --- a/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/Pods-iosApp.xcscheme +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/shared.xcscheme b/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/shared.xcscheme deleted file mode 100644 index 5bb8b2e..0000000 --- a/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/shared.xcscheme +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/xcschememanagement.plist b/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 7a05c7f..0000000 --- a/iosApp/Pods/Pods.xcodeproj/xcuserdata/akash.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,25 +0,0 @@ - - - - - SchemeUserState - - Pods-iosApp.xcscheme - - isShown - - orderHint - 0 - - shared.xcscheme - - isShown - - orderHint - 1 - - - SuppressBuildableAutocreation - - - diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist deleted file mode 100644 index 19cf209..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.markdown b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.markdown deleted file mode 100644 index 102af75..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.markdown +++ /dev/null @@ -1,3 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: -Generated by CocoaPods - https://cocoapods.org diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.plist b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.plist deleted file mode 100644 index 7acbad1..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-acknowledgements.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-dummy.m b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-dummy.m deleted file mode 100644 index e1bcef4..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_iosApp : NSObject -@end -@implementation PodsDummy_Pods_iosApp -@end diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Debug-input-files.xcfilelist b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Debug-input-files.xcfilelist deleted file mode 100644 index bab80cf..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Debug-input-files.xcfilelist +++ /dev/null @@ -1,2 +0,0 @@ -${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh -${PODS_ROOT}/../../shared/build/compose/cocoapods/compose-resources \ No newline at end of file diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Debug-output-files.xcfilelist b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Debug-output-files.xcfilelist deleted file mode 100644 index 383ba86..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Debug-output-files.xcfilelist +++ /dev/null @@ -1 +0,0 @@ -${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/compose-resources \ No newline at end of file diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Release-input-files.xcfilelist b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Release-input-files.xcfilelist deleted file mode 100644 index bab80cf..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Release-input-files.xcfilelist +++ /dev/null @@ -1,2 +0,0 @@ -${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh -${PODS_ROOT}/../../shared/build/compose/cocoapods/compose-resources \ No newline at end of file diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Release-output-files.xcfilelist b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Release-output-files.xcfilelist deleted file mode 100644 index 383ba86..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources-Release-output-files.xcfilelist +++ /dev/null @@ -1 +0,0 @@ -${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/compose-resources \ No newline at end of file diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh deleted file mode 100755 index c932364..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -function on_error { - echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" -} -trap 'on_error $LINENO' ERR - -if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then - # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy - # resources to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY:-}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_resource "${PODS_ROOT}/../../shared/build/compose/cocoapods/compose-resources" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_resource "${PODS_ROOT}/../../shared/build/compose/cocoapods/compose-resources" -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find -L "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - else - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" - fi -fi diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-umbrella.h b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-umbrella.h deleted file mode 100644 index a3d6034..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_iosAppVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_iosAppVersionString[]; - diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig deleted file mode 100644 index 273bd89..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -ENABLE_USER_SCRIPT_SANDBOXING = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "shared" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.modulemap b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.modulemap deleted file mode 100644 index 1bb57b2..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_iosApp { - umbrella header "Pods-iosApp-umbrella.h" - - export * - module * { export * } -} diff --git a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig b/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig deleted file mode 100644 index 273bd89..0000000 --- a/iosApp/Pods/Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -ENABLE_USER_SCRIPT_SANDBOXING = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "shared" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/iosApp/Pods/Target Support Files/shared/shared.debug.xcconfig b/iosApp/Pods/Target Support Files/shared/shared.debug.xcconfig deleted file mode 100644 index 640705e..0000000 --- a/iosApp/Pods/Target Support Files/shared/shared.debug.xcconfig +++ /dev/null @@ -1,17 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/shared -ENABLE_USER_SCRIPT_SANDBOXING = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -KOTLIN_PROJECT_PATH = :shared -OTHER_LDFLAGS = $(inherited) -l"c++" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../shared -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -PRODUCT_MODULE_NAME = shared -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/iosApp/Pods/Target Support Files/shared/shared.release.xcconfig b/iosApp/Pods/Target Support Files/shared/shared.release.xcconfig deleted file mode 100644 index 640705e..0000000 --- a/iosApp/Pods/Target Support Files/shared/shared.release.xcconfig +++ /dev/null @@ -1,17 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/shared -ENABLE_USER_SCRIPT_SANDBOXING = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../shared/build/cocoapods/framework" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -KOTLIN_PROJECT_PATH = :shared -OTHER_LDFLAGS = $(inherited) -l"c++" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../shared -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -PRODUCT_MODULE_NAME = shared -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj deleted file mode 100644 index c84dd6a..0000000 --- a/iosApp/iosApp.xcodeproj/project.pbxproj +++ /dev/null @@ -1,426 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557BA273AAA24004C7B11 /* Assets.xcassets */; }; - 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */; }; - 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iOSApp.swift */; }; - 233D688A2C65FB740071A8DB /* BiometricUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233D68892C65FB740071A8DB /* BiometricUtil.swift */; }; - 233D688C2C65FBB00071A8DB /* CipherUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233D688B2C65FBB00071A8DB /* CipherUtil.swift */; }; - 238E63B22C43A6CA009CC6DA /* SetPublicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238E63B12C43A6CA009CC6DA /* SetPublicKey.swift */; }; - 238E63B42C43A92C009CC6DA /* VerifyBiometric.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238E63B32C43A92C009CC6DA /* VerifyBiometric.swift */; }; - 7555FF83242A565900829871 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7555FF82242A565900829871 /* ContentView.swift */; }; - B4058FFAC578793E917A8C84 /* Pods_iosApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AEF023C9E821DAC5AA81FB02 /* Pods_iosApp.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; - 233D68892C65FB740071A8DB /* BiometricUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BiometricUtil.swift; sourceTree = ""; }; - 233D688B2C65FBB00071A8DB /* CipherUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CipherUtil.swift; sourceTree = ""; }; - 238E63B12C43A6CA009CC6DA /* SetPublicKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SetPublicKey.swift; sourceTree = ""; }; - 238E63B32C43A92C009CC6DA /* VerifyBiometric.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifyBiometric.swift; sourceTree = ""; }; - 5494C64AF663CFCF15EEFD3B /* Pods-iosApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.debug.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig"; sourceTree = ""; }; - 7555FF7B242A565900829871 /* iosApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iosApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 7555FF82242A565900829871 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 7555FF8C242A565B00829871 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AEF023C9E821DAC5AA81FB02 /* Pods_iosApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F21EE08A49B21B38D5DDF997 /* Pods-iosApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.release.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - ECCB855EC93537E66FFEB0D9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - B4058FFAC578793E917A8C84 /* Pods_iosApp.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 058557D7273AAEEB004C7B11 /* Preview Content */ = { - isa = PBXGroup; - children = ( - 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */, - ); - path = "Preview Content"; - sourceTree = ""; - }; - 0D5CFB942850CFC40B6CE5E8 /* Pods */ = { - isa = PBXGroup; - children = ( - 5494C64AF663CFCF15EEFD3B /* Pods-iosApp.debug.xcconfig */, - F21EE08A49B21B38D5DDF997 /* Pods-iosApp.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 233D68882C65FB660071A8DB /* Biometric */ = { - isa = PBXGroup; - children = ( - 233D68892C65FB740071A8DB /* BiometricUtil.swift */, - 233D688B2C65FBB00071A8DB /* CipherUtil.swift */, - ); - path = Biometric; - sourceTree = ""; - }; - 7555FF72242A565900829871 = { - isa = PBXGroup; - children = ( - 7555FF7D242A565900829871 /* iosApp */, - 7555FF7C242A565900829871 /* Products */, - 0D5CFB942850CFC40B6CE5E8 /* Pods */, - B0FFA7982D710D94A9EBBA41 /* Frameworks */, - ); - sourceTree = ""; - }; - 7555FF7C242A565900829871 /* Products */ = { - isa = PBXGroup; - children = ( - 7555FF7B242A565900829871 /* iosApp.app */, - ); - name = Products; - sourceTree = ""; - }; - 7555FF7D242A565900829871 /* iosApp */ = { - isa = PBXGroup; - children = ( - 233D68882C65FB660071A8DB /* Biometric */, - 058557BA273AAA24004C7B11 /* Assets.xcassets */, - 7555FF82242A565900829871 /* ContentView.swift */, - 7555FF8C242A565B00829871 /* Info.plist */, - 2152FB032600AC8F00CF470E /* iOSApp.swift */, - 058557D7273AAEEB004C7B11 /* Preview Content */, - 238E63B12C43A6CA009CC6DA /* SetPublicKey.swift */, - 238E63B32C43A92C009CC6DA /* VerifyBiometric.swift */, - ); - path = iosApp; - sourceTree = ""; - }; - B0FFA7982D710D94A9EBBA41 /* Frameworks */ = { - isa = PBXGroup; - children = ( - AEF023C9E821DAC5AA81FB02 /* Pods_iosApp.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 7555FF7A242A565900829871 /* iosApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */; - buildPhases = ( - 2D1319DD9D7B16971087DF27 /* [CP] Check Pods Manifest.lock */, - 7555FF77242A565900829871 /* Sources */, - 7555FF79242A565900829871 /* Resources */, - ECCB855EC93537E66FFEB0D9 /* Frameworks */, - 15FD82303FC37EC32D950B51 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = iosApp; - productName = iosApp; - productReference = 7555FF7B242A565900829871 /* iosApp.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 7555FF73242A565900829871 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1130; - LastUpgradeCheck = 1130; - ORGANIZATIONNAME = orgName; - TargetAttributes = { - 7555FF7A242A565900829871 = { - CreatedOnToolsVersion = 11.3.1; - }; - }; - }; - buildConfigurationList = 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 7555FF72242A565900829871; - productRefGroup = 7555FF7C242A565900829871 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 7555FF7A242A565900829871 /* iosApp */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 7555FF79242A565900829871 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */, - 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 15FD82303FC37EC32D950B51 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 2D1319DD9D7B16971087DF27 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-iosApp-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 7555FF77242A565900829871 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 233D688A2C65FB740071A8DB /* BiometricUtil.swift in Sources */, - 238E63B22C43A6CA009CC6DA /* SetPublicKey.swift in Sources */, - 233D688C2C65FBB00071A8DB /* CipherUtil.swift in Sources */, - 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */, - 7555FF83242A565900829871 /* ContentView.swift in Sources */, - 238E63B42C43A92C009CC6DA /* VerifyBiometric.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 7555FFA3242A565B00829871 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 7555FFA4242A565B00829871 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 7555FFA6242A565B00829871 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5494C64AF663CFCF15EEFD3B /* Pods-iosApp.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; - DEVELOPMENT_TEAM = Z57TWPQ3R6; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = iosApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.mifos.biometric; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 7555FFA7242A565B00829871 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F21EE08A49B21B38D5DDF997 /* Pods-iosApp.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\""; - DEVELOPMENT_TEAM = Z57TWPQ3R6; - ENABLE_PREVIEWS = YES; - INFOPLIST_FILE = iosApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.mifos.biometric; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 7555FF76242A565900829871 /* Build configuration list for PBXProject "iosApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7555FFA3242A565B00829871 /* Debug */, - 7555FFA4242A565B00829871 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7555FFA5242A565B00829871 /* Build configuration list for PBXNativeTarget "iosApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 7555FFA6242A565B00829871 /* Debug */, - 7555FFA7242A565B00829871 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 7555FF73242A565900829871 /* Project object */; -} diff --git a/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/iosApp/iosApp.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/iosApp/iosApp.xcworkspace/contents.xcworkspacedata b/iosApp/iosApp.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index c009e7d..0000000 --- a/iosApp/iosApp.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index ee7e3ca..0000000 --- a/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index fb88a39..0000000 --- a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/iosApp/iosApp/Assets.xcassets/Contents.json b/iosApp/iosApp/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/iosApp/iosApp/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iosApp/iosApp/Assets.xcassets/biometric.imageset/Contents.json b/iosApp/iosApp/Assets.xcassets/biometric.imageset/Contents.json deleted file mode 100644 index 9f52524..0000000 --- a/iosApp/iosApp/Assets.xcassets/biometric.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "biometric.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/iosApp/iosApp/Assets.xcassets/biometric.imageset/mifos_logo.jpg b/iosApp/iosApp/Assets.xcassets/biometric.imageset/mifos_logo.jpg deleted file mode 100644 index a067a3c..0000000 Binary files a/iosApp/iosApp/Assets.xcassets/biometric.imageset/mifos_logo.jpg and /dev/null differ diff --git a/iosApp/iosApp/Biometric/BiometricUtil.swift b/iosApp/iosApp/Biometric/BiometricUtil.swift deleted file mode 100644 index 93d995a..0000000 --- a/iosApp/iosApp/Biometric/BiometricUtil.swift +++ /dev/null @@ -1,111 +0,0 @@ -import Foundation -import shared -import LocalAuthentication - -class BiometricUtilIosImpl: BioMetricUtil { - private let cipherUtil = CipherUtilIosImpl() - - private var promptDescription: String = "Authenticate" - - func setAndReturnPublicKey(completionHandler: @escaping (String?, (any Error)?) -> Void) { - - let laContext = LAContext() - laContext.localizedReason = promptDescription - laContext.localizedFallbackTitle = "Cancel" - laContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: promptDescription) { - [weak self] success, authenticationError in - - DispatchQueue.main.async { - if success { - completionHandler(self?.getPublicKey(), nil) - } else { - completionHandler(nil, authenticationError) - } - } - } - } - - func authenticate() async throws -> AuthenticationResult { - do { - _ = try self.cipherUtil.getCrypto() - return AuthenticationResult.Success() - } catch { - print("AuthenticateError: \(error.localizedDescription)") - return AuthenticationResult.Error(error: error.localizedDescription) - } - } - - func canAuthenticate() -> Bool { - var error: NSError? - let laContext = LAContext() - return laContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) - } - - - func generatePublicKey() async throws -> String? { - let keyPair = try cipherUtil.generateKeyPair() - return keyPair.publicKey?.toPemFormat().toBase64() - } - - func getPublicKey() -> String? { - return cipherUtil.getPublicKey().encoded.toPemFormat().toBase64() - } - - func isBiometricSet() -> Bool { - return UserDefaults.standard.string(forKey: "PublicKey") == nil - } - - func isValidCrypto() -> Bool { - do { - _ = try cipherUtil.getCrypto() - return true - } catch { - return false - } - } - - func signUserId(ucc: String) -> String { - guard let data = ucc.data(using: .utf8) else { - print("Failed to convert UCC to data") - fatalError() - } - - var error: Unmanaged? - guard let signature = SecKeyCreateSignature(cipherUtil.getKey()!, .rsaSignatureMessagePKCS1v15SHA256, data as CFData, &error) else { - if let error = error { - print("Error creating signature: \(error.takeRetainedValue())") - } - fatalError() - } - - return (signature as Data).base64EncodedString() - } - - -} - -extension String { - func toPemFormat() -> String { - let chunkSize = 64 - var pemString = "-----BEGIN RSA PUBLIC KEY-----\n" - var base64String = self - while base64String.count > 0 { - let chunkIndex = base64String.index(base64String.startIndex, offsetBy: min(chunkSize, base64String.count)) - let chunk = base64String[.. String? { - guard let data = self.data(using: .utf8) else { - return nil - } - return data.base64EncodedString() - } -} diff --git a/iosApp/iosApp/Biometric/CipherUtil.swift b/iosApp/iosApp/Biometric/CipherUtil.swift deleted file mode 100644 index 9d019de..0000000 --- a/iosApp/iosApp/Biometric/CipherUtil.swift +++ /dev/null @@ -1,102 +0,0 @@ -import Foundation -import shared - -class CipherUtilIosImpl: ICipherUtil { - private let KEY_NAME = "biometric_key" - private let tag: String - - private lazy var key: SecKey? = { - let query: [String: Any] = [ - kSecClass as String: kSecClassKey, - kSecAttrApplicationTag as String: tag, - kSecAttrKeyType as String: kSecAttrKeyTypeRSA, - kSecReturnRef as String: true - ] - var item: CFTypeRef? - let status = SecItemCopyMatching(query as CFDictionary, &item) - guard status == errSecSuccess else { return nil } - return (item as! SecKey) - }() - - init() { - self.tag = KEY_NAME - } - - func generateKeyPair() throws -> CommonKeyPair { - let access = SecAccessControlCreateWithFlags( - nil, - kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, - .userPresence, - nil - )! - let attributes: [String: Any] = [ - kSecAttrKeyType as String: kSecAttrKeyTypeRSA, - kSecAttrKeySizeInBits as String: 2048, - kSecPrivateKeyAttrs as String: [ - kSecAttrIsPermanent as String: true, - kSecAttrApplicationTag as String: tag, - kSecAttrAccessControl as String: access - ] - ] - - var error: Unmanaged? - guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else { - throw error!.takeRetainedValue() as Error - } - guard let publicKey = SecKeyCopyPublicKey(privateKey) else { - throw NSError(domain: NSOSStatusErrorDomain, code: Int(errSecInternalError), userInfo: nil) - } - - let publicKeyData = SecKeyCopyExternalRepresentation(publicKey, nil)! as Data - let privateKeyData = SecKeyCopyExternalRepresentation(privateKey, nil)! as Data - - return CommonKeyPair(publicKey: publicKeyData.base64EncodedString(), privateKey: privateKeyData.base64EncodedString()) - } - - func getCrypto() throws -> Crypto { - guard let privateKey = getKey() else { - throw NSError(domain: NSOSStatusErrorDomain, code: Int(errSecItemNotFound), userInfo: nil) - } - - let publicKey = SecKeyCopyPublicKey(privateKey)! - let publicKeyData = SecKeyCopyExternalRepresentation(publicKey, nil)! as Data - let privateKeyData = SecKeyCopyExternalRepresentation(privateKey, nil)! as Data - - UserDefaults.standard.setValue(publicKeyData.base64EncodedString(), forKey: "PublicKey") - - return Crypto() - } - - func getPublicKey() -> any CommonPublicKey { - let savedPublicKey = UserDefaults.standard.string(forKey: "PublicKey") - if (savedPublicKey != nil) { - return CommonPublicKeyImpl(encoded: savedPublicKey!) - } - - guard let privateKey = getKey() else { return CommonPublicKeyImpl(encoded: "") } - guard let publicKey = SecKeyCopyPublicKey(privateKey) else { return CommonPublicKeyImpl(encoded: "") } - let publicKeyData = SecKeyCopyExternalRepresentation(publicKey, nil)! as Data - let publicKeyString = publicKeyData.base64EncodedString() - UserDefaults.standard.setValue(publicKeyString, forKey: "PublicKey") - return CommonPublicKeyImpl(encoded: publicKeyString) - } - - - func removePublicKey() async throws { - UserDefaults.standard.removeObject(forKey: "PublicKey") - let query: [String: Any] = [ - kSecClass as String: kSecClassKey, - kSecAttrApplicationTag as String: tag, - kSecAttrKeyType as String: kSecAttrKeyTypeRSA - ] - let status = SecItemDelete(query as CFDictionary) - if status != errSecSuccess && status != errSecItemNotFound { - throw NSError(domain: NSOSStatusErrorDomain, code: Int(status), userInfo: nil) - } - } - - func getKey() -> SecKey? { - return key - } - -} \ No newline at end of file diff --git a/iosApp/iosApp/ContentView.swift b/iosApp/iosApp/ContentView.swift deleted file mode 100644 index df5c5a3..0000000 --- a/iosApp/iosApp/ContentView.swift +++ /dev/null @@ -1,51 +0,0 @@ -import SwiftUI -import shared - -let biometricUtil = BiometricUtilIosImpl() -struct ContentView: View { - let greet = Greeting().greet() - @State private var path = NavigationPath() - - var body: some View { - ZStack { - ComposeViewController(onNavigateToNextScreen: { - path.append("NextScreen") - }) - } - .navigationDestination(for: String.self) { value in - if value == "NextScreen" { - NextScreen() - } - } - } -} - -struct ComposeViewController: UIViewControllerRepresentable { - @StateObject var biometricAuthorizationViewModel: BiometricAuthorizationViewModel = BiometricAuthorizationViewModel() - var onNavigateToNextScreen: () -> Void - - func makeUIViewController(context: Context) -> UIViewController { - return App_iosKt.MainViewController( - bioMetricUtil: biometricUtil, - biometricViewModel: biometricAuthorizationViewModel, - onPasscodeConfirm: onNavigateToNextScreen - ) - } - - func updateUIViewController(_ uiViewController: UIViewController, context: Context) { - } -} - -struct NextScreen: View { - var body: some View { - Text("Next Screen") - } -} - -struct ContentView_Previews: PreviewProvider { - static var previews: some View { - ContentView() - } -} - -extension BiometricAuthorizationViewModel: ObservableObject {} diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist deleted file mode 100644 index 2a21373..0000000 --- a/iosApp/iosApp/Info.plist +++ /dev/null @@ -1,50 +0,0 @@ - - - - - NSFaceIDUsageDescription - Set Biometric 2FA - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - - UILaunchScreen - - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json b/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json deleted file mode 100644 index 4aa7c53..0000000 --- a/iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/iosApp/iosApp/SetPublicKey.swift b/iosApp/iosApp/SetPublicKey.swift deleted file mode 100644 index 1eb7f8c..0000000 --- a/iosApp/iosApp/SetPublicKey.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation -import SwiftUI - -struct SetPublicKey: View { - - @Binding var path: NavigationPath - - var body: some View { - VStack { - Image("biometric") - .resizable() - .scaledToFit() - Spacer() - Button(action: { - - }, label: { - Text("Set Biometric") - }) - }.padding() - } -} diff --git a/iosApp/iosApp/VerifyBiometric.swift b/iosApp/iosApp/VerifyBiometric.swift deleted file mode 100644 index fae50b5..0000000 --- a/iosApp/iosApp/VerifyBiometric.swift +++ /dev/null @@ -1,21 +0,0 @@ -import Foundation -import SwiftUI - -struct VerifyBiometric: View { - - @Binding var path: NavigationPath - - var body: some View { - VStack { - Image("biometric") - .resizable() - .scaledToFit() - Spacer() - Button(action: { - - }, label: { - Text("Veify Biometric") - }) - }.padding() - } -} diff --git a/iosApp/iosApp/iOSApp.swift b/iosApp/iosApp/iOSApp.swift deleted file mode 100644 index 0648e86..0000000 --- a/iosApp/iosApp/iOSApp.swift +++ /dev/null @@ -1,10 +0,0 @@ -import SwiftUI - -@main -struct iOSApp: App { - var body: some Scene { - WindowGroup { - ContentView() - } - } -} \ No newline at end of file diff --git a/mifos-passcode/build.gradle b/mifos-passcode/build.gradle index abdb286..207707c 100644 --- a/mifos-passcode/build.gradle +++ b/mifos-passcode/build.gradle @@ -1,7 +1,5 @@ -plugins { - alias(libs.plugins.androidLibrary) - alias(libs.plugins.kotlinAndroid) -} +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' ext { bintrayRepo = 'maven' @@ -61,14 +59,14 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation libs.appcompat - implementation libs.material + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.6.0' - testImplementation libs.junit - androidTestImplementation libs.androidx.runner - androidTestImplementation libs.androidx.espresso.core.v360alpha01 - implementation libs.androidx.core.ktx.v1131 - implementation libs.kotlin.stdlib.jdk8 + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test:runner:1.6.0-alpha04' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.0-alpha01' + implementation "androidx.core:core-ktx:+" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } tasks.withType(Javadoc) { diff --git a/settings.gradle b/settings.gradle index 791ecb3..396028a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,18 +1,2 @@ -pluginManagement { - repositories { - google() - gradlePluginPortal() - mavenCentral() - } -} - -dependencyResolutionManagement { - repositories { - google() - mavenCentral() - } -} -include ':androidApp' -include ':mifos-passcode' +include ':app', ':mifos-passcode' include ':compose' -include ':shared' diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts deleted file mode 100644 index 1c1cef6..0000000 --- a/shared/build.gradle.kts +++ /dev/null @@ -1,75 +0,0 @@ -plugins { - alias(libs.plugins.kotlinMultiplatform) - alias(libs.plugins.kotlinCocoapods) - alias(libs.plugins.androidLibrary) - alias(libs.plugins.jetbrainsCompose) - alias(libs.plugins.compose.compiler) -} - -kotlin { - androidTarget { - compilations.all { - kotlinOptions { - jvmTarget = "17" - } - } - } - iosX64() - iosArm64() - iosSimulatorArm64() - - cocoapods { - summary = "Some description for the Shared Module" - homepage = "Link to the Shared Module homepage" - version = "1.0" - ios.deploymentTarget = "16.0" - framework { - baseName = "shared" - isStatic = true - } - } - - sourceSets { - commonMain.dependencies { - implementation(libs.androidx.lifecycle.viewmodel.ktx) - implementation(compose.ui) - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.material3) - implementation(compose.components.resources) - implementation(libs.navigation.compose) - implementation(libs.multiplatform.settings.no.arg) - } - commonTest.dependencies { - implementation(libs.kotlin.test) - } - androidMain.dependencies { - implementation (libs.androidx.biometric) - } - } -} - -android { - namespace = "com.mifos.shared" - compileSdk = 35 - sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") - sourceSets["main"].res.srcDirs("src/androidMain/res") - sourceSets["main"].resources.srcDirs("src/commonMain/resources") - defaultConfig { - minSdk = 24 - } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } -} -dependencies { - implementation(libs.androidx.ui.tooling.preview.android) - implementation(libs.androidx.ui.android) -} - -compose.resources { - publicResClass = true - packageOfResClass = "com.mifos.shared.resources" - generateResClass = always -} \ No newline at end of file diff --git a/shared/shared.podspec b/shared/shared.podspec deleted file mode 100644 index 35c25ee..0000000 --- a/shared/shared.podspec +++ /dev/null @@ -1,54 +0,0 @@ -Pod::Spec.new do |spec| - spec.name = 'shared' - spec.version = '1.0' - spec.homepage = 'Link to the Shared Module homepage' - spec.source = { :http=> ''} - spec.authors = '' - spec.license = '' - spec.summary = 'Some description for the Shared Module' - spec.vendored_frameworks = 'build/cocoapods/framework/shared.framework' - spec.libraries = 'c++' - spec.ios.deployment_target = '16.0' - - - if !Dir.exist?('build/cocoapods/framework/shared.framework') || Dir.empty?('build/cocoapods/framework/shared.framework') - raise " - - Kotlin framework 'shared' doesn't exist yet, so a proper Xcode project can't be generated. - 'pod install' should be executed after running ':generateDummyFramework' Gradle task: - - ./gradlew :shared:generateDummyFramework - - Alternatively, proper pod installation is performed during Gradle sync in the IDE (if Podfile location is set)" - end - - spec.xcconfig = { - 'ENABLE_USER_SCRIPT_SANDBOXING' => 'NO', - } - - spec.pod_target_xcconfig = { - 'KOTLIN_PROJECT_PATH' => ':shared', - 'PRODUCT_MODULE_NAME' => 'shared', - } - - spec.script_phases = [ - { - :name => 'Build shared', - :execution_position => :before_compile, - :shell_path => '/bin/sh', - :script => <<-SCRIPT - if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then - echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"" - exit 0 - fi - set -ev - REPO_ROOT="$PODS_TARGET_SRCROOT" - "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \ - -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \ - -Pkotlin.native.cocoapods.archs="$ARCHS" \ - -Pkotlin.native.cocoapods.configuration="$CONFIGURATION" - SCRIPT - } - ] - spec.resources = ['build/compose/cocoapods/compose-resources'] -end \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/com/mifos/shared/BiometricUtilAndroidImpl.kt b/shared/src/androidMain/kotlin/com/mifos/shared/BiometricUtilAndroidImpl.kt deleted file mode 100644 index 99df724..0000000 --- a/shared/src/androidMain/kotlin/com/mifos/shared/BiometricUtilAndroidImpl.kt +++ /dev/null @@ -1,132 +0,0 @@ -package com.mifos.shared - -import android.os.Build -import androidx.annotation.RequiresApi -import androidx.biometric.BiometricManager -import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG -import androidx.biometric.BiometricPrompt -import androidx.core.content.ContextCompat -import androidx.fragment.app.FragmentActivity -import com.mifos.shared.utility.AuthenticationResult -import com.mifos.shared.utility.BioMetricUtil -import java.util.Base64 -import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine - -class BiometricUtilAndroidImpl( - private val activity: FragmentActivity, - private val cipherUtil: ICipherUtil -) : BioMetricUtil { - - private val executor = ContextCompat.getMainExecutor(activity) - private var promptInfo: BiometricPrompt.PromptInfo? = null - private var biometricPrompt: BiometricPrompt? = null - - @RequiresApi(Build.VERSION_CODES.O) - override suspend fun setAndReturnPublicKey(): String? { - val authenticateResult = authenticate() - return when (authenticateResult) { - is AuthenticationResult.Success -> generatePublicKey() - else -> null - } - } - - override fun canAuthenticate(): Boolean { - return BiometricManager.from(activity).canAuthenticate(BIOMETRIC_STRONG) == BiometricManager.BIOMETRIC_SUCCESS - } - - @RequiresApi(Build.VERSION_CODES.O) - override suspend fun generatePublicKey(): String? { - return cipherUtil.generateKeyPair().public?.encoded?.toBase64Encoded()?.toPemFormat()?.toBase64Encoded() - } - - @RequiresApi(Build.VERSION_CODES.O) - override fun getPublicKey(): String? { - return cipherUtil.getPublicKey().encoded?.toBase64Encoded()?.toPemFormat()?.toBase64Encoded() - } - - override fun isValidCrypto(): Boolean { - return try { - cipherUtil.getCrypto() - true - } catch (e: Exception){ - false - } - } - - override suspend fun authenticate(): AuthenticationResult = suspendCoroutine { continuation -> - - biometricPrompt = BiometricPrompt(activity, executor, object : - BiometricPrompt.AuthenticationCallback() { - override fun onAuthenticationFailed() { - super.onAuthenticationFailed() - } - - override fun onAuthenticationError(errorCode: Int, errString: CharSequence) { - super.onAuthenticationError(errorCode, errString) - when (errorCode) { - BiometricPrompt.ERROR_LOCKOUT, BiometricPrompt.ERROR_LOCKOUT_PERMANENT -> continuation.resume( - AuthenticationResult.AttemptExhausted) - BiometricPrompt.ERROR_NEGATIVE_BUTTON -> continuation.resume( - AuthenticationResult.NegativeButtonClick) - else -> continuation.resume(AuthenticationResult.Error(errString.toString())) - } - } - - override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) { - super.onAuthenticationSucceeded(result) - continuation.resume(AuthenticationResult.Success) - } - }) - - promptInfo?.let { - biometricPrompt?.authenticate(it, cipherUtil.getCrypto()) - } - } - - @RequiresApi(Build.VERSION_CODES.O) - override fun signUserId(ucc: String): String { - cipherUtil.getCrypto().signature?.update(ucc.toByteArray()) - return cipherUtil.getCrypto().signature?.sign()?.toBase64Encoded() ?: "" - } - - @RequiresApi(Build.VERSION_CODES.O) - override fun isBiometricSet(): Boolean { - return !getPublicKey().isNullOrEmpty() && isValidCrypto() - } - - fun preparePrompt( - title: String, - subtitle: String, - description: String, - ): BioMetricUtil { - promptInfo = BiometricPrompt.PromptInfo.Builder() - .setTitle(title) - .setSubtitle(subtitle) - .setDescription(description) - .setNegativeButtonText("Cancel") - .setAllowedAuthenticators(BIOMETRIC_STRONG) - .build() - return this - } -} - -@RequiresApi(Build.VERSION_CODES.O) -fun ByteArray.toBase64Encoded(): String? { - return Base64.getEncoder().encodeToString(this) -} - -@RequiresApi(Build.VERSION_CODES.O) -fun String.toBase64Encoded(): String? { - return Base64.getEncoder().encodeToString(this.toByteArray()) -} - -private fun String.toPemFormat(): String { - val stringBuilder = StringBuilder() - stringBuilder.append("-----BEGIN RSA PUBLIC KEY-----").append("\n") - chunked(64).forEach { - stringBuilder.append(it).append("\n") - } - stringBuilder.append("-----END RSA PUBLIC KEY-----") - return stringBuilder.toString() -} \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/com/mifos/shared/CipherUtilImpl.android.kt b/shared/src/androidMain/kotlin/com/mifos/shared/CipherUtilImpl.android.kt deleted file mode 100644 index 3b70938..0000000 --- a/shared/src/androidMain/kotlin/com/mifos/shared/CipherUtilImpl.android.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.mifos.shared - -import android.security.keystore.KeyGenParameterSpec -import android.security.keystore.KeyProperties -import androidx.biometric.BiometricPrompt -import java.security.KeyPair -import java.security.KeyPairGenerator -import java.security.KeyStore -import java.security.PrivateKey -import java.security.PublicKey -import java.security.Signature - -class CipherUtilAndroidImpl: ICipherUtil { - private val KEY_NAME = "biometric_key" - - override fun generateKeyPair(): KeyPair { - val keyPairGenerator: KeyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore") - val parameterSpec: KeyGenParameterSpec = KeyGenParameterSpec.Builder(KEY_NAME, - KeyProperties.PURPOSE_SIGN or KeyProperties.PURPOSE_VERIFY).run { - setDigests(KeyProperties.DIGEST_SHA256) - setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1) - build() - } - keyPairGenerator.initialize(parameterSpec) - return keyPairGenerator.genKeyPair() - } - - override fun getPublicKey(): PublicKey = getKeyPair().public - - private fun getKeyPair(): KeyPair { - val keyStore = KeyStore.getInstance("AndroidKeyStore") - keyStore.load(null) - keyStore?.getCertificate(KEY_NAME).let { return KeyPair(it?.publicKey, null) } - } - - override fun getCrypto(): Crypto { - val signature = Signature.getInstance("SHA256withRSA") - val keyStore: KeyStore = KeyStore.getInstance("AndroidKeyStore") - keyStore.load(null) - val key: PrivateKey = if(keyStore.containsAlias(KEY_NAME)) - keyStore.getKey(KEY_NAME, null) as PrivateKey - else - generateKeyPair().private - signature.initSign(key) - return BiometricPrompt.CryptoObject(signature) - } - - override suspend fun removePublicKey() { - val keyStore = KeyStore.getInstance("AndroidKeyStore") - keyStore.load(null) - keyStore?.deleteEntry(KEY_NAME) - } - -} - -actual typealias CommonKeyPair = KeyPair - -actual typealias CommonPublicKey = PublicKey - -actual typealias Crypto = BiometricPrompt.CryptoObject \ No newline at end of file diff --git a/shared/src/androidMain/kotlin/com/mifos/shared/Platform.android.kt b/shared/src/androidMain/kotlin/com/mifos/shared/Platform.android.kt deleted file mode 100644 index aa81cc7..0000000 --- a/shared/src/androidMain/kotlin/com/mifos/shared/Platform.android.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mifos.shared - -class AndroidPlatform : Platform { - override val name: String = "Android ${android.os.Build.VERSION.SDK_INT}" -} - -actual fun getPlatform(): Platform = AndroidPlatform() \ No newline at end of file diff --git a/shared/src/commonMain/composeResources/drawable/ic_delete.xml b/shared/src/commonMain/composeResources/drawable/ic_delete.xml deleted file mode 100644 index 4069f83..0000000 --- a/shared/src/commonMain/composeResources/drawable/ic_delete.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/shared/src/commonMain/composeResources/drawable/mifos_logo.jpg b/shared/src/commonMain/composeResources/drawable/mifos_logo.jpg deleted file mode 100644 index a067a3c..0000000 Binary files a/shared/src/commonMain/composeResources/drawable/mifos_logo.jpg and /dev/null differ diff --git a/shared/src/commonMain/composeResources/font/lato_black.ttf b/shared/src/commonMain/composeResources/font/lato_black.ttf deleted file mode 100644 index 4340502..0000000 Binary files a/shared/src/commonMain/composeResources/font/lato_black.ttf and /dev/null differ diff --git a/shared/src/commonMain/composeResources/font/lato_bold.ttf b/shared/src/commonMain/composeResources/font/lato_bold.ttf deleted file mode 100644 index 016068b..0000000 Binary files a/shared/src/commonMain/composeResources/font/lato_bold.ttf and /dev/null differ diff --git a/shared/src/commonMain/composeResources/font/lato_regular.ttf b/shared/src/commonMain/composeResources/font/lato_regular.ttf deleted file mode 100644 index bb2e887..0000000 Binary files a/shared/src/commonMain/composeResources/font/lato_regular.ttf and /dev/null differ diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml deleted file mode 100644 index 1620b69..0000000 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - Biometric - Passcode - hasPasscode - hasDragPasscode - passcode - drag_passcode - Create Passcode - Confirm Passcode - Enter your Passcode - Forgot Passcode - Delete Passcode Key Button - Drag your finger here only in one direction. - Drag your Pattern - Exit - Cancel - Skip - Forgot Passcode, Login Manually - Try again - Passcode do not match! - Are you sure you want to exit? - Use TouchId - Authentication failed - Authentication not set - Feature unavailable - Biometric Registration Successful ! - \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/CipherUtilImpl.kt b/shared/src/commonMain/kotlin/com/mifos/shared/CipherUtilImpl.kt deleted file mode 100644 index b719a41..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/CipherUtilImpl.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.mifos.shared - -interface ICipherUtil { - @Throws(Exception::class) - fun generateKeyPair(): CommonKeyPair - - fun getPublicKey(): CommonPublicKey - - @Throws(Exception::class) - fun getCrypto(): Crypto - - @Throws(Exception::class) - suspend fun removePublicKey() -} - -expect class CommonKeyPair -expect interface CommonPublicKey -expect class Crypto \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/Greeting.kt b/shared/src/commonMain/kotlin/com/mifos/shared/Greeting.kt deleted file mode 100644 index dbea834..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/Greeting.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.mifos.shared - -import com.mifos.shared.Platform -import com.mifos.shared.getPlatform - -class Greeting { - private val platform: Platform = getPlatform() - - fun greet(): String { - return "Hello, ${platform.name}!" - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/PasscodeRepository.kt b/shared/src/commonMain/kotlin/com/mifos/shared/PasscodeRepository.kt deleted file mode 100644 index 7bd4cd3..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/PasscodeRepository.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mifos.shared - -interface PasscodeRepository { - fun getSavedPasscode(): String - val hasPasscode: Boolean - fun savePasscode(passcode: String) -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/PasscodeRepositoryImpl.kt b/shared/src/commonMain/kotlin/com/mifos/shared/PasscodeRepositoryImpl.kt deleted file mode 100644 index adc8d0d..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/PasscodeRepositoryImpl.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.mifos.shared - -import com.mifos.shared.utility.PreferenceManager - - -class PasscodeRepositoryImpl constructor(private val preferenceManager: PreferenceManager) : - PasscodeRepository { - - override fun getSavedPasscode(): String { - return preferenceManager.getSavedPasscode() - } - - override val hasPasscode: Boolean - get() = preferenceManager.hasPasscode - - override fun savePasscode(passcode: String) { - preferenceManager.savePasscode(passcode) - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/Platform.kt b/shared/src/commonMain/kotlin/com/mifos/shared/Platform.kt deleted file mode 100644 index b1dbcfd..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/Platform.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mifos.shared - -interface Platform { - val name: String -} - -expect fun getPlatform(): Platform \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/SetBiometricPublicKeyRepository.kt b/shared/src/commonMain/kotlin/com/mifos/shared/SetBiometricPublicKeyRepository.kt deleted file mode 100644 index 2f1f866..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/SetBiometricPublicKeyRepository.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.mifos.shared - -import kotlinx.coroutines.delay - -private var publicKeyOnServer = "" -class SetBiometricPublicKeyRepository { - suspend fun set(publicKey: String) { - delay(500) - publicKeyOnServer = publicKey - } -} - -class VerifyBiometric { - suspend fun verify(signedUserId: String): Result { - return Result.success(Unit) - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/BackSpace.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/BackSpace.kt deleted file mode 100644 index 7e0a8f9..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/BackSpace.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.materialIcon -import androidx.compose.material.icons.materialPath -import androidx.compose.ui.graphics.vector.ImageVector - -public val Icons.Filled.Backspace: ImageVector - get() { - if (_backspace != null) { - return _backspace!! - } - _backspace = materialIcon(name = "Filled.Backspace") { - materialPath { - moveTo(22.0f, 3.0f) - lineTo(7.0f, 3.0f) - curveToRelative(-0.69f, 0.0f, -1.23f, 0.35f, -1.59f, 0.88f) - lineTo(0.0f, 12.0f) - lineToRelative(5.41f, 8.11f) - curveToRelative(0.36f, 0.53f, 0.9f, 0.89f, 1.59f, 0.89f) - horizontalLineToRelative(15.0f) - curveToRelative(1.1f, 0.0f, 2.0f, -0.9f, 2.0f, -2.0f) - lineTo(24.0f, 5.0f) - curveToRelative(0.0f, -1.1f, -0.9f, -2.0f, -2.0f, -2.0f) - close() - moveTo(19.0f, 15.59f) - lineTo(17.59f, 17.0f) - lineTo(14.0f, 13.41f) - lineTo(10.41f, 17.0f) - lineTo(9.0f, 15.59f) - lineTo(12.59f, 12.0f) - lineTo(9.0f, 8.41f) - lineTo(10.41f, 7.0f) - lineTo(14.0f, 10.59f) - lineTo(17.59f, 7.0f) - lineTo(19.0f, 8.41f) - lineTo(15.41f, 12.0f) - lineTo(19.0f, 15.59f) - close() - } - } - return _backspace!! - } - -private var _backspace: ImageVector? = null diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/MifosIcon.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/MifosIcon.kt deleted file mode 100644 index b2e0e37..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/MifosIcon.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.size -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.mifos.shared.resources.Res -import com.mifos.shared.resources.mifos_logo -import org.jetbrains.compose.resources.painterResource - -@Composable -fun MifosIcon(modifier: Modifier) { - Row( - modifier = modifier, - horizontalArrangement = Arrangement.Center - ) { - Image( - modifier = Modifier.size(180.dp), - painter = painterResource(resource= Res.drawable.mifos_logo), - contentDescription = null - ) - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/PassCodeScreen.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/PassCodeScreen.kt deleted file mode 100644 index 4d79cd0..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/PassCodeScreen.kt +++ /dev/null @@ -1,287 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.animation.animateColorAsState -import androidx.compose.animation.core.Animatable -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.offset -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material.icons.Icons -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarDuration -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel -import com.mifos.shared.utility.BioMetricUtil -import com.mifos.shared.utility.PreferenceManager -import com.mifos.shared.theme.blueTint -import com.mifos.shared.utility.Constants.PASSCODE_LENGTH -import com.mifos.shared.utility.ShakeAnimation.performShakeAnimation -import com.mifos.shared.utility.Step -import com.mifos.shared.viewmodels.BiometricAuthorizationViewModel -import com.mifos.shared.viewmodels.BiometricEffect -import com.mifos.shared.viewmodels.PasscodeViewModel -import com.mifos.shared.resources.Res -import com.mifos.shared.resources.biometric_registration_success -import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch -import org.jetbrains.compose.resources.getString - -/** - * @author pratyush - * @since 15/3/24 - */ - -@Composable -fun PasscodeScreen( - viewModel: PasscodeViewModel = viewModel { PasscodeViewModel() }, - biometricAuthorizationViewModel: BiometricAuthorizationViewModel, - bioMetricUtil: BioMetricUtil, - onForgotButton: () -> Unit, - onSkipButton: () -> Unit, - onPasscodeConfirm: (String) -> Unit, - onPasscodeRejected: () -> Unit, - onBiometricAuthSuccess: () -> Unit -) { - val preferenceManager = remember { PreferenceManager() } - val activeStep by viewModel.activeStep.collectAsState() - val filledDots by viewModel.filledDots.collectAsState() - val passcodeVisible by viewModel.passcodeVisible.collectAsState() - val currentPasscode by viewModel.currentPasscodeInput.collectAsState() - val xShake = remember { Animatable(initialValue = 0.0F) } - var passcodeRejectedDialogVisible by remember { mutableStateOf(false) } - val biometricState by biometricAuthorizationViewModel.state.collectAsState() - var biometricMessage by rememberSaveable { mutableStateOf("") } - val coroutineScope = rememberCoroutineScope() - - biometricState.error?.let { - biometricMessage = it - } - - LaunchedEffect(key1 = Unit) { - biometricAuthorizationViewModel.effect.collectLatest { - when (it) { - BiometricEffect.BiometricAuthSuccess -> { - onBiometricAuthSuccess.invoke() - } - BiometricEffect.BiometricSetSuccess -> { - biometricMessage = getString( Res.string.biometric_registration_success ) - } - } - } - } - - LaunchedEffect(key1 = viewModel.onPasscodeConfirmed) { - viewModel.onPasscodeConfirmed.collect { - onPasscodeConfirm(it) - } - } - LaunchedEffect(key1 = viewModel.onPasscodeRejected) { - viewModel.onPasscodeRejected.collect { - passcodeRejectedDialogVisible = true -// vibrateFeedback(context) - performShakeAnimation(xShake) - onPasscodeRejected() - } - } - - LaunchedEffect(activeStep) { - if (activeStep == Step.Confirm) { - biometricAuthorizationViewModel.setBiometricAuthorization(bioMetricUtil) - } - } - - LaunchedEffect(true){ - if(preferenceManager.hasPasscode) - biometricAuthorizationViewModel.authorizeBiometric(bioMetricUtil) - } - - val snackBarHostState = remember { - SnackbarHostState() - } - - Scaffold( - snackbarHost = { SnackbarHost(snackBarHostState) } - ) { - Column( - modifier = Modifier - .fillMaxSize() - .background(Color.White), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - PasscodeToolbar(activeStep = activeStep, preferenceManager.hasPasscode) - PasscodeSkipButton( - onSkipButton = { onSkipButton.invoke() }, - hasPassCode = preferenceManager.hasPasscode - ) - MifosIcon(modifier = Modifier.fillMaxWidth()) - Column( - modifier = Modifier - .fillMaxWidth() - .padding(top = 16.dp, bottom = 24.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - PasscodeHeader( - activeStep = activeStep, - isPasscodeAlreadySet = preferenceManager.hasPasscode - ) - PasscodeView( - filledDots = filledDots, - currentPasscode = currentPasscode, - passcodeVisible = passcodeVisible, - togglePasscodeVisibility = { viewModel.togglePasscodeVisibility() }, - restart = { viewModel.restart() }, - passcodeRejectedDialogVisible = passcodeRejectedDialogVisible, - onDismissDialog = { passcodeRejectedDialogVisible = false }, - xShake = xShake - ) - } - Spacer(modifier = Modifier.height(6.dp)) - PasscodeKeys( - enterKey = { viewModel.enterKey(it) }, - deleteKey = { viewModel.deleteKey() }, - deleteAllKeys = { viewModel.deleteAllKeys() }, - modifier = Modifier.padding(horizontal = 12.dp) - ) - Spacer(modifier = Modifier.height(8.dp)) - PasscodeForgotButton( - onForgotButton = { onForgotButton.invoke() }, - hasPassCode = preferenceManager.hasPasscode - ) - UseTouchIdButton( - onClick = { - if(bioMetricUtil.isBiometricSet()) - biometricAuthorizationViewModel.authorizeBiometric(bioMetricUtil) - else - biometricAuthorizationViewModel.setBiometricAuthorization(bioMetricUtil) - }, - hasPassCode = preferenceManager.hasPasscode - ) - - LaunchedEffect ( biometricMessage ) { - if(biometricMessage.isNotEmpty()) { - coroutineScope.launch { - snackBarHostState.showSnackbar( - message = biometricMessage, - duration = SnackbarDuration.Short, - withDismissAction = false, - actionLabel = "Ok" - ) - } - } - } - } - } -} - -@Composable -private fun PasscodeView( - modifier: Modifier = Modifier, - restart: () -> Unit, - togglePasscodeVisibility: () -> Unit, - filledDots: Int, - passcodeVisible: Boolean, - currentPasscode: String, - passcodeRejectedDialogVisible: Boolean, - onDismissDialog: () -> Unit, - xShake: Animatable -) { - PasscodeMismatchedDialog( - visible = passcodeRejectedDialogVisible, - onDismiss = { - onDismissDialog.invoke() - restart() - } - ) - - Row( - modifier = modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically - ) { - Row( - modifier = modifier.offset(x = xShake.value.dp), - horizontalArrangement = Arrangement.spacedBy( - space = 26.dp, - alignment = Alignment.CenterHorizontally - ), - verticalAlignment = Alignment.CenterVertically - ) { - repeat(PASSCODE_LENGTH) { dotIndex -> - if (passcodeVisible && dotIndex < currentPasscode.length) { - Text( - text = currentPasscode[dotIndex].toString(), - color = blueTint - ) - } else { - val isFilledDot = dotIndex + 1 <= filledDots - val dotColor = animateColorAsState( - if (isFilledDot) blueTint else Color.Gray, label = "" - ) - - Box( - modifier = Modifier - .size(14.dp) - .background( - color = dotColor.value, - shape = CircleShape - ) - ) - } - } - } - IconButton( - onClick = { togglePasscodeVisibility.invoke() }, - modifier = Modifier.padding(start = 10.dp) - ) { - Icon( - imageVector = if (passcodeVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff, - contentDescription = null - ) - } - } -} - -//@Preview(showBackground = true) -//@Composable -//fun PasscodeScreenPreview() { -// PasscodeScreen( -// viewModel = PasscodeViewModel(object : PasscodeRepository { -// override fun getSavedPasscode(): String { -// return "" -// } -// -// override val hasPasscode: Boolean -// get() = false -// -// override fun savePasscode(passcode: String) {} -// -// }), -// {}, {}, {}, {} -// ) -//} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeButton.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeButton.kt deleted file mode 100644 index da84d03..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeButton.kt +++ /dev/null @@ -1,86 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.mifos.shared.theme.forgotButtonStyle -import com.mifos.shared.theme.skipButtonStyle -import com.mifos.shared.theme.useTouchIdButtonStyle -import com.mifos.shared.resources.Res -import com.mifos.shared.resources.forgot_passcode_login_manually -import com.mifos.shared.resources.skip -import com.mifos.shared.resources.use_touchId -import org.jetbrains.compose.resources.stringResource - -@Composable -fun PasscodeSkipButton( - onSkipButton: () -> Unit, - hasPassCode: Boolean -) { - if (!hasPassCode) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(end = 16.dp), - horizontalArrangement = Arrangement.End - ) { - TextButton( - onClick = { onSkipButton.invoke() } - ) { - Text(text = stringResource(Res.string.skip), style = skipButtonStyle()) - } - } - } - -} - -@Composable -fun PasscodeForgotButton( - onForgotButton: () -> Unit, - hasPassCode: Boolean -) { - if (hasPassCode) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(end = 16.dp), - horizontalArrangement = Arrangement.Center - ) { - TextButton( - onClick = { onForgotButton.invoke() } - ) { - Text( - text = stringResource(Res.string.forgot_passcode_login_manually), - style = forgotButtonStyle() - ) - } - } - } -} - -@Composable -fun UseTouchIdButton( - onClick: () -> Unit, - hasPassCode: Boolean -) { - if (hasPassCode) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(end = 16.dp), - horizontalArrangement = Arrangement.Center - ) { - TextButton( - onClick = onClick - ) { - Text(text = stringResource(Res.string.use_touchId), style = useTouchIdButtonStyle()) - } - } - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeHeader.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeHeader.kt deleted file mode 100644 index 97e6f43..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeHeader.kt +++ /dev/null @@ -1,114 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.animation.core.MutableTransitionState -import androidx.compose.animation.core.Transition -import androidx.compose.animation.core.animateFloat -import androidx.compose.animation.core.animateOffset -import androidx.compose.animation.core.updateTransition -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.offset -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.draw.scale -import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.mifos.shared.utility.Step -import com.mifos.shared.resources.Res -import com.mifos.shared.resources.confirm_passcode -import com.mifos.shared.resources.create_passcode -import com.mifos.shared.resources.enter_your_passcode -import org.jetbrains.compose.resources.stringResource - -@Composable -fun PasscodeHeader( - modifier: Modifier = Modifier, - activeStep: Step, - isPasscodeAlreadySet: Boolean, -) { - val transitionState = remember { MutableTransitionState(activeStep) } - transitionState.targetState = activeStep - - val transition: Transition = updateTransition( - transitionState = transitionState, - label = "Headers Transition" - ) - - val offset = 200.0F - val zeroOffset = Offset(x = 0.0F, y = 0.0F) - val negativeOffset = Offset(x = -offset, y = 0.0F) - val positiveOffset = Offset(x = offset, y = 0.0F) - - val xTransitionHeader1 by transition.animateOffset(label = "Transition Offset Header 1") { - if (it == Step.Create) zeroOffset else negativeOffset - } - val xTransitionHeader2 by transition.animateOffset(label = "Transition Offset Header 2") { - if (it == Step.Confirm) zeroOffset else positiveOffset - } - val alphaHeader1 by transition.animateFloat(label = "Transition Alpha Header 1") { - if (it == Step.Create) 1.0F else 0.0F - } - val alphaHeader2 by transition.animateFloat(label = "Transition Alpha Header 2") { - if (it == Step.Confirm) 1.0F else 0.0F - } - val scaleHeader1 by transition.animateFloat(label = "Transition Alpha Header 1") { - if (it == Step.Create) 1.0F else 0.5F - } - val scaleHeader2 by transition.animateFloat(label = "Transition Alpha Header 2") { - if (it == Step.Confirm) 1.0F else 0.5F - } - - Box( - modifier = modifier.fillMaxWidth(), - contentAlignment = Alignment.Center - ) { - Box( - modifier = modifier.fillMaxWidth(), - contentAlignment = Alignment.Center - ) { - if (isPasscodeAlreadySet) { - Text( - modifier = Modifier - .offset(x = xTransitionHeader1.x.dp) - .alpha(alpha = alphaHeader1) - .scale(scale = scaleHeader1), - text = stringResource(resource = Res.string.enter_your_passcode), - style = TextStyle(fontSize = 20.sp) - ) - } else { - if (activeStep == Step.Create) { - Text( - modifier = Modifier - .offset(x = xTransitionHeader1.x.dp) - .alpha(alpha = alphaHeader1) - .scale(scale = scaleHeader1), - text = stringResource(resource = Res.string.create_passcode), - style = TextStyle(fontSize = 20.sp) - ) - } else if (activeStep == Step.Confirm) { - Text( - modifier = Modifier - .offset(x = xTransitionHeader2.x.dp) - .alpha(alpha = alphaHeader2) - .scale(scale = scaleHeader2), - text = stringResource(resource = Res.string.confirm_passcode), - style = TextStyle(fontSize = 20.sp) - ) - } - } - } - } -} - -//@Preview -//@Composable -//fun PasscodeHeaderPreview() { -// PasscodeHeader(activeStep = Step.Create, isPasscodeAlreadySet = true) -//} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeKeys.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeKeys.kt deleted file mode 100644 index d132006..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeKeys.kt +++ /dev/null @@ -1,199 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.Image -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.ripple.rememberRipple -import androidx.compose.material3.Icon -import androidx.compose.material3.LocalContentColor -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.semantics.Role -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import com.mifos.shared.theme.PasscodeKeyButtonStyle -import com.mifos.shared.theme.blueTint - -@Composable -fun PasscodeKeys( - enterKey: (String) -> Unit, - deleteKey: () -> Unit, - deleteAllKeys: () -> Unit, - modifier: Modifier = Modifier, -) { - val onEnterKeyClick = { keyTitle: String -> - enterKey(keyTitle) - } - Column( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - ) { - Row(modifier = Modifier.fillMaxWidth()) { - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "1", - onClick = onEnterKeyClick - ) - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "2", - onClick = onEnterKeyClick - ) - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "3", - onClick = onEnterKeyClick - ) - } - Row(modifier = Modifier.fillMaxWidth()) { - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "4", - onClick = onEnterKeyClick - ) - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "5", - onClick = onEnterKeyClick - ) - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "6", - onClick = onEnterKeyClick - ) - } - Row(modifier = Modifier.fillMaxWidth()) { - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "7", - onClick = onEnterKeyClick - ) - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "8", - onClick = onEnterKeyClick - ) - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "9", - onClick = onEnterKeyClick - ) - } - Row(modifier = Modifier.fillMaxWidth()) { - PasscodeKey(modifier = Modifier.weight(weight = 1.0F)) - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyTitle = "0", - onClick = onEnterKeyClick - ) - PasscodeKey( - modifier = Modifier.weight(weight = 1.0F), - keyIcon = Icons.Filled.Backspace, - keyIconContentDescription = "Delete Passcode Key Button", - onClick = { - deleteKey() - }, - onLongClick = { - deleteAllKeys() - } - ) - } - } -} - -@Composable -fun PasscodeKey( - modifier: Modifier = Modifier, - keyTitle: String = "", - keyIcon: ImageVector? = null, - keyIconContentDescription: String = "", - onClick: ((String) -> Unit)? = null, - onLongClick: (() -> Unit)? = null -) { - Row( - modifier = modifier, - horizontalArrangement = Arrangement.Center - ) { - CombinedClickableIconButton( - modifier = Modifier - .padding(all = 4.dp), - onClick = { - onClick?.invoke(keyTitle) - }, - onLongClick = { - onLongClick?.invoke() - } - ) { - if (keyIcon == null) { - Text( - text = keyTitle, - style = PasscodeKeyButtonStyle().copy(color = blueTint) - ) - } else { - Icon( - imageVector = Icons.Default.Backspace, - contentDescription = keyIconContentDescription, - tint = blueTint - ) - } - } - } -} - -@OptIn(ExperimentalFoundationApi::class) -@Composable -fun CombinedClickableIconButton( - onClick: () -> Unit, - onLongClick: () -> Unit, - modifier: Modifier = Modifier, - size: Dp = 48.dp, - rippleRadius: Dp = 36.dp, - enabled: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - content: @Composable () -> Unit -) { - Column( - modifier = modifier - .size(size = size) - .combinedClickable( - onClick = onClick, - onLongClick = onLongClick, - enabled = enabled, - role = Role.Button, - interactionSource = interactionSource, - indication = rememberRipple( - bounded = false, - radius = rippleRadius, - color = Color.Cyan - ) - ), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally - ) { - val contentAlpha = - if (enabled) LocalContentColor.current else LocalContentColor.current.copy(alpha = 0f) - CompositionLocalProvider(LocalContentColor provides contentAlpha, content = content) - } -} - - -//@Preview -//@Composable -//fun PasscodeKeysPreview() { -// PasscodeKeys({}, {}, {}) -//} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeMismatchedDialog.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeMismatchedDialog.kt deleted file mode 100644 index d41d108..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeMismatchedDialog.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Color -import com.mifos.shared.resources.Res -import com.mifos.shared.resources.passcode_do_not_match -import com.mifos.shared.resources.try_again -import org.jetbrains.compose.resources.stringResource - -@Composable -fun PasscodeMismatchedDialog( - visible: Boolean, - onDismiss: () -> Unit -) { - if (visible) { - AlertDialog( - shape = MaterialTheme.shapes.large, - containerColor = Color.White, - title = { - Text( - text = stringResource(Res.string.passcode_do_not_match), - color = Color.Black - ) - }, - confirmButton = { - TextButton(onClick = onDismiss) { - Text(text = stringResource(Res.string.try_again), color = Color.Black) - } - }, - onDismissRequest = onDismiss - ) - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeStepIndicator.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeStepIndicator.kt deleted file mode 100644 index a01cde6..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeStepIndicator.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.animation.animateColorAsState -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.size -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp -import com.mifos.shared.theme.blueTint -import com.mifos.shared.utility.Constants.STEPS_COUNT -import com.mifos.shared.utility.Step - -@Composable -fun PasscodeStepIndicator( - modifier: Modifier = Modifier, - activeStep: Step -) { - Row( - modifier = modifier, - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy( - space = 6.dp, - alignment = Alignment.CenterHorizontally - ) - ) { - repeat(STEPS_COUNT) { step -> - val isActiveStep = step <= activeStep.index - val stepColor = - animateColorAsState(if (isActiveStep) blueTint else Color.Gray, label = "") - - Box( - modifier = Modifier - .size( - width = 72.dp, - height = 4.dp - ) - .background( - color = stepColor.value, - shape = MaterialTheme.shapes.medium - ) - ) - } - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeToolbar.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeToolbar.kt deleted file mode 100644 index 2bc44bd..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/PasscodeToolbar.kt +++ /dev/null @@ -1,80 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp -import com.mifos.shared.utility.Step -import com.mifos.shared.resources.Res -import com.mifos.shared.resources.are_you_sure_you_want_to_exit -import com.mifos.shared.resources.cancel -import com.mifos.shared.resources.exit -import org.jetbrains.compose.resources.stringResource - -@Composable -fun PasscodeToolbar(activeStep: Step, hasPasscode: Boolean) { - var exitWarningDialogVisible by remember { mutableStateOf(false) } - ExitWarningDialog( - visible = exitWarningDialogVisible, - onConfirm = {}, - onDismiss = { - exitWarningDialogVisible = false - } - ) - - Row( - modifier = Modifier - .fillMaxWidth() - .padding(top = 8.dp), - horizontalArrangement = Arrangement.Center - ) { - if (!hasPasscode) { - PasscodeStepIndicator( - activeStep = activeStep - ) - } - } -} - -@Composable -fun ExitWarningDialog( - visible: Boolean, - onConfirm: () -> Unit, - onDismiss: () -> Unit -) { - if (visible) { - AlertDialog( - shape = MaterialTheme.shapes.large, - containerColor = Color.White, - title = { - Text( - text = stringResource(Res.string.are_you_sure_you_want_to_exit), - color = Color.Black - ) - }, - confirmButton = { - TextButton(onClick = onConfirm) { - Text(text = stringResource(Res.string.exit)) - } - }, - dismissButton = { - TextButton(onClick = onDismiss) { - Text(text = stringResource(Res.string.cancel)) - } - }, - onDismissRequest = onDismiss - ) - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/Visibility.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/Visibility.kt deleted file mode 100644 index 9264e0b..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/Visibility.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.materialIcon -import androidx.compose.material.icons.materialPath -import androidx.compose.ui.graphics.vector.ImageVector - -public val Icons.Filled.VisibilityOff: ImageVector - get() { - if (_visibilityOff != null) { - return _visibilityOff!! - } - _visibilityOff = materialIcon(name = "Filled.VisibilityOff") { - materialPath { - moveTo(12.0f, 7.0f) - curveToRelative(2.76f, 0.0f, 5.0f, 2.24f, 5.0f, 5.0f) - curveToRelative(0.0f, 0.65f, -0.13f, 1.26f, -0.36f, 1.83f) - lineToRelative(2.92f, 2.92f) - curveToRelative(1.51f, -1.26f, 2.7f, -2.89f, 3.43f, -4.75f) - curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f) - curveToRelative(-1.4f, 0.0f, -2.74f, 0.25f, -3.98f, 0.7f) - lineToRelative(2.16f, 2.16f) - curveTo(10.74f, 7.13f, 11.35f, 7.0f, 12.0f, 7.0f) - close() - moveTo(2.0f, 4.27f) - lineToRelative(2.28f, 2.28f) - lineToRelative(0.46f, 0.46f) - curveTo(3.08f, 8.3f, 1.78f, 10.02f, 1.0f, 12.0f) - curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f) - curveToRelative(1.55f, 0.0f, 3.03f, -0.3f, 4.38f, -0.84f) - lineToRelative(0.42f, 0.42f) - lineTo(19.73f, 22.0f) - lineTo(21.0f, 20.73f) - lineTo(3.27f, 3.0f) - lineTo(2.0f, 4.27f) - close() - moveTo(7.53f, 9.8f) - lineToRelative(1.55f, 1.55f) - curveToRelative(-0.05f, 0.21f, -0.08f, 0.43f, -0.08f, 0.65f) - curveToRelative(0.0f, 1.66f, 1.34f, 3.0f, 3.0f, 3.0f) - curveToRelative(0.22f, 0.0f, 0.44f, -0.03f, 0.65f, -0.08f) - lineToRelative(1.55f, 1.55f) - curveToRelative(-0.67f, 0.33f, -1.41f, 0.53f, -2.2f, 0.53f) - curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f) - curveToRelative(0.0f, -0.79f, 0.2f, -1.53f, 0.53f, -2.2f) - close() - moveTo(11.84f, 9.02f) - lineToRelative(3.15f, 3.15f) - lineToRelative(0.02f, -0.16f) - curveToRelative(0.0f, -1.66f, -1.34f, -3.0f, -3.0f, -3.0f) - lineToRelative(-0.17f, 0.01f) - close() - } - } - return _visibilityOff!! - } - -private var _visibilityOff: ImageVector? = null diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/component/VisibilityOff.kt b/shared/src/commonMain/kotlin/com/mifos/shared/component/VisibilityOff.kt deleted file mode 100644 index 44fffff..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/component/VisibilityOff.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.mifos.shared.component - -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.materialIcon -import androidx.compose.material.icons.materialPath -import androidx.compose.ui.graphics.vector.ImageVector - -public val Icons.Filled.Visibility: ImageVector - get() { - if (_visibility != null) { - return _visibility!! - } - _visibility = materialIcon(name = "Filled.Visibility") { - materialPath { - moveTo(12.0f, 4.5f) - curveTo(7.0f, 4.5f, 2.73f, 7.61f, 1.0f, 12.0f) - curveToRelative(1.73f, 4.39f, 6.0f, 7.5f, 11.0f, 7.5f) - reflectiveCurveToRelative(9.27f, -3.11f, 11.0f, -7.5f) - curveToRelative(-1.73f, -4.39f, -6.0f, -7.5f, -11.0f, -7.5f) - close() - moveTo(12.0f, 17.0f) - curveToRelative(-2.76f, 0.0f, -5.0f, -2.24f, -5.0f, -5.0f) - reflectiveCurveToRelative(2.24f, -5.0f, 5.0f, -5.0f) - reflectiveCurveToRelative(5.0f, 2.24f, 5.0f, 5.0f) - reflectiveCurveToRelative(-2.24f, 5.0f, -5.0f, 5.0f) - close() - moveTo(12.0f, 9.0f) - curveToRelative(-1.66f, 0.0f, -3.0f, 1.34f, -3.0f, 3.0f) - reflectiveCurveToRelative(1.34f, 3.0f, 3.0f, 3.0f) - reflectiveCurveToRelative(3.0f, -1.34f, 3.0f, -3.0f) - reflectiveCurveToRelative(-1.34f, -3.0f, -3.0f, -3.0f) - close() - } - } - return _visibility!! - } - -private var _visibility: ImageVector? = null \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/theme/Color.kt b/shared/src/commonMain/kotlin/com/mifos/shared/theme/Color.kt deleted file mode 100644 index 497483a..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/theme/Color.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.mifos.shared.theme - -import androidx.compose.ui.graphics.Color - -val blueTint = Color(0xFF03A9F4) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/theme/Font.kt b/shared/src/commonMain/kotlin/com/mifos/shared/theme/Font.kt deleted file mode 100644 index f6c2937..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/theme/Font.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.mifos.shared.theme - -import androidx.compose.runtime.Composable -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import com.mifos.shared.resources.Res -import com.mifos.shared.resources.lato_black -import com.mifos.shared.resources.lato_bold -import com.mifos.shared.resources.lato_regular -import org.jetbrains.compose.resources.Font - -@Composable -fun LatoFonts() = FontFamily( - Font( - resource = Res.font.lato_regular, - weight = FontWeight.Normal, - style = FontStyle.Normal - ), - Font( - resource = Res.font.lato_bold, - weight = FontWeight.Bold, - style = FontStyle.Normal - ), - Font( - resource = Res.font.lato_black, - weight = FontWeight.Black, - style = FontStyle.Normal - ) -) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/theme/Theme.kt b/shared/src/commonMain/kotlin/com/mifos/shared/theme/Theme.kt deleted file mode 100644 index 760c6c5..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/theme/Theme.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.mifos.shared.theme - -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.lightColorScheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Color.Companion.Blue - -private val DarkColorPalette = darkColorScheme( - primary = Color.Cyan, - onPrimary = Color.Cyan, - secondary = Color.Black.copy(alpha = 0.2f), - background = Color.Black -) -private val LightColorPalette = lightColorScheme( - primary = Blue, - onPrimary = Blue, - secondary = Color.Blue.copy(alpha = 0.4f), - background = Color.White -) - -@Composable -fun MifosPasscodeTheme( - darkTheme: Boolean = isSystemInDarkTheme(), - content: @Composable () -> Unit -) { - val colors = if (darkTheme) { - DarkColorPalette - } else { - LightColorPalette - } - - MaterialTheme( - colorScheme = colors, - typography = Typography(), - content = content - ) -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/theme/Type.kt b/shared/src/commonMain/kotlin/com/mifos/shared/theme/Type.kt deleted file mode 100644 index af9c8c3..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/theme/Type.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.mifos.shared.theme - -import androidx.compose.material3.Typography -import androidx.compose.runtime.Composable -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.sp - -@Composable -fun Typography() = Typography().run { - val fontFamily = LatoFonts() - copy( - displayLarge = displayLarge.copy(fontFamily = fontFamily), - displayMedium = displayMedium.copy(fontFamily = fontFamily), - displaySmall = displaySmall.copy(fontFamily = fontFamily), - headlineLarge = headlineLarge.copy(fontFamily = fontFamily), - headlineMedium = headlineMedium.copy(fontFamily = fontFamily), - headlineSmall = headlineSmall.copy(fontFamily = fontFamily), - titleLarge = titleLarge.copy(fontFamily = fontFamily), - titleMedium = titleMedium.copy(fontFamily = fontFamily), - titleSmall = titleSmall.copy(fontFamily = fontFamily), - bodyLarge = bodyLarge.copy(fontFamily = fontFamily), - bodyMedium = bodyMedium.copy(fontFamily = fontFamily), - bodySmall = bodySmall.copy(fontFamily = fontFamily), - labelLarge = labelLarge.copy(fontFamily = fontFamily), - labelMedium = labelMedium.copy(fontFamily = fontFamily), - labelSmall = labelSmall.copy(fontFamily = fontFamily) - ) -} - -@Composable -fun PasscodeKeyButtonStyle() = TextStyle( - fontFamily = LatoFonts(), - fontWeight = FontWeight.Bold, - fontSize = 24.sp -) - -@Composable -fun skipButtonStyle() = TextStyle( - color = blueTint, - fontSize = 20.sp, - fontFamily = LatoFonts() -) - -@Composable -fun forgotButtonStyle() = TextStyle( - color = blueTint, - fontSize = 14.sp, - fontFamily = LatoFonts() -) - -@Composable -fun useTouchIdButtonStyle() = TextStyle( - color = blueTint, - fontSize = 14.sp, - fontFamily = LatoFonts() -) \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/utility/BioMetricUtil.kt b/shared/src/commonMain/kotlin/com/mifos/shared/utility/BioMetricUtil.kt deleted file mode 100644 index 8e1bbd6..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/utility/BioMetricUtil.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.mifos.shared.utility - -interface BioMetricUtil { - - suspend fun setAndReturnPublicKey(): String? - suspend fun authenticate(): AuthenticationResult - fun canAuthenticate(): Boolean - suspend fun generatePublicKey(): String? - fun signUserId(ucc: String): String - fun isBiometricSet(): Boolean - fun getPublicKey(): String? - fun isValidCrypto(): Boolean -} - -sealed class AuthenticationResult { - data object Success: AuthenticationResult() - data object Failed: AuthenticationResult() - data object AttemptExhausted: AuthenticationResult() - data object NegativeButtonClick: AuthenticationResult() - data class Error(val error: String): AuthenticationResult() -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/utility/Constants.kt b/shared/src/commonMain/kotlin/com/mifos/shared/utility/Constants.kt deleted file mode 100644 index 5d277e4..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/utility/Constants.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.mifos.shared.utility - -object Constants { - const val STEPS_COUNT = 2 - const val PASSCODE_LENGTH = 4 - const val VIBRATE_FEEDBACK_DURATION = 300L -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/utility/PreferenceManager.kt b/shared/src/commonMain/kotlin/com/mifos/shared/utility/PreferenceManager.kt deleted file mode 100644 index b075c2c..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/utility/PreferenceManager.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.mifos.shared.utility - -import com.mifos.shared.resources.Res -import com.mifos.shared.resources.has_passcode -import com.mifos.shared.resources.passcode -import com.russhwolf.settings.Settings - -/** - * @author pratyush - * @since 15/3/24 - */ - -class PreferenceManager( ) -{ - private val settings : Settings by lazy { - Settings() - } - - var hasPasscode: Boolean - get() = settings.getBoolean(Res.string.has_passcode.toString(), false) - set(value) = settings.putBoolean(Res.string.has_passcode.toString(), value) - - fun savePasscode(passcode: String) { - settings.putString(Res.string.passcode.toString(), passcode) - hasPasscode = true - } - - fun getSavedPasscode(): String { - return settings.getString(Res.string.passcode.toString(), "") - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/utility/ShakeAnimation.kt b/shared/src/commonMain/kotlin/com/mifos/shared/utility/ShakeAnimation.kt deleted file mode 100644 index 0065d38..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/utility/ShakeAnimation.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.mifos.shared.utility - -import androidx.compose.animation.core.Animatable -import androidx.compose.animation.core.LinearOutSlowInEasing -import androidx.compose.animation.core.keyframes -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -object ShakeAnimation { - - fun CoroutineScope.performShakeAnimation(xShake: Animatable) { - launch { - xShake.animateTo( - targetValue = 0f, // This resets the position after the shake - animationSpec = keyframes { - durationMillis = 280 // Total animation duration - 0f at 0 with LinearOutSlowInEasing // Start position - 20f at 80 with LinearOutSlowInEasing // Move right - -20f at 120 with LinearOutSlowInEasing // Move left - 10f at 160 with LinearOutSlowInEasing // Move right - -10f at 200 with LinearOutSlowInEasing // Move left - 5f at 240 with LinearOutSlowInEasing // Move right - 0f at 280 // End at the original position - } - ) - } - } -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/utility/Step.kt b/shared/src/commonMain/kotlin/com/mifos/shared/utility/Step.kt deleted file mode 100644 index ba765b5..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/utility/Step.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.mifos.shared.utility - -enum class Step(var index: Int) { - Create(0), - Confirm(1) -} diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/viewmodels/BiometricAuthorizationViewModel.kt b/shared/src/commonMain/kotlin/com/mifos/shared/viewmodels/BiometricAuthorizationViewModel.kt deleted file mode 100644 index 5fbaf20..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/viewmodels/BiometricAuthorizationViewModel.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.mifos.shared.viewmodels - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.mifos.shared.utility.AuthenticationResult -import com.mifos.shared.utility.BioMetricUtil -import com.mifos.shared.SetBiometricPublicKeyRepository -import com.mifos.shared.VerifyBiometric -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch - -class BiometricAuthorizationViewModel: ViewModel() { - private val setBiometricPublicKeyRepository = SetBiometricPublicKeyRepository() - private val verifyBiometric = VerifyBiometric() - - private val _state: MutableStateFlow = - MutableStateFlow(BiometricState(false, null)) - private val _effect: MutableSharedFlow = MutableSharedFlow(replay = 0) - - val state: StateFlow - get() = _state - - val effect: SharedFlow - get() = _effect - - fun setBiometricAuthorization(bioMetricUtil: BioMetricUtil) { - viewModelScope.launch { - _state.value = BiometricState(isLoading = true, error = null) - if (!bioMetricUtil.canAuthenticate()) { - _state.value = BiometricState(isLoading = true, error = "Biometric not available") - return@launch - } - val publicKey = bioMetricUtil.setAndReturnPublicKey() ?: "" - setBiometricPublicKeyRepository.set(publicKey) - _state.value = BiometricState(isLoading = false, error = null) - _effect.emit(BiometricEffect.BiometricSetSuccess) - - } - } - - fun authorizeBiometric(bioMetricUtil: BioMetricUtil) { - viewModelScope.launch { - when(val biometricResult = bioMetricUtil.authenticate()) { - AuthenticationResult.AttemptExhausted -> { - _state.value = BiometricState(isLoading = false, error = "Attempt Exhausted") - } - is AuthenticationResult.Error -> { - _state.value = BiometricState(isLoading = false, error = biometricResult.error) - } - AuthenticationResult.Failed -> { - _state.value = BiometricState(isLoading = false, error = "Biometric Failed") - } - AuthenticationResult.NegativeButtonClick -> { - _state.value = BiometricState(isLoading = false, error = "Biometric Canceled") - } - AuthenticationResult.Success -> { - _state.value = BiometricState(isLoading = true, error = null) - val signedUserId = bioMetricUtil.signUserId("userId") - val result = verifyBiometric.verify(signedUserId) - if (result.isSuccess) { - _state.value = BiometricState(isLoading = false, error = null) - _effect.emit(BiometricEffect.BiometricAuthSuccess) - } else { - _state.value = BiometricState(isLoading = false, error = result.exceptionOrNull()!!.message) - } - } - } - - } - } -} - -data class BiometricState( - val isLoading: Boolean, - val error: String? -) - -sealed class BiometricEffect { - data object BiometricSetSuccess: BiometricEffect() - data object BiometricAuthSuccess: BiometricEffect() -} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/com/mifos/shared/viewmodels/PasscodeViewModel.kt b/shared/src/commonMain/kotlin/com/mifos/shared/viewmodels/PasscodeViewModel.kt deleted file mode 100644 index 5a68f92..0000000 --- a/shared/src/commonMain/kotlin/com/mifos/shared/viewmodels/PasscodeViewModel.kt +++ /dev/null @@ -1,146 +0,0 @@ -package com.mifos.shared.viewmodels - -import androidx.compose.runtime.mutableStateOf -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.mifos.shared.utility.PreferenceManager -import com.mifos.shared.PasscodeRepositoryImpl -import com.mifos.shared.utility.Constants.PASSCODE_LENGTH -import com.mifos.shared.utility.Step -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch -/** - * @author pratyush - * @since 15/3/24 - */ - -class PasscodeViewModel : - ViewModel() { - - private val - passcodeRepository = PasscodeRepositoryImpl(PreferenceManager()) - private val _onPasscodeConfirmed = MutableSharedFlow() - private val _onPasscodeRejected = MutableSharedFlow() - - private val _activeStep = MutableStateFlow(Step.Create) - private val _filledDots = MutableStateFlow(0) - - private var createPasscode: StringBuilder = StringBuilder() - private var confirmPasscode: StringBuilder = StringBuilder() - - val onPasscodeConfirmed = _onPasscodeConfirmed.asSharedFlow() - val onPasscodeRejected = _onPasscodeRejected.asSharedFlow() - - val activeStep = _activeStep.asStateFlow() - val filledDots = _filledDots.asStateFlow() - - private val _passcodeVisible = MutableStateFlow(false) - val passcodeVisible = _passcodeVisible.asStateFlow() - - private val _currentPasscodeInput = MutableStateFlow("") - val currentPasscodeInput = _currentPasscodeInput.asStateFlow() - - private var _isPasscodeAlreadySet = mutableStateOf(passcodeRepository.hasPasscode) - - init { - resetData() - } - - private fun emitActiveStep(activeStep: Step) = viewModelScope.launch { - _activeStep.emit(activeStep) - } - - private fun emitFilledDots(filledDots: Int) = viewModelScope.launch { - _filledDots.emit(filledDots) - } - - private fun emitOnPasscodeConfirmed(confirmPassword: String) = viewModelScope.launch { - _onPasscodeConfirmed.emit(confirmPassword) - } - - private fun emitOnPasscodeRejected() = viewModelScope.launch { - _onPasscodeRejected.emit(Unit) - } - - fun togglePasscodeVisibility() { - _passcodeVisible.value = !_passcodeVisible.value - } - - private fun resetData() { - emitActiveStep(Step.Create) - emitFilledDots(0) - - createPasscode.clear() - confirmPasscode.clear() - } - - fun enterKey(key: String) { - if (_filledDots.value >= PASSCODE_LENGTH) { - return - } - - val currentPasscode = - if (_activeStep.value == Step.Create) createPasscode else confirmPasscode - currentPasscode.append(key) - _currentPasscodeInput.value = currentPasscode.toString() - emitFilledDots(currentPasscode.length) - - if (_filledDots.value == PASSCODE_LENGTH) { - if (_isPasscodeAlreadySet.value) { - if (passcodeRepository.getSavedPasscode() == createPasscode.toString()) { - emitOnPasscodeConfirmed(createPasscode.toString()) - createPasscode.clear() - } else { - emitOnPasscodeRejected() - // logic for retires can be written here - } - _currentPasscodeInput.value = "" - } else if (_activeStep.value == Step.Create) { - emitActiveStep(Step.Confirm) - emitFilledDots(0) - _currentPasscodeInput.value = "" - } else { - if (createPasscode.toString() == confirmPasscode.toString()) { - emitOnPasscodeConfirmed(confirmPasscode.toString()) - passcodeRepository.savePasscode(confirmPasscode.toString()) - _isPasscodeAlreadySet.value = true - resetData() - } else { - emitOnPasscodeRejected() - resetData() - } - _currentPasscodeInput.value = "" - } - } - } - - fun deleteKey() { - val currentPasscode = - if (_activeStep.value == Step.Create) createPasscode else confirmPasscode - - if (currentPasscode.isNotEmpty()) { - currentPasscode.deleteAt(currentPasscode.length - 1) - _currentPasscodeInput.value = currentPasscode.toString() - emitFilledDots(currentPasscode.length) - } - } - - - fun deleteAllKeys() { - if (_activeStep.value == Step.Create) { - createPasscode.clear() - } else { - confirmPasscode.clear() - } - _currentPasscodeInput.value = "" - emitFilledDots(0) - } - - fun restart() { - resetData() - _passcodeVisible.value = false - } -} \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/com/mifos/shared/App.ios.kt b/shared/src/iosMain/kotlin/com/mifos/shared/App.ios.kt deleted file mode 100644 index 9ab3e9e..0000000 --- a/shared/src/iosMain/kotlin/com/mifos/shared/App.ios.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.mifos.shared - -import androidx.compose.ui.window.ComposeUIViewController -import com.mifos.shared.utility.BioMetricUtil -import com.mifos.shared.component.PasscodeScreen -import com.mifos.shared.viewmodels.BiometricAuthorizationViewModel -import platform.UIKit.UIViewController - -fun MainViewController( - bioMetricUtil: BioMetricUtil, - biometricViewModel: BiometricAuthorizationViewModel, - onPasscodeConfirm: () -> Unit, -): UIViewController = ComposeUIViewController { - PasscodeScreen( - onPasscodeConfirm = { - onPasscodeConfirm() - }, - onSkipButton = { - onPasscodeConfirm() - }, - onForgotButton = {}, - onPasscodeRejected = {}, - bioMetricUtil = bioMetricUtil, - biometricAuthorizationViewModel = biometricViewModel, - onBiometricAuthSuccess = { - onPasscodeConfirm() - } - ) -} \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/com/mifos/shared/CipherUtilImpl.ios.kt b/shared/src/iosMain/kotlin/com/mifos/shared/CipherUtilImpl.ios.kt deleted file mode 100644 index 5f4ea4a..0000000 --- a/shared/src/iosMain/kotlin/com/mifos/shared/CipherUtilImpl.ios.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.mifos.shared - -import com.mifos.shared.CommonPublicKey - -actual data class CommonKeyPair(val publicKey: String?, val privateKey: String?) -actual interface CommonPublicKey { - val encoded: String -} -actual class Crypto - -data class CommonPublicKeyImpl(override val encoded: String): CommonPublicKey \ No newline at end of file diff --git a/shared/src/iosMain/kotlin/com/mifos/shared/Platform.ios.kt b/shared/src/iosMain/kotlin/com/mifos/shared/Platform.ios.kt deleted file mode 100644 index b8f4fce..0000000 --- a/shared/src/iosMain/kotlin/com/mifos/shared/Platform.ios.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.mifos.shared - -import platform.UIKit.UIDevice - -class IOSPlatform: Platform { - override val name: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion -} - -actual fun getPlatform(): Platform = IOSPlatform() \ No newline at end of file