From 44225f1d679c75e99f2e746abafc2e9fa5028e6a Mon Sep 17 00:00:00 2001 From: riz081 Date: Mon, 30 Jun 2025 10:18:57 +0700 Subject: [PATCH] backup bantuan activity with api --- .../bdkipoc/bantuan/BantuanActivity.java | 893 ++++++++++++++++-- app/src/main/res/layout/activity_bantuan.xml | 518 ++++++++++ 2 files changed, 1358 insertions(+), 53 deletions(-) create mode 100644 app/src/main/res/layout/activity_bantuan.xml diff --git a/app/src/main/java/com/example/bdkipoc/bantuan/BantuanActivity.java b/app/src/main/java/com/example/bdkipoc/bantuan/BantuanActivity.java index 4d890f4..7b7ea19 100644 --- a/app/src/main/java/com/example/bdkipoc/bantuan/BantuanActivity.java +++ b/app/src/main/java/com/example/bdkipoc/bantuan/BantuanActivity.java @@ -3,44 +3,142 @@ package com.example.bdkipoc.bantuan; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.view.View; -import android.widget.Button; import android.widget.LinearLayout; +import android.widget.ScrollView; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; +import android.widget.ProgressBar; import com.example.bdkipoc.R; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + public class BantuanActivity extends AppCompatActivity { + // Tab components private LinearLayout tabUmum, tabRiwayat; private TextView textUmum, textRiwayat; - private View contentUmum, contentRiwayat; + + // Content containers + private ScrollView contentUmum, contentRiwayat; + private LinearLayout riwayatContainer; + private ProgressBar progressBar; + + // Bottom buttons private LinearLayout btnForm, btnWhatsApp; private LinearLayout backNavigation; + // Current active tab + private boolean isUmumTabActive = true; + + // API and data + private List ticketList = new ArrayList<>(); + private ExecutorService executor = Executors.newSingleThreadExecutor(); + private Handler mainHandler = new Handler(Looper.getMainLooper()); + + // Data model class + public static class TicketData { + public String createdAt; + public String ticketCode; + public String issueName; + public String status; + + public TicketData(String createdAt, String ticketCode, String issueName, String status) { + this.createdAt = createdAt; + this.ticketCode = ticketCode; + this.issueName = issueName; + this.status = status; + } + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + android.util.Log.d("BantuanActivity", "=== onCreate START ==="); + + setContentView(R.layout.activity_bantuan); + + // Debug network and system info + checkNetworkConnection(); - // Default tampilkan tab Umum - setContentView(R.layout.activity_bantuan_umum); initViews(); setupListeners(); + + // Set default tab (Umum) as active + showUmumTab(); + + // Debug layout hierarchy + debugLayoutHierarchy(); + + // Test basic HTTP connectivity + testSimpleHttpConnection(); + + // Load ticket data from API + android.util.Log.d("BantuanActivity", "Starting API call..."); + loadTicketData(); + + android.util.Log.d("BantuanActivity", "=== onCreate END ==="); } private void initViews() { - tabUmum = findViewById(R.id.tab_umum); - tabRiwayat = findViewById(R.id.tab_riwayat); - textUmum = findViewById(R.id.text_umum); - textRiwayat = findViewById(R.id.text_riwayat); - - btnForm = findViewById(R.id.btn_form); - btnWhatsApp = findViewById(R.id.btn_whatsapp); - - // Back navigation dari component_appbar - backNavigation = findViewById(R.id.back_navigation); + try { + // Tab components + tabUmum = findViewById(R.id.tab_umum); + tabRiwayat = findViewById(R.id.tab_riwayat); + textUmum = findViewById(R.id.text_umum); + textRiwayat = findViewById(R.id.text_riwayat); + + // Content containers + contentUmum = findViewById(R.id.content_umum); + contentRiwayat = findViewById(R.id.content_riwayat); + + // Create dynamic container for riwayat content + if (contentRiwayat != null) { + View child = contentRiwayat.getChildAt(0); + if (child instanceof LinearLayout) { + riwayatContainer = (LinearLayout) child; + } + } + + // Bottom buttons + btnForm = findViewById(R.id.btn_form); + btnWhatsApp = findViewById(R.id.btn_whatsapp); + + // Back navigation dari component_appbar + backNavigation = findViewById(R.id.back_navigation); + + // Create progress bar programmatically + progressBar = new ProgressBar(this, null, android.R.attr.progressBarStyleSmall); + progressBar.setVisibility(View.GONE); + + // Debug: Log which views are null + android.util.Log.d("BantuanActivity", "tabUmum: " + (tabUmum != null)); + android.util.Log.d("BantuanActivity", "tabRiwayat: " + (tabRiwayat != null)); + android.util.Log.d("BantuanActivity", "contentUmum: " + (contentUmum != null)); + android.util.Log.d("BantuanActivity", "contentRiwayat: " + (contentRiwayat != null)); + android.util.Log.d("BantuanActivity", "riwayatContainer: " + (riwayatContainer != null)); + + } catch (Exception e) { + e.printStackTrace(); + android.util.Log.e("BantuanActivity", "Error in initViews: " + e.getMessage()); + } } private void setupListeners() { @@ -50,56 +148,745 @@ public class BantuanActivity extends AppCompatActivity { } // Tab listeners - tabUmum.setOnClickListener(v -> showUmumTab()); - tabRiwayat.setOnClickListener(v -> showRiwayatTab()); + if (tabUmum != null) { + tabUmum.setOnClickListener(v -> showUmumTab()); + } + if (tabRiwayat != null) { + tabRiwayat.setOnClickListener(v -> showRiwayatTab()); + } // Button listeners - btnForm.setOnClickListener(v -> { - setContentView(R.layout.activity_bantuan_form); - setupFormView(); - }); + if (btnForm != null) { + btnForm.setOnClickListener(v -> { + try { + // Handle form bantuan - untuk sementara bisa tampilkan toast atau dialog + android.widget.Toast.makeText(this, "Form Bantuan akan segera tersedia", android.widget.Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + e.printStackTrace(); + android.widget.Toast.makeText(this, "Error: " + e.getMessage(), android.widget.Toast.LENGTH_SHORT).show(); + } + }); + } - btnWhatsApp.setOnClickListener(v -> { - // Handle WhatsApp CS - }); + if (btnWhatsApp != null) { + btnWhatsApp.setOnClickListener(v -> { + try { + // Handle WhatsApp CS - bisa buka aplikasi WhatsApp atau web + openWhatsAppCS(); + } catch (Exception e) { + e.printStackTrace(); + android.widget.Toast.makeText(this, "Error membuka WhatsApp: " + e.getMessage(), android.widget.Toast.LENGTH_SHORT).show(); + } + }); + } } private void showUmumTab() { - setContentView(R.layout.activity_bantuan_umum); - initViews(); - setupListeners(); - - // Update tab appearance menggunakan drawable yang sudah dibuat - tabUmum.setBackgroundResource(R.drawable.tab_active_bg); - textUmum.setTextColor(ContextCompat.getColor(this, android.R.color.white)); - - tabRiwayat.setBackgroundResource(R.drawable.tab_inactive_bg); - textRiwayat.setTextColor(Color.parseColor("#DE0701")); + try { + if (isUmumTabActive) return; // Avoid unnecessary operations + + isUmumTabActive = true; + + // Update content visibility + if (contentUmum != null) { + contentUmum.setVisibility(View.VISIBLE); + android.util.Log.d("BantuanActivity", "contentUmum set to VISIBLE"); + } + if (contentRiwayat != null) { + contentRiwayat.setVisibility(View.GONE); + android.util.Log.d("BantuanActivity", "contentRiwayat set to GONE"); + } + + // Update tab appearance + updateTabAppearance(); + } catch (Exception e) { + e.printStackTrace(); + android.util.Log.e("BantuanActivity", "Error in showUmumTab: " + e.getMessage()); + } } private void showRiwayatTab() { - setContentView(R.layout.activity_bantuan_riwayat); - initViews(); - setupListeners(); - - // Update tab appearance menggunakan drawable yang sudah dibuat - tabRiwayat.setBackgroundResource(R.drawable.tab_active_bg); - textRiwayat.setTextColor(ContextCompat.getColor(this, android.R.color.white)); - - tabUmum.setBackgroundResource(R.drawable.tab_inactive_bg); - textUmum.setTextColor(Color.parseColor("#DE0701")); - } - - private void setupFormView() { - Button btnKirim = findViewById(R.id.btn_kirim); - LinearLayout btnBack = findViewById(R.id.back_navigation); - - if (btnBack != null) { - btnBack.setOnClickListener(v -> showUmumTab()); + try { + android.util.Log.d("BantuanActivity", "=== showRiwayatTab called ==="); + + if (!isUmumTabActive) { + android.util.Log.d("BantuanActivity", "Already on riwayat tab, skipping"); + return; // Avoid unnecessary operations + } + + isUmumTabActive = false; + android.util.Log.d("BantuanActivity", "Switching to riwayat tab"); + + // Update content visibility + if (contentUmum != null) { + contentUmum.setVisibility(View.GONE); + android.util.Log.d("BantuanActivity", "contentUmum set to GONE"); + } + if (contentRiwayat != null) { + contentRiwayat.setVisibility(View.VISIBLE); + android.util.Log.d("BantuanActivity", "contentRiwayat set to VISIBLE"); + } + + // Update tab appearance + updateTabAppearance(); + + // Debug current state + debugLayoutHierarchy(); + + // Populate riwayat content if data is available + if (!ticketList.isEmpty()) { + android.util.Log.d("BantuanActivity", "Ticket data available (" + ticketList.size() + " items), populating content"); + populateRiwayatContent(); + } else { + android.util.Log.w("BantuanActivity", "No ticket data available yet"); + // Show loading or empty message + if (riwayatContainer != null) { + riwayatContainer.removeAllViews(); + TextView loadingText = new TextView(this); + loadingText.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + )); + loadingText.setText("Memuat data..."); + loadingText.setTextSize(16); + loadingText.setGravity(android.view.Gravity.CENTER); + loadingText.setPadding(dpToPx(16), dpToPx(32), dpToPx(16), dpToPx(32)); + loadingText.setTextColor(ContextCompat.getColor(this, android.R.color.darker_gray)); + riwayatContainer.addView(loadingText); + android.util.Log.d("BantuanActivity", "Loading message added to riwayat container"); + } + } + + } catch (Exception e) { + e.printStackTrace(); + android.util.Log.e("BantuanActivity", "Error in showRiwayatTab: " + e.getMessage()); } - btnKirim.setOnClickListener(v -> { - // Handle form submission + android.util.Log.d("BantuanActivity", "=== showRiwayatTab completed ==="); + } + + private void updateTabAppearance() { + try { + if (isUmumTabActive) { + // Umum tab active + if (tabUmum != null) { + tabUmum.setBackgroundResource(R.drawable.tab_active_bg); + } + if (textUmum != null) { + textUmum.setTextColor(ContextCompat.getColor(this, android.R.color.white)); + } + + // Riwayat tab inactive + if (tabRiwayat != null) { + tabRiwayat.setBackgroundResource(R.drawable.tab_inactive_bg); + } + if (textRiwayat != null) { + textRiwayat.setTextColor(Color.parseColor("#DE0701")); + } + } else { + // Riwayat tab active + if (tabRiwayat != null) { + tabRiwayat.setBackgroundResource(R.drawable.tab_active_bg); + } + if (textRiwayat != null) { + textRiwayat.setTextColor(ContextCompat.getColor(this, android.R.color.white)); + } + + // Umum tab inactive + if (tabUmum != null) { + tabUmum.setBackgroundResource(R.drawable.tab_inactive_bg); + } + if (textUmum != null) { + textUmum.setTextColor(Color.parseColor("#DE0701")); + } + } + + android.util.Log.d("BantuanActivity", "Tab appearance updated. isUmumTabActive: " + isUmumTabActive); + } catch (Exception e) { + e.printStackTrace(); + android.util.Log.e("BantuanActivity", "Error in updateTabAppearance: " + e.getMessage()); + } + } + + private void loadTicketData() { + android.util.Log.d("BantuanActivity", "=== START loadTicketData ==="); + showLoading(true); + + executor.execute(() -> { + HttpURLConnection connection = null; + try { + String apiUrl = "https://be-edc.msvc.app/tickets?page=0&limit=10&sortOrder=ASC&sortColumn=ticket_code"; + android.util.Log.d("BantuanActivity", "API URL: " + apiUrl); + + URL url = new URL(apiUrl); + connection = (HttpURLConnection) url.openConnection(); + + // Set connection properties + connection.setRequestMethod("GET"); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("User-Agent", "Android-App/1.0"); + connection.setConnectTimeout(15000); // Increase timeout + connection.setReadTimeout(15000); + connection.setDoInput(true); + + android.util.Log.d("BantuanActivity", "Connection configured, attempting to connect..."); + + // Check if we can connect + connection.connect(); + android.util.Log.d("BantuanActivity", "Connection established"); + + int responseCode = connection.getResponseCode(); + String responseMessage = connection.getResponseMessage(); + android.util.Log.d("BantuanActivity", "API Response Code: " + responseCode); + android.util.Log.d("BantuanActivity", "API Response Message: " + responseMessage); + + if (responseCode == HttpURLConnection.HTTP_OK) { + android.util.Log.d("BantuanActivity", "Reading response..."); + + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + StringBuilder response = new StringBuilder(); + String line; + + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + String responseString = response.toString(); + android.util.Log.d("BantuanActivity", "Response Length: " + responseString.length()); + android.util.Log.d("BantuanActivity", "Response Preview: " + + (responseString.length() > 200 ? responseString.substring(0, 200) + "..." : responseString)); + + // Parse JSON response + parseTicketData(responseString); + + } else { + // Log error response body + try { + BufferedReader errorReader = new BufferedReader(new InputStreamReader(connection.getErrorStream())); + StringBuilder errorResponse = new StringBuilder(); + String errorLine; + while ((errorLine = errorReader.readLine()) != null) { + errorResponse.append(errorLine); + } + errorReader.close(); + android.util.Log.e("BantuanActivity", "Error Response Body: " + errorResponse.toString()); + } catch (Exception errorEx) { + android.util.Log.e("BantuanActivity", "Cannot read error response: " + errorEx.getMessage()); + } + + android.util.Log.e("BantuanActivity", "API Error: " + responseCode + " - " + responseMessage); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Gagal memuat data riwayat: " + responseCode, android.widget.Toast.LENGTH_LONG).show(); + }); + } + + } catch (java.net.UnknownHostException e) { + android.util.Log.e("BantuanActivity", "Network Error - Unknown Host: " + e.getMessage()); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Tidak dapat terhubung ke server. Periksa koneksi internet.", android.widget.Toast.LENGTH_LONG).show(); + }); + } catch (java.net.SocketTimeoutException e) { + android.util.Log.e("BantuanActivity", "Network Error - Timeout: " + e.getMessage()); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Koneksi timeout. Coba lagi.", android.widget.Toast.LENGTH_LONG).show(); + }); + } catch (java.net.ConnectException e) { + android.util.Log.e("BantuanActivity", "Network Error - Connection Failed: " + e.getMessage()); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Gagal terhubung ke server.", android.widget.Toast.LENGTH_LONG).show(); + }); + } catch (java.io.IOException e) { + android.util.Log.e("BantuanActivity", "IO Error: " + e.getMessage()); + e.printStackTrace(); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Error IO: " + e.getMessage(), android.widget.Toast.LENGTH_LONG).show(); + }); + } catch (Exception e) { + android.util.Log.e("BantuanActivity", "General Error: " + e.getMessage()); + e.printStackTrace(); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Error: " + e.getMessage(), android.widget.Toast.LENGTH_LONG).show(); + }); + } finally { + if (connection != null) { + connection.disconnect(); + android.util.Log.d("BantuanActivity", "Connection disconnected"); + } + android.util.Log.d("BantuanActivity", "=== END loadTicketData ==="); + } }); } + + private void parseTicketData(String jsonResponse) { + try { + android.util.Log.d("BantuanActivity", "=== START parseTicketData ==="); + android.util.Log.d("BantuanActivity", "JSON Response received, length: " + jsonResponse.length()); + + if (jsonResponse == null || jsonResponse.trim().isEmpty()) { + android.util.Log.e("BantuanActivity", "JSON Response is null or empty"); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Response kosong dari server", android.widget.Toast.LENGTH_SHORT).show(); + }); + return; + } + + JSONObject jsonObject = new JSONObject(jsonResponse); + android.util.Log.d("BantuanActivity", "JSON parsed successfully"); + + // Check if response has results + if (!jsonObject.has("results")) { + android.util.Log.e("BantuanActivity", "JSON does not contain 'results' field"); + android.util.Log.d("BantuanActivity", "Available keys: " + jsonObject.keys().toString()); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Format response tidak valid", android.widget.Toast.LENGTH_SHORT).show(); + }); + return; + } + + JSONObject results = jsonObject.getJSONObject("results"); + android.util.Log.d("BantuanActivity", "Results object extracted"); + + // Check if results has data + if (!results.has("data")) { + android.util.Log.e("BantuanActivity", "Results does not contain 'data' field"); + android.util.Log.d("BantuanActivity", "Available keys in results: " + results.keys().toString()); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Data tidak ditemukan dalam response", android.widget.Toast.LENGTH_SHORT).show(); + }); + return; + } + + JSONArray dataArray = results.getJSONArray("data"); + android.util.Log.d("BantuanActivity", "Data array extracted, length: " + dataArray.length()); + + List newTicketList = new ArrayList<>(); + + for (int i = 0; i < dataArray.length(); i++) { + try { + JSONObject ticket = dataArray.getJSONObject(i); + android.util.Log.d("BantuanActivity", "Processing ticket " + (i+1) + "/" + dataArray.length()); + + // Extract required fields with null checks + String createdAt = ticket.optString("createdAt", ""); + String ticketCode = ticket.optString("ticket_code", ""); + String status = ticket.optString("status", ""); + + android.util.Log.d("BantuanActivity", "Ticket " + (i+1) + " - createdAt: " + createdAt + ", ticket_code: " + ticketCode + ", status: " + status); + + // Get issue name with null check + String issueName = ""; + if (ticket.has("issue") && !ticket.isNull("issue")) { + JSONObject issue = ticket.getJSONObject("issue"); + issueName = issue.optString("name", "Tidak ada keterangan"); + android.util.Log.d("BantuanActivity", "Ticket " + (i+1) + " - issue name: " + issueName); + } else { + android.util.Log.w("BantuanActivity", "Ticket " + (i+1) + " - issue field is missing or null"); + issueName = "Tidak ada keterangan"; + } + + // Validate required fields + if (createdAt.isEmpty() || ticketCode.isEmpty()) { + android.util.Log.w("BantuanActivity", "Ticket " + (i+1) + " - skipping due to missing required fields"); + continue; + } + + newTicketList.add(new TicketData(createdAt, ticketCode, issueName, status)); + android.util.Log.d("BantuanActivity", "Ticket " + (i+1) + " added successfully"); + + } catch (Exception ticketException) { + android.util.Log.e("BantuanActivity", "Error processing ticket " + (i+1) + ": " + ticketException.getMessage()); + ticketException.printStackTrace(); + // Continue with next ticket + } + } + + android.util.Log.d("BantuanActivity", "Successfully processed " + newTicketList.size() + " tickets out of " + dataArray.length()); + + // Update UI on main thread + mainHandler.post(() -> { + try { + android.util.Log.d("BantuanActivity", "Updating UI with ticket data..."); + ticketList.clear(); + ticketList.addAll(newTicketList); + showLoading(false); + + // If currently on riwayat tab, update the content + if (!isUmumTabActive) { + android.util.Log.d("BantuanActivity", "Currently on riwayat tab, populating content..."); + populateRiwayatContent(); + } else { + android.util.Log.d("BantuanActivity", "Currently on umum tab, data loaded and ready"); + } + + android.widget.Toast.makeText(this, "Data riwayat berhasil dimuat (" + ticketList.size() + " item)", android.widget.Toast.LENGTH_SHORT).show(); + android.util.Log.d("BantuanActivity", "UI update completed successfully"); + + } catch (Exception uiException) { + android.util.Log.e("BantuanActivity", "Error updating UI: " + uiException.getMessage()); + uiException.printStackTrace(); + android.widget.Toast.makeText(this, "Error updating UI: " + uiException.getMessage(), android.widget.Toast.LENGTH_SHORT).show(); + } + }); + + } catch (org.json.JSONException jsonException) { + android.util.Log.e("BantuanActivity", "JSON Parsing Error: " + jsonException.getMessage()); + android.util.Log.e("BantuanActivity", "Invalid JSON received: " + (jsonResponse.length() > 500 ? jsonResponse.substring(0, 500) + "..." : jsonResponse)); + jsonException.printStackTrace(); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Error parsing JSON: " + jsonException.getMessage(), android.widget.Toast.LENGTH_LONG).show(); + }); + } catch (Exception e) { + android.util.Log.e("BantuanActivity", "General parsing error: " + e.getMessage()); + e.printStackTrace(); + mainHandler.post(() -> { + showLoading(false); + android.widget.Toast.makeText(this, "Error parsing data: " + e.getMessage(), android.widget.Toast.LENGTH_SHORT).show(); + }); + } finally { + android.util.Log.d("BantuanActivity", "=== END parseTicketData ==="); + } + } + + private void populateRiwayatContent() { + android.util.Log.d("BantuanActivity", "=== START populateRiwayatContent ==="); + + if (riwayatContainer == null) { + android.util.Log.e("BantuanActivity", "riwayatContainer is null!"); + return; + } + + if (ticketList.isEmpty()) { + android.util.Log.w("BantuanActivity", "ticketList is empty!"); + // Show empty state message + riwayatContainer.removeAllViews(); + + TextView emptyText = new TextView(this); + emptyText.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + )); + emptyText.setText("Belum ada data riwayat"); + emptyText.setTextSize(16); + emptyText.setGravity(android.view.Gravity.CENTER); + emptyText.setPadding(dpToPx(16), dpToPx(32), dpToPx(16), dpToPx(32)); + emptyText.setTextColor(ContextCompat.getColor(this, android.R.color.darker_gray)); + + riwayatContainer.addView(emptyText); + android.util.Log.d("BantuanActivity", "Empty state message added"); + return; + } + + try { + android.util.Log.d("BantuanActivity", "Clearing existing content..."); + // Clear existing content + riwayatContainer.removeAllViews(); + + android.util.Log.d("BantuanActivity", "Creating " + ticketList.size() + " history items..."); + + for (int i = 0; i < ticketList.size(); i++) { + TicketData ticket = ticketList.get(i); + android.util.Log.d("BantuanActivity", "Creating item " + (i+1) + ": " + ticket.ticketCode); + + // Create history item layout + LinearLayout historyItem = createHistoryItem(ticket); + if (historyItem != null) { + riwayatContainer.addView(historyItem); + android.util.Log.d("BantuanActivity", "Item " + (i+1) + " added successfully"); + + // Add separator (except for last item) + if (i < ticketList.size() - 1) { + View separator = new View(this); + separator.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + 1 + )); + separator.setBackgroundColor(Color.parseColor("#e0e0e0")); + riwayatContainer.addView(separator); + android.util.Log.d("BantuanActivity", "Separator " + (i+1) + " added"); + } + } else { + android.util.Log.e("BantuanActivity", "Failed to create item " + (i+1)); + } + } + + android.util.Log.d("BantuanActivity", "All items created successfully. Total children in container: " + riwayatContainer.getChildCount()); + + // Force layout refresh + riwayatContainer.requestLayout(); + + } catch (Exception e) { + e.printStackTrace(); + android.util.Log.e("BantuanActivity", "Error populating riwayat content: " + e.getMessage()); + + // Show error message in UI + riwayatContainer.removeAllViews(); + TextView errorText = new TextView(this); + errorText.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + )); + errorText.setText("Error menampilkan data: " + e.getMessage()); + errorText.setTextSize(14); + errorText.setGravity(android.view.Gravity.CENTER); + errorText.setPadding(dpToPx(16), dpToPx(32), dpToPx(16), dpToPx(32)); + errorText.setTextColor(ContextCompat.getColor(this, android.R.color.holo_red_dark)); + riwayatContainer.addView(errorText); + } + + android.util.Log.d("BantuanActivity", "=== END populateRiwayatContent ==="); + } + + private LinearLayout createHistoryItem(TicketData ticket) { + try { + android.util.Log.d("BantuanActivity", "Creating history item for ticket: " + ticket.ticketCode); + + LinearLayout mainLayout = new LinearLayout(this); + mainLayout.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + )); + mainLayout.setOrientation(LinearLayout.VERTICAL); + mainLayout.setPadding(dpToPx(16), dpToPx(16), dpToPx(16), dpToPx(16)); + mainLayout.setBackgroundColor(Color.WHITE); + + // Header layout (date and status) + LinearLayout headerLayout = new LinearLayout(this); + headerLayout.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + )); + headerLayout.setOrientation(LinearLayout.HORIZONTAL); + + // Date TextView + TextView dateText = new TextView(this); + LinearLayout.LayoutParams dateParams = new LinearLayout.LayoutParams( + 0, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f + ); + dateText.setLayoutParams(dateParams); + String formattedDate = formatDate(ticket.createdAt); + dateText.setText(formattedDate); + dateText.setTextSize(16); + dateText.setTypeface(null, android.graphics.Typeface.BOLD); + android.util.Log.d("BantuanActivity", "Date formatted: " + ticket.createdAt + " -> " + formattedDate); + + // Status TextView + TextView statusText = new TextView(this); + statusText.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + )); + String formattedStatus = formatStatus(ticket.status); + int statusColor = getStatusColor(ticket.status); + statusText.setText(formattedStatus); + statusText.setTextSize(14); + statusText.setTextColor(statusColor); + android.util.Log.d("BantuanActivity", "Status formatted: " + ticket.status + " -> " + formattedStatus); + + headerLayout.addView(dateText); + headerLayout.addView(statusText); + + // Ticket code TextView + TextView ticketCodeText = new TextView(this); + LinearLayout.LayoutParams ticketParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ); + ticketParams.setMargins(0, dpToPx(4), 0, 0); + ticketCodeText.setLayoutParams(ticketParams); + ticketCodeText.setText("Nomor tiket: " + ticket.ticketCode); + ticketCodeText.setTextSize(14); + ticketCodeText.setTextColor(ContextCompat.getColor(this, android.R.color.darker_gray)); + + // Issue name TextView + TextView issueText = new TextView(this); + LinearLayout.LayoutParams issueParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ); + issueParams.setMargins(0, dpToPx(8), 0, 0); + issueText.setLayoutParams(issueParams); + issueText.setText(ticket.issueName); + issueText.setTextSize(16); + + mainLayout.addView(headerLayout); + mainLayout.addView(ticketCodeText); + mainLayout.addView(issueText); + + android.util.Log.d("BantuanActivity", "History item created successfully for: " + ticket.ticketCode); + return mainLayout; + + } catch (Exception e) { + android.util.Log.e("BantuanActivity", "Error creating history item for ticket " + ticket.ticketCode + ": " + e.getMessage()); + e.printStackTrace(); + return null; + } + } + + 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 (Exception e) { + android.util.Log.e("BantuanActivity", "Error formatting date: " + e.getMessage()); + return isoDate.substring(0, 10); // fallback to YYYY-MM-DD + } + } + + private String formatStatus(String status) { + switch (status.toLowerCase()) { + case "new": + return "Pengajuan"; + case "on_progres": + return "Proses"; + case "done": + return "Selesai"; + case "cancel": + return "Cancel"; + default: + return status; + } + } + + private int getStatusColor(String status) { + switch (status.toLowerCase()) { + case "new": + return ContextCompat.getColor(this, android.R.color.holo_blue_light); + case "on_progres": + return ContextCompat.getColor(this, android.R.color.holo_orange_light); + case "done": + return ContextCompat.getColor(this, android.R.color.holo_green_dark); + case "cancel": + return ContextCompat.getColor(this, android.R.color.holo_red_dark); + default: + return ContextCompat.getColor(this, android.R.color.black); + } + } + + private int dpToPx(int dp) { + float density = getResources().getDisplayMetrics().density; + return Math.round(dp * density); + } + + private void showLoading(boolean show) { + android.util.Log.d("BantuanActivity", "Loading state: " + show); + // You can implement a loading indicator here if needed + // For example, you can show/hide a progress bar + } + + // Debug helper methods + private void checkNetworkConnection() { + try { + android.net.ConnectivityManager cm = (android.net.ConnectivityManager) getSystemService(android.content.Context.CONNECTIVITY_SERVICE); + android.net.NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); + android.util.Log.d("BantuanActivity", "Network connected: " + isConnected); + + if (activeNetwork != null) { + android.util.Log.d("BantuanActivity", "Network type: " + activeNetwork.getTypeName()); + android.util.Log.d("BantuanActivity", "Network subtype: " + activeNetwork.getSubtypeName()); + } + } catch (Exception e) { + android.util.Log.e("BantuanActivity", "Error checking network: " + e.getMessage()); + } + } + + private void testSimpleHttpConnection() { + android.util.Log.d("BantuanActivity", "Testing simple HTTP connection..."); + executor.execute(() -> { + try { + java.net.URL url = new java.net.URL("https://httpbin.org/get"); + java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + + int responseCode = connection.getResponseCode(); + android.util.Log.d("BantuanActivity", "Test connection response: " + responseCode); + connection.disconnect(); + + if (responseCode == 200) { + android.util.Log.d("BantuanActivity", "Basic HTTP connection works fine"); + } else { + android.util.Log.w("BantuanActivity", "Basic HTTP connection returned: " + responseCode); + } + } catch (Exception e) { + android.util.Log.e("BantuanActivity", "Test connection failed: " + e.getMessage()); + e.printStackTrace(); + } + }); + } + + private void debugLayoutHierarchy() { + android.util.Log.d("BantuanActivity", "=== Layout Debug Info ==="); + android.util.Log.d("BantuanActivity", "contentRiwayat: " + (contentRiwayat != null ? "OK" : "NULL")); + + if (contentRiwayat != null) { + android.util.Log.d("BantuanActivity", "contentRiwayat visibility: " + contentRiwayat.getVisibility()); + android.util.Log.d("BantuanActivity", "contentRiwayat childCount: " + contentRiwayat.getChildCount()); + + if (contentRiwayat.getChildCount() > 0) { + android.view.View child = contentRiwayat.getChildAt(0); + android.util.Log.d("BantuanActivity", "First child type: " + child.getClass().getSimpleName()); + + if (child instanceof LinearLayout) { + LinearLayout childLinear = (LinearLayout) child; + android.util.Log.d("BantuanActivity", "Child LinearLayout childCount: " + childLinear.getChildCount()); + } + } + } + + android.util.Log.d("BantuanActivity", "riwayatContainer: " + (riwayatContainer != null ? "OK" : "NULL")); + if (riwayatContainer != null) { + android.util.Log.d("BantuanActivity", "riwayatContainer childCount: " + riwayatContainer.getChildCount()); + } + + android.util.Log.d("BantuanActivity", "ticketList size: " + ticketList.size()); + android.util.Log.d("BantuanActivity", "isUmumTabActive: " + isUmumTabActive); + android.util.Log.d("BantuanActivity", "========================="); + } + + private void openWhatsAppCS() { + // Implementasi untuk membuka WhatsApp CS + // Contoh: buka WhatsApp dengan nomor tertentu + try { + String phoneNumber = "+6281234567890"; // Ganti dengan nomor CS yang sesuai + String message = "Halo, saya butuh bantuan terkait Payvora PRO"; + + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(android.net.Uri.parse("https://wa.me/" + phoneNumber + "?text=" + + android.net.Uri.encode(message))); + startActivity(intent); + } catch (Exception e) { + // Fallback jika WhatsApp tidak terinstall + // Bisa tampilkan dialog atau buka browser + e.printStackTrace(); + } + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + finish(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (executor != null && !executor.isShutdown()) { + executor.shutdown(); + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_bantuan.xml b/app/src/main/res/layout/activity_bantuan.xml new file mode 100644 index 0000000..986aeeb --- /dev/null +++ b/app/src/main/res/layout/activity_bantuan.xml @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file