From c8b695332d5de655a4ed9aabdc444ef554344b6b Mon Sep 17 00:00:00 2001 From: Aryankc2 Date: Thu, 8 May 2025 14:35:06 +0530 Subject: [PATCH] bye --- .../data/models/responses/UserData.kt | 2 +- .../fieldagent/ui/addsite/AddSiteFragment.kt | 8 +- .../ui/damagedetails/DamageDetailsFragment.kt | 133 ++++++-- .../fieldagent/ui/homescreen/HomeFragment.kt | 2 + .../fieldagent/ui/login/LoginActivity.kt | 37 ++- .../fieldagent/ui/profile/ProfileFragment.kt | 160 +++++++++- .../main/res/drawable/bg_button_disabled.xml | 5 + .../main/res/drawable/bg_button_enabled.xml | 5 + app/src/main/res/drawable/eye_close.xml | 48 +++ app/src/main/res/drawable/eye_icon.xml | 12 + app/src/main/res/layout/activity_login.xml | 291 ++++++++++-------- .../main/res/layout/damage_view_adapter.xml | 35 ++- .../res/layout/dialog_full_screen_image.xml | 51 ++- app/src/main/res/layout/fragment_profile.xml | 38 ++- app/src/main/res/values-ar/strings.xml | 5 + app/src/main/res/values/strings.xml | 5 + 16 files changed, 632 insertions(+), 205 deletions(-) create mode 100644 app/src/main/res/drawable/bg_button_disabled.xml create mode 100644 app/src/main/res/drawable/bg_button_enabled.xml create mode 100644 app/src/main/res/drawable/eye_close.xml create mode 100644 app/src/main/res/drawable/eye_icon.xml diff --git a/app/src/main/java/com/example/fieldagent/data/models/responses/UserData.kt b/app/src/main/java/com/example/fieldagent/data/models/responses/UserData.kt index 7bea051..e3ed04d 100644 --- a/app/src/main/java/com/example/fieldagent/data/models/responses/UserData.kt +++ b/app/src/main/java/com/example/fieldagent/data/models/responses/UserData.kt @@ -12,7 +12,7 @@ data class UserData ( data class Data ( val id: Long? = null, - val name: String? = null, + var name: String? = null, val email: String? = null, @SerializedName("phone_number") diff --git a/app/src/main/java/com/example/fieldagent/ui/addsite/AddSiteFragment.kt b/app/src/main/java/com/example/fieldagent/ui/addsite/AddSiteFragment.kt index e0d3040..d196cfd 100644 --- a/app/src/main/java/com/example/fieldagent/ui/addsite/AddSiteFragment.kt +++ b/app/src/main/java/com/example/fieldagent/ui/addsite/AddSiteFragment.kt @@ -157,13 +157,11 @@ class AddSiteFragment : Fragment() { if (imageUri != null) { binding.llUploadImage.gone() binding.cardImage.visible() - binding.ivSetImage.setImageURI(imageUri) + Glide.with(this).load(imageUri).into(binding.ivSetImage) binding.ivCloseImage.visible() - } else { - Toast.makeText(requireContext(), "Image URI is null", Toast.LENGTH_SHORT).show() + + fileToUpload=uriToFile(imageUri!!,requireActivity()); } - } else { - Toast.makeText(requireContext(), "Failed to capture image", Toast.LENGTH_SHORT).show() } } diff --git a/app/src/main/java/com/example/fieldagent/ui/damagedetails/DamageDetailsFragment.kt b/app/src/main/java/com/example/fieldagent/ui/damagedetails/DamageDetailsFragment.kt index 8aaf820..8230089 100644 --- a/app/src/main/java/com/example/fieldagent/ui/damagedetails/DamageDetailsFragment.kt +++ b/app/src/main/java/com/example/fieldagent/ui/damagedetails/DamageDetailsFragment.kt @@ -23,6 +23,7 @@ import androidx.core.content.FileProvider import androidx.core.net.toUri import androidx.fragment.app.viewModels import androidx.lifecycle.Observer +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import com.consultantapp.data.network.responseUtil.Status @@ -45,6 +46,8 @@ import com.example.fieldagent.utils.uriToFile import com.example.fieldagent.utils.visible import com.google.gson.Gson import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import okhttp3.MediaType.Companion.toMediaType import okhttp3.MultipartBody import okhttp3.RequestBody @@ -91,6 +94,7 @@ class DamageDetailsFragment : Fragment() { private var from="add"; private var clickPosition=-1; private var damageId:String=""; + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -99,6 +103,46 @@ class DamageDetailsFragment : Fragment() { return binding.root } + /* override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putString("etItemValue", binding.etItemValue.text.toString()) + outState.putString("etItemQuantity", binding.etItemQuantity.text.toString()) + outState.putString("autoCompleteMain", binding.autoCompleteMain.text.toString()) + outState.putString("autoCompleteSub", binding.autoCompleteSub.text.toString()) + outState.putString("autoCompleteUnits", binding.autoCompleteUnits.text.toString()) + Log.e("Checkkkkkkkskksks=2=>","${binding.autoCompleteSub.text.toString()}") + val positionToReplace = imageList.indexOfFirst { it == null } + if (positionToReplace != -1) { + imageList[positionToReplace] = imageUri.toString() + } + outState.putStringArrayList("imageList", imageList.filterNotNull() as ArrayList) + } + + override fun onViewStateRestored(savedInstanceState: Bundle?) { + super.onViewStateRestored(savedInstanceState) + Log.e("Checkkkkkkkskksks=1=>","ssss") + if (savedInstanceState == null) return + Log.e("Checkkkkkkkskksks=1=>","ssss3333") + binding.etItemValue.setText(savedInstanceState.getString("etItemValue", "")) + binding.etItemQuantity.setText(savedInstanceState.getString("etItemQuantity", "")) + binding.autoCompleteMain.setText(savedInstanceState.getString("autoCompleteMain", ""), false) + binding.autoCompleteSub.setText(savedInstanceState.getString("autoCompleteSub", ""), false) + binding.autoCompleteUnits.setText(savedInstanceState.getString("autoCompleteUnits", ""), false) + Log.e("Checkkkkkkkskksks=1=>","sss555s") + + val restoredImageList = savedInstanceState.getStringArrayList("imageList") + if (restoredImageList != null) { + imageList.clear() + imageList.addAll(restoredImageList) + while (imageList.size < 5) { + imageList.add(null) // fill up to 5 slots + } + + adapter.notifyDataSetChanged() + + } + }*/ + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -120,32 +164,36 @@ class DamageDetailsFragment : Fragment() { inspectionId = arguments?.getString("id").toString() viewModel.getCategoryList() }else{ - from="edit" - val jsonString = arguments?.getString("damageData") - val damageData = Gson().fromJson(jsonString, Damage::class.java) - inspectionId = arguments?.getString("id").toString() - viewModel.getCategoryList() - Log.e("CheckkkkDama==>","${damageData}") - binding.etItemValue.setText(damageData.itemValue.toString()) - binding.etItemValue.setSelection(damageData.itemValue.toString().length) - binding.etItemQuantity.setText(damageData.itemQuantity.toString()) - binding.autoCompleteMain.setText(damageData.categoryName,false) - damageId=damageData.id.toString() - if(damageData.images!=null) - { - if(damageData.images.isNotEmpty()) + from="edit" + val jsonString = arguments?.getString("damageData") + val damageData = Gson().fromJson(jsonString, Damage::class.java) + inspectionId = arguments?.getString("id").toString() + viewModel.getCategoryList() + + + binding.etItemValue.setText("SAR "+damageData.itemValue.toString()) + binding.etItemValue.setSelection(damageData.itemValue.toString().length) + binding.etItemQuantity.setText(damageData.itemQuantity.toString()) + binding.autoCompleteMain.setText(damageData.categoryName,false) + damageId=damageData.id.toString() + if(damageData.images!=null) { + if(damageData.images.isNotEmpty()) + { - for ((index, item) in damageData.images.withIndex()) { + for ((index, item) in damageData.images.withIndex()) { - imageList.add(IMAGE_BASE_URL +item) + imageList.add(IMAGE_BASE_URL +item) + } } } - } - val hashMap = HashMap() - hashMap["id"] = damageData.categoryID.toString() - viewModel.getSelectCategoryList(hashMap) + val hashMap = HashMap() + hashMap["id"] = damageData.categoryID.toString() + viewModel.getSelectCategoryList(hashMap) + + + } } @@ -201,7 +249,45 @@ class DamageDetailsFragment : Fragment() { } } - galleryLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> + + galleryLauncher = registerForActivityResult(ActivityResultContracts.GetMultipleContents()) { uris -> + uris.let { + try { + if (it.size + imageList.filterNotNull().size > 5) { + + val getCount=imageList.filterNotNull().size - 5 + + if(getCount==1) + { + Toast.makeText(requireContext(), getString(R.string.select_upto_one_images), Toast.LENGTH_SHORT).show() + }else{ + Toast.makeText(requireContext(), getString(R.string.select_upto_five_images,getCount), Toast.LENGTH_SHORT).show() + } + + } else { + for (uri in it) { + val positionToReplace = imageList.indexOfFirst { it == null } + if (positionToReplace != -1) { + imageList[positionToReplace] = uri.toString() + adapter.notifyItemChanged(positionToReplace) + } else { + + imageList.add(uri.toString()) + adapter.notifyItemInserted(imageList.size - 1) + } + } + } + + val currentFocus = requireActivity().currentFocus + currentFocus?.clearFocus() + } catch (e: Exception) { + e.printStackTrace() // Handle exceptions properly + } + } + } + + + /* galleryLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> uri?.let { try { @@ -224,7 +310,7 @@ class DamageDetailsFragment : Fragment() { } - } + }*/ binding.etItemValue.addTextChangedListener(object : TextWatcher { private var isEditing = false @@ -429,8 +515,11 @@ class DamageDetailsFragment : Fragment() { binding.autoCompleteUnits.setText(subCategoryList[0].unit, false) selectSubId=subCategoryList[0].id.toString() }else{ + binding.autoCompleteSub.setText("", false) + binding.autoCompleteUnits.setText("", false) binding.llUnits.gone() binding.llSubItem.gone() + } diff --git a/app/src/main/java/com/example/fieldagent/ui/homescreen/HomeFragment.kt b/app/src/main/java/com/example/fieldagent/ui/homescreen/HomeFragment.kt index 5324357..4600c8e 100644 --- a/app/src/main/java/com/example/fieldagent/ui/homescreen/HomeFragment.kt +++ b/app/src/main/java/com/example/fieldagent/ui/homescreen/HomeFragment.kt @@ -195,6 +195,8 @@ class HomeFragment : Fragment() { popupView.txtAll.setOnClickListener { refreshPagination() + click="" + selectStatus="" binding.txtStatusShow.gone() val hashMap = HashMap() hashMap[LIMIT_TEXT] = PER_PAGE_LOAD diff --git a/app/src/main/java/com/example/fieldagent/ui/login/LoginActivity.kt b/app/src/main/java/com/example/fieldagent/ui/login/LoginActivity.kt index c29c4e7..ac5394b 100644 --- a/app/src/main/java/com/example/fieldagent/ui/login/LoginActivity.kt +++ b/app/src/main/java/com/example/fieldagent/ui/login/LoginActivity.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.content.Intent import android.content.res.Resources import android.os.Bundle +import android.text.InputType import android.util.Log import android.util.Patterns import android.view.Gravity @@ -19,6 +20,7 @@ import com.example.fieldagent.data.network.ApisRespHandler import com.example.fieldagent.databinding.ActivityLoginBinding import com.example.fieldagent.ui.homescreen.HomeActivity import androidx.lifecycle.Observer +import com.example.fieldagent.data.network.responseUtil.AppError import com.example.fieldagent.utils.PrefsManager import com.example.fieldagent.utils.REFRESH_TOKEN import com.example.fieldagent.utils.TOKEN @@ -40,6 +42,7 @@ class LoginActivity : AppCompatActivity() { lateinit var prefsManager: PrefsManager private val viewModel: LoginViewModel by viewModels() private lateinit var progressDialog: ProgressDialog + private var isPasswordVisible = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityLoginBinding.inflate(layoutInflater) @@ -70,6 +73,21 @@ class LoginActivity : AppCompatActivity() { } private fun listeners(){ + + + binding.tilPassword.setEndIconOnClickListener { + isPasswordVisible = !isPasswordVisible + + if (isPasswordVisible) { + binding.etPassword.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + binding.tilPassword.setEndIconDrawable(R.drawable.eye_icon) // Your open eye icon + } else { + binding.etPassword.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + binding.tilPassword.setEndIconDrawable(R.drawable.eye_close) // Your closed eye icon + } + + binding.etPassword.setSelection(binding.etPassword.text?.length ?: 0) + } binding.btnSigIn.setOnClickListener { @@ -118,7 +136,23 @@ class LoginActivity : AppCompatActivity() { } Status.ERROR -> { progressDialog.setLoading(false) - ApisRespHandler.handleError(it.error,this) + + + val error = it.error + if (error is AppError.ApiError) { + + binding.etPassword.showSnackBar(error.message) + } else if (error is AppError.ApiFailure) { + if (error.message.contains("Failed to connect to",true) || + error.message.contains("Unable to resolve host",true) || + error.message.contains("No address associated with hostname",true)) + binding.etPassword.showSnackBar(getString(R.string.check_internet)) + else + binding.etPassword.showSnackBar(error.message) + + } else { + binding.etPassword.showSnackBar(getString(R.string.check_internet)) + } } Status.LOADING -> { progressDialog.setLoading(true) @@ -126,4 +160,5 @@ class LoginActivity : AppCompatActivity() { } }) } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/fieldagent/ui/profile/ProfileFragment.kt b/app/src/main/java/com/example/fieldagent/ui/profile/ProfileFragment.kt index a09dda9..6e2f27f 100644 --- a/app/src/main/java/com/example/fieldagent/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/com/example/fieldagent/ui/profile/ProfileFragment.kt @@ -4,7 +4,10 @@ import android.app.AlertDialog import android.content.Intent import android.content.res.Resources import android.os.Bundle +import android.text.Editable +import android.text.InputType import android.text.TextUtils +import android.text.TextWatcher import android.util.Log import android.view.Gravity import androidx.fragment.app.Fragment @@ -54,6 +57,10 @@ class ProfileFragment : Fragment() { private lateinit var progressDialog: ProgressDialog private var userId=""; + private var userName=""; + private var isPasswordVisible = false + private var isConfirmPasswordVisible = false + private var isClickName = false override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -79,6 +86,7 @@ class ProfileFragment : Fragment() { userId=userData.id.toString() binding.etName.setText(userData.name) + userName=userData.name.toString() binding.etEmail.setText(userData.email) binding.etPhone.setText(userData.phoneNumber) @@ -100,6 +108,7 @@ class ProfileFragment : Fragment() { binding.etConfirmPassword.gravity = Gravity.START } + } @@ -121,15 +130,125 @@ class ProfileFragment : Fragment() { } - binding.btnAdd.setOnClickListener { + binding.etName.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + val newName = s.toString() + + + if (newName.isNotEmpty() && newName != userName) { + binding.btnName.isEnabled = true + + } else { + binding.btnName.isEnabled = false + + } + } + + override fun afterTextChanged(s: Editable?) {} + }) + + + + + binding.tilPassword.setEndIconOnClickListener { + isPasswordVisible = !isPasswordVisible + + if (isPasswordVisible) { + binding.etPassword.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + binding.tilPassword.setEndIconDrawable(R.drawable.eye_icon) // Your open eye icon + } else { + binding.etPassword.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + binding.tilPassword.setEndIconDrawable(R.drawable.eye_close) // Your closed eye icon + } + + binding.etPassword.setSelection(binding.etPassword.text?.length ?: 0) + } + + binding.tilConfirmPassword.setEndIconOnClickListener { + isConfirmPasswordVisible = !isConfirmPasswordVisible + + if (isConfirmPasswordVisible) { + binding.etPassword.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + binding.tilConfirmPassword.setEndIconDrawable(R.drawable.eye_icon) // Your open eye icon + } else { + binding.etPassword.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + binding.tilConfirmPassword.setEndIconDrawable(R.drawable.eye_close) // Your closed eye icon + } + + binding.etConfirmPassword.setSelection(binding.etConfirmPassword.text?.length ?: 0) + } + + + val watcher = object : TextWatcher { + override fun afterTextChanged(s: Editable?) { + val password = binding.etPassword.text.toString() + val confirmPassword = binding.etConfirmPassword.text.toString() + + val isValid = password.isNotEmpty() && + confirmPassword.isNotEmpty() && + password == confirmPassword + + binding.btnPassword.isEnabled = isValid + binding.btnPassword.setBackgroundResource( + if (isValid) R.drawable.bg_button_enabled + else R.drawable.bg_button_disabled + ) + } + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + } + + binding.etPassword.addTextChangedListener(watcher) + binding.etConfirmPassword.addTextChangedListener(watcher) + + + + + + binding.btnName.setOnClickListener { + + if(!binding.btnName.isEnabled) return@setOnClickListener + when{ + isConnectedToInternet(requireActivity(), true) -> { + isClickName=true; + val hashMap = HashMap() + hashMap["name"] = binding.etName.text.toString() + viewModel.updateProfile(userId,hashMap) + + } + } + } + binding.btnPassword.setOnClickListener { + + if(!binding.btnPassword.isEnabled) return@setOnClickListener + when{ + isConnectedToInternet(requireActivity(), true) -> { + isClickName=false + val hashMap = HashMap() + if (binding.etPassword.text.toString().isNotEmpty()) + { + hashMap["password"] = binding.etPassword.text.toString() + } + + + viewModel.updateProfile(userId,hashMap) + + } + } + } + + /* binding.btnAdd.setOnClickListener { when{ binding.etName.text.isEmpty()->{ binding.etName.showSnackBar(getString(R.string.please_enter_agent_name)) } - /*binding.etPassword.text.toString().isEmpty()->{ + *//*binding.etPassword.text.toString().isEmpty()->{ binding.etPassword.showSnackBar(getString(R.string.please_enter_password)) - }*/ + }*//* binding.etPassword.text.toString().isNotEmpty() && !binding.etPassword.text.toString().matches(Regex("^(?=.*[A-Z])(?=.*\\d)(?=.*[@#\$%^&+=!]).{6,}$"))->{ binding.etPassword.showSnackBar(getString(R.string.please_enter_valid_password)) @@ -155,7 +274,7 @@ class ProfileFragment : Fragment() { } - } + }*/ } @@ -166,16 +285,39 @@ class ProfileFragment : Fragment() { Status.SUCCESS -> { progressDialog.setLoading(false) - requireContext().showUpdateDialog( + if(isClickName) + { + val jsonString = prefsManager.getString(USER_DATA, "") + val userDataCheck = Gson().fromJson(jsonString, Data::class.java) + + + userDataCheck.name = binding.etName.text.toString() + + val updatedUserDataJson = Gson().toJson(userDataCheck) + prefsManager.saveString(USER_DATA, updatedUserDataJson) + userName=binding.etName.text.toString() + + binding.btnName.isEnabled = false + requireContext().showUpdateDialog( title = getString(R.string.profile_updated_successfully) ) { - prefsManager.removeAll() - val intent = Intent(requireContext(), LoginActivity::class.java) - intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK - startActivity(intent) } + }else{ + requireContext().showUpdateDialog( + title = getString(R.string.password_updated_successfully) + ) { + prefsManager.removeAll() + + val intent = Intent(requireContext(), LoginActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK + startActivity(intent) + } + } + + + } Status.ERROR -> { progressDialog.setLoading(false) diff --git a/app/src/main/res/drawable/bg_button_disabled.xml b/app/src/main/res/drawable/bg_button_disabled.xml new file mode 100644 index 0000000..8afcaae --- /dev/null +++ b/app/src/main/res/drawable/bg_button_disabled.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_enabled.xml b/app/src/main/res/drawable/bg_button_enabled.xml new file mode 100644 index 0000000..1bbbe5e --- /dev/null +++ b/app/src/main/res/drawable/bg_button_enabled.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/eye_close.xml b/app/src/main/res/drawable/eye_close.xml new file mode 100644 index 0000000..52e18db --- /dev/null +++ b/app/src/main/res/drawable/eye_close.xml @@ -0,0 +1,48 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/eye_icon.xml b/app/src/main/res/drawable/eye_icon.xml new file mode 100644 index 0000000..87e6d81 --- /dev/null +++ b/app/src/main/res/drawable/eye_icon.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 8b66f36..f80d47f 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -1,153 +1,172 @@ - + android:layout_height="match_parent"> + - - - - - - - - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/txtSignIn" - android:layout_marginTop="@dimen/dp_8" - /> - - - - - - - + + + + + + + - -