From 810964b4beb47c5ea9288d85a646bf1b160bfadd Mon Sep 17 00:00:00 2001 From: riz081 Date: Wed, 28 May 2025 12:06:20 +0700 Subject: [PATCH] menambahkan modal --- .../com/example/bdkipoc/PaymentActivity.java | 125 +++++++++++++++++- app/src/main/res/drawable/ic_card_insert.png | Bin 0 -> 3392 bytes app/src/main/res/layout/modal_layout.xml | 43 ++++++ 3 files changed, 161 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable/ic_card_insert.png create mode 100644 app/src/main/res/layout/modal_layout.xml diff --git a/app/src/main/java/com/example/bdkipoc/PaymentActivity.java b/app/src/main/java/com/example/bdkipoc/PaymentActivity.java index 5ea2b5a..a129e28 100644 --- a/app/src/main/java/com/example/bdkipoc/PaymentActivity.java +++ b/app/src/main/java/com/example/bdkipoc/PaymentActivity.java @@ -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 diff --git a/app/src/main/res/drawable/ic_card_insert.png b/app/src/main/res/drawable/ic_card_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..63c91d069d6dab36f60f95c135106a7a5763d2f1 GIT binary patch literal 3392 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/modal_layout.xml b/app/src/main/res/layout/modal_layout.xml new file mode 100644 index 0000000..4d31809 --- /dev/null +++ b/app/src/main/res/layout/modal_layout.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + \ No newline at end of file