Browse Source

Login screen changed

master
Preyea Regmi 4 years ago
parent
commit
6040a4204a
  1. BIN
      .idea/caches/build_file_checksums.ser
  2. 4
      .idea/gradle.xml
  3. 2
      .idea/misc.xml
  4. 5
      .idea/modules.xml
  5. 1
      SpinnerDatePickerLib-release/build/.transforms/0aacef8c7eb2bd557b0fca8b7d9bd772.bin
  6. 0
      SpinnerDatePickerLib-release/build/.transforms/1b57a2c46ec6b9ec856fc7bcd699a57b.bin
  7. 1
      SpinnerDatePickerLib-release/build/.transforms/2839ef43b61ab0b4a52a3a24ff4bc24b.bin
  8. BIN
      SpinnerDatePickerLib-release/build/.transforms/2839ef43b61ab0b4a52a3a24ff4bc24b/SpinnerDatePickerLib-release-runtime.jar
  9. 1
      SpinnerDatePickerLib-release/build/.transforms/297122c3de19f78857734e10db1a5259.bin
  10. 1
      SpinnerDatePickerLib-release/build/.transforms/43be3c839168f02578af6d0e1bc52e80.bin
  11. BIN
      SpinnerDatePickerLib-release/build/.transforms/43be3c839168f02578af6d0e1bc52e80/SpinnerDatePickerLib-release-api.jar
  12. 1
      SpinnerDatePickerLib-release/build/.transforms/53985abfbabe73e696f74bd7bedab833.bin
  13. BIN
      SpinnerDatePickerLib-release/build/.transforms/53985abfbabe73e696f74bd7bedab833/SpinnerDatePickerLib-release-runtime/classes.dex
  14. 1
      SpinnerDatePickerLib-release/build/.transforms/55f53df6f4a9f4abb4fa8f84b0197930.bin
  15. BIN
      SpinnerDatePickerLib-release/build/.transforms/55f53df6f4a9f4abb4fa8f84b0197930/SpinnerDatePickerLib-release-runtime/classes.dex
  16. 0
      SpinnerDatePickerLib-release/build/.transforms/633596326ec9a83ddf4b4410e864e533.bin
  17. 0
      SpinnerDatePickerLib-release/build/.transforms/76aee04f8799a802738c4a4ece489be2.bin
  18. 0
      SpinnerDatePickerLib-release/build/.transforms/7b208791b88eb0defa5e019b49100a38.bin
  19. 1
      SpinnerDatePickerLib-release/build/.transforms/a428ccc27f9414c146defcf653805b83.bin
  20. 1
      SpinnerDatePickerLib-release/build/.transforms/b1eb30609fcfab7e9e30c5e4ff5f7968.bin
  21. 18
      SpinnerDatePickerLib-release/build/.transforms/b1eb30609fcfab7e9e30c5e4ff5f7968/package-aware-r.txt
  22. 0
      SpinnerDatePickerLib-release/build/.transforms/b8fb30f7302aaef9a81afff71f5dc22d.bin
  23. 1
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2.bin
  24. 14
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/AndroidManifest.xml
  25. 17
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/R.txt
  26. BIN
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/jars/classes.jar
  27. 71
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_picker.xml
  28. 41
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_picker_container.xml
  29. 26
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_picker_dialog.xml
  30. 8
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_picker_dialog_container.xml
  31. 33
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_range_picker_dialog_container.xml
  32. 12
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/number_picker_day_month.xml
  33. 12
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/number_picker_year.xml
  34. 4
      SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/values/values.xml
  35. 1
      SpinnerDatePickerLib-release/build/.transforms/d35d3016f688e9f9e48678afcb25d2fc.bin
  36. 1
      SpinnerDatePickerLib-release/build/.transforms/df4a40b0e093de4c0175efb9b42c229e.bin
  37. 20
      app/src/main/java/com/gmeremit/online/gmeremittance_native/common/model/FormInputStateDTO.java
  38. 2
      app/src/main/java/com/gmeremit/online/gmeremittance_native/common/view/MTextInputEditText.java
  39. 23
      app/src/main/java/com/gmeremit/online/gmeremittance_native/common/view/MTextInputLayout.java
  40. 2
      app/src/main/java/com/gmeremit/online/gmeremittance_native/common/view/MTextView.java
  41. 25
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/LoginViewModelFactory.java
  42. 171
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java
  43. 17
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2PresenterInterface.java
  44. 253
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java
  45. 64
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginViewLiveData.java
  46. 23
      app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/presenter/SplashScreenPresenter.java
  47. 11
      app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java
  48. 5
      app/src/main/res/drawable/vd_lock.xml
  49. 141
      app/src/main/res/layout/activity_login_v2.xml
  50. 1
      app/src/main/res/layout/activity_transaction_password_prompt.xml
  51. 1
      app/src/main/res/layout/gme_user_pwd_prompt_modal.xml
  52. 4
      app/src/main/res/values/attrs.xml
  53. 14
      app/src/main/res/values/dimens.xml
  54. 10
      app/src/main/res/values/styles.xml

BIN
.idea/caches/build_file_checksums.ser

4
.idea/gradle.xml

@ -4,9 +4,6 @@
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<compositeConfiguration>
<compositeBuild compositeDefinitionSource="SCRIPT" />
</compositeConfiguration>
<option name="delegatedBuild" value="false" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
@ -17,7 +14,6 @@
<option value="$PROJECT_DIR$/app" />
<option value="$PROJECT_DIR$/httpclient-release" />
<option value="$PROJECT_DIR$/rxbiometric" />
<option value="$PROJECT_DIR$/securitykeypad" />
</set>
</option>
<option name="resolveModulePerSourceSet" value="false" />

2
.idea/misc.xml

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="JDK" project-jdk-type="JavaSDK" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
</project>

5
.idea/modules.xml

@ -3,9 +3,14 @@
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/SpinnerDatePickerLib-release/SpinnerDatePickerLib-release.iml" filepath="$PROJECT_DIR$/SpinnerDatePickerLib-release/SpinnerDatePickerLib-release.iml" />
<module fileurl="file://$PROJECT_DIR$/Swift-remitandroid.iml" filepath="$PROJECT_DIR$/Swift-remitandroid.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
<module fileurl="file://$PROJECT_DIR$/httpclient-release/httpclient-release.iml" filepath="$PROJECT_DIR$/httpclient-release/httpclient-release.iml" />
<module fileurl="file://$PROJECT_DIR$/remitandroid.iml" filepath="$PROJECT_DIR$/remitandroid.iml" />
<module fileurl="file://$PROJECT_DIR$/SpinnerDatePickerLib-release/remitandroid-SpinnerDatePickerLib-release.iml" filepath="$PROJECT_DIR$/SpinnerDatePickerLib-release/remitandroid-SpinnerDatePickerLib-release.iml" />
<module fileurl="file://$PROJECT_DIR$/app/remitandroid-app.iml" filepath="$PROJECT_DIR$/app/remitandroid-app.iml" />
<module fileurl="file://$PROJECT_DIR$/httpclient-release/remitandroid-httpclient-release.iml" filepath="$PROJECT_DIR$/httpclient-release/remitandroid-httpclient-release.iml" />
<module fileurl="file://$PROJECT_DIR$/rxbiometric/remitandroid-rxbiometric.iml" filepath="$PROJECT_DIR$/rxbiometric/remitandroid-rxbiometric.iml" />
<module fileurl="file://$PROJECT_DIR$/rxbiometric/rxbiometric.iml" filepath="$PROJECT_DIR$/rxbiometric/rxbiometric.iml" />
</modules>
</component>

1
SpinnerDatePickerLib-release/build/.transforms/0aacef8c7eb2bd557b0fca8b7d9bd772.bin

@ -0,0 +1 @@
i/jars/classes.jar

0
SpinnerDatePickerLib-release/build/.transforms/1b57a2c46ec6b9ec856fc7bcd699a57b.bin

1
SpinnerDatePickerLib-release/build/.transforms/2839ef43b61ab0b4a52a3a24ff4bc24b.bin

@ -0,0 +1 @@
o/SpinnerDatePickerLib-release-runtime.jar

BIN
SpinnerDatePickerLib-release/build/.transforms/2839ef43b61ab0b4a52a3a24ff4bc24b/SpinnerDatePickerLib-release-runtime.jar

1
SpinnerDatePickerLib-release/build/.transforms/297122c3de19f78857734e10db1a5259.bin

@ -0,0 +1 @@
i/res

1
SpinnerDatePickerLib-release/build/.transforms/43be3c839168f02578af6d0e1bc52e80.bin

@ -0,0 +1 @@
o/SpinnerDatePickerLib-release-api.jar

BIN
SpinnerDatePickerLib-release/build/.transforms/43be3c839168f02578af6d0e1bc52e80/SpinnerDatePickerLib-release-api.jar

1
SpinnerDatePickerLib-release/build/.transforms/53985abfbabe73e696f74bd7bedab833.bin

@ -0,0 +1 @@
o/SpinnerDatePickerLib-release-runtime

BIN
SpinnerDatePickerLib-release/build/.transforms/53985abfbabe73e696f74bd7bedab833/SpinnerDatePickerLib-release-runtime/classes.dex

1
SpinnerDatePickerLib-release/build/.transforms/55f53df6f4a9f4abb4fa8f84b0197930.bin

@ -0,0 +1 @@
o/SpinnerDatePickerLib-release-runtime

BIN
SpinnerDatePickerLib-release/build/.transforms/55f53df6f4a9f4abb4fa8f84b0197930/SpinnerDatePickerLib-release-runtime/classes.dex

0
SpinnerDatePickerLib-release/build/.transforms/633596326ec9a83ddf4b4410e864e533.bin

0
SpinnerDatePickerLib-release/build/.transforms/76aee04f8799a802738c4a4ece489be2.bin

0
SpinnerDatePickerLib-release/build/.transforms/7b208791b88eb0defa5e019b49100a38.bin

1
SpinnerDatePickerLib-release/build/.transforms/a428ccc27f9414c146defcf653805b83.bin

@ -0,0 +1 @@
i/

1
SpinnerDatePickerLib-release/build/.transforms/b1eb30609fcfab7e9e30c5e4ff5f7968.bin

@ -0,0 +1 @@
o/package-aware-r.txt

18
SpinnerDatePickerLib-release/build/.transforms/b1eb30609fcfab7e9e30c5e4ff5f7968/package-aware-r.txt

@ -0,0 +1,18 @@
com.tsongkha.spinnerdatepicker
id datePickerContainer
id dateRangePickerContainer
id day
id fromDateText
id month
id number_picker
id parent
id toDateText
id year
layout date_picker
layout date_picker_container
layout date_picker_dialog
layout date_picker_dialog_container
layout date_range_picker_dialog_container
layout number_picker_day_month
layout number_picker_year
string app_name

0
SpinnerDatePickerLib-release/build/.transforms/b8fb30f7302aaef9a81afff71f5dc22d.bin

1
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2.bin

@ -0,0 +1 @@
o/SpinnerDatePickerLib-release

14
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/AndroidManifest.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tsongkha.spinnerdatepicker"
android:versionCode="106"
android:versionName="1.0.6" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="27" />
<application android:supportsRtl="true" >
</application>
</manifest>

17
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/R.txt

@ -0,0 +1,17 @@
int id datePickerContainer 0x7f0b0001
int id dateRangePickerContainer 0x7f0b0002
int id day 0x7f0b0003
int id fromDateText 0x7f0b0004
int id month 0x7f0b0005
int id number_picker 0x7f0b0006
int id parent 0x7f0b0007
int id toDateText 0x7f0b0008
int id year 0x7f0b0009
int layout date_picker 0x7f0e0001
int layout date_picker_container 0x7f0e0002
int layout date_picker_dialog 0x7f0e0003
int layout date_picker_dialog_container 0x7f0e0004
int layout date_range_picker_dialog_container 0x7f0e0005
int layout number_picker_day_month 0x7f0e0006
int layout number_picker_year 0x7f0e0007
int string app_name 0x7f140001

BIN
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/jars/classes.jar

71
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_picker.xml

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="270dip"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="vertical">
<LinearLayout
android:id="@+id/parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
<!-- Month -->
<NumberPicker
android:id="@+id/month"
android:layout_width="80dip"
android:layout_height="wrap_content"
android:layout_marginEnd="1dip"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
android:layout_marginStart="1dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
<!-- Day -->
<NumberPicker
android:id="@+id/day"
android:layout_width="80dip"
android:layout_height="wrap_content"
android:layout_marginEnd="1dip"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
android:layout_marginStart="1dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
<!-- Year -->
<NumberPicker
android:id="@+id/year"
android:layout_width="95dip"
android:layout_height="wrap_content"
android:layout_marginEnd="1dip"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
android:layout_marginStart="1dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
</LinearLayout>
</LinearLayout>

41
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_picker_container.xml

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<!-- Layout of date picker-->
<!-- The width of this container is manually set a little bigger than the one of the children
contained in it. This helps to prevent rounding errors when toggling the "Show year" option -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_gravity="center_horizontal"
android:layout_width="270dip"
android:layout_height="wrap_content">
<!-- Warning: everything within the parent is removed and re-ordered depending
on the date format selected by the user. -->
<LinearLayout
android:id="@+id/parent"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</LinearLayout>
</LinearLayout>

26
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_picker_dialog.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2007 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.tsongkha.spinnerdatepicker.DatePicker xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/datePickerContainer"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:spinnersShown="true"
android:calendarViewShown="false"
/>
<!--android:dialogMode="true" -->

8
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_picker_dialog_container.xml

@ -0,0 +1,8 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/datePickerContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
</FrameLayout>

33
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/date_range_picker_dialog_container.xml

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="wrap_content"
android:id="@+id/dateRangePickerContainer"
android:layout_height="wrap_content">
<TextView
android:layout_marginStart="25dp"
android:layout_marginLeft="12dp"
android:layout_marginTop="10dp"
android:paddingTop="3dp"
android:paddingBottom="3dp"
android:text="From Date: "
android:id="@+id/fromDateText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
/>
<TextView
android:layout_marginTop="5dp"
android:layout_marginStart="25dp"
android:layout_marginLeft="25dp"
android:paddingTop="3dp"
android:paddingBottom="3dp"
android:text="To Date: "
android:id="@+id/toDateText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"/>
</LinearLayout>

12
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/number_picker_day_month.xml

@ -0,0 +1,12 @@
<NumberPicker
android:id="@+id/number_picker"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="80dip"
android:layout_height="wrap_content"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
android:layout_marginStart="1dip"
android:layout_marginEnd="1dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>

12
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/layout/number_picker_year.xml

@ -0,0 +1,12 @@
<NumberPicker
android:id="@+id/number_picker"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="95dip"
android:layout_height="wrap_content"
android:layout_marginLeft="1dip"
android:layout_marginRight="1dip"
android:layout_marginStart="1dip"
android:layout_marginEnd="1dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>

4
SpinnerDatePickerLib-release/build/.transforms/bfd02863b727da9ab2449bf382a643a2/SpinnerDatePickerLib-release/res/values/values.xml

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">SpinnerDatePicker</string>
</resources>

1
SpinnerDatePickerLib-release/build/.transforms/d35d3016f688e9f9e48678afcb25d2fc.bin

@ -0,0 +1 @@
i/AndroidManifest.xml

1
SpinnerDatePickerLib-release/build/.transforms/df4a40b0e093de4c0175efb9b42c229e.bin

@ -0,0 +1 @@
i/jars/classes.jar

20
app/src/main/java/com/gmeremit/online/gmeremittance_native/common/model/FormInputStateDTO.java

@ -0,0 +1,20 @@
package com.gmeremit.online.gmeremittance_native.common.model;
public class FormInputStateDTO {
private boolean isValid;
private String errorMessage;
public FormInputStateDTO(boolean isValid, String errorMessage) {
this.isValid = isValid;
this.errorMessage = errorMessage;
}
public boolean isValid() {
return isValid;
}
public String getErrorMessage() {
return errorMessage;
}
}

2
app/src/main/java/com/gmeremit/online/gmeremittance_native/common/view/MTextInputEditText.java

@ -27,7 +27,7 @@ public class MTextInputEditText extends TextInputEditText {
private void init(Context context, AttributeSet attrs) {
if (attrs != null) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MTextInputEditText);
String fontName = a.getString(R.styleable.MTextInputEditText_txtFontName);
String fontName = a.getString(R.styleable.MTextInputEditText_edTxtFontName);
setTypeface(FontCache.getTypeface(fontName, context));
a.recycle();
}

23
app/src/main/java/com/gmeremit/online/gmeremittance_native/common/view/MTextInputLayout.java

@ -0,0 +1,23 @@
package com.gmeremit.online.gmeremittance_native.common.view;
import android.content.Context;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.textfield.TextInputLayout;
public class MTextInputLayout extends TextInputLayout {
public MTextInputLayout(@NonNull Context context) {
super(context);
}
public MTextInputLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public MTextInputLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}

2
app/src/main/java/com/gmeremit/online/gmeremittance_native/common/view/MTextView.java

@ -29,7 +29,7 @@ public class MTextView extends AppCompatTextView {
private void init(Context context, AttributeSet attrs) {
if (attrs != null) {
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.MTextView);
String fontName = a.getString(R.styleable.MTextView_txtFontName);
String fontName = a.getString(R.styleable.MTextView_txtViewFontName);
setTypeface(FontCache.getTypeface(fontName, context));
a.recycle();
}

25
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/LoginViewModelFactory.java

@ -0,0 +1,25 @@
package com.gmeremit.online.gmeremittance_native.loginV2;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.gmeremit.online.gmeremittance_native.loginV2.gateway.LoginV2Gateway;
import com.gmeremit.online.gmeremittance_native.loginV2.presenter.LoginV2Presenter;
import com.gmeremit.online.gmeremittance_native.loginV2.presenter.LoginV2PresenterInterface;
public class LoginViewModelFactory implements ViewModelProvider.Factory {
private final LoginV2PresenterInterface.LoginV2ContractInterface view;
public LoginViewModelFactory(LoginV2PresenterInterface.LoginV2ContractInterface view) {
this.view=view;
}
@SuppressWarnings("unchecked")
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new LoginV2Presenter(view,new LoginV2Gateway());
}
}

171
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java

@ -1,12 +1,18 @@
package com.gmeremit.online.gmeremittance_native.loginV2.presenter;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.gmeremit.online.gmeremittance_native.R;
import com.gmeremit.online.gmeremittance_native.base.BasePresenter;
import com.gmeremit.online.gmeremittance_native.base.BaseViewModel;
import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO;
import com.gmeremit.online.gmeremittance_native.customwidgets.CustomAlertDialog;
import com.gmeremit.online.gmeremittance_native.loginV2.gateway.LoginV2Gateway;
import com.gmeremit.online.gmeremittance_native.loginV2.model.LoginModelV2;
import com.gmeremit.online.gmeremittance_native.loginV2.view.LoginViewLiveData;
import com.gmeremit.online.gmeremittance_native.security.GMEAuthManager;
import com.gmeremit.online.gmeremittance_native.security.model.GMEAuthFailedResult;
import com.gmeremit.online.gmeremittance_native.security.model.GMEAuthSuccessResult;
@ -18,63 +24,106 @@ import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterInterface, LoginV2InteractorInterface {
public class LoginV2Presenter extends BaseViewModel implements LoginV2PresenterInterface, LoginV2InteractorInterface {
private final LoginV2ContractInterface view;
private final LoginV2Gateway gateway;
private final CompositeDisposable compositeDisposable;
private String encUserPassword;
private final LoginValidator loginValidator;
private final LoginViewLiveData loginViewLiveData;
private GMEAuthManager gmeAuthManager;
private final CompositeDisposable useCaseCompositeDisposable;
private final CompositeDisposable viewEventCompositeDisposable;
public LoginV2Presenter(LoginV2ContractInterface view, LoginV2Gateway gateway) {
this.view = view;
this.gateway = gateway;
encUserPassword = "";
gmeAuthManager = GMEAuthManager.getGmeAuthManager((AppCompatActivity) view.getContext());
compositeDisposable = new CompositeDisposable();
useCaseCompositeDisposable = new CompositeDisposable();
viewEventCompositeDisposable = new CompositeDisposable();
loginValidator = new LoginValidator();
loginViewLiveData = new LoginViewLiveData();
}
@Override
public boolean validateUserId(String userId) {
if (userId.length() < 1) {
view.showInvalidUserId(getStringfromStringId(R.string.user_id_empty_error));
return false;
} else {
view.showInvalidUserId(null);
return true;
}
public void loginUser() {
useCaseCompositeDisposable.add(
this.gateway.loginUser(gateway.getBasicAuth(view.getContext()), loginValidator.userId, loginValidator.userId)
.subscribeOn(Schedulers.io())
.flatMap(loginResponse -> {
if (loginResponse.getErrorCode().equalsIgnoreCase(Constants.SUCCESS_CODE_V2)) {
LoginModelV2 data = loginResponse.getData();
turnOffFingerprintAuthIfRequired(loginValidator.userId);
return gateway.saveUserInfo(data);
} else {
return Observable.error(new Exception(loginResponse.getMsg()));
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new LoginObserver(loginValidator.userId, "")));
}
private boolean validatePassword() {
if (encUserPassword == null || encUserPassword.length() < 1) {
view.showInvalidPassword(getStringfromStringId(R.string.password_empty_error));
return false;
} else {
view.showInvalidPassword(null);
return true;
}
@Override
public LoginViewLiveData getLoginRelatedViewEvents(LoginViewLiveData.LoginViewBindings viewBindings) {
bindView(viewBindings);
return loginViewLiveData;
}
@Override
public void updateUserPassword(String encryptedPassword) {
this.encUserPassword = encryptedPassword;
private void bindView(LoginViewLiveData.LoginViewBindings viewBindings) {
this.viewEventCompositeDisposable.add(
Observable.combineLatest(
viewBindings.getUserIdTextObservable().map(loginValidator::validateUserId),
viewBindings.getPasswordInputLiveData().map(loginValidator::validatePassword),
(isUserIdValid, isPasswordValid) -> isUserIdValid && isPasswordValid).subscribeWith(new DisposableObserver<Boolean>() {
@Override
public void onNext(Boolean aBoolean) {
loginViewLiveData.setAllFormValidLiveData(new FormInputStateDTO(aBoolean, ""));
}
@Override
public void onError(Throwable e) {
loginViewLiveData.setAllFormValidLiveData(new FormInputStateDTO(false, ""));
}
@Override
public void onComplete() {
}
})
);
}
@Override
public boolean checkIfBiometricIsAvailable() {
return gmeAuthManager.isBiometricSupportedByDevice() && gmeAuthManager.isBiometricDataAvailable() && gmeAuthManager.isBiometricEnabledOnTheApp();
}
@Override
public void onViewReady() {
}
@Override
public void onViewNotReady() {
}
@Override
public void onViewDestroyed() {
super.onViewDestroyed();
if(compositeDisposable!=null&&!compositeDisposable.isDisposed())
compositeDisposable.dispose();
if (useCaseCompositeDisposable != null && !useCaseCompositeDisposable.isDisposed())
useCaseCompositeDisposable.dispose();
if (viewEventCompositeDisposable != null && !viewEventCompositeDisposable.isDisposed())
viewEventCompositeDisposable.dispose();
}
@Override
@ -83,8 +132,6 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
.setListener(new GMEAuthManager.GMEAuthListener() {
@Override
public void onGMEAuthSuccess(GMEAuthSuccessResult result) {
encUserPassword = result.getResult();
view.onLoginPerformTask(() -> loginUser(gateway.getPersistedUserId()));
}
@Override
@ -107,26 +154,13 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
@Override
public String getLastLoginIfAvailable() {
Log.d("GMELOGIN", "User Id: " + gateway.getUserID());
return gateway.getUserID();
}
@Override
public void loginUser(String userId) {
compositeDisposable.add(
this.gateway.loginUser(gateway.getBasicAuth(view.getContext()), userId, encUserPassword)
.subscribeOn(Schedulers.io())
.flatMap(loginResponse -> {
if (loginResponse.getErrorCode().equalsIgnoreCase(Constants.SUCCESS_CODE_V2)) {
LoginModelV2 data = loginResponse.getData();
turnOffFingerprintAuthIfRequired(userId);
return gateway.saveUserInfo(data);
} else {
return Observable.error(new Exception(loginResponse.getMsg()));
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new LoginObserver(userId, encUserPassword)));
private void loginUser(String userId) {
}
@ -136,13 +170,42 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
}
}
@Override
public boolean validateAll(String userId) {
boolean result1 = validateUserId(userId);
boolean result2 = validatePassword();
return result1 && result2;
class LoginValidator {
private String userId;
private String password;
private boolean validateUserId(CharSequence userID) {
if (userID == null || userID.length() < 1) {
loginViewLiveData.setUserIdInputLiveData(new FormInputStateDTO(false, getStringfromStringId(R.string.user_id_empty_error)));
this.userId = null;
return false;
} else {
loginViewLiveData.setUserIdInputLiveData(new FormInputStateDTO(true, ""));
this.userId = userID.toString();
return true;
}
}
private boolean validatePassword(CharSequence password) {
if (password == null || password.length() < 1) {
loginViewLiveData.setPasswordInputLiveData(new FormInputStateDTO(false, getStringfromStringId(R.string.password_empty_error)));
this.password = null;
return false;
} else {
loginViewLiveData.setPasswordInputLiveData(new FormInputStateDTO(true, ""));
this.password = password.toString();
return true;
}
}
}
public class LoginObserver extends GenericApiObserverResponse<LoginModelV2> {
String userId;
String encUserPassword;
@ -161,7 +224,7 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
compositeDisposable.add(d);
useCaseCompositeDisposable.add(d);
}
@Override
@ -181,12 +244,12 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
@Override
public void onFailed(String message) {
view.showPopUpMessage(message, CustomAlertDialog.AlertType.FAILED, alertType -> view.morphProgressBarIntoButton(null));
view.showPopUpMessage(message, CustomAlertDialog.AlertType.FAILED, null);
}
@Override
protected void onConnectionNotEstablished(String message) {
view.showPopUpMessage(message, CustomAlertDialog.AlertType.FAILED, alertType -> view.morphProgressBarIntoButton(null));
view.showPopUpMessage(message, CustomAlertDialog.AlertType.FAILED, null);
}
@Override
@ -201,7 +264,6 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
view.showInvalidUserId(null);
view.clearUserName();
view.clearPassword();
encUserPassword = null;
}
private void onLoginSuccess() {
@ -210,7 +272,6 @@ public class LoginV2Presenter extends BasePresenter implements LoginV2PresenterI
setSessionEnabled();
task = () -> view.redirectToDashboard();
view.morphProgressBarIntoButton(task);
}

17
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2PresenterInterface.java

@ -2,8 +2,12 @@ package com.gmeremit.online.gmeremittance_native.loginV2.presenter;
import android.content.Context;
import androidx.lifecycle.LiveData;
import com.gmeremit.online.gmeremittance_native.base.BaseContractInterface;
import com.gmeremit.online.gmeremittance_native.base.BasePresenterInterface;
import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO;
import com.gmeremit.online.gmeremittance_native.loginV2.view.LoginViewLiveData;
import com.gmeremit.online.gmeremittance_native.recipientV2.model.recipientadd.CountryDetailModel;
import com.gmeremit.online.gmeremittance_native.recipientV2.model.recipientadd.DistrictDetailModel;
import com.gmeremit.online.gmeremittance_native.recipientV2.model.recipientadd.ProvinceDetailModel;
@ -12,15 +16,17 @@ import com.gmeremit.online.gmeremittance_native.recipientV2.model.recipientadd.R
import com.gmeremit.online.gmeremittance_native.recipientV2.model.recipientadd.TransferDetailModel;
import com.gmeremit.online.gmeremittance_native.recipientV2.model.recipientlisting.RecipientInfoModel;
import io.reactivex.Observable;
public interface LoginV2PresenterInterface extends BasePresenterInterface {
void loginUser(String userId);
void loginUser();
LoginViewLiveData getLoginRelatedViewEvents(LoginViewLiveData.LoginViewBindings viewBindings);
boolean validateAll(String userId);
boolean validateUserId(String userId);
void updateUserPassword(String decryptedDataFromIntent);
boolean checkIfBiometricIsAvailable();
@ -35,20 +41,17 @@ public interface LoginV2PresenterInterface extends BasePresenterInterface {
void showInvalidUserId(String message);
void showInvalidPassword(String message);
void morphProgressBarIntoButton(Runnable callback);
void redirectToDashboard();
boolean isFingerPrintIconShown();
Context getContext();
void onLoginPerformTask(Runnable task);
void showFingerPrintScanner(boolean b);
void redirectToPennyTestView(int requestCode);
void redirectToKYCScreen(String email,int requestCode);
void clearUserName();

253
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java

@ -1,46 +1,34 @@
package com.gmeremit.online.gmeremittance_native.loginV2.view;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.GradientDrawable;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Interpolator;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelProviders;
import com.facebook.shimmer.ShimmerFrameLayout;
import com.gmeremit.online.gmeremittance_native.R;
import com.gmeremit.online.gmeremittance_native.base.BaseActivity;
import com.gmeremit.online.gmeremittance_native.customwidgets.GmeErrorTextView;
import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO;
import com.gmeremit.online.gmeremittance_native.homeV2.view.HomeActivityV2;
import com.gmeremit.online.gmeremittance_native.kycV2.view.KYCFormV2Activity;
import com.gmeremit.online.gmeremittance_native.kycV2.view.pennytest.PennyTestActivity;
import com.gmeremit.online.gmeremittance_native.loginV2.gateway.LoginV2Gateway;
import com.gmeremit.online.gmeremittance_native.loginV2.LoginViewModelFactory;
import com.gmeremit.online.gmeremittance_native.loginV2.presenter.LoginV2Presenter;
import com.gmeremit.online.gmeremittance_native.loginV2.presenter.LoginV2PresenterInterface;
import com.gmeremit.online.gmeremittance_native.registerV2.view.RegisterV2Activity;
import com.gmeremit.online.gmeremittance_native.resetpassV2.view.ResetPassV2Activity;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import com.jakewharton.rxbinding3.widget.RxTextView;
import butterknife.BindView;
import butterknife.ButterKnife;
@ -59,11 +47,18 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
public static final String TAG = "GMELoginScreen";
@BindView(R.id.usernameId)
EditText usernameId;
@BindView(R.id.usernameId_edTxt)
TextInputEditText usernameId;
@BindView(R.id.usernameId_TxtInputLayout)
TextInputLayout usernameIdTxtInputLayout;
@BindView(R.id.password_edTxt)
TextInputEditText passwordEdTxt;
@BindView(R.id.password_TxtInputLayout)
TextInputLayout passwordTxtInputLayout;
// @BindView(R.id.passwordId)
// EditText passwordId;
@BindView(R.id.btn_submit)
Button loginBtn;
@ -74,28 +69,11 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
@BindView(R.id.register)
TextView registerTxt;
@BindView(R.id.userIdErrorTxt)
GmeErrorTextView userIdErrorTxt;
@BindView(R.id.passwordErrorTxt)
GmeErrorTextView passwordErrorTxt;
@BindView(R.id.progressbar_login)
ProgressBar progressbar_login;
@BindView(R.id.iv_back)
View iv_back;
@BindView(R.id.keypadContainer)
FrameLayout keypadContainer;
@BindView(R.id.keypadBallon)
RelativeLayout ballonView;
@BindView(R.id.fingerprintScanner)
ShimmerFrameLayout fingerprintScannerView;
@ -108,14 +86,7 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
public String loginButtonText;
private LoginV2Presenter presenter;
private AnimatorSet mMorphingAnimatorSet = null;
private boolean mIsMorphingInProgress = false;
private static float DEFAULT_CORNER_RADIUS;
private Interpolator interpolator = new AccelerateDecelerateInterpolator();
private int originalButtonWidth;
private boolean isLoadingInProgress = false;
private AnimatedVectorDrawableCompat fingerPrintAVDCompat;
private LoginV2PresenterInterface presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -129,26 +100,45 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
private void initialize() {
this.presenter = new LoginV2Presenter(this, new LoginV2Gateway());
DEFAULT_CORNER_RADIUS = 35 * getResources().getDisplayMetrics().density;
loginButtonText = loginBtn.getText().toString();
progressbar_login.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(this, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY);
ViewCompat.setTranslationZ(progressbar_login, 100);
progressbar_login.setVisibility(View.GONE);
this.presenter = new ViewModelProvider(this, new LoginViewModelFactory(this)).get(LoginV2Presenter.class);
LoginViewLiveData loginRelatedViewEvents = this.presenter.getLoginRelatedViewEvents(new LoginViewLiveData.LoginViewBindings(
RxTextView.textChanges(usernameId).skipInitialValue(),
RxTextView.textChanges(passwordEdTxt).skipInitialValue()
));
loginRelatedViewEvents.getUserIdInputLiveData().observe(this, this::showUserIdError);
loginRelatedViewEvents.getPasswordInputLiveData().observe(this, this::showPasswordError);
loginRelatedViewEvents.getAllFormValidLiveData().observe(this, result -> loginBtn.setEnabled(result.isValid()));
}
private void performDefaultAction(Bundle savedInstanceState) {
if (presenter.checkIfBiometricIsAvailable()) {
String fingerprintText=">> "+getString(R.string.use_fingerprint_text)+" <<";
String fingerprintText = ">> " + getString(R.string.use_fingerprint_text) + " <<";
fingerprintScannerTxtView.setText(fingerprintText);
showFingerPrintScanner(true);
}
usernameId.setText(presenter.getLastLoginIfAvailable());
String userID = presenter.getLastLoginIfAvailable();
if (userID != null && userID.length() > 0)
usernameId.setText(userID);
}
private void showPasswordError(FormInputStateDTO formInputStateDTO) {
if (formInputStateDTO.isValid())
passwordTxtInputLayout.setError(null);
else
passwordTxtInputLayout.setError(formInputStateDTO.getErrorMessage());
}
private void showUserIdError(FormInputStateDTO formInputStateDTO) {
if (formInputStateDTO.isValid())
usernameIdTxtInputLayout.setError(null);
else
usernameIdTxtInputLayout.setError(formInputStateDTO.getErrorMessage());
}
@ -160,8 +150,7 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
registerTxt.setOnClickListener(this);
loginBtn.setOnClickListener(this);
fingerprintScannerView.setOnClickListener(this);
// iv_back.setOnClickListener(this);
// presenter.promptForBiometricAuth(true);
}
@ -173,9 +162,7 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
forgetPwdTxt.setOnClickListener(null);
registerTxt.setOnClickListener(null);
loginBtn.setOnClickListener(null);
// iv_back.setOnClickListener(null);
fingerprintScannerView.setOnClickListener(null);
// presenter.promptForBiometricAuth(false);
}
@ -183,25 +170,14 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
@Override
protected void onResume() {
super.onResume();
if (!isLoadingInProgress)
animateFingerPrintAppearAnimationIfRequired();
}
@Override
protected void onPause() {
super.onPause();
if (!isLoadingInProgress)
animateFingerPrintAppearAnimationIfRequired();
}
@SuppressLint("NewApi")
private void animateFingerPrintAppearAnimationIfRequired() {
if (fingerprintScannerView.getVisibility() == View.VISIBLE) {
} else {
}
}
@ -235,24 +211,16 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
}
private void onLoginBtn() {
if (presenter.validateAll(usernameId.getText().toString())) {
hideKeyBoard();
onLoginPerformTask(() -> presenter.loginUser(usernameId.getText().toString()));
}
presenter.loginUser();
}
@Override
public void onLoginPerformTask(Runnable task) {
morphButtonIntoProgressBar(task);
}
@Override
public void showFingerPrintScanner(boolean action) {
if (action) {
fingerprintScannerView.setVisibility(View.VISIBLE);
fingerprintScannerView.startShimmerAnimation();
}
else {
} else {
fingerprintScannerView.startShimmerAnimation();
fingerprintScannerView.setVisibility(View.GONE);
}
@ -265,12 +233,6 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
}
@Override
public void redirectToKYCScreen(String email, int requestCode) {
Intent startKycIntent = new Intent(this, KYCFormV2Activity.class);
startKycIntent.putExtra(KYCFormV2Activity.USER_EMAIL_ID_BUNDLE_KEY, email);
startActivityForResult(startKycIntent, requestCode);
}
@Override
public void clearUserName() {
@ -307,122 +269,15 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return (isLoadingInProgress || super.dispatchTouchEvent(ev));
}
@Override
public void onBackPressed() {
if (!isLoadingInProgress) {
super.onBackPressed();
}
}
private void morphButtonIntoProgressBar(Runnable task) {
GradientDrawable mGradientDrawable = (GradientDrawable) loginBtn.getBackground();
ObjectAnimator cornerAnimation =
ObjectAnimator.ofFloat(mGradientDrawable,
"cornerRadius",
DEFAULT_CORNER_RADIUS,
loginBtn.getHeight());
originalButtonWidth = loginBtn.getWidth();
ValueAnimator widthAnimation = ValueAnimator.ofInt(loginBtn.getWidth(), loginBtn.getHeight());
widthAnimation.addUpdateListener(valueAnimator -> {
int val = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = loginBtn.getLayoutParams();
layoutParams.width = val;
loginBtn.setLayoutParams(layoutParams);
});
mMorphingAnimatorSet = new AnimatorSet();
mMorphingAnimatorSet.setDuration(330);
mMorphingAnimatorSet.setInterpolator(interpolator);
mMorphingAnimatorSet.playTogether(cornerAnimation, widthAnimation);
mMorphingAnimatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
hideKeyBoard();
mIsMorphingInProgress = true;
isLoadingInProgress = true;
loginBtn.setText("");
}
@Override
public void onAnimationEnd(Animator animation) {
mIsMorphingInProgress = false;
progressbar_login.setVisibility(View.VISIBLE);
if (task != null)
task.run();
}
});
mMorphingAnimatorSet.start();
}
@Override
public void morphProgressBarIntoButton(Runnable callback) {
GradientDrawable mGradientDrawable = (GradientDrawable) loginBtn.getBackground();
ObjectAnimator cornerAnimation =
ObjectAnimator.ofFloat(mGradientDrawable,
"cornerRadius",
loginBtn.getHeight(),
DEFAULT_CORNER_RADIUS);
ValueAnimator widthAnimation = ValueAnimator.ofInt(loginBtn.getHeight(), originalButtonWidth);
widthAnimation.addUpdateListener(valueAnimator -> {
int val = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = loginBtn.getLayoutParams();
layoutParams.width = val;
loginBtn.setLayoutParams(layoutParams);
});
mMorphingAnimatorSet = new AnimatorSet();
mMorphingAnimatorSet.setDuration(330);
mMorphingAnimatorSet.setInterpolator(interpolator);
mMorphingAnimatorSet.playTogether(cornerAnimation, widthAnimation);
mMorphingAnimatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
mIsMorphingInProgress = true;
progressbar_login.setVisibility(View.GONE);
}
@Override
public void onAnimationEnd(Animator animation) {
mIsMorphingInProgress = false;
loginBtn.setText(loginButtonText);
isLoadingInProgress = false;
if (callback != null)
callback.run();
}
});
mMorphingAnimatorSet.start();
}
@Override
public void showInvalidUserId(String message) {
userIdErrorTxt.setErrorText(message);
usernameIdTxtInputLayout.setError(message);
}
@Override
public void showInvalidPassword(String message) {
passwordErrorTxt.setErrorText(message);
passwordTxtInputLayout.setError(message);
}
@Override
@ -445,8 +300,4 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
}
}

64
app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginViewLiveData.java

@ -0,0 +1,64 @@
package com.gmeremit.online.gmeremittance_native.loginV2.view;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO;
import io.reactivex.Observable;
public class LoginViewLiveData {
private MutableLiveData<FormInputStateDTO> userIdInputLiveData;
private MutableLiveData<FormInputStateDTO> passwordInputLiveData;
private MutableLiveData<FormInputStateDTO> allFormValidLiveData;
public LoginViewLiveData() {
userIdInputLiveData=new MutableLiveData<>();
passwordInputLiveData=new MutableLiveData<>();
allFormValidLiveData=new MutableLiveData<>();
}
public LiveData<FormInputStateDTO> getUserIdInputLiveData() {
return userIdInputLiveData;
}
public void setUserIdInputLiveData(FormInputStateDTO userIdInputLiveData) {
this.userIdInputLiveData.setValue(userIdInputLiveData);
}
public LiveData<FormInputStateDTO> getPasswordInputLiveData() {
return passwordInputLiveData;
}
public void setPasswordInputLiveData(FormInputStateDTO passwordInputLiveData) {
this.passwordInputLiveData.setValue( passwordInputLiveData);
}
public LiveData<FormInputStateDTO> getAllFormValidLiveData() {
return allFormValidLiveData;
}
public void setAllFormValidLiveData(FormInputStateDTO allFormValidLiveData) {
this.allFormValidLiveData.setValue(allFormValidLiveData);
}
public static class LoginViewBindings
{
private Observable<CharSequence> userIdTextObservable;
private Observable<CharSequence> passwordInputLiveData;
public LoginViewBindings(Observable<CharSequence> userIdTextObservable, Observable<CharSequence> passwordInputLiveData) {
this.userIdTextObservable = userIdTextObservable;
this.passwordInputLiveData = passwordInputLiveData;
}
public Observable<CharSequence> getUserIdTextObservable() {
return userIdTextObservable;
}
public Observable<CharSequence> getPasswordInputLiveData() {
return passwordInputLiveData;
}
}
}

23
app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/presenter/SplashScreenPresenter.java

@ -20,7 +20,6 @@ public class SplashScreenPresenter extends BasePresenter implements SplashScreen
private final SplashScreenInteractorInterface.SplashScreenGatewayInterface splashGateway;
private final LanguageSelectionGatewayInterface languageGateway;
private RootBeer rootBeer;
private SplashScreenContractInterfacee view;
private List<LanguageModel> languageModels;
private final CompositeDisposable compositeDisposables;
@ -29,7 +28,6 @@ public class SplashScreenPresenter extends BasePresenter implements SplashScreen
this.view = view;
this.splashGateway = splashGateway;
this.languageGateway=languageGateway;
rootBeer = new RootBeer(view.getContext());
this.compositeDisposables = new CompositeDisposable();
}
@ -37,7 +35,6 @@ public class SplashScreenPresenter extends BasePresenter implements SplashScreen
@Override
public void onViewDestroyed() {
super.onViewDestroyed();
rootBeer = null;
if (compositeDisposables != null && !compositeDisposables.isDisposed())
compositeDisposables.dispose();
}
@ -61,20 +58,8 @@ public class SplashScreenPresenter extends BasePresenter implements SplashScreen
}
}
private boolean checkIfAppSafe() {
boolean isSafe = false;
try {
isSafe = new SignatureCheck().validateAppSignature(view.getContext());
} catch (Exception e) {
e.printStackTrace();
isSafe = false;
}
return isSafe ;
}
private boolean hasRootAccess() {
return rootBeer.isRootedWithoutBusyBoxCheck();
}
@Override
public void updatePreferredLanguage(LanguageModel selectedLanguage) {
@ -90,11 +75,7 @@ public class SplashScreenPresenter extends BasePresenter implements SplashScreen
@Override
public boolean checkSafety() {
if (hasRootAccess() || !checkIfAppSafe()) {
view.showPopUpMessage("Access Denied", CustomAlertDialog.AlertType.ALERT, null);
new Handler().postDelayed(() -> view.exitView(), 1500);
return false;
} else
return true;
}

11
app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java

@ -75,9 +75,6 @@ import butterknife.ButterKnife;
public class SplashScreen extends BaseActivity implements View.OnClickListener, LanguageSelectionRVAdapter.LanguageSelectionListener, SplashScreenPresenterInterface.SplashScreenContractInterfacee, PayoutModeSelectionRVAdapter.OnPaymentModeSelectionListener, TextView.OnEditorActionListener, ExchangeRatePresenterInterface.ExchangeRateContractInterfacee {
static {
System.loadLibrary("antidebugger");
}
@BindView(R.id.exRateViewContainer)
ConstraintLayout exRateViewContainer;
@ -197,7 +194,7 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener,
progressBar.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(this, android.R.color.white), android.graphics.PorterDuff.Mode.MULTIPLY);
splashPresenter = new SplashScreenPresenter(this,new SplashScreenGateway(), new LanguageSelectionGateway());
exRatePresenter=new ExchangeRatePresenter(this,new ExchangeRateGateway());
initAntiDebugger();
languageViewTransitionManager = new LanguageViewTransitionManager(this);
initLanguageRV();
initPayoutModeRV();
@ -841,13 +838,7 @@ public class SplashScreen extends BaseActivity implements View.OnClickListener,
}
public native void startAntiDebugger();
private void initAntiDebugger() {
boolean isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
if (isDebuggable)
startAntiDebugger();
}
class ChannelIOEventListener extends ChatUtils.ChannelIOListenerAdapter {

5
app/src/main/res/drawable/vd_lock.xml

@ -3,9 +3,7 @@
android:height="24dp"
android:viewportWidth="5120"
android:viewportHeight="5120">
<group
android:translateX="650"
>
<path
android:pathData="M2268,5101c-565,-98 -1035,-447 -1292,-958 -295,-586 -234,-1307 156,-1835 82,-111 242,-274 355,-360l92,-70 3,-551c4,-532 5,-555 26,-632 89,-323 324,-555 669,-662 83,-26 99,-27 283,-27 184,0 200,1 283,27 345,107 580,339 669,662 21,77 22,100 26,632l3,551 92,70c178,136 362,346 469,537 357,633 289,1423 -169,1987 -81,99 -247,254 -353,330 -185,132 -436,240 -670,289 -150,31 -487,36 -642,10zM2718,4929c617,-68 1134,-476 1336,-1056 67,-195 81,-282 81,-518 0,-183 -3,-223 -23,-313 -73,-326 -205,-566 -436,-797 -227,-227 -457,-357 -761,-431 -619,-150 -1289,113 -1662,652 -65,94 -162,289 -197,396 -58,179 -71,267 -71,493 0,236 14,323 81,518 240,688 938,1135 1652,1056zM1995,1679c412,-142 888,-119 1289,61l66,29 0,-460c0,-520 -4,-557 -70,-694 -94,-195 -282,-346 -508,-407 -105,-28 -306,-30 -407,-4 -305,80 -522,293 -579,569 -13,63 -16,156 -16,536l0,461 58,-26c31,-15 107,-44 167,-65z"
android:fillColor="@color/colorPrimary"
@ -14,5 +12,4 @@
android:pathData="M2477,3880c-105,-27 -197,-104 -244,-205l-28,-60 0,-350 0,-350 33,-67c63,-129 178,-201 322,-201 144,0 259,72 322,201l33,67 0,350 0,350 -28,61c-56,121 -173,201 -304,209 -37,2 -85,0 -106,-5zM2646,3675c28,-16 49,-39 63,-68 20,-41 21,-59 21,-340 0,-330 -2,-340 -63,-394 -64,-56 -150,-56 -214,0 -61,54 -63,64 -63,394 0,280 1,299 21,340 42,87 149,118 235,68z"
android:fillColor="@color/colorPrimary"
android:strokeColor="#00000000"/>
</group>
</vector>

141
app/src/main/res/layout/activity_login_v2.xml

@ -4,7 +4,6 @@
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
@ -12,12 +11,7 @@
android:background="#fff">
<include layout="@layout/layout_kyc_toolbar"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#fff"
tools:context="com.gmeremit.online.gmeremittance_native.sign_in.view.LoginView">
<ScrollView
android:id="@+id/scrollView"
@ -44,74 +38,43 @@
app:txtfontName="@string/bold"/>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:paddingTop="8dp"
android:layout_marginTop="8dp"
android:paddingBottom="2dp"
android:text="@string/login_user_id_text"
android:textSize="@dimen/text_normal"
app:txtfontName="@string/regular" />
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeEditText
style="@style/editetxtsinglelineDone"
android:id="@+id/usernameId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:paddingTop="@dimen/_6sdp"
android:paddingBottom="@dimen/_6sdp"
android:paddingStart="@dimen/_8sdp"
android:paddingEnd="@dimen/_8sdp"
android:textSize="@dimen/text_medium"
android:minHeight="40dp"
<com.gmeremit.online.gmeremittance_native.common.view.MTextInputLayout
android:id="@+id/usernameId_TxtInputLayout"
style="@style/MTextInputLayoutForm"
android:layout_marginTop="@dimen/form_initial_input_margin_top"
app:endIconMode="clear_text"
app:errorEnabled="true"
android:hint="@string/userid_placeholder_text"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:imeOptions="actionDone"
android:background="@drawable/curve_rectangle_edit_text"
app:drawableLeftCompat="@drawable/vd_user"
android:drawablePadding="@dimen/_4sdp"
/>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeErrorTextView
android:id="@+id/userIdErrorTxt"
android:paddingTop="2dp"
android:paddingBottom="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginRight="13dp"
/>
app:startIconDrawable="@drawable/vd_user"
>
<com.gmeremit.online.gmeremittance_native.common.view.MTextInputEditText
android:id="@+id/usernameId_edTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.gmeremit.online.gmeremittance_native.common.view.MTextInputLayout>
<com.gmeremit.online.gmeremittance_native.common.view.MTextInputLayout
android:id="@+id/password_TxtInputLayout"
app:errorEnabled="true"
style="@style/MTextInputLayoutForm"
app:endIconMode="clear_text"
android:hint="@string/password_placeholder_text"
app:startIconDrawable="@drawable/vd_lock"
>
<com.gmeremit.online.gmeremittance_native.common.view.MTextInputEditText
android:gravity="start"
android:id="@+id/password_edTxt"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.gmeremit.online.gmeremittance_native.common.view.MTextInputLayout>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:paddingTop="8dp"
android:paddingBottom="2dp"
android:text="@string/password_text"
android:textSize="@dimen/text_normal"
app:txtfontName="@string/regular" />
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeEditText
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:id="@+id/securityKeyboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeErrorTextView
android:id="@+id/passwordErrorTxt"
android:paddingTop="2dp"
android:paddingBottom="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginRight="13dp"
/>
<com.facebook.shimmer.ShimmerFrameLayout
android:layout_marginTop="@dimen/_5sdp"
@ -134,30 +97,19 @@
</com.facebook.shimmer.ShimmerFrameLayout>
<FrameLayout
android:id="@+id/progressbar_login_container"
android:layout_width="match_parent"
android:paddingTop="10dp"
android:layout_height="wrap_content">
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeButton
style="@style/gme_button"
android:id="@+id/btn_submit"
android:layout_gravity="center"
android:background="@drawable/red_morph_button_bg"
android:text="@string/login_text"
android:textSize="@dimen/button_text_size"
android:textAllCaps="false"
android:textColor="@color/white"
/>
<ProgressBar
android:indeterminate="true"
android:id="@+id/progressbar_login"
android:layout_gravity="center"
android:layout_width="40dp"
android:layout_height="40dp" />
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeButton
android:layout_marginTop="@dimen/_15sdp"
style="@style/gme_button"
android:id="@+id/btn_submit"
android:layout_gravity="center"
android:text="@string/login_text"
android:textSize="@dimen/button_text_size"
android:enabled="false"
android:textAllCaps="false"
android:textColor="@color/white"
/>
</FrameLayout>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
android:id="@+id/tv_forgotpass"
@ -210,7 +162,6 @@
</RelativeLayout>
</LinearLayout>

1
app/src/main/res/layout/activity_transaction_password_prompt.xml

@ -50,7 +50,6 @@
<com.gmeremit.online.gmeremittance_native.security.securitykeypad.SecurityKeyboardView
android:id="@+id/securityKeyboard"
android:layout_width="match_parent"
app:centerGravityInput="false"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/_4sdp"

1
app/src/main/res/layout/gme_user_pwd_prompt_modal.xml

@ -46,7 +46,6 @@
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeEditText
android:id="@+id/securityKeyboard"
android:layout_width="match_parent"
app:centerGravityInput="false"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/_4sdp"

4
app/src/main/res/values/attrs.xml

@ -39,10 +39,10 @@
<declare-styleable name="MTextInputEditText">
<attr name="txtFontName" format="string"/>
<attr name="edTxtFontName" format="string"/>
</declare-styleable>
<declare-styleable name="MTextView">
<attr name="txtFontName" format="string"/>
<attr name="txtViewFontName" format="string"/>
</declare-styleable>
</resources>

14
app/src/main/res/values/dimens.xml

@ -27,10 +27,16 @@
<dimen name="button_text_size">@dimen/_13ssp</dimen>
<dimen name="button_min_height">@dimen/_40sdp</dimen>
<dimen name="button_width">@dimen/_175sdp</dimen>
<dimen name="form_input_padding_top">4dp</dimen>
<dimen name="form_input_padding_bottom">4dp</dimen>
<dimen name="form_input_padding_start">4dp</dimen>
<dimen name="form_input_padding_end">4dp</dimen>
<dimen name="form_input_padding_top">@dimen/_8sdp</dimen>
<dimen name="form_input_padding_bottom">@dimen/_8sdp</dimen>
<dimen name="form_input_padding_start">@dimen/_4sdp</dimen>
<dimen name="form_input_padding_end">@dimen/_4sdp</dimen>
<dimen name="form_input_margin_top">@dimen/_6sdp</dimen>
<dimen name="form_input_margin_bottom">@dimen/_6sdp</dimen>
<dimen name="form_initial_input_margin_top">@dimen/_20sdp</dimen>
</resources>

10
app/src/main/res/values/styles.xml

@ -44,8 +44,8 @@
<style name="gme_button" parent="android:style/Widget.Button">
<item name="android:minHeight">@dimen/button_min_height</item>
<item name="android:background">@drawable/ic_rounded_background_red_coloured</item>
<item name="android:gravity">center</item>
<item name="android:textSize">@dimen/button_text_size</item>
<item name="android:layout_height">wrap_content</item>
@ -213,8 +213,12 @@
</style>
<style name="MTextInputLayoutForm" parent="MTextInputLayout">
<item name="android:paddingTop">@dimen/form_input_padding_top</item>
<item name="android:paddingBottom">@dimen/form_input_padding_bottom</item>
<!-- Setting padding top will result in hint overlapping with outline box, avoid padding until it is resolved by google-->
<!-- <item name="android:paddingTop">@dimen/form_input_padding_top</item>-->
<!-- <item name="android:paddingBottom">@dimen/form_input_padding_bottom</item>-->
<item name="android:layout_marginTop">@dimen/form_input_margin_top</item>
<item name="android:layout_marginBottom">@dimen/form_input_margin_bottom</item>
<item name="android:paddingStart">@dimen/form_input_padding_start</item>
<item name="android:paddingEnd">@dimen/form_input_padding_end</item>
</style>

Loading…
Cancel
Save