diff --git a/android-library.gradle b/android-library.gradle new file mode 100644 index 000000000..620173287 --- /dev/null +++ b/android-library.gradle @@ -0,0 +1,72 @@ +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 +} + +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 b079d8d65..3df2d26b2 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,12 +21,45 @@ allprojects { google() jcenter() mavenLocal() - + } project.version = "1.0.0-beta03-SNAPSHOT" + +} + +subprojects { + + ext { + hyperwalletGroupId = 'com.hyperwallet.android' + + compileVersion = 28 + minVersion = 21 + targetVersion = 28 + codeVersion = 1 + + 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.1' + testRunnerVersion = '1.2.0' + testRulesVersion = '1.2.0' + espressoVersion = '3.2.0' + mockServerVersion = '3.11.0' + leakcanaryVersion = '1.6.3' + mockitoVersion = '2.27.0' + junitParamsVersion = '1.1.1' + robolectricVersion = '4.1' + mockWebServerVersion = '3.11.0' + } + } task clean(type: Delete) { delete rootProject.buildDir -} +} \ No newline at end of file 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..e4df818b5 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,88 @@ +apply from: "$rootProject.projectDir/android-library.gradle" + + +def aarFile = file("$buildDir/outputs/aar/common-$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 { + hyperwalletCommonUi(MavenPublication) { + groupId = hyperwalletGroupId + artifactId = 'common' + version = version + + artifact(sourcesJar) + artifact(javadocsJar) + artifact(aarArtifact) + + pom { + 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') + 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' + } + } + } + } +} + +tasks.withType(Sign) { + onlyIf { + isReleaseVersion && sonatypeUsername?.trim() && sonatypePassword?.trim() + } +} + +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/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 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 98% 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 fd1938311..b3ea55029 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; @@ -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/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/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/colors.xml b/common/src/main/res/values/colors.xml similarity index 100% rename from ui/src/main/res/values/colors.xml rename to common/src/main/res/values/colors.xml 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/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..8221087b3 --- /dev/null +++ b/common/src/main/res/values/styles.xml @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..39c963b04 --- /dev/null +++ b/receipt/build.gradle @@ -0,0 +1,95 @@ +apply from: "$rootProject.projectDir/android-library.gradle" + +dependencies { + api project(":common") +} + +def aarFile = file("$buildDir/outputs/aar/receipt-$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 { + hyperwalletReceiptUi(MavenPublication) { + groupId = hyperwalletGroupId + artifactId = 'receipt' + version = version + + artifact(sourcesJar) + artifact(javadocsJar) + artifact(aarArtifact) + + pom { + 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') + configurations.implementation.allDependencies.each { + def dependencyNode = dependenciesNode.appendNode('dependency') + 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) + } + } + 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' + } + } + } + } +} + +tasks.withType(Sign) { + onlyIf { + isReleaseVersion && sonatypeUsername?.trim() && sonatypePassword?.trim() + } +} + +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 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/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..c3ca11b97 --- /dev/null +++ b/receipt/src/main/res/values/strings.xml @@ -0,0 +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 + 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 7fdbb6b2d..7d74976ae 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -1,90 +1,28 @@ -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 - 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") - } - -} - +apply from: "$rootProject.projectDir/android-library.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.test.espresso:espresso-idling-resource:3.2.0" - 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" - - androidTestImplementation "androidx.test.ext:junit:1.1.1" - androidTestImplementation "androidx.test:runner:1.2.0" - androidTestImplementation "androidx.test:rules:1.2.0" - androidTestImplementation "androidx.test.espresso:espresso-core:3.2.0" - androidTestImplementation "androidx.test.espresso:espresso-contrib:3.2.0" - androidTestImplementation "androidx.test.espresso:espresso-intents:3.2.0" - 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.27.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" + implementation "androidx.appcompat:appcompat:$appcompatVersion" + implementation "androidx.constraintlayout:constraintlayout:$constraintlayoutVersion" + implementation "androidx.legacy:legacy-support-v4:$legacySupportV4Version" + implementation "androidx.recyclerview:recyclerview:$recycleViewVersion" -} + api project(":common") + api project(":receipt") -task javadocs(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) - failOnError false -} + 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" -task javadocsJar(type: Jar, dependsOn: javadocs) { - classifier = 'javadoc' - from javadocs.destinationDir + testImplementation "org.robolectric:robolectric:$robolectricVersion" + testImplementation "com.squareup.okhttp3:mockwebserver:$mockWebServerVersion" } -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/ui-$version" + ".aar") def aarArtifact = artifacts.add('archives', aarFile) { type 'aar' } @@ -107,7 +45,7 @@ publishing { publications { hyperwalletUi(MavenPublication) { - groupId = 'com.hyperwallet.android' + groupId = hyperwalletGroupId artifactId = 'ui-sdk' version = version @@ -123,7 +61,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/config/lint.xml b/ui/config/lint.xml index 1238724e4..7f32fbd3d 100644 --- a/ui/config/lint.xml +++ b/ui/config/lint.xml @@ -6,6 +6,8 @@ + + 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/androidTest/java/com/hyperwallet/android/transfermethod/ui/AddTransferMethodTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/AddTransferMethodTest.java index 61cd031aa..f8751b9b6 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 @@ -21,7 +21,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; @@ -35,13 +35,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 75b62af11..5bd2e49dd 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 @@ -45,13 +45,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.transfermethod.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 3003b01b3..f3c15fa11 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 @@ -42,13 +42,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.transfermethod.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 ee49a0163..ec88b9dd0 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 @@ -44,13 +44,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.transfermethod.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/SelectTransferMethodTest.java b/ui/src/androidTest/java/com/hyperwallet/android/transfermethod/ui/SelectTransferMethodTest.java index 346b77ac5..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 @@ -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/HyperwalletUi.java b/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletUi.java index 4c5759831..d2f6b9123 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletUi.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/HyperwalletUi.java @@ -84,9 +84,9 @@ public Intent getIntentSelectTransferMethodActivity(@NonNull final Context conte * @param country The transfer method country code. ISO 3166-1 alpha-2 format. * @param currency The transfer method currency code. ISO 4217 format. * @param transferMethodType The type of transfer method. For a complete list of transfer methods, see {@link - * com.hyperwallet.android.model.HyperwalletTransferMethod.TransferMethodTypes} + * com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod.TransferMethodTypes} * @param profileType The type of the account holder profile. For a complete list of options, see - * {@link com.hyperwallet.android.model.HyperwalletUser.ProfileTypes} + * {@link com.hyperwallet.android.model.user.HyperwalletUser.ProfileTypes} * @return an Intent with the data necessary to launch the {@link AddTransferMethodActivity} */ public Intent getIntentAddTransferMethodActivity(@NonNull final Context context, @NonNull final String country, 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/TransferMethodConfigurationRepositoryImpl.java b/ui/src/main/java/com/hyperwallet/android/ui/repository/TransferMethodConfigurationRepositoryImpl.java index 6a07b1c6c..4fe1861a4 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.graphql.HyperwalletTransferMethodConfigurationField; @@ -40,7 +41,7 @@ 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 com.hyperwallet.android.ui.util.EspressoIdlingResource; +import com.hyperwallet.android.common.util.EspressoIdlingResource; import java.util.HashMap; import java.util.Map; @@ -48,9 +49,9 @@ 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(); 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 2a17b4aba..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 @@ -38,7 +38,6 @@ import com.hyperwallet.android.model.transfermethod.HyperwalletTransferMethod; import com.hyperwallet.android.model.transfermethod.PayPalAccount; - public class TransferMethodRepositoryImpl implements TransferMethodRepository { private Handler mHandler = new Handler(); 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 26cc9154b..4dbd6eb55 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,12 +28,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.WidgetDateDialogFragment; 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 daaeafd5a..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 @@ -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.transfermethod.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/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/view/CountrySelectionDialogFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/view/CountrySelectionDialogFragment.java index 91c35c5e3..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 @@ -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/ExpiryDateWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/ExpiryDateWidget.java index 63471a56a..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 @@ -42,8 +42,8 @@ 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/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 6d39a8667..e5448bfce 100644 --- a/ui/src/main/res/values/styles.xml +++ b/ui/src/main/res/values/styles.xml @@ -1,4 +1,4 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 651cf534c..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 @@ -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 42aff932e..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 @@ -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 695ea3d0a..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 @@ -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 b6e46f9f9..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 @@ -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 aa674e769..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 @@ -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 e58c7c6f2..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 @@ -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 {