diff --git a/app/src/main/java/com/example/bdkipoc/qris/QrisResultActivity.java b/app/src/main/java/com/example/bdkipoc/qris/QrisResultActivity.java index e295b92..1d08fba 100644 --- a/app/src/main/java/com/example/bdkipoc/qris/QrisResultActivity.java +++ b/app/src/main/java/com/example/bdkipoc/qris/QrisResultActivity.java @@ -16,6 +16,10 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.net.Uri; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -67,6 +71,8 @@ public class QrisResultActivity extends AppCompatActivity { private View successScreen; private ImageView successIcon; private TextView successMessage; + private TextView qrUrlTextView; + private Button simulatorButton; private String orderId; private String grossAmount; @@ -104,6 +110,7 @@ public class QrisResultActivity extends AppCompatActivity { // Midtrans charge URL private static final String MIDTRANS_CHARGE_URL = "https://api.sandbox.midtrans.com/v2/charge"; // private static final String MIDTRANS_CHARGE_URL = "https://api.midtrans.com/v2/charge"; + // ✅ Mapping dari technical issuer ke display name private static final Map ISSUER_DISPLAY_MAP = new HashMap() {{ @@ -192,6 +199,9 @@ public class QrisResultActivity extends AppCompatActivity { successScreen = findViewById(R.id.success_screen); successIcon = findViewById(R.id.success_icon); successMessage = findViewById(R.id.success_message); + + qrUrlTextView = findViewById(R.id.qrUrlTextView); + simulatorButton = findViewById(R.id.simulatorButton); // Initialize handler for QR refresh qrRefreshHandler = new Handler(Looper.getMainLooper()); @@ -267,6 +277,13 @@ public class QrisResultActivity extends AppCompatActivity { if (checkStatusButton != null) { checkStatusButton.setEnabled(false); } + + if (currentQrImageUrl != null) { + qrUrlTextView.setText(currentQrImageUrl); + } + + setupUrlCopyFunctionality(); + setupSimulatorButton(); // ✅ VALIDATE QR STRING validateQrString(currentQrString); @@ -406,6 +423,28 @@ public class QrisResultActivity extends AppCompatActivity { }).start(); } + private void setupUrlCopyFunctionality() { + qrUrlTextView.setOnClickListener(v -> { + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("QR URL", currentQrImageUrl); + clipboard.setPrimaryClip(clip); + Toast.makeText(this, "URL copied to clipboard", Toast.LENGTH_SHORT).show(); + }); + } + + private void setupSimulatorButton() { + simulatorButton.setOnClickListener(v -> { + try { + String simulatorUrl = "https://simulator.sandbox.midtrans.com/v2/qris/index"; + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(simulatorUrl)); + startActivity(browserIntent); + } catch (Exception e) { + Toast.makeText(this, "Could not open browser", Toast.LENGTH_SHORT).show(); + Log.e("QrisResultFlow", "Error opening simulator URL", e); + } + }); + } + // ✅ NEW: QR Refresh Result class private static class QrRefreshResult { String qrUrl; diff --git a/app/src/main/res/drawable/copyable_text_background.xml b/app/src/main/res/drawable/copyable_text_background.xml new file mode 100644 index 0000000..ecc7ec4 --- /dev/null +++ b/app/src/main/res/drawable/copyable_text_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_qris_result.xml b/app/src/main/res/layout/activity_qris_result.xml index 055ba66..e35e569 100644 --- a/app/src/main/res/layout/activity_qris_result.xml +++ b/app/src/main/res/layout/activity_qris_result.xml @@ -1,241 +1,271 @@ - + android:fillViewport="true" + android:background="#F5F5F5"> - - - - - + tools:context=".QrisResultActivity"> - + + - + + android:orientation="horizontal" + android:gravity="center_vertical" + android:padding="16dp" + android:layout_marginTop="24dp" + android:background="?android:attr/selectableItemBackground" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent"> - - - - - - - - - - - + android:id="@+id/backArrow" + android:layout_width="24dp" + android:layout_height="24dp" + android:src="@drawable/ic_arrow_back" + android:layout_marginEnd="8dp" /> - - - - - - + + - -