Commit c2255c83 authored by Muhammad Suryono's avatar Muhammad Suryono

Update

parents aa299fb7 372a38b6
......@@ -63,4 +63,12 @@ dependencies {
implementation 'com.google.zxing:core:3.3.2'
implementation 'com.github.florent37:expansionpanel:1.2.4'
implementation ('com.alimuzaffar.lib:pinentryedittext:1.3.10') {
// Exclude is only needed if you already have
// any of the following as a dependency in your project.
exclude group: 'com.android.support', module: 'support-v4'
exclude group: 'com.android.support', module: 'appcompat-v7'
exclude group: 'com.android.support', module: 'support-v13'
}
}
\ No newline at end of file
......@@ -23,8 +23,9 @@
<activity android:name=".MethodePayment"/>
<activity android:name=".ScannerNfc"/>
<activity android:name=".TransactionDetail"/>
<activity android:name=".ForgotPasswordActivity"
android:windowSoftInputMode="adjustResize"></activity>
<activity
android:name=".ForgotPasswordActivity"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity android:name=".RegisterActivity" />
<activity android:name=".TransactionActivity" />
<activity
......
......@@ -173,7 +173,6 @@ public class CartActivity extends AppCompatActivity {
}else{
utils.dialog(CartActivity.this,
true,
getLayoutInflater().inflate(R.layout.alert_dialog, null),
"Warning",
"Item stock does not meet").show();
}
......
......@@ -5,29 +5,43 @@ import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.alimuzaffar.lib.pin.PinEntryEditText;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.yono.messeripos.api.client.Client;
import com.yono.messeripos.api.service.UsersService;
import com.yono.messeripos.models.ForgotPasswordModels;
import com.yono.messeripos.models.MainViewModels;
import com.yono.messeripos.response.DataResponse;
import com.yono.messeripos.utils.Utils;
public class ForgotCode extends BottomSheetDialogFragment {
private static final String TAG = "FORGOT CODE";
Utils utils;
BottomSheetBehavior sheetBehavior;
BottomSheetDialog sheetDialog;
RelativeLayout fpCode;
RelativeLayout fpass;
View view;
PinEntryEditText pinEntry;
ForgotPasswordModels forgotPasswordModels;
Context context;
public ForgotCode(Context c) {
context = c;
public ForgotCode(Context context, ForgotPasswordModels forgotPasswordModels) {
this.context = context;
this.forgotPasswordModels = forgotPasswordModels;
}
@NonNull
......@@ -39,7 +53,7 @@ public class ForgotCode extends BottomSheetDialogFragment {
view = View.inflate(getContext(), R.layout.forgot_password_code, null);
// bindUI
fpCode = view.findViewById(R.id.fpCode);
fpass = view.findViewById(R.id.fpasswd);
// utils
utils = new Utils();
......@@ -53,7 +67,28 @@ public class ForgotCode extends BottomSheetDialogFragment {
// set max height
sheetBehavior.setPeekHeight(setHeight);
fpCode.setMinimumHeight(setHeight);
fpass.setMinimumHeight(setHeight);
utils = new Utils();
// Log.d(TAG, "onCreateDialog: "+utils.convertGson(mainViewModels));
pinEntry = view.findViewById(R.id.txt_pin_entry);
if (pinEntry != null) {
pinEntry.setOnPinEnteredListener(new PinEntryEditText.OnPinEnteredListener() {
@Override
public void onPinEntered(CharSequence str) {
if (str.toString().equals(forgotPasswordModels.getMessage())) {
ForgotPassword forgotPassword = new ForgotPassword(context, forgotPasswordModels);
forgotPassword.setCancelable(false);
forgotPassword.show(getActivity().getSupportFragmentManager(), "Forgot Confirm");
} else {
Toast.makeText(context, "FAIL", Toast.LENGTH_SHORT).show();
pinEntry.setText(null);
}
}
});
}
return sheetDialog;
}
......
package com.yono.messeripos;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputEditText;
import com.yono.messeripos.api.service.UsersService;
import com.yono.messeripos.models.ForgotPasswordModels;
import com.yono.messeripos.models.UsersModels;
import com.yono.messeripos.response.DataResponse;
import com.yono.messeripos.utils.Utils;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ForgotPassword extends BottomSheetDialogFragment {
BottomSheetDialog sheetDialog;
BottomSheetBehavior sheetBehavior;
View view;
RelativeLayout resetPassUI;
Utils utils = new Utils();
TextInputEditText newPass, etConfPass;
MaterialButton btnReset;
Context context;
UsersService usersService;
ForgotPasswordModels forgotPasswordModels;
public ForgotPassword(Context context, ForgotPasswordModels forgotPasswordModels) {
this.context = context;
this.forgotPasswordModels = forgotPasswordModels;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
sheetDialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState);
// inflating layout
view = View.inflate(getContext(), R.layout.forgot_new_password, null);
// bindUI
resetPassUI = view.findViewById(R.id.resetPassword);
newPass = view.findViewById(R.id.etNewPassword);
etConfPass = view.findViewById(R.id.etPasswordConfirmation);
btnReset = view.findViewById(R.id.btnReset);
sheetDialog.setContentView(view);
sheetBehavior = BottomSheetBehavior.from((View) (view.getParent()));
// get Window size
int setHeight = utils.getWindowHeight() - (utils.getWindowHeight() * 5) / 100;
// set max height
sheetBehavior.setPeekHeight(setHeight);
resetPassUI.setMinimumHeight(setHeight);
btnReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String newPas = newPass.getText().toString();
String conPass = etConfPass.getText().toString();
forgotPasswordModels.setPassword(newPass.getText().toString());
if (newPas.equals(conPass)) {
sheetDialog.dismiss();
usersService.resetPassword(forgotPasswordModels);
startActivity(new Intent(context, LoginActivity.class));
getActivity().finish();
}else {
utils.dialog(context, true, "password does't match", "Your password not match!").show();
}
}
});
return sheetDialog;
}
}
......@@ -3,26 +3,74 @@ package com.yono.messeripos;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageButton;
import com.yono.messeripos.api.client.Client;
import com.yono.messeripos.api.service.UsersService;
import com.yono.messeripos.models.ForgotPasswordModels;
import com.yono.messeripos.models.MainViewModels;
import com.yono.messeripos.response.DataResponse;
import com.yono.messeripos.utils.Utils;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ForgotPasswordActivity extends AppCompatActivity {
ImageButton btnReset;
ForgotCode forgotCode;
ForgotPasswordModels forgotPasswordModels;
Utils utils = new Utils();
Client client=new Client();
UsersService usersService;
EditText formForgot;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_forgot_password);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
}
forgotPasswordModels = new ForgotPasswordModels();
// bind UI
btnReset = findViewById(R.id.btn_reset_password);
formForgot = findViewById(R.id.forgotEmail);
btnReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
forgotCode = new ForgotCode(ForgotPasswordActivity.this);
forgotPasswordModels.setEmail(formForgot.getText().toString());
forgotPasswordModels.setMessage(utils.getRandomNumberString());
usersService = client.Client(UsersService.class);
usersService.postForgotPassword(forgotPasswordModels).enqueue(new Callback<DataResponse>() {
@Override
public void onResponse(Call<DataResponse> call, Response<DataResponse> response) {
forgotCode = new ForgotCode(ForgotPasswordActivity.this, forgotPasswordModels);
forgotCode.setCancelable(false);
forgotCode.show(getSupportFragmentManager(), "forgot code");
}
@Override
public void onFailure(Call<DataResponse> call, Throwable t) {
}
});
}
});
}
}
\ No newline at end of file
......@@ -144,19 +144,17 @@ public class LoginState extends BottomSheetDialogFragment {
.observe((LifecycleOwner) context, usersModelsDataResponse -> {
if (usersModelsDataResponse != null) {
final View customLayout = getLayoutInflater()
.inflate(R.layout.alert_dialog, null);
switch (usersModelsDataResponse.getMessageData().toLowerCase()) {
case "invalid username or password":
setAllLayoutToTrue();
errUserPass(customLayout);
errUserPass();
break;
case "please activate your email first":
setAllLayoutToTrue();
activateEmail(customLayout);
activateEmail();
default:
break;
......@@ -206,10 +204,10 @@ public class LoginState extends BottomSheetDialogFragment {
closeBtn.setEnabled(false);
}
private void activateEmail(View customLayout) {
private void activateEmail() {
utils = new Utils(customLayout);
utils.dialog(context, false, customLayout, "Please Verify Email",
utils = new Utils();
utils.dialog(context, false, "Please Verify Email",
"Please verify your email before login",
"close", "verify")
.show();
......@@ -230,10 +228,10 @@ public class LoginState extends BottomSheetDialogFragment {
});
}
private void errUserPass(View customLayout) {
private void errUserPass() {
utils = new Utils(customLayout);
utils.dialog(context, false, customLayout, "Wrong Username or Password",
utils = new Utils();
utils.dialog(context, false, "Wrong Username or Password",
"The username or password is incorrect. Please try again!",
"Try Again")
.show();
......
......@@ -180,10 +180,8 @@ public class RegisterState extends BottomSheetDialogFragment {
* */
setAllLayoutToFalse();
if (usersModelsDataResponse != null) {
final View customLayout = getLayoutInflater()
.inflate(R.layout.alert_dialog, null);
activateEmail(customLayout);
activateEmail();
setAllLayoutToTrue();
}
}
......@@ -201,9 +199,7 @@ public class RegisterState extends BottomSheetDialogFragment {
return sheetDialog2;
}
private void
setAllLayoutToTrue() {
private void setAllLayoutToTrue() {
pbReg.setVisibility(View.GONE);
registerButton.setText(DEFAULT_REGISTER);
sheetDialog2.setCancelable(true);
......@@ -226,10 +222,10 @@ public class RegisterState extends BottomSheetDialogFragment {
}
private void activateEmail(View customLayout) {
private void activateEmail() {
utils = new Utils(customLayout);
utils.dialog(context, false, customLayout, "Please Verifiy Email",
utils = new Utils();
utils.dialog(context, false, "Please Verifiy Email",
"Please verify your email before login",
"close", "verify")
.show();
......
......@@ -18,4 +18,7 @@ public interface UsersService {
@POST(ApiHelper.VERSI_API_1+"forgot-password")
Call<DataResponse> postForgotPassword(@Body ForgotPasswordModels forgotPasswordModels);
@POST(ApiHelper.VERSI_API_1+"reset-password")
Call<DataResponse> resetPassword(@Body ForgotPasswordModels forgotPasswordModels);
}
......@@ -9,6 +9,9 @@ public class ForgotPasswordModels {
@SerializedName("message")
private String message;
@SerializedName("password")
private String password;
public ForgotPasswordModels() {
}
......@@ -32,4 +35,12 @@ public class ForgotPasswordModels {
public void setMessage(String message) {
this.message = message;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
......@@ -8,6 +8,7 @@ import android.graphics.BitmapFactory;
import android.os.Build;
import android.util.Base64;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
......@@ -224,12 +225,13 @@ public class Utils {
* Alert Dialog
* @param context
* @param cancelable
* @param view
* @return
*/
public AlertDialog dialog(Context context, Boolean cancelable, View view) {
public AlertDialog dialog(Context context, Boolean cancelable) {
CardView btCard = view.findViewById(R.id.cvAlertOnClick);
final View view = View.inflate(context, R.layout.alert_dialog, null);
CardView btnCard = view.findViewById(R.id.cvAlertOnClick);
AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setCancelable(cancelable)
......@@ -242,10 +244,14 @@ public class Utils {
}
public AlertDialog dialog(Context context, Boolean cancelable, View view, @Nullable String titles) {
public AlertDialog dialog(Context context,
Boolean cancelable,
@Nullable String titles) {
final View view = View.inflate(context, R.layout.alert_dialog, null);
TextView title = view.findViewById(R.id.alertTitles);
CardView btCard = view.findViewById(R.id.cvAlertOnClick);
CardView btnCard = view.findViewById(R.id.cvAlertOnClick);
// set title and message
if (titles != null){
......@@ -263,7 +269,12 @@ public class Utils {
}
public AlertDialog dialog(Context context, Boolean cancelable, View view, @Nullable String titles, @Nullable String messages) {
public AlertDialog dialog(Context context,
Boolean cancelable,
@Nullable String titles,
@Nullable String messages) {
final View view = View.inflate(context, R.layout.alert_dialog, null);
TextView title = view.findViewById(R.id.alertTitles);
TextView message = view.findViewById(R.id.alertBody);
......@@ -290,16 +301,18 @@ public class Utils {
public AlertDialog dialog(Context context,
Boolean cancelable,
View view,
@Nullable String titles,
@Nullable String messages,
@Nullable String dismiss) {
final View view = View.inflate(context, R.layout.alert_dialog, null);
TextView title = view.findViewById(R.id.alertTitles);
TextView message = view.findViewById(R.id.alertBody);
TextView button2 = view.findViewById(R.id.tvTextBtn2);
CardView btnCard2 = view.findViewById(R.id.cvAlertOnClick2);
// set title and message
if (titles != null){
title.setText(titles);
......@@ -328,7 +341,6 @@ public class Utils {
public AlertDialog dialog(Context context,
Boolean cancelable,
View view,
@Nullable String titles,
@Nullable String messages,
@Nullable String dismiss,
......@@ -339,6 +351,8 @@ public class Utils {
* Button2 untuk link
*/
final View view = View.inflate(context, R.layout.alert_dialog, null);
TextView title = view.findViewById(R.id.alertTitles);
TextView message = view.findViewById(R.id.alertBody);
TextView button = view.findViewById(R.id.tvTextBtn);
......@@ -385,9 +399,9 @@ public class Utils {
// It will generate 6 digit random Number.
// from 0 to 999999
Random rnd = new Random();
int number = rnd.nextInt(999999);
int number = rnd.nextInt(9999);
// this will convert any number sequence into 6 character.
return String.format("%06d", number);
return String.format("%04d", number);
}
}
......@@ -77,7 +77,7 @@
android:layout_height="wrap_content"
android:drawableStart="@drawable/ic_mail_outline_black_24dp"
android:layout_marginEnd="20dp"
android:id="@+id/email"
android:id="@+id/forgotEmail"
android:layout_marginStart="20dp"
android:textSize="14sp"
android:drawablePadding="10dp"
......
......@@ -21,6 +21,7 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingVertical="20dp"
android:orientation="vertical">
<TextView
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
android:layout_width="match_parent">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/tfCurrentPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="Current Password"
android:textColor="#fff"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
tools:ignore="MissingConstraints">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etCurrentPassword"
<RelativeLayout
android:id="@+id/resetPassword"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:inputType="textPassword"
android:imeOptions="actionNext"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<com.google.android.material.textfield.TextInputLayout
......@@ -34,8 +22,7 @@
android:layout_margin="10dp"
android:hint="New Password"
android:textColor="#fff"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
app:layout_constraintTop_toBottomOf="@id/tfCurrentPassword">
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etNewPassword"
......@@ -54,8 +41,7 @@
android:layout_margin="10dp"
android:hint="Password Confirmation"
android:textColor="#fff"
app:layout_constraintTop_toBottomOf="@id/tfNewPassword"
tools:layout_editor_absoluteX="10dp">
android:layout_below="@id/tfNewPassword">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/etPasswordConfirmation"
......@@ -67,14 +53,14 @@
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnAdd"
android:id="@+id/btnReset"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/add"
android:text="@string/btn_reset_password"
android:padding="16dp"
app:layout_constraintTop_toBottomOf="@id/tfPasswordConfirmation"
tools:ignore="MissingConstraints" />
android:layout_below="@id/tfPasswordConfirmation"/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
</RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>
\ No newline at end of file
......@@ -8,105 +8,47 @@
android:layout_width="match_parent">
<RelativeLayout
android:id="@+id/fpCode"
android:id="@+id/fpasswd"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<androidx.cardview.widget.CardView
android:id="@+id/verifCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/edit_text_1"
android:inputType="number"
android:maxLength="1"
android:maxLines="1"
android:gravity="center"
android:padding="20dp"
android:nextFocusRight="@id/edit_text_2"
android:singleLine="true"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/edit_text_2"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="Autofill,LabelFor"/>
android:paddingHorizontal="70dp"
android:layout_marginTop="100dp"
android:layout_height="match_parent">
<EditText
<com.google.android.material.textview.MaterialTextView
android:id="@+id/insertCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/edit_text_2"
android:inputType="number"
android:maxLength="1"
android:maxLines="1"
android:gravity="center"
android:nextFocusRight="@id/edit_text_3"
android:padding="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/edit_text_3"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/edit_text_1"
tools:ignore="Autofill,LabelFor"/>
<EditText
android:layout_width="wrap_content"
android:text="Insert Code"
android:textStyle="bold"
android:textSize="18sp"
android:layout_marginBottom="20dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"/>
<com.alimuzaffar.lib.pin.PinEntryEditText
android:id="@+id/txt_pin_entry"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit_text_3"
android:cursorVisible="false"
android:digits="1234567890"
android:inputType="number"
android:maxLength="1"
android:maxLines="1"
android:gravity="center"
android:padding="20dp"
android:nextFocusRight="@id/edit_text_4"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@id/edit_text_4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/edit_text_2"
tools:ignore="Autofill,LabelFor"/>
<EditText
android:maxLength="4"
android:textIsSelectable="false"
android:textSize="20sp"
android:layout_marginBottom="20dp"
app:pinAnimationType="fromBottom"
app:pinTextBottomPadding="20dp"
android:layoutDirection="ltr"
android:layout_below="@id/insertCode"
/>
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/edit_text_4"
android:inputType="number"
android:maxLength="1"
android:maxLines="1"
android:gravity="center"
android:padding="20dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/edit_text_3"
tools:ignore="Autofill,LabelFor"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
<!-- <androidx.cardview.widget.CardView-->
<!-- android:layout_alignParentBottom="true"-->
<!-- android:layout_below="@id/verifCode"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content">-->
<!-- -->
<!-- <GridLayout-->
<!-- android:columnCount="3"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content">-->
<!-- -->
<!-- <com.google.android.material.button.MaterialButton-->
<!-- android:text="1"/>-->
<!-- -->
<!-- </GridLayout>-->
android:text="enter the code that has been sent to the email"
android:layout_below="@id/txt_pin_entry"
android:layout_centerHorizontal="true"/>
<!-- </androidx.cardview.widget.CardView>-->
</RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>
\ 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