Browse Source

Reset password fixes

master
Preyea Regmi 4 years ago
parent
commit
21f2f69bd2
  1. 13
      app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java
  2. 28
      app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/ResetPassViewModelFactory.java
  3. 104
      app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2Presenter.java
  4. 9
      app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2PresenterInterface.java
  5. 54
      app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassViewLiveData.java
  6. 171
      app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/view/ResetPassV2Activity.java
  7. 107
      app/src/main/res/layout/activity_reset_pass_v2.xml

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

@ -106,8 +106,8 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
RxTextView.textChanges(passwordEdTxt).skipInitialValue()
));
loginRelatedViewEvents.getUserIdInputLiveData().observe(this, this::showUserIdError);
loginRelatedViewEvents.getPasswordInputLiveData().observe(this, this::showPasswordError);
loginRelatedViewEvents.getUserIdInputLiveData().observe(this, this::onUserIdDataReceived);
loginRelatedViewEvents.getPasswordInputLiveData().observe(this, this::onPasswordDataReceived);
loginRelatedViewEvents.getAllFormValidLiveData().observe(this, result -> loginBtn.setEnabled(result.isValid()));
}
@ -124,14 +124,17 @@ public class LoginV2Activity extends BaseActivity implements View.OnClickListene
}
private void showPasswordError(FormInputStateDTO formInputStateDTO) {
if (formInputStateDTO.isValid())
private void onPasswordDataReceived(FormInputStateDTO<String> formInputStateDTO) {
if (formInputStateDTO.isValid()) {
passwordTxtInputLayout.setError(null);
if(formInputStateDTO.hasData())
passwordEdTxt.setText(formInputStateDTO.getData());
}
else
passwordTxtInputLayout.setError(formInputStateDTO.getErrorMessage());
}
private void showUserIdError(FormInputStateDTO<String> formInputStateDTO) {
private void onUserIdDataReceived(FormInputStateDTO<String> formInputStateDTO) {
if (formInputStateDTO.isValid()) {
usernameIdTxtInputLayout.setError(null);
if (formInputStateDTO.hasData()) {

28
app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/ResetPassViewModelFactory.java

@ -0,0 +1,28 @@
package com.gmeremit.online.gmeremittance_native.resetpassV2;
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;
import com.gmeremit.online.gmeremittance_native.resetpassV2.gateway.ResetPassV2Gateway;
import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassV2Presenter;
import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassV2PresenterInterface;
public class ResetPassViewModelFactory implements ViewModelProvider.Factory {
private final ResetPassV2PresenterInterface.ResetPassV2ContractInterface view;
public ResetPassViewModelFactory(ResetPassV2PresenterInterface.ResetPassV2ContractInterface view) {
this.view=view;
}
@SuppressWarnings("unchecked")
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) new ResetPassV2Presenter(view,new ResetPassV2Gateway());
}
}

104
app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2Presenter.java

@ -2,7 +2,8 @@ package com.gmeremit.online.gmeremittance_native.resetpassV2.presenter;
import com.gmeremit.online.gmeremittance_native.GmeApplication;
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.resetpassV2.gateway.ResetPassV2Gateway;
import com.gmeremit.online.gmeremittance_native.resetpassV2.model.ResetApiResponse;
@ -12,29 +13,36 @@ import com.gmeremit.online.gmeremittance_native.utils.https.GenericApiObserverRe
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.observers.DisposableObserver;
import io.reactivex.schedulers.Schedulers;
public class ResetPassV2Presenter extends BasePresenter implements ResetPassV2PresenterInterface, ResetPassV2InteractorInterface {
public class ResetPassV2Presenter extends BaseViewModel implements ResetPassV2PresenterInterface, ResetPassV2InteractorInterface {
private final ResetPassV2Gateway gateway;
private final ResetPassV2ContractInterface view;
CompositeDisposable compositeDisposable;
private final CompositeDisposable useCaseCompositeDisposable;
private final CompositeDisposable viewEventCompositeDisposable;
private final ResetPassValidator resetPassValidator;
private final ResetPassViewLiveData resetPassViewLiveData;
public ResetPassV2Presenter(ResetPassV2PresenterInterface.ResetPassV2ContractInterface view,ResetPassV2Gateway gateway) {
this.gateway= gateway;
compositeDisposable=new CompositeDisposable();
useCaseCompositeDisposable =new CompositeDisposable();
viewEventCompositeDisposable = new CompositeDisposable();
resetPassValidator=new ResetPassValidator();
this.view=view;
resetPassViewLiveData = new ResetPassViewLiveData();
}
@Override
public void resetPassword(String emailId, String dob) {
public void resetPassword() {
GmeApplication.AppRelatedMetaData appRelatedMetaData=GmeApplication.getAppRelatedMetaData(view.getContext());
String auth = "Basic " + Utils.toBase64("172017F9EC11222E8107142733:QRK2UM0Q:" + appRelatedMetaData.getDeviceId());
compositeDisposable.add(
gateway.resetPassV2(auth,emailId,dob)
useCaseCompositeDisposable.add(
gateway.resetPassV2(auth,resetPassValidator.userId,"")
.doOnSubscribe(d->view.showProgressBar(true,getStringfromStringId(R.string.processing_request_text)))
.doFinally(()->view.showProgressBar(false,""))
.subscribeOn(Schedulers.io())
@ -46,40 +54,76 @@ public class ResetPassV2Presenter extends BasePresenter implements ResetPassV2Pr
}
@Override
public boolean validateAll(String email, String dob) {
boolean isEmailValid=validateEmail(email);
boolean isDobValid=validateDob(dob);
return isEmailValid&&isDobValid;
public ResetPassViewLiveData getResetPassViewEvents(ResetPassViewLiveData.ResetPassViewBindings viewBindings) {
bindView(viewBindings);
return resetPassViewLiveData;
}
private void bindView(ResetPassViewLiveData.ResetPassViewBindings viewBindings) {
this.viewEventCompositeDisposable.add(
viewBindings.getUserIdTextObservable().map(this.resetPassValidator::isUserIdValid)
.subscribeWith(new DisposableObserver<Boolean>() {
private boolean validateEmail(String emailId) {
if(!Utils.isValidEmail(emailId))
{
this.view.showIncorrectEmail(getStringfromStringId(R.string.email_valid_error));
return false;
}
this.view.showIncorrectEmail(null);
return true;
@Override
public void onNext(Boolean aBoolean) {
resetPassViewLiveData.setAllFormValidLiveData(new FormInputStateDTO(aBoolean, ""));
}
@Override
public void onError(Throwable e) {
resetPassViewLiveData.setAllFormValidLiveData(new FormInputStateDTO(false, ""));
}
@Override
public void onComplete() {
}
})
);
}
private boolean validateDob(String dobString) {
// if(dobString==null||dobString.trim().length()<1)
// {
// view.showIncorrectDob(getStringfromStringId(R.string.dob_valid_error));
// return false;
// }
// view.showIncorrectDob(null);
return true;
@Override
public void onViewReady() {
}
@Override
public void onViewNotReady() {
}
@Override
public void onViewDestroyed() {
super.onViewDestroyed();
if (compositeDisposable != null & !compositeDisposable.isDisposed()) {
compositeDisposable.dispose();
compositeDisposable.clear();
if ( !useCaseCompositeDisposable.isDisposed()) {
useCaseCompositeDisposable.dispose();
}
}
public class ResetPassValidator
{
private String userId;
public boolean isUserIdValid(CharSequence userID)
{
if(userID==null|| userID.length()<1)
{
resetPassViewLiveData.setUserIdInputLiveData(new FormInputStateDTO(false, getStringfromStringId(R.string.user_id_empty_error)));
this.userId = null;
return false;
}
else
{
resetPassViewLiveData.setUserIdInputLiveData(new FormInputStateDTO(true, ""));
this.userId = userID.toString();
return true;
}
}
}
public class ResetPassObserver extends GenericApiObserverResponse<ResetApiResponse>

9
app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassV2PresenterInterface.java

@ -9,17 +9,16 @@ public interface ResetPassV2PresenterInterface extends BasePresenterInterface {
void resetPassword(String emailId, String dob);
void resetPassword();
ResetPassViewLiveData getResetPassViewEvents(ResetPassViewLiveData.ResetPassViewBindings viewBindings);
boolean validateAll(String email,String dob);
interface ResetPassV2ContractInterface extends BaseContractInterface
{
void showIncorrectEmail(String message);
void showIncorrectDob(String message);
Context getContext();
}}

54
app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/presenter/ResetPassViewLiveData.java

@ -0,0 +1,54 @@
package com.gmeremit.online.gmeremittance_native.resetpassV2.presenter;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO;
import io.reactivex.Observable;
public class ResetPassViewLiveData {
private MutableLiveData<FormInputStateDTO<String>> userIdInputLiveData;
private MutableLiveData<FormInputStateDTO> allFormValidLiveData;
public ResetPassViewLiveData() {
userIdInputLiveData=new MutableLiveData<>();
allFormValidLiveData=new MutableLiveData<>();
}
public LiveData<FormInputStateDTO> getAllFormValidLiveData() {
return allFormValidLiveData;
}
public void setAllFormValidLiveData(FormInputStateDTO allFormValidLiveData) {
this.allFormValidLiveData.setValue(allFormValidLiveData);
}
public LiveData<FormInputStateDTO<String>> getUserIdInputLiveData() {
return userIdInputLiveData;
}
public void setUserIdInputLiveData(FormInputStateDTO userIdInputLiveData) {
this.userIdInputLiveData.setValue(userIdInputLiveData);
}
public static class ResetPassViewBindings
{
private Observable<CharSequence> userIdTextObservable;
private Observable<CharSequence> passwordInputLiveData;
public ResetPassViewBindings(Observable<CharSequence> userIdTextObservable) {
this.userIdTextObservable = userIdTextObservable;
}
public Observable<CharSequence> getUserIdTextObservable() {
return userIdTextObservable;
}
}
}

171
app/src/main/java/com/gmeremit/online/gmeremittance_native/resetpassV2/view/ResetPassV2Activity.java

@ -1,47 +1,32 @@
package com.gmeremit.online.gmeremittance_native.resetpassV2.view;
import android.content.Context;
import android.graphics.Rect;
import androidx.core.view.GestureDetectorCompat;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.FrameLayout;
import androidx.lifecycle.ViewModelProvider;
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.resetpassV2.gateway.ResetPassV2Gateway;
import com.gmeremit.online.gmeremittance_native.common.model.FormInputStateDTO;
import com.gmeremit.online.gmeremittance_native.resetpassV2.ResetPassViewModelFactory;
import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassV2Presenter;
import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassV2PresenterInterface;
import com.gmeremit.online.gmeremittance_native.utils.Utils;
import com.tsongkha.spinnerdatepicker.SpinnerDatePickerDialogBuilder;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import com.gmeremit.online.gmeremittance_native.resetpassV2.presenter.ResetPassViewLiveData;
import com.google.android.material.textfield.TextInputLayout;
import com.jakewharton.rxbinding3.widget.RxTextView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class ResetPassV2Activity extends BaseActivity implements View.OnClickListener, ResetPassV2PresenterInterface.ResetPassV2ContractInterface {
@BindView(R.id.email_mobile)
EditText emailId;
@BindView(R.id.ed_dob)
EditText ed_dob;
public class ResetPassV2Activity extends BaseActivity implements ResetPassV2PresenterInterface.ResetPassV2ContractInterface {
@BindView(R.id.emailErrorTxt)
GmeErrorTextView emailErrorTxt;
@BindView(R.id.dateErrorTxt)
GmeErrorTextView dateErrorTxt;
@BindView(R.id.email_mobile_TxtInputLayout)
TextInputLayout emailTxtInputLayout;
@BindView(R.id.email_mobile_edTxt)
EditText emailIdEdTxt;
@BindView(R.id.btn_submit)
View btn_submit;
@ -50,17 +35,10 @@ public class ResetPassV2Activity extends BaseActivity implements View.OnClickLis
View iv_back;
@BindView(R.id.ed_dob_container)
FrameLayout ed_dob_container;
private ResetPassV2PresenterInterface presenterInterface;
private ResetPassViewLiveData resetPassLiveData;
private GestureDetectorCompat dobConatinerClickGestureDetector;
private ResetDobClickGestureDetector dobContainerOnClickGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -71,128 +49,45 @@ public class ResetPassV2Activity extends BaseActivity implements View.OnClickLis
}
private void initialize() {
presenterInterface = new ResetPassV2Presenter(this,new ResetPassV2Gateway());
iv_back.setVisibility(View.VISIBLE);
dobContainerOnClickGestureDetector = new ResetDobClickGestureDetector();
dobConatinerClickGestureDetector = new GestureDetectorCompat(this, dobContainerOnClickGestureDetector);
}
private void performDefaultAction(Bundle savedInstanceState) {
}
// @Override
// public boolean dispatchTouchEvent(MotionEvent ev) {
// return (dobConatinerClickGestureDetector.onTouchEvent(ev) || super.dispatchTouchEvent(ev));
// }
presenterInterface = new ViewModelProvider(this, new ResetPassViewModelFactory(this)).get(ResetPassV2Presenter.class);
resetPassLiveData = presenterInterface.getResetPassViewEvents(new ResetPassViewLiveData.ResetPassViewBindings(RxTextView.textChanges(emailIdEdTxt).skipInitialValue()));
@Override
protected void onStart() {
super.onStart();
btn_submit.setOnClickListener(this);
iv_back.setOnClickListener(this);
resetPassLiveData.getUserIdInputLiveData().observe(this, this::onUserIdDataRecieved);
resetPassLiveData.getAllFormValidLiveData().observe(this, result->btn_submit.setEnabled(result.isValid()));
}
@Override
protected void onStop() {
super.onStop();
btn_submit.setOnClickListener(null);
iv_back.setOnClickListener(null);
private void onUserIdDataRecieved(FormInputStateDTO<String> formData) {
if (formData.isValid()) {
emailTxtInputLayout.setError(null);
if (formData.hasData())
emailIdEdTxt.setText(formData.getData());
} else
emailTxtInputLayout.setError(formData.getErrorMessage());
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_submit:
if (presenterInterface.validateAll(emailId.getText().toString(),ed_dob.getText().toString()) ) {
hideKeyBoard();
presenterInterface.resetPassword(emailId.getText().toString(), ed_dob.getText().toString());
}
break;
private void performDefaultAction(Bundle savedInstanceState) {
case R.id.iv_back:
onBackPressed();
break;
}
}
public void promptDatePicker() {
hideKeyBoard();
SpinnerDatePickerDialogBuilder builder = new SpinnerDatePickerDialogBuilder();
builder.context(ResetPassV2Activity.this)
.spinnerTheme(R.style.NumberPickerStyle)
.showTitle(true)
.showDaySpinner(true)
.dialogTheme(R.style.DatePickerTheme)
.setTitle(getString(R.string.select_dob_text))
.setPositiveButtonText(getString(R.string.ok_text))
.setNegativeButtonText(getString(R.string.cancel_text))
.setCurrentDateAsMaxDate()
.defaultDate(1990, 1, 1)
.callback(new com.tsongkha.spinnerdatepicker.DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(com.tsongkha.spinnerdatepicker.DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
Calendar newDate = Calendar.getInstance();
newDate.set(year, monthOfYear, dayOfMonth);
ed_dob.setText(new SimpleDateFormat(Utils.getDefaultDateFormat(), Locale.US).format(newDate.getTime()));
}
})
.build().show();
}
@Override
public void showIncorrectEmail(String message) {
emailErrorTxt.setErrorText(message);
@OnClick(R.id.iv_back)
public void onBackBtnClicked() {
onBackPressed();
}
@Override
public void showIncorrectDob(String message) {
dateErrorTxt.setErrorText(message);
}
@Override
public Context getContext() {
return this;
@OnClick(R.id.btn_submit)
public void onSubmitBtnClicked() {
presenterInterface.resetPassword();
}
class ResetDobClickGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_UP) {
boolean isDobContainerClicked = checkIfDateContainerIsClicked(e.getX(), e.getY());
if (isDobContainerClicked)
promptDatePicker();
return isDobContainerClicked;
}
return super.onSingleTapUp(e);
}
private boolean checkIfDateContainerIsClicked(float x, float y) {
int posX = (int) x;
int posY = (int) y;
int[] dobConatinerLeftAndTopCoordinates = new int[2];
}
ed_dob_container.getLocationOnScreen(dobConatinerLeftAndTopCoordinates);
Rect dobContainerBoundRect = new Rect(dobConatinerLeftAndTopCoordinates[0], dobConatinerLeftAndTopCoordinates[1],
dobConatinerLeftAndTopCoordinates[0] + ed_dob_container.getMeasuredWidth(),
dobConatinerLeftAndTopCoordinates[1] + ed_dob_container.getMeasuredHeight());
return dobContainerBoundRect.contains(posX, posY);
}
}
}

107
app/src/main/res/layout/activity_reset_pass_v2.xml

@ -30,7 +30,7 @@
android:paddingBottom="5dp"
android:text="@string/forgot_password_title_text"
android:textColor="@color/colorAccent"
android:textSize="24sp"
android:textSize="@dimen/h5"
app:txtfontName="@string/bold"/>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
@ -40,92 +40,27 @@
android:textSize="14sp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
app:txtfontName="@string/regular"
/>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="2dp"
android:text="@string/forgot_password_userId_placeholder_text"
android:textSize="14sp"
app:txtfontName="@string/regular" />
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeEditText
style="@style/editetxtsinglelineDone"
android:id="@+id/email_mobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingStart="8dp"
android:paddingEnd="8dp"
android:textSize="16sp"
android:minHeight="40dp"
android:hint="@string/userid_title_text"
android:imeOptions="actionDone"
android:background="@drawable/curve_rectangle_edit_text"
/>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeErrorTextView
android:layout_marginStart="3dp"
android:id="@+id/emailErrorTxt"
android:paddingTop="2dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="2dp"
android:text="@string/dob_text"
android:visibility="gone"
android:textSize="14sp"
app:txtfontName="@string/regular" />
<FrameLayout
android:id="@+id/ed_dob_container"
android:visibility="gone"
android:layout_marginTop="4dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/curve_rectangle_edit_text"
android:orientation="horizontal"
<com.gmeremit.online.gmeremittance_native.common.view.MTextInputLayout
android:id="@+id/email_mobile_TxtInputLayout"
app:errorEnabled="true"
style="@style/MTextInputLayoutForm"
app:endIconMode="clear_text"
android:hint="@string/forgot_password_userId_placeholder_text"
app:startIconDrawable="@drawable/vd_lock"
>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeEditText
android:focusable="false"
android:focusableInTouchMode="false"
android:cursorVisible="false"
style="@style/editetxtsinglelineDone"
android:id="@+id/ed_dob"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingStart="8dp"
android:background="@android:color/transparent"
android:paddingEnd="8dp"
android:textSize="16sp"
android:minHeight="40dp"
android:hint="@string/dob_text"
android:imeOptions="actionDone"
/>
<ImageView
android:layout_marginEnd="10dp"
android:layout_gravity="center_vertical|end"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/ic_arrow_down"
/>
</FrameLayout>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeErrorTextView
android:id="@+id/dateErrorTxt"
android:paddingTop="2dp"
android:layout_marginStart="3dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<com.gmeremit.online.gmeremittance_native.common.view.MTextInputEditText
android:inputType="text"
android:id="@+id/email_mobile_edTxt"
style="@style/MTextInputEditText"/>
</com.gmeremit.online.gmeremittance_native.common.view.MTextInputLayout>
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeButton
android:id="@+id/btn_submit"
@ -133,11 +68,9 @@
android:layout_gravity="center"
android:layout_marginBottom="4dp"
android:layout_marginTop="30dp"
android:background="@drawable/ic_rounded_background_red_coloured"
android:enabled="false"
android:text="@string/reset_text"
android:textAllCaps="false"
android:textColor="@color/white"
android:textSize="18sp"/>
/>
</LinearLayout>
</ScrollView>

Loading…
Cancel
Save