From 70fe1dd77ab1fb2b017dfefd5220f01b9e94a485 Mon Sep 17 00:00:00 2001 From: Vikas Wagh Date: Wed, 24 Feb 2021 14:43:39 -0800 Subject: [PATCH 1/3] Updating README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c5bd6ee9..20f859350 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ Note that this SDK is geared towards those who need both backend data and UI fea To install Hyperwallet UI SDK, you just need to add the dependencies into your build.gradle file in Android Studio (or Gradle). For example: ```bash -api 'com.hyperwallet.android.ui:transfermethodui:1.0.0-beta08' -api 'com.hyperwallet.android.ui:receiptui:1.0.0-beta08' -api 'com.hyperwallet.android.ui:transferui:1.0.0-beta08' +api 'com.hyperwallet.android.ui:transfermethodui:1.0.0-beta09' +api 'com.hyperwallet.android.ui:receiptui:1.0.0-beta09' +api 'com.hyperwallet.android.ui:transferui:1.0.0-beta09' ``` ### Proguard From c0d864039c643a2e514033e142f6997ef22298af Mon Sep 17 00:00:00 2001 From: Vikas Wagh <37385596+vwagh-hw@users.noreply.github.com> Date: Mon, 29 Mar 2021 13:37:11 -0700 Subject: [PATCH 2/3] DTSERWFOUR-467 Tag/1.0.0 beta10 Release (#255) * UI Enhancements * Bug fixes --- CHANGELOG.md | 5 + README.md | 6 +- balancerepository/.gitignore | 1 + balancerepository/build.gradle | 12 ++ balancerepository/proguard-rules.pro | 21 ++ .../src/main/AndroidManifest.xml | 2 + .../PrepaidCardBalanceRepository.java | 47 +++++ .../PrepaidCardBalanceRepositoryFactory.java | 43 ++++ .../PrepaidCardBalanceRepositoryImpl.java | 73 +++++++ .../repository/UserBalanceRepository.java | 56 +++++ .../UserBalanceRepositoryFactory.java | 42 ++++ .../repository/UserBalanceRepositoryImpl.java | 66 ++++++ ...epaidCardBalanceRepositoryFactoryTest.java | 39 ++++ .../PrepaidCardBalanceRepositoryImplTest.java | 143 +++++++++++++ .../UserBalanceRepositoryFactoryTest.java | 34 ++++ .../UserBalanceRepositoryImplTest.java | 137 +++++++++++++ .../prepaid_card_balance_list_response.json | 19 ++ .../src/test/resources/robolectric.properties | 1 + .../src/test/resources/user_balances.json | 23 +++ build.gradle | 4 +- commonui/src/main/res/values/dimens.xml | 5 +- commonui/src/main/res/values/strings.xml | 6 +- publish.gradle | 3 +- .../ui/receipt/view/ListReceiptsFragment.java | 17 +- .../res/layout/activity_receipt_detail.xml | 1 + settings.gradle | 1 + .../ui/transfermethod/BankCardTest.java | 8 +- .../ui/transfermethod/PaperCheckTest.java | 2 +- .../SelectTransferMethodTest.java | 3 +- .../insight/BankCardInsightTest.java | 2 +- .../view/ListTransferMethodFragment.java | 13 +- .../widget/AbstractMaskedInputWidget.java | 6 + .../view/widget/AbstractWidget.java | 5 +- .../view/widget/ExpiryDateWidget.java | 3 + .../layout/activity_add_transfer_method.xml | 1 + .../layout/activity_list_transfer_method.xml | 3 + .../activity_select_transfer_method.xml | 1 + .../activity_update_transfer_method.xml | 1 + .../dialog_fragment_country_selection.xml | 1 + .../dialog_fragment_currency_selection.xml | 1 + .../layout/fragment_add_transfer_method.xml | 2 +- .../layout/fragment_list_transfer_method.xml | 24 +-- .../src/main/res/values/strings.xml | 2 +- transferui/build.gradle | 1 + .../ui/transfer/SelectDestinationTest.java | 6 +- .../ui/transfer/TransferUserFundsTest.java | 192 ++++++++++++++++++ .../android/ui/transfer/TransferSource.java | 10 +- .../transfer/view/CreateTransferActivity.java | 7 +- .../transfer/view/CreateTransferFragment.java | 4 +- .../view/ListTransferSourceFragment.java | 2 +- .../view/ScheduleTransferFragment.java | 2 +- .../viewmodel/CreateTransferViewModel.java | 70 ++++++- .../activity_list_transfer_destination.xml | 1 + .../res/layout/activity_schedule_transfer.xml | 1 + ...log_fragment_list_transfer_destination.xml | 1 + .../dialog_fragment_list_transfer_source.xml | 1 + .../res/layout/fragment_create_transfer.xml | 2 + .../res/layout/fragment_schedule_transfer.xml | 2 +- .../res/layout/widget_transfer_source.xml | 4 +- transferui/src/main/res/values/dimension.xml | 1 + .../CreateTransferViewModelTest.java | 99 +++++---- ...ser_balance_multi_currencies_response.json | 67 ++++++ ...user_balance_single_currency_response.json | 19 ++ 63 files changed, 1252 insertions(+), 125 deletions(-) create mode 100644 balancerepository/.gitignore create mode 100644 balancerepository/build.gradle create mode 100644 balancerepository/proguard-rules.pro create mode 100644 balancerepository/src/main/AndroidManifest.xml create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java create mode 100644 balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java create mode 100644 balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactoryTest.java create mode 100644 balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java create mode 100644 balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java create mode 100644 balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java create mode 100644 balancerepository/src/test/resources/prepaid_card_balance_list_response.json create mode 100644 balancerepository/src/test/resources/robolectric.properties create mode 100644 balancerepository/src/test/resources/user_balances.json create mode 100644 transferui/src/test/resources/user_balance_multi_currencies_response.json create mode 100644 transferui/src/test/resources/user_balance_single_currency_response.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 07db1e1af..3fbd60224 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========= +[1.0.0-beta10](https://github.com/hyperwallet/hyperwallet-android-ui-sdk/releases/tag/1.0.0-beta10) +------------------- +* UI Enhancements +* Bug fixes + [1.0.0-beta09](https://github.com/hyperwallet/hyperwallet-android-ui-sdk/releases/tag/1.0.0-beta09) ------------------- * UI Enhancements diff --git a/README.md b/README.md index 20f859350..4fd6ba6ce 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ Note that this SDK is geared towards those who need both backend data and UI fea To install Hyperwallet UI SDK, you just need to add the dependencies into your build.gradle file in Android Studio (or Gradle). For example: ```bash -api 'com.hyperwallet.android.ui:transfermethodui:1.0.0-beta09' -api 'com.hyperwallet.android.ui:receiptui:1.0.0-beta09' -api 'com.hyperwallet.android.ui:transferui:1.0.0-beta09' +api 'com.hyperwallet.android.ui:transfermethodui:1.0.0-beta10' +api 'com.hyperwallet.android.ui:receiptui:1.0.0-beta10' +api 'com.hyperwallet.android.ui:transferui:1.0.0-beta10' ``` ### Proguard diff --git a/balancerepository/.gitignore b/balancerepository/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/balancerepository/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/balancerepository/build.gradle b/balancerepository/build.gradle new file mode 100644 index 000000000..9f64eff53 --- /dev/null +++ b/balancerepository/build.gradle @@ -0,0 +1,12 @@ +apply from: "$rootProject.projectDir/android-library.gradle" +description = 'Hyperwallet Balance Repository SDK for Android to integrate with the Hyperwallet Platform' +project.ext { + mavenName = 'Hyperwallet Android Balance Repository SDK' +} +apply from: "$rootProject.projectDir/publish.gradle" + +dependencies { + testImplementation "org.robolectric:robolectric:$robolectricVersion" + testImplementation "com.squareup.okhttp3:mockwebserver:$mockWebServerVersion" + testImplementation project(':testutils') +} diff --git a/balancerepository/proguard-rules.pro b/balancerepository/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/balancerepository/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/balancerepository/src/main/AndroidManifest.xml b/balancerepository/src/main/AndroidManifest.xml new file mode 100644 index 000000000..a5d7ef853 --- /dev/null +++ b/balancerepository/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java new file mode 100644 index 000000000..24fe74a97 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepository.java @@ -0,0 +1,47 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.hyperwallet.android.ui.balance.repository; + +import androidx.annotation.NonNull; + +import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; + +import java.util.List; + +public interface PrepaidCardBalanceRepository { + /** + * Load prepaid card balances + */ + void loadPrepaidCardBalances(String prepaidCardToken, @NonNull final LoadPrepaidCardBalanceCallback callback); + + /** + * Load prepaid card balance callback + */ + interface LoadPrepaidCardBalanceCallback { + /** + * On prepaid card balance list loaded + */ + void onPrepaidCardBalanceLoaded(@NonNull final List balances); + + /** + * On error + */ + void onError(@NonNull final Errors errors); + } +} diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java new file mode 100644 index 000000000..14ed242b6 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactory.java @@ -0,0 +1,43 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.hyperwallet.android.ui.balance.repository; + +public class PrepaidCardBalanceRepositoryFactory { + private static PrepaidCardBalanceRepositoryFactory sInstance; + private PrepaidCardBalanceRepository mPrepaidCardBalanceRepository; + + private PrepaidCardBalanceRepositoryFactory() { + mPrepaidCardBalanceRepository = new PrepaidCardBalanceRepositoryImpl(); + } + + public static synchronized PrepaidCardBalanceRepositoryFactory getInstance() { + if (sInstance == null) { + sInstance = new PrepaidCardBalanceRepositoryFactory(); + } + return sInstance; + } + + public static void clearInstance() { + sInstance = null; + } + + public PrepaidCardBalanceRepository getPrepaidCardBalanceRepository() { + return mPrepaidCardBalanceRepository; + } + +} diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java new file mode 100644 index 000000000..b092355ec --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImpl.java @@ -0,0 +1,73 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.hyperwallet.android.ui.balance.repository; + +import android.os.Handler; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.balance.PrepaidCardBalanceQueryParam; +import com.hyperwallet.android.model.paging.PageList; + +import java.util.ArrayList; + +public class PrepaidCardBalanceRepositoryImpl implements PrepaidCardBalanceRepository { + + private final Handler mHandler = new Handler(); + private final int LIMIT = 100; + + @VisibleForTesting + Hyperwallet getHyperwallet() { + return Hyperwallet.getDefault(); + } + + + @Override + public void loadPrepaidCardBalances(String prepaidCardToken, + @NonNull final LoadPrepaidCardBalanceCallback callback) { + PrepaidCardBalanceQueryParam queryParam = new PrepaidCardBalanceQueryParam.Builder() + .limit(LIMIT) + .sortByCurrencyAsc() + .build(); + + getHyperwallet().listPrepaidCardBalances(prepaidCardToken, queryParam, + new HyperwalletListener>() { + @Override + public void onSuccess(@Nullable PageList result) { + callback.onPrepaidCardBalanceLoaded( + result != null ? result.getDataList() : new ArrayList()); + } + + @Override + public void onFailure(HyperwalletException exception) { + callback.onError(exception.getErrors()); + } + + @Override + public Handler getHandler() { + return mHandler; + } + }); + } +} diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java new file mode 100644 index 000000000..0e9dbf28e --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepository.java @@ -0,0 +1,56 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.hyperwallet.android.ui.balance.repository; + +import androidx.annotation.NonNull; + +import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; + +import java.util.List; + +/** + * User balance repository + */ +public interface UserBalanceRepository { + /** + * Load user balances + * + * @param callback + */ + void loadUserBalances(@NonNull final LoadUserBalanceListCallback callback); + + /** + * Load User balance callback + */ + interface LoadUserBalanceListCallback { + /** + * User balance loaded callback + * + * @param balances + */ + void onUserBalanceListLoaded(@NonNull final List balances); + + /** + * User balance load error + * + * @param errors + */ + void onError(@NonNull final Errors errors); + } +} \ No newline at end of file diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java new file mode 100644 index 000000000..8c07b82a1 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactory.java @@ -0,0 +1,42 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.hyperwallet.android.ui.balance.repository; + +public class UserBalanceRepositoryFactory { + private static UserBalanceRepositoryFactory sInstance; + private UserBalanceRepository mUserBalanceRepository; + + private UserBalanceRepositoryFactory() { + mUserBalanceRepository = new UserBalanceRepositoryImpl(); + } + + public static synchronized UserBalanceRepositoryFactory getInstance() { + if (sInstance == null) { + sInstance = new UserBalanceRepositoryFactory(); + } + return sInstance; + } + + public static void clearInstance() { + sInstance = null; + } + + public UserBalanceRepository getUserBalanceRepository() { + return mUserBalanceRepository; + } +} diff --git a/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java new file mode 100644 index 000000000..79f56b905 --- /dev/null +++ b/balancerepository/src/main/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImpl.java @@ -0,0 +1,66 @@ +/* + * Copyright 2018 Hyperwallet + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + * documentation files (the "Software"), to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and + * to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of + * the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package com.hyperwallet.android.ui.balance.repository; + +import android.os.Handler; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.balance.BalanceQueryParam; +import com.hyperwallet.android.model.paging.PageList; + +import java.util.ArrayList; + +public class UserBalanceRepositoryImpl implements UserBalanceRepository { + + private final Handler mHandler = new Handler(); + private final int LIMIT = 100; + + @VisibleForTesting + Hyperwallet getHyperwallet() { + return Hyperwallet.getDefault(); + } + + @Override + public void loadUserBalances(@NonNull final LoadUserBalanceListCallback callback) { + BalanceQueryParam queryParam = new BalanceQueryParam.Builder().limit(LIMIT).build(); + getHyperwallet().listUserBalances(queryParam, new HyperwalletListener>() { + @Override + public void onSuccess(@Nullable PageList result) { + callback.onUserBalanceListLoaded(result != null ? result.getDataList() : new ArrayList()); + } + + @Override + public void onFailure(HyperwalletException exception) { + callback.onError(exception.getErrors()); + } + + @Override + public Handler getHandler() { + return mHandler; + } + }); + } +} diff --git a/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactoryTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactoryTest.java new file mode 100644 index 000000000..618cf052d --- /dev/null +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryFactoryTest.java @@ -0,0 +1,39 @@ +package com.hyperwallet.android.ui.balance.repository; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; + +import org.junit.Test; + +public class PrepaidCardBalanceRepositoryFactoryTest { + + @Test + public void testGetInstance_verifyRepositoriesInitialized() { + PrepaidCardBalanceRepositoryFactory prepaidCardBalanceRepository = + PrepaidCardBalanceRepositoryFactory.getInstance(); + assertThat(prepaidCardBalanceRepository, is(notNullValue())); + assertThat(prepaidCardBalanceRepository.getPrepaidCardBalanceRepository(), is(notNullValue())); + } + + @Test + public void testClearInstance_verifyRepositoriesCleared() { + PrepaidCardBalanceRepositoryFactory prepaidCardBalanceRepositoryFactory = + PrepaidCardBalanceRepositoryFactory.getInstance(); + + PrepaidCardBalanceRepository prepaidCardBalanceRepository = + prepaidCardBalanceRepositoryFactory.getPrepaidCardBalanceRepository(); + + PrepaidCardBalanceRepositoryFactory currentRepositoryFactory = + PrepaidCardBalanceRepositoryFactory.getInstance(); + assertThat(prepaidCardBalanceRepositoryFactory, is(currentRepositoryFactory)); + + PrepaidCardBalanceRepositoryFactory.clearInstance(); + + PrepaidCardBalanceRepositoryFactory anotherRepositoryFactory = + PrepaidCardBalanceRepositoryFactory.getInstance(); + assertThat(prepaidCardBalanceRepositoryFactory, is(not(anotherRepositoryFactory))); + assertThat(prepaidCardBalanceRepository, is(not(anotherRepositoryFactory.getPrepaidCardBalanceRepository()))); + } +} diff --git a/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java new file mode 100644 index 000000000..2d2c2d1e1 --- /dev/null +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/PrepaidCardBalanceRepositoryImplTest.java @@ -0,0 +1,143 @@ +package com.hyperwallet.android.ui.balance.repository; + +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.Error; +import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.balance.BalanceQueryParam; +import com.hyperwallet.android.model.balance.PrepaidCardBalanceQueryParam; +import com.hyperwallet.android.model.paging.PageList; +import com.hyperwallet.android.ui.testutils.rule.HyperwalletExternalResourceManager; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public class PrepaidCardBalanceRepositoryImplTest { + @Rule + public MockitoRule mMockito = MockitoJUnit.rule(); + + @Rule + public HyperwalletExternalResourceManager mResourceManager = new HyperwalletExternalResourceManager(); + + @Mock + PrepaidCardBalanceRepository.LoadPrepaidCardBalanceCallback loadPrepaidCardBalanceListCallback; + @Spy + PrepaidCardBalanceRepositoryImpl prepaidCardBalanceRepository; + @Mock + private Hyperwallet mHyperwallet; + @Captor + private ArgumentCaptor mErrorCaptor; + @Captor + private ArgumentCaptor> mPrepaidCardBalanceCaptor; + + @Before + public void setup() { + doReturn(mHyperwallet).when(prepaidCardBalanceRepository).getHyperwallet(); + } + + @Test + public void testLoadUserBalances_returnsPrepaidCardBalances() throws JSONException, HyperwalletException { + + final String response = mResourceManager.getResourceContent("prepaid_card_balance_list_response.json"); + JSONObject jObject = new JSONObject(response); + final PageList balances = new PageList<>(jObject, Balance.class); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[2]; + listener.onSuccess(balances); + return listener; + } + }).when(mHyperwallet).listPrepaidCardBalances(anyString(), (PrepaidCardBalanceQueryParam) any(), + any(HyperwalletListener.class)); + + prepaidCardBalanceRepository.loadPrepaidCardBalances("trm-fake-token", loadPrepaidCardBalanceListCallback); + verify(prepaidCardBalanceRepository).getHyperwallet(); + verify(loadPrepaidCardBalanceListCallback).onPrepaidCardBalanceLoaded(mPrepaidCardBalanceCaptor.capture()); + verify(loadPrepaidCardBalanceListCallback, never()).onError(any(Errors.class)); + + assertThat(mPrepaidCardBalanceCaptor.getValue().size(), is(1)); + + } + + @Test + public void testPrepaidCardBalances_returnsEmptyPrepaidCardBalances() { + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[2]; + listener.onSuccess(null); + return listener; + } + }).when(mHyperwallet).listPrepaidCardBalances(anyString(), (PrepaidCardBalanceQueryParam) any(), + any(HyperwalletListener.class)); + + prepaidCardBalanceRepository.loadPrepaidCardBalances("trm-fake-token", loadPrepaidCardBalanceListCallback); + verify(prepaidCardBalanceRepository).getHyperwallet(); + verify(loadPrepaidCardBalanceListCallback).onPrepaidCardBalanceLoaded(mPrepaidCardBalanceCaptor.capture()); + verify(loadPrepaidCardBalanceListCallback, never()).onError(any(Errors.class)); + + assertThat(mPrepaidCardBalanceCaptor.getValue().isEmpty(), is(true)); + } + + @Test + public void testPrepaidCardBalances_onFailure() { + + final Error error = new Error("test message", "TEST_CODE"); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[2]; + List errorList = new ArrayList<>(); + errorList.add(error); + Errors errors = new Errors(errorList); + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).listPrepaidCardBalances(anyString(), (PrepaidCardBalanceQueryParam) any(), + any(HyperwalletListener.class)); + + prepaidCardBalanceRepository.loadPrepaidCardBalances("trm-fake-token", loadPrepaidCardBalanceListCallback); + + verify(prepaidCardBalanceRepository).getHyperwallet(); + verify(loadPrepaidCardBalanceListCallback, never()).onPrepaidCardBalanceLoaded( + ArgumentMatchers.anyList()); + verify(loadPrepaidCardBalanceListCallback).onError(mErrorCaptor.capture()); + + assertThat(mErrorCaptor.getValue().getErrors(), hasItem(error)); + + } +} diff --git a/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java new file mode 100644 index 000000000..53c5e1fc4 --- /dev/null +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryFactoryTest.java @@ -0,0 +1,34 @@ +package com.hyperwallet.android.ui.balance.repository; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; + +import org.junit.Test; + +public class UserBalanceRepositoryFactoryTest { + + @Test + public void testGetInstance_verifyRepositoriesInitialized() { + UserBalanceRepositoryFactory userBalanceRepositoryFactory = UserBalanceRepositoryFactory.getInstance(); + assertThat(userBalanceRepositoryFactory, is(notNullValue())); + assertThat(userBalanceRepositoryFactory.getUserBalanceRepository(), is(notNullValue())); + } + + @Test + public void testClearInstance_verifyRepositoriesCleared() { + UserBalanceRepositoryFactory userBalanceRepositoryFactory = UserBalanceRepositoryFactory.getInstance(); + + UserBalanceRepository userConfigurationRepository = userBalanceRepositoryFactory.getUserBalanceRepository(); + + UserBalanceRepositoryFactory currentRepositoryFactory = UserBalanceRepositoryFactory.getInstance(); + assertThat(userBalanceRepositoryFactory, is(currentRepositoryFactory)); + + UserBalanceRepositoryFactory.clearInstance(); + + UserBalanceRepositoryFactory anotherRepositoryFactory = UserBalanceRepositoryFactory.getInstance(); + assertThat(userBalanceRepositoryFactory, is(not(anotherRepositoryFactory))); + assertThat(userConfigurationRepository, is(not(anotherRepositoryFactory.getUserBalanceRepository()))); + } +} diff --git a/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java new file mode 100644 index 000000000..a7b32ac9a --- /dev/null +++ b/balancerepository/src/test/java/com/hyperwallet/android/ui/balance/repository/UserBalanceRepositoryImplTest.java @@ -0,0 +1,137 @@ +package com.hyperwallet.android.ui.balance.repository; + +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.Error; +import com.hyperwallet.android.model.Errors; +import com.hyperwallet.android.model.balance.Balance; +import com.hyperwallet.android.model.balance.BalanceQueryParam; +import com.hyperwallet.android.model.paging.PageList; +import com.hyperwallet.android.ui.testutils.rule.HyperwalletExternalResourceManager; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public class UserBalanceRepositoryImplTest { + @Rule + public MockitoRule mMockito = MockitoJUnit.rule(); + + @Rule + public HyperwalletExternalResourceManager mResourceManager = new HyperwalletExternalResourceManager(); + + @Mock + UserBalanceRepository.LoadUserBalanceListCallback loadUserBalanceListCallback; + @Spy + UserBalanceRepositoryImpl userBalanceRepository; + @Mock + private Hyperwallet mHyperwallet; + @Captor + private ArgumentCaptor mErrorCaptor; + @Captor + private ArgumentCaptor> mUserBalanceCaptor; + + @Before + public void setup() { + doReturn(mHyperwallet).when(userBalanceRepository).getHyperwallet(); + } + + @Test + public void testLoadUserBalances_returnsBalances() throws JSONException, HyperwalletException { + + final String response = mResourceManager.getResourceContent("user_balances.json"); + JSONObject jObject = new JSONObject(response); + final PageList balances = new PageList<>(jObject, Balance.class); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onSuccess(balances); + return listener; + } + }).when(mHyperwallet).listUserBalances((BalanceQueryParam) any(), any(HyperwalletListener.class)); + + userBalanceRepository.loadUserBalances(loadUserBalanceListCallback); + verify(userBalanceRepository).getHyperwallet(); + verify(loadUserBalanceListCallback).onUserBalanceListLoaded(mUserBalanceCaptor.capture()); + verify(loadUserBalanceListCallback, never()).onError(any(Errors.class)); + + assertThat(mUserBalanceCaptor.getValue().size(),is(2)); + + } + + @Test + public void testLoadUserBalances_returnsEmptyBalances() { + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onSuccess(null); + return listener; + } + }).when(mHyperwallet).listUserBalances((BalanceQueryParam) any(), any(HyperwalletListener.class)); + + userBalanceRepository.loadUserBalances(loadUserBalanceListCallback); + verify(userBalanceRepository).getHyperwallet(); + verify(loadUserBalanceListCallback).onUserBalanceListLoaded(mUserBalanceCaptor.capture()); + verify(loadUserBalanceListCallback, never()).onError(any(Errors.class)); + + assertThat(mUserBalanceCaptor.getValue().isEmpty(),is(true)); + } + + @Test + public void testLoadUserBalances_onFailure() { + + final Error error = new Error("test message", "TEST_CODE"); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + List errorList = new ArrayList<>(); + errorList.add(error); + Errors errors = new Errors(errorList); + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).listUserBalances((BalanceQueryParam) any(), any(HyperwalletListener.class)); + + userBalanceRepository.loadUserBalances(loadUserBalanceListCallback); + + verify(userBalanceRepository).getHyperwallet(); + verify(loadUserBalanceListCallback, never()).onUserBalanceListLoaded(ArgumentMatchers.anyList()); + verify(loadUserBalanceListCallback).onError(mErrorCaptor.capture()); + + assertThat(mErrorCaptor.getValue().getErrors(),hasItem(error)); + + } +} diff --git a/balancerepository/src/test/resources/prepaid_card_balance_list_response.json b/balancerepository/src/test/resources/prepaid_card_balance_list_response.json new file mode 100644 index 000000000..fd22bec7c --- /dev/null +++ b/balancerepository/src/test/resources/prepaid_card_balance_list_response.json @@ -0,0 +1,19 @@ +{ + "count": 1, + "offset": 0, + "limit": 10, + "data": [ + { + "currency": "USD", + "amount": "991.05" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://localhost:8181/rest/v3/users/test-user-token/prepaid-cards/trm-fake-token/balances?offset=0&limit=10" + } + ] +} \ No newline at end of file diff --git a/balancerepository/src/test/resources/robolectric.properties b/balancerepository/src/test/resources/robolectric.properties new file mode 100644 index 000000000..89a6c8b4c --- /dev/null +++ b/balancerepository/src/test/resources/robolectric.properties @@ -0,0 +1 @@ +sdk=28 \ No newline at end of file diff --git a/balancerepository/src/test/resources/user_balances.json b/balancerepository/src/test/resources/user_balances.json new file mode 100644 index 000000000..b06520582 --- /dev/null +++ b/balancerepository/src/test/resources/user_balances.json @@ -0,0 +1,23 @@ +{ + "count": 2, + "offset": 0, + "limit": 10, + "data": [ + { + "currency": "CAD", + "amount": "110.45" + }, + { + "currency": "USD", + "amount": "530.77" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://localhost/rest/v3/users/usr-token/balances?offset=0&limit=10" + } + ] +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1ad72af37..bfe368adc 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ allprojects { } - project.version = "1.0.0-beta09" + project.version = "1.0.0-beta10" } @@ -38,7 +38,7 @@ subprojects { targetVersion = 29 codeVersion = 1 - hyperwalletCoreVersion = '1.0.0-beta08' + hyperwalletCoreVersion = '1.0.0-beta09' hyperwalletInsightVersion = '1.0.0-beta02' // androidMaterialVersion = '1.0.0' diff --git a/commonui/src/main/res/values/dimens.xml b/commonui/src/main/res/values/dimens.xml index f695af3a0..eeee217e5 100644 --- a/commonui/src/main/res/values/dimens.xml +++ b/commonui/src/main/res/values/dimens.xml @@ -77,8 +77,8 @@ 7dp 22dp 1dp - 24dp - 24dp + 32dp + 32dp 4dp 6dp 32dp @@ -93,4 +93,5 @@ 32dp 58dp 10dp + 16sp diff --git a/commonui/src/main/res/values/strings.xml b/commonui/src/main/res/values/strings.xml index da5cebe47..cf6bdc6a9 100644 --- a/commonui/src/main/res/values/strings.xml +++ b/commonui/src/main/res/values/strings.xml @@ -24,8 +24,8 @@ \ue902 \ue901 \ue906 - \ue909 - \ue905 + \ue905 + \ue904 \ue90b ending in %s @@ -37,4 +37,6 @@ Edit Remove Remove this transfer method? + Navigate back + Add a new transfer method diff --git a/publish.gradle b/publish.gradle index 3d64f68a6..edc52460d 100644 --- a/publish.gradle +++ b/publish.gradle @@ -46,7 +46,8 @@ publishing { "transfermethodui", "transferrepository", "transferui", - "userrepository" + "userrepository", + "balancerepository" ]) { dependencyNode.appendNode('groupId', "com.hyperwallet.android.ui") } else { diff --git a/receiptui/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptsFragment.java b/receiptui/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptsFragment.java index 33cfc0144..e8e6e3272 100644 --- a/receiptui/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptsFragment.java +++ b/receiptui/src/main/java/com/hyperwallet/android/ui/receipt/view/ListReceiptsFragment.java @@ -75,7 +75,7 @@ public class ListReceiptsFragment extends Fragment { private View mProgressBar; private View mEmptyTransactionPlaceholder; private TextView mEmptyTransactionTextView; - private Boolean mShouldShowNoTransactionPlaceholder = Boolean.TRUE; + private Boolean mShouldShowNoTransactionPlaceholder = Boolean.FALSE; private ListReceiptsFragmentCallback callback; static ListReceiptsFragment newInstance() { @@ -164,20 +164,6 @@ private void registerObservers() { @Override public void onChanged(final PagedList receipts) { mListReceiptsAdapter.submitList(receipts); - receipts.addWeakCallback(null, new PagedList.Callback() { - @Override - public void onChanged(int position, int count) { - } - - @Override - public void onInserted(int position, int count) { - mShouldShowNoTransactionPlaceholder = (receipts.size() > 0) ? Boolean.FALSE : Boolean.TRUE; - } - - @Override - public void onRemoved(int position, int count) { - } - }); } }); @@ -189,6 +175,7 @@ public void onChanged(Boolean loading) { mProgressBar.setVisibility(View.VISIBLE); } else { mProgressBar.setVisibility(View.GONE); + mShouldShowNoTransactionPlaceholder = (Objects.requireNonNull(mReceiptViewModel.receipts().getValue()).size() > 0) ? Boolean.FALSE : Boolean.TRUE; if (mShouldShowNoTransactionPlaceholder) { if (mReceiptViewModel instanceof ListUserReceiptsViewModel) { mEmptyTransactionTextView.setText(R.string.mobileNoTransactionsUser); diff --git a/receiptui/src/main/res/layout/activity_receipt_detail.xml b/receiptui/src/main/res/layout/activity_receipt_detail.xml index e3f8e4646..7a3d6fc92 100644 --- a/receiptui/src/main/res/layout/activity_receipt_detail.xml +++ b/receiptui/src/main/res/layout/activity_receipt_detail.xml @@ -18,6 +18,7 @@ android:layout_height="?attr/actionBarSize" app:titleTextAppearance="@style/TextAppearance.Hyperwallet.Headline5" app:layout_collapseMode="pin" + app:navigationContentDescription="@string/navigate_back_description" app:popupTheme="@style/AppTheme.PopupOverlay"/> diff --git a/settings.gradle b/settings.gradle index 5936c0594..b85db0844 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,4 +7,5 @@ include ':commonui', ':transferrepository', ':transferui', ':userrepository', + ':balancerepository', ':testutils' diff --git a/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/BankCardTest.java b/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/BankCardTest.java index 92bb39767..4afcc0347 100644 --- a/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/BankCardTest.java +++ b/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/BankCardTest.java @@ -85,8 +85,8 @@ public class BankCardTest { private static final String CARD_NUMBER_MASKED = "************0006"; private static final String WRONG_LENGTH_CARD_NUMBER = "489514223212"; private static final String NOT_VALID_CARD_NUMBER = "0101010101010101"; - private static final String VALID_EXPIRATION_DATE = "1020"; - private static final String VALID_EXPIRATION_DATE_FORMATTED = "10/20"; + private static final String VALID_EXPIRATION_DATE = "1021"; + private static final String VALID_EXPIRATION_DATE_FORMATTED = "10/21"; private static final String INVALID_PATTERN_EXPIRATION_DATE = "1100"; private static final String VALID_CVV = "022"; private static final String CARD_NUMBER_LABEL = "Card Number"; @@ -328,7 +328,7 @@ public void testAddTransferMethod_verifyFieldFormatting() throws Exception { JSONObject bankCard = new JSONObject(createBankCardRequest.getBody().readUtf8()); assertThat("Card number is incorrect", bankCard.getString("cardNumber"), is(DEFAULT_CARD_NUMBER)); - assertThat("Date of expiry is incorrect", bankCard.getString("dateOfExpiry"), is("2020-10")); + assertThat("Date of expiry is incorrect", bankCard.getString("dateOfExpiry"), is("2021-10")); assertThat("CVV is incorrect", bankCard.getString("cvv"), is("344")); } @@ -356,7 +356,7 @@ public void testAddTransferMethod_verifyFieldFormattingReplace() throws Exceptio JSONObject bankCard = new JSONObject(createBankCardRequest.getBody().readUtf8()); assertThat("Card number is incorrect", bankCard.getString("cardNumber"), is(DEFAULT_CARD_NUMBER)); - assertThat("Date of expiry is incorrect", bankCard.getString("dateOfExpiry"), is("2020-10")); + assertThat("Date of expiry is incorrect", bankCard.getString("dateOfExpiry"), is("2021-10")); assertThat("CVV is incorrect", bankCard.getString("cvv"), is("344")); } diff --git a/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/PaperCheckTest.java b/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/PaperCheckTest.java index cd297e5cc..2b64669f9 100644 --- a/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/PaperCheckTest.java +++ b/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/PaperCheckTest.java @@ -95,7 +95,7 @@ public void testAddTransferMethod_displaysFeeElementsOnTmcResponse() { onView(withId(R.id.add_transfer_method_information)).check( matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))); onView(withId(R.id.add_transfer_method_information)).check( - matches(withText("US$0.25 fee \u2022 5 - 7 Business days"))); + matches(withText("$0.25 fee \u2022 5 - 7 Business days"))); } @Test diff --git a/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodTest.java b/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodTest.java index ec570fb8c..29106e351 100644 --- a/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodTest.java +++ b/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodTest.java @@ -101,8 +101,7 @@ public void testSelectTransferMethod_verifyCorrectLabelsDisplayed() { mActivityTestRule.launchActivity(null); onView(withId(R.id.toolbar)).check(matches(isDisplayed())); - onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))).check( - matches(withText(R.string.mobileAddTransferMethodHeader))); + onView(withText(R.string.mobileAddTransferMethodHeader)).check(matches(withParent(withId(R.id.toolbar)))); onView(withId(R.id.select_transfer_method_country_label)).check( matches(withText(R.string.mobileCountryRegion))); diff --git a/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/insight/BankCardInsightTest.java b/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/insight/BankCardInsightTest.java index c27645b88..875ac54c8 100644 --- a/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/insight/BankCardInsightTest.java +++ b/transfermethodui/src/androidTest/java/com/hyperwallet/android/ui/transfermethod/insight/BankCardInsightTest.java @@ -49,7 +49,7 @@ public class BankCardInsightTest { private static final String INVALID_PATTERN_EXPIRATION_DATE = "1100"; private static final String VALID_CARD_NUMBER = "4895142232120006"; - private static final String VALID_EXPIRATION_DATE = "1020"; + private static final String VALID_EXPIRATION_DATE = "1021"; private static final String VALID_CVV = "022"; @ClassRule diff --git a/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/ListTransferMethodFragment.java b/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/ListTransferMethodFragment.java index f5c185311..db831987e 100644 --- a/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/ListTransferMethodFragment.java +++ b/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/ListTransferMethodFragment.java @@ -44,6 +44,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.appbar.AppBarLayout; import com.hyperwallet.android.model.Error; import com.hyperwallet.android.model.StatusTransition; import com.hyperwallet.android.model.transfermethod.TransferMethod; @@ -55,6 +56,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.Objects; public class ListTransferMethodFragment extends Fragment implements ListTransferMethodContract.View { @@ -74,6 +76,7 @@ public class ListTransferMethodFragment extends Fragment implements ListTransfer private OnLoadTransferMethodNetworkErrorCallback mOnLoadTransferMethodNetworkErrorCallback; private boolean mIsTransferMethodsReloadNeeded; private RecyclerView recyclerView; + private AppBarLayout appBarLayout; /** * Please don't use this constructor this is reserved for Android Core Framework @@ -162,17 +165,11 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat super.onViewCreated(view, savedInstanceState); mProgressBar = view.findViewById(R.id.list_transfer_method_progress_bar_layout); mEmptyListView = view.findViewById(R.id.empty_transfer_method_list_layout); - Button button = view.findViewById(R.id.add_account_button); - button.setOnClickListener(new OneClickListener() { - @Override - public void onOneClick(View v) { - mOnAddNewTransferMethodSelected.showSelectTransferMethodView(); - } - }); recyclerView = view.findViewById(R.id.list_transfer_method_item); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + appBarLayout = Objects.requireNonNull(getActivity()).findViewById(R.id.appbar_layout); } @Override @@ -216,9 +213,11 @@ public void displayTransferMethods(@Nullable final List transfer if (transferMethodList != null && !transferMethodList.isEmpty()) { mTransferMethodList = new ArrayList<>(transferMethodList); initializeNonEmptyListView(); + appBarLayout.setExpanded(true); mIsTransferMethodsReloadNeeded = false; } else { mTransferMethodList = new ArrayList<>(1); + appBarLayout.setExpanded(false); mEmptyListView.setVisibility(View.VISIBLE); mListTransferMethodAdapter.replaceData(mTransferMethodList); } diff --git a/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/AbstractMaskedInputWidget.java b/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/AbstractMaskedInputWidget.java index 87218b628..ab7911f16 100644 --- a/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/AbstractMaskedInputWidget.java +++ b/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/AbstractMaskedInputWidget.java @@ -188,6 +188,9 @@ public void beforeTextChanged(CharSequence s, int start, int count, int after) { @Override public void afterTextChanged(Editable s) { + if (mEditText.hasFocus()) { + isEdited = true; + } } @Override @@ -233,6 +236,9 @@ public void afterTextChanged(Editable s) { mEditText.addTextChangedListener(this); } } + if (mEditText.hasFocus()) { + isEdited = true; + } } /* diff --git a/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/AbstractWidget.java b/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/AbstractWidget.java index 0e9cb8311..7918bcf82 100644 --- a/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/AbstractWidget.java +++ b/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/AbstractWidget.java @@ -39,7 +39,7 @@ public abstract class AbstractWidget { public boolean isEdited = false; public AbstractWidget(@Nullable Field field, @NonNull WidgetEventListener listener, - @Nullable String defaultValue, @NonNull View defaultFocusView) { + @Nullable String defaultValue, @NonNull View defaultFocusView) { mField = field; mListener = listener; mDefaultValue = defaultValue; @@ -64,8 +64,7 @@ public void showValidationError() { public boolean isValid() { if (mField == null) { return true; - } - else if(!isEdited && mField.isFieldValueMasked()) { + } else if (!isEdited && mField.isFieldValueMasked()) { return true; } return !isInvalidEmptyValue() && !isInvalidLength() && !isInvalidRegex(); diff --git a/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/ExpiryDateWidget.java b/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/ExpiryDateWidget.java index b5de70604..08031417e 100644 --- a/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/ExpiryDateWidget.java +++ b/transfermethodui/src/main/java/com/hyperwallet/android/ui/transfermethod/view/widget/ExpiryDateWidget.java @@ -178,6 +178,9 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { @Override public void afterTextChanged(Editable s) { + if (editText.hasFocus()) { + isEdited = true; + } } }); diff --git a/transfermethodui/src/main/res/layout/activity_add_transfer_method.xml b/transfermethodui/src/main/res/layout/activity_add_transfer_method.xml index 038b0ace1..2f7b0ecfe 100644 --- a/transfermethodui/src/main/res/layout/activity_add_transfer_method.xml +++ b/transfermethodui/src/main/res/layout/activity_add_transfer_method.xml @@ -31,6 +31,7 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" + app:navigationContentDescription="@string/navigate_back_description" app:popupTheme="@style/AppTheme.PopupOverlay" /> diff --git a/transfermethodui/src/main/res/layout/activity_list_transfer_method.xml b/transfermethodui/src/main/res/layout/activity_list_transfer_method.xml index 55dd48513..b4b364fc8 100644 --- a/transfermethodui/src/main/res/layout/activity_list_transfer_method.xml +++ b/transfermethodui/src/main/res/layout/activity_list_transfer_method.xml @@ -8,6 +8,7 @@ tools:context="com.hyperwallet.android.ui.transfermethod.view.ListTransferMethodActivity"> @@ -25,6 +26,7 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" + app:navigationContentDescription="@string/navigate_back_description" app:popupTheme="@style/AppTheme.PopupOverlay"> diff --git a/transfermethodui/src/main/res/layout/activity_select_transfer_method.xml b/transfermethodui/src/main/res/layout/activity_select_transfer_method.xml index ebf07f9cf..fafd56c6d 100644 --- a/transfermethodui/src/main/res/layout/activity_select_transfer_method.xml +++ b/transfermethodui/src/main/res/layout/activity_select_transfer_method.xml @@ -23,6 +23,7 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" + app:navigationContentDescription="@string/navigate_back_description" app:popupTheme="@style/AppTheme.PopupOverlay" > diff --git a/transfermethodui/src/main/res/layout/dialog_fragment_country_selection.xml b/transfermethodui/src/main/res/layout/dialog_fragment_country_selection.xml index eed6c4d70..ae89217a8 100644 --- a/transfermethodui/src/main/res/layout/dialog_fragment_country_selection.xml +++ b/transfermethodui/src/main/res/layout/dialog_fragment_country_selection.xml @@ -14,6 +14,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" + app:navigationContentDescription="@string/navigate_back_description" app:theme="@style/ThemeOverlay.Hyperwallet.Searchable.Selector.ActionBar" /> + android:layout_height="wrap_content"> - - + android:orientation="vertical" + android:id="@+id/empty_transfer_method_list_layout"> - -