bugs fixes

This commit is contained in:
Aryankc2 2025-05-06 18:25:54 +05:30
parent cf8776568d
commit 6c2224d040
23 changed files with 333 additions and 145 deletions

View file

@ -61,12 +61,6 @@ dependencies {
implementation(libs.androidx.swiperefreshlayout) implementation(libs.androidx.swiperefreshlayout)
implementation(libs.glide) implementation(libs.glide)
implementation(libs.play.services.location) implementation(libs.play.services.location)
implementation(libs.androidx.camera.core)
implementation(libs.androidx.camera.camera2)
implementation(libs.androidx.camera.lifecycle)
implementation(libs.androidx.camera.view)
implementation(libs.androidx.camera.extensions)
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)

View file

@ -53,20 +53,21 @@
android:name=".ui.homescreen.HomeActivity" android:name=".ui.homescreen.HomeActivity"
android:exported="true" android:exported="true"
android:windowSoftInputMode="adjustResize" android:windowSoftInputMode="adjustResize"
android:configChanges="orientation|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:launchMode="singleTop" android:launchMode="singleTop"
android:screenOrientation="portrait" android:screenOrientation="portrait"
/> />
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="com.example.fieldagent.provider"
android:exported="false" android:exported="false"
android:grantUriPermissions="true"> android:grantUriPermissions="true">
<meta-data <meta-data
android:name="android.support.FILE_PROVIDER_PATHS" android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" /> android:resource="@xml/file_paths" />
</provider> </provider>
</application> </application>
</manifest> </manifest>

View file

@ -37,14 +37,11 @@ import androidx.activity.result.IntentSenderRequest
import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.RequiresPermission import androidx.annotation.RequiresPermission
import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageCapture
import androidx.camera.core.ImageCaptureException
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
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.lifecycle.lifecycleScope
@ -115,7 +112,62 @@ class AddSiteFragment : Fragment() {
private var selectWomenPrayerArea:String="" private var selectWomenPrayerArea:String=""
private var selectRestroom:String="" private var selectRestroom:String=""
private lateinit var cameraLauncher: ActivityResultLauncher<Uri>
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("imageUri", imageUri?.toString())
outState.putString("etName", binding.etName.text.toString())
outState.putString("etLocation", binding.etLocation.text.toString())
outState.putString("etSupervisorContact", binding.etSupervisorContact.text.toString())
outState.putString("etSupervisorAuthority", binding.etSupervisorAuthority.text.toString())
outState.putString("etBuildingCondition", binding.etBuildingCondition.text.toString())
outState.putString("etMosqueArea", binding.etMosqueArea.text.toString())
outState.putString("etApproximateNumber", binding.etApproximateNumber.text.toString())
outState.putString("etNumberRestroom", binding.etNumberRestroom.text.toString())
outState.putString("autoCompleteBuilding", binding.autoCompleteBuilding.text.toString())
outState.putString("autoCompleteTextView", binding.autoCompleteTextView.text.toString())
}
override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
if (savedInstanceState == null) return
savedInstanceState.getString("imageUri")?.let {
imageUri = it.toUri()
binding.llUploadImage.gone()
binding.cardImage.visible()
binding.ivSetImage.setImageURI(imageUri)
binding.ivCloseImage.visible()
}
binding.etName.setText(savedInstanceState.getString("etName", ""))
binding.etLocation.setText(savedInstanceState.getString("etLocation", ""))
binding.etSupervisorContact.setText(savedInstanceState.getString("etSupervisorContact", ""))
binding.etSupervisorAuthority.setText(savedInstanceState.getString("etSupervisorAuthority", ""))
binding.etBuildingCondition.setText(savedInstanceState.getString("etBuildingCondition", ""))
binding.etMosqueArea.setText(savedInstanceState.getString("etMosqueArea", ""))
binding.etApproximateNumber.setText(savedInstanceState.getString("etApproximateNumber", ""))
binding.etNumberRestroom.setText(savedInstanceState.getString("etNumberRestroom", ""))
binding.autoCompleteBuilding.setText(savedInstanceState.getString("autoCompleteBuilding", ""))
selectWomenPrayerArea=savedInstanceState.getString("autoCompleteBuilding", "")
selectRestroom=savedInstanceState.getString("autoCompleteTextView", "")
}
private var cameraLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
if (imageUri != null) {
binding.llUploadImage.gone()
binding.cardImage.visible()
binding.ivSetImage.setImageURI(imageUri)
binding.ivCloseImage.visible()
} else {
Toast.makeText(requireContext(), "Image URI is null", Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(requireContext(), "Failed to capture image", Toast.LENGTH_SHORT).show()
}
}
private lateinit var galleryLauncher: ActivityResultLauncher<String> private lateinit var galleryLauncher: ActivityResultLauncher<String>
private lateinit var permissionLauncher: ActivityResultLauncher<Array<String>> private lateinit var permissionLauncher: ActivityResultLauncher<Array<String>>
private var imageUri: Uri? = null private var imageUri: Uri? = null
@ -125,8 +177,9 @@ class AddSiteFragment : Fragment() {
private lateinit var fusedLocationClient: FusedLocationProviderClient private lateinit var fusedLocationClient: FusedLocationProviderClient
private lateinit var locationPermissionLauncher: ActivityResultLauncher<Array<String>> private lateinit var locationPermissionLauncher: ActivityResultLauncher<Array<String>>
private var imageCapture: ImageCapture? = null
private lateinit var cameraProvider: ProcessCameraProvider
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
@ -158,12 +211,14 @@ class AddSiteFragment : Fragment() {
private fun listener(){ private fun listener(){
//val options = resources.getStringArray(R.array.availability).toList()
selectWomenPrayerArea=getString(R.string.yes) lifecycleScope.launch {
delay(1000) // delay for 1 second (1000 ms)
val options = resources.getStringArray(R.array.availability).toList() var womenList = listOf(getString(R.string.yes), getString(R.string.no))
val adapter = ArrayAdapter(requireActivity(), R.layout.dropdown_item, options) val adapter = ArrayAdapter(requireActivity(), R.layout.dropdown_item,womenList )
binding.autoCompleteBuilding.setAdapter(null)
binding.autoCompleteBuilding.setAdapter(adapter) binding.autoCompleteBuilding.setAdapter(adapter)
binding.autoCompleteBuilding.setOnClickListener { binding.autoCompleteBuilding.setOnClickListener {
@ -175,6 +230,8 @@ class AddSiteFragment : Fragment() {
val selectedItem = parent.getItemAtPosition(position) as String val selectedItem = parent.getItemAtPosition(position) as String
selectWomenPrayerArea=selectedItem; selectWomenPrayerArea=selectedItem;
} }
}
binding.autoCompleteTextView.setOnClickListener { binding.autoCompleteTextView.setOnClickListener {
@ -197,23 +254,9 @@ class AddSiteFragment : Fragment() {
showImageDialog(); showImageDialog();
} }
cameraLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { success ->
if (success) {
lifecycleScope.launch {
delay(300) // This helps avoid Handler-on-dead-thread on some OEMs
imageUri?.let {
binding.llUploadImage.gone()
binding.cardImage.visible()
binding.ivSetImage.setImageURI(imageUri)
binding.ivCloseImage.visible()
fileToUpload = uriToFile(imageUri!!, requireActivity())
}
}
}
}
galleryLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> galleryLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
uri?.let { uri?.let {
@ -243,7 +286,6 @@ class AddSiteFragment : Fragment() {
binding.ivClickGps.setOnClickListener { binding.ivClickGps.setOnClickListener {
getCurrentLocation() getCurrentLocation()
// checkLocationPermissionAndFetch();
} }
binding.ivCloseImage.setOnClickListener { binding.ivCloseImage.setOnClickListener {
@ -262,7 +304,7 @@ class AddSiteFragment : Fragment() {
if (permissions[Manifest.permission.CAMERA] == true) { if (permissions[Manifest.permission.CAMERA] == true) {
} else { } else {
Toast.makeText(requireContext(), "Camera permission denied", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), getString(R.string. camera_permission_denied), Toast.LENGTH_SHORT).show()
} }
} }
@ -272,7 +314,7 @@ class AddSiteFragment : Fragment() {
if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true) { if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true) {
getCurrentLocation() getCurrentLocation()
} else { } else {
Toast.makeText(requireContext(), "Location permission denied", Toast.LENGTH_SHORT).show() Toast.makeText(requireContext(), getString(R.string.location_permission_denied), Toast.LENGTH_SHORT).show()
} }
} }
@ -393,11 +435,18 @@ class AddSiteFragment : Fragment() {
progressDialog.setLoading(false) progressDialog.setLoading(false)
restRoomList.addAll(it.data?.data?.conditions!!) restRoomList.addAll(it.data?.data?.conditions!!)
val adapter = ArrayAdapter(requireActivity(), R.layout.dropdown_item, restRoomList) val adapter = ArrayAdapter(requireActivity(), R.layout.dropdown_item, restRoomList)
selectRestroom=restRoomList[0]
binding.autoCompleteTextView.setAdapter(adapter) binding.autoCompleteTextView.setAdapter(adapter)
if(selectRestroom.isNotEmpty()){
binding.autoCompleteTextView.setText(selectRestroom, false)
}else{
selectRestroom=restRoomList[0]
binding.autoCompleteTextView.setText(restRoomList.first(), false) binding.autoCompleteTextView.setText(restRoomList.first(), false)
} }
}
Status.ERROR -> { Status.ERROR -> {
progressDialog.setLoading(false) progressDialog.setLoading(false)
ApisRespHandler.handleError(it.error, requireActivity()) ApisRespHandler.handleError(it.error, requireActivity())
@ -495,10 +544,13 @@ class AddSiteFragment : Fragment() {
view.tvCamera.setOnClickListener { view.tvCamera.setOnClickListener {
// startCameraX();
// permissionLauncher.launch(arrayOf(Manifest.permission.CAMERA))
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
openCamera() openCamera()
} else {
permissionLauncher.launch(arrayOf(Manifest.permission.CAMERA))
}
dialog.dismiss() dialog.dismiss()
} }
dialog.show() dialog.show()
@ -506,35 +558,38 @@ class AddSiteFragment : Fragment() {
private fun openCamera() { private fun openCamera() {
/* imageUri = FileProvider.getUriForFile(
requireContext(),
"${requireContext().packageName}.provider",
createImageFile()
)*/
imageUri=createImageUri()
cameraLauncher.launch(imageUri!!)
}
private fun createImageUri(): Uri? { try {
val contentValues = ContentValues().apply { val photoFile = createImageFile()
put(MediaStore.Images.Media.DISPLAY_NAME, "IMG_${System.currentTimeMillis()}.jpg")
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
}
return requireContext().contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) fileToUpload = photoFile
imageUri = FileProvider.getUriForFile(
requireActivity(),
"com.example.fieldagent.provider",
photoFile
)
cameraLauncher.launch(imageUri)
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(requireContext(), "Error in openCamera: ${e.message}", Toast.LENGTH_LONG).show()
} }
}
private fun createImageFile(): File { private fun createImageFile(): File {
val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
val fileName = "JPEG_${timeStamp}_" val storageDir = requireContext().getExternalFilesDir(null)
val storageDir = requireContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES) return File(storageDir?.absolutePath ?: "", "IMG_${timeStamp}_.jpg")
return File.createTempFile(fileName, ".jpg", storageDir)
} }
override fun onDestroyView() { override fun onDestroyView() {

View file

@ -1,5 +1,7 @@
package com.example.fieldagent.ui.addsite package com.example.fieldagent.ui.addsite
import android.net.Uri
import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import com.example.fieldagent.data.apis.WebService import com.example.fieldagent.data.apis.WebService
import com.example.fieldagent.data.models.responses.RoomConditionData import com.example.fieldagent.data.models.responses.RoomConditionData
@ -23,6 +25,7 @@ class AddSiteViewModel @Inject constructor(private val webService: WebService)
val sites by lazy { SingleLiveEvent<Resource<SimpleResponseData>>() } val sites by lazy { SingleLiveEvent<Resource<SimpleResponseData>>() }
val rooms by lazy { SingleLiveEvent<Resource<RoomConditionData>>() } val rooms by lazy { SingleLiveEvent<Resource<RoomConditionData>>() }
fun addSites(hashMap: HashMap<String, RequestBody>) { fun addSites(hashMap: HashMap<String, RequestBody>) {
sites.value = Resource.loading() sites.value = Resource.loading()

View file

@ -237,10 +237,10 @@ class DamageDetailsFragment : Fragment() {
isEditing = true isEditing = true
val input = s.toString().replace(" $", "").trim() val input = s.toString().replace(" SAR", "").trim()
if (input.isNotEmpty() && input.toDoubleOrNull() != null) { if (input.isNotEmpty() && input.toDoubleOrNull() != null) {
binding.etItemValue.setText("$ $input") binding.etItemValue.setText("SAR $input")
binding.etItemValue.setSelection(binding.etItemValue.text.length) // cursor before " m²" binding.etItemValue.setSelection(binding.etItemValue.text.length) // cursor before " m²"
} }
@ -269,7 +269,9 @@ class DamageDetailsFragment : Fragment() {
hashMap["inspection_id"] = getRequestBody(inspectionId) hashMap["inspection_id"] = getRequestBody(inspectionId)
hashMap["subCategory_id"] = getRequestBody(selectSubId) hashMap["subCategory_id"] = getRequestBody(selectSubId)
hashMap["item_quantity"] = getRequestBody(binding.etItemQuantity.text) hashMap["item_quantity"] = getRequestBody(binding.etItemQuantity.text)
hashMap["item_value"] = getRequestBody(binding.etItemValue.text.toString().replace(Regex("[^\\d.]"), ""))
val cleanValue = binding.etItemValue.text.toString().replace("SAR", "", ignoreCase = true).trim()
hashMap["item_value"] = getRequestBody(cleanValue)
val imageParts = ArrayList<MultipartBody.Part>() val imageParts = ArrayList<MultipartBody.Part>()

View file

@ -38,7 +38,7 @@ class DamageListAdapter(val damageListFragment: DamageListFragment) : RecyclerVi
holder.binding.txtValue.text = damage.itemValue.toString() holder.binding.txtValue.text = damage.itemValue.toString()
val total = damage.itemValue * damage.itemQuantity val total = damage.itemValue * damage.itemQuantity
holder.binding.txtTotal.text="$ "+total.toString() holder.binding.txtTotal.text=total.toString()
holder.binding.txtImage.text=damage.images?.size.toString() holder.binding.txtImage.text=damage.images?.size.toString()
holder.binding.ivDelete.setOnClickListener { holder.binding.ivDelete.setOnClickListener {

View file

@ -158,10 +158,10 @@ class HomeFragment : Fragment() {
} }
binding.ivFilter.setOnClickListener { binding.llFilter.setOnClickListener {
val inflater = LayoutInflater.from(binding.ivFilter.context) val inflater = LayoutInflater.from(binding.llFilter.context)
val parent = binding.root as ViewGroup val parent = binding.root as ViewGroup
val popupView = PopLayoutBinding.inflate(inflater,parent,false) val popupView = PopLayoutBinding.inflate(inflater,parent,false)
@ -178,6 +178,8 @@ class HomeFragment : Fragment() {
click="status" click="status"
selectStatus="true" selectStatus="true"
callStatusSearchApi("true","") callStatusSearchApi("true","")
binding.txtStatusShow.visible()
binding.txtStatusShow.text=getString(R.string.completed)
popupWindow.dismiss() popupWindow.dismiss()
} }
@ -186,6 +188,18 @@ class HomeFragment : Fragment() {
click="status" click="status"
selectStatus="false" selectStatus="false"
callStatusSearchApi("false","") callStatusSearchApi("false","")
binding.txtStatusShow.visible()
binding.txtStatusShow.text=getString(R.string.in_progress)
popupWindow.dismiss()
}
popupView.txtAll.setOnClickListener {
refreshPagination()
binding.txtStatusShow.gone()
val hashMap = HashMap<String, String>()
hashMap[LIMIT_TEXT] = PER_PAGE_LOAD
hashMap[PAGE_TEXT] = PER_PAGE
viewModel.getInspectionList(hashMap)
popupWindow.dismiss() popupWindow.dismiss()
} }

View file

@ -127,15 +127,15 @@ class ProfileFragment : Fragment() {
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().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))
} }
binding.etConfirmPassword.text.toString().isEmpty()->{ binding.etPassword.text.toString().isNotEmpty() && binding.etConfirmPassword.text.toString().isEmpty()->{
binding.etConfirmPassword.showSnackBar(getString(R.string.please_enter_confirm_password)) binding.etConfirmPassword.showSnackBar(getString(R.string.please_enter_confirm_password))
} }
binding.etPassword.text.toString() != binding.etConfirmPassword.text.toString()->{ binding.etPassword.text.toString() != binding.etConfirmPassword.text.toString()->{
@ -144,7 +144,11 @@ class ProfileFragment : Fragment() {
isConnectedToInternet(requireActivity(), true) -> { isConnectedToInternet(requireActivity(), true) -> {
val hashMap = HashMap<String, String>() val hashMap = HashMap<String, String>()
hashMap["name"] = binding.etName.text.toString() hashMap["name"] = binding.etName.text.toString()
if (binding.etPassword.text.toString().isNotEmpty())
{
hashMap["password"] = binding.etPassword.text.toString() hashMap["password"] = binding.etPassword.text.toString()
}
viewModel.updateProfile(userId,hashMap) viewModel.updateProfile(userId,hashMap)
} }

View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="13dp"
android:viewportWidth="12"
android:viewportHeight="13">
<path
android:pathData="M5.428,0.116C5.067,0.336 4.662,0.666 4.41,0.944L4.256,1.117L4.245,3.852L4.235,6.589L3.306,6.781C2.796,6.888 2.103,7.03 1.768,7.098C1.434,7.168 1.139,7.228 1.114,7.234C1.077,7.242 1.05,7.288 0.988,7.446C0.889,7.696 0.833,7.86 0.78,8.07C0.728,8.276 0.668,8.624 0.678,8.672C0.685,8.709 0.722,8.705 1.324,8.578C1.677,8.506 2.458,8.344 3.058,8.22C3.661,8.098 4.173,7.992 4.2,7.986L4.245,7.976V8.859V9.741L4.2,9.759C4.173,9.769 3.929,9.823 3.657,9.879C3.157,9.981 1.686,10.283 0.854,10.455L0.404,10.55L0.371,10.62C0.288,10.81 0.171,11.156 0.117,11.372C0.065,11.574 -0.011,12.004 0.001,12.016C0.003,12.018 0.129,11.994 0.282,11.962C0.435,11.93 1.133,11.786 1.83,11.642C4.289,11.136 4.14,11.168 4.303,11.09C4.559,10.968 4.671,10.846 5.125,10.197C5.348,9.877 5.554,9.565 5.585,9.503L5.639,9.391L5.645,8.54L5.649,7.69L6.285,7.556C6.634,7.484 6.953,7.418 6.995,7.41L7.073,7.396L7.077,8.797L7.084,10.195L8.714,9.859C9.612,9.673 10.62,9.467 10.954,9.399C11.288,9.331 11.573,9.267 11.585,9.257C11.616,9.235 11.763,8.859 11.837,8.61C11.92,8.334 12.019,7.8 11.988,7.8C11.98,7.8 11.189,7.962 10.231,8.158C9.274,8.356 8.483,8.514 8.475,8.508C8.452,8.496 8.452,7.126 8.473,7.112C8.483,7.106 8.89,7.02 9.377,6.92C11.253,6.531 11.577,6.463 11.596,6.445C11.649,6.393 11.868,5.743 11.924,5.471C11.959,5.299 12.002,5.011 11.994,5.001C11.988,4.993 11.722,5.047 9.819,5.439C9.121,5.583 8.533,5.703 8.514,5.705C8.479,5.709 8.477,5.577 8.477,3.192V0.672L8.378,0.728C8.025,0.926 7.659,1.211 7.325,1.545L7.073,1.799L7.069,3.902L7.063,6.007L6.361,6.153C5.975,6.233 5.653,6.291 5.645,6.283C5.637,6.275 5.626,4.856 5.624,3.134L5.618,-0L5.428,0.116Z"
android:fillColor="#333333"/>
<path
android:pathData="M11.718,10.656C11.336,10.734 9.455,11.124 8.436,11.332C7.92,11.438 7.486,11.536 7.474,11.548C7.445,11.578 7.348,11.824 7.261,12.086C7.195,12.286 7.108,12.683 7.082,12.891C7.069,12.999 7.071,13.007 7.106,12.997C7.129,12.991 7.583,12.895 8.116,12.785C8.65,12.675 9.643,12.47 10.324,12.33C11.006,12.19 11.573,12.068 11.588,12.058C11.619,12.034 11.749,11.706 11.825,11.464C11.877,11.296 11.965,10.886 11.994,10.676C12.007,10.587 12.027,10.59 11.718,10.656Z"
android:fillColor="#333333"/>
</vector>

View file

@ -0,0 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="16dp"
android:height="16dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:strokeWidth="1"
android:pathData="M8,14.667C11.682,14.667 14.667,11.682 14.667,8C14.667,4.318 11.682,1.334 8,1.334C4.318,1.334 1.334,4.318 1.334,8C1.334,11.682 4.318,14.667 8,14.667Z"
android:strokeLineJoin="round"
android:fillColor="#00000000"
android:strokeColor="#285747"
android:strokeLineCap="round"/>
<path
android:pathData="M5.009,10.506C5.728,10.358 6.061,10.289 6.228,10.252C6.312,10.233 6.342,10.225 6.354,10.221L6.384,10.206H6.385C6.429,10.185 6.452,10.171 6.492,10.127C6.529,10.087 6.573,10.028 6.643,9.932L6.584,9.954L6.558,9.964L6.552,9.966L6.483,9.985C6.463,9.99 6.437,9.996 6.408,10.003L6.192,10.049H6.191L4.558,10.385L4.447,10.408C4.421,10.481 4.392,10.566 4.371,10.638L5.009,10.506ZM6.769,9.756C6.826,9.673 6.88,9.593 6.923,9.528C6.946,9.493 6.966,9.463 6.98,9.44L6.997,9.413L7.001,8.98L7.004,8.484L7.005,8.249L7.235,8.2L7.605,8.122H7.607L8.024,8.036L8.029,8.035L8.075,8.027L8.417,7.966L8.418,8.313L8.42,9.13L8.422,9.591L9.024,9.466C9.549,9.357 10.137,9.237 10.332,9.197C10.414,9.181 10.491,9.165 10.552,9.151L10.626,8.939C10.628,8.934 10.628,8.928 10.63,8.922C10.46,8.957 10.251,8.999 10.026,9.045H10.027C9.748,9.103 9.492,9.155 9.306,9.192C9.212,9.211 9.135,9.226 9.081,9.236C9.054,9.241 9.031,9.245 9.015,9.248C9.007,9.249 8.998,9.251 8.989,9.252C8.986,9.252 8.977,9.254 8.967,9.255C8.963,9.255 8.951,9.255 8.937,9.255C8.93,9.255 8.914,9.254 8.896,9.251C8.889,9.25 8.853,9.242 8.809,9.219L8.808,9.222C8.8,9.218 8.794,9.212 8.788,9.208C8.783,9.205 8.777,9.203 8.772,9.199L8.773,9.197C8.736,9.17 8.713,9.142 8.702,9.127C8.687,9.105 8.677,9.084 8.673,9.073C8.664,9.051 8.66,9.032 8.658,9.024C8.655,9.008 8.652,8.994 8.651,8.987C8.65,8.972 8.649,8.955 8.648,8.942C8.647,8.915 8.645,8.88 8.645,8.841C8.643,8.762 8.642,8.659 8.642,8.557C8.642,8.455 8.643,8.351 8.645,8.272C8.645,8.234 8.646,8.198 8.647,8.171C8.648,8.158 8.649,8.143 8.65,8.129C8.651,8.123 8.652,8.109 8.655,8.094C8.657,8.087 8.66,8.07 8.667,8.051C8.671,8.041 8.678,8.023 8.689,8.003C8.699,7.986 8.726,7.943 8.778,7.907L8.787,7.901L8.796,7.896C8.818,7.884 8.838,7.876 8.841,7.875C8.848,7.872 8.853,7.871 8.856,7.87C8.862,7.868 8.867,7.867 8.87,7.866C8.876,7.865 8.883,7.862 8.888,7.861C8.897,7.859 8.91,7.857 8.924,7.854C8.953,7.847 8.993,7.838 9.041,7.828L9.411,7.751C9.959,7.638 10.279,7.572 10.463,7.532C10.498,7.525 10.528,7.518 10.554,7.513C10.563,7.488 10.573,7.46 10.583,7.431C10.599,7.382 10.615,7.332 10.629,7.286C10.441,7.325 10.171,7.38 9.786,7.459H9.785C9.582,7.501 9.395,7.539 9.257,7.567C9.188,7.581 9.13,7.593 9.09,7.602C9.07,7.606 9.054,7.608 9.042,7.61C9.041,7.611 9.017,7.616 8.999,7.618H8.997C8.947,7.623 8.871,7.618 8.798,7.568C8.733,7.524 8.704,7.466 8.692,7.438C8.671,7.389 8.666,7.341 8.664,7.326C8.659,7.282 8.658,7.216 8.656,7.122C8.653,6.926 8.653,6.556 8.653,5.862V4.949C8.641,4.96 8.628,4.969 8.616,4.979L8.479,5.107L8.417,5.17L8.415,6.277L8.412,7.505L8.411,7.742L8.18,7.79L7.771,7.875H7.77C7.655,7.899 7.549,7.919 7.471,7.934C7.432,7.941 7.397,7.946 7.371,7.95C7.359,7.952 7.344,7.955 7.33,7.956C7.324,7.957 7.311,7.958 7.296,7.958C7.289,7.958 7.273,7.957 7.253,7.954C7.243,7.953 7.224,7.95 7.201,7.942C7.192,7.939 7.176,7.933 7.156,7.923L7.09,7.875C7.049,7.836 7.031,7.794 7.025,7.782C7.018,7.765 7.014,7.751 7.012,7.743C7.008,7.728 7.006,7.716 7.005,7.711C7.003,7.701 7.002,7.692 7.002,7.688C7.001,7.681 7.001,7.673 7.001,7.669C7.001,7.659 6.999,7.647 6.999,7.634C6.998,7.607 6.998,7.569 6.997,7.521C6.996,7.427 6.995,7.291 6.994,7.124C6.992,6.79 6.99,6.332 6.989,5.829L6.986,4.562C6.956,4.587 6.926,4.611 6.898,4.637L6.789,4.747L6.773,4.765L6.769,6.248L6.762,7.845L6.761,8.082L6.529,8.13L5.987,8.242H5.986C5.689,8.304 5.285,8.387 5.09,8.427H5.089C4.994,8.447 4.905,8.464 4.837,8.479C4.801,8.571 4.778,8.639 4.758,8.71L5.725,8.51H5.727C5.902,8.474 6.064,8.441 6.185,8.416C6.244,8.404 6.294,8.393 6.329,8.386C6.347,8.382 6.361,8.379 6.371,8.377L6.387,8.374L6.414,8.368L6.769,8.29V9.756Z"
android:strokeWidth="0.583333"
android:fillColor="#295747"
android:strokeColor="#295747"/>
<path
android:pathData="M8.675,11.172H8.676C8.988,11.108 9.567,10.989 9.964,10.908C10.162,10.867 10.343,10.829 10.476,10.8C10.504,10.794 10.53,10.788 10.554,10.783C10.576,10.726 10.601,10.659 10.619,10.603V10.602C10.623,10.59 10.625,10.574 10.63,10.556L8.979,10.896C8.83,10.927 8.693,10.957 8.594,10.979C8.585,10.981 8.577,10.983 8.569,10.985L8.513,11.142C8.506,11.161 8.501,11.184 8.494,11.21L8.675,11.172Z"
android:strokeWidth="0.583333"
android:fillColor="#295747"
android:strokeColor="#295747"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="16"
android:viewportHeight="16">
<path
android:pathData="M13.45,0.209H2.55C1.533,0.209 0.708,1.034 0.708,2.05C0.708,2.492 0.867,2.917 1.15,3.25L5.458,8.275C5.617,8.467 5.708,8.709 5.708,8.95V13.65C5.708,14.158 5.967,14.625 6.4,14.892C6.633,15.033 6.9,15.108 7.167,15.108C7.392,15.108 7.608,15.059 7.817,14.95L9.483,14.117C9.983,13.867 10.292,13.367 10.292,12.809V8.942C10.292,8.692 10.383,8.45 10.542,8.267L14.85,3.242C15.133,2.909 15.292,2.484 15.292,2.042C15.292,1.025 14.467,0.2 13.45,0.2V0.209ZM13.9,2.434L9.592,7.459C9.233,7.875 9.042,8.4 9.042,8.95V12.817C9.042,12.9 9,12.967 8.925,13L7.258,13.833C7.167,13.884 7.092,13.85 7.058,13.825C7.025,13.8 6.958,13.75 6.958,13.65V8.95C6.958,8.4 6.767,7.875 6.408,7.459L2.1,2.434C2.008,2.325 1.958,2.192 1.958,2.05C1.958,1.725 2.225,1.459 2.55,1.459H13.45C13.775,1.459 14.042,1.725 14.042,2.05C14.042,2.192 13.992,2.325 13.9,2.434Z"
android:fillColor="#285747"/>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:color="@color/main_color"
android:width="@dimen/dp_1"
/>
<corners android:radius="@dimen/dp_8" />
<padding
android:left="@dimen/dp_8"
android:top="@dimen/dp_8"
android:right="@dimen/dp_8"
android:bottom="@dimen/dp_6" />
</shape>

View file

@ -198,18 +198,37 @@
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
/> />
<TextView
android:id="@+id/txtValue"
<LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="$ 300" android:orientation="horizontal"
android:layout_weight="0.5" android:layout_weight="0.5"
android:layout_gravity="end"
android:gravity="end"
>
<ImageView
android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_16"
android:src="@drawable/arab"
android:layout_marginTop="@dimen/dp_2"
android:layout_marginEnd="@dimen/dp_2"
/>
<TextView
android:id="@+id/txtValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="300"
android:textAlignment="textEnd" android:textAlignment="textEnd"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
android:fontFamily="@font/montserratregular" android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
/> />
</LinearLayout>
@ -276,18 +295,33 @@
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
/> />
<TextView
android:id="@+id/txtTotal" <LinearLayout
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="$ 3000" android:orientation="horizontal"
android:layout_weight="0.5" android:layout_weight="0.5"
android:textAlignment="textEnd" android:layout_gravity="end"
android:gravity="end"
>
<ImageView
android:layout_width="@dimen/dp_16"
android:layout_height="@dimen/dp_16"
android:src="@drawable/arab"
android:layout_marginTop="@dimen/dp_4"
android:layout_marginEnd="@dimen/dp_2"
/>
<TextView
android:id="@+id/txtTotal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
android:fontFamily="@font/montserratmedium" android:fontFamily="@font/montserratmedium"
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
/> />
</LinearLayout>

View file

@ -553,32 +553,5 @@
<androidx.camera.view.PreviewView
android:id="@+id/viewFinder"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="16dp"
android:elevation="@dimen/dp_4"
android:visibility="gone" />
<ImageView
android:id="@+id/ivButton"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@drawable/close_circle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:visibility="gone"
android:elevation="@dimen/dp_8"
/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView> </ScrollView>

View file

@ -47,10 +47,11 @@
android:id="@+id/ivProfile" android:id="@+id/ivProfile"
android:layout_width="@dimen/sp_50" android:layout_width="@dimen/sp_50"
android:layout_height="@dimen/sp_40" android:layout_height="@dimen/sp_40"
android:paddingTop="@dimen/dp_4" android:paddingTop="@dimen/dp_8"
android:paddingBottom="@dimen/dp_4" android:paddingBottom="@dimen/dp_8"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
app:tint="@color/main_color"
android:src="@drawable/profile"/> android:src="@drawable/profile"/>
@ -99,44 +100,58 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:id="@+id/llSearchView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/rlTop"
android:orientation="horizontal"
android:layout_margin="@dimen/dp_16"
>
<EditText <EditText
android:id="@+id/etSearch" android:id="@+id/etSearch"
android:layout_weight="0.9"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="@string/search" android:hint="@string/search"
android:textSize="@dimen/sp_14" android:textSize="@dimen/sp_14"
app:layout_constraintTop_toBottomOf="@+id/rlTop"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@+id/llFilter"
android:drawableStart="@drawable/search" android:drawableStart="@drawable/search"
android:background="@drawable/rounded_search_background" android:background="@drawable/rounded_search_background"
android:paddingStart="@dimen/dp_12" android:layout_marginTop="@dimen/dp_16"
android:fontFamily="@font/montserratregular" android:fontFamily="@font/montserratregular"
android:layout_marginEnd="@dimen/dp_16" android:layout_marginEnd="@dimen/dp_16"
android:drawablePadding="@dimen/dp_8" /> android:drawablePadding="@dimen/dp_8" />
<LinearLayout
android:id="@+id/llFilter"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/rounded_filter"
app:layout_constraintEnd_toEndOf="@+id/rightGuide"
app:layout_constraintTop_toTopOf="@+id/etSearch"
app:layout_constraintBottom_toBottomOf="@id/etSearch"
android:gravity="end"
>
<TextView
android:id="@+id/txtStatusShow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_12"
android:fontFamily="@font/montserratregular"
android:paddingEnd="@dimen/dp_8"
android:paddingStart="@dimen/dp_4"
android:layout_gravity="center"
android:visibility="gone"
android:textColor="@color/main_color"/>
<ImageView <ImageView
android:id="@+id/ivFilter" android:id="@+id/ivFilter"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_weight="0.05" android:src="@drawable/filter_new"/>
android:src="@drawable/filter"/>
</LinearLayout> </LinearLayout>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh" android:id="@+id/swipeRefresh"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="@dimen/dp_12" android:layout_marginTop="@dimen/dp_12"
app:layout_constraintTop_toBottomOf="@+id/llSearchView"> app:layout_constraintTop_toBottomOf="@+id/etSearch">
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvList" android:id="@+id/rvList"
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -158,7 +158,7 @@
android:layout_height="@dimen/dp_16" android:layout_height="@dimen/dp_16"
android:layout_marginTop="@dimen/dp_4" android:layout_marginTop="@dimen/dp_4"
android:src="@drawable/dollar_circle"/> android:src="@drawable/circle_arab"/>
<TextView <TextView
android:id="@+id/txtPayment" android:id="@+id/txtPayment"
android:layout_width="0dp" android:layout_width="0dp"

View file

@ -48,6 +48,7 @@
> >
<TextView <TextView
android:id="@+id/txtInProgress" android:id="@+id/txtInProgress"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -80,5 +81,28 @@
android:textColor="@android:color/black" android:textColor="@android:color/black"
android:fontFamily="@font/montserratregular" android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14" /> android:textSize="@dimen/sp_14" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginTop="@dimen/dp_8"
android:layout_marginBottom="@dimen/dp_8"
android:background="@color/outline_grey_color"/>
<TextView
android:id="@+id/txtAll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/all"
android:layout_marginStart="@dimen/dp_12"
android:textColor="@android:color/black"
android:paddingTop="@dimen/dp_8"
android:paddingBottom="@dimen/dp_8"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14" />
</LinearLayout> </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -111,6 +111,8 @@
<string name="please_enter_valid_password">يجب أن تتكون كلمة المرور من 6 أحرف على الأقل وتتضمن حرفًا كبيرًا واحدًا ورقمًا واحدًا وحرفًا خاصًا واحدًا</string> <string name="please_enter_valid_password">يجب أن تتكون كلمة المرور من 6 أحرف على الأقل وتتضمن حرفًا كبيرًا واحدًا ورقمًا واحدًا وحرفًا خاصًا واحدًا</string>
<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="all">الجميع</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

@ -22,6 +22,7 @@
<string name="status">Status</string> <string name="status">Status</string>
<string name="in_progress">In Progress</string> <string name="in_progress">In Progress</string>
<string name="completed">Completed</string> <string name="completed">Completed</string>
<string name="all">All</string>
<string name="site_detail">Site Detail</string> <string name="site_detail">Site Detail</string>
<string name="name">Name</string> <string name="name">Name</string>
<string name="please_enter_your_name">Please enter your name</string> <string name="please_enter_your_name">Please enter your name</string>
@ -77,6 +78,7 @@
<string name="gallery">Gallery</string> <string name="gallery">Gallery</string>
<string name="camera">Camera</string> <string name="camera">Camera</string>
<string name="location_permission_denied">Location permission denied</string> <string name="location_permission_denied">Location permission denied</string>
<string name="camera_permission_denied">Cemera permission denied</string>
<string name="could_not_fetch_location">Couldn\'t fetch location</string> <string name="could_not_fetch_location">Couldn\'t fetch location</string>
<string name="seconds_ago">seconds ago</string> <string name="seconds_ago">seconds ago</string>
<string name="minutes_ago">minutes ago</string> <string name="minutes_ago">minutes ago</string>

View file

@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path <external-files-path name="my_images" path="." />
<files-path
name="my_images" name="my_images"
path="Pictures" /> path="." />
<external-path
name="my_images"
path="."/>
</paths> </paths>