menambahkan modal

This commit is contained in:
riz081 2025-05-28 12:06:20 +07:00
parent a7fa40d60a
commit 810964b4be
3 changed files with 161 additions and 7 deletions

View File

@ -2,8 +2,10 @@ package com.example.bdkipoc;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@ -17,6 +19,7 @@ import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
@ -34,6 +37,9 @@ public class PaymentActivity extends AppCompatActivity {
private TextView btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0, btn000;
private ImageView btnDelete;
// Modal components
private Dialog paymentModal;
// Data
private StringBuilder currentAmount = new StringBuilder();
private static final int MAX_AMOUNT_LENGTH = 12;
@ -53,7 +59,7 @@ public class PaymentActivity extends AppCompatActivity {
initializeViews();
setupClickListeners();
setupInitialStates();
// REMOVED: addAnimations() - No more card sliding animation
setupModal();
}
private void setStatusBarColor() {
@ -93,6 +99,37 @@ public class PaymentActivity extends AppCompatActivity {
btnDelete = findViewById(R.id.btnDelete);
}
private void setupModal() {
// Create modal dialog
paymentModal = new Dialog(this);
paymentModal.setContentView(R.layout.modal_layout);
// Remove background dimming - make it fully transparent
if (paymentModal.getWindow() != null) {
paymentModal.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
}
// Setup modal listeners
setupModalListeners();
}
private void setupModalListeners() {
// Make modal non-cancelable by touching outside
paymentModal.setCanceledOnTouchOutside(false);
// Auto dismiss after 3 seconds (simulate card processing)
Handler modalHandler = new Handler(Looper.getMainLooper());
paymentModal.setOnShowListener(dialog -> {
modalHandler.postDelayed(() -> {
if (paymentModal.isShowing()) {
dismissModal();
// Simulate successful card processing
processCardPayment();
}
}, 3000);
});
}
private void setupClickListeners() {
// Back navigation - entire LinearLayout is clickable
backNavigation.setOnClickListener(v -> {
@ -131,11 +168,11 @@ public class PaymentActivity extends AppCompatActivity {
deleteLastDigit();
});
// Confirm button
// Confirm button - NOW SHOWS MODAL INSTEAD OF DIRECT PAYMENT
confirmButton.setOnClickListener(v -> {
if (confirmButton.isEnabled()) {
addButtonClickAnimation(v);
handleConfirmPayment();
showPaymentModal();
}
});
}
@ -163,8 +200,6 @@ public class PaymentActivity extends AppCompatActivity {
editTextAmount.setCursorVisible(false);
}
// REMOVED: addAnimations() method - No card sliding animation on startup
private void addDigit(String digit) {
// Validate input length
if (currentAmount.length() >= MAX_AMOUNT_LENGTH) {
@ -256,7 +291,8 @@ public class PaymentActivity extends AppCompatActivity {
}
}
private void handleConfirmPayment() {
// NEW METHOD: Show payment modal instead of direct payment processing
private void showPaymentModal() {
String amount = currentAmount.toString();
if (TextUtils.isEmpty(amount) || amount.equals("0")) {
@ -279,6 +315,71 @@ public class PaymentActivity extends AppCompatActivity {
return;
}
// Show modal with animation
showModalWithAnimation();
} catch (NumberFormatException e) {
showToast("Format jumlah tidak valid");
}
}
private void showModalWithAnimation() {
paymentModal.show();
// Add slide-up animation
View modalView = paymentModal.findViewById(android.R.id.content);
if (modalView != null) {
ObjectAnimator slideUp = ObjectAnimator.ofFloat(modalView, "translationY", 300f, 0f);
ObjectAnimator fadeIn = ObjectAnimator.ofFloat(modalView, "alpha", 0f, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(slideUp, fadeIn);
animatorSet.setDuration(300);
animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
animatorSet.start();
}
}
private void dismissModal() {
if (paymentModal != null && paymentModal.isShowing()) {
// Add slide-down animation before dismissing
View modalView = paymentModal.findViewById(android.R.id.content);
if (modalView != null) {
ObjectAnimator slideDown = ObjectAnimator.ofFloat(modalView, "translationY", 0f, 300f);
ObjectAnimator fadeOut = ObjectAnimator.ofFloat(modalView, "alpha", 1f, 0f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(slideDown, fadeOut);
animatorSet.setDuration(200);
animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
animatorSet.addListener(new android.animation.AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(android.animation.Animator animation) {
paymentModal.dismiss();
}
});
animatorSet.start();
} else {
paymentModal.dismiss();
}
}
}
private void processModalConfirmation() {
// This method is no longer needed since modal auto-dismisses
}
private void processCardPayment() {
String amount = currentAmount.toString();
try {
long amountValue = Long.parseLong(amount);
// Show processing with card payment
showToast("Memproses pembayaran dengan kartu...");
// Process payment
processPayment(amountValue);
@ -350,7 +451,12 @@ public class PaymentActivity extends AppCompatActivity {
@Override
public void onBackPressed() {
navigateBack();
// Check if modal is showing, dismiss it first
if (paymentModal != null && paymentModal.isShowing()) {
dismissModal();
} else {
navigateBack();
}
}
@Override
@ -359,6 +465,11 @@ public class PaymentActivity extends AppCompatActivity {
if (animationHandler != null) {
animationHandler.removeCallbacksAndMessages(null);
}
// Clean up modal
if (paymentModal != null && paymentModal.isShowing()) {
paymentModal.dismiss();
}
}
// Public methods for testing

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- res/layout/modal_layout.xml -->
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="32dp"
app:cardCornerRadius="16dp"
app:cardElevation="8dp"
app:cardBackgroundColor="#FFFFFF">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="32dp"
android:gravity="center">
<!-- Card Icon -->
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/ic_card_insert"
android:layout_marginBottom="24dp"
android:scaleType="fitCenter"
android:adjustViewBounds="true"/>
<!-- Main Text -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Silakan Tempelkan / Gesekkan / Masukkan Kartu ke Perangkat"
android:textColor="#333333"
android:textSize="16sp"
android:textStyle="normal"
android:textAlignment="center"
android:gravity="center"
android:lineSpacingExtra="4dp"/>
</LinearLayout>
</androidx.cardview.widget.CardView>