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 0000000..63c91d0 Binary files /dev/null and b/app/src/main/res/drawable/ic_card_insert.png differ 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