├── .editorconfig ├── .gitignore ├── .lint └── config.xml ├── CHANGELOG.md ├── LICENSE ├── Makefile ├── README.md ├── androidApp ├── build.gradle.kts ├── fake-google-services.json ├── google-services.json ├── proguard-rules.pro └── src │ ├── androidTest │ └── kotlin │ │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── android │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── kotlin │ │ └── tech │ │ │ └── alexib │ │ │ └── yaba │ │ │ └── android │ │ │ ├── MainActivity.kt │ │ │ ├── MainApp.kt │ │ │ ├── di │ │ │ └── viewModelModule.kt │ │ │ ├── fcm │ │ │ ├── FCMService.kt │ │ │ └── PushTokenManagerImpl.kt │ │ │ ├── navigation │ │ │ └── AppNavigation.kt │ │ │ ├── ui │ │ │ ├── MainAppLayout.kt │ │ │ ├── YabaBottomAppBar.kt │ │ │ ├── accounts │ │ │ │ ├── AccountsScreen.kt │ │ │ │ ├── AccountsScreenAction.kt │ │ │ │ ├── AccountsScreenViewModel.kt │ │ │ │ └── detail │ │ │ │ │ ├── AccountDetailScreen.kt │ │ │ │ │ ├── AccountDetailScreenAction.kt │ │ │ │ │ ├── AccountDetailScreenParams.kt │ │ │ │ │ └── AccountDetailScreenViewModel.kt │ │ │ ├── auth │ │ │ │ ├── biometric │ │ │ │ │ ├── BiometricSetupScreen.kt │ │ │ │ │ ├── BiometricSetupScreenAction.kt │ │ │ │ │ ├── BiometricSetupScreenState.kt │ │ │ │ │ └── BiometricSetupScreenViewModel.kt │ │ │ │ ├── components │ │ │ │ │ ├── Password.kt │ │ │ │ │ ├── Username.kt │ │ │ │ │ └── Welcome.kt │ │ │ │ ├── login │ │ │ │ │ ├── Login.kt │ │ │ │ │ └── LoginScreenViewModel.kt │ │ │ │ ├── register │ │ │ │ │ ├── Register.kt │ │ │ │ │ └── RegisterScreenViewModel.kt │ │ │ │ └── splash │ │ │ │ │ └── SplashScreenViewModel.kt │ │ │ ├── components.kt │ │ │ ├── components │ │ │ │ ├── BackArrowButton.kt │ │ │ │ ├── BalanceRow.kt │ │ │ │ ├── BankLogo.kt │ │ │ │ ├── ErrorText.kt │ │ │ │ ├── ExpandableContent.kt │ │ │ │ ├── GenericDialog.kt │ │ │ │ ├── LoadingScreen.kt │ │ │ │ ├── Money.kt │ │ │ │ ├── NoSpendingInSelectedRange.kt │ │ │ │ ├── SlideInContent.kt │ │ │ │ ├── SpendingWidget.kt │ │ │ │ ├── TotalCashBalanceRow.kt │ │ │ │ ├── TransactionItem.kt │ │ │ │ ├── YabaCard.kt │ │ │ │ ├── YabaLogo.kt │ │ │ │ └── YabaRow.kt │ │ │ ├── home │ │ │ │ ├── Home.kt │ │ │ │ └── HomeViewModel.kt │ │ │ ├── plaid │ │ │ │ ├── PlaidLinkHandler.kt │ │ │ │ ├── PlaidLinkResultScreen.kt │ │ │ │ ├── PlaidLinkResultScreenViewModel.kt │ │ │ │ ├── PlaidLinkScreen.kt │ │ │ │ └── PlaidLinkViewModel.kt │ │ │ ├── settings │ │ │ │ ├── SettingsScreen.kt │ │ │ │ ├── SettingsScreenAction.kt │ │ │ │ ├── SettingsScreenViewModel.kt │ │ │ │ └── plaid_items │ │ │ │ │ ├── PlaidItemDetailScreen.kt │ │ │ │ │ ├── PlaidItemDetailScreenViewModel.kt │ │ │ │ │ ├── PlaidItemsScreen.kt │ │ │ │ │ ├── PlaidItemsScreenAction.kt │ │ │ │ │ └── PlaidItemsScreenViewModel.kt │ │ │ ├── theme │ │ │ │ ├── Color.kt │ │ │ │ ├── Margin.kt │ │ │ │ ├── Shape.kt │ │ │ │ ├── Theme.kt │ │ │ │ └── Type.kt │ │ │ └── transactions │ │ │ │ ├── TransactionDetailScreen.kt │ │ │ │ ├── TransactionDetailScreenAction.kt │ │ │ │ ├── TransactionDetailScreenViewModel.kt │ │ │ │ ├── TransactionListScreen.kt │ │ │ │ └── TransactionListScreenViewModel.kt │ │ │ └── util │ │ │ ├── BackpressHandler.kt │ │ │ ├── Flow.kt │ │ │ ├── bitmap.kt │ │ │ ├── navigation.kt │ │ │ ├── notifications.kt │ │ │ └── stringFormatters.kt │ └── res │ │ ├── drawable-mdpi │ │ └── default_bank.png │ │ ├── drawable │ │ ├── ic_launcher_foreground.xml │ │ ├── yaba_logo_blue.png │ │ └── yaba_logo_foreground.xml │ │ ├── font │ │ ├── karla_bold.ttf │ │ ├── karla_regular.ttf │ │ ├── montserrat_light.ttf │ │ ├── montserrat_medium.ttf │ │ ├── montserrat_regular.ttf │ │ └── montserrat_semibold.ttf │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── yaba_logo.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-night │ │ ├── colors.xml │ │ ├── flags.xml │ │ └── themes.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── flags.xml │ │ ├── ic_launcher_background.xml │ │ ├── strings.xml │ │ └── themes.xml │ │ └── xml │ │ └── network_security_config.xml │ ├── sandbox │ ├── AndroidManifest.xml │ └── res │ │ └── values │ │ └── strings.xml │ ├── staging │ └── res │ │ └── xml │ │ └── network_security_config.xml │ └── test │ ├── kotlin │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── android │ │ ├── ExampleUnitTest.kt │ │ └── FakeKeyStore.kt │ └── resources │ └── robolectric.properties ├── assets ├── dark.gif ├── light.gif ├── screens │ ├── dark001.png │ ├── dark002.png │ ├── dark003.png │ ├── dark004.png │ ├── dark005.png │ ├── dark006.png │ ├── dark007.png │ ├── dark008.png │ ├── dark009.png │ ├── dark010.png │ ├── dark011.png │ ├── light001.png │ ├── light002.png │ ├── light003.png │ ├── light004.png │ ├── light005.png │ ├── light006.png │ ├── light007.png │ ├── light008.png │ ├── light009.png │ ├── light010.png │ ├── light011.png │ └── play │ │ ├── dark001.png │ │ ├── dark003.png │ │ ├── dark005.png │ │ ├── dark006.png │ │ ├── dark007.png │ │ ├── feature.png │ │ ├── light001.png │ │ ├── light003.png │ │ ├── light005.png │ │ ├── light006.png │ │ └── light007.png └── yaba.png ├── base ├── build.gradle.kts └── src │ ├── androidMain │ ├── AndroidManifest.xml │ └── kotlin │ │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── util │ │ └── androidTestUtil.kt │ └── commonMain │ └── kotlin │ └── tech │ └── alexib │ └── yaba │ ├── AppInfo.kt │ ├── Interactor.kt │ ├── di │ └── koinCore.kt │ ├── model │ ├── Account.kt │ ├── Institution.kt │ ├── PlaidItem.kt │ ├── RangeOption.kt │ ├── Transaction.kt │ ├── User.kt │ ├── defaultLogoBase64.kt │ ├── request │ │ ├── PlaidItemCreateRequest.kt │ │ ├── PlaidLinkEventCreateRequest.kt │ │ ├── UserLoginInput.kt │ │ └── UserRegisterInput.kt │ └── response │ │ ├── AuthResponse.kt │ │ ├── AuthResult.kt │ │ ├── CreateLinkTokenResponse.kt │ │ ├── PlaidItemCreateResponse.kt │ │ └── PlaidLinkResult.kt │ ├── stubs │ ├── AccountStubs.kt │ ├── TransactionStubs.kt │ ├── json │ │ ├── accountsJson.kt │ │ ├── transactionsChaseJson1.kt │ │ ├── transactionsChaseJson2.kt │ │ ├── transactionsChaseJson3.kt │ │ ├── transactionsWellsJson1.kt │ │ ├── transactionsWellsJson2.kt │ │ └── userJson.kt │ └── plaidItemWithAccountsStub.kt │ └── util │ ├── ObservableLoadingCounter.kt │ ├── flow.kt │ ├── koin.kt │ ├── serializer.kt │ └── testUtil.kt ├── build.gradle.kts ├── buildSrc ├── .gitignore ├── build.gradle.kts ├── buildSrc │ ├── .gitignore │ ├── build.gradle.kts │ └── src │ │ └── main │ │ └── kotlin │ │ ├── Deps.kt │ │ └── YabaAndroidConfig.kt └── src │ └── main │ └── kotlin │ ├── android-base-convention.gradle.kts │ ├── android-lib.gradle.kts │ ├── base-convention.gradle.kts │ ├── multiplatform-plugin.gradle.kts │ ├── static-analysis.gradle.kts │ └── util │ └── properties.kt ├── config └── detekt.yml ├── data ├── .gitignore ├── build.gradle.kts ├── db │ ├── .gitignore │ ├── build.gradle.kts │ └── src │ │ ├── androidMain │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ │ └── tech │ │ │ └── alexib │ │ │ └── yaba │ │ │ └── data │ │ │ └── db │ │ │ ├── DriverFactory.kt │ │ │ └── di │ │ │ └── koinAndroid.kt │ │ └── commonMain │ │ ├── kotlin │ │ └── tech │ │ │ └── alexib │ │ │ └── yaba │ │ │ └── data │ │ │ └── db │ │ │ ├── DriverFactory.kt │ │ │ ├── YabaDatabase.kt │ │ │ ├── dao │ │ │ ├── AccountDao.kt │ │ │ ├── InstitutionDao.kt │ │ │ ├── ItemDao.kt │ │ │ ├── TransactionDao.kt │ │ │ └── UserDao.kt │ │ │ ├── di │ │ │ ├── dbModule.kt │ │ │ └── koin.kt │ │ │ ├── mapper │ │ │ ├── AccountEntityMapper.kt │ │ │ ├── InstitutionEntityMapper.kt │ │ │ ├── ItemEntityMapper.kt │ │ │ ├── TransactionEntityMapper.kt │ │ │ └── UserEntityMapper.kt │ │ │ └── util │ │ │ ├── CoroutineExtensions.kt │ │ │ └── adapters.kt │ │ └── sqldelight │ │ ├── databases │ │ ├── 10.db │ │ ├── 11.db │ │ └── 12.db │ │ ├── migrations │ │ ├── 10.sqm │ │ └── 11.sqm │ │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── data │ │ └── db │ │ ├── Account.sq │ │ ├── InstitutionEntity.sq │ │ ├── ItemEntity.sq │ │ ├── Transaction.sq │ │ └── UserEntity.sq ├── domain │ ├── .gitignore │ ├── build.gradle.kts │ └── src │ │ ├── androidMain │ │ └── AndroidManifest.xml │ │ └── commonMain │ │ └── kotlin │ │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── data │ │ └── domain │ │ ├── AuthTokenProvider.kt │ │ ├── DataResult.kt │ │ └── dto │ │ ├── AccountDto.kt │ │ ├── AccountWithTransactionsDto.kt │ │ ├── InstitutionDto.kt │ │ ├── ItemDto.kt │ │ ├── NewItemDto.kt │ │ ├── TransactionDto.kt │ │ ├── TransactionsUpdateDto.kt │ │ └── UserDataDto.kt ├── network │ ├── .gitignore │ ├── build.gradle.kts │ └── src │ │ ├── androidMain │ │ └── AndroidManifest.xml │ │ └── commonMain │ │ ├── graphql │ │ └── tech │ │ │ └── alexib │ │ │ └── yaba │ │ │ ├── .graphqlconfig │ │ │ ├── Account.graphql │ │ │ ├── AuthMutations.graphql │ │ │ ├── PlaidItem.graphql │ │ │ ├── PlaidLinkMutations.graphql │ │ │ ├── PushToken.graphql │ │ │ ├── TestSub.graphql │ │ │ ├── UserData.graphql │ │ │ ├── UserTransactions.graphql │ │ │ └── schema.graphqls │ │ └── kotlin │ │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── data │ │ └── network │ │ ├── api │ │ ├── AccountApi.kt │ │ ├── AuthApi.kt │ │ ├── PlaidItemApi.kt │ │ ├── PushTokenApi.kt │ │ └── UserDataApi.kt │ │ ├── apollo │ │ ├── YabaApolloClient.kt │ │ └── scalarTypeAdapters.kt │ │ ├── di │ │ └── apiModule.kt │ │ └── mapper │ │ ├── AccountDtoMapper.kt │ │ ├── AuthMapper.kt │ │ ├── InstitutionMapper.kt │ │ ├── ItemMapper.kt │ │ ├── NewItemDataMapper.kt │ │ ├── PlaidItemCreateResponseMapper.kt │ │ ├── PlaidItemMutationMapper.kt │ │ ├── PlaidLinkEventMapper.kt │ │ ├── TransactionDtoMapper.kt │ │ ├── TransactionUpdateDtoMapper.kt │ │ └── UserDataDtoMapper.kt └── src │ ├── androidMain │ ├── AndroidManifest.xml │ └── kotlin │ │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── data │ │ ├── PlatformAndroid.kt │ │ ├── auth │ │ └── SessionManager.kt │ │ ├── biometrics │ │ ├── BiometricSettings.kt │ │ ├── BiometricsManager.kt │ │ ├── CipherWrapper.kt │ │ └── EncryptionManager.kt │ │ ├── di │ │ └── koinAndroid.kt │ │ └── task │ │ ├── UpdateTransactionsWorker.kt │ │ └── UserPushTokenWorker.kt │ ├── androidTest │ └── kotlin │ │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── data │ │ ├── BaseTest.kt │ │ ├── CoroutineTestRule.kt │ │ └── testDeps.kt │ ├── commonMain │ └── kotlin │ │ └── tech │ │ └── alexib │ │ └── yaba │ │ └── data │ │ ├── Platform.kt │ │ ├── di │ │ └── koin.kt │ │ ├── fcm │ │ └── PushTokenManager.kt │ │ ├── interactor │ │ ├── AddItem.kt │ │ ├── ClearAppData.kt │ │ ├── PerformInitialSync.kt │ │ ├── SetAccountsToHide.kt │ │ ├── UpdateTransactions.kt │ │ └── interactorModule.kt │ │ ├── observer │ │ ├── ObserveAccount.kt │ │ ├── ObserveAccountTransactions.kt │ │ ├── ObserveCurrentCashBalance.kt │ │ ├── ObserveItem.kt │ │ ├── ObserveItemsWithAccounts.kt │ │ ├── ObserveRecentTransactions.kt │ │ ├── ObserveSpendingCategoriesByDate.kt │ │ ├── ObserveTransactionDetail.kt │ │ ├── ObserveTransactions.kt │ │ ├── ObserveUserItemsCount.kt │ │ └── observersModule.kt │ │ ├── provider │ │ ├── AuthTokenProviderImpl.kt │ │ └── UserIdProvider.kt │ │ ├── repository │ │ ├── AccountRepository.kt │ │ ├── AuthRepository.kt │ │ ├── ItemRepository.kt │ │ ├── PushTokenRepository.kt │ │ ├── TransactionRepository.kt │ │ └── UserRepository.kt │ │ ├── settings │ │ ├── AppSettings.kt │ │ └── AuthSettings.kt │ │ ├── store │ │ ├── AccountDetailStore.kt │ │ ├── AccountsStore.kt │ │ ├── HomeStore.kt │ │ ├── PlaidItemsStore.kt │ │ ├── PlaidLinkResultStore.kt │ │ ├── TransactionDetailStore.kt │ │ ├── TransactionsStore.kt │ │ └── storeModule.kt │ │ └── util │ │ ├── Similarity.kt │ │ └── SupervisorScope.kt │ └── commonTest │ └── kotlin │ └── tech │ └── alexib │ └── yaba │ └── data │ ├── BaseTest.kt │ ├── StubTests.kt │ ├── TestDependencies.kt │ ├── mock │ └── api │ │ ├── AccountApiMock.kt │ │ ├── AuthApiMock.kt │ │ ├── PlaidItemApiMock.kt │ │ ├── PushTokenApiMock.kt │ │ └── UserDataApiMock.kt │ ├── repository │ ├── AccountRepositoryTest.kt │ ├── AuthRepositoryTest.kt │ ├── BaseRepositoryTest.kt │ ├── TransactionRepositoryTest.kt │ ├── UserDataTest.kt │ ├── UserIdProviderTest.kt │ └── UserRepositoryTest.kt │ ├── stubs │ ├── AccountDtoStubs.kt │ ├── InstitutionDtoStubs.kt │ ├── PlaidItemDtoStubs.kt │ ├── TransactionDtoStubs.kt │ ├── UserDataDtoStubs.kt │ └── json │ │ ├── institutionJson.kt │ │ └── plaidItemsJson.kt │ └── testUtil.kt ├── downloadSchemaLocal.sh ├── downloadSchemaRemote.sh ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── iosApp ├── Podfile ├── iosApp.xcodeproj │ └── project.pbxproj └── iosApp │ ├── ContentView.swift │ ├── Info.plist │ └── iOSApp.swift ├── lint.xml ├── release └── debug.jks ├── scripts ├── changelog.sh └── tags.sh ├── settings.gradle.kts ├── spotless └── copyright.kt └── versions.properties /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | insert_final_newline = true 5 | 6 | [*.{yml, json}] 7 | indent_style = space 8 | indent_size = 2 9 | 10 | [*.{kt, kts, java}] 11 | indent_size = 4 12 | max_line_length = 100 13 | 14 | # Starting from ktlint 0.34.2 There is a problem with import "import-ordering" rule - ktlint contradicts 15 | # default AS import arrangement rules, so we have to disable ktlint it. 16 | # See https://github.com/pinterest/ktlint/issues/527 17 | # Since IDE complains about unknown `disabled_rules` key we have to disable it as well: 18 | 19 | # noinspection EditorConfigKeyCorrectness 20 | disabled_rules = import-ordering 21 | # ,no-wildcard-imports 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .idea 5 | .DS_Store 6 | /build 7 | */build 8 | /captures 9 | .externalNativeBuild 10 | .cxx 11 | local.properties 12 | /keys 13 | /release/yaba-release.jks 14 | sentry.properties 15 | -------------------------------------------------------------------------------- /.lint/config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | SHELL := /bin/bash -o pipefail 2 | 3 | .PHONY: changelog 4 | changelog: 5 | @$(shell pwd)/scripts/changelog.sh 6 | 7 | .PHONY: changelog-release 8 | changelog-release: 9 | @$(shell pwd)/scripts/changelog.sh -r 10 | -------------------------------------------------------------------------------- /androidApp/fake-google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "9996237098026", 4 | "project_id": "yaba-fake", 5 | "storage_bucket": "yaba-fake.appspot.com" 6 | }, 7 | "client": [ 8 | { 9 | "client_info": { 10 | "mobilesdk_app_id": "OhSoFake", 11 | "android_client_info": { 12 | "package_name": "tech.alexib.yaba" 13 | } 14 | }, 15 | "oauth_client": [ 16 | { 17 | "client_id": "OhSoFake", 18 | "client_type": 1, 19 | "android_info": { 20 | "package_name": "tech.alexib.yaba", 21 | "certificate_hash": "OhSoFake" 22 | } 23 | }, 24 | { 25 | "client_id": "OhSoFake", 26 | "client_type": 1, 27 | "android_info": { 28 | "package_name": "tech.alexib.yaba", 29 | "certificate_hash": "OhSoFake" 30 | } 31 | }, 32 | { 33 | "client_id": "OhSoFake", 34 | "client_type": 1, 35 | "android_info": { 36 | "package_name": "tech.alexib.yaba", 37 | "certificate_hash": "OhSoFake" 38 | } 39 | }, 40 | { 41 | "client_id": "OhSoFake", 42 | "client_type": 3 43 | } 44 | ], 45 | "api_key": [ 46 | { 47 | "current_key": "OhSoFake" 48 | } 49 | ], 50 | "services": { 51 | "appinvite_service": { 52 | "other_platform_oauth_client": [ 53 | { 54 | "client_id": "OhSoFake", 55 | "client_type": 3 56 | } 57 | ] 58 | } 59 | } 60 | } 61 | ], 62 | "configuration_version": "1" 63 | } 64 | -------------------------------------------------------------------------------- /androidApp/src/androidTest/kotlin/tech/alexib/yaba/android/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android 17 | 18 | import androidx.test.ext.junit.runners.AndroidJUnit4 19 | import androidx.test.platform.app.InstrumentationRegistry 20 | import junit.framework.TestCase.assertEquals 21 | import org.junit.Test 22 | import org.junit.runner.RunWith 23 | 24 | @RunWith(AndroidJUnit4::class) 25 | class ExampleInstrumentedTest { 26 | @Test 27 | fun useAppContext() { 28 | // Context of the app under test. 29 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 30 | assertEquals("tech.alexib.yaba.android", appContext.packageName) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /androidApp/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/fcm/PushTokenManagerImpl.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.fcm 17 | 18 | import androidx.work.OneTimeWorkRequestBuilder 19 | import androidx.work.WorkManager 20 | import org.koin.core.component.KoinComponent 21 | import org.koin.core.component.inject 22 | import tech.alexib.yaba.data.fcm.PushTokenManager 23 | import tech.alexib.yaba.data.repository.PushTokenRepository 24 | import tech.alexib.yaba.data.task.UserPushTokenWorker 25 | 26 | class PushTokenManagerImpl : PushTokenManager, KoinComponent { 27 | private val workManager: WorkManager by inject() 28 | private val pushTokenRepository: PushTokenRepository by inject() 29 | 30 | override fun saveToken(token: String) { 31 | val work = OneTimeWorkRequestBuilder() 32 | .setInputData(UserPushTokenWorker.addToken(token)).build() 33 | workManager.enqueue(work) 34 | } 35 | 36 | override fun deleteToken(token: String) { 37 | pushTokenRepository.delete(token) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/accounts/AccountsScreenAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.accounts 17 | 18 | import com.benasher44.uuid.Uuid 19 | 20 | sealed class AccountsScreenAction { 21 | data class OnSelected(val accountId: Uuid, val itemId: Uuid) : AccountsScreenAction() 22 | } 23 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/accounts/AccountsScreenViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.accounts 17 | 18 | import androidx.lifecycle.ViewModel 19 | import androidx.lifecycle.viewModelScope 20 | import kotlinx.coroutines.flow.StateFlow 21 | import org.koin.core.component.KoinComponent 22 | import org.koin.core.component.inject 23 | import org.koin.core.parameter.parametersOf 24 | import tech.alexib.yaba.data.store.AccountsScreenState 25 | import tech.alexib.yaba.data.store.AccountsStore 26 | import tech.alexib.yaba.util.stateInDefault 27 | 28 | class AccountsScreenViewModel : ViewModel(), KoinComponent { 29 | 30 | private val store: AccountsStore by inject { parametersOf(viewModelScope) } 31 | 32 | val state: StateFlow = 33 | store.state.stateInDefault(viewModelScope, AccountsScreenState.Empty) 34 | } 35 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/accounts/detail/AccountDetailScreenAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.accounts.detail 17 | 18 | import com.benasher44.uuid.Uuid 19 | 20 | sealed class AccountDetailScreenAction { 21 | object NavigateBack : AccountDetailScreenAction() 22 | data class OnTransactionSelected(val transactionId: Uuid) : AccountDetailScreenAction() 23 | } 24 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/accounts/detail/AccountDetailScreenParams.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.accounts.detail 17 | 18 | import com.benasher44.uuid.Uuid 19 | import kotlinx.serialization.Contextual 20 | import kotlinx.serialization.Serializable 21 | 22 | @Serializable 23 | data class AccountDetailScreenParams( 24 | @Contextual 25 | val accountId: Uuid, 26 | @Contextual 27 | val itemId: Uuid 28 | ) 29 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/accounts/detail/AccountDetailScreenViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.accounts.detail 17 | 18 | import androidx.lifecycle.SavedStateHandle 19 | import androidx.lifecycle.ViewModel 20 | import androidx.lifecycle.viewModelScope 21 | import kotlinx.coroutines.flow.StateFlow 22 | import tech.alexib.yaba.android.navigation.NestedRoute 23 | import tech.alexib.yaba.data.store.AccountDetailScreenState 24 | import tech.alexib.yaba.data.store.AccountDetailStore 25 | import tech.alexib.yaba.util.stateInDefault 26 | 27 | class AccountDetailScreenViewModel( 28 | savedStateHandle: SavedStateHandle, 29 | store: AccountDetailStore 30 | ) : ViewModel() { 31 | 32 | private val params: AccountDetailScreenParams = 33 | NestedRoute.AccountDetail.getArg(savedStateHandle) 34 | val state: StateFlow = 35 | store.state.stateInDefault(viewModelScope, AccountDetailScreenState.Empty) 36 | 37 | init { 38 | store.init(params.accountId, params.itemId) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/auth/biometric/BiometricSetupScreenAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.auth.biometric 17 | 18 | sealed class BiometricSetupScreenAction { 19 | object PromptSetup : BiometricSetupScreenAction() 20 | object Decline : BiometricSetupScreenAction() 21 | object NavigateHome : BiometricSetupScreenAction() 22 | } 23 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/auth/biometric/BiometricSetupScreenState.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.auth.biometric 17 | 18 | import androidx.compose.runtime.Immutable 19 | 20 | @Immutable 21 | data class BiometricSetupScreenState( 22 | val setupSuccessful: Boolean = false, 23 | val errorMessage: String? = null, 24 | val declined: Boolean = false 25 | ) { 26 | companion object { 27 | val Empty = BiometricSetupScreenState() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/auth/components/Welcome.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.components 17 | 18 | import androidx.compose.material.MaterialTheme 19 | import androidx.compose.material.Text 20 | import androidx.compose.runtime.Composable 21 | import tech.alexib.yaba.android.ui.theme.BlueSlate 22 | 23 | @Composable 24 | fun Welcome() { 25 | Text( 26 | text = "Welcome To", 27 | style = MaterialTheme.typography.h5, 28 | color = BlueSlate 29 | ) 30 | YabaLogo() 31 | } 32 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/components.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui 17 | 18 | import androidx.compose.foundation.layout.Spacer 19 | import androidx.compose.foundation.layout.height 20 | import androidx.compose.runtime.Composable 21 | import androidx.compose.ui.Modifier 22 | import androidx.compose.ui.unit.Dp 23 | import androidx.compose.ui.unit.dp 24 | 25 | @Composable 26 | fun AddSpace(spaceHeight: Dp = 16.dp) { 27 | Spacer(modifier = Modifier.height(spaceHeight)) 28 | } 29 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/components/BackArrowButton.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.components 17 | 18 | import androidx.compose.material.Icon 19 | import androidx.compose.material.IconButton 20 | import androidx.compose.material.icons.Icons 21 | import androidx.compose.material.icons.filled.ArrowBack 22 | import androidx.compose.runtime.Composable 23 | import androidx.compose.ui.Modifier 24 | import androidx.compose.ui.res.stringResource 25 | import tech.alexib.yaba.android.R 26 | 27 | @Composable 28 | fun BackArrowButton(modifier: Modifier = Modifier, onClick: () -> Unit) { 29 | IconButton( 30 | onClick = { 31 | onClick() 32 | }, 33 | modifier = modifier 34 | ) { 35 | Icon(Icons.Filled.ArrowBack, stringResource(R.string.back_arrow)) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/components/ErrorText.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.components 17 | 18 | import androidx.compose.material.MaterialTheme 19 | import androidx.compose.material.Text 20 | import androidx.compose.runtime.Composable 21 | import androidx.compose.ui.text.TextStyle 22 | 23 | @Composable 24 | fun ErrorText(errorMessage: String) { 25 | Text( 26 | text = errorMessage, 27 | style = TextStyle(color = MaterialTheme.colors.error) 28 | ) 29 | } 30 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/components/Money.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.components 17 | 18 | import androidx.compose.material.Text 19 | import androidx.compose.runtime.Composable 20 | import androidx.compose.ui.Modifier 21 | import androidx.compose.ui.graphics.Color 22 | import androidx.compose.ui.text.TextStyle 23 | import tech.alexib.yaba.android.ui.theme.MoneyGreen 24 | import tech.alexib.yaba.android.util.moneyFormat 25 | 26 | @Composable 27 | fun Money(amount: Double, modifier: Modifier = Modifier, textStyle: TextStyle = TextStyle.Default) { 28 | val formatted = if (amount == 0.0) "$0.00" else "$${moneyFormat.format(amount)}" 29 | val color = if (amount < 0) Color.Red else MoneyGreen 30 | Text(text = formatted, color = color, modifier = modifier, style = textStyle) 31 | } 32 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/components/TotalCashBalanceRow.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.components 17 | 18 | import androidx.compose.foundation.layout.padding 19 | import androidx.compose.foundation.layout.wrapContentHeight 20 | import androidx.compose.material.Card 21 | import androidx.compose.runtime.Composable 22 | import androidx.compose.ui.Alignment 23 | import androidx.compose.ui.Modifier 24 | import androidx.compose.ui.res.stringResource 25 | import androidx.compose.ui.tooling.preview.Preview 26 | import androidx.compose.ui.unit.dp 27 | import tech.alexib.yaba.android.R 28 | 29 | @Composable 30 | fun TotalCashBalanceRow( 31 | balance: Double? 32 | ) { 33 | Card( 34 | modifier = Modifier 35 | .wrapContentHeight(Alignment.CenterVertically), 36 | elevation = 3.dp 37 | ) { 38 | BalanceRow( 39 | balance = balance ?: 0.0, 40 | description = stringResource(id = R.string.current_cash_balance), 41 | modifier = Modifier.padding(16.dp) 42 | ) 43 | } 44 | } 45 | 46 | @Suppress("UnusedPrivateMember") 47 | @Preview 48 | @Composable 49 | private fun TotalCashBalanceRowPreview() { 50 | TotalCashBalanceRow(39000.00) 51 | } 52 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/components/YabaCard.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.components 17 | 18 | import androidx.compose.foundation.layout.fillMaxWidth 19 | import androidx.compose.foundation.layout.padding 20 | import androidx.compose.foundation.layout.wrapContentHeight 21 | import androidx.compose.material.Card 22 | import androidx.compose.material.MaterialTheme 23 | import androidx.compose.runtime.Composable 24 | import androidx.compose.ui.Alignment 25 | import androidx.compose.ui.Modifier 26 | import androidx.compose.ui.graphics.Color 27 | import androidx.compose.ui.unit.dp 28 | import tech.alexib.yaba.android.ui.AddSpace 29 | 30 | @Composable 31 | fun YabaCard( 32 | modifier: Modifier = Modifier, 33 | background: Color? = null, 34 | content: @Composable () -> Unit 35 | ) { 36 | AddSpace() 37 | Card( 38 | modifier = modifier 39 | .fillMaxWidth() 40 | .wrapContentHeight(align = Alignment.CenterVertically) 41 | .padding(4.dp), 42 | elevation = 3.dp, 43 | backgroundColor = background ?: MaterialTheme.colors.surface 44 | ) { 45 | content() 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/components/YabaLogo.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.components 17 | 18 | import androidx.compose.foundation.Image 19 | import androidx.compose.foundation.layout.width 20 | import androidx.compose.runtime.Composable 21 | import androidx.compose.ui.Modifier 22 | import androidx.compose.ui.graphics.ImageBitmap 23 | import androidx.compose.ui.layout.ContentScale 24 | import androidx.compose.ui.res.imageResource 25 | import androidx.compose.ui.unit.dp 26 | import tech.alexib.yaba.android.R 27 | 28 | @Composable 29 | fun YabaLogo(modifier: Modifier = Modifier, size: Int = 500) { 30 | Image( 31 | contentScale = ContentScale.Fit, 32 | contentDescription = "yaba logo", 33 | modifier = modifier.width(size.dp), 34 | bitmap = ImageBitmap.imageResource(id = R.drawable.yaba_logo_blue), 35 | ) 36 | } 37 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/plaid/PlaidLinkHandler.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.plaid 17 | 18 | import androidx.activity.compose.rememberLauncherForActivityResult 19 | import androidx.activity.result.ActivityResultLauncher 20 | import androidx.compose.runtime.Composable 21 | import com.plaid.link.OpenPlaidLink 22 | import com.plaid.link.configuration.LinkTokenConfiguration 23 | import com.plaid.link.result.LinkResult 24 | 25 | @Composable 26 | fun PlaidLinkHandler( 27 | onResult: (LinkResult) -> Unit, 28 | content: @Composable (ActivityResultLauncher) -> Unit 29 | ) { 30 | val linkLauncher = rememberLauncherForActivityResult(contract = OpenPlaidLink()) { 31 | onResult(it) 32 | } 33 | content(linkLauncher) 34 | } 35 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/plaid/PlaidLinkResultScreenViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.plaid 17 | 18 | import androidx.lifecycle.ViewModel 19 | import androidx.lifecycle.viewModelScope 20 | import com.benasher44.uuid.Uuid 21 | import kotlinx.coroutines.Dispatchers 22 | import org.koin.core.component.KoinComponent 23 | import org.koin.core.component.inject 24 | import org.koin.core.parameter.parametersOf 25 | import tech.alexib.yaba.data.store.PlaidLinkResultScreenState 26 | import tech.alexib.yaba.data.store.PlaidLinkResultStore 27 | import tech.alexib.yaba.data.store.PlaidLinkScreenResult 28 | import tech.alexib.yaba.util.stateInDefault 29 | 30 | class PlaidLinkResultScreenViewModel : ViewModel(), KoinComponent { 31 | private val store: PlaidLinkResultStore by inject { parametersOf(Dispatchers.Main) } 32 | 33 | val state = store.state.stateInDefault(viewModelScope, PlaidLinkResultScreenState.Empty) 34 | 35 | fun init(accounts: List, itemId: Uuid) { 36 | store.init(itemId, accounts) 37 | } 38 | 39 | fun submit(action: PlaidLinkResultStore.Action) { 40 | store.submit(action) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/settings/SettingsScreenAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.settings 17 | 18 | import tech.alexib.yaba.data.settings.Theme 19 | 20 | sealed class SettingsScreenAction { 21 | object Logout : SettingsScreenAction() 22 | data class Navigate(val destination: NavDestination) : SettingsScreenAction() 23 | object ClearAppData : SettingsScreenAction() 24 | data class ChangeTheme(val theme: Theme) : SettingsScreenAction() 25 | 26 | sealed class NavDestination { 27 | object Auth : NavDestination() 28 | object LinkedInstitutions : NavDestination() 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/settings/plaid_items/PlaidItemsScreenAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.settings.plaid_items 17 | 18 | import tech.alexib.yaba.model.PlaidItemWithAccounts 19 | 20 | sealed class PlaidItemsScreenAction { 21 | data class OnItemSelected(val item: PlaidItemWithAccounts) : PlaidItemsScreenAction() 22 | object NavigateToLinkInstitution : PlaidItemsScreenAction() 23 | } 24 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/settings/plaid_items/PlaidItemsScreenViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.settings.plaid_items 17 | 18 | import androidx.lifecycle.ViewModel 19 | import androidx.lifecycle.viewModelScope 20 | import org.koin.core.component.KoinComponent 21 | import org.koin.core.component.inject 22 | import tech.alexib.yaba.data.store.PlaidItemsScreenState 23 | import tech.alexib.yaba.data.store.PlaidItemsStore 24 | import tech.alexib.yaba.util.stateInDefault 25 | 26 | class PlaidItemsScreenViewModel : ViewModel(), KoinComponent { 27 | 28 | private val store: PlaidItemsStore by inject() 29 | 30 | val state = store.state.stateInDefault(viewModelScope, PlaidItemsScreenState.Empty) 31 | } 32 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/theme/Margin.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.theme 17 | 18 | import androidx.compose.ui.unit.dp 19 | 20 | object Margin { 21 | val small = 4.dp 22 | val regular = 8.dp 23 | val medium = 16.dp 24 | val large = 24.dp 25 | } 26 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.theme 17 | 18 | import androidx.compose.foundation.shape.RoundedCornerShape 19 | import androidx.compose.material.Shapes 20 | import androidx.compose.ui.unit.dp 21 | 22 | val Shapes = Shapes( 23 | small = RoundedCornerShape(4.dp), 24 | medium = RoundedCornerShape(4.dp), 25 | large = RoundedCornerShape(0.dp) 26 | ) 27 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/transactions/TransactionDetailScreenAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.transactions 17 | 18 | sealed class TransactionDetailScreenAction { 19 | object NavigateBack : TransactionDetailScreenAction() 20 | } 21 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/transactions/TransactionDetailScreenViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.transactions 17 | 18 | import androidx.lifecycle.SavedStateHandle 19 | import androidx.lifecycle.ViewModel 20 | import androidx.lifecycle.viewModelScope 21 | import kotlinx.coroutines.flow.StateFlow 22 | import org.koin.core.component.KoinComponent 23 | import org.koin.core.component.inject 24 | import tech.alexib.yaba.android.navigation.NestedRoute 25 | import tech.alexib.yaba.data.store.TransactionDetailScreenState 26 | import tech.alexib.yaba.data.store.TransactionDetailStore 27 | import tech.alexib.yaba.util.stateInDefault 28 | 29 | class TransactionDetailScreenViewModel(handle: SavedStateHandle) : 30 | ViewModel(), 31 | KoinComponent { 32 | 33 | private val id = NestedRoute.TransactionDetail.getArg(handle) 34 | private val store: TransactionDetailStore by inject() 35 | 36 | val state: StateFlow = 37 | store.state.stateInDefault(viewModelScope, TransactionDetailScreenState.Empty) 38 | 39 | init { 40 | store.init(id) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/ui/transactions/TransactionListScreenViewModel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.ui.transactions 17 | 18 | import androidx.lifecycle.ViewModel 19 | import androidx.lifecycle.viewModelScope 20 | import kotlinx.coroutines.Dispatchers 21 | import org.koin.core.component.KoinComponent 22 | import org.koin.core.component.inject 23 | import org.koin.core.parameter.parametersOf 24 | import tech.alexib.yaba.data.store.TransactionsStore 25 | import tech.alexib.yaba.util.stateInDefault 26 | 27 | class TransactionListScreenViewModel : ViewModel(), KoinComponent { 28 | 29 | val store: TransactionsStore by inject { parametersOf(Dispatchers.Main) } 30 | val state = store.state.stateInDefault(viewModelScope, TransactionsStore.State.Empty) 31 | 32 | override fun onCleared() { 33 | store.dispose() 34 | super.onCleared() 35 | } 36 | 37 | init { 38 | store.init() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/util/Flow.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | @file:Suppress("UNCHECKED_CAST", "LongParameterList") 17 | 18 | package tech.alexib.yaba.android.util 19 | 20 | import androidx.compose.runtime.Composable 21 | import androidx.compose.runtime.remember 22 | import androidx.compose.ui.platform.LocalLifecycleOwner 23 | import androidx.lifecycle.Lifecycle 24 | import androidx.lifecycle.flowWithLifecycle 25 | import kotlinx.coroutines.flow.Flow 26 | 27 | // all credit to https://github.com/chrisbanes 28 | @Composable 29 | fun rememberFlowWithLifecycle( 30 | flow: Flow, 31 | lifecycle: Lifecycle = LocalLifecycleOwner.current.lifecycle, 32 | minActiveState: Lifecycle.State = Lifecycle.State.STARTED 33 | ): Flow = remember(flow, lifecycle) { 34 | flow.flowWithLifecycle( 35 | lifecycle = lifecycle, 36 | minActiveState = minActiveState 37 | ) 38 | } 39 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/util/bitmap.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.util 17 | 18 | import android.graphics.Bitmap 19 | import android.graphics.BitmapFactory 20 | import android.util.Log 21 | import tech.alexib.yaba.android.ui.components.defaultLogo 22 | import java.util.Base64 23 | 24 | @Suppress("FunctionParameterNaming", "FunctionNaming", "TooGenericExceptionCaught") 25 | fun base64ToBitmap(b64: String): Bitmap { 26 | return try { 27 | val imageAsBytes: ByteArray = Base64.getDecoder().decode(b64.toByteArray()) 28 | BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.size) 29 | } catch (e: Throwable) { 30 | Log.e("base64ToBitmap", b64) 31 | defaultLogo 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/util/navigation.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.util 17 | 18 | import android.os.Bundle 19 | import kotlinx.serialization.decodeFromString 20 | import kotlinx.serialization.encodeToString 21 | import tech.alexib.yaba.util.jSerializer 22 | 23 | inline fun Bundle.getSerialized(key: String): T? { 24 | return this.getString(key)?.let { 25 | jSerializer.decodeFromString(it) 26 | } 27 | } 28 | 29 | inline fun Bundle.putSerialized(key: String, value: T) = 30 | this.putString(key, jSerializer.encodeToString(value)) 31 | -------------------------------------------------------------------------------- /androidApp/src/main/kotlin/tech/alexib/yaba/android/util/notifications.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2021 Alexi Bre 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package tech.alexib.yaba.android.util 17 | 18 | import android.app.NotificationManager 19 | 20 | sealed class YabaNotificationChannel { 21 | abstract val name: String 22 | abstract val id: String 23 | } 24 | 25 | object NewTransactionChannel : YabaNotificationChannel() { 26 | override val id: String = "new_transaction" 27 | override val name: String = "New transactions" 28 | } 29 | 30 | fun NotificationManager.isChannelActive(channel: YabaNotificationChannel): Boolean { 31 | val notificationChannel = this.getNotificationChannel(channel.id) 32 | return notificationChannel != null && 33 | notificationChannel.importance != NotificationManager.IMPORTANCE_NONE 34 | } 35 | -------------------------------------------------------------------------------- /androidApp/src/main/res/drawable-mdpi/default_bank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/drawable-mdpi/default_bank.png -------------------------------------------------------------------------------- /androidApp/src/main/res/drawable/yaba_logo_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/drawable/yaba_logo_blue.png -------------------------------------------------------------------------------- /androidApp/src/main/res/font/karla_bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/font/karla_bold.ttf -------------------------------------------------------------------------------- /androidApp/src/main/res/font/karla_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/font/karla_regular.ttf -------------------------------------------------------------------------------- /androidApp/src/main/res/font/montserrat_light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/font/montserrat_light.ttf -------------------------------------------------------------------------------- /androidApp/src/main/res/font/montserrat_medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/font/montserrat_medium.ttf -------------------------------------------------------------------------------- /androidApp/src/main/res/font/montserrat_regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/font/montserrat_regular.ttf -------------------------------------------------------------------------------- /androidApp/src/main/res/font/montserrat_semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/font/montserrat_semibold.ttf -------------------------------------------------------------------------------- /androidApp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /androidApp/src/main/res/mipmap-anydpi-v26/yaba_logo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /androidApp/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /androidApp/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ruffCode/yaba-kmm/c5a7f5f81c6eb11bb44b6a556795147c160028c5/androidApp/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /androidApp/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #0e0e0e 4 | @color/black30 5 | @color/blue_slate 6 | 7 | -------------------------------------------------------------------------------- /androidApp/src/main/res/values-night/flags.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | false 19 | -------------------------------------------------------------------------------- /androidApp/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /androidApp/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | #dd0d3e 11 | #c20029 12 | @color/red900 13 | #FF4f83cc 14 | #FF84b2ff 15 | #4D000000 16 | @color/blue_slate 17 | @color/white 18 | 19 | -------------------------------------------------------------------------------- /androidApp/src/main/res/values/flags.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 | 18 | true 19 | -------------------------------------------------------------------------------- /androidApp/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #4F83CC 4 | -------------------------------------------------------------------------------- /androidApp/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | yaba 3 | new_transaction 4 | transactions_updated 5 | Hang on while we fetch your data 6 | Link your first institution 7 | Current cash balance 8 | View all transactions 9 | hide password 10 | show password 11 | Back arrow 12 | Transactions 13 | Please do not enter your real credentials as they will not work, use the credentials below instead 14 | If asked to use multi-factor authentication, choose any method and enter 1234 for the code 15 | This is a sandbox version of yaba 16 | There are no transactions available for this account 17 | Current balance 18 | Available balance 19 | Total limit 20 | Institution 21 | 22 | -------------------------------------------------------------------------------- /androidApp/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 16 | 17 | 22 | 23 | 26 | 27 | 28 | 29 |