implement history
This commit is contained in:
parent
3f189f5975
commit
edca7f92ec
@ -49,6 +49,12 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name=".SettlementActivity"
|
android:name=".SettlementActivity"
|
||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
<activity
|
||||||
|
android:name=".HistoryActivity"
|
||||||
|
android:exported="false" />
|
||||||
|
<activity
|
||||||
|
android:name=".HistoryDetailActivity"
|
||||||
|
android:exported="false" />
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
415
app/src/main/java/com/example/bdkipoc/HistoryActivity.java
Normal file
415
app/src/main/java/com/example/bdkipoc/HistoryActivity.java
Normal file
@ -0,0 +1,415 @@
|
|||||||
|
package com.example.bdkipoc;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class HistoryActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
private TextView tvTotalAmount;
|
||||||
|
private TextView tvTotalTransactions;
|
||||||
|
private TextView btnLihatDetailTop;
|
||||||
|
private Button btnLihatDetailBottom;
|
||||||
|
private RecyclerView recyclerView;
|
||||||
|
private HistoryAdapter adapter;
|
||||||
|
private List<HistoryItem> historyList;
|
||||||
|
private ImageView btnBack;
|
||||||
|
|
||||||
|
// Store full data for detail view
|
||||||
|
private static List<HistoryItem> fullHistoryData = new ArrayList<>();
|
||||||
|
|
||||||
|
private String API_URL = "https://be-edc.msvc.app/transactions?page=0&limit=50&sortOrder=DESC&from_date=2025-05-10&to_date=2025-05-21&location_id=0&merchant_id=0&sortColumn=id";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_history);
|
||||||
|
|
||||||
|
initViews();
|
||||||
|
setupRecyclerView();
|
||||||
|
fetchApiData();
|
||||||
|
setupClickListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initViews() {
|
||||||
|
tvTotalAmount = findViewById(R.id.tv_total_amount);
|
||||||
|
tvTotalTransactions = findViewById(R.id.tv_total_transactions);
|
||||||
|
btnLihatDetailTop = findViewById(R.id.btn_lihat_detail);
|
||||||
|
btnLihatDetailBottom = findViewById(R.id.btn_lihat_detail_bottom);
|
||||||
|
recyclerView = findViewById(R.id.recycler_view);
|
||||||
|
btnBack = findViewById(R.id.btn_back);
|
||||||
|
|
||||||
|
historyList = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupRecyclerView() {
|
||||||
|
adapter = new HistoryAdapter(historyList);
|
||||||
|
recyclerView.setLayoutManager(new LinearLayoutManager(this));
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupClickListeners() {
|
||||||
|
btnBack.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
View.OnClickListener detailClickListener = new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
try {
|
||||||
|
Intent intent = new Intent(HistoryActivity.this, HistoryDetailActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Toast.makeText(HistoryActivity.this, "Error opening detail", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
btnLihatDetailTop.setOnClickListener(detailClickListener);
|
||||||
|
btnLihatDetailBottom.setOnClickListener(detailClickListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fetchApiData() {
|
||||||
|
new ApiTask().execute(API_URL);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void processApiData(JSONArray dataArray) {
|
||||||
|
try {
|
||||||
|
historyList.clear();
|
||||||
|
fullHistoryData.clear(); // Clear static data
|
||||||
|
|
||||||
|
final long[] totalAmountArray = {0};
|
||||||
|
final int[] totalTransactionsArray = {0};
|
||||||
|
|
||||||
|
for (int i = 0; i < dataArray.length(); i++) {
|
||||||
|
JSONObject item = dataArray.getJSONObject(i);
|
||||||
|
|
||||||
|
String channelCode = item.getString("channel_code");
|
||||||
|
String amount = item.getString("amount");
|
||||||
|
String status = item.getString("status");
|
||||||
|
String transactionDate = item.getString("transaction_date");
|
||||||
|
String referenceId = item.getString("reference_id");
|
||||||
|
|
||||||
|
// Parse amount safely
|
||||||
|
double amountValue = 0;
|
||||||
|
try {
|
||||||
|
amountValue = Double.parseDouble(amount);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
amountValue = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create history item
|
||||||
|
HistoryItem historyItem = new HistoryItem();
|
||||||
|
historyItem.setTime(formatTime(transactionDate));
|
||||||
|
historyItem.setDate(formatDate(transactionDate));
|
||||||
|
historyItem.setAmount((long) amountValue);
|
||||||
|
historyItem.setChannelName(formatChannelName(channelCode));
|
||||||
|
historyItem.setStatus(status);
|
||||||
|
historyItem.setReferenceId(referenceId);
|
||||||
|
historyItem.setFullDate(transactionDate);
|
||||||
|
historyItem.setChannelCode(channelCode);
|
||||||
|
|
||||||
|
// Add to full data
|
||||||
|
fullHistoryData.add(historyItem);
|
||||||
|
|
||||||
|
// Add first 10 to display list
|
||||||
|
if (i < 10) {
|
||||||
|
historyList.add(historyItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
totalAmountArray[0] += (long) amountValue;
|
||||||
|
totalTransactionsArray[0]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
updateSummary(totalAmountArray[0], totalTransactionsArray[0]);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Toast.makeText(HistoryActivity.this, "Error parsing data", Toast.LENGTH_SHORT).show();
|
||||||
|
loadSampleData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateSummary(long totalAmount, int totalTransactions) {
|
||||||
|
tvTotalAmount.setText("RP " + formatCurrency(totalAmount));
|
||||||
|
tvTotalTransactions.setText(String.valueOf(totalTransactions));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadSampleData() {
|
||||||
|
historyList.clear();
|
||||||
|
fullHistoryData.clear();
|
||||||
|
|
||||||
|
// Create sample data
|
||||||
|
HistoryItem[] sampleData = {
|
||||||
|
new HistoryItem("03:44", "11-05-2025", 2018619, "Kredit", "FAILED", "197870"),
|
||||||
|
new HistoryItem("03:10", "12-05-2025", 3974866, "QRIS", "SUCCESS", "053059"),
|
||||||
|
new HistoryItem("15:17", "13-05-2025", 2418167, "QRIS", "FAILED", "668320"),
|
||||||
|
new HistoryItem("12:09", "11-05-2025", 3429230, "Debit", "FAILED", "454790"),
|
||||||
|
new HistoryItem("08:39", "10-05-2025", 4656447, "QRIS", "FAILED", "454248"),
|
||||||
|
new HistoryItem("00:35", "12-05-2025", 3507704, "QRIS", "FAILED", "301644"),
|
||||||
|
new HistoryItem("22:43", "13-05-2025", 4277904, "Debit", "SUCCESS", "388709"),
|
||||||
|
new HistoryItem("18:16", "11-05-2025", 4456904, "Debit", "FAILED", "986861")
|
||||||
|
};
|
||||||
|
|
||||||
|
for (HistoryItem item : sampleData) {
|
||||||
|
historyList.add(item);
|
||||||
|
fullHistoryData.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
tvTotalAmount.setText("RP 36.166.829");
|
||||||
|
tvTotalTransactions.setText("10");
|
||||||
|
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatChannelName(String channelCode) {
|
||||||
|
switch (channelCode) {
|
||||||
|
case "DEBIT":
|
||||||
|
return "Debit";
|
||||||
|
case "QRIS":
|
||||||
|
return "QRIS";
|
||||||
|
case "OTHER":
|
||||||
|
return "Kredit";
|
||||||
|
default:
|
||||||
|
return channelCode.substring(0, 1).toUpperCase() +
|
||||||
|
channelCode.substring(1).toLowerCase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatTime(String isoDate) {
|
||||||
|
try {
|
||||||
|
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
|
||||||
|
SimpleDateFormat outputFormat = new SimpleDateFormat("HH:mm", Locale.getDefault());
|
||||||
|
Date date = inputFormat.parse(isoDate);
|
||||||
|
return outputFormat.format(date);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
return "00:00";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatDate(String isoDate) {
|
||||||
|
try {
|
||||||
|
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.getDefault());
|
||||||
|
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault());
|
||||||
|
Date date = inputFormat.parse(isoDate);
|
||||||
|
return outputFormat.format(date);
|
||||||
|
} catch (ParseException e) {
|
||||||
|
return "01-01-2025";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatCurrency(long amount) {
|
||||||
|
NumberFormat formatter = NumberFormat.getNumberInstance(new Locale("id", "ID"));
|
||||||
|
return formatter.format(amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public static method to get full data for detail activity
|
||||||
|
public static List<HistoryItem> getFullHistoryData() {
|
||||||
|
return new ArrayList<>(fullHistoryData);
|
||||||
|
}
|
||||||
|
|
||||||
|
// AsyncTask for API call
|
||||||
|
private class ApiTask extends AsyncTask<String, Void, String> {
|
||||||
|
@Override
|
||||||
|
protected String doInBackground(String... urls) {
|
||||||
|
try {
|
||||||
|
URL url = new URL(urls[0]);
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
||||||
|
connection.setRequestMethod("GET");
|
||||||
|
connection.setConnectTimeout(10000);
|
||||||
|
connection.setReadTimeout(10000);
|
||||||
|
|
||||||
|
int responseCode = connection.getResponseCode();
|
||||||
|
if (responseCode == HttpURLConnection.HTTP_OK) {
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||||
|
StringBuilder response = new StringBuilder();
|
||||||
|
String line;
|
||||||
|
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
response.append(line);
|
||||||
|
}
|
||||||
|
reader.close();
|
||||||
|
return response.toString();
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(String result) {
|
||||||
|
if (result != null) {
|
||||||
|
try {
|
||||||
|
JSONObject jsonResponse = new JSONObject(result);
|
||||||
|
if (jsonResponse.getInt("status") == 200) {
|
||||||
|
JSONObject results = jsonResponse.getJSONObject("results");
|
||||||
|
JSONArray dataArray = results.getJSONArray("data");
|
||||||
|
processApiData(dataArray);
|
||||||
|
} else {
|
||||||
|
Toast.makeText(HistoryActivity.this, "API Error", Toast.LENGTH_SHORT).show();
|
||||||
|
loadSampleData();
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Toast.makeText(HistoryActivity.this, "JSON Parse Error", Toast.LENGTH_SHORT).show();
|
||||||
|
loadSampleData();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Toast.makeText(HistoryActivity.this, "Network Error", Toast.LENGTH_SHORT).show();
|
||||||
|
loadSampleData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// HistoryItem class - enhanced with more fields
|
||||||
|
class HistoryItem {
|
||||||
|
private String time;
|
||||||
|
private String date;
|
||||||
|
private long amount;
|
||||||
|
private String channelName;
|
||||||
|
private String status;
|
||||||
|
private String referenceId;
|
||||||
|
private String fullDate;
|
||||||
|
private String channelCode;
|
||||||
|
|
||||||
|
public HistoryItem() {}
|
||||||
|
|
||||||
|
public HistoryItem(String time, String date, long amount, String channelName, String status, String referenceId) {
|
||||||
|
this.time = time;
|
||||||
|
this.date = date;
|
||||||
|
this.amount = amount;
|
||||||
|
this.channelName = channelName;
|
||||||
|
this.status = status;
|
||||||
|
this.referenceId = referenceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Getters and Setters
|
||||||
|
public String getTime() { return time; }
|
||||||
|
public void setTime(String time) { this.time = time; }
|
||||||
|
public String getDate() { return date; }
|
||||||
|
public void setDate(String date) { this.date = date; }
|
||||||
|
public long getAmount() { return amount; }
|
||||||
|
public void setAmount(long amount) { this.amount = amount; }
|
||||||
|
public String getChannelName() { return channelName; }
|
||||||
|
public void setChannelName(String channelName) { this.channelName = channelName; }
|
||||||
|
public String getStatus() { return status; }
|
||||||
|
public void setStatus(String status) { this.status = status; }
|
||||||
|
public String getReferenceId() { return referenceId; }
|
||||||
|
public void setReferenceId(String referenceId) { this.referenceId = referenceId; }
|
||||||
|
public String getFullDate() { return fullDate; }
|
||||||
|
public void setFullDate(String fullDate) { this.fullDate = fullDate; }
|
||||||
|
public String getChannelCode() { return channelCode; }
|
||||||
|
public void setChannelCode(String channelCode) { this.channelCode = channelCode; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// HistoryAdapter class - simplified and stable
|
||||||
|
class HistoryAdapter extends RecyclerView.Adapter<HistoryAdapter.HistoryViewHolder> {
|
||||||
|
|
||||||
|
private List<HistoryItem> historyList;
|
||||||
|
|
||||||
|
public HistoryAdapter(List<HistoryItem> historyList) {
|
||||||
|
this.historyList = historyList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public HistoryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
View view = LayoutInflater.from(parent.getContext())
|
||||||
|
.inflate(R.layout.item_history, parent, false);
|
||||||
|
return new HistoryViewHolder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull HistoryViewHolder holder, int position) {
|
||||||
|
HistoryItem item = historyList.get(position);
|
||||||
|
|
||||||
|
holder.tvTime.setText(item.getTime() + ", " + item.getDate());
|
||||||
|
holder.tvAmount.setText("Rp. " + formatCurrency(item.getAmount()));
|
||||||
|
holder.tvChannel.setText(item.getChannelName());
|
||||||
|
|
||||||
|
// Set status color
|
||||||
|
String status = item.getStatus();
|
||||||
|
if ("SUCCESS".equals(status)) {
|
||||||
|
holder.tvStatus.setText("Berhasil");
|
||||||
|
holder.tvStatus.setTextColor(0xFF4CAF50); // Green
|
||||||
|
} else if ("FAILED".equals(status)) {
|
||||||
|
holder.tvStatus.setText("Gagal");
|
||||||
|
holder.tvStatus.setTextColor(0xFFF44336); // Red
|
||||||
|
} else {
|
||||||
|
holder.tvStatus.setText("Tertunda");
|
||||||
|
holder.tvStatus.setTextColor(0xFFFF9800); // Orange
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return historyList != null ? historyList.size() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatCurrency(long amount) {
|
||||||
|
try {
|
||||||
|
NumberFormat formatter = NumberFormat.getNumberInstance(new Locale("id", "ID"));
|
||||||
|
return formatter.format(amount);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return String.valueOf(amount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class HistoryViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
TextView tvTime;
|
||||||
|
TextView tvAmount;
|
||||||
|
TextView tvChannel;
|
||||||
|
TextView tvStatus;
|
||||||
|
|
||||||
|
public HistoryViewHolder(@NonNull View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
tvTime = itemView.findViewById(R.id.tv_time);
|
||||||
|
tvAmount = itemView.findViewById(R.id.tv_amount);
|
||||||
|
tvChannel = itemView.findViewById(R.id.tv_channel);
|
||||||
|
tvStatus = itemView.findViewById(R.id.tv_status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
204
app/src/main/java/com/example/bdkipoc/HistoryDetailActivity.java
Normal file
204
app/src/main/java/com/example/bdkipoc/HistoryDetailActivity.java
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
package com.example.bdkipoc;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
public class HistoryDetailActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
private RecyclerView recyclerView;
|
||||||
|
private HistoryDetailAdapter adapter;
|
||||||
|
private List<HistoryItem> detailList;
|
||||||
|
private ImageView btnBack;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_history_detail);
|
||||||
|
|
||||||
|
initViews();
|
||||||
|
setupRecyclerView();
|
||||||
|
loadData();
|
||||||
|
setupClickListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initViews() {
|
||||||
|
recyclerView = findViewById(R.id.recycler_view);
|
||||||
|
btnBack = findViewById(R.id.btn_back);
|
||||||
|
detailList = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupRecyclerView() {
|
||||||
|
adapter = new HistoryDetailAdapter(detailList);
|
||||||
|
recyclerView.setLayoutManager(new LinearLayoutManager(this));
|
||||||
|
recyclerView.setAdapter(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupClickListeners() {
|
||||||
|
btnBack.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadData() {
|
||||||
|
try {
|
||||||
|
// Get data from HistoryActivity
|
||||||
|
List<HistoryItem> fullData = HistoryActivity.getFullHistoryData();
|
||||||
|
|
||||||
|
if (fullData != null && !fullData.isEmpty()) {
|
||||||
|
detailList.clear();
|
||||||
|
detailList.addAll(fullData);
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
} else {
|
||||||
|
loadSampleDetailData();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
loadSampleDetailData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadSampleDetailData() {
|
||||||
|
detailList.clear();
|
||||||
|
|
||||||
|
// Create sample detail data
|
||||||
|
HistoryItem[] sampleData = {
|
||||||
|
new HistoryItem("03:44", "11-05-2025", 2018619, "Kredit", "FAILED", "197870"),
|
||||||
|
new HistoryItem("03:10", "12-05-2025", 3974866, "QRIS", "SUCCESS", "053059"),
|
||||||
|
new HistoryItem("15:17", "13-05-2025", 2418167, "QRIS", "FAILED", "668320"),
|
||||||
|
new HistoryItem("12:09", "11-05-2025", 3429230, "Debit", "FAILED", "454790"),
|
||||||
|
new HistoryItem("08:39", "10-05-2025", 4656447, "QRIS", "FAILED", "454248"),
|
||||||
|
new HistoryItem("00:35", "12-05-2025", 3507704, "QRIS", "FAILED", "301644"),
|
||||||
|
new HistoryItem("22:43", "13-05-2025", 4277904, "Debit", "SUCCESS", "388709"),
|
||||||
|
new HistoryItem("18:16", "11-05-2025", 4456904, "Debit", "FAILED", "986861"),
|
||||||
|
new HistoryItem("12:51", "10-05-2025", 3027953, "Kredit", "SUCCESS", "771339"),
|
||||||
|
new HistoryItem("19:50", "14-05-2025", 4399035, "QRIS", "FAILED", "103478")
|
||||||
|
};
|
||||||
|
|
||||||
|
for (HistoryItem item : sampleData) {
|
||||||
|
detailList.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// HistoryDetailAdapter class - simplified for stability
|
||||||
|
class HistoryDetailAdapter extends RecyclerView.Adapter<HistoryDetailAdapter.DetailViewHolder> {
|
||||||
|
|
||||||
|
private List<HistoryItem> detailList;
|
||||||
|
|
||||||
|
public HistoryDetailAdapter(List<HistoryItem> detailList) {
|
||||||
|
this.detailList = detailList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public DetailViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
View view = LayoutInflater.from(parent.getContext())
|
||||||
|
.inflate(R.layout.item_history_detail, parent, false);
|
||||||
|
return new DetailViewHolder(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(@NonNull DetailViewHolder holder, int position) {
|
||||||
|
HistoryItem item = detailList.get(position);
|
||||||
|
|
||||||
|
try {
|
||||||
|
holder.tvReferenceId.setText("Ref: " + item.getReferenceId());
|
||||||
|
holder.tvAmount.setText("Rp. " + formatCurrency(item.getAmount()));
|
||||||
|
holder.tvChannel.setText(item.getChannelName());
|
||||||
|
holder.tvMerchant.setText("TEST MERCHANT");
|
||||||
|
holder.tvTime.setText(formatDateTime(item.getTime(), item.getDate()));
|
||||||
|
holder.tvIssuer.setText("BANK MANDIRI");
|
||||||
|
|
||||||
|
// Set status color
|
||||||
|
String status = item.getStatus();
|
||||||
|
if ("SUCCESS".equals(status)) {
|
||||||
|
holder.tvStatus.setText("Berhasil");
|
||||||
|
holder.tvStatus.setTextColor(0xFF4CAF50); // Green
|
||||||
|
} else if ("FAILED".equals(status)) {
|
||||||
|
holder.tvStatus.setText("Gagal");
|
||||||
|
holder.tvStatus.setTextColor(0xFFF44336); // Red
|
||||||
|
} else {
|
||||||
|
holder.tvStatus.setText("Tertunda");
|
||||||
|
holder.tvStatus.setTextColor(0xFFFF9800); // Orange
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
// Set default values if error occurs
|
||||||
|
holder.tvReferenceId.setText("Ref: " + position);
|
||||||
|
holder.tvAmount.setText("Rp. 0");
|
||||||
|
holder.tvChannel.setText("Unknown");
|
||||||
|
holder.tvMerchant.setText("TEST MERCHANT");
|
||||||
|
holder.tvTime.setText("00:00, 01-01-2025");
|
||||||
|
holder.tvIssuer.setText("UNKNOWN");
|
||||||
|
holder.tvStatus.setText("Tidak Diketahui");
|
||||||
|
holder.tvStatus.setTextColor(0xFF666666);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return detailList != null ? detailList.size() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatCurrency(long amount) {
|
||||||
|
try {
|
||||||
|
NumberFormat formatter = NumberFormat.getNumberInstance(new Locale("id", "ID"));
|
||||||
|
return formatter.format(amount);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return String.valueOf(amount);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String formatDateTime(String time, String date) {
|
||||||
|
try {
|
||||||
|
return time + ", " + date;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return "00:00, 01-01-2025";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class DetailViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
TextView tvReferenceId;
|
||||||
|
TextView tvAmount;
|
||||||
|
TextView tvChannel;
|
||||||
|
TextView tvMerchant;
|
||||||
|
TextView tvTime;
|
||||||
|
TextView tvIssuer;
|
||||||
|
TextView tvStatus;
|
||||||
|
|
||||||
|
public DetailViewHolder(@NonNull View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
try {
|
||||||
|
tvReferenceId = itemView.findViewById(R.id.tv_reference_id);
|
||||||
|
tvAmount = itemView.findViewById(R.id.tv_amount);
|
||||||
|
tvChannel = itemView.findViewById(R.id.tv_channel);
|
||||||
|
tvMerchant = itemView.findViewById(R.id.tv_merchant);
|
||||||
|
tvTime = itemView.findViewById(R.id.tv_time);
|
||||||
|
tvIssuer = itemView.findViewById(R.id.tv_issuer);
|
||||||
|
tvStatus = itemView.findViewById(R.id.tv_status);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -170,7 +170,7 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
} else if (cardId == R.id.card_settlement) {
|
} else if (cardId == R.id.card_settlement) {
|
||||||
startActivity(new Intent(MainActivity.this, SettlementActivity.class));
|
startActivity(new Intent(MainActivity.this, SettlementActivity.class));
|
||||||
} else if (cardId == R.id.card_histori) {
|
} else if (cardId == R.id.card_histori) {
|
||||||
Toast.makeText(this, "Histori - Coming Soon", Toast.LENGTH_SHORT).show();
|
startActivity(new Intent(MainActivity.this, HistoryActivity.class));
|
||||||
} else if (cardId == R.id.card_bantuan) {
|
} else if (cardId == R.id.card_bantuan) {
|
||||||
Toast.makeText(this, "Bantuan - Coming Soon", Toast.LENGTH_SHORT).show();
|
Toast.makeText(this, "Bantuan - Coming Soon", Toast.LENGTH_SHORT).show();
|
||||||
} else if (cardId == R.id.card_info_toko) {
|
} else if (cardId == R.id.card_info_toko) {
|
||||||
|
174
app/src/main/res/layout/activity_history.xml
Normal file
174
app/src/main/res/layout/activity_history.xml
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout 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="match_parent"
|
||||||
|
android:background="#F5F5F5"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<!-- Header with red background -->
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="200dp"
|
||||||
|
android:background="#E53E3E">
|
||||||
|
|
||||||
|
<!-- Back button -->
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/btn_back"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="24dp"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:padding="4dp"
|
||||||
|
android:src="@android:drawable/ic_menu_revert"
|
||||||
|
android:tint="@android:color/white" />
|
||||||
|
|
||||||
|
<!-- Title -->
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_toEndOf="@id/btn_back"
|
||||||
|
android:text="Kembali"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="16sp" />
|
||||||
|
|
||||||
|
<!-- History Card -->
|
||||||
|
<androidx.cardview.widget.CardView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="120dp"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginTop="64dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
app:cardCornerRadius="12dp"
|
||||||
|
app:cardElevation="4dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#4299E1"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Transaksi Hari Ini"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:text="Total Transaksi"
|
||||||
|
android:textColor="#E0FFFFFF"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_total_amount"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:text="RP 4.500.000"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="20sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:text="Jumlah Transaksi"
|
||||||
|
android:textColor="#E0FFFFFF"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_total_transactions"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="30"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/btn_lihat_detail"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:text="Lihat Detail"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:text="Transaksi Terbaru"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<!-- Transaction List -->
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recycler_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Bottom Button -->
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_lihat_detail_bottom"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:layout_margin="16dp"
|
||||||
|
android:background="#6B46C1"
|
||||||
|
android:text="Lihat Detail"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="16sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
45
app/src/main/res/layout/activity_history_detail.xml
Normal file
45
app/src/main/res/layout/activity_history_detail.xml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="#F5F5F5"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<!-- Header -->
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:background="#E53E3E"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/btn_back"
|
||||||
|
android:layout_width="24dp"
|
||||||
|
android:layout_height="24dp"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:src="@android:drawable/ic_menu_revert"
|
||||||
|
android:tint="@android:color/white" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:text="Detail Transaksi"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<!-- Content -->
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/recycler_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:padding="16dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
69
app/src/main/res/layout/item_history.xml
Normal file
69
app/src/main/res/layout/item_history.xml
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@android:color/white"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<!-- Left Content -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="09:00, 07-05-2025"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_amount"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:text="Rp. 78.000"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Center Content -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_channel"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Kredit"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Right Content -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_status"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:text="Berhasil"
|
||||||
|
android:textColor="#4CAF50"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
178
app/src/main/res/layout/item_history_detail.xml
Normal file
178
app/src/main/res/layout/item_history_detail.xml
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<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_marginBottom="8dp"
|
||||||
|
app:cardCornerRadius="8dp"
|
||||||
|
app:cardElevation="2dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<!-- Header Row -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_reference_id"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:text="Ref: 197870"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_status"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="SUCCESS"
|
||||||
|
android:textColor="#4CAF50"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Amount -->
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_amount"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:text="Rp. 2.018.619"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="18sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<!-- Details Grid -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="12dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<!-- Row 1 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Channel"
|
||||||
|
android:textColor="#666666"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_channel"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Other Payment"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Waktu"
|
||||||
|
android:textColor="#666666"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="16/05/2025 05:40"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- Row 2 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Merchant"
|
||||||
|
android:textColor="#666666"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_merchant"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="TEST MERCHANT"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Issuer"
|
||||||
|
android:textColor="#666666"
|
||||||
|
android:textSize="12sp" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_issuer"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="BANK MANDIRI"
|
||||||
|
android:textColor="#333333"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView>
|
Loading…
x
Reference in New Issue
Block a user