Commit 352d8b6d authored by Trio Saputra's avatar Trio Saputra

forgot password with token activication

parent 75eb9e48
...@@ -36,6 +36,7 @@ dependencies { ...@@ -36,6 +36,7 @@ dependencies {
implementation 'com.google.android.material:material:1.2.0' implementation 'com.google.android.material:material:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.viewpager:viewpager:1.0.0' implementation 'androidx.viewpager:viewpager:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
def room_version = "2.2.5" def room_version = "2.2.5"
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
package="com.example.yourcashiertest"> package="com.example.yourcashiertest">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...@@ -21,11 +21,14 @@ ...@@ -21,11 +21,14 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme2"> android:theme="@style/AppTheme2">
<activity android:name=".activities.OrderDetailActivity"></activity> <activity android:name=".activities.VerificationActivity"></activity>
<activity android:name=".activities.OrderDetailActivity" />
<service <service
android:name=".services.BackgroundService" android:name=".services.BackgroundService"
android:enabled="true" android:enabled="true"
android:exported="true" /> android:exported="true" />
<receiver android:name=".activities.InetChecker"> <receiver android:name=".activities.InetChecker">
<intent-filter> <intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
......
...@@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModelProvider; ...@@ -7,6 +7,7 @@ import androidx.lifecycle.ViewModelProvider;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.Toast; import android.widget.Toast;
...@@ -14,12 +15,14 @@ import android.widget.Toast; ...@@ -14,12 +15,14 @@ import android.widget.Toast;
import com.example.yourcashiertest.R; import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.ActivityForgetPasswordBinding; import com.example.yourcashiertest.databinding.ActivityForgetPasswordBinding;
import com.example.yourcashiertest.models.Password; import com.example.yourcashiertest.models.Password;
import com.example.yourcashiertest.utils.ViewUtil;
import com.example.yourcashiertest.viewmodels.UserViewModel; import com.example.yourcashiertest.viewmodels.UserViewModel;
public class ForgetPassword extends AppCompatActivity { public class ForgetPassword extends AppCompatActivity {
ActivityForgetPasswordBinding binding; ActivityForgetPasswordBinding binding;
UserViewModel userViewModel; UserViewModel userViewModel;
PrefManager prefManager;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
...@@ -27,30 +30,25 @@ public class ForgetPassword extends AppCompatActivity { ...@@ -27,30 +30,25 @@ public class ForgetPassword extends AppCompatActivity {
binding = DataBindingUtil.setContentView(this, R.layout.activity_forget_password); binding = DataBindingUtil.setContentView(this, R.layout.activity_forget_password);
userViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(UserViewModel.class); userViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(UserViewModel.class);
userViewModel.setListUser(); binding.btnVerifyToken.setOnClickListener(this::SendToken);
binding.btnResetPw.setOnClickListener(v -> {
resetPassword();
binding.setLoading(true);
});
} }
public void resetPassword() { private void SendToken(View v){
userViewModel.getListUser().observe(this, users -> { prefManager = new PrefManager(this);
for (int i = 0; i < users.size(); i++){ String inputToken = binding.etToken.getText().toString();
if (binding.etEmail.getText().toString().equals(users.get(i).getEmail())){ binding.setLoading(false);
Password password = new Password(); if (!TextUtils.isEmpty(inputToken)){
password.setNewPassword(binding.etNewPw.getText().toString()); if ( prefManager.getTokenVerify().equals(inputToken)){
userViewModel.resetPassword(users.get(i).getId() , password); binding.setLoading(true);
binding.setLoading(false); Toast.makeText(getApplicationContext(), "Successfully validation!", Toast.LENGTH_SHORT).show();
Toast.makeText(ForgetPassword.this, "Reset Password Success", Toast.LENGTH_LONG).show(); startActivity(new Intent(this, VerificationActivity.class));
startActivity(new Intent(ForgetPassword.this, LoginActivity.class)); } else {
finish(); Toast.makeText(getApplicationContext(), "Your input token is invalid!", Toast.LENGTH_SHORT).show();
return;
}
} }
binding.setLoading(false); } else {
Toast.makeText(ForgetPassword.this, "User Not Found!", Toast.LENGTH_LONG).show(); binding.etToken.setError("Field token cannot be empty");
}); }
} }
} }
\ No newline at end of file
...@@ -40,6 +40,9 @@ public class LoginActivity extends AppCompatActivity { ...@@ -40,6 +40,9 @@ public class LoginActivity extends AppCompatActivity {
UserViewModel viewModel; UserViewModel viewModel;
InetChecker network = new InetChecker(); InetChecker network = new InetChecker();
ViewUtil utils = new ViewUtil(); ViewUtil utils = new ViewUtil();
VerifyMailFragment emailFragment;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
...@@ -68,7 +71,8 @@ public class LoginActivity extends AppCompatActivity { ...@@ -68,7 +71,8 @@ public class LoginActivity extends AppCompatActivity {
} }
public void tvForgetPassword(View view) { public void tvForgetPassword(View view) {
startActivity(new Intent(LoginActivity.this, ForgetPassword.class)); emailFragment = new VerifyMailFragment(LoginActivity.this, viewModel);
emailFragment.show(getSupportFragmentManager(), emailFragment.getTag());
} }
public void tvSignUpHere(View view) { public void tvSignUpHere(View view) {
......
...@@ -5,6 +5,7 @@ import android.content.SharedPreferences; ...@@ -5,6 +5,7 @@ import android.content.SharedPreferences;
public class PrefManager { public class PrefManager {
SharedPreferences pref; SharedPreferences pref;
SharedPreferences.Editor editor; SharedPreferences.Editor editor;
Context _context; Context _context;
...@@ -16,6 +17,8 @@ public class PrefManager { ...@@ -16,6 +17,8 @@ public class PrefManager {
private static final String IS_FIRST_WELCOME = "IsFirstWelcome"; private static final String IS_FIRST_WELCOME = "IsFirstWelcome";
private static final String IS_FIRST_LOGIN = "IsFirstLogin"; private static final String IS_FIRST_LOGIN = "IsFirstLogin";
private static final String DATA_USER = "data_user"; private static final String DATA_USER = "data_user";
private static final String TOKEN_VERIFY = "tokenVerify";
private static final String EMAIL_SESSION = "example@example.com";
public PrefManager(Context context) { public PrefManager(Context context) {
this._context = context; this._context = context;
...@@ -37,9 +40,24 @@ public class PrefManager { ...@@ -37,9 +40,24 @@ public class PrefManager {
editor.commit(); editor.commit();
} }
public void setToken(String token){
editor.putString(TOKEN_VERIFY, token);
editor.commit();
}
public void setEmailSession(String email){
editor.putString(EMAIL_SESSION, email);
editor.commit();
}
public String getTokenVerify() { return pref.getString(TOKEN_VERIFY, "token");}
public String getDataUser(){ public String getDataUser(){
return pref.getString(DATA_USER, "User"); return pref.getString(DATA_USER, "User");
} }
public String getEmailSession() { return pref.getString(EMAIL_SESSION, "cek@gmail.com");}
public boolean isFirstLogin(){return pref.getBoolean(IS_FIRST_LOGIN, true);} public boolean isFirstLogin(){return pref.getBoolean(IS_FIRST_LOGIN, true);}
public boolean isFirstWelcome() { return pref.getBoolean(IS_FIRST_WELCOME, true); } public boolean isFirstWelcome() { return pref.getBoolean(IS_FIRST_WELCOME, true); }
......
package com.example.yourcashiertest.activities;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.databinding.ActivityVerificationBinding;
import com.example.yourcashiertest.models.NewPassword;
import com.example.yourcashiertest.viewmodels.UserViewModel;
public class VerificationActivity extends AppCompatActivity {
ActivityVerificationBinding binding;
NewPassword newPassword;
EditText etEmail;
UserViewModel viewModel;
PrefManager prefManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, R.layout.activity_verification);
viewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(UserViewModel.class);
etEmail = findViewById(R.id.etEmailVerify);
newPassword = new NewPassword();
prefManager = new PrefManager(this);
binding.btnResetPw.setOnClickListener(this::sendNewPassword);
}
private void sendNewPassword(View view){
if (TextUtils.isEmpty(binding.etNewPw.getText().toString())){
binding.etNewPw.setError("New password cannot be empty");
} else if ( TextUtils.isEmpty(binding.etRepeatPw.getText().toString())){
binding.etRepeatPw.setError("Repeat password cannot be empty");
} else if (!binding.etNewPw.getText().toString().equals(binding.etRepeatPw.getText().toString())){
binding.etRepeatPw.setError("Repeat password didn't match !");
} else{
newPassword.setEmail(prefManager.getEmailSession());
newPassword.setPassword(binding.etNewPw.getText().toString());
viewModel.newPassword(newPassword);
binding.setLoading(true);
binding.btnResetPw.setEnabled(false);
Toast.makeText(this, "Password successfully changed!", Toast.LENGTH_SHORT).show();
startActivity(new Intent(this, LoginActivity.class));
}
binding.setLoading(false);
}
}
package com.example.yourcashiertest.activities;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.util.Patterns;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.yourcashiertest.R;
import com.example.yourcashiertest.models.ForgotPassword;
import com.example.yourcashiertest.models.Password;
import com.example.yourcashiertest.viewmodels.UserViewModel;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import java.util.Objects;
import java.util.regex.Pattern;
public class VerifyMailFragment extends BottomSheetDialogFragment {
ForgotPassword forgotPassword;
UserViewModel userViewModel;
View view;
EditText etEmail;
BottomSheetDialog sheetDialog;
BottomSheetBehavior sheetBehavior;
Button btnVerify;
Context context;
Pattern patern;
Password password;
PrefManager prefManager;
public VerifyMailFragment(Context context, UserViewModel model) {
this.context = context;
this.userViewModel = model;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
sheetDialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
view = View.inflate(getContext(), R.layout.fragment_verify_mail, null);
sheetDialog.setContentView(view);
sheetBehavior = BottomSheetBehavior.from((View) (view.getParent()));
etEmail = view.findViewById(R.id.etEmailVerify);
btnVerify = view.findViewById(R.id.btnSendEmail);
btnVerify.setOnClickListener(this::sendMail);
return sheetDialog;
}
private void sendMail(View v) {
patern = Patterns.EMAIL_ADDRESS;
prefManager = new PrefManager(getContext());
if (TextUtils.isEmpty(etEmail.getText().toString())) {
etEmail.setError("Email field cannot be empty");
} else if (!(patern.matcher(etEmail.getText().toString()).matches())) {
etEmail.setError("Email is invalid format");
} else {
forgotPassword = new ForgotPassword();
forgotPassword.setEmail(etEmail.getText().toString());
userViewModel.resetPassword(forgotPassword);
userViewModel.getToken().observe(this, userModel -> {
if (userModel != null){
prefManager.setEmailSession(etEmail.getText().toString());
prefManager.setToken(userModel.getToken());
Toast.makeText(getContext(), "We has been sent token code, please check your email!", Toast.LENGTH_SHORT).show();
this.context.startActivity(new Intent(this.context, ForgetPassword.class));
}else {
etEmail.setError("Your mail isn't registed!");
}
});
}
}
}
\ No newline at end of file
package com.example.yourcashiertest.models;
import com.google.gson.annotations.SerializedName;
public class ForgotPassword {
@SerializedName("email")
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return
"{" +
" \"email\" = '\"" + email + '\"' +
"}";
}
}
package com.example.yourcashiertest.models;
import com.google.gson.annotations.SerializedName;
public class NewPassword {
@SerializedName("password")
private String password;
@SerializedName("email")
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
\ No newline at end of file
...@@ -3,23 +3,31 @@ package com.example.yourcashiertest.models; ...@@ -3,23 +3,31 @@ package com.example.yourcashiertest.models;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
public class Password{ public class Password{
private boolean status;
private String token;
@SerializedName("new_password") public String getToken() {
private String newPassword; return token;
}
public void setToken(String token) {
this.token = token;
}
public void setNewPassword(String newPassword) { public boolean isStatus() {
this.newPassword = newPassword; return status;
} }
public String getNewPassword(){ public void setStatus(boolean status) {
return newPassword; this.status = status;
} }
@Override @Override
public String toString(){ public String toString(){
return return
"{" + "{" +
" \"new_password\" = '\"" + newPassword + '\"' + " \"status\" = '\"" + status + '\"' + " \"token\" = '\"" + token + '\"' +
"}"; "}";
} }
} }
package com.example.yourcashiertest.services; package com.example.yourcashiertest.services;
import com.example.yourcashiertest.models.Data; import com.example.yourcashiertest.models.Data;
import com.example.yourcashiertest.models.ForgotPassword;
import com.example.yourcashiertest.models.Login; import com.example.yourcashiertest.models.Login;
import com.example.yourcashiertest.models.NewPassword;
import com.example.yourcashiertest.models.Password; import com.example.yourcashiertest.models.Password;
import com.example.yourcashiertest.models.ResponseLogin; import com.example.yourcashiertest.models.ResponseLogin;
import com.example.yourcashiertest.models.ResponseUser; import com.example.yourcashiertest.models.ResponseUser;
...@@ -29,8 +31,13 @@ public interface UserService { ...@@ -29,8 +31,13 @@ public interface UserService {
@POST("v1/login") @POST("v1/login")
Call<ResponseLogin> loginUser(@Body Login login); Call<ResponseLogin> loginUser(@Body Login login);
@Headers("Content-Type: application/json")
@POST("v1/reset_password")
Call<Password> editPassword(@Body ForgotPassword forgotPassword);
@Headers("Content-Type: application/json") @Headers("Content-Type: application/json")
@PUT("v1/change_password/{id}") @PUT("v1/change_password")
Call<Password> editPassword(@Path("id") int id, @Body Password password); Call<ResponseUser> changePassword(@Body NewPassword newPassword);
} }
...@@ -8,7 +8,9 @@ import androidx.lifecycle.ViewModel; ...@@ -8,7 +8,9 @@ import androidx.lifecycle.ViewModel;
import com.example.yourcashiertest.activities.RegisterActivity; import com.example.yourcashiertest.activities.RegisterActivity;
import com.example.yourcashiertest.clients.ApiClient; import com.example.yourcashiertest.clients.ApiClient;
import com.example.yourcashiertest.models.ForgotPassword;
import com.example.yourcashiertest.models.Login; import com.example.yourcashiertest.models.Login;
import com.example.yourcashiertest.models.NewPassword;
import com.example.yourcashiertest.models.Password; import com.example.yourcashiertest.models.Password;
import com.example.yourcashiertest.models.ResponseUser; import com.example.yourcashiertest.models.ResponseUser;
import com.example.yourcashiertest.models.User; import com.example.yourcashiertest.models.User;
...@@ -23,6 +25,7 @@ import retrofit2.Response; ...@@ -23,6 +25,7 @@ import retrofit2.Response;
public class UserViewModel extends ViewModel { public class UserViewModel extends ViewModel {
MutableLiveData<List<User>> listUser = new MutableLiveData<>(); MutableLiveData<List<User>> listUser = new MutableLiveData<>();
MutableLiveData<Password> token = new MutableLiveData();
public static final String BASE_URL = "https://your-cashier.herokuapp.com/api/"; public static final String BASE_URL = "https://your-cashier.herokuapp.com/api/";
...@@ -61,12 +64,18 @@ public class UserViewModel extends ViewModel { ...@@ -61,12 +64,18 @@ public class UserViewModel extends ViewModel {
} }
public void resetPassword(int id, Password password){ public void resetPassword(ForgotPassword forgotPassword){
ApiClient.client(UserService.class, BASE_URL) ApiClient.client(UserService.class, BASE_URL).editPassword(forgotPassword).enqueue(new Callback<Password>() {
.editPassword(id, password).enqueue(new Callback<Password>() {
@Override @Override
public void onResponse(Call<Password> call, Response<Password> response) { public void onResponse(Call<Password> call, Response<Password> response) {
Log.d("response", response.message()); if (response.code() < 400) {
Log.e("data", "data " + response.body());
assert response.body() != null;
token.setValue(response.body());
} else {
token.setValue(null);
Log.e("data", "error request");
}
} }
@Override @Override
...@@ -76,7 +85,29 @@ public class UserViewModel extends ViewModel { ...@@ -76,7 +85,29 @@ public class UserViewModel extends ViewModel {
}); });
} }
// public void login(Login login){ public MutableLiveData<Password> getToken() {
return token;
}
public void newPassword(NewPassword newPassword){
ApiClient.client(UserService.class, BASE_URL).changePassword(newPassword)
.enqueue(new Callback<ResponseUser>() {
@Override
public void onResponse(Call<ResponseUser> call, Response<ResponseUser> response) {
if ( response.code() < 400) {
assert response.body() != null;
Log.e("data", response.body().toString());
}
}
@Override
public void onFailure(Call<ResponseUser> call, Throwable t) {
t.printStackTrace();
}
});
}
// public void login(Login login){
// ApiClient.client(UserService.class, BASE_URL) // ApiClient.client(UserService.class, BASE_URL)
// .loginUser(login).enqueue(new Callback<Login>() { // .loginUser(login).enqueue(new Callback<Login>() {
// @Override // @Override
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
tools:context=".activities.ForgetPassword"> tools:context=".activities.ForgetPassword">
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/tvResetPassword" android:id="@+id/tvToken"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="25dp" android:textSize="25dp"
...@@ -28,81 +28,44 @@ ...@@ -28,81 +28,44 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
android:textStyle="bold" android:textStyle="bold"
android:text="RESET PASSWORD" /> android:text="Verification Token" />
<com.google.android.material.textfield.TextInputLayout <EditText
android:id="@+id/tilEmail" android:id="@+id/etToken"
app:boxBackgroundColor="@color/white"
android:textColorHint="@color/grey"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvResetPassword" android:hint="Token"
android:inputType="text"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:layout_marginStart="@dimen/space_default" android:layout_marginStart="@dimen/space_default"
android:layout_marginEnd="@dimen/space_default" android:layout_marginEnd="@dimen/space_default"
android:layout_marginBottom="@dimen/space_default"> app:layout_constraintTop_toBottomOf="@+id/tvToken"
android:imeOptions="actionNext"
<com.google.android.material.textfield.TextInputEditText android:textSize="@dimen/text_default" />
android:id="@+id/etEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:inputType="textEmailAddress"
android:imeOptions="actionNext"
android:textSize="@dimen/text_default" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilNewPw"
app:passwordToggleEnabled="true"
app:boxBackgroundColor="@color/white"
android:textColorHint="@color/grey"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tilEmail"
android:layout_marginTop="20dp"
android:layout_marginStart="@dimen/space_default"
android:layout_marginEnd="@dimen/space_default"
android:layout_marginBottom="@dimen/space_default">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etNewPw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="New Password"
android:inputType="text"
android:imeOptions="actionNext"
android:textSize="@dimen/text_default" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/btnResetPw" android:id="@+id/btnVerifyToken"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:backgroundTint="@color/colorPrimary" android:backgroundTint="@color/colorPrimary"
android:padding="@dimen/space_default" android:padding="@dimen/space_default"
android:visibility="@{loading ? View.GONE : View.VISIBLE}" android:imeOptions="actionDone"
android:text="RESET PASSWORD" android:text="RESET PASSWORD"
app:cornerRadius="@dimen/space_default" app:cornerRadius="@dimen/space_default"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tilNewPw"
app:layout_constraintVertical_bias="0.008" /> app:layout_constraintVertical_bias="0.008" />
<ProgressBar <ProgressBar
android:id="@+id/pgLoading" android:id="@+id/pgLoading"
android:layout_width="35dp" android:layout_width="35dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="@{loading ? View.VISIBLE : View.GONE}" app:layout_constraintBottom_toTopOf="@+id/btnVerifyToken"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintEnd_toEndOf="@+id/btnResetPw"
app:layout_constraintHorizontal_bias="0.519"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tilNewPw" android:visibility="@{loading ? View.GONE : View.VISIBLE}"
app:layout_constraintVertical_bias="0.069" /> app:layout_constraintTop_toBottomOf="@+id/etToken" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</layout> </layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<import type="android.view.View"/>
<variable
name="loading"
type="boolean" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingHorizontal="10dp"
tools:context=".activities.ForgetPassword">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/tvResetPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25sp"
android:layout_marginStart="10dp"
android:layout_marginTop="50dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:textStyle="bold"
android:text="RESET PASSWORD" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilNewPw"
app:passwordToggleEnabled="true"
app:boxBackgroundColor="@color/white"
android:textColorHint="@color/grey"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvResetPassword"
android:layout_marginTop="20dp"
android:layout_marginStart="@dimen/space_default"
android:layout_marginEnd="@dimen/space_default"
android:layout_marginBottom="@dimen/space_default">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etNewPw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="New Password"
android:inputType="text"
android:imeOptions="actionNext"
android:textSize="@dimen/text_default" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilRepeatPw"
app:passwordToggleEnabled="true"
app:boxBackgroundColor="@color/white"
android:textColorHint="@color/grey"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tilNewPw"
android:layout_marginTop="30dp"
android:layout_marginStart="@dimen/space_default"
android:layout_marginEnd="@dimen/space_default"
android:layout_marginBottom="@dimen/space_default">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etRepeatPw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Repeat new password"
android:inputType="text"
android:imeOptions="actionNext"
android:textSize="@dimen/text_default" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnResetPw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="4dp"
android:backgroundTint="@color/colorPrimary"
android:padding="@dimen/space_default"
android:visibility="@{loading ? View.GONE : View.VISIBLE}"
android:text="RESET PASSWORD"
app:cornerRadius="@dimen/space_default"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintVertical_bias="0.008" />
<ProgressBar
android:id="@+id/pgLoading"
android:layout_width="35dp"
android:layout_height="wrap_content"
android:visibility="@{loading ? View.VISIBLE : View.GONE}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@+id/btnResetPw"
app:layout_constraintTop_toBottomOf="@+id/tilNewPw"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="20dp">
<EditText
android:id="@+id/etEmailVerify"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="example@example.com"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnSendEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Continue"
android:padding="@dimen/space_default"
app:layout_constraintTop_toBottomOf="@+id/etEmailVerify"
app:cornerRadius="5dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -47,4 +47,6 @@ ...@@ -47,4 +47,6 @@
<string name="slide_3_title">FUTURE PAYMENT</string> <string name="slide_3_title">FUTURE PAYMENT</string>
<string name="slide_3_desc">Integrated with easy and secure payments</string> <string name="slide_3_desc">Integrated with easy and secure payments</string>
<string name="test">test</string> <string name="test">test</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources> </resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment