From 2c0cca93f6767da20d700b27e7bd95262ffd53bd Mon Sep 17 00:00:00 2001 From: azakrevska-epam Date: Mon, 27 May 2019 18:18:48 +0300 Subject: [PATCH 01/42] HW-53053. Split ui modules --- common/.gitignore | 1 + common/build.gradle | 124 ++++++++++++++++++ common/proguard-rules.pro | 21 +++ common/src/main/AndroidManifest.xml | 2 + .../common}/util/EspressoIdlingResource.java | 2 +- .../error/DefaultErrorDialogFragment.java | 6 +- .../DefaultErrorDialogFragmentContract.java | 2 +- .../DefaultErrorDialogFragmentPresenter.java | 2 +- .../view/error/OnNetworkErrorCallback.java | 6 +- common/src/main/res/values/colors.xml | 27 ++++ common/src/main/res/values/strings.xml | 9 ++ common/src/main/res/values/styles.xml | 50 +++++++ ...faultErrorDialogFragmentPresenterTest.java | 10 +- receipt/.gitignore | 1 + receipt/build.gradle | 116 ++++++++++++++++ receipt/proguard-rules.pro | 21 +++ receipt/src/main/AndroidManifest.xml | 2 + receipt/src/main/res/values/strings.xml | 3 + settings.gradle | 2 +- ui/build.gradle | 4 +- .../ui/AddTransferMethodTest.java | 6 +- .../transfermethod/ui/BankAccountTest.java | 2 +- .../transfermethod/ui/BankCardTest.java | 2 +- .../android/transfermethod/ui/PayPalTest.java | 13 +- .../ui/SelectTransferMethodTest.java | 2 +- ...sferMethodConfigurationRepositoryImpl.java | 2 +- .../AddTransferMethodActivity.java | 4 +- .../ListTransferMethodActivity.java | 4 +- .../SelectTransferMethodActivity.java | 4 +- ui/src/main/res/values/strings.xml | 9 +- ui/src/main/res/values/styles.xml | 76 +++++------ 31 files changed, 454 insertions(+), 81 deletions(-) create mode 100644 common/.gitignore create mode 100644 common/build.gradle create mode 100644 common/proguard-rules.pro create mode 100644 common/src/main/AndroidManifest.xml rename {ui/src/main/java/com/hyperwallet/android/ui => common/src/main/java/com/hyperwallet/android/common}/util/EspressoIdlingResource.java (93%) rename {ui/src/main/java/com/hyperwallet/android/ui => common/src/main/java/com/hyperwallet/android/common}/view/error/DefaultErrorDialogFragment.java (97%) rename {ui/src/main/java/com/hyperwallet/android/ui => common/src/main/java/com/hyperwallet/android/common}/view/error/DefaultErrorDialogFragmentContract.java (97%) rename {ui/src/main/java/com/hyperwallet/android/ui => common/src/main/java/com/hyperwallet/android/common}/view/error/DefaultErrorDialogFragmentPresenter.java (98%) rename {ui/src/main/java/com/hyperwallet/android/ui => common/src/main/java/com/hyperwallet/android/common}/view/error/OnNetworkErrorCallback.java (79%) create mode 100644 common/src/main/res/values/colors.xml create mode 100644 common/src/main/res/values/strings.xml create mode 100644 common/src/main/res/values/styles.xml rename {ui/src/test/java/com/hyperwallet/android/ui => common/src/test/java/com/hyperwallet/android/common}/view/error/DefaultErrorDialogFragmentPresenterTest.java (92%) create mode 100644 receipt/.gitignore create mode 100644 receipt/build.gradle create mode 100644 receipt/proguard-rules.pro create mode 100644 receipt/src/main/AndroidManifest.xml create mode 100644 receipt/src/main/res/values/strings.xml diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/common/.gitignore @@ -0,0 +1 @@ +/build diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 000000000..d6e471db7 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,124 @@ +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' + +android { + compileSdkVersion 28 + + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName version + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + debug { + testCoverageEnabled true + } + } + +} + +dependencies { + implementation "com.google.android.material:material:1.0.0" + implementation "androidx.test.espresso:espresso-idling-resource:3.1.1" + + implementation "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" + + androidTestImplementation "androidx.test.ext:junit:1.1.0" + androidTestImplementation "androidx.test:runner:1.1.1" + androidTestImplementation "androidx.test.espresso:espresso-core:3.1.1" + + testImplementation group: 'org.mockito', name: 'mockito-core', version: "2.25.0" + testImplementation group: 'pl.pragmatists', name: 'JUnitParams', version: "1.1.1" +} + +task javadocs(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + failOnError false +} + +task javadocsJar(type: Jar, dependsOn: javadocs) { + classifier = 'javadoc' + from javadocs.destinationDir +} + +task sourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs +} + +def aarFile = file("$buildDir/outputs/aar/ui-$version" + ".aar") +def aarArtifact = artifacts.add('archives', aarFile) { + type 'aar' +} + +def isReleaseVersion = !version.endsWith('SNAPSHOT') + +publishing { + + repositories { + maven { + def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2" + def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots" + url = isReleaseVersion ? releasesRepoUrl : snapshotsRepoUrl + credentials { + username sonatypeUsername + password sonatypePassword + } + } + } + + publications { + hyperwalletUi(MavenPublication) { + groupId = 'com.hyperwallet.android' + artifactId = 'common' + version = version + + artifact(sourcesJar) + artifact(javadocsJar) + artifact(aarArtifact) + + pom { + name = 'Hyperwallet Android UI SDK (common)' + description = 'Hyperwallet UI SDK for Android to integrate with Hyperwallet Platform' + url = 'https://github.com/hyperwallet/hyperwallet-android-ui-sdk' + pom.withXml { + def dependenciesNode = asNode().appendNode('dependencies') + configurations.implementation.allDependencies.each { + def dependencyNode = dependenciesNode.appendNode('dependency') + dependencyNode.appendNode('groupId', it.group) + dependencyNode.appendNode('artifactId', it.name) + dependencyNode.appendNode('version', it.version) + } + } + licenses { + license { + name = 'MIT License' + url = 'http://www.opensource.org/licenses/MIT' + } + } + developers { + developer { + id = 'devs' + name = 'Hyperwallet Developers' + } + } + scm { + connection = 'scm:git:git://github.com/hyperwallet/hyperwallet-android-ui-sdk.git' + developerConnection = 'scm:git:git://github.com/hyperwallet/hyperwallet-android-ui-sdk.git' + url = 'https://github.com/hyperwallet/hyperwallet-android-ui-sdk' + } + } + } + } +} \ No newline at end of file diff --git a/common/proguard-rules.pro b/common/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/common/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 diff --git a/common/src/main/AndroidManifest.xml b/common/src/main/AndroidManifest.xml new file mode 100644 index 000000000..72af9106f --- /dev/null +++ b/common/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/ui/src/main/java/com/hyperwallet/android/ui/util/EspressoIdlingResource.java b/common/src/main/java/com/hyperwallet/android/common/util/EspressoIdlingResource.java similarity index 93% rename from ui/src/main/java/com/hyperwallet/android/ui/util/EspressoIdlingResource.java rename to common/src/main/java/com/hyperwallet/android/common/util/EspressoIdlingResource.java index 61fbcbf40..92e6cf3a4 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/util/EspressoIdlingResource.java +++ b/common/src/main/java/com/hyperwallet/android/common/util/EspressoIdlingResource.java @@ -1,4 +1,4 @@ -package com.hyperwallet.android.ui.util; +package com.hyperwallet.android.common.util; import androidx.test.espresso.IdlingResource; import androidx.test.espresso.idling.CountingIdlingResource; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragment.java b/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragment.java similarity index 97% rename from ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragment.java rename to common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragment.java index 9253875e5..114869de9 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragment.java +++ b/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragment.java @@ -14,7 +14,7 @@ * 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.view.error; +package com.hyperwallet.android.common.view.error; import static com.hyperwallet.android.ExceptionMapper.EC_AUTHENTICATION_TOKEN_PROVIDER_EXCEPTION; import static com.hyperwallet.android.ExceptionMapper.EC_IO_EXCEPTION; @@ -33,7 +33,7 @@ import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; -import com.hyperwallet.android.hyperwallet_ui.R; +import com.hyperwallet.android.common.R; import com.hyperwallet.android.model.HyperwalletError; import java.util.ArrayList; @@ -73,7 +73,7 @@ public void onCancel(DialogInterface dialog) { /** * Builds Hyperwallet Error Dialogue * - * @param errors List of Errors @see {@link Error} + * @param errors List of Errors @see {@link Error} */ public static DefaultErrorDialogFragment newInstance(@NonNull List errors) { Bundle bundle = new Bundle(); diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentContract.java b/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentContract.java similarity index 97% rename from ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentContract.java rename to common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentContract.java index fa7950b6b..6fd3db51c 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentContract.java +++ b/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentContract.java @@ -14,7 +14,7 @@ * 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.view.error; +package com.hyperwallet.android.common.view.error; import android.content.res.Resources; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentPresenter.java b/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentPresenter.java similarity index 98% rename from ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentPresenter.java rename to common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentPresenter.java index 53103fdd5..b9f493359 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentPresenter.java +++ b/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentPresenter.java @@ -14,7 +14,7 @@ * 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.view.error; +package com.hyperwallet.android.common.view.error; import static com.hyperwallet.android.ExceptionMapper.EC_AUTHENTICATION_TOKEN_PROVIDER_EXCEPTION; import static com.hyperwallet.android.ExceptionMapper.EC_IO_EXCEPTION; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/error/OnNetworkErrorCallback.java b/common/src/main/java/com/hyperwallet/android/common/view/error/OnNetworkErrorCallback.java similarity index 79% rename from ui/src/main/java/com/hyperwallet/android/ui/view/error/OnNetworkErrorCallback.java rename to common/src/main/java/com/hyperwallet/android/common/view/error/OnNetworkErrorCallback.java index c08b2e9bd..a6822c545 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/error/OnNetworkErrorCallback.java +++ b/common/src/main/java/com/hyperwallet/android/common/view/error/OnNetworkErrorCallback.java @@ -1,13 +1,13 @@ -package com.hyperwallet.android.ui.view.error; +package com.hyperwallet.android.common.view.error; import java.util.List; /** * Retry callback @see {@link DefaultErrorDialogFragment#newInstance(List)} - * */ + */ public interface OnNetworkErrorCallback { /** * Gets invoked when Error occurred and its possible to retry operation - * */ + */ void retry(); } diff --git a/common/src/main/res/values/colors.xml b/common/src/main/res/values/colors.xml new file mode 100644 index 000000000..2d8989b26 --- /dev/null +++ b/common/src/main/res/values/colors.xml @@ -0,0 +1,27 @@ + + + + #007F9F + #00AFD0 + #60E1FF + #E1F6FA + + + #666666 + #C4C4C4 + #E0E0E0 + #EFEFF4 + #DBDBDB + #ACACAC + #F7F7F7 + + + #FFFFFF + #000000 + + #DB4437 + + + #E5F7FA + + diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml new file mode 100644 index 000000000..f46ffb1a3 --- /dev/null +++ b/common/src/main/res/values/strings.xml @@ -0,0 +1,9 @@ + + Error + Connectivity Issue + Unexpected Error + Cancel + Close + Try again + + diff --git a/common/src/main/res/values/styles.xml b/common/src/main/res/values/styles.xml new file mode 100644 index 000000000..3ed39557b --- /dev/null +++ b/common/src/main/res/values/styles.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ui/src/test/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentPresenterTest.java b/common/src/test/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentPresenterTest.java similarity index 92% rename from ui/src/test/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentPresenterTest.java rename to common/src/test/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentPresenterTest.java index 05ff4966d..aa3848d07 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/view/error/DefaultErrorDialogFragmentPresenterTest.java +++ b/common/src/test/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragmentPresenterTest.java @@ -1,8 +1,7 @@ -package com.hyperwallet.android.ui.view.error; +package com.hyperwallet.android.common.view.error; +import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.mockito.Matchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -16,11 +15,12 @@ import android.content.res.Resources; -import com.hyperwallet.android.hyperwallet_ui.R; +import com.hyperwallet.android.common.R; import com.hyperwallet.android.model.HyperwalletError; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; import java.util.ArrayList; import java.util.Arrays; @@ -65,7 +65,7 @@ public void testBuildDialogMessage_buildDefaultExceptionMessage() { errors.add(new HyperwalletError("My default message", "my error code")); String message = presenter.buildDialogMessage(errors, resources); - verify(resources, never()).getString(anyInt()); + verify(resources, never()).getString(ArgumentMatchers.anyInt()); assertThat(message, is("My default message")); } diff --git a/receipt/.gitignore b/receipt/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/receipt/.gitignore @@ -0,0 +1 @@ +/build diff --git a/receipt/build.gradle b/receipt/build.gradle new file mode 100644 index 000000000..2796886af --- /dev/null +++ b/receipt/build.gradle @@ -0,0 +1,116 @@ +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' + +android { + compileSdkVersion 28 + + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName version + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + debug { + testCoverageEnabled true + } + } + +} + +dependencies { + + api "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" + api "com.hyperwallet.android:common:1.0.0-beta03-SNAPSHOT" +} + +task javadocs(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + failOnError false +} + +task javadocsJar(type: Jar, dependsOn: javadocs) { + classifier = 'javadoc' + from javadocs.destinationDir +} + +task sourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs +} + +def aarFile = file("$buildDir/outputs/aar/ui-$version"+".aar") +def aarArtifact = artifacts.add('archives', aarFile) { + type 'aar' +} + +def isReleaseVersion = !version.endsWith('SNAPSHOT') + +publishing { + + repositories { + maven { + def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2" + def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots" + url = isReleaseVersion ? releasesRepoUrl : snapshotsRepoUrl + credentials { + username sonatypeUsername + password sonatypePassword + } + } + } + + publications { + hyperwalletUi(MavenPublication) { + groupId = 'com.hyperwallet.android' + artifactId = 'receipt' + version = version + + artifact(sourcesJar) + artifact(javadocsJar) + artifact(aarArtifact) + + pom { + name = 'Hyperwallet Android UI SDK (receipt)' + description = 'Hyperwallet UI SDK for Android to integrate with Hyperwallet Platform' + url = 'https://github.com/hyperwallet/hyperwallet-android-ui-sdk' + pom.withXml { + def dependenciesNode = asNode().appendNode('dependencies') + configurations.implementation.allDependencies.each { + def dependencyNode = dependenciesNode.appendNode('dependency') + dependencyNode.appendNode('groupId', it.group) + dependencyNode.appendNode('artifactId', it.name) + dependencyNode.appendNode('version', it.version) + } + } + licenses { + license { + name = 'MIT License' + url = 'http://www.opensource.org/licenses/MIT' + } + } + developers { + developer { + id = 'devs' + name = 'Hyperwallet Developers' + } + } + scm { + connection = 'scm:git:git://github.com/hyperwallet/hyperwallet-android-ui-sdk.git' + developerConnection = 'scm:git:git://github.com/hyperwallet/hyperwallet-android-ui-sdk.git' + url = 'https://github.com/hyperwallet/hyperwallet-android-ui-sdk' + } + } + } + } +} diff --git a/receipt/proguard-rules.pro b/receipt/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/receipt/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 diff --git a/receipt/src/main/AndroidManifest.xml b/receipt/src/main/AndroidManifest.xml new file mode 100644 index 000000000..bf6f4ad0c --- /dev/null +++ b/receipt/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml new file mode 100644 index 000000000..3764f704b --- /dev/null +++ b/receipt/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + receipt + diff --git a/settings.gradle b/settings.gradle index 4f16d512e..905f2e4e9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':ui' +include ':ui', ':common', ':receipt' diff --git a/ui/build.gradle b/ui/build.gradle index 36e57ea3a..36cd891d4 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -45,11 +45,11 @@ dependencies { implementation "androidx.appcompat:appcompat:1.0.2" implementation "com.google.android.material:material:1.0.0" implementation "androidx.constraintlayout:constraintlayout:1.1.3" - implementation "androidx.test.espresso:espresso-idling-resource:3.1.1" implementation "androidx.legacy:legacy-support-v4:1.0.0" implementation "androidx.recyclerview:recyclerview:1.0.0" api "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" + api "com.hyperwallet.android:common:1.0.0-beta03-SNAPSHOT" androidTestImplementation "androidx.test.ext:junit:1.1.0" androidTestImplementation "androidx.test:runner:1.1.1" @@ -116,7 +116,7 @@ publishing { artifact(aarArtifact) pom { - name = 'Hyperwallet Android UI SDK' + name = 'Hyperwallet Android UI SDK (ui)' description = 'Hyperwallet UI SDK for Android to integrate with Hyperwallet Platform' url = 'https://github.com/hyperwallet/hyperwallet-android-ui-sdk' pom.withXml { diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/AddTransferMethodTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/AddTransferMethodTest.java index c4af970ff..c76a8e79f 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/AddTransferMethodTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/AddTransferMethodTest.java @@ -22,7 +22,7 @@ import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; import static java.net.HttpURLConnection.HTTP_OK; -import static com.hyperwallet.android.ui.view.error.DefaultErrorDialogFragment.RESULT_ERROR; +import static com.hyperwallet.android.common.view.error.DefaultErrorDialogFragment.RESULT_ERROR; import static com.hyperwallet.android.util.EspressoUtils.nestedScrollTo; import android.app.Instrumentation; @@ -36,13 +36,13 @@ import androidx.test.rule.ActivityTestRule; import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.common.util.EspressoIdlingResource; +import com.hyperwallet.android.common.view.error.DefaultErrorDialogFragment; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.rule.HyperwalletMockWebServer; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.transfermethod.AddTransferMethodActivity; -import com.hyperwallet.android.ui.util.EspressoIdlingResource; -import com.hyperwallet.android.ui.view.error.DefaultErrorDialogFragment; import com.hyperwallet.android.util.TestAuthenticationProvider; import org.junit.After; diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankAccountTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankAccountTest.java index 9134735a2..ad6fe81d3 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankAccountTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankAccountTest.java @@ -46,13 +46,13 @@ import androidx.test.rule.ActivityTestRule; import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletTransferMethod; import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.rule.HyperwalletMockWebServer; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.transfermethod.AddTransferMethodActivity; -import com.hyperwallet.android.ui.util.EspressoIdlingResource; import com.hyperwallet.android.util.RecyclerViewCountAssertion; import com.hyperwallet.android.util.TestAuthenticationProvider; diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankCardTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankCardTest.java index e2d2c1003..71c638001 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankCardTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankCardTest.java @@ -41,13 +41,13 @@ import androidx.test.rule.ActivityTestRule; import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletTransferMethod; import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.rule.HyperwalletMockWebServer; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.transfermethod.AddTransferMethodActivity; -import com.hyperwallet.android.ui.util.EspressoIdlingResource; import com.hyperwallet.android.util.TestAuthenticationProvider; import org.junit.After; diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/PayPalTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/PayPalTest.java index 0133e6a90..4df46ee51 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/PayPalTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/PayPalTest.java @@ -43,13 +43,13 @@ import androidx.test.rule.ActivityTestRule; import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletTransferMethod; import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.rule.HyperwalletMockWebServer; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.transfermethod.AddTransferMethodActivity; -import com.hyperwallet.android.ui.util.EspressoIdlingResource; import com.hyperwallet.android.util.TestAuthenticationProvider; import org.junit.After; @@ -115,9 +115,9 @@ public void testAddTransferMethod_displaysElementsOnTmcResponse() { onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))).check( matches(withText(R.string.paypal_account))); - onView(withId(R.id.email)).check(matches(isDisplayed())); - onView(withId(R.id.emailLabel)).check(matches(isDisplayed())); + onView(withId(R.id.emailLabel)).perform(nestedScrollTo()).check(matches(isDisplayed())); onView(withId(R.id.emailLabel)).check(matches(withHint("Email"))); + onView(withId(R.id.email)).perform(nestedScrollTo()).check(matches(isDisplayed())); onView(withId(R.id.add_transfer_method_button)).perform(nestedScrollTo()).check( matches(withText(R.string.button_create_transfer_method))); @@ -169,7 +169,7 @@ public void onReceive(Context context, Intent intent) { .registerReceiver(br, new IntentFilter("ACTION_HYPERWALLET_TRANSFER_METHOD_ADDED")); onView(withId(R.id.email)) - .perform(typeText("sunshine.carreiro@hyperwallet.com")) + .perform(nestedScrollTo(), typeText("sunshine.carreiro@hyperwallet.com")) .perform(closeSoftKeyboard()); onView(withId(R.id.add_transfer_method_button)).perform(nestedScrollTo(), click()); @@ -187,7 +187,7 @@ public void onReceive(Context context, Intent intent) { public void testAddTransferMethod_returnsErrorOnInvalidPattern() { mActivityTestRule.launchActivity(null); // Number input should not allow non numeric values - onView(withId(R.id.email)).perform(typeText("abc1test")); + onView(withId(R.id.email)).perform(nestedScrollTo(), typeText("abc1test")); onView(withId(R.id.add_transfer_method_button)).perform(nestedScrollTo(), click()); onView(withId(R.id.emailLabel)) @@ -212,7 +212,8 @@ public void testAddTransferMethod_displaysErrorOnInvalidEmailAddress() { mActivityTestRule.launchActivity(null); onView(withId(R.id.email)) - .perform(typeText("invalidEmail@gmail.com")).perform(closeSoftKeyboard()); + .perform(nestedScrollTo(), typeText("invalidEmail@gmail.com")) + .perform(closeSoftKeyboard()); onView(withId(R.id.add_transfer_method_button)).perform(nestedScrollTo(), click()); // check dialog content diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java index 01aa039f7..ec314cf3e 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java @@ -42,12 +42,12 @@ import androidx.test.rule.ActivityTestRule; import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.rule.HyperwalletMockWebServer; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.transfermethod.SelectTransferMethodActivity; -import com.hyperwallet.android.ui.util.EspressoIdlingResource; import com.hyperwallet.android.util.RecyclerViewCountAssertion; import com.hyperwallet.android.util.TestAuthenticationProvider; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java index 67f2c2278..635d02d96 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java @@ -33,6 +33,7 @@ import androidx.annotation.VisibleForTesting; import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.exception.HyperwalletException; import com.hyperwallet.android.listener.HyperwalletListener; import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationField; @@ -40,7 +41,6 @@ import com.hyperwallet.android.model.meta.keyed.HyperwalletTransferMethodType; import com.hyperwallet.android.model.meta.query.HyperwalletTransferMethodConfigurationFieldQuery; import com.hyperwallet.android.model.meta.query.HyperwalletTransferMethodConfigurationKeysQuery; -import com.hyperwallet.android.ui.util.EspressoIdlingResource; import java.util.HashMap; import java.util.Map; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodActivity.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodActivity.java index 381446c7a..196e80f30 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodActivity.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodActivity.java @@ -28,11 +28,11 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import com.hyperwallet.android.common.view.error.DefaultErrorDialogFragment; +import com.hyperwallet.android.common.view.error.OnNetworkErrorCallback; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.ui.view.WidgetSelectionDialogFragment; -import com.hyperwallet.android.ui.view.error.DefaultErrorDialogFragment; -import com.hyperwallet.android.ui.view.error.OnNetworkErrorCallback; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java index 8ac52f721..ea6dc604f 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java @@ -30,11 +30,11 @@ import androidx.fragment.app.FragmentTransaction; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.hyperwallet.android.common.view.error.DefaultErrorDialogFragment; +import com.hyperwallet.android.common.view.error.OnNetworkErrorCallback; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.ui.view.error.DefaultErrorDialogFragment; -import com.hyperwallet.android.ui.view.error.OnNetworkErrorCallback; import com.hyperwallet.android.ui.view.widget.OneClickListener; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodActivity.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodActivity.java index 5a8ff0e92..a0582988b 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodActivity.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodActivity.java @@ -31,12 +31,12 @@ import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import com.hyperwallet.android.common.view.error.DefaultErrorDialogFragment; +import com.hyperwallet.android.common.view.error.OnNetworkErrorCallback; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.ui.view.CountrySelectionDialogFragment; import com.hyperwallet.android.ui.view.CurrencySelectionDialogFragment; -import com.hyperwallet.android.ui.view.error.DefaultErrorDialogFragment; -import com.hyperwallet.android.ui.view.error.OnNetworkErrorCallback; import java.util.List; diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 659d07697..0c983668d 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -7,7 +7,8 @@ Select Transfer Method - @string/title_activity_select_transfer_method + @string/title_activity_select_transfer_method + Country Currency @@ -26,9 +27,6 @@ Default Account Select account as default method MM/YY - Error - Connectivity Issue - Unexpected Error Transaction Fee: Processing Time: @@ -47,9 +45,6 @@ Remove account Remove - Cancel - Close - Try again Transfer Funds diff --git a/ui/src/main/res/values/styles.xml b/ui/src/main/res/values/styles.xml index 887a6de77..73072e176 100644 --- a/ui/src/main/res/values/styles.xml +++ b/ui/src/main/res/values/styles.xml @@ -179,39 +179,39 @@ 0.12 - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + From 9ba8f51372f7b07f9397a7a78b9bfbc8594fc48f Mon Sep 17 00:00:00 2001 From: azakrevska-epam Date: Mon, 27 May 2019 19:08:42 +0300 Subject: [PATCH 02/42] HW-53053. Added jacoco settings --- common/build.gradle | 23 ++++++++ common/config/jacoco-settings.gradle | 79 ++++++++++++++++++++++++++++ common/config/lint.xml | 7 +++ 3 files changed, 109 insertions(+) create mode 100644 common/config/jacoco-settings.gradle create mode 100644 common/config/lint.xml diff --git a/common/build.gradle b/common/build.gradle index d6e471db7..680283082 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,5 +1,8 @@ apply plugin: 'com.android.library' apply plugin: 'maven-publish' +apply plugin: 'signing' +apply plugin: 'org.sonarqube' +apply from: "$projectDir/config/jacoco-settings.gradle" android { compileSdkVersion 28 @@ -121,4 +124,24 @@ publishing { } } } +} + +tasks.withType(Sign) { + onlyIf { + isReleaseVersion && sonatypeUsername?.trim() && sonatypePassword?.trim() + } +} + +signing { + sign publishing.publications.hyperwalletUi +} + +sonarqube { + properties { + def libraries = project.android.sdkDirectory.getPath() + "/platforms/android-28/android.jar" + property "sonar.sources", "src/main/java" + property "sonar.binaries", "build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/hyperwallet/android" + property "sonar.libraries", libraries + property "sonar.projectName", "android-ui-sdk-common" + } } \ No newline at end of file diff --git a/common/config/jacoco-settings.gradle b/common/config/jacoco-settings.gradle new file mode 100644 index 000000000..7ce61b7aa --- /dev/null +++ b/common/config/jacoco-settings.gradle @@ -0,0 +1,79 @@ +apply plugin: 'jacoco' + +final def jacocoVersion = "0.8.2" + +jacoco { + toolVersion = jacocoVersion +} + +android { + testOptions { + unitTests { + includeAndroidResources = true + returnDefaultValues = true + } + unitTests.all { + jacoco { + includeNoLocationClasses = true + } + } + } +} + +def fileFilter = ['**/BuildConfig.*'] + +def debugClassPaths = [ + '**/intermediates/javac/dev/*/classes/**' +] + +final def coverageSourceDirs = ["$project.projectDir/src/main/java/*"] + +task jacocoTestReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') { + + group = 'Reporting' + description = 'Generate Jacoco coverage reports.' + + reports { + html { + enabled = true + destination file("$buildDir/reports/jacoco") + } + } + + classDirectories = fileTree( + dir: "${buildDir}", + includes: debugClassPaths, + excludes: fileFilter + ) + + additionalSourceDirs = files(coverageSourceDirs) + sourceDirectories = files(coverageSourceDirs) + executionData = files("${buildDir}/jacoco/testDevUnitTest.exec") +} + +task jacocoTestCoverageVerification(type: JacocoCoverageVerification, dependsOn: 'jacocoTestReport') { + + group = 'Verification' + classDirectories = fileTree( + dir: "${buildDir}", + includes: debugClassPaths, + excludes: fileFilter + ) + additionalSourceDirs = files(coverageSourceDirs) + sourceDirectories = files(coverageSourceDirs) + executionData = files("${buildDir}/jacoco/testDebugUnitTest.exec") + + violationRules { + setFailOnViolation(true) + + rule { + element = 'CLASS' + limit { + value = 'COVEREDRATIO' + counter = 'BRANCH' + minimum = 0.65 + } + } + } +} + diff --git a/common/config/lint.xml b/common/config/lint.xml new file mode 100644 index 000000000..3c83d4bb5 --- /dev/null +++ b/common/config/lint.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file From 794906599608b72d081c589b3d53ac37800773a1 Mon Sep 17 00:00:00 2001 From: Flavio Mattos Date: Mon, 27 May 2019 17:39:41 -0700 Subject: [PATCH 03/42] Merge with package changes + multi module build --- build.gradle | 62 +++++++++++++++- common/build.gradle | 71 ++++--------------- .../error/DefaultErrorDialogFragment.java | 28 ++++---- receipt/build.gradle | 65 +++++------------ ui/build.gradle | 58 ++------------- .../rule/HyperwalletMockWebServer.java | 8 +-- .../android/ui/HyperwalletLocalBroadcast.java | 2 +- .../ui/repository/RepositoryFactory.java | 8 +-- ...TransferMethodConfigurationRepository.java | 4 +- ...sferMethodConfigurationRepositoryImpl.java | 22 +++--- .../repository/TransferMethodRepository.java | 2 +- .../TransferMethodRepositoryImpl.java | 18 ++--- .../android/ui/repository/UserRepository.java | 2 +- .../ui/repository/UserRepositoryImpl.java | 2 +- .../AddTransferMethodContract.java | 6 +- .../AddTransferMethodFragment.java | 44 ++++++------ .../AddTransferMethodPresenter.java | 4 +- .../ui/transfermethod/FeeFormatter.java | 2 +- .../ListTransferMethodActivity.java | 2 +- .../ListTransferMethodContract.java | 2 +- .../ListTransferMethodFragment.java | 18 ++--- .../ListTransferMethodPresenter.java | 2 +- .../SelectTransferMethodFragment.java | 10 +-- .../SelectTransferMethodPresenter.java | 10 +-- .../TransferMethodSelectionItem.java | 2 +- .../transfermethod/TransferMethodUtils.java | 18 ++--- .../view/CountrySelectionDialogFragment.java | 12 ++-- .../view/CurrencySelectionDialogFragment.java | 8 +-- .../view/WidgetSelectionDialogFragment.java | 8 +-- .../ui/view/widget/AbstractWidget.java | 2 +- .../android/ui/view/widget/DateWidget.java | 2 +- .../ui/view/widget/DefaultAccountWidget.java | 2 +- .../ui/view/widget/ExpiryDateWidget.java | 4 +- .../android/ui/view/widget/NumberWidget.java | 2 +- .../android/ui/view/widget/PhoneWidget.java | 2 +- .../ui/view/widget/SelectionWidget.java | 4 +- .../android/ui/view/widget/TextWidget.java | 2 +- .../android/ui/view/widget/WidgetFactory.java | 4 +- ...MethodConfigurationRepositoryImplTest.java | 22 +++--- .../TransferMethodRepositoryImplTest.java | 36 +++++----- .../ui/repository/UserRepositoryImplTest.java | 20 +++--- .../AddTransferMethodPresenterTest.java | 23 +++--- .../ui/transfermethod/FeeFormatterTest.java | 7 +- .../ListTransferMethodPresenterTest.java | 27 ++++--- .../SelectTransferMethodPresenterTest.java | 15 ++-- .../TransferMethodUtilsTest.java | 4 +- 46 files changed, 306 insertions(+), 372 deletions(-) diff --git a/build.gradle b/build.gradle index 7d443fbbc..b12a62454 100644 --- a/build.gradle +++ b/build.gradle @@ -24,8 +24,68 @@ allprojects { } project.version = "1.0.0-beta03-SNAPSHOT" + +} + +subprojects { + + ext { + hyperwalletGroupId = 'com.hyperwallet.android' + } + + apply plugin: 'com.android.library' + android { + compileSdkVersion 28 + defaultConfig { + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName version + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArgument "listener", "com.squareup.leakcanary.FailTestOnLeakRunListener" + } + + sourceSets { + androidTest { + resources.srcDirs += ['src/test/resources'] + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + testCoverageEnabled true + } + } + + lintOptions { + abortOnError true + warningsAsErrors true + lintConfig file("config/lint.xml") + } + } + + task javadocs(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + failOnError false + } + + task javadocsJar(type: Jar, dependsOn: javadocs) { + classifier = 'javadoc' + from javadocs.destinationDir + } + + task sourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs + } + } task clean(type: Delete) { delete rootProject.buildDir -} +} \ No newline at end of file diff --git a/common/build.gradle b/common/build.gradle index 680283082..73aebbc0f 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -4,63 +4,32 @@ apply plugin: 'signing' apply plugin: 'org.sonarqube' apply from: "$projectDir/config/jacoco-settings.gradle" -android { - compileSdkVersion 28 - - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 28 - versionCode 1 - versionName version - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - debug { - testCoverageEnabled true - } - } - -} dependencies { implementation "com.google.android.material:material:1.0.0" implementation "androidx.test.espresso:espresso-idling-resource:3.1.1" - implementation "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" - androidTestImplementation "androidx.test.ext:junit:1.1.0" androidTestImplementation "androidx.test:runner:1.1.1" androidTestImplementation "androidx.test.espresso:espresso-core:3.1.1" - testImplementation group: 'org.mockito', name: 'mockito-core', version: "2.25.0" testImplementation group: 'pl.pragmatists', name: 'JUnitParams', version: "1.1.1" } -task javadocs(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - failOnError false -} -task javadocsJar(type: Jar, dependsOn: javadocs) { - classifier = 'javadoc' - from javadocs.destinationDir +sonarqube { + properties { + def libraries = project.android.sdkDirectory.getPath() + "/platforms/android-28/android.jar" + property "sonar.sources", "src/main/java" + property "sonar.binaries", "build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/hyperwallet/android" + property "sonar.libraries", libraries + property "sonar.projectName", "android-ui-sdk-common" + } } -task sourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.srcDirs -} -def aarFile = file("$buildDir/outputs/aar/ui-$version" + ".aar") + +def aarFile = file("$buildDir/outputs/aar/common-$version"+".aar") def aarArtifact = artifacts.add('archives', aarFile) { type 'aar' } @@ -82,8 +51,8 @@ publishing { } publications { - hyperwalletUi(MavenPublication) { - groupId = 'com.hyperwallet.android' + hyperwalletCommonUi(MavenPublication) { + groupId = hyperwalletGroupId artifactId = 'common' version = version @@ -92,8 +61,8 @@ publishing { artifact(aarArtifact) pom { - name = 'Hyperwallet Android UI SDK (common)' - description = 'Hyperwallet UI SDK for Android to integrate with Hyperwallet Platform' + name = 'Hyperwallet Android Common UI SDK' + description = 'Hyperwallet Common UI SDK for Android to integrate with Hyperwallet Platform' url = 'https://github.com/hyperwallet/hyperwallet-android-ui-sdk' pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') @@ -133,15 +102,5 @@ tasks.withType(Sign) { } signing { - sign publishing.publications.hyperwalletUi -} - -sonarqube { - properties { - def libraries = project.android.sdkDirectory.getPath() + "/platforms/android-28/android.jar" - property "sonar.sources", "src/main/java" - property "sonar.binaries", "build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/hyperwallet/android" - property "sonar.libraries", libraries - property "sonar.projectName", "android-ui-sdk-common" - } + sign publishing.publications.hyperwalletCommonUi } \ No newline at end of file diff --git a/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragment.java b/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragment.java index 114869de9..b3ea55029 100644 --- a/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragment.java +++ b/common/src/main/java/com/hyperwallet/android/common/view/error/DefaultErrorDialogFragment.java @@ -55,6 +55,20 @@ public DefaultErrorDialogFragment() { setRetainInstance(true); } + /** + * Builds Hyperwallet Error Dialogue + * + * @param errors List of Errors @see {@link Error} + */ + public static DefaultErrorDialogFragment newInstance(@NonNull List errors) { + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList(ARGUMENT_ERROR_KEY, new ArrayList<>(errors)); + + DefaultErrorDialogFragment errorDialogFragment = new DefaultErrorDialogFragment(); + errorDialogFragment.setArguments(bundle); + return errorDialogFragment; + } + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -70,20 +84,6 @@ public void onCancel(DialogInterface dialog) { requireActivity().finish(); } - /** - * Builds Hyperwallet Error Dialogue - * - * @param errors List of Errors @see {@link Error} - */ - public static DefaultErrorDialogFragment newInstance(@NonNull List errors) { - Bundle bundle = new Bundle(); - bundle.putParcelableArrayList(ARGUMENT_ERROR_KEY, new ArrayList<>(errors)); - - DefaultErrorDialogFragment errorDialogFragment = new DefaultErrorDialogFragment(); - errorDialogFragment.setArguments(bundle); - return errorDialogFragment; - } - public void show(@NonNull FragmentManager manager) { show(manager, TAG); } diff --git a/receipt/build.gradle b/receipt/build.gradle index 2796886af..58ee632f6 100644 --- a/receipt/build.gradle +++ b/receipt/build.gradle @@ -1,55 +1,14 @@ apply plugin: 'com.android.library' apply plugin: 'maven-publish' +apply plugin: 'signing' -android { - compileSdkVersion 28 - - - defaultConfig { - minSdkVersion 21 - targetSdkVersion 28 - versionCode 1 - versionName version - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - debug { - testCoverageEnabled true - } - } - -} dependencies { - api "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" - api "com.hyperwallet.android:common:1.0.0-beta03-SNAPSHOT" -} - -task javadocs(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - failOnError false + project(":common") } -task javadocsJar(type: Jar, dependsOn: javadocs) { - classifier = 'javadoc' - from javadocs.destinationDir -} - -task sourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.srcDirs -} - -def aarFile = file("$buildDir/outputs/aar/ui-$version"+".aar") +def aarFile = file("$buildDir/outputs/aar/receipt-$version"+".aar") def aarArtifact = artifacts.add('archives', aarFile) { type 'aar' } @@ -71,8 +30,8 @@ publishing { } publications { - hyperwalletUi(MavenPublication) { - groupId = 'com.hyperwallet.android' + hyperwalletReceiptUi(MavenPublication) { + groupId = hyperwalletGroupId artifactId = 'receipt' version = version @@ -81,8 +40,8 @@ publishing { artifact(aarArtifact) pom { - name = 'Hyperwallet Android UI SDK (receipt)' - description = 'Hyperwallet UI SDK for Android to integrate with Hyperwallet Platform' + name = 'Hyperwallet Android Receipt UI SDK' + description = 'Hyperwallet Receipt UI SDK for Android to integrate with Hyperwallet Platform' url = 'https://github.com/hyperwallet/hyperwallet-android-ui-sdk' pom.withXml { def dependenciesNode = asNode().appendNode('dependencies') @@ -114,3 +73,13 @@ publishing { } } } + +tasks.withType(Sign) { + onlyIf { + isReleaseVersion && sonatypeUsername?.trim() && sonatypePassword?.trim() + } +} + +signing { + sign publishing.publications.hyperwalletReceiptUi +} \ No newline at end of file diff --git a/ui/build.gradle b/ui/build.gradle index 36cd891d4..446865c12 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -4,42 +4,6 @@ apply plugin: 'signing' apply plugin: 'org.sonarqube' apply from: "$projectDir/config/jacoco-settings.gradle" -android { - compileSdkVersion 28 - defaultConfig { - minSdkVersion 21 - targetSdkVersion 28 - versionCode 1 - versionName version - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArgument "listener", "com.squareup.leakcanary.FailTestOnLeakRunListener" - } - - sourceSets { - androidTest { - resources.srcDirs += ['src/test/resources'] - } - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - debug { - testCoverageEnabled true - } - } - - lintOptions { - abortOnError true - warningsAsErrors true - lintConfig file("config/lint.xml") - } - -} - - dependencies { implementation "androidx.appcompat:appcompat:1.0.2" @@ -49,7 +13,8 @@ dependencies { implementation "androidx.recyclerview:recyclerview:1.0.0" api "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" - api "com.hyperwallet.android:common:1.0.0-beta03-SNAPSHOT" + api project(":common") + api project(":receipt") androidTestImplementation "androidx.test.ext:junit:1.1.0" androidTestImplementation "androidx.test:runner:1.1.1" @@ -68,21 +33,6 @@ dependencies { } -task javadocs(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - failOnError false -} - -task javadocsJar(type: Jar, dependsOn: javadocs) { - classifier = 'javadoc' - from javadocs.destinationDir -} - -task sourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.srcDirs -} def aarFile = file("$buildDir/outputs/aar/ui-$version"+".aar") def aarArtifact = artifacts.add('archives', aarFile) { @@ -107,7 +57,7 @@ publishing { publications { hyperwalletUi(MavenPublication) { - groupId = 'com.hyperwallet.android' + groupId = hyperwalletGroupId artifactId = 'ui-sdk' version = version @@ -116,7 +66,7 @@ publishing { artifact(aarArtifact) pom { - name = 'Hyperwallet Android UI SDK (ui)' + name = 'Hyperwallet Android UI SDK' description = 'Hyperwallet UI SDK for Android to integrate with Hyperwallet Platform' url = 'https://github.com/hyperwallet/hyperwallet-android-ui-sdk' pom.withXml { diff --git a/ui/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletMockWebServer.java b/ui/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletMockWebServer.java index 0917a22b2..9f42f6128 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletMockWebServer.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletMockWebServer.java @@ -14,6 +14,10 @@ public final class HyperwalletMockWebServer extends TestWatcher { private MockWebServer mServer; private int port; + public HyperwalletMockWebServer(int port) { + this.port = port; + } + @Override protected void starting(Description description) { super.starting(description); @@ -36,10 +40,6 @@ protected void finished(Description description) { } } - public HyperwalletMockWebServer(int port) { - this.port = port; - } - public HyperwalletMockResponse mockResponse() { return new Builder(mServer).build(); } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletLocalBroadcast.java b/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletLocalBroadcast.java index 35e62f2d0..7eed4cec5 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletLocalBroadcast.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletLocalBroadcast.java @@ -26,7 +26,7 @@ import androidx.annotation.StringDef; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/RepositoryFactory.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/RepositoryFactory.java index ec2a3a935..8ae21ee6d 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/RepositoryFactory.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/RepositoryFactory.java @@ -46,6 +46,10 @@ public static synchronized RepositoryFactory getInstance() { return sInstance; } + public static void clearInstance() { + sInstance = null; + } + public TransferMethodConfigurationRepository getTransferMethodConfigurationRepository() { return mTransferMethodConfigurationRepository; } @@ -57,8 +61,4 @@ public TransferMethodRepository getTransferMethodRepository() { public UserRepository getUserRepository() { return mUserRepository; } - - public static void clearInstance() { - sInstance = null; - } } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepository.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepository.java index a937b371e..165e21565 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepository.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepository.java @@ -30,8 +30,8 @@ import androidx.annotation.Nullable; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationField; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationKey; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationField; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationKey; public interface TransferMethodConfigurationRepository { diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java index 635d02d96..d2301698e 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java @@ -36,11 +36,11 @@ import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.exception.HyperwalletException; import com.hyperwallet.android.listener.HyperwalletListener; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationField; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationKey; -import com.hyperwallet.android.model.meta.keyed.HyperwalletTransferMethodType; -import com.hyperwallet.android.model.meta.query.HyperwalletTransferMethodConfigurationFieldQuery; -import com.hyperwallet.android.model.meta.query.HyperwalletTransferMethodConfigurationKeysQuery; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationField; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationKey; +import com.hyperwallet.android.model.graphql.keyed.HyperwalletTransferMethodType; +import com.hyperwallet.android.model.graphql.query.HyperwalletTransferMethodConfigurationFieldQuery; +import com.hyperwallet.android.model.graphql.query.HyperwalletTransferMethodConfigurationKeysQuery; import java.util.HashMap; import java.util.Map; @@ -48,20 +48,15 @@ import java.util.Set; public class TransferMethodConfigurationRepositoryImpl implements TransferMethodConfigurationRepository { - private HyperwalletTransferMethodConfigurationKey mTransferMethodConfigurationKey; private final Handler mHandler; private final Map mFieldMap; + private HyperwalletTransferMethodConfigurationKey mTransferMethodConfigurationKey; TransferMethodConfigurationRepositoryImpl() { mHandler = new Handler(); mFieldMap = new HashMap<>(); } - @VisibleForTesting - Hyperwallet getHyperwallet() { - return Hyperwallet.getDefault(); - } - @VisibleForTesting() protected TransferMethodConfigurationRepositoryImpl(@Nullable Handler handler, HyperwalletTransferMethodConfigurationKey transferMethodConfigurationKey, @@ -71,6 +66,11 @@ protected TransferMethodConfigurationRepositoryImpl(@Nullable Handler handler, mFieldMap = fieldMap; } + @VisibleForTesting + Hyperwallet getHyperwallet() { + return Hyperwallet.getDefault(); + } + @VisibleForTesting void getTransferMethodConfigurationKeyResult(final LoadKeysCallback loadKeysCallback) { HyperwalletTransferMethodConfigurationKeysQuery query = new HyperwalletTransferMethodConfigurationKeysQuery(); diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepository.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepository.java index de222ff69..37baebfc9 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepository.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepository.java @@ -20,7 +20,7 @@ import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImpl.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImpl.java index 4becad682..7d6b77063 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImpl.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImpl.java @@ -16,11 +16,11 @@ */ package com.hyperwallet.android.ui.repository; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TOKEN; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TYPE; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.PAYPAL_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TOKEN; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TYPE; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.PAYPAL_ACCOUNT; import android.os.Handler; @@ -31,12 +31,12 @@ import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.exception.HyperwalletException; import com.hyperwallet.android.listener.HyperwalletListener; -import com.hyperwallet.android.model.HyperwalletBankAccount; -import com.hyperwallet.android.model.HyperwalletBankCard; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.model.PayPalAccount; import com.hyperwallet.android.model.paging.HyperwalletPageList; +import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; +import com.hyperwallet.android.model.transfermethod.HyperwalletBankCard; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.PayPalAccount; public class TransferMethodRepositoryImpl implements TransferMethodRepository { diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/UserRepository.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/UserRepository.java index 902a8d13b..777b7583a 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/UserRepository.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/UserRepository.java @@ -21,7 +21,7 @@ import androidx.annotation.NonNull; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.HyperwalletUser; +import com.hyperwallet.android.model.user.HyperwalletUser; /** * User Repository Contract diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/UserRepositoryImpl.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/UserRepositoryImpl.java index 561d4cf85..524849db2 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/UserRepositoryImpl.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/UserRepositoryImpl.java @@ -27,7 +27,7 @@ import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.exception.HyperwalletException; import com.hyperwallet.android.listener.HyperwalletListener; -import com.hyperwallet.android.model.HyperwalletUser; +import com.hyperwallet.android.model.user.HyperwalletUser; public class UserRepositoryImpl implements UserRepository { diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodContract.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodContract.java index eb3e29810..2d0aec1f4 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodContract.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodContract.java @@ -19,9 +19,9 @@ import androidx.annotation.NonNull; import com.hyperwallet.android.model.HyperwalletError; -import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.model.meta.HyperwalletFee; -import com.hyperwallet.android.model.meta.field.HyperwalletFieldGroup; +import com.hyperwallet.android.model.graphql.HyperwalletFee; +import com.hyperwallet.android.model.graphql.field.HyperwalletFieldGroup; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodFragment.java index 659e6a205..5fc0fda71 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodFragment.java @@ -16,13 +16,13 @@ */ package com.hyperwallet.android.ui.transfermethod; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.PROFILE_TYPE; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_COUNTRY; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_CURRENCY; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TYPE; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.PAYPAL_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.PROFILE_TYPE; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_COUNTRY; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_CURRENCY; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TYPE; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.PAYPAL_ACCOUNT; import android.app.Activity; import android.content.Context; @@ -46,14 +46,14 @@ import com.hyperwallet.android.exception.HyperwalletException; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.HyperwalletBankAccount; -import com.hyperwallet.android.model.HyperwalletBankCard; import com.hyperwallet.android.model.HyperwalletError; -import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.model.PayPalAccount; -import com.hyperwallet.android.model.meta.HyperwalletFee; -import com.hyperwallet.android.model.meta.field.HyperwalletField; -import com.hyperwallet.android.model.meta.field.HyperwalletFieldGroup; +import com.hyperwallet.android.model.graphql.HyperwalletFee; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.HyperwalletFieldGroup; +import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; +import com.hyperwallet.android.model.transfermethod.HyperwalletBankCard; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.PayPalAccount; import com.hyperwallet.android.ui.HyperwalletLocalBroadcast; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.view.WidgetSelectionDialogFragment; @@ -477,14 +477,6 @@ public void openWidgetSelectionFragmentDialog(@NonNull final TreeMap errors); - } - - interface OnAddTransferMethodNetworkErrorCallback { - void showErrorsAddTransferMethod(@NonNull final List errors); - } - private void triggerSubmit() { if (performValidation(true)) { switch (mTransferMethodType) { @@ -580,4 +572,12 @@ private boolean performValidation(boolean bypassFocusCheck) { public boolean isActive() { return isAdded(); } + + interface OnLoadTransferMethodConfigurationFieldsNetworkErrorCallback { + void showErrorsLoadTransferMethodConfigurationFields(@NonNull final List errors); + } + + interface OnAddTransferMethodNetworkErrorCallback { + void showErrorsAddTransferMethod(@NonNull final List errors); + } } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodPresenter.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodPresenter.java index 8373668bd..a2b23bdee 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodPresenter.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodPresenter.java @@ -20,8 +20,8 @@ import androidx.annotation.Nullable; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationField; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationField; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.repository.TransferMethodConfigurationRepository; import com.hyperwallet.android.ui.repository.TransferMethodRepository; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/FeeFormatter.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/FeeFormatter.java index 095c218c7..9e0c25358 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/FeeFormatter.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/FeeFormatter.java @@ -23,7 +23,7 @@ import androidx.annotation.NonNull; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.meta.HyperwalletFee; +import com.hyperwallet.android.model.graphql.HyperwalletFee; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java index ea6dc604f..9f3f37654 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodActivity.java @@ -34,7 +34,7 @@ import com.hyperwallet.android.common.view.error.OnNetworkErrorCallback; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.view.widget.OneClickListener; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodContract.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodContract.java index e3403d5a7..0b2e0e5ad 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodContract.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodContract.java @@ -20,7 +20,7 @@ import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java index 715ce8eba..385d827a6 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java @@ -16,14 +16,14 @@ */ package com.hyperwallet.android.ui.transfermethod; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.BANK_ACCOUNT_ID; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.CARD_NUMBER; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_COUNTRY; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TYPE; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.PREPAID_CARD; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.WIRE_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.BANK_ACCOUNT_ID; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.CARD_NUMBER; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_COUNTRY; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TYPE; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.PREPAID_CARD; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.WIRE_ACCOUNT; import static com.hyperwallet.android.ui.transfermethod.TransferMethodUtils.getStringFontIcon; import static com.hyperwallet.android.ui.transfermethod.TransferMethodUtils.getStringResourceByName; @@ -51,7 +51,7 @@ import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.HyperwalletLocalBroadcast; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.view.HorizontalDividerItemDecorator; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodPresenter.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodPresenter.java index 5480e0a2e..4ad64b5d1 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodPresenter.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodPresenter.java @@ -20,7 +20,7 @@ import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.repository.TransferMethodRepository; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java index 193aefd14..aa4a9408f 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java @@ -354,6 +354,11 @@ public void reloadCurrencySelection() { mPresenter.loadCurrencySelection(mSelectedCountryCode, mSelectedCurrencyCode); } + private String getCountryDisplay(@NonNull final String countryCode) { + Locale locale = new Locale.Builder().setRegion(countryCode).build(); + return locale.getDisplayName(); + } + public interface TransferMethodSelectionItemListener { void onTransferMethodSelected(TransferMethodSelectionItem transferMethodType); @@ -384,11 +389,6 @@ interface OnLoadCurrencySelectionNetworkErrorCallback { void showErrorsLoadCurrencySelection(@NonNull final List errors); } - private String getCountryDisplay(@NonNull final String countryCode) { - Locale locale = new Locale.Builder().setRegion(countryCode).build(); - return locale.getDisplayName(); - } - private static class TransferMethodTypesAdapter extends RecyclerView.Adapter { diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodPresenter.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodPresenter.java index e5e49cb59..e6cb193bd 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodPresenter.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodPresenter.java @@ -21,11 +21,11 @@ import androidx.annotation.Nullable; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.HyperwalletUser; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationKey; -import com.hyperwallet.android.model.meta.keyed.Country; -import com.hyperwallet.android.model.meta.keyed.Currency; -import com.hyperwallet.android.model.meta.keyed.HyperwalletTransferMethodType; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationKey; +import com.hyperwallet.android.model.graphql.keyed.Country; +import com.hyperwallet.android.model.graphql.keyed.Currency; +import com.hyperwallet.android.model.graphql.keyed.HyperwalletTransferMethodType; +import com.hyperwallet.android.model.user.HyperwalletUser; import com.hyperwallet.android.ui.repository.TransferMethodConfigurationRepository; import com.hyperwallet.android.ui.repository.UserRepository; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/TransferMethodSelectionItem.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/TransferMethodSelectionItem.java index c3c7af373..e116f9368 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/TransferMethodSelectionItem.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/TransferMethodSelectionItem.java @@ -18,7 +18,7 @@ import androidx.annotation.NonNull; -import com.hyperwallet.android.model.meta.HyperwalletFee; +import com.hyperwallet.android.model.graphql.HyperwalletFee; import java.util.ArrayList; import java.util.List; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/TransferMethodUtils.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/TransferMethodUtils.java index 7eb96f386..87877cddd 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/TransferMethodUtils.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/TransferMethodUtils.java @@ -16,13 +16,13 @@ */ package com.hyperwallet.android.ui.transfermethod; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TYPE; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.PAPER_CHECK; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.PAYPAL_ACCOUNT; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.PREPAID_CARD; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.WIRE_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TYPE; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.PAPER_CHECK; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.PAYPAL_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.PREPAID_CARD; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.WIRE_ACCOUNT; import android.content.Context; import android.content.res.Resources; @@ -30,8 +30,8 @@ import androidx.annotation.NonNull; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodType; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodType; import java.util.Locale; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/CountrySelectionDialogFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/view/CountrySelectionDialogFragment.java index 52ce63c19..828697756 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/CountrySelectionDialogFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/CountrySelectionDialogFragment.java @@ -134,8 +134,8 @@ public void onClick(View v) { public void onViewStateRestored(@Nullable Bundle savedInstanceState) { super.onViewStateRestored(savedInstanceState); if (savedInstanceState != null) { - mCountryNameCodeMap = new TreeMap<>( - (Map)savedInstanceState.getSerializable(ARGUMENT_COUNTRY_NAME_CODE_MAP)); + mCountryNameCodeMap = new TreeMap<>( + (Map) savedInstanceState.getSerializable(ARGUMENT_COUNTRY_NAME_CODE_MAP)); mSelectedCountryName = savedInstanceState.getString(ARGUMENT_SELECTED_COUNTRY_NAME); mSearchCountryNameQuery = savedInstanceState.getString(ARGUMENT_SEARCH_COUNTRY_NAME_QUERY); } else { @@ -217,6 +217,10 @@ public void onView() { } } + public interface CountrySelectionItemClickListener { + void onCountryItemClicked(String countryCode); + } + private static class Adapter extends RecyclerView.Adapter implements Filterable { private TreeMap mCountryNameCodeFilteredMap; @@ -350,8 +354,4 @@ void recycle() { } } } - - public interface CountrySelectionItemClickListener { - void onCountryItemClicked(String countryCode); - } } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/CurrencySelectionDialogFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/view/CurrencySelectionDialogFragment.java index 52f6428e3..84e0ed3fc 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/CurrencySelectionDialogFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/CurrencySelectionDialogFragment.java @@ -233,6 +233,10 @@ public void hideSoftKey(@NonNull View focusedView) { inputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0); } + public interface CurrencySelectionItemClickListener { + void onCurrencyItemClicked(String currencyCode); + } + private static class Adapter extends RecyclerView.Adapter implements Filterable { private TreeMap mCurrencyNameCodeFilteredMap; @@ -367,8 +371,4 @@ void recycle() { } } } - - public interface CurrencySelectionItemClickListener { - void onCurrencyItemClicked(String currencyCode); - } } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/WidgetSelectionDialogFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/view/WidgetSelectionDialogFragment.java index 5dab1341b..42b98af70 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/WidgetSelectionDialogFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/WidgetSelectionDialogFragment.java @@ -232,6 +232,10 @@ public interface WidgetSelectionItemListener { void onWidgetSelectionItemClicked(@NonNull final String selectedValue, @NonNull final String fieldName); } + public interface WidgetSelectionItemType { + void onWidgetSelectionItemClicked(@NonNull String selectedValue); + } + private static class Adapter extends RecyclerView.Adapter implements Filterable { private final Fragment mFragment; @@ -370,8 +374,4 @@ void recycle() { } } } - - public interface WidgetSelectionItemType { - void onWidgetSelectionItemClicked(@NonNull String selectedValue); - } } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/AbstractWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/AbstractWidget.java index 211e120c6..bad1ae933 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/AbstractWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/AbstractWidget.java @@ -24,7 +24,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.hyperwallet.android.model.meta.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; public abstract class AbstractWidget { diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateWidget.java index 00746d090..fd2199c83 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateWidget.java @@ -32,7 +32,7 @@ import com.google.android.material.textfield.TextInputLayout; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.meta.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; public class DateWidget extends AbstractWidget { diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DefaultAccountWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DefaultAccountWidget.java index 9463f308f..99bfabc0b 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DefaultAccountWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DefaultAccountWidget.java @@ -1,6 +1,6 @@ package com.hyperwallet.android.ui.view.widget; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.IS_DEFAULT_TRANSFER_METHOD; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.IS_DEFAULT_TRANSFER_METHOD; import android.graphics.Typeface; import android.view.View; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/ExpiryDateWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/ExpiryDateWidget.java index 9777f2153..8ae7dfacf 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/ExpiryDateWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/ExpiryDateWidget.java @@ -39,11 +39,11 @@ import com.google.android.material.textfield.TextInputLayout; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.meta.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; public class ExpiryDateWidget extends AbstractWidget { - private ViewGroup mContainer; private final ExpireDateUtil mExpireDateUtil; + private ViewGroup mContainer; private TextInputLayout mTextInputLayout; private String mValue; private String mMessageInvalidDateLength; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/NumberWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/NumberWidget.java index 39dcc7eed..2d4e9562c 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/NumberWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/NumberWidget.java @@ -32,7 +32,7 @@ import com.google.android.material.textfield.TextInputLayout; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.meta.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; public class NumberWidget extends AbstractWidget { private ViewGroup mContainer; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/PhoneWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/PhoneWidget.java index b0d2b8e0f..346c1972c 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/PhoneWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/PhoneWidget.java @@ -32,7 +32,7 @@ import com.google.android.material.textfield.TextInputLayout; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.meta.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; public class PhoneWidget extends AbstractWidget { private ViewGroup mContainer; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/SelectionWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/SelectionWidget.java index 146de1b65..102eea656 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/SelectionWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/SelectionWidget.java @@ -32,8 +32,8 @@ import com.google.android.material.textfield.TextInputLayout; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.meta.field.HyperwalletField; -import com.hyperwallet.android.model.meta.field.HyperwalletFieldSelectionOption; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.HyperwalletFieldSelectionOption; import com.hyperwallet.android.ui.view.WidgetSelectionDialogFragment; import java.util.Set; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/TextWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/TextWidget.java index f16fd51c0..599b77b9a 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/TextWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/TextWidget.java @@ -32,7 +32,7 @@ import com.google.android.material.textfield.TextInputLayout; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.meta.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; public class TextWidget extends AbstractWidget { private ViewGroup mContainer; diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/WidgetFactory.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/WidgetFactory.java index 18bd507ca..a633114a6 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/WidgetFactory.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/WidgetFactory.java @@ -22,8 +22,8 @@ import androidx.annotation.Nullable; import com.hyperwallet.android.exception.HyperwalletException; -import com.hyperwallet.android.model.meta.field.EDataType; -import com.hyperwallet.android.model.meta.field.HyperwalletField; +import com.hyperwallet.android.model.graphql.field.EDataType; +import com.hyperwallet.android.model.graphql.field.HyperwalletField; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; diff --git a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImplTest.java b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImplTest.java index 0b99486ff..aec2aad6d 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImplTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImplTest.java @@ -15,7 +15,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static com.hyperwallet.android.model.HyperwalletUser.ProfileTypes.INDIVIDUAL; +import static com.hyperwallet.android.model.user.HyperwalletUser.ProfileTypes.INDIVIDUAL; import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.exception.HyperwalletException; @@ -23,16 +23,16 @@ import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.TypeReference; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationField; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationKey; -import com.hyperwallet.android.model.meta.field.HyperwalletFieldGroup; -import com.hyperwallet.android.model.meta.field.HyperwalletTransferMethodConfiguration; -import com.hyperwallet.android.model.meta.field.HyperwalletTransferMethodConfigurationFieldResult; -import com.hyperwallet.android.model.meta.keyed.Country; -import com.hyperwallet.android.model.meta.keyed.Currency; -import com.hyperwallet.android.model.meta.keyed.HyperwalletTransferMethodConfigurationKeyResult; -import com.hyperwallet.android.model.meta.query.HyperwalletTransferMethodConfigurationFieldQuery; -import com.hyperwallet.android.model.meta.query.HyperwalletTransferMethodConfigurationKeysQuery; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationField; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationKey; +import com.hyperwallet.android.model.graphql.field.HyperwalletFieldGroup; +import com.hyperwallet.android.model.graphql.field.HyperwalletTransferMethodConfiguration; +import com.hyperwallet.android.model.graphql.field.HyperwalletTransferMethodConfigurationFieldResult; +import com.hyperwallet.android.model.graphql.keyed.Country; +import com.hyperwallet.android.model.graphql.keyed.Currency; +import com.hyperwallet.android.model.graphql.keyed.HyperwalletTransferMethodConfigurationKeyResult; +import com.hyperwallet.android.model.graphql.query.HyperwalletTransferMethodConfigurationFieldQuery; +import com.hyperwallet.android.model.graphql.query.HyperwalletTransferMethodConfigurationKeysQuery; import com.hyperwallet.android.ui.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.util.JsonUtils; diff --git a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java index cfcdb8c96..6135c42b2 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java @@ -15,26 +15,26 @@ import static com.hyperwallet.android.model.HyperwalletStatusTransition.StatusDefinition.ACTIVATED; import static com.hyperwallet.android.model.HyperwalletStatusTransition.StatusDefinition.DE_ACTIVATED; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.BANK_ACCOUNT_ID; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.BANK_NAME; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.STATUS; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TOKEN; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_COUNTRY; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_CURRENCY; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TYPE; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.BANK_ACCOUNT_ID; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.BANK_NAME; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.STATUS; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TOKEN; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_COUNTRY; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_CURRENCY; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TYPE; import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.exception.HyperwalletException; import com.hyperwallet.android.listener.HyperwalletListener; -import com.hyperwallet.android.model.HyperwalletBankAccount; -import com.hyperwallet.android.model.HyperwalletBankCard; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.model.HyperwalletTransferMethodPagination; -import com.hyperwallet.android.model.PayPalAccount; import com.hyperwallet.android.model.paging.HyperwalletPageList; +import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; +import com.hyperwallet.android.model.transfermethod.HyperwalletBankCard; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethodPagination; +import com.hyperwallet.android.model.transfermethod.PayPalAccount; import org.junit.Before; import org.junit.Rule; @@ -58,6 +58,12 @@ @RunWith(RobolectricTestRunner.class) public class TransferMethodRepositoryImplTest { + @Rule + public ExpectedException mThrown = ExpectedException.none(); + @Rule + public MockitoRule mMockito = MockitoJUnit.rule(); + @Spy + TransferMethodRepositoryImpl mTransferMethodRepository; @Mock private Hyperwallet mHyperwallet; @Mock @@ -78,12 +84,6 @@ public class TransferMethodRepositoryImplTest { private ArgumentCaptor mStatusTransitionArgumentCaptor; @Captor private ArgumentCaptor> mListTransferMethodCaptor; - @Rule - public ExpectedException mThrown = ExpectedException.none(); - @Rule - public MockitoRule mMockito = MockitoJUnit.rule(); - @Spy - TransferMethodRepositoryImpl mTransferMethodRepository; @Before public void setup() { diff --git a/ui/src/test/java/com/hyperwallet/android/ui/repository/UserRepositoryImplTest.java b/ui/src/test/java/com/hyperwallet/android/ui/repository/UserRepositoryImplTest.java index 0553f14a0..d35c7fa3a 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/repository/UserRepositoryImplTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/repository/UserRepositoryImplTest.java @@ -11,16 +11,16 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static com.hyperwallet.android.model.HyperwalletUser.ProfileTypes.INDIVIDUAL; -import static com.hyperwallet.android.model.HyperwalletUser.UserStatuses.PRE_ACTIVATED; -import static com.hyperwallet.android.model.HyperwalletUser.VerificationStatuses.NOT_REQUIRED; +import static com.hyperwallet.android.model.user.HyperwalletUser.ProfileTypes.INDIVIDUAL; +import static com.hyperwallet.android.model.user.HyperwalletUser.UserStatuses.PRE_ACTIVATED; +import static com.hyperwallet.android.model.user.HyperwalletUser.VerificationStatuses.NOT_REQUIRED; import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.exception.HyperwalletException; import com.hyperwallet.android.listener.HyperwalletListener; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.HyperwalletUser; +import com.hyperwallet.android.model.user.HyperwalletUser; import org.junit.Before; import org.junit.Rule; @@ -42,18 +42,18 @@ @RunWith(RobolectricTestRunner.class) public class UserRepositoryImplTest { - @Mock - private Hyperwallet mHyperwallet; + @Rule + public MockitoRule mMockito = MockitoJUnit.rule(); @Mock UserRepository.LoadUserCallback mMockCallback; + @Spy + UserRepositoryImpl mUserRepository; + @Mock + private Hyperwallet mHyperwallet; @Captor private ArgumentCaptor mErrorCaptor; @Captor private ArgumentCaptor mUserCaptor; - @Rule - public MockitoRule mMockito = MockitoJUnit.rule(); - @Spy - UserRepositoryImpl mUserRepository; @Before public void setup() { diff --git a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodPresenterTest.java b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodPresenterTest.java index 443d6b3a5..623caad7b 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodPresenterTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodPresenterTest.java @@ -13,16 +13,16 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static com.hyperwallet.android.model.HyperwalletUser.ProfileTypes.INDIVIDUAL; +import static com.hyperwallet.android.model.user.HyperwalletUser.ProfileTypes.INDIVIDUAL; -import com.hyperwallet.android.model.HyperwalletBankAccount; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.model.meta.HyperwalletFee; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationField; -import com.hyperwallet.android.model.meta.field.HyperwalletFieldGroup; -import com.hyperwallet.android.model.meta.field.HyperwalletTransferMethodConfiguration; +import com.hyperwallet.android.model.graphql.HyperwalletFee; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationField; +import com.hyperwallet.android.model.graphql.field.HyperwalletFieldGroup; +import com.hyperwallet.android.model.graphql.field.HyperwalletTransferMethodConfiguration; +import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.repository.TransferMethodConfigurationRepository; import com.hyperwallet.android.ui.repository.TransferMethodRepository; import com.hyperwallet.android.ui.rule.HyperwalletExternalResourceManager; @@ -57,8 +57,11 @@ public class AddTransferMethodPresenterTest { private final HyperwalletBankAccount bankAccount = new HyperwalletBankAccount .Builder("CA", "CAD", "3423423432") .build(); + @Rule + public MockitoRule mockito = MockitoJUnit.rule(); + @Rule + public HyperwalletExternalResourceManager externalResourceManager = new HyperwalletExternalResourceManager(); private AddTransferMethodPresenter presenter; - @Mock private TransferMethodConfigurationRepository tmcRepository; @Mock @@ -69,10 +72,6 @@ public class AddTransferMethodPresenterTest { private ArgumentCaptor> fieldArgumentCaptor; @Captor private ArgumentCaptor> mErrorListArgumentCaptor; - @Rule - public MockitoRule mockito = MockitoJUnit.rule(); - @Rule - public HyperwalletExternalResourceManager externalResourceManager = new HyperwalletExternalResourceManager(); @Before public void setUp() { diff --git a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/FeeFormatterTest.java b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/FeeFormatterTest.java index 664dac517..269efa42e 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/FeeFormatterTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/FeeFormatterTest.java @@ -9,7 +9,7 @@ import android.content.res.Resources; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.meta.HyperwalletFee; +import com.hyperwallet.android.model.graphql.HyperwalletFee; import com.hyperwallet.android.ui.rule.HyperwalletExternalResourceManager; import org.json.JSONException; @@ -33,6 +33,8 @@ public class FeeFormatterTest { @Rule public MockitoRule mockito = MockitoJUnit.rule(); + @Rule + public HyperwalletExternalResourceManager externalResourceManager = new HyperwalletExternalResourceManager(); @Captor private ArgumentCaptor resourceIdCaptor; @Captor @@ -41,9 +43,6 @@ public class FeeFormatterTest { private Context context; @Mock private Resources resources; - @Rule - public HyperwalletExternalResourceManager externalResourceManager = new HyperwalletExternalResourceManager(); - private HyperwalletFee mFlatFee; private JSONObject mJSONObject; diff --git a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodPresenterTest.java b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodPresenterTest.java index c4b8564ea..b1d95f838 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodPresenterTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodPresenterTest.java @@ -29,15 +29,15 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.BANK_ACCOUNT_ID; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_COUNTRY; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_CURRENCY; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.BANK_ACCOUNT_ID; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_COUNTRY; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_CURRENCY; -import com.hyperwallet.android.model.HyperwalletBankAccount; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.repository.TransferMethodRepository; import org.junit.Before; @@ -57,6 +57,14 @@ public class ListTransferMethodPresenterTest { + private final HyperwalletErrors errors = createErrors(); + private final HyperwalletBankAccount bankAccount = new HyperwalletBankAccount + .Builder("CA", "CAD", "3423423432") + .build(); + private final HyperwalletStatusTransition statusTransition = + new HyperwalletStatusTransition(HyperwalletStatusTransition.StatusDefinition.DE_ACTIVATED); + @Rule + public MockitoRule mMockito = MockitoJUnit.rule(); @Mock private TransferMethodRepository mTransferMethodRepository; @Mock @@ -65,15 +73,6 @@ public class ListTransferMethodPresenterTest { private ArgumentCaptor> mListArgumentErrorCaptor; @Captor private ArgumentCaptor> mListArgumentTransferMethodCaptor; - @Rule - public MockitoRule mMockito = MockitoJUnit.rule(); - - private final HyperwalletErrors errors = createErrors(); - private final HyperwalletBankAccount bankAccount = new HyperwalletBankAccount - .Builder("CA", "CAD", "3423423432") - .build(); - private final HyperwalletStatusTransition statusTransition = - new HyperwalletStatusTransition(HyperwalletStatusTransition.StatusDefinition.DE_ACTIVATED); private ListTransferMethodPresenter presenter; @Before diff --git a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodPresenterTest.java b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodPresenterTest.java index 69bbc9d67..9a109230a 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodPresenterTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodPresenterTest.java @@ -13,10 +13,10 @@ import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.HyperwalletTransferMethod; -import com.hyperwallet.android.model.HyperwalletUser; -import com.hyperwallet.android.model.meta.HyperwalletTransferMethodConfigurationKey; -import com.hyperwallet.android.model.meta.keyed.HyperwalletTransferMethodConfigurationKeyResult; +import com.hyperwallet.android.model.graphql.HyperwalletTransferMethodConfigurationKey; +import com.hyperwallet.android.model.graphql.keyed.HyperwalletTransferMethodConfigurationKeyResult; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.user.HyperwalletUser; import com.hyperwallet.android.ui.repository.TransferMethodConfigurationRepository; import com.hyperwallet.android.ui.repository.TransferMethodConfigurationRepositoryImpl; import com.hyperwallet.android.ui.repository.UserRepository; @@ -41,19 +41,18 @@ @RunWith(RobolectricTestRunner.class) public class SelectTransferMethodPresenterTest { + private final HyperwalletErrors errors = createErrors(); + @Rule + public HyperwalletExternalResourceManager externalResourceManager = new HyperwalletExternalResourceManager(); @Mock private SelectTransferMethodContract.View view; @Mock private TransferMethodConfigurationRepositoryImpl mTransferMethodConfigurationRepository; @Mock private UserRepositoryImpl mUserRepository; - @Rule - public HyperwalletExternalResourceManager externalResourceManager = new HyperwalletExternalResourceManager(); - private HyperwalletTransferMethodConfigurationKey mResult; private HyperwalletUser mUser; private SelectTransferMethodPresenter selectTransferMethodPresenter; - private final HyperwalletErrors errors = createErrors(); @Before public void initialize() throws Exception { diff --git a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/TransferMethodUtilsTest.java b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/TransferMethodUtilsTest.java index cdb6682c7..6d57d30ff 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/TransferMethodUtilsTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/transfermethod/TransferMethodUtilsTest.java @@ -9,13 +9,13 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; import android.content.Context; import android.content.res.Resources; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.rule.HyperwalletExternalResourceManager; import org.json.JSONException; From 72180158944296f48af2f1b060b31d7b367cfadc Mon Sep 17 00:00:00 2001 From: azakrevska-epam Date: Tue, 28 May 2019 18:25:36 +0300 Subject: [PATCH 04/42] HW-53053. Changed publishing --- android-library.gradle | 107 ++++++++++++++++++ build.gradle | 77 ++++--------- common/build.gradle | 22 +--- receipt/build.gradle | 16 +-- receipt/config/jacoco-settings.gradle | 79 +++++++++++++ receipt/config/lint.xml | 7 ++ ui/build.gradle | 43 ++++--- .../transfermethod/ui/BankAccountTest.java | 4 +- .../transfermethod/ui/BankCardTest.java | 2 +- .../android/transfermethod/ui/PayPalTest.java | 2 +- .../ui/SelectTransferMethodTest.java | 8 +- 11 files changed, 255 insertions(+), 112 deletions(-) create mode 100644 android-library.gradle create mode 100644 receipt/config/jacoco-settings.gradle create mode 100644 receipt/config/lint.xml diff --git a/android-library.gradle b/android-library.gradle new file mode 100644 index 000000000..4f7107efe --- /dev/null +++ b/android-library.gradle @@ -0,0 +1,107 @@ +apply plugin: 'com.android.library' +apply plugin: 'maven-publish' +apply plugin: 'signing' +apply plugin: 'org.sonarqube' +apply from: "$projectDir/config/jacoco-settings.gradle" + +android { + compileSdkVersion compileVersion + defaultConfig { + minSdkVersion minVersion + targetSdkVersion targetVersion + versionCode codeVersion + versionName version + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArgument "listener", "com.squareup.leakcanary.FailTestOnLeakRunListener" + } + + sourceSets { + androidTest { + resources.srcDirs += ['src/test/resources'] + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + testCoverageEnabled true + } + } + + lintOptions { + abortOnError true + warningsAsErrors true + lintConfig file("config/lint.xml") + } +} + +task javadocs(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) + failOnError false +} + +task javadocsJar(type: Jar, dependsOn: javadocs) { + classifier = 'javadoc' + from javadocs.destinationDir +} + +task sourcesJar(type: Jar) { + classifier = 'sources' + from android.sourceSets.main.java.srcDirs +} + + +//android { +// compileSdkVersion compileVersion +// defaultConfig { +// minSdkVersion minVersion +// targetSdkVersion targetVersion +// versionCode codeVersion +// versionName version +// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" +// testInstrumentationRunnerArgument "listener", "com.squareup.leakcanary.FailTestOnLeakRunListener" +// } +// +// sourceSets { +// androidTest { +// resources.srcDirs += ['src/test/resources'] +// } +// } +// +// buildTypes { +// release { +// minifyEnabled false +// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' +// } +// debug { +// testCoverageEnabled true +// } +// } +// +// lintOptions { +// abortOnError true +// warningsAsErrors true +// lintConfig file("config/lint.xml") +// } +//} + +dependencies { + implementation "com.google.android.material:material:$androidMaterialVersion" + api "com.hyperwallet.android:core-sdk:$hyperwalletCoreVersion" + + implementation "androidx.test.espresso:espresso-idling-resource:$espressoVersion" + + androidTestImplementation "androidx.test.ext:junit:$extJunitVerson" + androidTestImplementation "androidx.test:runner:$testRunnerVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion" + + testImplementation group: 'org.mockito', name: 'mockito-core', version: "$mockitoVersion" + testImplementation group: 'pl.pragmatists', name: 'JUnitParams', version: "$junitParamsVersion" +} + + + diff --git a/build.gradle b/build.gradle index b12a62454..1590d03dc 100644 --- a/build.gradle +++ b/build.gradle @@ -5,12 +5,12 @@ buildscript { google() jcenter() mavenLocal() - + } dependencies { classpath 'com.android.tools.build:gradle:3.3.2' classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7" - + // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -21,7 +21,7 @@ allprojects { google() jcenter() mavenLocal() - + } project.version = "1.0.0-beta03-SNAPSHOT" @@ -31,57 +31,30 @@ subprojects { ext { hyperwalletGroupId = 'com.hyperwallet.android' - } - - apply plugin: 'com.android.library' - android { - compileSdkVersion 28 - defaultConfig { - minSdkVersion 21 - targetSdkVersion 28 - versionCode 1 - versionName version - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArgument "listener", "com.squareup.leakcanary.FailTestOnLeakRunListener" - } - - sourceSets { - androidTest { - resources.srcDirs += ['src/test/resources'] - } - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - debug { - testCoverageEnabled true - } - } - - lintOptions { - abortOnError true - warningsAsErrors true - lintConfig file("config/lint.xml") - } - } - - task javadocs(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - failOnError false - } - - task javadocsJar(type: Jar, dependsOn: javadocs) { - classifier = 'javadoc' - from javadocs.destinationDir - } + compileVersion = 28 + minVersion = 21 + targetVersion = 28 + codeVersion = 1 - task sourcesJar(type: Jar) { - classifier = 'sources' - from android.sourceSets.main.java.srcDirs + hyperwalletCoreVersion = '1.0.0-beta03-SNAPSHOT' + // + androidMaterialVersion = '1.0.0' + appcompatVersion = '1.0.2' + constraintlayoutVersion = '1.1.3' + legacySupportV4Version = '1.0.0' + recycleViewVersion = '1.0.0' + //Testing + extJunitVerson = '1.1.0' + testRunnerVersion = '1.1.1' + testRulesVersion = '1.1.1' + espressoVersion = '3.1.1' + mockServerVersion = '3.11.0' + leakcanaryVersion = '1.6.3' + mockitoVersion = '2.25.0' + junitParamsVersion = '1.1.1' + robolectricVersion = '4.1' + mockWebServerVersion = '3.11.0' } } diff --git a/common/build.gradle b/common/build.gradle index 73aebbc0f..c8f04ff7a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,21 +1,4 @@ -apply plugin: 'com.android.library' -apply plugin: 'maven-publish' -apply plugin: 'signing' -apply plugin: 'org.sonarqube' -apply from: "$projectDir/config/jacoco-settings.gradle" - - -dependencies { - implementation "com.google.android.material:material:1.0.0" - implementation "androidx.test.espresso:espresso-idling-resource:3.1.1" - implementation "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" - androidTestImplementation "androidx.test.ext:junit:1.1.0" - androidTestImplementation "androidx.test:runner:1.1.1" - androidTestImplementation "androidx.test.espresso:espresso-core:3.1.1" - testImplementation group: 'org.mockito', name: 'mockito-core', version: "2.25.0" - testImplementation group: 'pl.pragmatists', name: 'JUnitParams', version: "1.1.1" -} - +apply from: "$rootProject.projectDir/android-library.gradle" sonarqube { properties { @@ -28,8 +11,7 @@ sonarqube { } - -def aarFile = file("$buildDir/outputs/aar/common-$version"+".aar") +def aarFile = file("$buildDir/outputs/aar/common-$version" + ".aar") def aarArtifact = artifacts.add('archives', aarFile) { type 'aar' } diff --git a/receipt/build.gradle b/receipt/build.gradle index 58ee632f6..23ea670d8 100644 --- a/receipt/build.gradle +++ b/receipt/build.gradle @@ -1,14 +1,10 @@ -apply plugin: 'com.android.library' -apply plugin: 'maven-publish' -apply plugin: 'signing' - +apply from: "$rootProject.projectDir/android-library.gradle" dependencies { - api "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" - project(":common") + api project(":common") } -def aarFile = file("$buildDir/outputs/aar/receipt-$version"+".aar") +def aarFile = file("$buildDir/outputs/aar/receipt-$version" + ".aar") def aarArtifact = artifacts.add('archives', aarFile) { type 'aar' } @@ -47,7 +43,11 @@ publishing { def dependenciesNode = asNode().appendNode('dependencies') configurations.implementation.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') - dependencyNode.appendNode('groupId', it.group) + if (it.group == "hyperwallet-android-ui-sdk") { + dependencyNode.appendNode('groupId', "com.hyperwallet.android") + } else { + dependencyNode.appendNode('groupId', it.group) + } dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } diff --git a/receipt/config/jacoco-settings.gradle b/receipt/config/jacoco-settings.gradle new file mode 100644 index 000000000..7ce61b7aa --- /dev/null +++ b/receipt/config/jacoco-settings.gradle @@ -0,0 +1,79 @@ +apply plugin: 'jacoco' + +final def jacocoVersion = "0.8.2" + +jacoco { + toolVersion = jacocoVersion +} + +android { + testOptions { + unitTests { + includeAndroidResources = true + returnDefaultValues = true + } + unitTests.all { + jacoco { + includeNoLocationClasses = true + } + } + } +} + +def fileFilter = ['**/BuildConfig.*'] + +def debugClassPaths = [ + '**/intermediates/javac/dev/*/classes/**' +] + +final def coverageSourceDirs = ["$project.projectDir/src/main/java/*"] + +task jacocoTestReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') { + + group = 'Reporting' + description = 'Generate Jacoco coverage reports.' + + reports { + html { + enabled = true + destination file("$buildDir/reports/jacoco") + } + } + + classDirectories = fileTree( + dir: "${buildDir}", + includes: debugClassPaths, + excludes: fileFilter + ) + + additionalSourceDirs = files(coverageSourceDirs) + sourceDirectories = files(coverageSourceDirs) + executionData = files("${buildDir}/jacoco/testDevUnitTest.exec") +} + +task jacocoTestCoverageVerification(type: JacocoCoverageVerification, dependsOn: 'jacocoTestReport') { + + group = 'Verification' + classDirectories = fileTree( + dir: "${buildDir}", + includes: debugClassPaths, + excludes: fileFilter + ) + additionalSourceDirs = files(coverageSourceDirs) + sourceDirectories = files(coverageSourceDirs) + executionData = files("${buildDir}/jacoco/testDebugUnitTest.exec") + + violationRules { + setFailOnViolation(true) + + rule { + element = 'CLASS' + limit { + value = 'COVEREDRATIO' + counter = 'BRANCH' + minimum = 0.65 + } + } + } +} + diff --git a/receipt/config/lint.xml b/receipt/config/lint.xml new file mode 100644 index 000000000..3c83d4bb5 --- /dev/null +++ b/receipt/config/lint.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ui/build.gradle b/ui/build.gradle index 446865c12..d022e802a 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -1,40 +1,31 @@ -apply plugin: 'com.android.library' +apply from: "$rootProject.projectDir/android-library.gradle" apply plugin: 'maven-publish' apply plugin: 'signing' apply plugin: 'org.sonarqube' -apply from: "$projectDir/config/jacoco-settings.gradle" dependencies { - implementation "androidx.appcompat:appcompat:1.0.2" - implementation "com.google.android.material:material:1.0.0" - implementation "androidx.constraintlayout:constraintlayout:1.1.3" - implementation "androidx.legacy:legacy-support-v4:1.0.0" - implementation "androidx.recyclerview:recyclerview:1.0.0" + implementation "androidx.appcompat:appcompat:$appcompatVersion" + implementation "androidx.constraintlayout:constraintlayout:$constraintlayoutVersion" + implementation "androidx.legacy:legacy-support-v4:$legacySupportV4Version" + implementation "androidx.recyclerview:recyclerview:$recycleViewVersion" - api "com.hyperwallet.android:core-sdk:1.0.0-beta03-SNAPSHOT" api project(":common") api project(":receipt") - androidTestImplementation "androidx.test.ext:junit:1.1.0" - androidTestImplementation "androidx.test:runner:1.1.1" - androidTestImplementation "androidx.test:rules:1.1.1" - androidTestImplementation "androidx.test.espresso:espresso-core:3.1.1" - androidTestImplementation "androidx.test.espresso:espresso-contrib:3.1.1" - androidTestImplementation "androidx.test.espresso:espresso-intents:3.1.1" - androidTestImplementation "com.squareup.okhttp3:mockwebserver:3.11.0" - androidTestImplementation "com.squareup.leakcanary:leakcanary-android-instrumentation:1.6.3" - androidTestImplementation "com.squareup.leakcanary:leakcanary-support-fragment:1.6.3" - - testImplementation group: 'org.mockito', name: 'mockito-core', version: "2.25.0" - testImplementation group: 'pl.pragmatists', name: 'JUnitParams', version: "1.1.1" - testImplementation "org.robolectric:robolectric:4.1" - testImplementation "com.squareup.okhttp3:mockwebserver:3.11.0" + androidTestImplementation "androidx.test:rules:$testRulesVersion" + androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion" + androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion" + androidTestImplementation "com.squareup.okhttp3:mockwebserver:$mockServerVersion" + androidTestImplementation "com.squareup.leakcanary:leakcanary-android-instrumentation:$leakcanaryVersion" + androidTestImplementation "com.squareup.leakcanary:leakcanary-support-fragment:$leakcanaryVersion" + testImplementation "org.robolectric:robolectric:$robolectricVersion" + testImplementation "com.squareup.okhttp3:mockwebserver:$mockWebServerVersion" } -def aarFile = file("$buildDir/outputs/aar/ui-$version"+".aar") +def aarFile = file("$buildDir/outputs/aar/ui-$version" + ".aar") def aarArtifact = artifacts.add('archives', aarFile) { type 'aar' } @@ -73,7 +64,11 @@ publishing { def dependenciesNode = asNode().appendNode('dependencies') configurations.implementation.allDependencies.each { def dependencyNode = dependenciesNode.appendNode('dependency') - dependencyNode.appendNode('groupId', it.group) + if (it.group == "hyperwallet-android-ui-sdk") { + dependencyNode.appendNode('groupId', "com.hyperwallet.android") + } else { + dependencyNode.appendNode('groupId', it.group) + } dependencyNode.appendNode('artifactId', it.name) dependencyNode.appendNode('version', it.version) } diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankAccountTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankAccountTest.java index ad6fe81d3..68df5d983 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankAccountTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankAccountTest.java @@ -25,7 +25,7 @@ import static java.net.HttpURLConnection.HTTP_OK; import static java.util.concurrent.TimeUnit.SECONDS; -import static com.hyperwallet.android.model.HyperwalletBankAccount.Purpose.SAVINGS; +import static com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount.Purpose.SAVINGS; import static com.hyperwallet.android.util.EspressoUtils.hasEmptyText; import static com.hyperwallet.android.util.EspressoUtils.hasErrorText; import static com.hyperwallet.android.util.EspressoUtils.nestedScrollTo; @@ -48,7 +48,7 @@ import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.rule.HyperwalletMockWebServer; import com.hyperwallet.android.ui.repository.RepositoryFactory; diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankCardTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankCardTest.java index 71c638001..859723e25 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankCardTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/BankCardTest.java @@ -43,7 +43,7 @@ import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.rule.HyperwalletMockWebServer; import com.hyperwallet.android.ui.repository.RepositoryFactory; diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/PayPalTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/PayPalTest.java index 4df46ee51..a24fbab78 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/PayPalTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/PayPalTest.java @@ -45,7 +45,7 @@ import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.common.util.EspressoIdlingResource; import com.hyperwallet.android.hyperwallet_ui.R; -import com.hyperwallet.android.model.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import com.hyperwallet.android.rule.HyperwalletMockWebServer; import com.hyperwallet.android.ui.repository.RepositoryFactory; diff --git a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java index ec314cf3e..c644703cd 100644 --- a/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java +++ b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java @@ -21,10 +21,10 @@ import static java.net.HttpURLConnection.HTTP_OK; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; -import static com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; -import static com.hyperwallet.android.model.HyperwalletUser.ProfileTypes.BUSINESS; -import static com.hyperwallet.android.model.HyperwalletUser.ProfileTypes.INDIVIDUAL; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; +import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_CARD; +import static com.hyperwallet.android.model.user.HyperwalletUser.ProfileTypes.BUSINESS; +import static com.hyperwallet.android.model.user.HyperwalletUser.ProfileTypes.INDIVIDUAL; import static com.hyperwallet.android.ui.transfermethod.AddTransferMethodActivity.EXTRA_TRANSFER_METHOD_COUNTRY; import static com.hyperwallet.android.ui.transfermethod.AddTransferMethodActivity.EXTRA_TRANSFER_METHOD_CURRENCY; import static com.hyperwallet.android.ui.transfermethod.AddTransferMethodActivity.EXTRA_TRANSFER_METHOD_PROFILE_TYPE; From ad0970ed6245554a79513e4a1c3257dce7b169de Mon Sep 17 00:00:00 2001 From: Flavio Mattos Date: Tue, 28 May 2019 13:43:44 -0700 Subject: [PATCH 05/42] Remove comments and unnecessary plugin usages --- android-library.gradle | 35 ----------------------------------- ui/build.gradle | 3 --- 2 files changed, 38 deletions(-) diff --git a/android-library.gradle b/android-library.gradle index 4f7107efe..620173287 100644 --- a/android-library.gradle +++ b/android-library.gradle @@ -54,41 +54,6 @@ task sourcesJar(type: Jar) { from android.sourceSets.main.java.srcDirs } - -//android { -// compileSdkVersion compileVersion -// defaultConfig { -// minSdkVersion minVersion -// targetSdkVersion targetVersion -// versionCode codeVersion -// versionName version -// testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" -// testInstrumentationRunnerArgument "listener", "com.squareup.leakcanary.FailTestOnLeakRunListener" -// } -// -// sourceSets { -// androidTest { -// resources.srcDirs += ['src/test/resources'] -// } -// } -// -// buildTypes { -// release { -// minifyEnabled false -// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' -// } -// debug { -// testCoverageEnabled true -// } -// } -// -// lintOptions { -// abortOnError true -// warningsAsErrors true -// lintConfig file("config/lint.xml") -// } -//} - dependencies { implementation "com.google.android.material:material:$androidMaterialVersion" api "com.hyperwallet.android:core-sdk:$hyperwalletCoreVersion" diff --git a/ui/build.gradle b/ui/build.gradle index d022e802a..9f023604b 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -1,7 +1,4 @@ apply from: "$rootProject.projectDir/android-library.gradle" -apply plugin: 'maven-publish' -apply plugin: 'signing' -apply plugin: 'org.sonarqube' dependencies { From 6a9b6b2d3925f2a2c7e6601ed323c016ff438aac Mon Sep 17 00:00:00 2001 From: Flavio Mattos Date: Tue, 28 May 2019 14:10:31 -0700 Subject: [PATCH 06/42] move sonar config --- common/build.gradle | 20 ++++++++++---------- receipt/build.gradle | 10 ++++++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index c8f04ff7a..e4df818b5 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,15 +1,5 @@ apply from: "$rootProject.projectDir/android-library.gradle" -sonarqube { - properties { - def libraries = project.android.sdkDirectory.getPath() + "/platforms/android-28/android.jar" - property "sonar.sources", "src/main/java" - property "sonar.binaries", "build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/hyperwallet/android" - property "sonar.libraries", libraries - property "sonar.projectName", "android-ui-sdk-common" - } -} - def aarFile = file("$buildDir/outputs/aar/common-$version" + ".aar") def aarArtifact = artifacts.add('archives', aarFile) { @@ -85,4 +75,14 @@ tasks.withType(Sign) { signing { sign publishing.publications.hyperwalletCommonUi +} + +sonarqube { + properties { + def libraries = project.android.sdkDirectory.getPath() + "/platforms/android-28/android.jar" + property "sonar.sources", "src/main/java" + property "sonar.binaries", "build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/hyperwallet/android" + property "sonar.libraries", libraries + property "sonar.projectName", "android-ui-sdk-common" + } } \ No newline at end of file diff --git a/receipt/build.gradle b/receipt/build.gradle index 23ea670d8..39c963b04 100644 --- a/receipt/build.gradle +++ b/receipt/build.gradle @@ -82,4 +82,14 @@ tasks.withType(Sign) { signing { sign publishing.publications.hyperwalletReceiptUi +} + +sonarqube { + properties { + def libraries = project.android.sdkDirectory.getPath() + "/platforms/android-28/android.jar" + property "sonar.sources", "src/main/java" + property "sonar.binaries", "build/intermediates/javac/release/compileReleaseJavaWithJavac/classes/com/hyperwallet/android" + property "sonar.libraries", libraries + property "sonar.projectName", "android-ui-sdk-receipt" + } } \ No newline at end of file From 89d922e74b087d5cbb9849c3b79c9e9d4353db45 Mon Sep 17 00:00:00 2001 From: azakrevska-epam Date: Wed, 29 May 2019 18:12:59 +0300 Subject: [PATCH 07/42] HW-53053. Moved font, styles, colors to common module --- .../src/main/res/drawable/circle.xml | 0 .../src/main/res/drawable/circle_white.xml | 0 .../res/drawable/content_border_bottom.xml | 0 .../drawable/content_border_top_bottom.xml | 0 .../main/res/drawable/horizontal_divider.xml | 0 .../drawable/ic_baseline_bug_report_24px.xml | 0 .../drawable/ic_baseline_cloud_off_24px.xml | 0 .../res/drawable/ic_baseline_warning_24px.xml | 0 .../src/main/res/drawable/ic_check_14dp.xml | 0 .../src/main/res/drawable/ic_close_14dp.xml | 0 .../drawable/ic_keyboard_arrow_down_12dp.xml | 0 .../drawable/ic_keyboard_arrow_left_12dp.xml | 0 .../drawable/ic_keyboard_arrow_right_12dp.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../main/res/drawable/ic_placeholder_24dp.xml | 0 .../src/main/res/drawable/ic_search_24dp.xml | 0 .../main/res/drawable/ic_three_dots_16dp.xml | 0 .../src/main/res/drawable/ic_trash.xml | 0 {ui => common}/src/main/res/drawable/oval.xml | 0 .../res/drawable/view_border_top_bottom.xml | 0 {ui => common}/src/main/res/font/icomoon.ttf | Bin {ui => common}/src/main/res/values/dimens.xml | 0 common/src/main/res/values/styles.xml | 209 +++++++++++++++-- ui/src/main/res/values/colors.xml | 27 --- ui/src/main/res/values/styles.xml | 219 +----------------- 25 files changed, 196 insertions(+), 259 deletions(-) rename {ui => common}/src/main/res/drawable/circle.xml (100%) rename {ui => common}/src/main/res/drawable/circle_white.xml (100%) rename {ui => common}/src/main/res/drawable/content_border_bottom.xml (100%) rename {ui => common}/src/main/res/drawable/content_border_top_bottom.xml (100%) rename {ui => common}/src/main/res/drawable/horizontal_divider.xml (100%) rename {ui => common}/src/main/res/drawable/ic_baseline_bug_report_24px.xml (100%) rename {ui => common}/src/main/res/drawable/ic_baseline_cloud_off_24px.xml (100%) rename {ui => common}/src/main/res/drawable/ic_baseline_warning_24px.xml (100%) rename {ui => common}/src/main/res/drawable/ic_check_14dp.xml (100%) rename {ui => common}/src/main/res/drawable/ic_close_14dp.xml (100%) rename {ui => common}/src/main/res/drawable/ic_keyboard_arrow_down_12dp.xml (100%) rename {ui => common}/src/main/res/drawable/ic_keyboard_arrow_left_12dp.xml (100%) rename {ui => common}/src/main/res/drawable/ic_keyboard_arrow_right_12dp.xml (100%) rename {ui => common}/src/main/res/drawable/ic_launcher_background.xml (100%) rename {ui => common}/src/main/res/drawable/ic_placeholder_24dp.xml (100%) rename {ui => common}/src/main/res/drawable/ic_search_24dp.xml (100%) rename {ui => common}/src/main/res/drawable/ic_three_dots_16dp.xml (100%) rename {ui => common}/src/main/res/drawable/ic_trash.xml (100%) rename {ui => common}/src/main/res/drawable/oval.xml (100%) rename {ui => common}/src/main/res/drawable/view_border_top_bottom.xml (100%) rename {ui => common}/src/main/res/font/icomoon.ttf (100%) mode change 100755 => 100644 rename {ui => common}/src/main/res/values/dimens.xml (100%) delete mode 100644 ui/src/main/res/values/colors.xml diff --git a/ui/src/main/res/drawable/circle.xml b/common/src/main/res/drawable/circle.xml similarity index 100% rename from ui/src/main/res/drawable/circle.xml rename to common/src/main/res/drawable/circle.xml diff --git a/ui/src/main/res/drawable/circle_white.xml b/common/src/main/res/drawable/circle_white.xml similarity index 100% rename from ui/src/main/res/drawable/circle_white.xml rename to common/src/main/res/drawable/circle_white.xml diff --git a/ui/src/main/res/drawable/content_border_bottom.xml b/common/src/main/res/drawable/content_border_bottom.xml similarity index 100% rename from ui/src/main/res/drawable/content_border_bottom.xml rename to common/src/main/res/drawable/content_border_bottom.xml diff --git a/ui/src/main/res/drawable/content_border_top_bottom.xml b/common/src/main/res/drawable/content_border_top_bottom.xml similarity index 100% rename from ui/src/main/res/drawable/content_border_top_bottom.xml rename to common/src/main/res/drawable/content_border_top_bottom.xml diff --git a/ui/src/main/res/drawable/horizontal_divider.xml b/common/src/main/res/drawable/horizontal_divider.xml similarity index 100% rename from ui/src/main/res/drawable/horizontal_divider.xml rename to common/src/main/res/drawable/horizontal_divider.xml diff --git a/ui/src/main/res/drawable/ic_baseline_bug_report_24px.xml b/common/src/main/res/drawable/ic_baseline_bug_report_24px.xml similarity index 100% rename from ui/src/main/res/drawable/ic_baseline_bug_report_24px.xml rename to common/src/main/res/drawable/ic_baseline_bug_report_24px.xml diff --git a/ui/src/main/res/drawable/ic_baseline_cloud_off_24px.xml b/common/src/main/res/drawable/ic_baseline_cloud_off_24px.xml similarity index 100% rename from ui/src/main/res/drawable/ic_baseline_cloud_off_24px.xml rename to common/src/main/res/drawable/ic_baseline_cloud_off_24px.xml diff --git a/ui/src/main/res/drawable/ic_baseline_warning_24px.xml b/common/src/main/res/drawable/ic_baseline_warning_24px.xml similarity index 100% rename from ui/src/main/res/drawable/ic_baseline_warning_24px.xml rename to common/src/main/res/drawable/ic_baseline_warning_24px.xml diff --git a/ui/src/main/res/drawable/ic_check_14dp.xml b/common/src/main/res/drawable/ic_check_14dp.xml similarity index 100% rename from ui/src/main/res/drawable/ic_check_14dp.xml rename to common/src/main/res/drawable/ic_check_14dp.xml diff --git a/ui/src/main/res/drawable/ic_close_14dp.xml b/common/src/main/res/drawable/ic_close_14dp.xml similarity index 100% rename from ui/src/main/res/drawable/ic_close_14dp.xml rename to common/src/main/res/drawable/ic_close_14dp.xml diff --git a/ui/src/main/res/drawable/ic_keyboard_arrow_down_12dp.xml b/common/src/main/res/drawable/ic_keyboard_arrow_down_12dp.xml similarity index 100% rename from ui/src/main/res/drawable/ic_keyboard_arrow_down_12dp.xml rename to common/src/main/res/drawable/ic_keyboard_arrow_down_12dp.xml diff --git a/ui/src/main/res/drawable/ic_keyboard_arrow_left_12dp.xml b/common/src/main/res/drawable/ic_keyboard_arrow_left_12dp.xml similarity index 100% rename from ui/src/main/res/drawable/ic_keyboard_arrow_left_12dp.xml rename to common/src/main/res/drawable/ic_keyboard_arrow_left_12dp.xml diff --git a/ui/src/main/res/drawable/ic_keyboard_arrow_right_12dp.xml b/common/src/main/res/drawable/ic_keyboard_arrow_right_12dp.xml similarity index 100% rename from ui/src/main/res/drawable/ic_keyboard_arrow_right_12dp.xml rename to common/src/main/res/drawable/ic_keyboard_arrow_right_12dp.xml diff --git a/ui/src/main/res/drawable/ic_launcher_background.xml b/common/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from ui/src/main/res/drawable/ic_launcher_background.xml rename to common/src/main/res/drawable/ic_launcher_background.xml diff --git a/ui/src/main/res/drawable/ic_placeholder_24dp.xml b/common/src/main/res/drawable/ic_placeholder_24dp.xml similarity index 100% rename from ui/src/main/res/drawable/ic_placeholder_24dp.xml rename to common/src/main/res/drawable/ic_placeholder_24dp.xml diff --git a/ui/src/main/res/drawable/ic_search_24dp.xml b/common/src/main/res/drawable/ic_search_24dp.xml similarity index 100% rename from ui/src/main/res/drawable/ic_search_24dp.xml rename to common/src/main/res/drawable/ic_search_24dp.xml diff --git a/ui/src/main/res/drawable/ic_three_dots_16dp.xml b/common/src/main/res/drawable/ic_three_dots_16dp.xml similarity index 100% rename from ui/src/main/res/drawable/ic_three_dots_16dp.xml rename to common/src/main/res/drawable/ic_three_dots_16dp.xml diff --git a/ui/src/main/res/drawable/ic_trash.xml b/common/src/main/res/drawable/ic_trash.xml similarity index 100% rename from ui/src/main/res/drawable/ic_trash.xml rename to common/src/main/res/drawable/ic_trash.xml diff --git a/ui/src/main/res/drawable/oval.xml b/common/src/main/res/drawable/oval.xml similarity index 100% rename from ui/src/main/res/drawable/oval.xml rename to common/src/main/res/drawable/oval.xml diff --git a/ui/src/main/res/drawable/view_border_top_bottom.xml b/common/src/main/res/drawable/view_border_top_bottom.xml similarity index 100% rename from ui/src/main/res/drawable/view_border_top_bottom.xml rename to common/src/main/res/drawable/view_border_top_bottom.xml diff --git a/ui/src/main/res/font/icomoon.ttf b/common/src/main/res/font/icomoon.ttf old mode 100755 new mode 100644 similarity index 100% rename from ui/src/main/res/font/icomoon.ttf rename to common/src/main/res/font/icomoon.ttf diff --git a/ui/src/main/res/values/dimens.xml b/common/src/main/res/values/dimens.xml similarity index 100% rename from ui/src/main/res/values/dimens.xml rename to common/src/main/res/values/dimens.xml diff --git a/common/src/main/res/values/styles.xml b/common/src/main/res/values/styles.xml index 3ed39557b..7bf6e014c 100644 --- a/common/src/main/res/values/styles.xml +++ b/common/src/main/res/values/styles.xml @@ -1,21 +1,167 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + - \ No newline at end of file diff --git a/ui/src/main/res/values/colors.xml b/ui/src/main/res/values/colors.xml deleted file mode 100644 index 2d8989b26..000000000 --- a/ui/src/main/res/values/colors.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - #007F9F - #00AFD0 - #60E1FF - #E1F6FA - - - #666666 - #C4C4C4 - #E0E0E0 - #EFEFF4 - #DBDBDB - #ACACAC - #F7F7F7 - - - #FFFFFF - #000000 - - #DB4437 - - - #E5F7FA - - diff --git a/ui/src/main/res/values/styles.xml b/ui/src/main/res/values/styles.xml index 73072e176..e5448bfce 100644 --- a/ui/src/main/res/values/styles.xml +++ b/ui/src/main/res/values/styles.xml @@ -1,4 +1,4 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 57121d4c73034c25e1f0db9db2dfa8307b679c98 Mon Sep 17 00:00:00 2001 From: azakrevska-epam Date: Thu, 30 May 2019 11:24:25 +0300 Subject: [PATCH 08/42] HW-53053. Fixed moved style --- common/src/main/res/values/styles.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/common/src/main/res/values/styles.xml b/common/src/main/res/values/styles.xml index 7bf6e014c..dbf679843 100644 --- a/common/src/main/res/values/styles.xml +++ b/common/src/main/res/values/styles.xml @@ -226,6 +226,12 @@ @color/colorSecondaryDark normal + + From 16bce8652816a7a408ad62771cc78dd57f4ceb6f Mon Sep 17 00:00:00 2001 From: azakrevska-epam Date: Thu, 30 May 2019 11:51:38 +0300 Subject: [PATCH 09/42] HW-53053. Updated lint (added exceptions for overdraw) --- common/src/main/res/values/styles.xml | 44 +++++++++---------- ui/config/lint.xml | 2 + .../hyperwallet/android/ui/HyperwalletUi.java | 4 +- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/common/src/main/res/values/styles.xml b/common/src/main/res/values/styles.xml index dbf679843..8221087b3 100644 --- a/common/src/main/res/values/styles.xml +++ b/common/src/main/res/values/styles.xml @@ -182,37 +182,37 @@ + + + + + + diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/rule/HyperwalletExternalResourceManager.java b/receipt/src/test/java/com/hyperwallet/android/receipt/rule/HyperwalletExternalResourceManager.java new file mode 100644 index 000000000..0c5f6a743 --- /dev/null +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/rule/HyperwalletExternalResourceManager.java @@ -0,0 +1,72 @@ +package com.hyperwallet.android.receipt.rule; + +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URL; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class HyperwalletExternalResourceManager extends TestWatcher { + + private static final String EMPTY = ""; + private ClassLoader classLoader; + private Logger logger; + + @Override + protected void starting(Description description) { + super.starting(description); + classLoader = description.getTestClass().getClassLoader(); + logger = Logger.getLogger(description.getTestClass().getName()); + } + + public String getResourceContent(final String resourceName) { + if (resourceName == null) { + throw new IllegalArgumentException("Parameter resourceName cannot be null"); + } + + return getContent(resourceName); + } + + private String getContent(final String resourceName) { + URL resource = classLoader.getResource(resourceName); + InputStream inputStream = null; + Writer writer = new StringWriter(); + String resourceContent = EMPTY; + if (resource != null) { + try { + inputStream = resource.openStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + String line = reader.readLine(); + while (line != null) { + writer.write(line); + line = reader.readLine(); + } + resourceContent = writer.toString(); + + } catch (Exception e) { + logger.log(Level.WARNING, "There was an error loading an external resource", e); + } finally { + try { + if (inputStream != null) { + inputStream.close(); + } + } catch (Exception e) { + logger.log(Level.SEVERE, "There was an error closing input stream", e); + } + try { + writer.close(); + } catch (IOException e) { + logger.log(Level.SEVERE, "There was an error closing writer", e); + } + } + } + return resourceContent; + } +} diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java new file mode 100644 index 000000000..760cdd23a --- /dev/null +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java @@ -0,0 +1,21 @@ +package com.hyperwallet.android.receipt.viemodel; + +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.receipt.rule.HyperwalletExternalResourceManager; + +import org.json.JSONException; +import org.json.JSONObject; + +//@RunWith(RobolectricTestRunner.class) +public class ReceiptItemListFactoryTest { + + //@Rule + private HyperwalletExternalResourceManager mExternalResourceManager = new HyperwalletExternalResourceManager(); + + //@Test + public void testConsolidateList_WithResult() throws JSONException { + String json = mExternalResourceManager.getResourceContent("receipt_list_date_grouping_response.json"); + JSONObject object = new JSONObject(json); + HyperwalletTransferMethod transferMethod = new HyperwalletTransferMethod(object); + } +} diff --git a/receipt/src/test/resources/receipt_list_date_grouping_response.json b/receipt/src/test/resources/receipt_list_date_grouping_response.json new file mode 100644 index 000000000..ccdc27f32 --- /dev/null +++ b/receipt/src/test/resources/receipt_list_date_grouping_response.json @@ -0,0 +1,99 @@ +{ + "count": 30, + "offset": 0, + "limit": 10, + "data": [ + { + "token": "trm-one-one", + "createdOn": "2019-05-27T15:49:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + }, + { + "token": "trm-one-two", + "createdOn": "2019-05-27T15:30:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + }, + { + "token": "trm-one-three", + "createdOn": "2019-05-27T13:49:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + }, + { + "token": "trm-two-one", + "createdOn": "2019-02-27T15:49:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + }, + { + "token": "trm-two-two", + "createdOn": "2019-02-27T15:30:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + }, + { + "token": "trm-two-three", + "createdOn": "2019-02-27T13:49:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + }, + { + "token": "trm-three-one", + "createdOn": "2018-12-27T15:49:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + }, + { + "token": "trm-three-two", + "createdOn": "2018-12-27T15:30:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + }, + { + "token": "trm-three-three", + "createdOn": "2018-12-27T13:49:56", + "transferMethodCountry": "US", + "transferMethodCurrency": "USD", + "bankId": "021000021", + "branchId": "021000021" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://localhost:8181/rest/internal/v1/users/usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6/transfer-methods?offset=0&limit=10&sortBy=-createdOn&status=ACTIVATED" + }, + { + "params": { + "rel": "next" + }, + "href": "https://localhost:8181/rest/internal/v1/users/usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6/transfer-methods?offset=10&limit=10&sortBy=-createdOn&status=ACTIVATED" + }, + { + "params": { + "rel": "last" + }, + "href": "https://localhost:8181/rest/internal/v1/users/usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6/transfer-methods?offset=20&limit=10&sortBy=-createdOn&status=ACTIVATED" + } + ] +} \ No newline at end of file diff --git a/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletUi.java b/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletUi.java index d2f6b9123..aae63fa7e 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletUi.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletUi.java @@ -31,6 +31,7 @@ import com.hyperwallet.android.Hyperwallet; import com.hyperwallet.android.HyperwalletAuthenticationTokenProvider; +import com.hyperwallet.android.receipt.view.ListReceiptActivity; import com.hyperwallet.android.ui.transfermethod.AddTransferMethodActivity; import com.hyperwallet.android.ui.transfermethod.ListTransferMethodActivity; import com.hyperwallet.android.ui.transfermethod.SelectTransferMethodActivity; @@ -78,6 +79,13 @@ public Intent getIntentSelectTransferMethodActivity(@NonNull final Context conte return new Intent(context, SelectTransferMethodActivity.class); } + /** + * @param context A Context of the application consuming this Intent. + * @return an Intent with the data necessary to launch the {@link ListReceiptActivity} + */ + public Intent getIntentListReceiptActivity(@NonNull final Context context) { + return new Intent(context, ListReceiptActivity.class); + } /** * @param context A Context of the application consuming this Intent. From f5fbb628ff5eef74143ff73f8089253972a21f2f Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Thu, 30 May 2019 08:02:33 -0700 Subject: [PATCH 11/42] HW-52584 draft test --- build.gradle | 2 +- .../viemodel/ReceiptItemListFactoryTest.java | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 0c6569b27..a3b6bc33f 100644 --- a/build.gradle +++ b/build.gradle @@ -52,7 +52,7 @@ subprojects { espressoVersion = '3.1.1' mockServerVersion = '3.11.0' leakcanaryVersion = '1.6.3' - mockitoVersion = '2.25.0' + mockitoVersion = '2.27.0' junitParamsVersion = '1.1.1' robolectricVersion = '4.1' mockWebServerVersion = '3.11.0' diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java index 760cdd23a..bf91abd31 100644 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java @@ -5,17 +5,26 @@ import org.json.JSONException; import org.json.JSONObject; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; -//@RunWith(RobolectricTestRunner.class) +import java.util.Locale; + +@RunWith(RobolectricTestRunner.class) public class ReceiptItemListFactoryTest { - //@Rule - private HyperwalletExternalResourceManager mExternalResourceManager = new HyperwalletExternalResourceManager(); + @Rule + public HyperwalletExternalResourceManager mExternalResourceManager = new HyperwalletExternalResourceManager(); - //@Test + @Test public void testConsolidateList_WithResult() throws JSONException { String json = mExternalResourceManager.getResourceContent("receipt_list_date_grouping_response.json"); JSONObject object = new JSONObject(json); HyperwalletTransferMethod transferMethod = new HyperwalletTransferMethod(object); + + Locale locale = Locale.getDefault(); + locale.getDisplayName(); } } From b9f84d9420c8c53e2b62ad5ff48fcf8d12228f62 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Thu, 30 May 2019 14:59:43 -0700 Subject: [PATCH 12/42] added test and test templates for receipts --- .../android/common/util/DateUtility.java | 14 ++ .../android/common/util/DateUtilityTest.java | 59 +++++++ .../ReceiptDataSourceFactoryTest.java | 29 ++++ .../repository/ReceiptDataSourceTest.java | 161 ++++++++++++++++++ .../ReceiptRepositoryFactoryTest.java | 39 +++++ .../repository/ReceiptRepositoryImplTest.java | 35 ++++ 6 files changed, 337 insertions(+) create mode 100644 common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java create mode 100644 receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactoryTest.java create mode 100644 receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java create mode 100644 receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryFactoryTest.java create mode 100644 receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImplTest.java diff --git a/common/src/main/java/com/hyperwallet/android/common/util/DateUtility.java b/common/src/main/java/com/hyperwallet/android/common/util/DateUtility.java index 7d8fb983b..487d6dba4 100644 --- a/common/src/main/java/com/hyperwallet/android/common/util/DateUtility.java +++ b/common/src/main/java/com/hyperwallet/android/common/util/DateUtility.java @@ -75,4 +75,18 @@ public static Date fromDateTimeString(@NonNull final String dateString) { "the date " + dateString, e); } } + + + /** + * date format: yyyy-MM-dd'T'HH:mm:ss + */ + public static Date fromDateTimeString(@NonNull final String dateString, @NonNull final String format) { + try { + SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault()); + return dateFormat.parse(dateString); + } catch (ParseException e) { + throw new IllegalArgumentException("An exception occurred when attempting to parse " + + "the date " + dateString, e); + } + } } diff --git a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java new file mode 100644 index 000000000..1302eb39d --- /dev/null +++ b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java @@ -0,0 +1,59 @@ +package com.hyperwallet.android.common.util; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.util.Date; + +@RunWith(JUnit4.class) +public class DateUtilityTest { + + @Test + public void testToDateFormat_returnExpectedStringFormat() { + String dateString = "2019-05-27"; + Date dateTarget = DateUtility.fromDateTimeString("2019-05-27T15:57:49"); + + // test + String targetDate = DateUtility.toDateFormat(dateTarget); + assertThat(targetDate, is(notNullValue())); + assertThat(targetDate, is(dateString)); + } + + @Test + public void testToDateFormat_returnExpectedStringFormatFromParameter() { + String dateString = "November 2019"; + Date dateTarget = DateUtility.fromDateTimeString("2019-11-27T15:57:49"); + + // test + String targetDate = DateUtility.toDateFormat(dateTarget, "MMMM yyyy"); + assertThat(targetDate, is(notNullValue())); + assertThat(targetDate, is(dateString)); + } + + @Test + public void testToDateTimeFormat_returnExpectedStringFormat() { + String dateString = "2019-11-27T15:57:49"; + Date dateTarget = DateUtility.fromDateTimeString("2019-11-27T15:57:49"); + + // test + String targetDate = DateUtility.toDateTimeFormat(dateTarget); + assertThat(targetDate, is(notNullValue())); + assertThat(targetDate, is(dateString)); + } + + @Test + public void testToDateTimeMillisFormat_returnExpectedStringFormat() { + String dateString = "2019-11-27T15:57:09.450"; + Date dateTarget = DateUtility.fromDateTimeString("2019-11-27T15:57:09.450", "yyyy-MM-dd'T'HH:mm:ss.SSS"); + + // test + String targetDate = DateUtility.toDateTimeMillisFormat(dateTarget); + assertThat(targetDate, is(notNullValue())); + assertThat(targetDate, is(dateString)); + } +} diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactoryTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactoryTest.java new file mode 100644 index 000000000..955386e45 --- /dev/null +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactoryTest.java @@ -0,0 +1,29 @@ +package com.hyperwallet.android.receipt.repository; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class ReceiptDataSourceFactoryTest { + + @Test + public void testGetReceiptDataSource_returnsLiveDataReceiptSource() { + // initialize + + // test + + // verify + // assert + } + + @Test + public void testCreate_returnsDataSource() { + // initialize + + // test + + // verify + // assert + } +} diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java new file mode 100644 index 000000000..660843689 --- /dev/null +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java @@ -0,0 +1,161 @@ +package com.hyperwallet.android.receipt.repository; + +import static org.mockito.Mockito.doReturn; + +import com.hyperwallet.android.Hyperwallet; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class ReceiptDataSourceTest { + + @Rule + public MockitoRule mMockito = MockitoJUnit.rule(); + @Spy + @InjectMocks + private ReceiptDataSource mReceiptDataSource; + @Mock + private Hyperwallet mHyperwallet; + + @Before + public void setUp() { + doReturn(mHyperwallet).when(mReceiptDataSource).getHyperwallet(); + } + + @Test + public void testLoadInitial_returnsReceipts() { + // 1) create receipt list to return + // 2) initialize paging + // 3) mock hyperwallet behavior to return objects + // 4) mock params + // 5) mock callback + + // test + + // verify receipt list return + // verify error is not invoked + // verify mock params + // verify mock callback + // assert receipts information + } + + @Test + public void testLoadInitial_returnNoReceipt() { + // 1) mock hyperwallet behavior to return null to simulate 204 + // 2) mock params + // 3) mock callback + + // test + + // verify receipt list return + // verify error is not invoked + // verify mock params + // verify mock callback + // assert receipts information + } + + @Test + public void testLoadInitial_withError() { + // 1) Initialize error list response + // 2) mock params + // 3) mock callback + + // test + + // verify receipt is not returned + // verify error is invoked + // verify mock params + // verify mock callback + // assert errors information + } + + @Test + public void testRetry_LoadInitial() { + // 1) Initialize error list response + // 2) mock params + // 3) mock callback + + // test load initial + // test retry + + // verify receipt is not returned + // verify error is invoked twice + // verify mock params twice + // verify mock callback twice + + // assert errors information + } + + @Test + public void testLoadAfter_returnsReceipts() { + // 1) create receipt list to return + // 2) initialize paging + // 3) mock hyperwallet behavior to return objects + // 4) mock params + // 5) mock callback + + // test + + // verify receipt list return + // verify error is not invoked + // verify mock params + // verify mock callback + // assert receipts information + } + + @Test + public void testLoadAfter_returnNoReceipt() { + // 1) mock hyperwallet behavior to return null to simulate 204 + // 2) mock params + // 3) mock callback + + // test + + // verify receipt list return + // verify error is not invoked + // verify mock params + // verify mock callback + // assert receipts information + } + + @Test + public void testLoadAfter_withError() { + // 1) Initialize error list response + // 2) mock params + // 3) mock callback + + // test + + // verify receipt is not returned + // verify error is invoked + // verify mock params + // verify mock callback + // assert errors information + } + + @Test + public void testRetry_LoadAfter() { + // 1) Initialize error list response + // 2) mock params + // 3) mock callback + + // test load initial + // test retry + + // verify receipt is not returned + // verify error is invoked twice + // verify mock params twice + // verify mock callback twice + + // assert errors information + } +} diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryFactoryTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryFactoryTest.java new file mode 100644 index 000000000..3326f2916 --- /dev/null +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryFactoryTest.java @@ -0,0 +1,39 @@ +package com.hyperwallet.android.receipt.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; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class ReceiptRepositoryFactoryTest { + + @Test + public void testGetInstance_verifyRepositoriesInitialized() { + // test + ReceiptRepositoryFactory factory = ReceiptRepositoryFactory.getInstance(); + assertThat(factory, is(notNullValue())); + assertThat(factory.getReceiptRepository(), is(notNullValue())); + + ReceiptRepositoryFactory factory2 = ReceiptRepositoryFactory.getInstance(); + assertThat(factory, is(factory2)); + assertThat(factory.getReceiptRepository(), is(factory2.getReceiptRepository())); + } + + @Test + public void testClearInstance_verifyRepositoriesCleared() { + ReceiptRepositoryFactory factory = ReceiptRepositoryFactory.getInstance(); + assertThat(factory, is(notNullValue())); + assertThat(factory.getReceiptRepository(), is(notNullValue())); + + // test clear + ReceiptRepositoryFactory.clearInstance(); + ReceiptRepositoryFactory factory2 = ReceiptRepositoryFactory.getInstance(); + assertThat(factory, is(not(factory2))); + assertThat(factory.getReceiptRepository(), is(not(factory2.getReceiptRepository()))); + } +} diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImplTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImplTest.java new file mode 100644 index 000000000..732041bfd --- /dev/null +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImplTest.java @@ -0,0 +1,35 @@ +package com.hyperwallet.android.receipt.repository; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class ReceiptRepositoryImplTest { + + @Test + public void testLoadReceipts_withData() { + // 1) create receipt list to return + // 2) initialize paging + // 3) mock hyperwallet behavior to return objects + // 4) inject to datasource + + // test + // verify + } + + @Test + public void testIsLoading_loading() { + + } + + @Test + public void testGetErrors_returnError() { + + } + + @Test + public void testRetryLoadReceipt_retry() { + + } +} From 551a0af20ac7f3313df4e9788152680c9a8c1332 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Thu, 30 May 2019 15:01:51 -0700 Subject: [PATCH 13/42] removed junit4 runner --- .../com/hyperwallet/android/common/util/DateUtilityTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java index 1302eb39d..c8e8e07a5 100644 --- a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java +++ b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java @@ -5,12 +5,9 @@ import static org.hamcrest.MatcherAssert.assertThat; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; import java.util.Date; -@RunWith(JUnit4.class) public class DateUtilityTest { @Test From b1f98dc147b019a86f862b239a7daf22d7eb7e6c Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 31 May 2019 08:51:20 -0700 Subject: [PATCH 14/42] removed currency symbol --- .../android/receipt/view/ListReceiptFragment.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 019c36ef1..02d572f39 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -47,7 +47,6 @@ import com.hyperwallet.android.receipt.viewmodel.ListReceiptViewModel; import java.util.Calendar; -import java.util.Currency; import java.util.List; import java.util.Locale; import java.util.Random; @@ -251,12 +250,10 @@ class ReceiptViewHolder extends RecyclerView.ViewHolder { void bind(@NonNull final HyperwalletTransferMethod transferMethod) { int nextAmount = amount.nextInt(); Locale locale = Locale.getDefault(); - Currency currency = Currency.getInstance(transferMethod.getField(TRANSFER_METHOD_CURRENCY)); if (nextAmount < 0) {//TODO replace this with debit or credit mTransactionAmount.setTextColor(mTransactionAmount.getContext() .getResources().getColor(R.color.colorAccent)); - mTransactionAmount.setText(String.format(locale, "- %d.00 %s", - Math.abs(nextAmount), currency.getSymbol(locale))); + mTransactionAmount.setText(String.format(locale, "- %d.00", Math.abs(nextAmount))); mTransactionTypeIcon.setTextColor(mTransactionTypeIcon.getContext() .getResources().getColor(R.color.colorAccent)); @@ -266,8 +263,7 @@ void bind(@NonNull final HyperwalletTransferMethod transferMethod) { } else { mTransactionAmount.setTextColor(mTransactionAmount.getContext() .getResources().getColor(R.color.positiveColor)); - mTransactionAmount.setText(String.format(locale, "+ %d.00 %s", - nextAmount, currency.getSymbol(locale))); + mTransactionAmount.setText(String.format(locale, "+ %d.00", nextAmount)); mTransactionTypeIcon.setTextColor(mTransactionTypeIcon.getContext() .getResources().getColor(R.color.positiveColor)); From 2bf85b8382c2e8e8e25e98d0e88fca613b0bb6a6 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 31 May 2019 11:24:40 -0700 Subject: [PATCH 15/42] ui changes from requirements and adding ellipsis support --- .../src/main/res/values-land/orientation.xml | 4 ++++ .../src/main/res/values-port/orientation.xml | 4 ++++ common/src/main/res/values/orientation.xml | 4 ++++ .../receipt/view/ListReceiptFragment.java | 24 +++++++++++++++---- receipt/src/main/res/layout/item_receipt.xml | 20 +++++----------- receipt/src/main/res/values/dimens.xml | 2 +- 6 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 common/src/main/res/values-land/orientation.xml create mode 100644 common/src/main/res/values-port/orientation.xml create mode 100644 common/src/main/res/values/orientation.xml diff --git a/common/src/main/res/values-land/orientation.xml b/common/src/main/res/values-land/orientation.xml new file mode 100644 index 000000000..fc1d851b2 --- /dev/null +++ b/common/src/main/res/values-land/orientation.xml @@ -0,0 +1,4 @@ + + + true + \ No newline at end of file diff --git a/common/src/main/res/values-port/orientation.xml b/common/src/main/res/values-port/orientation.xml new file mode 100644 index 000000000..214d58967 --- /dev/null +++ b/common/src/main/res/values-port/orientation.xml @@ -0,0 +1,4 @@ + + + false + \ No newline at end of file diff --git a/common/src/main/res/values/orientation.xml b/common/src/main/res/values/orientation.xml new file mode 100644 index 000000000..214d58967 --- /dev/null +++ b/common/src/main/res/values/orientation.xml @@ -0,0 +1,4 @@ + + + false + \ No newline at end of file diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 02d572f39..27dc8cb59 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -19,7 +19,6 @@ import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.CREATED_ON; import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TOKEN; import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_CURRENCY; -import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TYPE; import android.content.Context; import android.os.Bundle; @@ -227,8 +226,10 @@ public void onBindViewHolder(@NonNull ReceiptViewHolder holder, int position) { class ReceiptViewHolder extends RecyclerView.ViewHolder { + private static final int MAX_CHARACTERS_FIRSTLINE = 38; + private static final String ELLIPSIS = "..."; + private static final String SPACER = " "; private final TextView mTransactionAmount; - private final TextView mTransactionCaption; private final TextView mTransactionCurrency; private final TextView mTransactionDate; private final TextView mTransactionTitle; @@ -240,7 +241,6 @@ class ReceiptViewHolder extends RecyclerView.ViewHolder { ReceiptViewHolder(@NonNull final View item) { super(item); mTransactionAmount = item.findViewById(R.id.transaction_amount); - mTransactionCaption = item.findViewById(R.id.transaction_caption); mTransactionCurrency = item.findViewById(R.id.transaction_currency); mTransactionDate = item.findViewById(R.id.transaction_date); mTransactionTitle = item.findViewById(R.id.transaction_title); @@ -273,11 +273,25 @@ void bind(@NonNull final HyperwalletTransferMethod transferMethod) { } mTransactionCurrency.setText(transferMethod.getField(TRANSFER_METHOD_CURRENCY)); - mTransactionCaption.setText(transferMethod.getField(TOKEN)); - mTransactionTitle.setText(transferMethod.getField(TYPE)); + mTransactionTitle.setText(getTransactionTitle(transferMethod.getField(TOKEN), + mTransactionAmount.getText().length(), mTransactionTitle.getContext())); mTransactionDate.setText(DateUtility.toDateFormat( DateUtility.fromDateTimeString(transferMethod.getField(CREATED_ON)), CAPTION_DATE_FORMAT)); } + + CharSequence getTransactionTitle(@NonNull final CharSequence title, final int numberOfCharsAlreadyUsed, + @NonNull final Context context) { + + if (!context.getResources().getBoolean(R.bool.isLandscape) + && (title.length() + numberOfCharsAlreadyUsed) >= MAX_CHARACTERS_FIRSTLINE) { + int allowedCharsLength = MAX_CHARACTERS_FIRSTLINE - + numberOfCharsAlreadyUsed - ELLIPSIS.length() - SPACER.length(); + StringBuilder builder = new StringBuilder(title.subSequence(0, allowedCharsLength)); + builder.append(ELLIPSIS); + return builder.toString(); + } + return title; + } } class ReceiptViewHolderWithHeader extends ReceiptViewHolder { diff --git a/receipt/src/main/res/layout/item_receipt.xml b/receipt/src/main/res/layout/item_receipt.xml index 5bf1e641f..b96b312dd 100644 --- a/receipt/src/main/res/layout/item_receipt.xml +++ b/receipt/src/main/res/layout/item_receipt.xml @@ -2,9 +2,9 @@ + android:layout_height="@dimen/item_receipt_information_height" + android:background="@drawable/item_view_border"> - - + app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent"/> 3dp 8dp - 88dp + 64dp From 4fa2e7b035bbf2d3f8e786e7fbb0eccc88ea05c2 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 3 Jun 2019 07:20:55 -0700 Subject: [PATCH 16/42] added new icon set --- common/src/main/res/font/icomoon.ttf | Bin 21940 -> 21992 bytes .../receipt/view/ListReceiptFragment.java | 6 +++--- receipt/src/main/res/values/strings.xml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) mode change 100644 => 100755 common/src/main/res/font/icomoon.ttf diff --git a/common/src/main/res/font/icomoon.ttf b/common/src/main/res/font/icomoon.ttf old mode 100644 new mode 100755 index f216ee945686dacd9a87036c7df1f9b6e34b6fa0..384737f83301b709956e43431d06b3b965b73c2f GIT binary patch delta 990 zcma)4TWk|Y6rDS>4{!Wf+w1k#d04hLFG6U7qxGtZ6GHQ0ND8s+qz@1(ZlI22r=$sL z)2OXe6!DM{Rk4hUh=c$kAw_Bn;Ugb>1Ox~ng!<8s!WU9$1yNNAsii7Sx4rB1r+*#Y z(abq#=G?n?_Ua-$S%eY+LWq;h5k@+PvmJ5SFSH|b4d>pmiQMGxzg)RX2-G9qm(NX4 z;_5{_hpQuB{OH~8p1pCzM+r%b%T4S*Jt+N&xF3@oo;)yp5DUdI zdgqJf6ws3}40I_CAIf4s2yBJUmhXEbIa3V?daSt@bQXrLc%m1gy3#eP4F%wAU6@8I zvB+mT7xdVI=<(i>T~1#l6&PsG>{_d+J5@SsRiN+#4y&@d+9bEtKU>ulMO(ElEB>vo zKC>!>Tp0E>mePN(u&>w(*+7QKCs&630ADDd1 zrq^R5*kU4%R}&^`7$|8t1Bvq;baN&f{60Q8sFGFeEM)7dV`{=|Cw zba_6zqhq1=*SbTIhtYRpeX(!#FZJ7vGfm$#A8t9+a;f#r)=#T>46cxbj HBNyQx%+A&M delta 928 zcmZ`&OK1~87@o;yXLpk}n`EkL`d@TN(2;#wEcK-Rk`Ty_#7G~bx zzza9<6v7B0JDNrmigu)GW4xPG19JzyeSJge(XStGJwXVU0q!42kBvff0-lD*4h$YS z@Vf5GTfip~>Riq2PxpH+Y@A1^Yd4(7Ge9s8sZW4s0f#a}M>ZzXV72#_v z?_P5i+Xc0)WJhgp`e&=RyTmeMOyHTXFpLSqsB%SQObp56kql#26p~3m6PG$%p{Z8H zQj63i>PBA^BJDwCU82GM>k{TzI3DI4 zw3VWKzDA$V>K8+youN?W7GGJ+Ey#A8Ez#gtl=etO4=^s4<1B-sz#i3*+D@r{Y#2lnF~&+th%Bap_>)&!*?r}st)GgpKh%}f~kZo+2=h%uBH1j{tdXc BxZwZ* diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 27dc8cb59..01ea7e6e5 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -226,7 +226,7 @@ public void onBindViewHolder(@NonNull ReceiptViewHolder holder, int position) { class ReceiptViewHolder extends RecyclerView.ViewHolder { - private static final int MAX_CHARACTERS_FIRSTLINE = 38; + private static final int MAX_CHARACTERS_FIRST_LINE = 38; private static final String ELLIPSIS = "..."; private static final String SPACER = " "; private final TextView mTransactionAmount; @@ -283,8 +283,8 @@ CharSequence getTransactionTitle(@NonNull final CharSequence title, final int nu @NonNull final Context context) { if (!context.getResources().getBoolean(R.bool.isLandscape) - && (title.length() + numberOfCharsAlreadyUsed) >= MAX_CHARACTERS_FIRSTLINE) { - int allowedCharsLength = MAX_CHARACTERS_FIRSTLINE - + && (title.length() + numberOfCharsAlreadyUsed) >= MAX_CHARACTERS_FIRST_LINE) { + int allowedCharsLength = MAX_CHARACTERS_FIRST_LINE - numberOfCharsAlreadyUsed - ELLIPSIS.length() - SPACER.length(); StringBuilder builder = new StringBuilder(title.subSequence(0, allowedCharsLength)); builder.append(ELLIPSIS); diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml index fb150a18b..03000f34a 100644 --- a/receipt/src/main/res/values/strings.xml +++ b/receipt/src/main/res/values/strings.xml @@ -8,6 +8,6 @@ \uE02C Placeholder - \uE02C - \uE02A + \uE900 + \uE902 From 500f70254fd987ee21262ba0c071dc67d7a23e0f Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 3 Jun 2019 08:54:25 -0700 Subject: [PATCH 17/42] added Event live data pattern --- .../android/common/viewmodel/Event.java | 54 +++++++++++++++++++ receipt/build.gradle | 1 - .../receipt/view/ListReceiptFragment.java | 10 ++-- .../viewmodel/ListReceiptViewModel.java | 32 +++++++++-- 4 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java diff --git a/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java b/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java new file mode 100644 index 000000000..702f39cbe --- /dev/null +++ b/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java @@ -0,0 +1,54 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2019 Hyperwallet Systems Inc. + * + * 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 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.common.viewmodel; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class Event { + + private final T content; + private boolean mIsContentConsumed; + + public Event(@NonNull final T t) { + content = t; + } + + @NonNull + public T getContent() { + mIsContentConsumed = true; + return content; + } + + public boolean isContentConsumed() { + return mIsContentConsumed; + } + + /** + * retrieve perceived content based on iff content has not been retrieved + * + * @return content if content is not yet consumed; otherwise null + */ + @Nullable + public T getContentIfNotConsumed() { + if (!mIsContentConsumed) { + mIsContentConsumed = true; + return content; + } + return null; + } +} diff --git a/receipt/build.gradle b/receipt/build.gradle index fa53b8615..999041697 100644 --- a/receipt/build.gradle +++ b/receipt/build.gradle @@ -5,7 +5,6 @@ dependencies { implementation "com.google.android.material:material:1.0.0" implementation "androidx.constraintlayout:constraintlayout:1.1.3" - implementation "androidx.test.espresso:espresso-idling-resource:3.1.1" implementation "androidx.legacy:legacy-support-v4:1.0.0" implementation "androidx.recyclerview:recyclerview:1.0.0" implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 01ea7e6e5..68b3dc384 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -39,8 +39,8 @@ import androidx.recyclerview.widget.RecyclerView; import com.hyperwallet.android.common.util.DateUtility; +import com.hyperwallet.android.common.viewmodel.Event; import com.hyperwallet.android.model.HyperwalletError; -import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.receipt.R; import com.hyperwallet.android.receipt.viewmodel.ListReceiptViewModel; @@ -120,11 +120,11 @@ public void onChanged(PagedList transferMethods) { } }); - mListReceiptViewModel.getReceiptErrors().observe(this, new Observer() { + mListReceiptViewModel.getReceiptErrors().observe(this, new Observer>>() { @Override - public void onChanged(HyperwalletErrors hyperwalletErrors) { - if (hyperwalletErrors != null) { // we need to check this since we are posting null - mOnLoadReceiptErrorCallback.showErrorOnLoadReceipt(hyperwalletErrors.getErrors()); + public void onChanged(Event> listEvent) { + if (!listEvent.isContentConsumed()) { + mOnLoadReceiptErrorCallback.showErrorOnLoadReceipt(listEvent.getContent()); } } }); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java index 9226c41f8..eccff9c02 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java @@ -18,30 +18,49 @@ import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import androidx.paging.PagedList; +import com.hyperwallet.android.common.viewmodel.Event; +import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.receipt.repository.ReceiptRepository; +import java.util.List; + public class ListReceiptViewModel extends ViewModel { - private final ReceiptRepository mReceiptRepository; + private ReceiptRepository mReceiptRepository; + private MutableLiveData>> mErrorEvent = new MutableLiveData<>(); + private Observer mErrorEventObserver; public ListReceiptViewModel(@NonNull final ReceiptRepository receiptRepository) { mReceiptRepository = receiptRepository; // load initial receipts mReceiptRepository.loadReceipts(); + + // register one time error event observer + mErrorEventObserver = new Observer() { + @Override + public void onChanged(HyperwalletErrors errors) { + if (errors != null && !errors.getErrors().isEmpty()) { + mErrorEvent.setValue(new Event<>(errors.getErrors())); + } + } + }; + mReceiptRepository.getErrors().observeForever(mErrorEventObserver); } public LiveData isLoadingData() { return mReceiptRepository.isLoading(); } - public LiveData getReceiptErrors() { - return mReceiptRepository.getErrors(); + public LiveData>> getReceiptErrors() { + return mErrorEvent; } public LiveData> getReceiptList() { @@ -52,6 +71,13 @@ public void retryLoadReceipts() { mReceiptRepository.retryLoadReceipt(); } + @Override + protected void onCleared() { + super.onCleared(); + mReceiptRepository.getErrors().removeObserver(mErrorEventObserver); + mReceiptRepository = null; + } + public static class ListReceiptViewModelFactory implements ViewModelProvider.Factory { private final ReceiptRepository mReceiptRepository; From b7fcec43c6870a83cad31a8aa85b39e7e6935138 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 3 Jun 2019 09:00:28 -0700 Subject: [PATCH 18/42] improve ellipsis --- .../hyperwallet/android/receipt/view/ListReceiptFragment.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 68b3dc384..c480858db 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -286,9 +286,7 @@ CharSequence getTransactionTitle(@NonNull final CharSequence title, final int nu && (title.length() + numberOfCharsAlreadyUsed) >= MAX_CHARACTERS_FIRST_LINE) { int allowedCharsLength = MAX_CHARACTERS_FIRST_LINE - numberOfCharsAlreadyUsed - ELLIPSIS.length() - SPACER.length(); - StringBuilder builder = new StringBuilder(title.subSequence(0, allowedCharsLength)); - builder.append(ELLIPSIS); - return builder.toString(); + return title.subSequence(0, allowedCharsLength) + ELLIPSIS; } return title; } From 7c6b5d93e19073843b56353e7de025ba32d7f455 Mon Sep 17 00:00:00 2001 From: azakrevska-epam Date: Tue, 4 Jun 2019 17:04:23 +0300 Subject: [PATCH 19/42] HW-53053. Updated library versions --- build.gradle | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 0c6569b27..3df2d26b2 100644 --- a/build.gradle +++ b/build.gradle @@ -46,13 +46,13 @@ subprojects { legacySupportV4Version = '1.0.0' recycleViewVersion = '1.0.0' //Testing - extJunitVerson = '1.1.0' - testRunnerVersion = '1.1.1' - testRulesVersion = '1.1.1' - espressoVersion = '3.1.1' + extJunitVerson = '1.1.1' + testRunnerVersion = '1.2.0' + testRulesVersion = '1.2.0' + espressoVersion = '3.2.0' mockServerVersion = '3.11.0' leakcanaryVersion = '1.6.3' - mockitoVersion = '2.25.0' + mockitoVersion = '2.27.0' junitParamsVersion = '1.1.1' robolectricVersion = '4.1' mockWebServerVersion = '3.11.0' From e57459309482e5e6075d5d4ef3f8ed1f316057b8 Mon Sep 17 00:00:00 2001 From: Flavio Mattos Date: Tue, 4 Jun 2019 13:46:50 -0700 Subject: [PATCH 20/42] add receipt transaction description --- receipt/src/main/res/values/strings.xml | 100 ++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml index 3764f704b..c3ca11b97 100644 --- a/receipt/src/main/res/values/strings.xml +++ b/receipt/src/main/res/values/strings.xml @@ -1,3 +1,103 @@ receipt + + Annual Fee + Annual Fee Refund + Customer Service Fee + Customer Service Fee Refund + Expedited Shipping Fee + Generic Fee Refund + Monthly Fee + Monthly Fee Refund + Payment Expiry Fee + Payment Fee + Processing Fee + Standard Shipping Fee + Transfer Fee + + + Balance Adjustment + Foreign Exchange + Funds Deposit + Adjustment + Payment Expired + + + Bank Account Return Fee + Bank Account Return + Bank Account Return Fee + Bank Account + + + Card Activation Fee + Card Activation Fee Waiver + Card Fee + Card Load + Balance Inquiry Fee + Cash Advance + Disputed Charge Refund + Disputed Card Deposit + ATM Withdrawal + PREPAID_CARD_EXCHANGE_RATE_DIFFERENCE + + Card Unload + ATM Withdrawal + PIN Change Fee + Refund + Card Replacement Fee + Transaction + Reversed Transaction + Card Unload + Card Load + + + Donation + Donation Fee + Donation Return + + + Merchant Payment + Merchant Payment Fee + Merchant Payment Refund + Merchant Payment Return + + + MoneyGram Return + MoneyGram + + + Paper Check Fee + Paper Check Refund + Paper Check + + + Account Closure + Account Closure Fee + Funds Unloaded + Dormant User Account Fee + Dormant User Account Fee Refund + Payment + Payment Cancellation + Payment Reversal + Payment Reversal Fee + Payment Return + Transfer to Program + Transfer to User + + + Promo Cancellation + Issued Promo + Promo Purchase + Promo Refund + + + Western Union + Wire Transfer + Western Union Withdrawal + Wire Transfer Return + + + Wire Transfer + Wire Transfer Fee + Wire Transfer Return From eb22f2638f88e93fbfac310d09ddc089b94aa41d Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 4 Jun 2019 13:53:38 -0700 Subject: [PATCH 21/42] initial receipt type integration --- build.gradle | 3 + .../util/{DateUtility.java => DateUtils.java} | 5 +- ...ateUtilityTest.java => DateUtilsTest.java} | 18 +-- receipt/build.gradle | 12 +- .../receipt/repository/ReceiptDataSource.java | 65 +++++----- .../receipt/repository/ReceiptRepository.java | 5 +- .../repository/ReceiptRepositoryImpl.java | 6 +- .../receipt/view/ListReceiptFragment.java | 115 ++++++++---------- .../viewmodel/ListReceiptViewModel.java | 6 +- receipt/src/main/res/values/strings.xml | 2 + .../TransferMethodRepositoryImplTest.java | 8 +- 11 files changed, 122 insertions(+), 123 deletions(-) rename common/src/main/java/com/hyperwallet/android/common/util/{DateUtility.java => DateUtils.java} (98%) rename common/src/test/java/com/hyperwallet/android/common/util/{DateUtilityTest.java => DateUtilsTest.java} (64%) diff --git a/build.gradle b/build.gradle index a3b6bc33f..1f6652368 100644 --- a/build.gradle +++ b/build.gradle @@ -45,6 +45,9 @@ subprojects { constraintlayoutVersion = '1.1.3' legacySupportV4Version = '1.0.0' recycleViewVersion = '1.0.0' + lifecycleExtensionsVersion = '2.0.0' + pagingRuntimeVersion = '2.1.0' + materialVersion = '1.0.0' //Testing extJunitVerson = '1.1.0' testRunnerVersion = '1.1.1' diff --git a/common/src/main/java/com/hyperwallet/android/common/util/DateUtility.java b/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java similarity index 98% rename from common/src/main/java/com/hyperwallet/android/common/util/DateUtility.java rename to common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java index 487d6dba4..c3efc4ab0 100644 --- a/common/src/main/java/com/hyperwallet/android/common/util/DateUtility.java +++ b/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java @@ -23,12 +23,15 @@ import java.util.Date; import java.util.Locale; -public final class DateUtility { +public final class DateUtils { private static final String DATE_FORMAT = "yyyy-MM-dd"; private static final String DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; private static final String DATE_TIME_FORMAT_MILLISECONDS = "yyyy-MM-dd'T'HH:mm:ss.SSS"; + private DateUtils() { + } + /** * date format: yyyy-MM-dd */ diff --git a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java similarity index 64% rename from common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java rename to common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java index c8e8e07a5..bede4aa66 100644 --- a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilityTest.java +++ b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java @@ -8,15 +8,15 @@ import java.util.Date; -public class DateUtilityTest { +public class DateUtilsTest { @Test public void testToDateFormat_returnExpectedStringFormat() { String dateString = "2019-05-27"; - Date dateTarget = DateUtility.fromDateTimeString("2019-05-27T15:57:49"); + Date dateTarget = DateUtils.fromDateTimeString("2019-05-27T15:57:49"); // test - String targetDate = DateUtility.toDateFormat(dateTarget); + String targetDate = DateUtils.toDateFormat(dateTarget); assertThat(targetDate, is(notNullValue())); assertThat(targetDate, is(dateString)); } @@ -24,10 +24,10 @@ public void testToDateFormat_returnExpectedStringFormat() { @Test public void testToDateFormat_returnExpectedStringFormatFromParameter() { String dateString = "November 2019"; - Date dateTarget = DateUtility.fromDateTimeString("2019-11-27T15:57:49"); + Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:49"); // test - String targetDate = DateUtility.toDateFormat(dateTarget, "MMMM yyyy"); + String targetDate = DateUtils.toDateFormat(dateTarget, "MMMM yyyy"); assertThat(targetDate, is(notNullValue())); assertThat(targetDate, is(dateString)); } @@ -35,10 +35,10 @@ public void testToDateFormat_returnExpectedStringFormatFromParameter() { @Test public void testToDateTimeFormat_returnExpectedStringFormat() { String dateString = "2019-11-27T15:57:49"; - Date dateTarget = DateUtility.fromDateTimeString("2019-11-27T15:57:49"); + Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:49"); // test - String targetDate = DateUtility.toDateTimeFormat(dateTarget); + String targetDate = DateUtils.toDateTimeFormat(dateTarget); assertThat(targetDate, is(notNullValue())); assertThat(targetDate, is(dateString)); } @@ -46,10 +46,10 @@ public void testToDateTimeFormat_returnExpectedStringFormat() { @Test public void testToDateTimeMillisFormat_returnExpectedStringFormat() { String dateString = "2019-11-27T15:57:09.450"; - Date dateTarget = DateUtility.fromDateTimeString("2019-11-27T15:57:09.450", "yyyy-MM-dd'T'HH:mm:ss.SSS"); + Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:09.450", "yyyy-MM-dd'T'HH:mm:ss.SSS"); // test - String targetDate = DateUtility.toDateTimeMillisFormat(dateTarget); + String targetDate = DateUtils.toDateTimeMillisFormat(dateTarget); assertThat(targetDate, is(notNullValue())); assertThat(targetDate, is(dateString)); } diff --git a/receipt/build.gradle b/receipt/build.gradle index 999041697..c71a3f8bb 100644 --- a/receipt/build.gradle +++ b/receipt/build.gradle @@ -3,12 +3,12 @@ apply from: "$rootProject.projectDir/android-library.gradle" dependencies { api project(":common") - implementation "com.google.android.material:material:1.0.0" - implementation "androidx.constraintlayout:constraintlayout:1.1.3" - implementation "androidx.legacy:legacy-support-v4:1.0.0" - implementation "androidx.recyclerview:recyclerview:1.0.0" - implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' - implementation 'androidx.paging:paging-runtime:2.1.0' + implementation "com.google.android.material:material:$materialVersion" + implementation "androidx.constraintlayout:constraintlayout:$constraintlayoutVersion" + implementation "androidx.legacy:legacy-support-v4:$legacySupportV4Version" + implementation "androidx.recyclerview:recyclerview:$recycleViewVersion" + implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleExtensionsVersion" + implementation "androidx.paging:paging-runtime:$pagingRuntimeVersion" testImplementation "org.robolectric:robolectric:$robolectricVersion" androidTestImplementation "androidx.test:rules:$testRulesVersion" diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java index 5a96a2ce5..a7ecb76eb 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java @@ -16,9 +16,6 @@ */ package com.hyperwallet.android.receipt.repository; -import static com.hyperwallet.android.model.HyperwalletStatusTransition.StatusDefinition.ACTIVATED; -import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethodPagination.TransferMethodSortable.DESCENDANT_CREATE_ON; - import android.os.Handler; import androidx.annotation.NonNull; @@ -32,40 +29,44 @@ import com.hyperwallet.android.listener.HyperwalletListener; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.paging.HyperwalletPageList; -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethodPagination; +import com.hyperwallet.android.model.receipt.Receipt; +import com.hyperwallet.android.model.receipt.ReceiptQueryParam; -public class ReceiptDataSource extends PageKeyedDataSource { +import java.util.Calendar; - private final HyperwalletTransferMethodPagination mReceiptPagination; - private final MutableLiveData mIsFetchingData = new MutableLiveData<>(); - private final MutableLiveData mErrors = new MutableLiveData<>(); - private final Handler mHandler = new Handler(); +public class ReceiptDataSource extends PageKeyedDataSource { - private LoadInitialCallback mLoadInitialCallback; + private static final int YEAR_BEFORE_NOW = -1; + private final MutableLiveData mErrors = new MutableLiveData<>(); + private final MutableLiveData mIsFetchingData = new MutableLiveData<>(); + private LoadInitialCallback mLoadInitialCallback; private LoadInitialParams mLoadInitialParams; - private LoadCallback mLoadAfterCallback; + private LoadCallback mLoadAfterCallback; private LoadParams mLoadAfterParams; + private final Calendar mCalendarYearBeforeNow; ReceiptDataSource() { super(); - mReceiptPagination = new HyperwalletTransferMethodPagination(); - mReceiptPagination.setStatus(ACTIVATED); - mReceiptPagination.setSortBy(DESCENDANT_CREATE_ON); + mCalendarYearBeforeNow = Calendar.getInstance(); + mCalendarYearBeforeNow.add(Calendar.YEAR, YEAR_BEFORE_NOW); } @Override public void loadInitial(@NonNull final LoadInitialParams params, - @NonNull final LoadInitialCallback callback) { + @NonNull final LoadInitialCallback callback) { mLoadInitialCallback = callback; mLoadInitialParams = params; mIsFetchingData.postValue(Boolean.TRUE); - mReceiptPagination.setLimit(params.requestedLoadSize); - getHyperwallet().listTransferMethods(mReceiptPagination, - new HyperwalletListener>() { + ReceiptQueryParam queryParam = new ReceiptQueryParam.Builder() + .createdAfter(mCalendarYearBeforeNow.getTime()) + .limit(params.requestedLoadSize) + .sortByCreatedOnDesc().build(); + + getHyperwallet().listReceipts(queryParam, + new HyperwalletListener>() { @Override - public void onSuccess(@Nullable HyperwalletPageList result) { + public void onSuccess(@Nullable HyperwalletPageList result) { mIsFetchingData.postValue(Boolean.FALSE); mErrors.postValue(null); @@ -74,7 +75,6 @@ public void onSuccess(@Nullable HyperwalletPageList r int previous = 0; callback.onResult(result.getDataList(), previous, next); } - // reset mLoadInitialCallback = null; mLoadInitialParams = null; @@ -88,30 +88,33 @@ public void onFailure(HyperwalletException exception) { @Override public Handler getHandler() { - return mHandler; + return null; } }); } @Override public void loadBefore(@NonNull LoadParams params, - @NonNull LoadCallback callback) { + @NonNull LoadCallback callback) { } @Override public void loadAfter(@NonNull LoadParams params, - final @NonNull LoadCallback callback) { + final @NonNull LoadCallback callback) { mLoadAfterCallback = callback; mLoadAfterParams = params; - mIsFetchingData.postValue(Boolean.TRUE); - mReceiptPagination.setLimit(params.requestedLoadSize); - mReceiptPagination.setOffset(params.key); - getHyperwallet().listTransferMethods(mReceiptPagination, - new HyperwalletListener>() { + ReceiptQueryParam queryParam = new ReceiptQueryParam.Builder() + .createdAfter(mCalendarYearBeforeNow.getTime()) + .limit(params.requestedLoadSize) + .offset(params.key) + .sortByCreatedOnDesc().build(); + + getHyperwallet().listReceipts(queryParam, + new HyperwalletListener>() { @Override - public void onSuccess(@Nullable HyperwalletPageList result) { + public void onSuccess(@Nullable HyperwalletPageList result) { mIsFetchingData.postValue(Boolean.FALSE); mErrors.postValue(null); @@ -133,7 +136,7 @@ public void onFailure(HyperwalletException exception) { @Override public Handler getHandler() { - return mHandler; + return null; } }); } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepository.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepository.java index fe59f401c..2161b55d2 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepository.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepository.java @@ -20,7 +20,7 @@ import androidx.paging.PagedList; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.receipt.Receipt; /** * Receipt Repository Contract @@ -32,7 +32,7 @@ public interface ReceiptRepository { * * @return live data paged receipts */ - LiveData> loadReceipts(); + LiveData> loadReceipts(); /** * Loading indicator consumer can subscribe to loading of data events @@ -41,7 +41,6 @@ public interface ReceiptRepository { */ LiveData isLoading(); - /** * Error information, consumer can subscribe of errors occur during data retrieval * diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java index 8cff19a2a..5b6850ebc 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java @@ -21,7 +21,7 @@ import androidx.paging.PagedList; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.receipt.Receipt; public class ReceiptRepositoryImpl implements ReceiptRepository { @@ -29,7 +29,7 @@ public class ReceiptRepositoryImpl implements ReceiptRepository { private final LiveData mReceiptDataSourceLiveData; private LiveData mIsFetchingData; private LiveData mErrorsLiveData; - private LiveData> mReceiptsLiveData; + private LiveData> mReceiptsLiveData; ReceiptRepositoryImpl() { mDataSourceFactory = new ReceiptDataSourceFactory(); @@ -37,7 +37,7 @@ public class ReceiptRepositoryImpl implements ReceiptRepository { } @Override - public LiveData> loadReceipts() { + public LiveData> loadReceipts() { if (mReceiptsLiveData == null) { PagedList.Config config = new PagedList.Config.Builder() .setPageSize(10) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index c480858db..dca525a6c 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -16,9 +16,8 @@ */ package com.hyperwallet.android.receipt.view; -import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.CREATED_ON; -import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TOKEN; -import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TRANSFER_METHOD_CURRENCY; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.CREDIT; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.DEBIT; import android.content.Context; import android.os.Bundle; @@ -38,19 +37,16 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.hyperwallet.android.common.util.DateUtility; +import com.hyperwallet.android.common.util.DateUtils; import com.hyperwallet.android.common.viewmodel.Event; import com.hyperwallet.android.model.HyperwalletError; -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.receipt.R; import com.hyperwallet.android.receipt.viewmodel.ListReceiptViewModel; import java.util.Calendar; import java.util.List; -import java.util.Locale; -import java.util.Random; -//TODO change HyperwalletTransferMethod to HyperwalletReceipts whenever core is available public class ListReceiptFragment extends Fragment { private static final String HEADER_DATE_FORMAT = "MMMM yyyy"; @@ -113,9 +109,9 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat } private void registerObservers() { - mListReceiptViewModel.getReceiptList().observe(this, new Observer>() { + mListReceiptViewModel.getReceiptList().observe(this, new Observer>() { @Override - public void onChanged(PagedList transferMethods) { + public void onChanged(PagedList transferMethods) { mListReceiptAdapter.submitList(transferMethods); } }); @@ -150,39 +146,38 @@ interface OnLoadReceiptErrorCallback { void showErrorOnLoadReceipt(@NonNull final List errors); } - private static class ListReceiptItemDiffCallback extends DiffUtil.ItemCallback { + private static class ListReceiptItemDiffCallback extends DiffUtil.ItemCallback { @Override - public boolean areItemsTheSame(@NonNull HyperwalletTransferMethod oldItem, - @NonNull HyperwalletTransferMethod newItem) { - //TODO Receipts: {journalId, type, entry} - return oldItem.getField(TOKEN).equals(newItem.getField(TOKEN)); + public boolean areItemsTheSame(@NonNull Receipt oldItem, @NonNull Receipt newItem) { + return oldItem.getJournalId().equals(newItem.getJournalId()) + && oldItem.getType().equals(newItem.getType()) + && oldItem.getEntry().equals(newItem.getEntry()); } @Override - public boolean areContentsTheSame(@NonNull HyperwalletTransferMethod oldItem, - @NonNull HyperwalletTransferMethod newItem) { - //TODO check if contents are the same in this case check each receipt fields against each other - // Receipts: {journalId, type, entry} - return oldItem.getField(TOKEN).equals(newItem.getField(TOKEN)); + public boolean areContentsTheSame(@NonNull Receipt oldItem, @NonNull Receipt newItem) { + return oldItem.getJournalId().equals(newItem.getJournalId()) + && oldItem.getType().equals(newItem.getType()) + && oldItem.getEntry().equals(newItem.getEntry()); } } private static class ListReceiptAdapter - extends PagedListAdapter { + extends PagedListAdapter { static final int HEADER_VIEW_TYPE = 1; static final int DATA_VIEW_TYPE = 0; - ListReceiptAdapter(@NonNull final DiffUtil.ItemCallback diffCallback) { + ListReceiptAdapter(@NonNull final DiffUtil.ItemCallback diffCallback) { super(diffCallback); } @Override public int getItemViewType(int position) { if (position != 0) { - HyperwalletTransferMethod previous = getItem(position - 1); - HyperwalletTransferMethod current = getItem(position); + Receipt previous = getItem(position - 1); + Receipt current = getItem(position); if (isDataViewType(previous, current)) { return DATA_VIEW_TYPE; } @@ -190,13 +185,11 @@ public int getItemViewType(int position) { return HEADER_VIEW_TYPE; } - boolean isDataViewType(@NonNull final HyperwalletTransferMethod previous, - @NonNull final HyperwalletTransferMethod current) { - + boolean isDataViewType(@NonNull final Receipt previous, @NonNull final Receipt current) { Calendar prev = Calendar.getInstance(); - prev.setTime(DateUtility.fromDateTimeString(previous.getField(CREATED_ON))); + prev.setTime(DateUtils.fromDateTimeString(previous.getCreatedOn())); Calendar curr = Calendar.getInstance(); - curr.setTime(DateUtility.fromDateTimeString(current.getField(CREATED_ON))); + curr.setTime(DateUtils.fromDateTimeString(current.getCreatedOn())); return prev.get(Calendar.MONTH) == curr.get(Calendar.MONTH) && prev.get(Calendar.YEAR) == curr.get(Calendar.YEAR); @@ -218,9 +211,9 @@ public ReceiptViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int vi @Override public void onBindViewHolder(@NonNull ReceiptViewHolder holder, int position) { - final HyperwalletTransferMethod transferMethod = getItem(position); - if (transferMethod != null) { - holder.bind(transferMethod); + final Receipt receipt = getItem(position); + if (receipt != null) { + holder.bind(receipt); } } @@ -235,9 +228,6 @@ class ReceiptViewHolder extends RecyclerView.ViewHolder { private final TextView mTransactionTitle; private final TextView mTransactionTypeIcon; - //TODO remove this after converting to Receipts model - private final Random amount = new Random(100); - ReceiptViewHolder(@NonNull final View item) { super(item); mTransactionAmount = item.findViewById(R.id.transaction_amount); @@ -247,48 +237,47 @@ class ReceiptViewHolder extends RecyclerView.ViewHolder { mTransactionTypeIcon = item.findViewById(R.id.transaction_type_icon); } - void bind(@NonNull final HyperwalletTransferMethod transferMethod) { - int nextAmount = amount.nextInt(); - Locale locale = Locale.getDefault(); - if (nextAmount < 0) {//TODO replace this with debit or credit - mTransactionAmount.setTextColor(mTransactionAmount.getContext() - .getResources().getColor(R.color.colorAccent)); - mTransactionAmount.setText(String.format(locale, "- %d.00", Math.abs(nextAmount))); - - mTransactionTypeIcon.setTextColor(mTransactionTypeIcon.getContext() - .getResources().getColor(R.color.colorAccent)); - mTransactionTypeIcon.setBackground(mTransactionTypeIcon.getContext() - .getDrawable(R.drawable.circle_negative)); - mTransactionTypeIcon.setText(mTransactionTypeIcon.getContext().getText(R.string.debit)); - } else { + void bind(@NonNull final Receipt receipt) { + if (CREDIT.equals(receipt.getEntry())) { mTransactionAmount.setTextColor(mTransactionAmount.getContext() .getResources().getColor(R.color.positiveColor)); - mTransactionAmount.setText(String.format(locale, "+ %d.00", nextAmount)); - + mTransactionAmount.setText(mTransactionAmount.getContext() + .getString(R.string.credit_sign, receipt.getAmount())); mTransactionTypeIcon.setTextColor(mTransactionTypeIcon.getContext() .getResources().getColor(R.color.positiveColor)); mTransactionTypeIcon.setBackground(mTransactionTypeIcon.getContext() .getDrawable(R.drawable.circle_positive)); mTransactionTypeIcon.setText(mTransactionTypeIcon.getContext().getText(R.string.credit)); + } else if (DEBIT.equals(receipt.getEntry())) { + mTransactionAmount.setTextColor(mTransactionAmount.getContext() + .getResources().getColor(R.color.colorAccent)); + mTransactionAmount.setText(mTransactionAmount.getContext() + .getString(R.string.debit_sign, receipt.getAmount())); + mTransactionTypeIcon.setTextColor(mTransactionTypeIcon.getContext() + .getResources().getColor(R.color.colorAccent)); + mTransactionTypeIcon.setBackground(mTransactionTypeIcon.getContext() + .getDrawable(R.drawable.circle_negative)); + mTransactionTypeIcon.setText(mTransactionTypeIcon.getContext().getText(R.string.debit)); } - mTransactionCurrency.setText(transferMethod.getField(TRANSFER_METHOD_CURRENCY)); - mTransactionTitle.setText(getTransactionTitle(transferMethod.getField(TOKEN), + mTransactionCurrency.setText(receipt.getCurrency()); + mTransactionTitle.setText(getTransactionTitle(receipt.getType(), mTransactionAmount.getText().length(), mTransactionTitle.getContext())); - mTransactionDate.setText(DateUtility.toDateFormat( - DateUtility.fromDateTimeString(transferMethod.getField(CREATED_ON)), CAPTION_DATE_FORMAT)); + mTransactionDate.setText(DateUtils.toDateFormat(DateUtils. + fromDateTimeString(receipt.getCreatedOn()), CAPTION_DATE_FORMAT)); } - CharSequence getTransactionTitle(@NonNull final CharSequence title, final int numberOfCharsAlreadyUsed, + String getTransactionTitle(@NonNull final String receiptType, final int numberOfCharsAlreadyUsed, @NonNull final Context context) { + String showTitle = receiptType; //TODO get receipt type translations before processing if (!context.getResources().getBoolean(R.bool.isLandscape) - && (title.length() + numberOfCharsAlreadyUsed) >= MAX_CHARACTERS_FIRST_LINE) { + && (receiptType.length() + numberOfCharsAlreadyUsed) >= MAX_CHARACTERS_FIRST_LINE) { int allowedCharsLength = MAX_CHARACTERS_FIRST_LINE - numberOfCharsAlreadyUsed - ELLIPSIS.length() - SPACER.length(); - return title.subSequence(0, allowedCharsLength) + ELLIPSIS; + return showTitle.substring(0, allowedCharsLength) + ELLIPSIS; } - return title; + return showTitle; } } @@ -302,10 +291,10 @@ class ReceiptViewHolderWithHeader extends ReceiptViewHolder { } @Override - void bind(@NonNull final HyperwalletTransferMethod transferMethod) { - super.bind(transferMethod); - mTransactionHeaderText.setText(DateUtility.toDateFormat( - DateUtility.fromDateTimeString(transferMethod.getField(CREATED_ON)), HEADER_DATE_FORMAT)); + void bind(@NonNull final Receipt receipt) { + super.bind(receipt); + mTransactionHeaderText.setText(DateUtils.toDateFormat( + DateUtils.fromDateTimeString(receipt.getCreatedOn()), HEADER_DATE_FORMAT)); } } } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java index eccff9c02..3febe9578 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java @@ -27,7 +27,7 @@ import com.hyperwallet.android.common.viewmodel.Event; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.receipt.repository.ReceiptRepository; import java.util.List; @@ -38,7 +38,7 @@ public class ListReceiptViewModel extends ViewModel { private MutableLiveData>> mErrorEvent = new MutableLiveData<>(); private Observer mErrorEventObserver; - public ListReceiptViewModel(@NonNull final ReceiptRepository receiptRepository) { + private ListReceiptViewModel(@NonNull final ReceiptRepository receiptRepository) { mReceiptRepository = receiptRepository; // load initial receipts mReceiptRepository.loadReceipts(); @@ -63,7 +63,7 @@ public LiveData>> getReceiptErrors() { return mErrorEvent; } - public LiveData> getReceiptList() { + public LiveData> getReceiptList() { return mReceiptRepository.loadReceipts(); } diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml index 03000f34a..22a85f8b9 100644 --- a/receipt/src/main/res/values/strings.xml +++ b/receipt/src/main/res/values/strings.xml @@ -10,4 +10,6 @@ \uE900 \uE902 + - %s + + %s diff --git a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java index 6135c42b2..334ad2044 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java @@ -33,7 +33,7 @@ import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; import com.hyperwallet.android.model.transfermethod.HyperwalletBankCard; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethodPagination; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethodQueryParam; import com.hyperwallet.android.model.transfermethod.PayPalAccount; import org.junit.Before; @@ -423,7 +423,7 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(pageList); return listener; } - }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodPagination) any(), + }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), ArgumentMatchers.>>any()); // test @@ -448,7 +448,7 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(null); return listener; } - }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodPagination) any(), + }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), ArgumentMatchers.>>any()); // test @@ -475,7 +475,7 @@ public Object answer(InvocationOnMock invocation) { listener.onFailure(new HyperwalletException(errors)); return listener; } - }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodPagination) any(), + }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), ArgumentMatchers.>>any()); // test From fbf2721660debc4ce1034dcf35193b00962a2c9c Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 4 Jun 2019 14:34:44 -0700 Subject: [PATCH 22/42] renamed test changed get lifecycle instead of using this --- .../hyperwallet/android/common/util/DateUtilsTest.java | 8 ++++---- .../android/receipt/view/ListReceiptFragment.java | 7 ++++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java index bede4aa66..2bac845eb 100644 --- a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java +++ b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java @@ -11,7 +11,7 @@ public class DateUtilsTest { @Test - public void testToDateFormat_returnExpectedStringFormat() { + public void testToDateFormat_returnsExpectedStringFormat() { String dateString = "2019-05-27"; Date dateTarget = DateUtils.fromDateTimeString("2019-05-27T15:57:49"); @@ -22,7 +22,7 @@ public void testToDateFormat_returnExpectedStringFormat() { } @Test - public void testToDateFormat_returnExpectedStringFormatFromParameter() { + public void testToDateFormat_returnsExpectedStringFormatFromParameter() { String dateString = "November 2019"; Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:49"); @@ -33,7 +33,7 @@ public void testToDateFormat_returnExpectedStringFormatFromParameter() { } @Test - public void testToDateTimeFormat_returnExpectedStringFormat() { + public void testToDateTimeFormat_returnsExpectedStringFormat() { String dateString = "2019-11-27T15:57:49"; Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:49"); @@ -44,7 +44,7 @@ public void testToDateTimeFormat_returnExpectedStringFormat() { } @Test - public void testToDateTimeMillisFormat_returnExpectedStringFormat() { + public void testToDateTimeMillisFormat_returnsExpectedStringFormat() { String dateString = "2019-11-27T15:57:09.450"; Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:09.450", "yyyy-MM-dd'T'HH:mm:ss.SSS"); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 58a0766d7..dc05119e2 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -110,14 +110,15 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat } private void registerObservers() { - mListReceiptViewModel.getReceiptList().observe(this, new Observer>() { + mListReceiptViewModel.getReceiptList().observe(getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(PagedList transferMethods) { mListReceiptAdapter.submitList(transferMethods); } }); - mListReceiptViewModel.getReceiptErrors().observe(this, new Observer>>() { + mListReceiptViewModel.getReceiptErrors().observe(getViewLifecycleOwner(), + new Observer>>() { @Override public void onChanged(Event> listEvent) { if (!listEvent.isContentConsumed()) { @@ -126,7 +127,7 @@ public void onChanged(Event> listEvent) { } }); - mListReceiptViewModel.isLoadingData().observe(this, new Observer() { + mListReceiptViewModel.isLoadingData().observe(getViewLifecycleOwner(), new Observer() { @Override public void onChanged(Boolean loading) { if (loading) { From bf8599c44bf636934d817e22fc395d101854d55e Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 4 Jun 2019 15:28:19 -0700 Subject: [PATCH 23/42] updated diff and order of fields --- .../receipt/repository/ReceiptDataSource.java | 2 +- .../repository/ReceiptDataSourceFactory.java | 2 +- .../repository/ReceiptRepositoryImpl.java | 2 +- .../receipt/view/ListReceiptFragment.java | 21 ++++++++++++------- .../viewmodel/ListReceiptViewModel.java | 2 +- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java index a7ecb76eb..7e5c1be32 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java @@ -37,13 +37,13 @@ public class ReceiptDataSource extends PageKeyedDataSource { private static final int YEAR_BEFORE_NOW = -1; + private final Calendar mCalendarYearBeforeNow; private final MutableLiveData mErrors = new MutableLiveData<>(); private final MutableLiveData mIsFetchingData = new MutableLiveData<>(); private LoadInitialCallback mLoadInitialCallback; private LoadInitialParams mLoadInitialParams; private LoadCallback mLoadAfterCallback; private LoadParams mLoadAfterParams; - private final Calendar mCalendarYearBeforeNow; ReceiptDataSource() { super(); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java index 19630604f..440a3f6f1 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java @@ -23,8 +23,8 @@ public class ReceiptDataSourceFactory extends DataSource.Factory { - private final ReceiptDataSource mReceiptDataSource; private final MutableLiveData mDataSourceMutableLiveData; + private final ReceiptDataSource mReceiptDataSource; ReceiptDataSourceFactory() { super(); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java index 5b6850ebc..593f8a857 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java @@ -27,8 +27,8 @@ public class ReceiptRepositoryImpl implements ReceiptRepository { private final ReceiptDataSourceFactory mDataSourceFactory; private final LiveData mReceiptDataSourceLiveData; - private LiveData mIsFetchingData; private LiveData mErrorsLiveData; + private LiveData mIsFetchingData; private LiveData> mReceiptsLiveData; ReceiptRepositoryImpl() { diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index dc05119e2..8cd6b1fdc 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -47,16 +47,17 @@ import java.util.Calendar; import java.util.List; import java.util.Locale; +import java.util.Objects; public class ListReceiptFragment extends Fragment { private static final String HEADER_DATE_FORMAT = "MMMM yyyy"; private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; - private View mProgressBar; + private ListReceiptAdapter mListReceiptAdapter; private RecyclerView mListReceiptsView; private ListReceiptViewModel mListReceiptViewModel; - private ListReceiptAdapter mListReceiptAdapter; private OnLoadReceiptErrorCallback mOnLoadReceiptErrorCallback; + private View mProgressBar; /** * Please don't use this constructor this is reserved for Android Core Framework @@ -152,16 +153,20 @@ private static class ListReceiptItemDiffCallback extends DiffUtil.ItemCallback>> mErrorEvent = new MutableLiveData<>(); private Observer mErrorEventObserver; + private ReceiptRepository mReceiptRepository; private ListReceiptViewModel(@NonNull final ReceiptRepository receiptRepository) { mReceiptRepository = receiptRepository; From 92b910f15422f777e751bc63c80a7552d0c53906 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Wed, 5 Jun 2019 13:43:19 -0700 Subject: [PATCH 24/42] added test --- .../receipt/repository/ReceiptDataSource.java | 6 +- .../ReceiptDataSourceFactoryTest.java | 21 +- .../repository/ReceiptDataSourceTest.java | 379 ++++++++++++++---- .../repository/ReceiptRepositoryImplTest.java | 35 -- .../viemodel/ReceiptItemListFactoryTest.java | 30 -- .../receipt_list_date_grouping_response.json | 143 ++++--- .../TransferMethodRepositoryImplTest.java | 8 +- 7 files changed, 391 insertions(+), 231 deletions(-) delete mode 100644 receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImplTest.java delete mode 100644 receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java index 7e5c1be32..c9bc68a7f 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java @@ -101,6 +101,8 @@ public void loadBefore(@NonNull LoadParams params, @Override public void loadAfter(@NonNull LoadParams params, final @NonNull LoadCallback callback) { + mLoadInitialCallback = null; + mLoadInitialParams = null; mLoadAfterCallback = callback; mLoadAfterParams = params; mIsFetchingData.postValue(Boolean.TRUE); @@ -124,8 +126,8 @@ public void onSuccess(@Nullable HyperwalletPageList result) { } // reset - mLoadInitialCallback = null; - mLoadInitialParams = null; + mLoadAfterCallback = null; + mLoadAfterParams = null; } @Override diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactoryTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactoryTest.java index 955386e45..cf5c63114 100644 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactoryTest.java +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactoryTest.java @@ -1,5 +1,13 @@ package com.hyperwallet.android.receipt.repository; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; + +import androidx.lifecycle.LiveData; +import androidx.paging.DataSource; + +import org.hamcrest.CoreMatchers; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -10,20 +18,21 @@ public class ReceiptDataSourceFactoryTest { @Test public void testGetReceiptDataSource_returnsLiveDataReceiptSource() { // initialize - + ReceiptDataSourceFactory dataSourceFactory = new ReceiptDataSourceFactory(); // test - - // verify + LiveData liveData = dataSourceFactory.getReceiptDataSource(); // assert + assertThat(liveData, is(notNullValue())); } @Test public void testCreate_returnsDataSource() { // initialize - + ReceiptDataSourceFactory dataSourceFactory = new ReceiptDataSourceFactory(); // test - - // verify + DataSource dataSource = dataSourceFactory.create(); // assert + assertThat(dataSource, is(notNullValue())); + assertThat(dataSource, CoreMatchers.instanceOf(ReceiptDataSource.class)); } } diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java index 660843689..92713edb5 100644 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java @@ -1,30 +1,83 @@ package com.hyperwallet.android.receipt.repository; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.nullValue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; -import com.hyperwallet.android.Hyperwallet; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.CREDIT; +import static com.hyperwallet.android.model.receipt.Receipt.Entries.DEBIT; +import static com.hyperwallet.android.model.receipt.Receipt.ReceiptTypes.PAYMENT; +import static com.hyperwallet.android.model.receipt.Receipt.ReceiptTypes.TRANSFER_TO_BANK_ACCOUNT; + +import androidx.paging.PageKeyedDataSource; +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.exception.HyperwalletException; +import com.hyperwallet.android.listener.HyperwalletListener; +import com.hyperwallet.android.model.HyperwalletError; +import com.hyperwallet.android.model.HyperwalletErrors; +import com.hyperwallet.android.model.paging.HyperwalletPageList; +import com.hyperwallet.android.model.receipt.Receipt; +import com.hyperwallet.android.model.receipt.ReceiptQueryParam; +import com.hyperwallet.android.receipt.rule.HyperwalletExternalResourceManager; + +import org.hamcrest.Matchers; +import org.json.JSONObject; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.InjectMocks; +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 ReceiptDataSourceTest { @Rule public MockitoRule mMockito = MockitoJUnit.rule(); - @Spy - @InjectMocks - private ReceiptDataSource mReceiptDataSource; + @Rule + public HyperwalletExternalResourceManager mExternalResourceManager = new HyperwalletExternalResourceManager(); + @Mock private Hyperwallet mHyperwallet; + @Mock + private PageKeyedDataSource.LoadInitialParams mInitialParams; + @Mock + private PageKeyedDataSource.LoadInitialCallback mInitialCallback; + // can't be mocked due to params.key is of type Integer and autoboxing will not work with null to 0 + private final PageKeyedDataSource.LoadParams mLoadAfterParams = + new PageKeyedDataSource.LoadParams<>(10, 10); + @Mock + private PageKeyedDataSource.LoadCallback mLoadAfterCallback; + + @Captor + private ArgumentCaptor> mListArgumentCaptor; + @Captor + private ArgumentCaptor mPreviousCaptor; + @Captor + private ArgumentCaptor mNextCaptor; + + @Spy + private ReceiptDataSource mReceiptDataSource; @Before public void setUp() { @@ -32,130 +85,300 @@ public void setUp() { } @Test - public void testLoadInitial_returnsReceipts() { - // 1) create receipt list to return - // 2) initialize paging - // 3) mock hyperwallet behavior to return objects - // 4) mock params - // 5) mock callback + public void testLoadInitial_returnsReceipts() throws Exception { + String json = mExternalResourceManager.getResourceContent("receipt_list_date_grouping_response.json"); + JSONObject jsonObject = new JSONObject(json); + final HyperwalletPageList response = new HyperwalletPageList<>(jsonObject, Receipt.class); + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onSuccess(response); + return listener; + } + }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); // test + mReceiptDataSource.loadInitial(mInitialParams, mInitialCallback); + + verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + verify(mInitialCallback).onResult(mListArgumentCaptor.capture(), mPreviousCaptor.capture(), + mNextCaptor.capture()); + + assertThat(mPreviousCaptor.getValue(), is(0)); + assertThat(mNextCaptor.getValue(), is(10)); - // verify receipt list return - // verify error is not invoked - // verify mock params - // verify mock callback // assert receipts information + List receipts = mListArgumentCaptor.getValue(); + assertThat(receipts, Matchers.hasSize(5)); + assertThat(receipts.get(0).getJournalId(), is("51660665")); + assertThat(receipts.get(0).getType(), is(PAYMENT)); + assertThat(receipts.get(0).getEntry(), is(CREDIT)); + assertThat(receipts.get(0).getSourceToken(), is("act-b1f6dc28-e534-45f4-a661-3523f051f77a")); + assertThat(receipts.get(0).getDestinationToken(), is("usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6")); + assertThat(receipts.get(0).getAmount(), is("5000.00")); + assertThat(receipts.get(0).getFee(), is("0.00")); + assertThat(receipts.get(0).getCurrency(), is("USD")); + assertThat(receipts.get(0).getDetails(), is(notNullValue())); + assertThat(receipts.get(0).getDetails().getPayeeName(), is("kevin Puckett")); + assertThat(receipts.get(0).getDetails().getClientPaymentId(), is("trans-0001")); + assertThat(receipts.get(1).getJournalId(), is("51660666")); + assertThat(receipts.get(1).getType(), is(TRANSFER_TO_BANK_ACCOUNT)); + assertThat(receipts.get(1).getEntry(), is(DEBIT)); + assertThat(receipts.get(1).getSourceToken(), is("usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6")); + assertThat(receipts.get(1).getDestinationToken(), is("trm-0a2ac589-2cae-4ed3-9b0b-658246a34687")); + assertThat(receipts.get(1).getAmount(), is("10.25")); + assertThat(receipts.get(1).getFee(), is("0.25")); + assertThat(receipts.get(1).getCurrency(), is("USD")); + assertThat(receipts.get(1).getDetails(), is(notNullValue())); + assertThat(receipts.get(1).getDetails().getPayeeName(), is("kevin Puckett")); + assertThat(receipts.get(1).getDetails().getBankAccountId(), is("patzachery.mcclary@example.com")); + + assertThat(mReceiptDataSource.getErrors().getValue(), is(nullValue())); + assertThat(mReceiptDataSource.isFetchingData().getValue(), is(false)); } @Test public void testLoadInitial_returnNoReceipt() { - // 1) mock hyperwallet behavior to return null to simulate 204 - // 2) mock params - // 3) mock callback + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onSuccess(null); + return listener; + } + }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); // test + mReceiptDataSource.loadInitial(mInitialParams, mInitialCallback); - // verify receipt list return - // verify error is not invoked - // verify mock params - // verify mock callback - // assert receipts information + verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + verify(mInitialCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt(), anyInt()); + + assertThat(mReceiptDataSource.getErrors().getValue(), is(nullValue())); + assertThat(mReceiptDataSource.isFetchingData().getValue(), is(false)); } @Test public void testLoadInitial_withError() { - // 1) Initialize error list response - // 2) mock params - // 3) mock callback + final HyperwalletError error = new HyperwalletError("test message", "TEST_CODE"); + List errorList = new ArrayList<>(); + errorList.add(error); + final HyperwalletErrors errors = new HyperwalletErrors(errorList); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); // test + mReceiptDataSource.loadInitial(mInitialParams, mInitialCallback); + + verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + verify(mInitialCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt(), anyInt()); - // verify receipt is not returned - // verify error is invoked - // verify mock params - // verify mock callback - // assert errors information + assertThat(mReceiptDataSource.getErrors().getValue(), is(notNullValue())); + assertThat(mReceiptDataSource.getErrors().getValue().getErrors(), Matchers.hasSize(1)); + assertThat(mReceiptDataSource.getErrors().getValue().getErrors().get(0).getCode(), is("TEST_CODE")); + assertThat(mReceiptDataSource.getErrors().getValue().getErrors().get(0).getMessage(), is("test message")); + assertThat(mReceiptDataSource.isFetchingData().getValue(), is(false)); } @Test public void testRetry_LoadInitial() { - // 1) Initialize error list response - // 2) mock params - // 3) mock callback + final HyperwalletError error = new HyperwalletError("test message", "TEST_CODE"); + List errorList = new ArrayList<>(); + errorList.add(error); + final HyperwalletErrors errors = new HyperwalletErrors(errorList); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); - // test load initial - // test retry + // test + mReceiptDataSource.loadInitial(mInitialParams, mInitialCallback); + + verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + verify(mInitialCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt(), anyInt()); - // verify receipt is not returned - // verify error is invoked twice - // verify mock params twice - // verify mock callback twice + // error occurred, this will save params and callback + assertThat(mReceiptDataSource.getErrors().getValue(), is(notNullValue())); - // assert errors information + // test retry, saved params and callback will be used and no null pointer exception is thrown + mReceiptDataSource.retry(); + + // verify calls + verify(mReceiptDataSource, times(2)).loadInitial( + ArgumentMatchers.>any(), + ArgumentMatchers.>any()); + verify(mReceiptDataSource, never()).loadAfter( + ArgumentMatchers.>any(), + ArgumentMatchers.>any()); } @Test - public void testLoadAfter_returnsReceipts() { - // 1) create receipt list to return - // 2) initialize paging - // 3) mock hyperwallet behavior to return objects - // 4) mock params - // 5) mock callback + public void testLoadAfter_returnsReceipts() throws Exception { + String json = mExternalResourceManager.getResourceContent("receipt_list_date_grouping_response.json"); + JSONObject jsonObject = new JSONObject(json); + final HyperwalletPageList response = new HyperwalletPageList<>(jsonObject, Receipt.class); + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onSuccess(response); + return listener; + } + }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); // test + mReceiptDataSource.loadAfter(mLoadAfterParams, mLoadAfterCallback); + + verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + verify(mLoadAfterCallback).onResult(mListArgumentCaptor.capture(), mNextCaptor.capture()); + + assertThat(mNextCaptor.getValue(), is(10)); - // verify receipt list return - // verify error is not invoked - // verify mock params - // verify mock callback // assert receipts information + List receipts = mListArgumentCaptor.getValue(); + assertThat(receipts, Matchers.hasSize(5)); + assertThat(receipts.get(3).getJournalId(), is("51660675")); + assertThat(receipts.get(3).getType(), is(PAYMENT)); + assertThat(receipts.get(3).getEntry(), is(CREDIT)); + assertThat(receipts.get(3).getSourceToken(), is("act-b1f6dc28-e534-45f4-a661-3523f051f77a")); + assertThat(receipts.get(3).getDestinationToken(), is("usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6")); + assertThat(receipts.get(3).getAmount(), is("13.00")); + assertThat(receipts.get(3).getFee(), is("0.00")); + assertThat(receipts.get(3).getCurrency(), is("USD")); + assertThat(receipts.get(3).getDetails(), is(notNullValue())); + assertThat(receipts.get(3).getDetails().getPayeeName(), is("kevin Puckett")); + assertThat(receipts.get(3).getDetails().getClientPaymentId(), is("CSietnRJQQ0bscYkOoPJxNiTDiVALhjQ")); + assertThat(receipts.get(4).getJournalId(), is("51660676")); + assertThat(receipts.get(4).getType(), is(PAYMENT)); + assertThat(receipts.get(4).getEntry(), is(CREDIT)); + assertThat(receipts.get(4).getSourceToken(), is("act-b1f6dc28-e534-45f4-a661-3523f051f77a")); + assertThat(receipts.get(4).getDestinationToken(), is("usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6")); + assertThat(receipts.get(4).getAmount(), is("14.00")); + assertThat(receipts.get(4).getFee(), is("0.00")); + assertThat(receipts.get(4).getCurrency(), is("USD")); + assertThat(receipts.get(4).getDetails(), is(notNullValue())); + assertThat(receipts.get(4).getDetails().getPayeeName(), is("kevin Puckett")); + assertThat(receipts.get(4).getDetails().getClientPaymentId(), is("wUOdfLlJONacbdHlAHOAXQT7uwX7LTPy")); + + assertThat(mReceiptDataSource.getErrors().getValue(), is(nullValue())); + assertThat(mReceiptDataSource.isFetchingData().getValue(), is(false)); } @Test public void testLoadAfter_returnNoReceipt() { - // 1) mock hyperwallet behavior to return null to simulate 204 - // 2) mock params - // 3) mock callback + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onSuccess(null); + return listener; + } + }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); // test + mReceiptDataSource.loadAfter(mLoadAfterParams, mLoadAfterCallback); - // verify receipt list return - // verify error is not invoked - // verify mock params - // verify mock callback - // assert receipts information + verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + verify(mLoadAfterCallback, never()).onResult(ArgumentMatchers.>any(), anyInt()); + + assertThat(mReceiptDataSource.getErrors().getValue(), is(nullValue())); + assertThat(mReceiptDataSource.isFetchingData().getValue(), is(false)); } @Test public void testLoadAfter_withError() { - // 1) Initialize error list response - // 2) mock params - // 3) mock callback + final HyperwalletError error = new HyperwalletError("test message load after", "LOAD_AFTER_CODE"); + List errorList = new ArrayList<>(); + errorList.add(error); + final HyperwalletErrors errors = new HyperwalletErrors(errorList); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); // test - - // verify receipt is not returned - // verify error is invoked - // verify mock params - // verify mock callback - // assert errors information + mReceiptDataSource.loadAfter(mLoadAfterParams, mLoadAfterCallback); + + verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + verify(mLoadAfterCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt()); + + // error occurred, this will save params and callback + assertThat(mReceiptDataSource.getErrors().getValue(), is(notNullValue())); + assertThat(mReceiptDataSource.getErrors().getValue().getErrors(), Matchers.hasSize(1)); + assertThat(mReceiptDataSource.getErrors().getValue().getErrors().get(0).getCode(), is("LOAD_AFTER_CODE")); + assertThat(mReceiptDataSource.getErrors().getValue().getErrors().get(0).getMessage(), + is("test message load after")); + assertThat(mReceiptDataSource.isFetchingData().getValue(), is(false)); } @Test public void testRetry_LoadAfter() { - // 1) Initialize error list response - // 2) mock params - // 3) mock callback + final HyperwalletError error = new HyperwalletError("test message", "TEST_CODE"); + List errorList = new ArrayList<>(); + errorList.add(error); + final HyperwalletErrors errors = new HyperwalletErrors(errorList); + + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) { + HyperwalletListener listener = (HyperwalletListener) invocation.getArguments()[1]; + listener.onFailure(new HyperwalletException(errors)); + return listener; + } + }).when(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + + // test + mReceiptDataSource.loadAfter(mLoadAfterParams, mLoadAfterCallback); + + verify(mHyperwallet).listReceipts(any(ReceiptQueryParam.class), + ArgumentMatchers.>>any()); + verify(mLoadAfterCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt()); - // test load initial - // test retry + // error occurred, this will save params and callback + assertThat(mReceiptDataSource.getErrors().getValue(), is(notNullValue())); - // verify receipt is not returned - // verify error is invoked twice - // verify mock params twice - // verify mock callback twice + // test retry, saved params and callback will be used and no null pointer exception is thrown + mReceiptDataSource.retry(); - // assert errors information + // verify calls + verify(mReceiptDataSource, times(2)).loadAfter( + ArgumentMatchers.>any(), + ArgumentMatchers.>any()); + verify(mReceiptDataSource, never()).loadInitial( + ArgumentMatchers.>any(), + ArgumentMatchers.>any()); } } diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImplTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImplTest.java deleted file mode 100644 index 732041bfd..000000000 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImplTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.hyperwallet.android.receipt.repository; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -@RunWith(RobolectricTestRunner.class) -public class ReceiptRepositoryImplTest { - - @Test - public void testLoadReceipts_withData() { - // 1) create receipt list to return - // 2) initialize paging - // 3) mock hyperwallet behavior to return objects - // 4) inject to datasource - - // test - // verify - } - - @Test - public void testIsLoading_loading() { - - } - - @Test - public void testGetErrors_returnError() { - - } - - @Test - public void testRetryLoadReceipt_retry() { - - } -} diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java deleted file mode 100644 index bf91abd31..000000000 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/viemodel/ReceiptItemListFactoryTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.hyperwallet.android.receipt.viemodel; - -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; -import com.hyperwallet.android.receipt.rule.HyperwalletExternalResourceManager; - -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; - -import java.util.Locale; - -@RunWith(RobolectricTestRunner.class) -public class ReceiptItemListFactoryTest { - - @Rule - public HyperwalletExternalResourceManager mExternalResourceManager = new HyperwalletExternalResourceManager(); - - @Test - public void testConsolidateList_WithResult() throws JSONException { - String json = mExternalResourceManager.getResourceContent("receipt_list_date_grouping_response.json"); - JSONObject object = new JSONObject(json); - HyperwalletTransferMethod transferMethod = new HyperwalletTransferMethod(object); - - Locale locale = Locale.getDefault(); - locale.getDisplayName(); - } -} diff --git a/receipt/src/test/resources/receipt_list_date_grouping_response.json b/receipt/src/test/resources/receipt_list_date_grouping_response.json index ccdc27f32..badaf7505 100644 --- a/receipt/src/test/resources/receipt_list_date_grouping_response.json +++ b/receipt/src/test/resources/receipt_list_date_grouping_response.json @@ -1,79 +1,82 @@ { - "count": 30, + "count": 5, "offset": 0, "limit": 10, "data": [ { - "token": "trm-one-one", - "createdOn": "2019-05-27T15:49:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" + "journalId": "51660665", + "type": "PAYMENT", + "createdOn": "2019-05-27T15:42:07", + "entry": "CREDIT", + "sourceToken": "act-b1f6dc28-e534-45f4-a661-3523f051f77a", + "destinationToken": "usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6", + "amount": "5000.00", + "fee": "0.00", + "currency": "USD", + "details": { + "clientPaymentId": "trans-0001", + "payeeName": "kevin Puckett" + } }, { - "token": "trm-one-two", - "createdOn": "2019-05-27T15:30:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" + "journalId": "51660666", + "type": "TRANSFER_TO_BANK_ACCOUNT", + "createdOn": "2019-05-27T15:57:49", + "entry": "DEBIT", + "sourceToken": "usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6", + "destinationToken": "trm-0a2ac589-2cae-4ed3-9b0b-658246a34687", + "amount": "10.25", + "fee": "0.25", + "currency": "USD", + "details": { + "payeeName": "kevin Puckett", + "bankAccountId": "patzachery.mcclary@example.com" + } }, { - "token": "trm-one-three", - "createdOn": "2019-05-27T13:49:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" + "journalId": "51660667", + "type": "PAYMENT", + "createdOn": "2019-05-27T16:01:10", + "entry": "CREDIT", + "sourceToken": "act-b1f6dc28-e534-45f4-a661-3523f051f77a", + "destinationToken": "usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6", + "amount": "11.00", + "fee": "0.00", + "currency": "USD", + "details": { + "clientPaymentId": "trans-02", + "payeeName": "kevin Puckett" + } }, { - "token": "trm-two-one", - "createdOn": "2019-02-27T15:49:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" - }, - { - "token": "trm-two-two", - "createdOn": "2019-02-27T15:30:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" - }, - { - "token": "trm-two-three", - "createdOn": "2019-02-27T13:49:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" - }, - { - "token": "trm-three-one", - "createdOn": "2018-12-27T15:49:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" - }, - { - "token": "trm-three-two", - "createdOn": "2018-12-27T15:30:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" + "journalId": "51660675", + "type": "PAYMENT", + "createdOn": "2019-06-04T10:35:23", + "entry": "CREDIT", + "sourceToken": "act-b1f6dc28-e534-45f4-a661-3523f051f77a", + "destinationToken": "usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6", + "amount": "13.00", + "fee": "0.00", + "currency": "USD", + "details": { + "clientPaymentId": "CSietnRJQQ0bscYkOoPJxNiTDiVALhjQ", + "payeeName": "kevin Puckett" + } }, { - "token": "trm-three-three", - "createdOn": "2018-12-27T13:49:56", - "transferMethodCountry": "US", - "transferMethodCurrency": "USD", - "bankId": "021000021", - "branchId": "021000021" + "journalId": "51660676", + "type": "PAYMENT", + "createdOn": "2019-06-04T11:16:21", + "entry": "CREDIT", + "sourceToken": "act-b1f6dc28-e534-45f4-a661-3523f051f77a", + "destinationToken": "usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6", + "amount": "14.00", + "fee": "0.00", + "currency": "USD", + "details": { + "clientPaymentId": "wUOdfLlJONacbdHlAHOAXQT7uwX7LTPy", + "payeeName": "kevin Puckett" + } } ], "links": [ @@ -81,19 +84,7 @@ "params": { "rel": "self" }, - "href": "https://localhost:8181/rest/internal/v1/users/usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6/transfer-methods?offset=0&limit=10&sortBy=-createdOn&status=ACTIVATED" - }, - { - "params": { - "rel": "next" - }, - "href": "https://localhost:8181/rest/internal/v1/users/usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6/transfer-methods?offset=10&limit=10&sortBy=-createdOn&status=ACTIVATED" - }, - { - "params": { - "rel": "last" - }, - "href": "https://localhost:8181/rest/internal/v1/users/usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6/transfer-methods?offset=20&limit=10&sortBy=-createdOn&status=ACTIVATED" + "href": "https://localhost:8181/rest/v3/users/usr-b4e8ec34-52d8-4a81-9566-bdde1bd745b6/receipts?offset=0&limit=10&createdAfter=2019-1-1" } ] } \ No newline at end of file diff --git a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java index 334ad2044..0979b4fbf 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java @@ -29,11 +29,11 @@ import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.HyperwalletStatusTransition; +import com.hyperwallet.android.model.QueryParam; import com.hyperwallet.android.model.paging.HyperwalletPageList; import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; import com.hyperwallet.android.model.transfermethod.HyperwalletBankCard; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; -import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethodQueryParam; import com.hyperwallet.android.model.transfermethod.PayPalAccount; import org.junit.Before; @@ -423,7 +423,7 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(pageList); return listener; } - }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), + }).when(mHyperwallet).listTransferMethods((QueryParam) any(), ArgumentMatchers.>>any()); // test @@ -448,7 +448,7 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(null); return listener; } - }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), + }).when(mHyperwallet).listTransferMethods((QueryParam) any(), ArgumentMatchers.>>any()); // test @@ -475,7 +475,7 @@ public Object answer(InvocationOnMock invocation) { listener.onFailure(new HyperwalletException(errors)); return listener; } - }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), + }).when(mHyperwallet).listTransferMethods((QueryParam) any(), ArgumentMatchers.>>any()); // test From a53786befc248baf522352e9e0c583ef5831f6a9 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Wed, 5 Jun 2019 14:30:25 -0700 Subject: [PATCH 25/42] Moving equals implementation in core --- .../android/receipt/view/ListReceiptFragment.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 8cd6b1fdc..a70dba35c 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -153,20 +153,14 @@ private static class ListReceiptItemDiffCallback extends DiffUtil.ItemCallback Date: Wed, 5 Jun 2019 17:10:10 -0700 Subject: [PATCH 26/42] fixed integration test --- .../ui/repository/TransferMethodRepositoryImplTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java index 0979b4fbf..334ad2044 100644 --- a/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java +++ b/ui/src/test/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImplTest.java @@ -29,11 +29,11 @@ import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.HyperwalletStatusTransition; -import com.hyperwallet.android.model.QueryParam; import com.hyperwallet.android.model.paging.HyperwalletPageList; import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; import com.hyperwallet.android.model.transfermethod.HyperwalletBankCard; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethodQueryParam; import com.hyperwallet.android.model.transfermethod.PayPalAccount; import org.junit.Before; @@ -423,7 +423,7 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(pageList); return listener; } - }).when(mHyperwallet).listTransferMethods((QueryParam) any(), + }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), ArgumentMatchers.>>any()); // test @@ -448,7 +448,7 @@ public Object answer(InvocationOnMock invocation) { listener.onSuccess(null); return listener; } - }).when(mHyperwallet).listTransferMethods((QueryParam) any(), + }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), ArgumentMatchers.>>any()); // test @@ -475,7 +475,7 @@ public Object answer(InvocationOnMock invocation) { listener.onFailure(new HyperwalletException(errors)); return listener; } - }).when(mHyperwallet).listTransferMethods((QueryParam) any(), + }).when(mHyperwallet).listTransferMethods((HyperwalletTransferMethodQueryParam) any(), ArgumentMatchers.>>any()); // test From 905bb6a3750838336a10cd91923a0d67d81ec613 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Thu, 6 Jun 2019 07:54:28 -0700 Subject: [PATCH 27/42] fixed ellipsis approach --- common/src/main/res/values-land/orientation.xml | 4 ---- common/src/main/res/values-port/orientation.xml | 4 ---- common/src/main/res/values/orientation.xml | 4 ---- .../receipt/view/ListReceiptFragment.java | 16 ++-------------- receipt/src/main/res/layout/item_receipt.xml | 6 +++++- receipt/src/main/res/values/dimens.xml | 1 + 6 files changed, 8 insertions(+), 27 deletions(-) delete mode 100644 common/src/main/res/values-land/orientation.xml delete mode 100644 common/src/main/res/values-port/orientation.xml delete mode 100644 common/src/main/res/values/orientation.xml diff --git a/common/src/main/res/values-land/orientation.xml b/common/src/main/res/values-land/orientation.xml deleted file mode 100644 index fc1d851b2..000000000 --- a/common/src/main/res/values-land/orientation.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - true - \ No newline at end of file diff --git a/common/src/main/res/values-port/orientation.xml b/common/src/main/res/values-port/orientation.xml deleted file mode 100644 index 214d58967..000000000 --- a/common/src/main/res/values-port/orientation.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - false - \ No newline at end of file diff --git a/common/src/main/res/values/orientation.xml b/common/src/main/res/values/orientation.xml deleted file mode 100644 index 214d58967..000000000 --- a/common/src/main/res/values/orientation.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - false - \ No newline at end of file diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index a70dba35c..833f8309c 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -219,10 +219,6 @@ public void onBindViewHolder(@NonNull ReceiptViewHolder holder, int position) { } class ReceiptViewHolder extends RecyclerView.ViewHolder { - - private static final int MAX_CHARACTERS_FIRST_LINE = 38; - private static final String ELLIPSIS = "..."; - private static final String SPACER = " "; private final TextView mTransactionAmount; private final TextView mTransactionCurrency; private final TextView mTransactionDate; @@ -262,14 +258,12 @@ void bind(@NonNull final Receipt receipt) { } mTransactionCurrency.setText(receipt.getCurrency()); - mTransactionTitle.setText(getTransactionTitle(receipt.getType(), - mTransactionAmount.getText().length(), mTransactionTitle.getContext())); + mTransactionTitle.setText(getTransactionTitle(receipt.getType(), mTransactionTitle.getContext())); mTransactionDate.setText(DateUtils.toDateFormat(DateUtils. fromDateTimeString(receipt.getCreatedOn()), CAPTION_DATE_FORMAT)); } - String getTransactionTitle(@NonNull final String receiptType, final int numberOfCharsAlreadyUsed, - @NonNull final Context context) { + String getTransactionTitle(@NonNull final String receiptType, @NonNull final Context context) { String showTitle = context.getResources().getString(R.string.unknown_type); int resourceId = context.getResources().getIdentifier(receiptType.toLowerCase(Locale.ROOT), "string", context.getPackageName()); @@ -277,12 +271,6 @@ String getTransactionTitle(@NonNull final String receiptType, final int numberOf showTitle = context.getResources().getString(resourceId); } - if (!context.getResources().getBoolean(R.bool.isLandscape) - && (showTitle.length() + numberOfCharsAlreadyUsed) >= MAX_CHARACTERS_FIRST_LINE) { - int allowedCharsLength = MAX_CHARACTERS_FIRST_LINE - - numberOfCharsAlreadyUsed - ELLIPSIS.length() - SPACER.length(); - return showTitle.substring(0, allowedCharsLength) + ELLIPSIS; - } return showTitle; } } diff --git a/receipt/src/main/res/layout/item_receipt.xml b/receipt/src/main/res/layout/item_receipt.xml index b96b312dd..7038451f0 100644 --- a/receipt/src/main/res/layout/item_receipt.xml +++ b/receipt/src/main/res/layout/item_receipt.xml @@ -24,12 +24,16 @@ app:layout_constraintTop_toTopOf="parent"/> diff --git a/receipt/src/main/res/values/dimens.xml b/receipt/src/main/res/values/dimens.xml index 61e6bbfad..17061ae99 100644 --- a/receipt/src/main/res/values/dimens.xml +++ b/receipt/src/main/res/values/dimens.xml @@ -1,5 +1,6 @@ 3dp + 10dp 8dp 64dp From 9fbc21d88decf08999eed499917ea7af5c9a77f4 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Thu, 6 Jun 2019 08:22:37 -0700 Subject: [PATCH 28/42] added constants --- .../android/receipt/repository/ReceiptRepositoryImpl.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java index 593f8a857..9c965c631 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java @@ -25,6 +25,9 @@ public class ReceiptRepositoryImpl implements ReceiptRepository { + private static final int PAGE_SIZE = 10; + private static final int INITIAL_LOAD_SIZE = 20; + private final ReceiptDataSourceFactory mDataSourceFactory; private final LiveData mReceiptDataSourceLiveData; private LiveData mErrorsLiveData; @@ -40,9 +43,9 @@ public class ReceiptRepositoryImpl implements ReceiptRepository { public LiveData> loadReceipts() { if (mReceiptsLiveData == null) { PagedList.Config config = new PagedList.Config.Builder() - .setPageSize(10) + .setPageSize(PAGE_SIZE) .setEnablePlaceholders(true) - .setInitialLoadSizeHint(20) + .setInitialLoadSizeHint(INITIAL_LOAD_SIZE) .build(); mReceiptsLiveData = new LivePagedListBuilder<>(mDataSourceFactory, config).build(); } From cd017a3718c91d31deb7169698144059ea281f55 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Thu, 6 Jun 2019 14:57:10 -0700 Subject: [PATCH 29/42] added transfer method status query in list transfer method ui module --- .../receipt/repository/ReceiptDataSourceFactory.java | 1 - .../ui/repository/TransferMethodRepositoryImpl.java | 8 +++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java index 440a3f6f1..e322963fb 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java @@ -30,7 +30,6 @@ public class ReceiptDataSourceFactory extends DataSource.Factory { super(); mReceiptDataSource = new ReceiptDataSource(); mDataSourceMutableLiveData = new MutableLiveData<>(); - mDataSourceMutableLiveData.postValue(mReceiptDataSource); mDataSourceMutableLiveData.setValue(mReceiptDataSource); } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImpl.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImpl.java index 7d6b77063..902971023 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImpl.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodRepositoryImpl.java @@ -16,6 +16,7 @@ */ package com.hyperwallet.android.ui.repository; +import static com.hyperwallet.android.model.HyperwalletStatusTransition.StatusDefinition.ACTIVATED; import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TOKEN; import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodFields.TYPE; import static com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes.BANK_ACCOUNT; @@ -36,6 +37,7 @@ import com.hyperwallet.android.model.transfermethod.HyperwalletBankAccount; import com.hyperwallet.android.model.transfermethod.HyperwalletBankCard; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; +import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethodQueryParam; import com.hyperwallet.android.model.transfermethod.PayPalAccount; public class TransferMethodRepositoryImpl implements TransferMethodRepository { @@ -66,7 +68,11 @@ public void createTransferMethod(@NonNull final HyperwalletTransferMethod transf @Override public void loadTransferMethods(@NonNull final LoadTransferMethodListCallback callback) { - getHyperwallet().listTransferMethods(null, + + HyperwalletTransferMethodQueryParam queryParam = new HyperwalletTransferMethodQueryParam.Builder() + .status(ACTIVATED) + .build(); + getHyperwallet().listTransferMethods(queryParam, new HyperwalletListener>() { @Override public void onSuccess(@Nullable HyperwalletPageList result) { From 77ea3ca30eb514e3db142a51e18e0edb9bf3e0dc Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 7 Jun 2019 08:07:58 -0700 Subject: [PATCH 30/42] addressed comments --- .../android/common/util/DateUtils.java | 39 +++++++++---- .../android/common/viewmodel/Event.java | 13 ++++- common/src/main/res/drawable/circle.xml | 2 +- common/src/main/res/drawable/circle_white.xml | 8 +-- common/src/main/res/values/colors.xml | 1 + common/src/main/res/values/dimens.xml | 2 + .../android/common/util/DateUtilsTest.java | 7 +++ .../receipt/repository/ReceiptDataSource.java | 31 ++++++++-- .../repository/ReceiptDataSourceFactory.java | 9 +++ .../repository/ReceiptRepositoryFactory.java | 14 +++++ .../repository/ReceiptRepositoryImpl.java | 15 +++++ .../receipt/view/ListReceiptActivity.java | 26 ++++++--- .../receipt/view/ListReceiptFragment.java | 56 ++++--------------- .../src/main/res/drawable/circle_negative.xml | 2 +- .../src/main/res/drawable/circle_positive.xml | 2 +- .../repository/ReceiptDataSourceTest.java | 10 ++-- .../receipt_list_date_grouping_response.json | 10 ++-- 17 files changed, 162 insertions(+), 85 deletions(-) diff --git a/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java b/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java index c3efc4ab0..6b49155da 100644 --- a/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java +++ b/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java @@ -17,12 +17,17 @@ package com.hyperwallet.android.common.util; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; +/** + * Common HW-SDK UI Date Utility class, that will assist on safe presentation of date whatever the mobile device setting + * is set Locale, Timezone and etc... that dictates how that dates are being presented + */ public final class DateUtils { private static final String DATE_FORMAT = "yyyy-MM-dd"; @@ -33,17 +38,22 @@ private DateUtils() { } /** - * date format: yyyy-MM-dd + * Creates a string date format: yyyy-MM-dd + * + * @param date Date object + * @return string date in yyyy-MM-dd format */ - public static String toDateFormat(@NonNull Date date) { + public static String toDateFormat(@NonNull final Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()); return dateFormat.format(date); } /** + * Creates a string date in specified format + * * @param date Date object * @param format specify desired format of date - * @return formatted date string + * @return formatted date string based on format specified */ public static String toDateFormat(@NonNull final Date date, @NonNull final String format) { SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault()); @@ -51,7 +61,10 @@ public static String toDateFormat(@NonNull final Date date, @NonNull final Strin } /** - * date format: yyyy-MM-dd'T'HH:mm:ss + * Creates a string date format + * + * @param date Date object + * @return formatted string in yyyy-MM-dd'T'HH:mm:ss format */ public static String toDateTimeFormat(@NonNull final Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT, Locale.getDefault()); @@ -59,7 +72,10 @@ public static String toDateTimeFormat(@NonNull final Date date) { } /** - * date format: yyyy-MM-dd'T'HH:mm:ss.SSS + * Creates a string date format + * + * @param date Date object + * @return formatted string in yyyy-MM-dd'T'HH:mm:ss.SSS format */ public static String toDateTimeMillisFormat(@NonNull final Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT_MILLISECONDS, Locale.getDefault()); @@ -67,7 +83,11 @@ public static String toDateTimeMillisFormat(@NonNull final Date date) { } /** - * date format: yyyy-MM-dd'T'HH:mm:ss + * Creates a Date object from string date + * + * @param dateString String date + * @return date Date object + * @throws IllegalArgumentException when string is un-parsable */ public static Date fromDateTimeString(@NonNull final String dateString) { try { @@ -79,11 +99,8 @@ public static Date fromDateTimeString(@NonNull final String dateString) { } } - - /** - * date format: yyyy-MM-dd'T'HH:mm:ss - */ - public static Date fromDateTimeString(@NonNull final String dateString, @NonNull final String format) { + @VisibleForTesting + static Date fromDateTimeString(@NonNull final String dateString, @NonNull final String format) { try { SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault()); return dateFormat.parse(dateString); diff --git a/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java b/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java index 702f39cbe..a07aab0e1 100644 --- a/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java +++ b/common/src/main/java/com/hyperwallet/android/common/viewmodel/Event.java @@ -19,6 +19,9 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +/** + * Class that represents {@link androidx.lifecycle.LiveData} event with content + */ public class Event { private final T content; @@ -28,18 +31,26 @@ public Event(@NonNull final T t) { content = t; } + /** + * @return content of this event, will also mark {@link Event#mIsContentConsumed} to true + * that will also mean that {@link Event#getContentIfNotConsumed()} will also return true + */ @NonNull public T getContent() { mIsContentConsumed = true; return content; } + /** + * @return true if content assigned to event is already referenced + * from {@link Event#getContent()}; false otherwise. + */ public boolean isContentConsumed() { return mIsContentConsumed; } /** - * retrieve perceived content based on iff content has not been retrieved + * Retrieve assigned content based on if and only if content has not been referenced from {@link Event#getContent()} * * @return content if content is not yet consumed; otherwise null */ diff --git a/common/src/main/res/drawable/circle.xml b/common/src/main/res/drawable/circle.xml index b6e02a0bc..4a83f9077 100644 --- a/common/src/main/res/drawable/circle.xml +++ b/common/src/main/res/drawable/circle.xml @@ -3,7 +3,7 @@ - + diff --git a/common/src/main/res/drawable/circle_white.xml b/common/src/main/res/drawable/circle_white.xml index 237aac74a..def791761 100644 --- a/common/src/main/res/drawable/circle_white.xml +++ b/common/src/main/res/drawable/circle_white.xml @@ -4,11 +4,9 @@ - - - - - + + diff --git a/common/src/main/res/values/colors.xml b/common/src/main/res/values/colors.xml index 2d8989b26..39fdb8129 100644 --- a/common/src/main/res/values/colors.xml +++ b/common/src/main/res/values/colors.xml @@ -23,5 +23,6 @@ #E5F7FA + #737373 diff --git a/common/src/main/res/values/dimens.xml b/common/src/main/res/values/dimens.xml index 1a3f3fb32..db66a3e95 100644 --- a/common/src/main/res/values/dimens.xml +++ b/common/src/main/res/values/dimens.xml @@ -73,4 +73,6 @@ 4dp 6dp 32dp + 48dp + 3dp diff --git a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java index 2bac845eb..e7e90f130 100644 --- a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java +++ b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java @@ -4,12 +4,19 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import org.junit.Before; import org.junit.Test; import java.util.Date; +import java.util.Locale; public class DateUtilsTest { + @Before + public void configureLocale() { + Locale.setDefault(Locale.US); + } + @Test public void testToDateFormat_returnsExpectedStringFormat() { String dateString = "2019-05-27"; diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java index c9bc68a7f..e936da18c 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java @@ -34,6 +34,10 @@ import java.util.Calendar; +/** + * ReceiptDataSource mediates communication to HW API Platform particularly on + * Receipts V3 API + */ public class ReceiptDataSource extends PageKeyedDataSource { private static final int YEAR_BEFORE_NOW = -1; @@ -51,6 +55,9 @@ public class ReceiptDataSource extends PageKeyedDataSource { mCalendarYearBeforeNow.add(Calendar.YEAR, YEAR_BEFORE_NOW); } + /** + * @see {@link PageKeyedDataSource#loadInitial(LoadInitialParams, LoadInitialCallback)} + */ @Override public void loadInitial(@NonNull final LoadInitialParams params, @NonNull final LoadInitialCallback callback) { @@ -93,11 +100,19 @@ public Handler getHandler() { }); } + /** + * Unused in this case + * + * @see {@link PageKeyedDataSource#loadBefore(LoadParams, LoadCallback)} + */ @Override public void loadBefore(@NonNull LoadParams params, @NonNull LoadCallback callback) { } + /** + * @see {@link PageKeyedDataSource#loadAfter(LoadParams, LoadCallback)} + * */ @Override public void loadAfter(@NonNull LoadParams params, final @NonNull LoadCallback callback) { @@ -143,6 +158,9 @@ public Handler getHandler() { }); } + /** + * Facilitates retry when network is down; any error that we can have a retry operation + * */ void retry() { if (mLoadInitialCallback != null) { loadInitial(mLoadInitialParams, mLoadInitialCallback); @@ -151,14 +169,19 @@ void retry() { } } - LiveData isFetchingData() { - return mIsFetchingData; - } - + /** + * Retrieve reference of Hyperwallet errors inorder for consumers to observe on data changes + * + * @return Live data of {@link HyperwalletErrors} + * */ public LiveData getErrors() { return mErrors; } + LiveData isFetchingData() { + return mIsFetchingData; + } + Hyperwallet getHyperwallet() { return Hyperwallet.getDefault(); } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java index e322963fb..a2b81216b 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceFactory.java @@ -21,6 +21,9 @@ import androidx.lifecycle.MutableLiveData; import androidx.paging.DataSource; +/** + * Data source factory that uses {@link DataSource.Factory} facility + */ public class ReceiptDataSourceFactory extends DataSource.Factory { private final MutableLiveData mDataSourceMutableLiveData; @@ -33,10 +36,16 @@ public class ReceiptDataSourceFactory extends DataSource.Factory { mDataSourceMutableLiveData.setValue(mReceiptDataSource); } + /** + * Returns observable members of receipt data source + */ LiveData getReceiptDataSource() { return mDataSourceMutableLiveData; } + /** + * @see {@link DataSource.Factory#create()} + */ @NonNull @Override public DataSource create() { diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryFactory.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryFactory.java index 67ea3f66b..b096ab7a0 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryFactory.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryFactory.java @@ -16,6 +16,9 @@ */ package com.hyperwallet.android.receipt.repository; +/** + * {@link ReceiptRepository} factory + */ public class ReceiptRepositoryFactory { private static ReceiptRepositoryFactory sInstance; @@ -25,6 +28,11 @@ private ReceiptRepositoryFactory() { mReceiptRepository = new ReceiptRepositoryImpl(); } + /** + * Creates context single instance of this Factory + * + * @return receipt repository factory instance + */ public static synchronized ReceiptRepositoryFactory getInstance() { if (sInstance == null) { sInstance = new ReceiptRepositoryFactory(); @@ -32,10 +40,16 @@ public static synchronized ReceiptRepositoryFactory getInstance() { return sInstance; } + /** + * Clears instance of repository factory + */ public static void clearInstance() { sInstance = null; } + /** + * @return ReceiptRepository instance implementation + * */ public ReceiptRepository getReceiptRepository() { return mReceiptRepository; } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java index 9c965c631..f36ea4261 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java @@ -23,6 +23,9 @@ import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.receipt.Receipt; +/** + * {@link ReceiptRepository} implementation + */ public class ReceiptRepositoryImpl implements ReceiptRepository { private static final int PAGE_SIZE = 10; @@ -39,6 +42,9 @@ public class ReceiptRepositoryImpl implements ReceiptRepository { mReceiptDataSourceLiveData = mDataSourceFactory.getReceiptDataSource(); } + /** + * @see {@link ReceiptRepository#loadReceipts()} + */ @Override public LiveData> loadReceipts() { if (mReceiptsLiveData == null) { @@ -52,6 +58,9 @@ public LiveData> loadReceipts() { return mReceiptsLiveData; } + /** + * @see {@link ReceiptRepository#isLoading()} + */ @Override public LiveData isLoading() { if (mIsFetchingData == null) { @@ -60,6 +69,9 @@ public LiveData isLoading() { return mIsFetchingData; } + /** + * @see {@link ReceiptRepository#getErrors()} + * */ @Override public LiveData getErrors() { if (mErrorsLiveData == null) { @@ -68,6 +80,9 @@ public LiveData getErrors() { return mErrorsLiveData; } + /** + * @see {@link ReceiptRepository#retryLoadReceipt()} + * */ @Override public void retryLoadReceipt() { if (mReceiptDataSourceLiveData.getValue() != null) { diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java index 04fcf20f2..97146e25a 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java @@ -27,10 +27,12 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProviders; import com.hyperwallet.android.common.view.error.DefaultErrorDialogFragment; import com.hyperwallet.android.common.view.error.OnNetworkErrorCallback; +import com.hyperwallet.android.common.viewmodel.Event; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.receipt.R; import com.hyperwallet.android.receipt.repository.ReceiptRepositoryFactory; @@ -38,11 +40,12 @@ import java.util.List; -public class ListReceiptActivity extends AppCompatActivity implements OnNetworkErrorCallback, - ListReceiptFragment.OnLoadReceiptErrorCallback { +public class ListReceiptActivity extends AppCompatActivity implements OnNetworkErrorCallback { + + private ListReceiptViewModel mListReceiptViewModel; @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_receipt); @@ -59,17 +62,27 @@ public void onClick(View v) { }); ReceiptRepositoryFactory factory = ReceiptRepositoryFactory.getInstance(); - ViewModelProviders.of(this, new ListReceiptViewModel + mListReceiptViewModel = ViewModelProviders.of(this, new ListReceiptViewModel .ListReceiptViewModelFactory(factory.getReceiptRepository())) .get(ListReceiptViewModel.class); + mListReceiptViewModel.getReceiptErrors().observe(this, + new Observer>>() { + @Override + public void onChanged(Event> listEvent) { + if (!listEvent.isContentConsumed()) { + showErrorOnLoadReceipt(listEvent.getContent()); + } + } + }); + if (savedInstanceState == null) { initFragment(ListReceiptFragment.newInstance()); } } @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + protected void onActivityResult(final int requestCode, final int resultCode, @Nullable final Intent data) { super.onActivityResult(requestCode, resultCode, data); } @@ -79,7 +92,7 @@ public boolean onSupportNavigateUp() { return true; } - private void initFragment(Fragment fragment) { + private void initFragment(@NonNull final Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.list_receipt_fragment, fragment); @@ -98,7 +111,6 @@ public void retry() { fragment.retry(); } - @Override public void showErrorOnLoadReceipt(@NonNull final List errors) { FragmentManager fragmentManager = getSupportFragmentManager(); DefaultErrorDialogFragment fragment = (DefaultErrorDialogFragment) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 833f8309c..600f95890 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -38,25 +38,19 @@ import androidx.recyclerview.widget.RecyclerView; import com.hyperwallet.android.common.util.DateUtils; -import com.hyperwallet.android.common.viewmodel.Event; -import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.receipt.R; import com.hyperwallet.android.receipt.viewmodel.ListReceiptViewModel; import java.util.Calendar; -import java.util.List; import java.util.Locale; import java.util.Objects; public class ListReceiptFragment extends Fragment { - private static final String HEADER_DATE_FORMAT = "MMMM yyyy"; - private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; private ListReceiptAdapter mListReceiptAdapter; private RecyclerView mListReceiptsView; private ListReceiptViewModel mListReceiptViewModel; - private OnLoadReceiptErrorCallback mOnLoadReceiptErrorCallback; private View mProgressBar; /** @@ -74,32 +68,20 @@ static ListReceiptFragment newInstance() { } @Override - public void onAttach(Context context) { - super.onAttach(context); - - try { - mOnLoadReceiptErrorCallback = (OnLoadReceiptErrorCallback) requireContext(); - } catch (ClassCastException e) { - throw new ClassCastException(requireActivity().toString() + " must implement " - + OnLoadReceiptErrorCallback.class.getCanonicalName()); - } - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { + public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListReceiptViewModel = ViewModelProviders.of(requireActivity()).get( ListReceiptViewModel.class); } @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.list_receipt_fragment, container, false); } @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mProgressBar = view.findViewById(R.id.list_receipt_progress_bar); mListReceiptAdapter = new ListReceiptAdapter(new ListReceiptItemDiffCallback()); @@ -118,16 +100,6 @@ public void onChanged(PagedList transferMethods) { } }); - mListReceiptViewModel.getReceiptErrors().observe(getViewLifecycleOwner(), - new Observer>>() { - @Override - public void onChanged(Event> listEvent) { - if (!listEvent.isContentConsumed()) { - mOnLoadReceiptErrorCallback.showErrorOnLoadReceipt(listEvent.getContent()); - } - } - }); - mListReceiptViewModel.isLoadingData().observe(getViewLifecycleOwner(), new Observer() { @Override public void onChanged(Boolean loading) { @@ -144,21 +116,16 @@ void retry() { mListReceiptViewModel.retryLoadReceipts(); } - interface OnLoadReceiptErrorCallback { - - void showErrorOnLoadReceipt(@NonNull final List errors); - } - private static class ListReceiptItemDiffCallback extends DiffUtil.ItemCallback { @Override - public boolean areItemsTheSame(@NonNull Receipt oldItem, @NonNull Receipt newItem) { + public boolean areItemsTheSame(@NonNull final Receipt oldItem, @NonNull final Receipt newItem) { return oldItem.hashCode() == newItem.hashCode() && Objects.equals(oldItem, newItem); } @Override - public boolean areContentsTheSame(@NonNull Receipt oldItem, @NonNull Receipt newItem) { + public boolean areContentsTheSame(@NonNull final Receipt oldItem, @NonNull final Receipt newItem) { return oldItem.hashCode() == newItem.hashCode() && Objects.equals(oldItem, newItem); } @@ -167,15 +134,17 @@ public boolean areContentsTheSame(@NonNull Receipt oldItem, @NonNull Receipt new private static class ListReceiptAdapter extends PagedListAdapter { - static final int HEADER_VIEW_TYPE = 1; - static final int DATA_VIEW_TYPE = 0; + private static final String HEADER_DATE_FORMAT = "MMMM yyyy"; + private static final String CAPTION_DATE_FORMAT = "MMMM dd, yyyy"; + private static final int HEADER_VIEW_TYPE = 1; + private static final int DATA_VIEW_TYPE = 0; ListReceiptAdapter(@NonNull final DiffUtil.ItemCallback diffCallback) { super(diffCallback); } @Override - public int getItemViewType(int position) { + public int getItemViewType(final int position) { if (position != 0) { Receipt previous = getItem(position - 1); Receipt current = getItem(position); @@ -198,20 +167,19 @@ boolean isDataViewType(@NonNull final Receipt previous, @NonNull final Receipt c @NonNull @Override - public ReceiptViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + public ReceiptViewHolder onCreateViewHolder(final @NonNull ViewGroup viewGroup, int viewType) { LayoutInflater layout = LayoutInflater.from(viewGroup.getContext()); if (viewType == HEADER_VIEW_TYPE) { View headerView = layout.inflate(R.layout.item_receipt_with_header, viewGroup, false); return new ReceiptViewHolderWithHeader(headerView); } - View dataView = layout.inflate(R.layout.item_receipt, viewGroup, false); return new ReceiptViewHolder(dataView); } @Override - public void onBindViewHolder(@NonNull ReceiptViewHolder holder, int position) { + public void onBindViewHolder(@NonNull final ReceiptViewHolder holder, final int position) { final Receipt receipt = getItem(position); if (receipt != null) { holder.bind(receipt); diff --git a/receipt/src/main/res/drawable/circle_negative.xml b/receipt/src/main/res/drawable/circle_negative.xml index 40d2d1dcd..c7ae00b18 100644 --- a/receipt/src/main/res/drawable/circle_negative.xml +++ b/receipt/src/main/res/drawable/circle_negative.xml @@ -3,7 +3,7 @@ - + diff --git a/receipt/src/main/res/drawable/circle_positive.xml b/receipt/src/main/res/drawable/circle_positive.xml index d458227df..8b6506627 100644 --- a/receipt/src/main/res/drawable/circle_positive.xml +++ b/receipt/src/main/res/drawable/circle_positive.xml @@ -3,7 +3,7 @@ - + diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java index 92713edb5..c4f4894e5 100644 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java @@ -122,7 +122,7 @@ public Object answer(InvocationOnMock invocation) { assertThat(receipts.get(0).getFee(), is("0.00")); assertThat(receipts.get(0).getCurrency(), is("USD")); assertThat(receipts.get(0).getDetails(), is(notNullValue())); - assertThat(receipts.get(0).getDetails().getPayeeName(), is("kevin Puckett")); + assertThat(receipts.get(0).getDetails().getPayeeName(), is("Kevin Puckett")); assertThat(receipts.get(0).getDetails().getClientPaymentId(), is("trans-0001")); assertThat(receipts.get(1).getJournalId(), is("51660666")); assertThat(receipts.get(1).getType(), is(TRANSFER_TO_BANK_ACCOUNT)); @@ -133,7 +133,7 @@ public Object answer(InvocationOnMock invocation) { assertThat(receipts.get(1).getFee(), is("0.25")); assertThat(receipts.get(1).getCurrency(), is("USD")); assertThat(receipts.get(1).getDetails(), is(notNullValue())); - assertThat(receipts.get(1).getDetails().getPayeeName(), is("kevin Puckett")); + assertThat(receipts.get(1).getDetails().getPayeeName(), is("Kevin Puckett")); assertThat(receipts.get(1).getDetails().getBankAccountId(), is("patzachery.mcclary@example.com")); assertThat(mReceiptDataSource.getErrors().getValue(), is(nullValue())); @@ -195,7 +195,7 @@ public Object answer(InvocationOnMock invocation) { } @Test - public void testRetry_LoadInitial() { + public void testRetry_loadInitial() { final HyperwalletError error = new HyperwalletError("test message", "TEST_CODE"); List errorList = new ArrayList<>(); errorList.add(error); @@ -269,7 +269,7 @@ public Object answer(InvocationOnMock invocation) { assertThat(receipts.get(3).getFee(), is("0.00")); assertThat(receipts.get(3).getCurrency(), is("USD")); assertThat(receipts.get(3).getDetails(), is(notNullValue())); - assertThat(receipts.get(3).getDetails().getPayeeName(), is("kevin Puckett")); + assertThat(receipts.get(3).getDetails().getPayeeName(), is("Kevin Puckett")); assertThat(receipts.get(3).getDetails().getClientPaymentId(), is("CSietnRJQQ0bscYkOoPJxNiTDiVALhjQ")); assertThat(receipts.get(4).getJournalId(), is("51660676")); assertThat(receipts.get(4).getType(), is(PAYMENT)); @@ -280,7 +280,7 @@ public Object answer(InvocationOnMock invocation) { assertThat(receipts.get(4).getFee(), is("0.00")); assertThat(receipts.get(4).getCurrency(), is("USD")); assertThat(receipts.get(4).getDetails(), is(notNullValue())); - assertThat(receipts.get(4).getDetails().getPayeeName(), is("kevin Puckett")); + assertThat(receipts.get(4).getDetails().getPayeeName(), is("Kevin Puckett")); assertThat(receipts.get(4).getDetails().getClientPaymentId(), is("wUOdfLlJONacbdHlAHOAXQT7uwX7LTPy")); assertThat(mReceiptDataSource.getErrors().getValue(), is(nullValue())); diff --git a/receipt/src/test/resources/receipt_list_date_grouping_response.json b/receipt/src/test/resources/receipt_list_date_grouping_response.json index badaf7505..d4d552972 100644 --- a/receipt/src/test/resources/receipt_list_date_grouping_response.json +++ b/receipt/src/test/resources/receipt_list_date_grouping_response.json @@ -15,7 +15,7 @@ "currency": "USD", "details": { "clientPaymentId": "trans-0001", - "payeeName": "kevin Puckett" + "payeeName": "Kevin Puckett" } }, { @@ -29,7 +29,7 @@ "fee": "0.25", "currency": "USD", "details": { - "payeeName": "kevin Puckett", + "payeeName": "Kevin Puckett", "bankAccountId": "patzachery.mcclary@example.com" } }, @@ -45,7 +45,7 @@ "currency": "USD", "details": { "clientPaymentId": "trans-02", - "payeeName": "kevin Puckett" + "payeeName": "Kevin Puckett" } }, { @@ -60,7 +60,7 @@ "currency": "USD", "details": { "clientPaymentId": "CSietnRJQQ0bscYkOoPJxNiTDiVALhjQ", - "payeeName": "kevin Puckett" + "payeeName": "Kevin Puckett" } }, { @@ -75,7 +75,7 @@ "currency": "USD", "details": { "clientPaymentId": "wUOdfLlJONacbdHlAHOAXQT7uwX7LTPy", - "payeeName": "kevin Puckett" + "payeeName": "Kevin Puckett" } } ], From ab3cb5327ef1f666ec943546a6eeab3a7bcdbbd8 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 7 Jun 2019 08:11:30 -0700 Subject: [PATCH 31/42] removed locale changes --- .../com/hyperwallet/android/common/util/DateUtilsTest.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java index e7e90f130..2bac845eb 100644 --- a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java +++ b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java @@ -4,19 +4,12 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; -import org.junit.Before; import org.junit.Test; import java.util.Date; -import java.util.Locale; public class DateUtilsTest { - @Before - public void configureLocale() { - Locale.setDefault(Locale.US); - } - @Test public void testToDateFormat_returnsExpectedStringFormat() { String dateString = "2019-05-27"; From 6ba7e593d8b0a9bc5007ceafacf67d3f0eaefbfa Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 7 Jun 2019 10:15:49 -0700 Subject: [PATCH 32/42] ui updates --- .../common}/view/HorizontalDividerItemDecorator.java | 4 ++-- receipt/src/main/res/layout/item_receipt.xml | 8 ++++---- receipt/src/main/res/layout/list_receipt_fragment.xml | 1 + receipt/src/main/res/values/dimens.xml | 2 +- receipt/src/main/res/values/strings.xml | 2 +- .../ui/transfermethod/ListTransferMethodFragment.java | 4 ++-- .../ui/transfermethod/SelectTransferMethodFragment.java | 4 ++-- 7 files changed, 13 insertions(+), 12 deletions(-) rename {ui/src/main/java/com/hyperwallet/android/ui => common/src/main/java/com/hyperwallet/android/common}/view/HorizontalDividerItemDecorator.java (98%) diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/HorizontalDividerItemDecorator.java b/common/src/main/java/com/hyperwallet/android/common/view/HorizontalDividerItemDecorator.java similarity index 98% rename from ui/src/main/java/com/hyperwallet/android/ui/view/HorizontalDividerItemDecorator.java rename to common/src/main/java/com/hyperwallet/android/common/view/HorizontalDividerItemDecorator.java index 22b3b432a..7076ba3de 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/HorizontalDividerItemDecorator.java +++ b/common/src/main/java/com/hyperwallet/android/common/view/HorizontalDividerItemDecorator.java @@ -14,7 +14,7 @@ * 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.view; +package com.hyperwallet.android.common.view; import android.content.Context; import android.graphics.Canvas; @@ -26,7 +26,7 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.hyperwallet.android.hyperwallet_ui.R; +import com.hyperwallet.android.common.R; public class HorizontalDividerItemDecorator extends RecyclerView.ItemDecoration { diff --git a/receipt/src/main/res/layout/item_receipt.xml b/receipt/src/main/res/layout/item_receipt.xml index 7038451f0..02ca0277f 100644 --- a/receipt/src/main/res/layout/item_receipt.xml +++ b/receipt/src/main/res/layout/item_receipt.xml @@ -27,7 +27,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="@dimen/grid_margin_left" - android:layout_marginTop="@dimen/item_text_top_bottom_margin" + android:layout_marginTop="@dimen/grid_margin_top" android:text="@string/text_placeholder" android:layout_marginEnd="@dimen/ellipsis_spacing" android:ellipsize="end" @@ -42,7 +42,7 @@ android:layout_height="wrap_content" android:layout_marginStart="@dimen/grid_margin_left" android:layout_marginTop="@dimen/item_text_top_bottom_margin" - android:layout_marginBottom="@dimen/item_text_top_bottom_margin" + android:layout_marginBottom="@dimen/grid_margin_right" android:text="@string/text_placeholder" android:textAppearance="@style/TextAppearance.MaterialComponents.Caption" app:layout_constraintBottom_toBottomOf="parent" @@ -52,7 +52,7 @@ diff --git a/receipt/src/main/res/values/dimens.xml b/receipt/src/main/res/values/dimens.xml index 17061ae99..999d990b2 100644 --- a/receipt/src/main/res/values/dimens.xml +++ b/receipt/src/main/res/values/dimens.xml @@ -2,5 +2,5 @@ 3dp 10dp 8dp - 64dp + 70dp diff --git a/receipt/src/main/res/values/strings.xml b/receipt/src/main/res/values/strings.xml index 86e486dac..6c6730a9e 100644 --- a/receipt/src/main/res/values/strings.xml +++ b/receipt/src/main/res/values/strings.xml @@ -5,7 +5,7 @@ yet. Transfer Funds - \uE02C + \uE900 Placeholder diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java index 385d827a6..d09829047 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/ListTransferMethodFragment.java @@ -48,13 +48,13 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.hyperwallet.android.common.view.HorizontalDividerItemDecorator; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletStatusTransition; import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.ui.HyperwalletLocalBroadcast; import com.hyperwallet.android.ui.repository.RepositoryFactory; -import com.hyperwallet.android.ui.view.HorizontalDividerItemDecorator; import com.hyperwallet.android.ui.view.widget.OneClickListener; import java.util.ArrayList; @@ -178,7 +178,7 @@ public void onOneClick(View v) { recyclerView = view.findViewById(R.id.list_transfer_method_item); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); - recyclerView.addItemDecoration(new HorizontalDividerItemDecorator(getContext(), false)); + recyclerView.addItemDecoration(new HorizontalDividerItemDecorator(requireContext(), false)); } @Override diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java index aa4a9408f..154a2bff0 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/SelectTransferMethodFragment.java @@ -38,12 +38,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.hyperwallet.android.common.view.HorizontalDividerItemDecorator; import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.ui.repository.RepositoryFactory; import com.hyperwallet.android.ui.view.CountrySelectionDialogFragment; import com.hyperwallet.android.ui.view.CurrencySelectionDialogFragment; -import com.hyperwallet.android.ui.view.HorizontalDividerItemDecorator; import com.hyperwallet.android.ui.view.widget.OneClickListener; import java.util.ArrayList; @@ -183,7 +183,7 @@ public void onTransferMethodSelected(TransferMethodSelectionItem transferMethodT mRecyclerView.setAdapter(mTransferMethodTypesAdapter); mRecyclerView.setHasFixedSize(true); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - mRecyclerView.addItemDecoration(new HorizontalDividerItemDecorator(getContext(), true)); + mRecyclerView.addItemDecoration(new HorizontalDividerItemDecorator(requireContext(), true)); } @Override From e65b8976bbfa7751da57108c818707d8090c4b65 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 7 Jun 2019 12:13:25 -0700 Subject: [PATCH 33/42] added sync ui fix --- .../receipt/view/ListReceiptFragment.java | 1 + .../view/ReceiptItemDividerDecorator.java | 103 ++++++++++++++++++ receipt/src/main/res/layout/item_receipt.xml | 3 +- 3 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java index 600f95890..ce6f9fd4d 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptFragment.java @@ -88,6 +88,7 @@ public void onViewCreated(@NonNull final View view, @Nullable final Bundle saved mListReceiptsView = view.findViewById(R.id.list_receipts); mListReceiptsView.setHasFixedSize(true); mListReceiptsView.setLayoutManager(new LinearLayoutManager(getActivity())); + mListReceiptsView.addItemDecoration(new ReceiptItemDividerDecorator(requireContext(), false)); mListReceiptsView.setAdapter(mListReceiptAdapter); registerObservers(); } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java new file mode 100644 index 000000000..18f37e6fa --- /dev/null +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java @@ -0,0 +1,103 @@ +package com.hyperwallet.android.receipt.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +public class ReceiptItemDividerDecorator extends RecyclerView.ItemDecoration { + + private final Drawable mHorizontalItemDivider; + private final int mDefaultPadding; + + public ReceiptItemDividerDecorator(@NonNull final Context context, final boolean withHeaderDivider) { + mHorizontalItemDivider = context.getResources().getDrawable( + com.hyperwallet.android.common.R.drawable.horizontal_divider, null); + // get dp from dimension configuration + if (withHeaderDivider) { + mDefaultPadding = (int) (context.getResources().getDimension( + com.hyperwallet.android.common.R.dimen.default_padding) + / context.getResources().getDisplayMetrics().density) * 2; + } else { + mDefaultPadding = 0; + } + } + + @Override + public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, + @NonNull RecyclerView.State state) { + super.getItemOffsets(outRect, view, parent, state); + + int itemCount = state.getItemCount(); + + final int itemPosition = parent.getChildAdapterPosition(view); + + // no position, leave it alone + if (itemPosition == RecyclerView.NO_POSITION) { + return; + } + + if (itemPosition == 0) { // first item + outRect.set(view.getPaddingLeft(), mDefaultPadding, view.getPaddingRight(), view.getPaddingBottom()); + } else if (itemCount > 0 && itemPosition == itemCount - 1) { // last item + outRect.set(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); + } else { // middle items + outRect.set(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); + } + } + + @Override + public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { + int right = parent.getWidth() - parent.getPaddingRight(); + + int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + int left = 0; + int top; + int bottom; + View child = parent.getChildAt(i); + RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); + + if (i == 0) { // first + // draw top + top = child.getTop() + params.topMargin; + bottom = top + mHorizontalItemDivider.getIntrinsicHeight(); + mHorizontalItemDivider.setBounds(left, top, right, bottom); + mHorizontalItemDivider.draw(c); + + if (childCount > 1) { // draw bottom + if (child instanceof LinearLayout) { // receipt header + left = ((ViewGroup) ((ViewGroup) child).getChildAt(1)).getChildAt(1).getLeft(); + } else { // receipt item + left = ((ViewGroup) child).getChildAt(1).getLeft(); + } + } + top = child.getBottom() + params.bottomMargin; + } else if (i == parent.getChildCount() - 1) { // draw bottom + top = child.getBottom() + params.bottomMargin; + } else { //draw middle + if (child instanceof LinearLayout) { + left = ((ViewGroup) ((ViewGroup) child).getChildAt(1)).getChildAt(1).getLeft(); + } else { + // peek if its a header then draw line from beginning + if (parent.getChildAt(i + 1) != null + && parent.getChildAt(i + 1) instanceof LinearLayout) { + left = 0; + } else { + left = ((ViewGroup) child).getChildAt(1).getLeft(); + } + } + top = child.getBottom() + params.bottomMargin; + } + bottom = top + mHorizontalItemDivider.getIntrinsicHeight(); + mHorizontalItemDivider.setBounds(left, top, right, bottom); + mHorizontalItemDivider.draw(c); + } + } +} diff --git a/receipt/src/main/res/layout/item_receipt.xml b/receipt/src/main/res/layout/item_receipt.xml index 02ca0277f..4388d4ab7 100644 --- a/receipt/src/main/res/layout/item_receipt.xml +++ b/receipt/src/main/res/layout/item_receipt.xml @@ -3,8 +3,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" - android:layout_height="@dimen/item_receipt_information_height" - android:background="@drawable/item_view_border"> + android:layout_height="@dimen/item_receipt_information_height"> Date: Fri, 7 Jun 2019 14:17:07 -0700 Subject: [PATCH 34/42] divider improvement --- .../view/HorizontalDividerItemDecorator.java | 4 +- .../view/ReceiptItemDividerDecorator.java | 43 ++----------------- 2 files changed, 6 insertions(+), 41 deletions(-) diff --git a/common/src/main/java/com/hyperwallet/android/common/view/HorizontalDividerItemDecorator.java b/common/src/main/java/com/hyperwallet/android/common/view/HorizontalDividerItemDecorator.java index 7076ba3de..3e9d3777f 100644 --- a/common/src/main/java/com/hyperwallet/android/common/view/HorizontalDividerItemDecorator.java +++ b/common/src/main/java/com/hyperwallet/android/common/view/HorizontalDividerItemDecorator.java @@ -30,8 +30,8 @@ public class HorizontalDividerItemDecorator extends RecyclerView.ItemDecoration { - private final Drawable mHorizontalItemDivider; - private final int mDefaultPadding; + protected final Drawable mHorizontalItemDivider; + protected final int mDefaultPadding; public HorizontalDividerItemDecorator(@NonNull final Context context, final boolean withHeaderDivider) { mHorizontalItemDivider = context.getResources().getDrawable(R.drawable.horizontal_divider, null); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java index 18f37e6fa..c937f19b6 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java @@ -2,8 +2,6 @@ import android.content.Context; import android.graphics.Canvas; -import android.graphics.Rect; -import android.graphics.drawable.Drawable; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -11,45 +9,12 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -public class ReceiptItemDividerDecorator extends RecyclerView.ItemDecoration { +import com.hyperwallet.android.common.view.HorizontalDividerItemDecorator; - private final Drawable mHorizontalItemDivider; - private final int mDefaultPadding; +public class ReceiptItemDividerDecorator extends HorizontalDividerItemDecorator { - public ReceiptItemDividerDecorator(@NonNull final Context context, final boolean withHeaderDivider) { - mHorizontalItemDivider = context.getResources().getDrawable( - com.hyperwallet.android.common.R.drawable.horizontal_divider, null); - // get dp from dimension configuration - if (withHeaderDivider) { - mDefaultPadding = (int) (context.getResources().getDimension( - com.hyperwallet.android.common.R.dimen.default_padding) - / context.getResources().getDisplayMetrics().density) * 2; - } else { - mDefaultPadding = 0; - } - } - - @Override - public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, - @NonNull RecyclerView.State state) { - super.getItemOffsets(outRect, view, parent, state); - - int itemCount = state.getItemCount(); - - final int itemPosition = parent.getChildAdapterPosition(view); - - // no position, leave it alone - if (itemPosition == RecyclerView.NO_POSITION) { - return; - } - - if (itemPosition == 0) { // first item - outRect.set(view.getPaddingLeft(), mDefaultPadding, view.getPaddingRight(), view.getPaddingBottom()); - } else if (itemCount > 0 && itemPosition == itemCount - 1) { // last item - outRect.set(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); - } else { // middle items - outRect.set(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom()); - } + ReceiptItemDividerDecorator(@NonNull final Context context, final boolean withHeaderDivider) { + super(context, withHeaderDivider); } @Override From c2b3374fc0c886cef4cf7840542d469515b0a46f Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Fri, 7 Jun 2019 15:20:02 -0700 Subject: [PATCH 35/42] added timezone default --- .../com/hyperwallet/android/common/util/DateUtils.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java b/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java index 6b49155da..3e03b0dda 100644 --- a/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java +++ b/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java @@ -23,6 +23,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; +import java.util.TimeZone; /** * Common HW-SDK UI Date Utility class, that will assist on safe presentation of date whatever the mobile device setting @@ -45,6 +46,7 @@ private DateUtils() { */ public static String toDateFormat(@NonNull final Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT, Locale.getDefault()); + dateFormat.setTimeZone(TimeZone.getDefault()); return dateFormat.format(date); } @@ -57,6 +59,7 @@ public static String toDateFormat(@NonNull final Date date) { */ public static String toDateFormat(@NonNull final Date date, @NonNull final String format) { SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault()); + dateFormat.setTimeZone(TimeZone.getDefault()); return dateFormat.format(date); } @@ -68,6 +71,7 @@ public static String toDateFormat(@NonNull final Date date, @NonNull final Strin */ public static String toDateTimeFormat(@NonNull final Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT, Locale.getDefault()); + dateFormat.setTimeZone(TimeZone.getDefault()); return dateFormat.format(date); } @@ -79,6 +83,7 @@ public static String toDateTimeFormat(@NonNull final Date date) { */ public static String toDateTimeMillisFormat(@NonNull final Date date) { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT_MILLISECONDS, Locale.getDefault()); + dateFormat.setTimeZone(TimeZone.getDefault()); return dateFormat.format(date); } @@ -92,6 +97,7 @@ public static String toDateTimeMillisFormat(@NonNull final Date date) { public static Date fromDateTimeString(@NonNull final String dateString) { try { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT, Locale.getDefault()); + dateFormat.setTimeZone(TimeZone.getDefault()); return dateFormat.parse(dateString); } catch (ParseException e) { throw new IllegalArgumentException("An exception occurred when attempting to parse " + @@ -103,6 +109,7 @@ public static Date fromDateTimeString(@NonNull final String dateString) { static Date fromDateTimeString(@NonNull final String dateString, @NonNull final String format) { try { SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault()); + dateFormat.setTimeZone(TimeZone.getDefault()); return dateFormat.parse(dateString); } catch (ParseException e) { throw new IllegalArgumentException("An exception occurred when attempting to parse " + From c23374d2e2731cf222e3f1c8bc91dd16211625b1 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 10 Jun 2019 08:34:12 -0700 Subject: [PATCH 36/42] fixed multi-timezone support --- .../android/common/util/DateUtils.java | 14 +++++++++----- .../android/common/util/DateUtilsTest.java | 19 +++++++++++++------ .../view/ReceiptItemDividerDecorator.java | 14 ++++++++++---- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java b/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java index 3e03b0dda..7fd65e5aa 100644 --- a/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java +++ b/common/src/main/java/com/hyperwallet/android/common/util/DateUtils.java @@ -28,12 +28,16 @@ /** * Common HW-SDK UI Date Utility class, that will assist on safe presentation of date whatever the mobile device setting * is set Locale, Timezone and etc... that dictates how that dates are being presented + * + * Moreover all date string to {@link Date} object conversion is automatically converted from + * GMT date string from API to locale Date set by the phone */ public final class DateUtils { private static final String DATE_FORMAT = "yyyy-MM-dd"; private static final String DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; private static final String DATE_TIME_FORMAT_MILLISECONDS = "yyyy-MM-dd'T'HH:mm:ss.SSS"; + private static final TimeZone API_TIMEZONE = TimeZone.getTimeZone("GMT"); private DateUtils() { } @@ -88,16 +92,16 @@ public static String toDateTimeMillisFormat(@NonNull final Date date) { } /** - * Creates a Date object from string date + * Creates a Date object from string date using API Timezone * - * @param dateString String date - * @return date Date object + * @param dateString String date from API with GMT timezone + * @return date Date object converted to local timezone * @throws IllegalArgumentException when string is un-parsable */ public static Date fromDateTimeString(@NonNull final String dateString) { try { SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT, Locale.getDefault()); - dateFormat.setTimeZone(TimeZone.getDefault()); + dateFormat.setTimeZone(API_TIMEZONE); return dateFormat.parse(dateString); } catch (ParseException e) { throw new IllegalArgumentException("An exception occurred when attempting to parse " + @@ -109,7 +113,7 @@ public static Date fromDateTimeString(@NonNull final String dateString) { static Date fromDateTimeString(@NonNull final String dateString, @NonNull final String format) { try { SimpleDateFormat dateFormat = new SimpleDateFormat(format, Locale.getDefault()); - dateFormat.setTimeZone(TimeZone.getDefault()); + dateFormat.setTimeZone(API_TIMEZONE); return dateFormat.parse(dateString); } catch (ParseException e) { throw new IllegalArgumentException("An exception occurred when attempting to parse " + diff --git a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java index 2bac845eb..27102325b 100644 --- a/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java +++ b/common/src/test/java/com/hyperwallet/android/common/util/DateUtilsTest.java @@ -4,12 +4,19 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import org.junit.Before; import org.junit.Test; import java.util.Date; +import java.util.TimeZone; public class DateUtilsTest { + @Before + public void setTestLocalTimezone() { + TimeZone.setDefault(TimeZone.getTimeZone("PST")); + } + @Test public void testToDateFormat_returnsExpectedStringFormat() { String dateString = "2019-05-27"; @@ -34,23 +41,23 @@ public void testToDateFormat_returnsExpectedStringFormatFromParameter() { @Test public void testToDateTimeFormat_returnsExpectedStringFormat() { - String dateString = "2019-11-27T15:57:49"; - Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:49"); + String localTime = "2019-11-27T07:57:00"; + Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:00"); // test String targetDate = DateUtils.toDateTimeFormat(dateTarget); assertThat(targetDate, is(notNullValue())); - assertThat(targetDate, is(dateString)); + assertThat(targetDate, is(localTime)); } @Test public void testToDateTimeMillisFormat_returnsExpectedStringFormat() { - String dateString = "2019-11-27T15:57:09.450"; - Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:09.450", "yyyy-MM-dd'T'HH:mm:ss.SSS"); + String localTime = "2019-11-27T07:57:00.000"; + Date dateTarget = DateUtils.fromDateTimeString("2019-11-27T15:57:00.000", "yyyy-MM-dd'T'HH:mm:ss.SSS"); // test String targetDate = DateUtils.toDateTimeMillisFormat(dateTarget); assertThat(targetDate, is(notNullValue())); - assertThat(targetDate, is(dateString)); + assertThat(targetDate, is(localTime)); } } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java index c937f19b6..57a3e4a01 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java @@ -47,10 +47,16 @@ public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull } else if (i == parent.getChildCount() - 1) { // draw bottom top = child.getBottom() + params.bottomMargin; } else { //draw middle - if (child instanceof LinearLayout) { - left = ((ViewGroup) ((ViewGroup) child).getChildAt(1)).getChildAt(1).getLeft(); - } else { - // peek if its a header then draw line from beginning + if (child instanceof LinearLayout) { // header found + // peek if next is a header then draw line from beginning + if (parent.getChildAt(i + 1) != null + && parent.getChildAt(i + 1) instanceof LinearLayout) { + left = 0; + } else { + left = ((ViewGroup) ((ViewGroup) child).getChildAt(1)).getChildAt(1).getLeft(); + } + } else { // non header + // peek if next is a header then draw line from beginning if (parent.getChildAt(i + 1) != null && parent.getChildAt(i + 1) instanceof LinearLayout) { left = 0; From f3f8578c6b467160bbef60f8720557d84a0420e8 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 10 Jun 2019 08:35:15 -0700 Subject: [PATCH 37/42] added license --- .../view/ReceiptItemDividerDecorator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java index 57a3e4a01..e3434239a 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java @@ -1,3 +1,19 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2019 Hyperwallet Systems Inc. + * + * 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 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.receipt.view; import android.content.Context; From 41384fe255aecc9cb0232bc99fa4f7dbd706a055 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Mon, 10 Jun 2019 15:55:24 -0700 Subject: [PATCH 38/42] comment --- .../hyperwallet/android/receipt/view/ListReceiptActivity.java | 2 +- .../android/receipt/repository/ReceiptDataSourceTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java index 97146e25a..8a9695f43 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java @@ -111,7 +111,7 @@ public void retry() { fragment.retry(); } - public void showErrorOnLoadReceipt(@NonNull final List errors) { + private void showErrorOnLoadReceipt(@NonNull final List errors) { FragmentManager fragmentManager = getSupportFragmentManager(); DefaultErrorDialogFragment fragment = (DefaultErrorDialogFragment) fragmentManager.findFragmentByTag(DefaultErrorDialogFragment.TAG); diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java index c4f4894e5..51147e4b7 100644 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java @@ -344,7 +344,7 @@ public Object answer(InvocationOnMock invocation) { } @Test - public void testRetry_LoadAfter() { + public void testRetry_loadAfter() { final HyperwalletError error = new HyperwalletError("test message", "TEST_CODE"); List errorList = new ArrayList<>(); errorList.add(error); From fa4f4d3ad1c38e9a0eb62baefc11ec56462756df Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 11 Jun 2019 07:29:48 -0700 Subject: [PATCH 39/42] added fix for HW-53592 --- .../receipt/repository/ReceiptDataSource.java | 11 +++++---- .../receipt/repository/ReceiptRepository.java | 5 ++-- .../repository/ReceiptRepositoryImpl.java | 5 ++-- .../receipt/view/ListReceiptActivity.java | 24 ++++++++++++------- .../viewmodel/ListReceiptViewModel.java | 17 +++++-------- .../repository/ReceiptDataSourceTest.java | 17 ++++++++----- 6 files changed, 44 insertions(+), 35 deletions(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java index e936da18c..5320214fb 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptDataSource.java @@ -25,6 +25,7 @@ import androidx.paging.PageKeyedDataSource; import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.common.viewmodel.Event; import com.hyperwallet.android.exception.HyperwalletException; import com.hyperwallet.android.listener.HyperwalletListener; import com.hyperwallet.android.model.HyperwalletErrors; @@ -42,7 +43,7 @@ public class ReceiptDataSource extends PageKeyedDataSource { private static final int YEAR_BEFORE_NOW = -1; private final Calendar mCalendarYearBeforeNow; - private final MutableLiveData mErrors = new MutableLiveData<>(); + private final MutableLiveData> mErrors = new MutableLiveData<>(); private final MutableLiveData mIsFetchingData = new MutableLiveData<>(); private LoadInitialCallback mLoadInitialCallback; private LoadInitialParams mLoadInitialParams; @@ -90,7 +91,7 @@ public void onSuccess(@Nullable HyperwalletPageList result) { @Override public void onFailure(HyperwalletException exception) { mIsFetchingData.postValue(Boolean.FALSE); - mErrors.postValue(exception.getHyperwalletErrors()); + mErrors.postValue(new Event<>(exception.getHyperwalletErrors())); } @Override @@ -148,7 +149,7 @@ public void onSuccess(@Nullable HyperwalletPageList result) { @Override public void onFailure(HyperwalletException exception) { mIsFetchingData.postValue(Boolean.FALSE); - mErrors.postValue(exception.getHyperwalletErrors()); + mErrors.postValue(new Event<>(exception.getHyperwalletErrors())); } @Override @@ -172,9 +173,9 @@ void retry() { /** * Retrieve reference of Hyperwallet errors inorder for consumers to observe on data changes * - * @return Live data of {@link HyperwalletErrors} + * @return Live event data of {@link HyperwalletErrors} * */ - public LiveData getErrors() { + public LiveData> getErrors() { return mErrors; } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepository.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepository.java index 2161b55d2..542d03c89 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepository.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepository.java @@ -19,6 +19,7 @@ import androidx.lifecycle.LiveData; import androidx.paging.PagedList; +import com.hyperwallet.android.common.viewmodel.Event; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.receipt.Receipt; @@ -44,9 +45,9 @@ public interface ReceiptRepository { /** * Error information, consumer can subscribe of errors occur during data retrieval * - * @return live data list of errors if there's an error + * @return live event data list of errors if there's an error */ - LiveData getErrors(); + LiveData> getErrors(); /** * Reload receipt information, usually invoked when error is raised after the first load and consumer opts to retry diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java index f36ea4261..cde7edd94 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/repository/ReceiptRepositoryImpl.java @@ -20,6 +20,7 @@ import androidx.paging.LivePagedListBuilder; import androidx.paging.PagedList; +import com.hyperwallet.android.common.viewmodel.Event; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.receipt.Receipt; @@ -33,7 +34,7 @@ public class ReceiptRepositoryImpl implements ReceiptRepository { private final ReceiptDataSourceFactory mDataSourceFactory; private final LiveData mReceiptDataSourceLiveData; - private LiveData mErrorsLiveData; + private LiveData> mErrorsLiveData; private LiveData mIsFetchingData; private LiveData> mReceiptsLiveData; @@ -73,7 +74,7 @@ public LiveData isLoading() { * @see {@link ReceiptRepository#getErrors()} * */ @Override - public LiveData getErrors() { + public LiveData> getErrors() { if (mErrorsLiveData == null) { mErrorsLiveData = mReceiptDataSourceLiveData.getValue().getErrors(); } diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java index 8a9695f43..e7f57c821 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ListReceiptActivity.java @@ -34,6 +34,7 @@ import com.hyperwallet.android.common.view.error.OnNetworkErrorCallback; import com.hyperwallet.android.common.viewmodel.Event; import com.hyperwallet.android.model.HyperwalletError; +import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.receipt.R; import com.hyperwallet.android.receipt.repository.ReceiptRepositoryFactory; import com.hyperwallet.android.receipt.viewmodel.ListReceiptViewModel; @@ -66,21 +67,26 @@ public void onClick(View v) { .ListReceiptViewModelFactory(factory.getReceiptRepository())) .get(ListReceiptViewModel.class); - mListReceiptViewModel.getReceiptErrors().observe(this, - new Observer>>() { - @Override - public void onChanged(Event> listEvent) { - if (!listEvent.isContentConsumed()) { - showErrorOnLoadReceipt(listEvent.getContent()); - } - } - }); + mListReceiptViewModel.getReceiptErrors().observe(this, new Observer>() { + @Override + public void onChanged(Event event) { + if (event != null && !event.isContentConsumed()) { + showErrorOnLoadReceipt(event.getContent().getErrors()); + } + } + }); if (savedInstanceState == null) { initFragment(ListReceiptFragment.newInstance()); } } + @Override + protected void onDestroy() { + super.onDestroy(); + ReceiptRepositoryFactory.clearInstance(); + } + @Override protected void onActivityResult(final int requestCode, final int resultCode, @Nullable final Intent data) { super.onActivityResult(requestCode, resultCode, data); diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java index b5563f359..57f41b5c1 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/viewmodel/ListReceiptViewModel.java @@ -25,17 +25,14 @@ import androidx.paging.PagedList; import com.hyperwallet.android.common.viewmodel.Event; -import com.hyperwallet.android.model.HyperwalletError; import com.hyperwallet.android.model.HyperwalletErrors; import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.receipt.repository.ReceiptRepository; -import java.util.List; - public class ListReceiptViewModel extends ViewModel { - private MutableLiveData>> mErrorEvent = new MutableLiveData<>(); - private Observer mErrorEventObserver; + private MutableLiveData> mErrorEvent = new MutableLiveData<>(); + private Observer> mErrorEventObserver; private ReceiptRepository mReceiptRepository; private ListReceiptViewModel(@NonNull final ReceiptRepository receiptRepository) { @@ -44,12 +41,10 @@ private ListReceiptViewModel(@NonNull final ReceiptRepository receiptRepository) mReceiptRepository.loadReceipts(); // register one time error event observer - mErrorEventObserver = new Observer() { + mErrorEventObserver = new Observer>() { @Override - public void onChanged(HyperwalletErrors errors) { - if (errors != null && !errors.getErrors().isEmpty()) { - mErrorEvent.setValue(new Event<>(errors.getErrors())); - } + public void onChanged(Event event) { + mErrorEvent.postValue(event); } }; mReceiptRepository.getErrors().observeForever(mErrorEventObserver); @@ -59,7 +54,7 @@ public LiveData isLoadingData() { return mReceiptRepository.isLoading(); } - public LiveData>> getReceiptErrors() { + public LiveData> getReceiptErrors() { return mErrorEvent; } diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java index 51147e4b7..efe3c4627 100644 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java @@ -188,9 +188,12 @@ public Object answer(InvocationOnMock invocation) { verify(mInitialCallback, never()).onResult(ArgumentMatchers.anyList(), anyInt(), anyInt()); assertThat(mReceiptDataSource.getErrors().getValue(), is(notNullValue())); - assertThat(mReceiptDataSource.getErrors().getValue().getErrors(), Matchers.hasSize(1)); - assertThat(mReceiptDataSource.getErrors().getValue().getErrors().get(0).getCode(), is("TEST_CODE")); - assertThat(mReceiptDataSource.getErrors().getValue().getErrors().get(0).getMessage(), is("test message")); + assertThat(mReceiptDataSource.getErrors().getValue().getContent().getErrors(), + Matchers.hasSize(1)); + assertThat(mReceiptDataSource.getErrors().getValue().getContent().getErrors().get(0).getCode(), + is("TEST_CODE")); + assertThat(mReceiptDataSource.getErrors().getValue().getContent().getErrors().get(0).getMessage(), + is("test message")); assertThat(mReceiptDataSource.isFetchingData().getValue(), is(false)); } @@ -336,9 +339,11 @@ public Object answer(InvocationOnMock invocation) { // error occurred, this will save params and callback assertThat(mReceiptDataSource.getErrors().getValue(), is(notNullValue())); - assertThat(mReceiptDataSource.getErrors().getValue().getErrors(), Matchers.hasSize(1)); - assertThat(mReceiptDataSource.getErrors().getValue().getErrors().get(0).getCode(), is("LOAD_AFTER_CODE")); - assertThat(mReceiptDataSource.getErrors().getValue().getErrors().get(0).getMessage(), + assertThat(mReceiptDataSource.getErrors().getValue().getContent().getErrors(), + Matchers.hasSize(1)); + assertThat(mReceiptDataSource.getErrors().getValue().getContent().getErrors().get(0).getCode(), + is("LOAD_AFTER_CODE")); + assertThat(mReceiptDataSource.getErrors().getValue().getContent().getErrors().get(0).getMessage(), is("test message load after")); assertThat(mReceiptDataSource.isFetchingData().getValue(), is(false)); } From 2c58aa68e813d8816403ed076b1e18a75a72493f Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 11 Jun 2019 11:23:34 -0700 Subject: [PATCH 40/42] added header check --- .../android/receipt/view/ReceiptItemDividerDecorator.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java index e3434239a..cee8a25c7 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java @@ -56,7 +56,13 @@ public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull if (child instanceof LinearLayout) { // receipt header left = ((ViewGroup) ((ViewGroup) child).getChildAt(1)).getChildAt(1).getLeft(); } else { // receipt item - left = ((ViewGroup) child).getChildAt(1).getLeft(); + // peek if next is a header then draw line from beginning + if (parent.getChildAt(i + 1) != null + && parent.getChildAt(i + 1) instanceof LinearLayout) { + left = 0; + } else { + left = ((ViewGroup) child).getChildAt(1).getLeft(); + } } } top = child.getBottom() + params.bottomMargin; From ef55ddad44ea6d3fec4584c387d0cbf7fe7084f1 Mon Sep 17 00:00:00 2001 From: Peter Olamit Date: Tue, 11 Jun 2019 11:43:17 -0700 Subject: [PATCH 41/42] added header check first element --- .../android/receipt/view/ReceiptItemDividerDecorator.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java index cee8a25c7..c61b22e5d 100644 --- a/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java +++ b/receipt/src/main/java/com/hyperwallet/android/receipt/view/ReceiptItemDividerDecorator.java @@ -54,7 +54,13 @@ public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull if (childCount > 1) { // draw bottom if (child instanceof LinearLayout) { // receipt header - left = ((ViewGroup) ((ViewGroup) child).getChildAt(1)).getChildAt(1).getLeft(); + // peek if next is a header then draw line from beginning + if (parent.getChildAt(i + 1) != null + && parent.getChildAt(i + 1) instanceof LinearLayout) { + left = 0; + } else { + left = ((ViewGroup) ((ViewGroup) child).getChildAt(1)).getChildAt(1).getLeft(); + } } else { // receipt item // peek if next is a header then draw line from beginning if (parent.getChildAt(i + 1) != null From eee9009c315b892901f7aaf9459c8214284a4b0a Mon Sep 17 00:00:00 2001 From: Anna <48258136+azakrevska-epam@users.noreply.github.com> Date: Wed, 12 Jun 2019 00:10:22 +0300 Subject: [PATCH 42/42] HW-53401. Added ui tests for list receipts (#34) --- receipt/build.gradle | 6 + receipt/src/androidTest/AndroidManifest.xml | 9 + ...yperwalletInstrumentedTestApplication.java | 31 ++ .../android/receipt/ListReceiptsTest.java | 265 ++++++++++++++++++ .../HyperwalletExternalResourceManager.java | 3 +- .../rule/HyperwalletMockWebServer.java | 115 ++++++++ .../android/util/EspressoUtils.java | 187 ++++++++++++ .../android/util/NestedScrollToAction.java | 41 +++ .../util/RecyclerViewCountAssertion.java | 30 ++ .../util/TestAuthenticationProvider.java | 51 ++++ receipt/src/main/AndroidManifest.xml | 4 +- .../main/res/xml/network_security_config.xml | 6 + .../repository/ReceiptDataSourceTest.java | 2 +- .../HyperwalletExternalResourceManager.java | 72 +++++ .../authentication_token_response.json | 3 + .../resources/receipt_credit_response.json | 30 ++ .../resources/receipt_debit_response.json | 25 ++ .../test/resources/receipt_list_response.json | 64 +++++ .../receipt_unknown_type_response.json | 30 ++ ui/src/androidTest/AndroidManifest.xml | 2 +- 20 files changed, 972 insertions(+), 4 deletions(-) create mode 100644 receipt/src/androidTest/AndroidManifest.xml create mode 100644 receipt/src/androidTest/java/com/hyperwallet/android/HyperwalletInstrumentedTestApplication.java create mode 100644 receipt/src/androidTest/java/com/hyperwallet/android/receipt/ListReceiptsTest.java rename receipt/src/{test/java/com/hyperwallet/android/receipt => androidTest/java/com/hyperwallet/android}/rule/HyperwalletExternalResourceManager.java (98%) create mode 100644 receipt/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletMockWebServer.java create mode 100644 receipt/src/androidTest/java/com/hyperwallet/android/util/EspressoUtils.java create mode 100644 receipt/src/androidTest/java/com/hyperwallet/android/util/NestedScrollToAction.java create mode 100644 receipt/src/androidTest/java/com/hyperwallet/android/util/RecyclerViewCountAssertion.java create mode 100644 receipt/src/androidTest/java/com/hyperwallet/android/util/TestAuthenticationProvider.java create mode 100644 receipt/src/main/res/xml/network_security_config.xml create mode 100644 receipt/src/test/java/com/hyperwallet/android/rule/HyperwalletExternalResourceManager.java create mode 100644 receipt/src/test/resources/authentication_token_response.json create mode 100644 receipt/src/test/resources/receipt_credit_response.json create mode 100644 receipt/src/test/resources/receipt_debit_response.json create mode 100644 receipt/src/test/resources/receipt_list_response.json create mode 100644 receipt/src/test/resources/receipt_unknown_type_response.json diff --git a/receipt/build.gradle b/receipt/build.gradle index dac1fd822..6aa8d9d42 100644 --- a/receipt/build.gradle +++ b/receipt/build.gradle @@ -11,7 +11,13 @@ dependencies { implementation "androidx.paging:paging-runtime:$pagingRuntimeVersion" testImplementation "org.robolectric:robolectric:$robolectricVersion" + androidTestImplementation "androidx.test:rules:$testRulesVersion" + androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion" + androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion" + androidTestImplementation "com.squareup.okhttp3:mockwebserver:$mockServerVersion" + androidTestImplementation "com.squareup.leakcanary:leakcanary-android-instrumentation:$leakcanaryVersion" + androidTestImplementation "com.squareup.leakcanary:leakcanary-support-fragment:$leakcanaryVersion" } def aarFile = file("$buildDir/outputs/aar/receipt-$version" + ".aar") diff --git a/receipt/src/androidTest/AndroidManifest.xml b/receipt/src/androidTest/AndroidManifest.xml new file mode 100644 index 000000000..8495adb45 --- /dev/null +++ b/receipt/src/androidTest/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/HyperwalletInstrumentedTestApplication.java b/receipt/src/androidTest/java/com/hyperwallet/android/HyperwalletInstrumentedTestApplication.java new file mode 100644 index 000000000..dfc559d2e --- /dev/null +++ b/receipt/src/androidTest/java/com/hyperwallet/android/HyperwalletInstrumentedTestApplication.java @@ -0,0 +1,31 @@ +package com.hyperwallet.android; + + +import android.app.Application; + +import com.squareup.leakcanary.InstrumentationLeakDetector; +import com.squareup.leakcanary.LeakCanary; + +public class HyperwalletInstrumentedTestApplication extends Application { + + @Override + public void onCreate() { + + super.onCreate(); + if (LeakCanary.isInAnalyzerProcess(this)) { + // This process is dedicated to LeakCanary for heap analysis. + // You should not init your app in this process. + return; + } + installLeakCanary(); + } + + + protected void installLeakCanary() { + + InstrumentationLeakDetector.instrumentationRefWatcher(this) + .buildAndInstall(); + + } + +} \ No newline at end of file diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/receipt/ListReceiptsTest.java b/receipt/src/androidTest/java/com/hyperwallet/android/receipt/ListReceiptsTest.java new file mode 100644 index 000000000..5eb430354 --- /dev/null +++ b/receipt/src/androidTest/java/com/hyperwallet/android/receipt/ListReceiptsTest.java @@ -0,0 +1,265 @@ +package com.hyperwallet.android.receipt; + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withParent; +import static androidx.test.espresso.matcher.ViewMatchers.withText; + +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.instanceOf; + +import static java.net.HttpURLConnection.HTTP_NO_CONTENT; +import static java.net.HttpURLConnection.HTTP_OK; + +import static com.hyperwallet.android.util.EspressoUtils.atPosition; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.widget.TextView; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.rule.ActivityTestRule; + +import com.hyperwallet.android.Hyperwallet; +import com.hyperwallet.android.receipt.repository.ReceiptRepositoryFactory; +import com.hyperwallet.android.receipt.view.ListReceiptActivity; +import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; +import com.hyperwallet.android.rule.HyperwalletMockWebServer; +import com.hyperwallet.android.util.RecyclerViewCountAssertion; +import com.hyperwallet.android.util.TestAuthenticationProvider; + +import org.junit.After; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Locale; + +@RunWith(AndroidJUnit4.class) +public class ListReceiptsTest { + + @ClassRule + public static HyperwalletExternalResourceManager sResourceManager = new HyperwalletExternalResourceManager(); + @Rule + public HyperwalletMockWebServer mMockWebServer = new HyperwalletMockWebServer(8080); + @Rule + public ActivityTestRule mActivityTestRule = + new ActivityTestRule<>(ListReceiptActivity.class, true, false); + + @Before + public void setup() { + Hyperwallet.getInstance(new TestAuthenticationProvider()); + + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("authentication_token_response.json")).mock(); + + setLocale(Locale.US); + } + + @After + public void cleanup() { + ReceiptRepositoryFactory.clearInstance(); + } + + @Test + public void testListReceipts_userHasMultipleTransactions() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("receipt_list_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + // run test + mActivityTestRule.launchActivity(null); + + // assert + onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))) + .check(matches(withText(R.string.title_activity_receipt_list))); + onView(withId(R.id.list_receipts)).check(matches(isDisplayed())); + + onView(withId(R.id.list_receipts)) + .check(matches(atPosition(0, hasDescendant(withText("June 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, + hasDescendant(withText(com.hyperwallet.android.receipt.R.string.credit))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("Payment"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("+ 20.00"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("June 07, 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("USD"))))); + + onView(withId(R.id.list_receipts)).check(matches(atPosition(1, + hasDescendant(withText(com.hyperwallet.android.receipt.R.string.credit))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(1, hasDescendant(withText("Payment"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(1, hasDescendant(withText("+ 25.00"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(1, hasDescendant(withText("June 02, 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(1, hasDescendant(withText("CAD"))))); + + onView(withId(R.id.list_receipts)).check(matches(atPosition(2, + hasDescendant(withText(com.hyperwallet.android.receipt.R.string.debit))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(2, hasDescendant(withText("Card Activation Fee"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(2, hasDescendant(withText("- 1.95"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(2, hasDescendant(withText("June 01, 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(2, hasDescendant(withText("USD"))))); + + onView(withId(R.id.list_receipts)) + .check(matches(atPosition(3, hasDescendant(withText("December 2018"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(3, + hasDescendant(withText(com.hyperwallet.android.receipt.R.string.debit))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(3, hasDescendant(withText("Card Load"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(3, hasDescendant(withText("- 18.05"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(3, hasDescendant(withText("December 01, 2018"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(3, hasDescendant(withText("USD"))))); + + onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(4)); + } + + @Test + public void testListReceipts_displayCreditTransaction() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("receipt_credit_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + // run test + mActivityTestRule.launchActivity(null); + + // assert + onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))) + .check(matches(withText(R.string.title_activity_receipt_list))); + onView(withId(R.id.list_receipts)).check(matches(isDisplayed())); + + onView(withId(R.id.list_receipts)) + .check(matches(atPosition(0, hasDescendant(withText("June 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, + hasDescendant(withText(com.hyperwallet.android.receipt.R.string.credit))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText(R.string.payment))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("+ 25.00"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("June 02, 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("CAD"))))); + + onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(1)); + } + + @Test + public void testListReceipts_displayDebitTransaction() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("receipt_debit_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + // run test + mActivityTestRule.launchActivity(null); + + // assert + onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))) + .check(matches(withText(R.string.title_activity_receipt_list))); + onView(withId(R.id.list_receipts)).check(matches(isDisplayed())); + + onView(withId(R.id.list_receipts)) + .check(matches(atPosition(0, hasDescendant(withText("May 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, + hasDescendant(withText(com.hyperwallet.android.receipt.R.string.debit))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText(R.string.transfer_to_prepaid_card))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("- 18.05"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("May 02, 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("USD"))))); + + onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(1)); + } + + @Test + public void testListReceipts_displayUnknownTransactionType() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("receipt_unknown_type_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + // run test + mActivityTestRule.launchActivity(null); + + // assert + onView(allOf(instanceOf(TextView.class), withParent(withId(R.id.toolbar)))) + .check(matches(withText(R.string.title_activity_receipt_list))); + onView(withId(R.id.list_receipts)).check(matches(isDisplayed())); + + onView(withId(R.id.list_receipts)) + .check(matches(atPosition(0, hasDescendant(withText("June 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, + hasDescendant(withText(com.hyperwallet.android.receipt.R.string.credit))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText(R.string.unknown_type))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("+ 25.00"))))); + onView(withId(R.id.list_receipts)).check( + matches(atPosition(0, hasDescendant(withText("June 02, 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("CAD"))))); + + onView(withId(R.id.list_receipts)).check(new RecyclerViewCountAssertion(1)); + } + + @Test + public void testListReceipt_userHasNoTransactions() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + // run test + 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.title_activity_receipt_list))); + //todo: check empty view when it will be ready + } + + @Test + public void testListReceipts_checkDateTextOnLocaleChange() { + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_OK).withBody(sResourceManager + .getResourceContent("receipt_debit_response.json")).mock(); + mMockWebServer.mockResponse().withHttpResponseCode(HTTP_NO_CONTENT).withBody("").mock(); + + setLocale(Locale.ITALY); + // run test + mActivityTestRule.launchActivity(null); + // assert + onView(withId(R.id.list_receipts)) + .check(matches(atPosition(0, hasDescendant(withText("maggio 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("maggio 02, 2019"))))); + mActivityTestRule.finishActivity(); + setLocale(Locale.US); + mActivityTestRule.launchActivity(null); + onView(withId(R.id.list_receipts)) + .check(matches(atPosition(0, hasDescendant(withText("May 2019"))))); + onView(withId(R.id.list_receipts)).check(matches(atPosition(0, hasDescendant(withText("May 02, 2019"))))); + } + + private void setLocale(Locale locale) { + Context context = ApplicationProvider.getApplicationContext(); + Locale.setDefault(locale); + Resources resources = context.getResources(); + Configuration configuration = resources.getConfiguration(); + if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.JELLY_BEAN) { + configuration.setLocale(locale); + } else { + configuration.locale = locale; + } + resources.updateConfiguration(configuration, resources.getDisplayMetrics()); + } +} diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/rule/HyperwalletExternalResourceManager.java b/receipt/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletExternalResourceManager.java similarity index 98% rename from receipt/src/test/java/com/hyperwallet/android/receipt/rule/HyperwalletExternalResourceManager.java rename to receipt/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletExternalResourceManager.java index 0c5f6a743..e7e546063 100644 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/rule/HyperwalletExternalResourceManager.java +++ b/receipt/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletExternalResourceManager.java @@ -1,4 +1,4 @@ -package com.hyperwallet.android.receipt.rule; +package com.hyperwallet.android.rule; import org.junit.rules.TestWatcher; import org.junit.runner.Description; @@ -35,6 +35,7 @@ public String getResourceContent(final String resourceName) { } private String getContent(final String resourceName) { + URL resource = classLoader.getResource(resourceName); InputStream inputStream = null; Writer writer = new StringWriter(); diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletMockWebServer.java b/receipt/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletMockWebServer.java new file mode 100644 index 000000000..9f42f6128 --- /dev/null +++ b/receipt/src/androidTest/java/com/hyperwallet/android/rule/HyperwalletMockWebServer.java @@ -0,0 +1,115 @@ +package com.hyperwallet.android.rule; + +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; + +import java.io.IOException; +import java.net.HttpURLConnection; + +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; + +public final class HyperwalletMockWebServer extends TestWatcher { + + private MockWebServer mServer; + private int port; + + public HyperwalletMockWebServer(int port) { + this.port = port; + } + + @Override + protected void starting(Description description) { + super.starting(description); + mServer = new MockWebServer(); + try { + mServer.start(port); + } catch (IOException e) { + throw new IllegalStateException("Unable to start mock server", e); + } + } + + @Override + protected void finished(Description description) { + super.finished(description); + try { + mServer.shutdown(); + mServer.close(); + } catch (IOException e) { + throw new IllegalStateException("Un error occurred when shutting down mock server", e); + } + } + + public HyperwalletMockResponse mockResponse() { + return new Builder(mServer).build(); + } + + public MockWebServer getServer() { + return mServer; + } + + public static class HyperwalletMockResponse { + + private String path; + private String body; + private int httpResponseCode; + private Builder builder; + + HyperwalletMockResponse(Builder builder) { + this.path = builder.path; + this.httpResponseCode = builder.responseCode; + this.body = builder.body; + this.builder = builder; + } + + public HyperwalletMockResponse withHttpResponseCode(final int code) { + builder.responseCode(code); + return builder.build(); + } + + public HyperwalletMockResponse withBody(final String body) { + builder.body(body); + return builder.build(); + } + + public void mock() { + mockRequest(); + } + + private String mockRequest() { + builder.server.enqueue(new MockResponse().setResponseCode(httpResponseCode).setBody(body)); + return builder.server.url(path).toString(); + } + + } + + private static class Builder { + + private String path; + private String body; + private int responseCode; + private MockWebServer server; + + + Builder(final MockWebServer server) { + this.path = ""; + this.responseCode = HttpURLConnection.HTTP_OK; + this.body = ""; + this.server = server; + } + + Builder responseCode(final int code) { + this.responseCode = code; + return this; + } + + Builder body(final String body) { + this.body = body; + return this; + } + + HyperwalletMockResponse build() { + return new HyperwalletMockResponse(this); + } + } +} diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/util/EspressoUtils.java b/receipt/src/androidTest/java/com/hyperwallet/android/util/EspressoUtils.java new file mode 100644 index 000000000..92a711f96 --- /dev/null +++ b/receipt/src/androidTest/java/com/hyperwallet/android/util/EspressoUtils.java @@ -0,0 +1,187 @@ +package com.hyperwallet.android.util; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; +import androidx.test.espresso.ViewAction; +import androidx.test.espresso.action.ViewActions; +import androidx.test.espresso.matcher.BoundedMatcher; + +import com.google.android.material.textfield.TextInputLayout; + +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +import java.util.Objects; + +public class EspressoUtils { + + public static Matcher withHint(final String expectedHint) { + return new TypeSafeMatcher() { + + @Override + public boolean matchesSafely(View view) { + if (!(view instanceof TextInputLayout)) { + return false; + } + + String hint = Objects.toString(((TextInputLayout) view).getHint()); + return expectedHint.equals(hint); + } + + @Override + public void describeTo(Description description) { + description.appendText(expectedHint); + } + }; + } + + public static Matcher hasErrorText(final String expectedErrorMessage) { + return new TypeSafeMatcher() { + + @Override + public boolean matchesSafely(View view) { + if (!(view instanceof TextInputLayout)) { + return false; + } + + String errorMessage = Objects.toString(((TextInputLayout) view).getError()); + return expectedErrorMessage.equals(errorMessage); + } + + @Override + public void describeTo(Description description) { + description.appendText(expectedErrorMessage); + } + }; + } + + public static Matcher hasErrorText(final int resourceId) { + return new TypeSafeMatcher() { + + @Override + public boolean matchesSafely(View view) { + if (!(view instanceof TextInputLayout)) { + return false; + } + String expectedErrorMessage = view.getResources().getString(resourceId); + String errorMessage = Objects.toString(((TextInputLayout) view).getError()); + + return expectedErrorMessage.equals(errorMessage); + } + + @Override + public void describeTo(Description description) { + } + }; + } + + public static Matcher withDrawable(final int resourceId) { + return new TypeSafeMatcher() { + + @Override + public boolean matchesSafely(View view) { + if (!(view instanceof ImageView)) { + return false; + } + + Drawable drawable = ((ImageView) view).getDrawable(); + if (drawable == null) { + return false; + } + Drawable expectedDrawable = view.getContext().getResources().getDrawable(resourceId); + + Bitmap bitmap = getBitmap(drawable); + Bitmap expectedBitmap = getBitmap(expectedDrawable); + + return bitmap.sameAs(expectedBitmap); + } + + @Override + public void describeTo(Description description) { + } + }; + } + + public static Matcher atPosition(final int position, @NonNull final Matcher matcher) { + return new BoundedMatcher(RecyclerView.class) { + + @Override + protected boolean matchesSafely(final RecyclerView view) { + RecyclerView.ViewHolder viewHolder = view.findViewHolderForAdapterPosition(position); + + if (viewHolder == null) { + return false; + } + + return matcher.matches(viewHolder.itemView); + } + + @Override + public void describeTo(Description description) { + description.appendText("has item at position " + position + ": "); + matcher.describeTo(description); + } + }; + } + + public static ViewAction nestedScrollTo() { + return ViewActions.actionWithAssertions(new NestedScrollToAction()); + } + + private static Bitmap getBitmap(Drawable drawable) { + Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), + drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + + return bitmap; + } + + public static Matcher hasNoErrorText() { + return new TypeSafeMatcher() { + + @Override + public boolean matchesSafely(View view) { + if (!(view instanceof TextInputLayout)) { + return false; + } + return ((TextInputLayout) view).getError() == null; + } + + @Override + public void describeTo(Description description) { + description.appendText("has no error text: "); + } + }; + } + + public static Matcher hasEmptyText() { + return new TypeSafeMatcher() { + + @Override + public boolean matchesSafely(View view) { + if (!(view instanceof EditText)) { + return false; + } + String text = ((EditText) view).getText().toString(); + + return text.isEmpty(); + } + + @Override + public void describeTo(Description description) { + } + }; + } +} + diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/util/NestedScrollToAction.java b/receipt/src/androidTest/java/com/hyperwallet/android/util/NestedScrollToAction.java new file mode 100644 index 000000000..392867387 --- /dev/null +++ b/receipt/src/androidTest/java/com/hyperwallet/android/util/NestedScrollToAction.java @@ -0,0 +1,41 @@ +package com.hyperwallet.android.util; + +import static androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom; +import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; +import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; + +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.anyOf; + +import android.view.View; + +import androidx.core.widget.NestedScrollView; +import androidx.test.espresso.UiController; +import androidx.test.espresso.ViewAction; +import androidx.test.espresso.action.ScrollToAction; +import androidx.test.espresso.matcher.ViewMatchers; + +import org.hamcrest.Matcher; + +public class NestedScrollToAction implements ViewAction { + private static final String TAG = ScrollToAction.class.getSimpleName(); + + @SuppressWarnings("unchecked") + @Override + public Matcher getConstraints() { + return allOf( + withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE), + isDescendantOfA( + anyOf(isAssignableFrom(NestedScrollView.class)))); + } + + @Override + public void perform(UiController uiController, View view) { + new ScrollToAction().perform(uiController, view); + } + + @Override + public String getDescription() { + return "scroll to"; + } +} diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/util/RecyclerViewCountAssertion.java b/receipt/src/androidTest/java/com/hyperwallet/android/util/RecyclerViewCountAssertion.java new file mode 100644 index 000000000..bb3aecaff --- /dev/null +++ b/receipt/src/androidTest/java/com/hyperwallet/android/util/RecyclerViewCountAssertion.java @@ -0,0 +1,30 @@ +package com.hyperwallet.android.util; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; +import androidx.test.espresso.NoMatchingViewException; +import androidx.test.espresso.ViewAssertion; + +public class RecyclerViewCountAssertion implements ViewAssertion { + private final int mCount; + + public RecyclerViewCountAssertion(int count) { + this.mCount = count; + } + + @Override + public void check(View view, NoMatchingViewException noViewFoundException) { + if (noViewFoundException != null) { + throw noViewFoundException; + } + + RecyclerView recyclerView = (RecyclerView) view; + RecyclerView.Adapter adapter = recyclerView.getAdapter(); + + assertThat(adapter.getItemCount(), is(mCount)); + } +} diff --git a/receipt/src/androidTest/java/com/hyperwallet/android/util/TestAuthenticationProvider.java b/receipt/src/androidTest/java/com/hyperwallet/android/util/TestAuthenticationProvider.java new file mode 100644 index 000000000..686ccbf30 --- /dev/null +++ b/receipt/src/androidTest/java/com/hyperwallet/android/util/TestAuthenticationProvider.java @@ -0,0 +1,51 @@ +package com.hyperwallet.android.util; + +import com.hyperwallet.android.HyperwalletAuthenticationTokenListener; +import com.hyperwallet.android.HyperwalletAuthenticationTokenProvider; + +import java.io.IOException; +import java.text.MessageFormat; +import java.util.UUID; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; + +public class TestAuthenticationProvider implements HyperwalletAuthenticationTokenProvider { + + public static final MediaType JSON + = MediaType.get("application/json; charset=utf-8"); + private static final String mBaseUrl = "http://localhost:8080/rest/v3/users/{0}/authentication-token"; + private static final String mUserToken = "user_token"; + + @Override + public void retrieveAuthenticationToken(final HyperwalletAuthenticationTokenListener authenticationTokenListener) { + + OkHttpClient client = new OkHttpClient(); + + String payload = "{}"; + String baseUrl = MessageFormat.format(mBaseUrl, mUserToken); + + RequestBody body = RequestBody.create(JSON, payload); + Request request = new Request.Builder() + .url(baseUrl) + .post(body) + .build(); + + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + authenticationTokenListener.onFailure(UUID.randomUUID(), e.getMessage()); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + authenticationTokenListener.onSuccess(response.body().string()); + } + }); + } +} diff --git a/receipt/src/main/AndroidManifest.xml b/receipt/src/main/AndroidManifest.xml index 251bb4f88..3039f6d18 100644 --- a/receipt/src/main/AndroidManifest.xml +++ b/receipt/src/main/AndroidManifest.xml @@ -2,7 +2,9 @@ - + + + diff --git a/receipt/src/main/res/xml/network_security_config.xml b/receipt/src/main/res/xml/network_security_config.xml new file mode 100644 index 000000000..5e4ba9c97 --- /dev/null +++ b/receipt/src/main/res/xml/network_security_config.xml @@ -0,0 +1,6 @@ + + + + localhost + + \ No newline at end of file diff --git a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java index efe3c4627..d09854710 100644 --- a/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java +++ b/receipt/src/test/java/com/hyperwallet/android/receipt/repository/ReceiptDataSourceTest.java @@ -27,7 +27,7 @@ import com.hyperwallet.android.model.paging.HyperwalletPageList; import com.hyperwallet.android.model.receipt.Receipt; import com.hyperwallet.android.model.receipt.ReceiptQueryParam; -import com.hyperwallet.android.receipt.rule.HyperwalletExternalResourceManager; +import com.hyperwallet.android.rule.HyperwalletExternalResourceManager; import org.hamcrest.Matchers; import org.json.JSONObject; diff --git a/receipt/src/test/java/com/hyperwallet/android/rule/HyperwalletExternalResourceManager.java b/receipt/src/test/java/com/hyperwallet/android/rule/HyperwalletExternalResourceManager.java new file mode 100644 index 000000000..9061af9b8 --- /dev/null +++ b/receipt/src/test/java/com/hyperwallet/android/rule/HyperwalletExternalResourceManager.java @@ -0,0 +1,72 @@ +package com.hyperwallet.android.rule; + +import org.junit.rules.TestWatcher; +import org.junit.runner.Description; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.io.Writer; +import java.net.URL; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class HyperwalletExternalResourceManager extends TestWatcher { + + private static final String EMPTY = ""; + private ClassLoader classLoader; + private Logger logger; + + @Override + protected void starting(Description description) { + super.starting(description); + classLoader = description.getTestClass().getClassLoader(); + logger = Logger.getLogger(description.getTestClass().getName()); + } + + public String getResourceContent(final String resourceName) { + if (resourceName == null) { + throw new IllegalArgumentException("Parameter resourceName cannot be null"); + } + + return getContent(resourceName); + } + + private String getContent(final String resourceName) { + URL resource = classLoader.getResource(resourceName); + InputStream inputStream = null; + Writer writer = new StringWriter(); + String resourceContent = EMPTY; + if (resource != null) { + try { + inputStream = resource.openStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + String line = reader.readLine(); + while (line != null) { + writer.write(line); + line = reader.readLine(); + } + resourceContent = writer.toString(); + + } catch (Exception e) { + logger.log(Level.WARNING, "There was an error loading an external resource", e); + } finally { + try { + if (inputStream != null) { + inputStream.close(); + } + } catch (Exception e) { + logger.log(Level.SEVERE, "There was an error closing input stream", e); + } + try { + writer.close(); + } catch (IOException e) { + logger.log(Level.SEVERE, "There was an error closing writer", e); + } + } + } + return resourceContent; + } +} diff --git a/receipt/src/test/resources/authentication_token_response.json b/receipt/src/test/resources/authentication_token_response.json new file mode 100644 index 000000000..e8e41bf37 --- /dev/null +++ b/receipt/src/test/resources/authentication_token_response.json @@ -0,0 +1,3 @@ +{ + "value": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ1c3ItZjZlNmZjY2EtNTBmNy00ZWY1LWExYzUtNWZmMDJlMDU2MzgzIiwiaWF0IjoxNTQ5NTgwMzk0LCJleHAiOjI1NDk1ODA5OTQsImF1ZCI6InBndS03YTEyMzJlOC0xNDc5LTQzNzAtOWY1NC03ODc1ZjdiMTg2NmMiLCJpc3MiOiJwcmctY2NhODAyNWUtODVhMy0xMWU2LTg2MGEtNThhZDVlY2NlNjFkIiwicmVzdC11cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVzdC92My8iLCJncmFwaHFsLXVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9ncmFwaHFsIn0.kILSynYHbepbl4sVqENnNog09iGByfTrckHhSCjVgnuRnuspI72cx3rt0SB2V_neHwzYkD_VfhNKk9gJDOwXeQ" +} \ No newline at end of file diff --git a/receipt/src/test/resources/receipt_credit_response.json b/receipt/src/test/resources/receipt_credit_response.json new file mode 100644 index 000000000..4351d17a2 --- /dev/null +++ b/receipt/src/test/resources/receipt_credit_response.json @@ -0,0 +1,30 @@ +{ + "count": 1, + "offset": 0, + "limit": 10, + "data": [ + { + "journalId": "3051581", + "type": "PAYMENT", + "createdOn": "2019-06-02T17:09:07", + "entry": "CREDIT", + "sourceToken": "act-12345", + "destinationToken": "usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d", + "amount": "25.00", + "fee": "0.00", + "currency": "CAD", + "details": { + "clientPaymentId": "ABC1234", + "payeeName": "A Person" + } + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://api.sandbox.hyperwallet.com/rest/v3/users/usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d/receipts?offset=0&limit=10" + } + ] +} \ No newline at end of file diff --git a/receipt/src/test/resources/receipt_debit_response.json b/receipt/src/test/resources/receipt_debit_response.json new file mode 100644 index 000000000..8ed756455 --- /dev/null +++ b/receipt/src/test/resources/receipt_debit_response.json @@ -0,0 +1,25 @@ +{ + "count": 1, + "offset": 0, + "limit": 10, + "data": [ + { + "journalId": "3051590", + "type": "TRANSFER_TO_PREPAID_CARD", + "createdOn": "2019-05-02T17:12:18", + "entry": "DEBIT", + "sourceToken": "usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d", + "destinationToken": "trm-12345", + "amount": "18.05", + "currency": "USD" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://api.sandbox.hyperwallet.com/rest/v3/users/usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d/receipts?offset=0&limit=10" + } + ] +} \ No newline at end of file diff --git a/receipt/src/test/resources/receipt_list_response.json b/receipt/src/test/resources/receipt_list_response.json new file mode 100644 index 000000000..7e7cc58af --- /dev/null +++ b/receipt/src/test/resources/receipt_list_response.json @@ -0,0 +1,64 @@ +{ + "count": 4, + "offset": 0, + "limit": 10, + "data": [ + { + "journalId": "3051579", + "type": "PAYMENT", + "createdOn": "2019-06-07T17:08:58", + "entry": "CREDIT", + "sourceToken": "act-12345", + "destinationToken": "usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d", + "amount": "20.00", + "fee": "0.00", + "currency": "USD", + "details": { + "clientPaymentId": "8OxXefx5", + "payeeName": "A Person" + } + }, + { + "journalId": "3051581", + "type": "PAYMENT", + "createdOn": "2019-06-02T16:09:07", + "entry": "CREDIT", + "sourceToken": "act-12345", + "destinationToken": "usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d", + "amount": "25.00", + "fee": "0.00", + "currency": "CAD", + "details": { + "clientPaymentId": "Q3SVvpv0", + "payeeName": "A Person" + } + }, + { + "journalId": "3051582", + "type": "CARD_ACTIVATION_FEE", + "createdOn": "2019-06-01T11:09:16", + "entry": "DEBIT", + "sourceToken": "usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d", + "amount": "1.95", + "currency": "USD" + }, + { + "journalId": "3051590", + "type": "TRANSFER_TO_PREPAID_CARD", + "createdOn": "2018-12-01T17:12:18", + "entry": "DEBIT", + "sourceToken": "usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d", + "destinationToken": "trm-12345", + "amount": "18.05", + "currency": "USD" + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://api.sandbox.hyperwallet.com/rest/v3/users/usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d/receipts?offset=0&limit=10" + } + ] +} \ No newline at end of file diff --git a/receipt/src/test/resources/receipt_unknown_type_response.json b/receipt/src/test/resources/receipt_unknown_type_response.json new file mode 100644 index 000000000..bf856ed63 --- /dev/null +++ b/receipt/src/test/resources/receipt_unknown_type_response.json @@ -0,0 +1,30 @@ +{ + "count": 1, + "offset": 0, + "limit": 10, + "data": [ + { + "journalId": "3051581", + "type": "ICK", + "createdOn": "2019-06-02T17:09:07", + "entry": "CREDIT", + "sourceToken": "act-12345", + "destinationToken": "usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d", + "amount": "25.00", + "fee": "0.00", + "currency": "CAD", + "details": { + "clientPaymentId": "ABC1234", + "payeeName": "A Person" + } + } + ], + "links": [ + { + "params": { + "rel": "self" + }, + "href": "https://api.sandbox.hyperwallet.com/rest/v3/users/usr-fa76a738-f43d-48b9-9a7a-7048d44a5d2d/receipts?offset=0&limit=10" + } + ] +} \ No newline at end of file diff --git a/ui/src/androidTest/AndroidManifest.xml b/ui/src/androidTest/AndroidManifest.xml index 9b2c52c35..0cd133def 100644 --- a/ui/src/androidTest/AndroidManifest.xml +++ b/ui/src/androidTest/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.hyperwallet.android.hyperwallet_ui.test">