This commit is contained in:
Aryankc2 2025-05-08 14:35:06 +05:30
parent 6c2224d040
commit c8b695332d
16 changed files with 632 additions and 205 deletions

View file

@ -12,7 +12,7 @@ data class UserData (
data class Data ( data class Data (
val id: Long? = null, val id: Long? = null,
val name: String? = null, var name: String? = null,
val email: String? = null, val email: String? = null,
@SerializedName("phone_number") @SerializedName("phone_number")

View file

@ -157,13 +157,11 @@ class AddSiteFragment : Fragment() {
if (imageUri != null) { if (imageUri != null) {
binding.llUploadImage.gone() binding.llUploadImage.gone()
binding.cardImage.visible() binding.cardImage.visible()
binding.ivSetImage.setImageURI(imageUri) Glide.with(this).load(imageUri).into(binding.ivSetImage)
binding.ivCloseImage.visible() 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()
} }
} }

View file

@ -23,6 +23,7 @@ import androidx.core.content.FileProvider
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.consultantapp.data.network.responseUtil.Status 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.example.fieldagent.utils.visible
import com.google.gson.Gson import com.google.gson.Gson
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaType
import okhttp3.MultipartBody import okhttp3.MultipartBody
import okhttp3.RequestBody import okhttp3.RequestBody
@ -91,6 +94,7 @@ class DamageDetailsFragment : Fragment() {
private var from="add"; private var from="add";
private var clickPosition=-1; private var clickPosition=-1;
private var damageId:String=""; private var damageId:String="";
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
@ -99,6 +103,46 @@ class DamageDetailsFragment : Fragment() {
return binding.root 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<String>)
}
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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@ -120,14 +164,15 @@ class DamageDetailsFragment : Fragment() {
inspectionId = arguments?.getString("id").toString() inspectionId = arguments?.getString("id").toString()
viewModel.getCategoryList() viewModel.getCategoryList()
}else{ }else{
from="edit" from="edit"
val jsonString = arguments?.getString("damageData") val jsonString = arguments?.getString("damageData")
val damageData = Gson().fromJson(jsonString, Damage::class.java) val damageData = Gson().fromJson(jsonString, Damage::class.java)
inspectionId = arguments?.getString("id").toString() inspectionId = arguments?.getString("id").toString()
viewModel.getCategoryList() viewModel.getCategoryList()
Log.e("CheckkkkDama==>","${damageData}")
binding.etItemValue.setText(damageData.itemValue.toString()) binding.etItemValue.setText("SAR "+damageData.itemValue.toString())
binding.etItemValue.setSelection(damageData.itemValue.toString().length) binding.etItemValue.setSelection(damageData.itemValue.toString().length)
binding.etItemQuantity.setText(damageData.itemQuantity.toString()) binding.etItemQuantity.setText(damageData.itemQuantity.toString())
binding.autoCompleteMain.setText(damageData.categoryName,false) binding.autoCompleteMain.setText(damageData.categoryName,false)
@ -146,6 +191,9 @@ class DamageDetailsFragment : Fragment() {
val hashMap = HashMap<String, String>() val hashMap = HashMap<String, String>()
hashMap["id"] = damageData.categoryID.toString() hashMap["id"] = damageData.categoryID.toString()
viewModel.getSelectCategoryList(hashMap) 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 { uri?.let {
try { try {
@ -224,7 +310,7 @@ class DamageDetailsFragment : Fragment() {
} }
} }*/
binding.etItemValue.addTextChangedListener(object : TextWatcher { binding.etItemValue.addTextChangedListener(object : TextWatcher {
private var isEditing = false private var isEditing = false
@ -429,8 +515,11 @@ class DamageDetailsFragment : Fragment() {
binding.autoCompleteUnits.setText(subCategoryList[0].unit, false) binding.autoCompleteUnits.setText(subCategoryList[0].unit, false)
selectSubId=subCategoryList[0].id.toString() selectSubId=subCategoryList[0].id.toString()
}else{ }else{
binding.autoCompleteSub.setText("", false)
binding.autoCompleteUnits.setText("", false)
binding.llUnits.gone() binding.llUnits.gone()
binding.llSubItem.gone() binding.llSubItem.gone()
} }

View file

@ -195,6 +195,8 @@ class HomeFragment : Fragment() {
popupView.txtAll.setOnClickListener { popupView.txtAll.setOnClickListener {
refreshPagination() refreshPagination()
click=""
selectStatus=""
binding.txtStatusShow.gone() binding.txtStatusShow.gone()
val hashMap = HashMap<String, String>() val hashMap = HashMap<String, String>()
hashMap[LIMIT_TEXT] = PER_PAGE_LOAD hashMap[LIMIT_TEXT] = PER_PAGE_LOAD

View file

@ -4,6 +4,7 @@ import android.app.Activity
import android.content.Intent import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
import android.os.Bundle import android.os.Bundle
import android.text.InputType
import android.util.Log import android.util.Log
import android.util.Patterns import android.util.Patterns
import android.view.Gravity 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.databinding.ActivityLoginBinding
import com.example.fieldagent.ui.homescreen.HomeActivity import com.example.fieldagent.ui.homescreen.HomeActivity
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import com.example.fieldagent.data.network.responseUtil.AppError
import com.example.fieldagent.utils.PrefsManager import com.example.fieldagent.utils.PrefsManager
import com.example.fieldagent.utils.REFRESH_TOKEN import com.example.fieldagent.utils.REFRESH_TOKEN
import com.example.fieldagent.utils.TOKEN import com.example.fieldagent.utils.TOKEN
@ -40,6 +42,7 @@ class LoginActivity : AppCompatActivity() {
lateinit var prefsManager: PrefsManager lateinit var prefsManager: PrefsManager
private val viewModel: LoginViewModel by viewModels() private val viewModel: LoginViewModel by viewModels()
private lateinit var progressDialog: ProgressDialog private lateinit var progressDialog: ProgressDialog
private var isPasswordVisible = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater) binding = ActivityLoginBinding.inflate(layoutInflater)
@ -70,6 +73,21 @@ class LoginActivity : AppCompatActivity() {
} }
private fun listeners(){ 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 { binding.btnSigIn.setOnClickListener {
@ -118,7 +136,23 @@ class LoginActivity : AppCompatActivity() {
} }
Status.ERROR -> { Status.ERROR -> {
progressDialog.setLoading(false) 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 -> { Status.LOADING -> {
progressDialog.setLoading(true) progressDialog.setLoading(true)
@ -126,4 +160,5 @@ class LoginActivity : AppCompatActivity() {
} }
}) })
} }
} }

View file

@ -4,7 +4,10 @@ import android.app.AlertDialog
import android.content.Intent import android.content.Intent
import android.content.res.Resources import android.content.res.Resources
import android.os.Bundle import android.os.Bundle
import android.text.Editable
import android.text.InputType
import android.text.TextUtils import android.text.TextUtils
import android.text.TextWatcher
import android.util.Log import android.util.Log
import android.view.Gravity import android.view.Gravity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
@ -54,6 +57,10 @@ class ProfileFragment : Fragment() {
private lateinit var progressDialog: ProgressDialog private lateinit var progressDialog: ProgressDialog
private var userId=""; private var userId="";
private var userName="";
private var isPasswordVisible = false
private var isConfirmPasswordVisible = false
private var isClickName = false
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
@ -79,6 +86,7 @@ class ProfileFragment : Fragment() {
userId=userData.id.toString() userId=userData.id.toString()
binding.etName.setText(userData.name) binding.etName.setText(userData.name)
userName=userData.name.toString()
binding.etEmail.setText(userData.email) binding.etEmail.setText(userData.email)
binding.etPhone.setText(userData.phoneNumber) binding.etPhone.setText(userData.phoneNumber)
@ -100,6 +108,7 @@ class ProfileFragment : Fragment() {
binding.etConfirmPassword.gravity = Gravity.START 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<String, String>()
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<String, String>()
if (binding.etPassword.text.toString().isNotEmpty())
{
hashMap["password"] = binding.etPassword.text.toString()
}
viewModel.updateProfile(userId,hashMap)
}
}
}
/* binding.btnAdd.setOnClickListener {
when{ when{
binding.etName.text.isEmpty()->{ binding.etName.text.isEmpty()->{
binding.etName.showSnackBar(getString(R.string.please_enter_agent_name)) 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.showSnackBar(getString(R.string.please_enter_password))
}*/ }*//*
binding.etPassword.text.toString().isNotEmpty() && !binding.etPassword.text.toString().matches(Regex("^(?=.*[A-Z])(?=.*\\d)(?=.*[@#\$%^&+=!]).{6,}$"))->{ 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)) binding.etPassword.showSnackBar(getString(R.string.please_enter_valid_password))
@ -155,7 +274,7 @@ class ProfileFragment : Fragment() {
} }
} }*/
} }
@ -166,15 +285,38 @@ class ProfileFragment : Fragment() {
Status.SUCCESS -> { Status.SUCCESS -> {
progressDialog.setLoading(false) progressDialog.setLoading(false)
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( requireContext().showUpdateDialog(
title = getString(R.string.profile_updated_successfully) title = getString(R.string.profile_updated_successfully)
) { ) {
}
}else{
requireContext().showUpdateDialog(
title = getString(R.string.password_updated_successfully)
) {
prefsManager.removeAll() prefsManager.removeAll()
val intent = Intent(requireContext(), LoginActivity::class.java) val intent = Intent(requireContext(), LoginActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent) startActivity(intent)
} }
}
} }
Status.ERROR -> { Status.ERROR -> {

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/edit_text_color" />
<corners android:radius="8dp"/>
</shape>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/main_color" />
<corners android:radius="8dp"/>
</shape>

View file

@ -0,0 +1,48 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M14.53,9.47L9.47,14.53C8.82,13.88 8.42,12.99 8.42,12C8.42,10.02 10.02,8.42 12,8.42C12.99,8.42 13.88,8.82 14.53,9.47Z"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#8A8A8A"
android:strokeLineCap="round"/>
<path
android:pathData="M17.82,5.77C16.07,4.45 14.07,3.73 12,3.73C8.47,3.73 5.18,5.81 2.89,9.41C1.99,10.82 1.99,13.19 2.89,14.6C3.68,15.84 4.6,16.91 5.6,17.77"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#8A8A8A"
android:strokeLineCap="round"/>
<path
android:pathData="M8.42,19.53C9.56,20.01 10.77,20.27 12,20.27C15.53,20.27 18.82,18.19 21.11,14.59C22.01,13.18 22.01,10.81 21.11,9.4C20.78,8.88 20.42,8.39 20.05,7.93"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#8A8A8A"
android:strokeLineCap="round"/>
<path
android:pathData="M15.51,12.7C15.25,14.11 14.1,15.26 12.69,15.52"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#8A8A8A"
android:strokeLineCap="round"/>
<path
android:pathData="M9.47,14.53L2,22"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#8A8A8A"
android:strokeLineCap="round"/>
<path
android:pathData="M22,2L14.53,9.47"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#8A8A8A"
android:strokeLineCap="round"/>
</vector>

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,16.33C9.61,16.33 7.67,14.39 7.67,12C7.67,9.61 9.61,7.67 12,7.67C14.39,7.67 16.33,9.61 16.33,12C16.33,14.39 14.39,16.33 12,16.33ZM12,9.17C10.44,9.17 9.17,10.44 9.17,12C9.17,13.56 10.44,14.83 12,14.83C13.56,14.83 14.83,13.56 14.83,12C14.83,10.44 13.56,9.17 12,9.17Z"
android:fillColor="#8A8A8A"/>
<path
android:pathData="M12,21.02C8.24,21.02 4.69,18.82 2.25,15C1.19,13.35 1.19,10.66 2.25,9C4.7,5.18 8.25,2.98 12,2.98C15.75,2.98 19.3,5.18 21.74,9C22.8,10.65 22.8,13.34 21.74,15C19.3,18.82 15.75,21.02 12,21.02ZM12,4.48C8.77,4.48 5.68,6.42 3.52,9.81C2.77,10.98 2.77,13.02 3.52,14.19C5.68,17.58 8.77,19.52 12,19.52C15.23,19.52 18.32,17.58 20.48,14.19C21.23,13.02 21.23,10.98 20.48,9.81C18.32,6.42 15.23,4.48 12,4.48Z"
android:fillColor="#8A8A8A"/>
</vector>

View file

@ -1,10 +1,17 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:scrollbars="none"
android:background="@color/white"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/main" android:id="@+id/main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:background="@color/white" android:background="@color/white"
tools:context=".ui.login.LoginActivity"> tools:context=".ui.login.LoginActivity">
@ -106,12 +113,13 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:endIconMode="password_toggle"
android:layout_marginTop="@dimen/dp_16" android:layout_marginTop="@dimen/dp_16"
app:layout_constraintStart_toEndOf="@id/leftGuide" app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide" app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@+id/etEmail" app:layout_constraintTop_toBottomOf="@+id/etEmail"
app:endIconMode="custom"
app:endIconDrawable="@drawable/eye_close"
app:hintEnabled="false" app:hintEnabled="false"
> >
@ -119,11 +127,11 @@
android:id="@+id/etPassword" android:id="@+id/etPassword"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:inputType="textPassword"
android:textColor="@color/edit_text_color" android:textColor="@color/edit_text_color"
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
android:maxLines="1" android:maxLines="1"
android:singleLine="true" android:singleLine="true"
android:inputType="textPassword"
android:hint="@string/password" android:hint="@string/password"
android:gravity="start" android:gravity="start"
android:imeOptions="actionDone" android:imeOptions="actionDone"
@ -146,8 +154,19 @@
android:background="@drawable/rounded_background" android:background="@drawable/rounded_background"
android:textColor="#FFFFFF"/> android:textColor="#FFFFFF"/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_1"
app:layout_constraintTop_toBottomOf="@+id/btnSigIn"
android:layout_marginTop="@dimen/dp_20"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>

View file

@ -209,12 +209,17 @@
android:layout_gravity="end" android:layout_gravity="end"
android:gravity="end" android:gravity="end"
> >
<ImageView <TextView
android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_16" android:layout_width="wrap_content"
android:src="@drawable/arab" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_2" android:text="SAR"
android:layout_marginEnd="@dimen/dp_2" android:textAlignment="textEnd"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
android:layout_marginEnd="@dimen/dp_4"
/> />
<TextView <TextView
android:id="@+id/txtValue" android:id="@+id/txtValue"
@ -304,12 +309,18 @@
android:layout_gravity="end" android:layout_gravity="end"
android:gravity="end" android:gravity="end"
> >
<ImageView
android:layout_width="@dimen/dp_16" <TextView
android:layout_height="@dimen/dp_16"
android:src="@drawable/arab" android:layout_width="wrap_content"
android:layout_marginTop="@dimen/dp_4" android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_2" android:text="SAR"
android:textAlignment="textEnd"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:fontFamily="@font/montserratmedium"
android:textSize="@dimen/sp_14"
android:layout_marginEnd="@dimen/dp_4"
/> />
<TextView <TextView
android:id="@+id/txtTotal" android:id="@+id/txtTotal"

View file

@ -3,22 +3,47 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginTop="@dimen/dp_40"
android:layout_marginBottom="@dimen/dp_40"
android:background="@android:color/transparent"> android:background="@android:color/transparent">
<LinearLayout
android:id="@+id/close_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:background="@color/white"
>
<ImageView
android:layout_width="@dimen/dp_48"
android:layout_height="@dimen/dp_48"
android:elevation="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_16"
android:padding="@dimen/dp_4"
android:src="@drawable/close_circle"
/>
</LinearLayout>
<RelativeLayout
android:id="@+id/imageCard"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
app:cardBackgroundColor="@color/white"
android:layout_below="@+id/close_button"
app:cardCornerRadius="12dp"
app:cardElevation="6dp"
android:background="@android:color/white">
<ImageView <ImageView
android:id="@+id/fullscreen_image" android:id="@+id/fullscreen_image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:scaleType="fitCenter" /> android:adjustViewBounds="true"
android:scaleType="fitCenter"
<ImageView
android:id="@+id/close_button"
android:layout_width="@dimen/dp_48"
android:layout_height="@dimen/dp_48"
android:layout_alignParentEnd="true"
android:elevation="@dimen/dp_8"
android:layout_margin="16dp"
android:padding="@dimen/dp_4"
android:src="@drawable/close_circle"
/> />
</RelativeLayout>
</RelativeLayout> </RelativeLayout>

View file

@ -221,12 +221,28 @@
</LinearLayout> </LinearLayout>
<Button
android:id="@+id/btnName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_16"
android:layout_marginTop="@dimen/dp_30"
android:text="@string/update_profile"
android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10"
android:fontFamily="@font/montserratsemibold"
android:enabled="false"
android:background="@drawable/rounded_background"
android:textColor="#FFFFFF"/>
<LinearLayout <LinearLayout
android:id="@+id/llPassword" android:id="@+id/llPassword"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_4" android:layout_marginTop="@dimen/dp_16"
android:orientation="vertical" android:orientation="vertical"
> >
<TextView <TextView
@ -245,9 +261,10 @@
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:endIconMode="password_toggle"
android:layout_marginTop="@dimen/dp_8" android:layout_marginTop="@dimen/dp_8"
app:endIconMode="custom"
app:endIconDrawable="@drawable/eye_close"
app:hintEnabled="false" app:hintEnabled="false"
> >
@ -291,12 +308,14 @@
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/tilConfirmPassword"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:endIconMode="password_toggle"
android:layout_marginTop="@dimen/dp_16" android:layout_marginTop="@dimen/dp_16"
app:endIconMode="custom"
app:endIconDrawable="@drawable/eye_close"
app:hintEnabled="false" app:hintEnabled="false"
> >
@ -321,18 +340,25 @@
</LinearLayout> </LinearLayout>
<Button <Button
android:id="@+id/btnAdd" android:id="@+id/btnPassword"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="@dimen/sp_16" android:textSize="@dimen/sp_16"
android:layout_marginTop="@dimen/dp_56" android:layout_marginTop="@dimen/dp_30"
android:text="@string/save" android:text="@string/change_password"
android:paddingTop="@dimen/dp_10" android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10" android:paddingBottom="@dimen/dp_10"
android:enabled="false"
android:fontFamily="@font/montserratsemibold" android:fontFamily="@font/montserratsemibold"
android:background="@drawable/rounded_background" android:background="@drawable/rounded_background"
android:textColor="#FFFFFF"/> android:textColor="#FFFFFF"/>
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dp_30"/>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View file

@ -112,7 +112,12 @@
<string name="new_password">كلمة المرور الجديدة</string> <string name="new_password">كلمة المرور الجديدة</string>
<string name="please_enter_new_password">الرجاء إدخال كلمة المرور الجديدة</string> <string name="please_enter_new_password">الرجاء إدخال كلمة المرور الجديدة</string>
<string name="camera_permission_denied">تم رفض إذن Cemera</string> <string name="camera_permission_denied">تم رفض إذن Cemera</string>
<string name="change_password">تغيير كلمة المرور</string>
<string name="update_profile">تحديث الملف الشخصي</string>
<string name="password_updated_successfully">تم تحديث كلمة المرور بنجاح</string>
<string name="all">الجميع</string> <string name="all">الجميع</string>
<string name="select_upto_five_images">يمكنك اختيار ما يصل إلى %d صورة فقط.</string>
<string name="select_upto_one_images">يمكنك تحديد ما يصل إلى 1 صور فقط.</string>
<string-array name="availability"> <string-array name="availability">
<item>@string/yes</item> <item>@string/yes</item>
<item>@string/no</item> <item>@string/no</item>

View file

@ -98,6 +98,7 @@
<string name="password_and_confirm_password_not_match">Password and confirm password do not match</string> <string name="password_and_confirm_password_not_match">Password and confirm password do not match</string>
<string name="save">Save</string> <string name="save">Save</string>
<string name="profile_updated_successfully">Profile updated successfully</string> <string name="profile_updated_successfully">Profile updated successfully</string>
<string name="password_updated_successfully">Password updated successfully</string>
<string name="are_you_sure_you_want_to_delete">Are you sure you want to delete?</string> <string name="are_you_sure_you_want_to_delete">Are you sure you want to delete?</string>
<string name="damage_report_table">Damage Report Table</string> <string name="damage_report_table">Damage Report Table</string>
<string name="no.">No.</string> <string name="no.">No.</string>
@ -111,6 +112,10 @@
<string name="pdf_saved">PDF saved to Documents!</string> <string name="pdf_saved">PDF saved to Documents!</string>
<string name="pdf_failed">Failed to save PDF!</string> <string name="pdf_failed">Failed to save PDF!</string>
<string name="please_try_again_later">Please try again later</string> <string name="please_try_again_later">Please try again later</string>
<string name="change_password">Change Password</string>
<string name="update_profile">Update Profile</string>
<string name="select_upto_five_images">You can only select up to %d images.</string>
<string name="select_upto_one_images">You can only select up to 1 image.</string>
<string name="contact_number_length_error">Please enter a valid contact number with 7 to 11 digits</string> <string name="contact_number_length_error">Please enter a valid contact number with 7 to 11 digits</string>