diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt
index d040cf7..5948017 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt
@@ -86,19 +86,72 @@ class RegisterActivity : AppCompatActivity() {
}
}
+ // In RegisterActivity, add debug to navigateToStep:
+
fun navigateToStep(step: Int, userData: RegisterRequest?) {
- val fragment = when (step) {
- 1 -> RegisterStep1Fragment.newInstance()
- 2 -> RegisterStep2Fragment.newInstance(userData)
- 3 -> RegisterStep3Fragment.newInstance()
- else -> null
+ Log.d("RegisterActivity", "=== NAVIGATE TO STEP START ===")
+ Log.d("RegisterActivity", "Target step: $step")
+ Log.d("RegisterActivity", "Current fragment count: ${supportFragmentManager.fragments.size}")
+ Log.d("RegisterActivity", "UserData: ${userData?.email}")
+
+ Log.d("RegisterActivity", "Navigation called from:")
+ Thread.currentThread().stackTrace.take(10).forEach { element ->
+ Log.d("RegisterActivity", " at ${element.className}.${element.methodName}(${element.fileName}:${element.lineNumber})")
}
- fragment?.let {
- supportFragmentManager.beginTransaction()
- .replace(R.id.fragment_container, it)
- .addToBackStack(null)
- .commit()
+
+ try {
+ val fragment = when (step) {
+ 1 -> {
+ Log.d("RegisterActivity", "Creating RegisterStep1Fragment")
+ RegisterStep1Fragment.newInstance()
+ }
+ 2 -> {
+ Log.d("RegisterActivity", "Creating RegisterStep2Fragment")
+ RegisterStep2Fragment.newInstance(userData)
+ }
+ 3 -> {
+ Log.d("RegisterActivity", "Creating RegisterStep3Fragment")
+ RegisterStep3Fragment.newInstance()
+ }
+ else -> {
+ Log.e("RegisterActivity", "Invalid step: $step")
+ return
+ }
+ }
+
+ Log.d("RegisterActivity", "Fragment created, starting transaction")
+
+ val transaction = supportFragmentManager.beginTransaction()
+ transaction.replace(R.id.fragment_container, fragment)
+
+ Log.d("RegisterActivity", "About to commit transaction")
+ transaction.commit()
+
+ Log.d("RegisterActivity", "Transaction committed")
+
+ // Update ViewModel step
+ registerViewModel.setStep(step)
+ Log.d("RegisterActivity", "ViewModel step updated to: $step")
+
+ } catch (e: Exception) {
+ Log.e("RegisterActivity", "Exception in navigateToStep: ${e.message}", e)
+ e.printStackTrace()
+ }
+
+ Log.d("RegisterActivity", "=== NAVIGATE TO STEP END ===")
+ }
+
+ // Handle Android back button - close activity or go to step 1
+ override fun onBackPressed() {
+ val currentStep = registerViewModel.currentStep.value ?: 1
+
+ if (currentStep == 1) {
+ // On step 1, exit the activity
+ super.onBackPressed()
+ } else {
+ // On other steps, go back to step 1
+ navigateToStep(1, null)
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep2Fragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep2Fragment.kt
index 0d60c7e..c273c9c 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep2Fragment.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/fragments/RegisterStep2Fragment.kt
@@ -1,6 +1,7 @@
package com.alya.ecommerce_serang.ui.auth.fragments
import android.content.Context
+import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.os.CountDownTimer
@@ -32,6 +33,9 @@ class RegisterStep2Fragment : Fragment() {
private var _binding: FragmentRegisterStep2Binding? = null
private val binding get() = _binding!!
private lateinit var sessionManager: SessionManager
+ private var countDownTimer: CountDownTimer? = null
+ private var timeRemaining = 30
+ private var isTimerRunning = false
// In RegisterStep2Fragment AND RegisterStep3Fragment:
private val registerViewModel: RegisterViewModel by activityViewModels {
@@ -42,8 +46,8 @@ class RegisterStep2Fragment : Fragment() {
RegisterViewModel(userRepository, orderRepository, requireContext())
}
}
- private var countDownTimer: CountDownTimer? = null
- private var timeRemaining = 30 // 30 seconds cooldown for resend
+// private var countDownTimer: CountDownTimer? = null
+// private var timeRemaining = 30 // 30 seconds cooldown for resend
companion object {
@@ -112,13 +116,23 @@ class RegisterStep2Fragment : Fragment() {
}
}
- binding.btnBack.setOnClickListener {
- parentFragmentManager.popBackStack()
- }
-
observeRegistrationState()
observeLoginState()
Log.d(TAG, "Registration and login state observers set up")
+ binding.btnBack.setOnClickListener {
+ Log.d(TAG, "Back button clicked - cleaning up timer and going to step 1")
+
+ // Stop the timer before navigating
+ stopTimer()
+ // Small delay to ensure timer is properly canceled
+ binding.root.postDelayed({
+// (activity as? RegisterActivity)?.navigateToStep(1, null)
+ val intent = Intent(requireContext(), RegisterActivity::class.java)
+ startActivity(intent)
+ requireActivity().finish()
+
+ }, 100)
+ }
}
private fun verifyOtp(userData: RegisterRequest?) {
@@ -172,37 +186,9 @@ class RegisterStep2Fragment : Fragment() {
} ?: Log.e(TAG, "Cannot resend OTP: email is null")
}
- private fun startResendCooldown() {
- Log.d(TAG, "startResendCooldown called")
- timeRemaining = 30
- binding.tvResendOtp.isEnabled = false
- binding.tvResendOtp.setTextColor(ContextCompat.getColor(requireContext(), R.color.soft_gray))
-
- countDownTimer?.cancel()
- countDownTimer = object : CountDownTimer(30000, 1000) {
- override fun onTick(millisUntilFinished: Long) {
- timeRemaining = (millisUntilFinished / 1000).toInt()
- binding.tvTimer.text = "Kirim ulang OTP dalam waktu 00:${String.format("%02d", timeRemaining)}"
- if (timeRemaining % 5 == 0) {
- Log.d(TAG, "Cooldown remaining: $timeRemaining seconds")
- }
- }
-
- override fun onFinish() {
- Log.d(TAG, "Cooldown finished, enabling resend button")
- binding.tvTimer.text = "Dapat mengirim ulang kode OTP"
- binding.tvResendOtp.isEnabled = true
- binding.tvResendOtp.setTextColor(ContextCompat.getColor(requireContext(), R.color.blue1))
- timeRemaining = 0
- }
- }.start()
- }
-
private fun observeRegistrationState() {
registerViewModel.message.observe(viewLifecycleOwner) { message ->
Log.d(TAG, "Message from server: $message")
- // You can use the message here if needed, e.g., for showing in a specific UI element
- // or for storing for later use
}
registerViewModel.registerState.observe(viewLifecycleOwner) { result ->
when (result) {
@@ -314,9 +300,117 @@ class RegisterStep2Fragment : Fragment() {
}
- override fun onDestroyView() {
- super.onDestroyView()
+ private fun startResendCooldown() {
+ Log.d(TAG, "startResendCooldown called")
+
+ // Cancel any existing timer first
+ stopTimer()
+
+ timeRemaining = 30
+ isTimerRunning = true
+ binding.tvResendOtp.isEnabled = false
+ binding.tvResendOtp.setTextColor(ContextCompat.getColor(requireContext(), R.color.soft_gray))
+
+ countDownTimer = object : CountDownTimer(30000, 1000) {
+ override fun onTick(millisUntilFinished: Long) {
+ if (!isTimerRunning) {
+ cancel()
+ return
+ }
+
+ timeRemaining = (millisUntilFinished / 1000).toInt()
+
+ // Check if fragment is still attached before updating UI
+ if (isAdded && _binding != null) {
+ binding.tvTimer.text = "Kirim ulang OTP dalam waktu 00:${String.format("%02d", timeRemaining)}"
+ if (timeRemaining % 5 == 0) {
+ Log.d(TAG, "Cooldown remaining: $timeRemaining seconds")
+ }
+ }
+ }
+
+ override fun onFinish() {
+ if (!isTimerRunning) return
+
+ Log.d(TAG, "Cooldown finished, enabling resend button")
+
+ // Check if fragment is still attached before updating UI
+ if (isAdded && _binding != null) {
+ binding.tvTimer.text = "Dapat mengirim ulang kode OTP"
+ binding.tvResendOtp.isEnabled = true
+ binding.tvResendOtp.setTextColor(ContextCompat.getColor(requireContext(), R.color.blue1))
+ timeRemaining = 0
+ }
+ isTimerRunning = false
+ }
+ }.start()
+ }
+
+ private fun stopTimer() {
+ Log.d(TAG, "stopTimer called")
+ isTimerRunning = false
countDownTimer?.cancel()
+ countDownTimer = null
+ }
+
+
+ override fun onPause() {
+ super.onPause()
+ Log.d(TAG, "onPause - stopping timer")
+ stopTimer()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ Log.d(TAG, "onStop - stopping timer")
+ stopTimer()
+ }
+
+ override fun onDestroyView() {
+ Log.d(TAG, "onDestroyView - cleaning up")
+ super.onDestroyView()
+
+ // Ensure timer is stopped
+ stopTimer()
+
_binding = null
}
-}
\ No newline at end of file
+
+ override fun onDetach() {
+ super.onDetach()
+ Log.d(TAG, "onDetach - final cleanup")
+ stopTimer()
+ }
+}
+
+// override fun onDestroyView() {
+// super.onDestroyView()
+// countDownTimer?.cancel()
+// _binding = null
+// }
+
+// private fun startResendCooldown() {
+// Log.d(TAG, "startResendCooldown called")
+// timeRemaining = 30
+// binding.tvResendOtp.isEnabled = false
+// binding.tvResendOtp.setTextColor(ContextCompat.getColor(requireContext(), R.color.soft_gray))
+//
+// countDownTimer?.cancel()
+// countDownTimer = object : CountDownTimer(30000, 1000) {
+// override fun onTick(millisUntilFinished: Long) {
+// timeRemaining = (millisUntilFinished / 1000).toInt()
+// binding.tvTimer.text = "Kirim ulang OTP dalam waktu 00:${String.format("%02d", timeRemaining)}"
+// if (timeRemaining % 5 == 0) {
+// Log.d(TAG, "Cooldown remaining: $timeRemaining seconds")
+// }
+// }
+//
+// override fun onFinish() {
+// Log.d(TAG, "Cooldown finished, enabling resend button")
+// binding.tvTimer.text = "Dapat mengirim ulang kode OTP"
+// binding.tvResendOtp.isEnabled = true
+// binding.tvResendOtp.setTextColor(ContextCompat.getColor(requireContext(), R.color.blue1))
+// timeRemaining = 0
+// }
+// }.start()
+// }
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeFragment.kt
index 8bbfbf4..b83c4a2 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeFragment.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeFragment.kt
@@ -6,6 +6,7 @@ import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.Toast
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
@@ -140,12 +141,12 @@ class HomeFragment : Fragment() {
viewModel.uiState.collect { state ->
when (state) {
is HomeUiState.Loading -> {
- binding.loading.root.isVisible = true
+ binding.loadingAll.visibility = View.VISIBLE
binding.error.root.isVisible = false
binding.home.isVisible = false
}
is HomeUiState.Success -> {
- binding.loading.root.isVisible = false
+ binding.loadingAll.visibility = View.GONE
binding.error.root.isVisible = false
binding.home.isVisible = true
val products = state.products
@@ -154,10 +155,12 @@ class HomeFragment : Fragment() {
productAdapter?.updateLimitedProducts(products)
}
is HomeUiState.Error -> {
- binding.loading.root.isVisible = false
+ binding.loadingAll.visibility = View.GONE
binding.error.root.isVisible = true
binding.home.isVisible = false
- binding.error.errorMessage.text = state.message
+// binding.error.errorMessage.text = state.message
+ Log.e("HomeFragment", "Error load data: ${state.message}")
+ Toast.makeText(requireContext(), "Terjadi kendala. Muat ulang halaman", Toast.LENGTH_SHORT) .show()
binding.error.retryButton.setOnClickListener {
viewModel.retry()
}
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt
index 42069e5..6fb2b5a 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt
@@ -90,6 +90,8 @@ class DetailProfileActivity : AppCompatActivity() {
Log.e("DetailProfileActivity", "Error from ViewModel: $error")
Toast.makeText(this, error, Toast.LENGTH_SHORT).show()
}
+
+
}
private fun setupClickListeners() {
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt
index b515046..0c669d8 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt
@@ -222,4 +222,11 @@ class ProfileFragment : Fragment() {
}
}
+ override fun onResume() {
+ super.onResume()
+ viewModel.loadUserProfile()
+ viewModel.checkStoreUser()
+ }
+
+
}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/editprofile/EditProfileCustActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/editprofile/EditProfileCustActivity.kt
index 1b17534..2b1284f 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/editprofile/EditProfileCustActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/editprofile/EditProfileCustActivity.kt
@@ -2,6 +2,7 @@ package com.alya.ecommerce_serang.ui.profile.editprofile
import android.Manifest
import android.app.Activity
+import android.app.AlertDialog
import android.app.DatePickerDialog
import android.content.Intent
import android.content.pm.PackageManager
@@ -24,7 +25,6 @@ import com.alya.ecommerce_serang.BuildConfig.BASE_URL
import com.alya.ecommerce_serang.R
import com.alya.ecommerce_serang.data.api.dto.UserProfile
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
-import com.alya.ecommerce_serang.data.api.retrofit.ApiService
import com.alya.ecommerce_serang.data.repository.Result
import com.alya.ecommerce_serang.data.repository.UserRepository
import com.alya.ecommerce_serang.databinding.ActivityEditProfileCustBinding
@@ -33,7 +33,6 @@ import com.alya.ecommerce_serang.utils.SessionManager
import com.alya.ecommerce_serang.utils.viewmodel.ProfileViewModel
import com.bumptech.glide.Glide
import com.google.gson.Gson
-import java.io.File
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
@@ -41,9 +40,9 @@ import java.util.TimeZone
class EditProfileCustActivity : AppCompatActivity() {
private lateinit var binding: ActivityEditProfileCustBinding
- private lateinit var apiService: ApiService
private lateinit var sessionManager: SessionManager
private var selectedImageUri: Uri? = null
+ private var currentUser: UserProfile? = null
private val viewModel: ProfileViewModel by viewModels {
BaseViewModelFactory {
@@ -54,7 +53,7 @@ class EditProfileCustActivity : AppCompatActivity() {
}
private val getContent = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
- if (result.resultCode == Activity.RESULT_OK) {
+ if (result.resultCode == RESULT_OK) {
val data: Intent? = result.data
data?.data?.let {
selectedImageUri = it
@@ -105,8 +104,8 @@ class EditProfileCustActivity : AppCompatActivity() {
}
userProfile?.let {
+ currentUser = it
populateFields(it)
-
setupClickListeners()
observeViewModel()
}
@@ -118,7 +117,7 @@ class EditProfileCustActivity : AppCompatActivity() {
binding.etNumberPhoneUser.setText(profile.phone)
// Format birth date for display
- profile.birthDate?.let {
+ profile.birthDate.let {
binding.etDateBirth.setText(formatDate(it))
}
@@ -156,7 +155,7 @@ class EditProfileCustActivity : AppCompatActivity() {
}
binding.btnSave.setOnClickListener {
- saveProfile()
+ if (hasChanged()) confirmUpdate() else finish()
}
}
@@ -213,25 +212,38 @@ class EditProfileCustActivity : AppCompatActivity() {
datePickerDialog.show()
}
+ private fun confirmUpdate() {
+ AlertDialog.Builder(this)
+ .setTitle("Konfirmasi Perubahan")
+ .setMessage("Apakah Anda yakin ingin menyimpan perubahan profil toko Anda?")
+ .setPositiveButton("Ya") { _, _ -> saveProfile() }
+ .setNegativeButton("Batal", null)
+ .show()
+ }
+
+ private fun hasChanged(): Boolean {
+ val name = binding.etNameUser.text.toString() != currentUser?.name
+ val username = binding.etUsername.text.toString() != currentUser?.username
+ val email = binding.etEmailUser.text.toString() != currentUser?.email
+ val phone = binding.etNumberPhoneUser.text.toString() != currentUser?.phone
+ val displayDate = binding.etDateBirth.text.toString() != currentUser?.birthDate.toString()
+ val imgProfile = selectedImageUri != null
+ return name || username || email || phone || displayDate || imgProfile
+ }
+
private fun saveProfile() {
val name = binding.etNameUser.text.toString()
val username = binding.etUsername.text.toString()
val email = binding.etEmailUser.text.toString()
val phone = binding.etNumberPhoneUser.text.toString()
val displayDate = binding.etDateBirth.text.toString()
+ val imgProfile = selectedImageUri
- if (name.isEmpty() || username.isEmpty() || email.isEmpty() || phone.isEmpty() || displayDate.isEmpty()) {
- Toast.makeText(this, "Semua field harus diisi", Toast.LENGTH_SHORT).show()
- return
- }
-
- // Convert date to server format
val serverBirthDate = convertToServerDateFormat(displayDate)
Log.d(TAG, "Starting profile save with direct method")
Log.d(TAG, "Selected image URI: $selectedImageUri")
- // Disable the button to prevent multiple clicks
binding.btnSave.isEnabled = false
// Call the repository method via ViewModel
@@ -242,82 +254,10 @@ class EditProfileCustActivity : AppCompatActivity() {
phone = phone,
birthDate = serverBirthDate,
email = email,
- imageUri = selectedImageUri
+ imageUri = imgProfile
)
}
- private fun getRealPathFromURI(uri: Uri): String? {
- Log.d(TAG, "Getting real path from URI: $uri")
-
- // Handle different URI schemes
- when {
- // File URI
- uri.scheme == "file" -> {
- val path = uri.path
- Log.d(TAG, "URI is file scheme, path: $path")
- return path
- }
-
- // Content URI
- uri.scheme == "content" -> {
- try {
- val projection = arrayOf(MediaStore.Images.Media.DATA)
- contentResolver.query(uri, projection, null, null, null)?.use { cursor ->
- if (cursor.moveToFirst()) {
- val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
- val path = cursor.getString(columnIndex)
- Log.d(TAG, "Found path from content URI: $path")
- return path
- } else {
- Log.e(TAG, "Cursor is empty")
- }
- } ?: Log.e(TAG, "Cursor is null")
-
- // If the above fails, try the documented API way
- contentResolver.openInputStream(uri)?.use { inputStream ->
- // Create a temp file
- val fileName = getFileName(uri) ?: "temp_img_${System.currentTimeMillis()}.jpg"
- val tempFile = File(cacheDir, fileName)
- tempFile.outputStream().use { outputStream ->
- inputStream.copyTo(outputStream)
- }
- Log.d(TAG, "Created temporary file: ${tempFile.absolutePath}")
- return tempFile.absolutePath
- }
- } catch (e: Exception) {
- Log.e(TAG, "Error getting real path: ${e.message}", e)
- }
- }
- }
-
- Log.e(TAG, "Could not get real path for URI: $uri")
- return null
- }
-
- private fun getFileName(uri: Uri): String? {
- var result: String? = null
- if (uri.scheme == "content") {
- contentResolver.query(uri, null, null, null, null)?.use { cursor ->
- if (cursor.moveToFirst()) {
- val columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME)
- if (columnIndex >= 0) {
- result = cursor.getString(columnIndex)
- Log.d(TAG, "Found filename from content URI: $result")
- }
- }
- }
- }
- if (result == null) {
- result = uri.path
- val cut = result?.lastIndexOf('/') ?: -1
- if (cut != -1) {
- result = result?.substring(cut + 1)
- }
- Log.d(TAG, "Extracted filename from path: $result")
- }
- return result
- }
-
private fun formatDate(dateString: String?): String {
if (dateString.isNullOrEmpty()) return "N/A"
diff --git a/app/src/main/res/drawable/baseline_account_circle_100.xml b/app/src/main/res/drawable/baseline_account_circle_100.xml
new file mode 100644
index 0000000..015a0e2
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_account_circle_100.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/bg_button_active.xml b/app/src/main/res/drawable/bg_button_active.xml
index ef9d73a..8332ec4 100644
--- a/app/src/main/res/drawable/bg_button_active.xml
+++ b/app/src/main/res/drawable/bg_button_active.xml
@@ -3,6 +3,6 @@
android:shape="rectangle">
-
+
diff --git a/app/src/main/res/layout/activity_detail_profile.xml b/app/src/main/res/layout/activity_detail_profile.xml
index 84023ee..bcba7d8 100644
--- a/app/src/main/res/layout/activity_detail_profile.xml
+++ b/app/src/main/res/layout/activity_detail_profile.xml
@@ -62,7 +62,7 @@
android:id="@+id/profile_image"
android:layout_width="100dp"
android:layout_height="100dp"
- android:src="@drawable/baseline_account_circle_24"
+ android:src="@drawable/baseline_account_circle_100"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
@@ -87,6 +87,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ubah Profil"
+ style="@style/button.large.active.medium"
android:layout_marginTop="16dp"
app:layout_constraintTop_toBottomOf="@id/profile_image"
app:layout_constraintStart_toStartOf="parent"
diff --git a/app/src/main/res/layout/activity_edit_profile_cust.xml b/app/src/main/res/layout/activity_edit_profile_cust.xml
index ca3cde3..1b7cb50 100644
--- a/app/src/main/res/layout/activity_edit_profile_cust.xml
+++ b/app/src/main/res/layout/activity_edit_profile_cust.xml
@@ -61,7 +61,7 @@
android:id="@+id/profile_image"
android:layout_width="100dp"
android:layout_height="100dp"
- android:src="@drawable/baseline_account_circle_24"
+ android:src="@drawable/baseline_account_circle_100"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
@@ -188,6 +188,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Simpan"
+ style="@style/button.large.active.medium"
android:layout_marginTop="32dp"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 516685d..e8641c4 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -167,9 +167,15 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/searchContainer" />
-
+
diff --git a/app/src/main/res/layout/view_error.xml b/app/src/main/res/layout/view_error.xml
index 971a5e9..7023bee 100644
--- a/app/src/main/res/layout/view_error.xml
+++ b/app/src/main/res/layout/view_error.xml
@@ -22,7 +22,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
- android:text="Retry"
+ android:text="Muat Ulang"
+ style="@style/Widget.Material3.FloatingActionButton.Large.Surface"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/app/src/main/res/layout/view_loading.xml b/app/src/main/res/layout/view_loading.xml
index 1e763bf..d2e77cb 100644
--- a/app/src/main/res/layout/view_loading.xml
+++ b/app/src/main/res/layout/view_loading.xml
@@ -6,11 +6,10 @@
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index adeeaac..c0a2cc1 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -269,7 +269,7 @@