issues almost done

This commit is contained in:
Aryankc2 2025-05-02 17:51:28 +05:30
parent c6368cfeae
commit a77f993d78
43 changed files with 646 additions and 342 deletions

View file

@ -10,6 +10,7 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<application
@ -21,6 +22,7 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:localeConfig="@xml/locales_config"
android:theme="@style/Theme.FieldAgent"
tools:targetApi="31">
@ -39,11 +41,13 @@
<activity
android:name=".ui.login.LoginActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait"
/>
<activity
android:name=".ui.homescreen.HomeActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait"
/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View file

@ -15,13 +15,12 @@ interface WebService {
private const val INSPECTIONS = "inspections"
private const val DAMAGES = "damages"
private const val RESTROOM_LIST = "restroom-conditions"
private const val ITEM_LIST = "combined-list"
private const val CATEGORY = "categories"
private const val SELECT_CATEGORY = "categories"
private const val SUB_CATEGORY = "subcategories"
private const val USER = "users"
}
/*POST APIS*/

View file

@ -29,6 +29,9 @@ data class InspectionList (
val totalRestrooms: Long? = null,
val restroomCondition: String? = null,
val vat: String? = null,
@SerializedName("unique_hash")
val uniqueHash: String? = null,
val image: String? = null,
val isCompleted: Boolean? = null,
val isDeleted: Boolean? = null,

View file

@ -8,6 +8,8 @@ import android.content.pm.PackageManager
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.location.Geocoder
import android.location.Location
import android.location.LocationRequest
import android.net.Uri
import android.os.Build
import android.os.Bundle
@ -53,11 +55,16 @@ import com.example.fieldagent.utils.gone
import com.example.fieldagent.utils.hideKeyboard
import com.example.fieldagent.utils.hideShowView
import com.example.fieldagent.utils.isConnectedToInternet
import com.example.fieldagent.utils.showFullScreenImage
import com.example.fieldagent.utils.showSnackBar
import com.example.fieldagent.utils.uriToFile
import com.example.fieldagent.utils.visible
import com.google.android.gms.location.FusedLocationProviderClient
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
import com.google.android.gms.location.Priority
import com.google.android.gms.tasks.CancellationTokenSource
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
@ -228,6 +235,10 @@ class AddSiteFragment : Fragment() {
binding.ivCloseImage.gone()
imageUri=null;
}
binding.ivSetImage.setOnClickListener {
showFullScreenImage(imageUri.toString(),requireActivity())
}
// Permission launcher
permissionLauncher = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
@ -279,6 +290,9 @@ class AddSiteFragment : Fragment() {
binding.etSupervisorContact.text.toString().isEmpty() -> {
binding.etSupervisorContact.showSnackBar(getString(R.string.please_enter_supervisor_contact_number))
}
binding.etSupervisorContact.text.toString().length < 7 || binding.etSupervisorContact.text.toString().length > 11 -> {
binding.etSupervisorContact.showSnackBar(getString(R.string.contact_number_length_error))
}
binding.etSupervisorAuthority.text.toString().isEmpty() -> {
binding.etSupervisorAuthority.showSnackBar(getString(R.string.please_enter_supervisor_authority_mosque))
@ -331,7 +345,7 @@ class AddSiteFragment : Fragment() {
it ?: return@Observer
when (it.status) {
Status.SUCCESS -> {
parentFragmentManager.setFragmentResult("refresh_home", Bundle())
findNavController().popBackStack();
progressDialog.setLoading(false)
}
@ -386,12 +400,32 @@ class AddSiteFragment : Fragment() {
@SuppressLint("MissingPermission")
private fun getCurrentLocation() {
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY,
5000 // interval in milliseconds
).build()
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
/* fusedLocationClient.lastLocation.addOnSuccessListener { location ->
if (location != null) {
getAddressFromLocation(location.latitude, location.longitude)
} else {
Toast.makeText(requireActivity(), getString(R.string.could_not_fetch_location), Toast.LENGTH_SHORT).show()
}
}*/
}
// Stop location updates
private fun stopLocationUpdates() {
fusedLocationClient.removeLocationUpdates(locationCallback)
}
private val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult) {
super.onLocationResult(locationResult)
// Process the location data
val location: Location = locationResult.lastLocation!!
Log.e("ChecLofgggf==>","${location.longitude}")
// ... (Display location on map, etc.) ...
}
}

View file

@ -409,7 +409,9 @@ class DamageDetailsFragment : Fragment() {
val tempData=it.data?.data
if(tempData?.categories!=null && tempData.categories.isNotEmpty() && tempData.categories[0].subCategories!=null && tempData.categories[0].subCategories!!.isNotEmpty())
{
tempData.categories[0].subCategories?.let { it1 -> subCategoryList.addAll(it1) }
tempData.categories[0].subCategories?.let { it1 ->
subCategoryList.clear()
subCategoryList.addAll(it1) }
binding.llUnits.visible()
binding.llSubItem.visible()
val subCategoryNames = subCategoryList.map { it.name }

View file

@ -11,6 +11,8 @@ import com.example.fieldagent.ui.damagedetails.DamageDetailsFragment
import com.example.fieldagent.utils.gone
import com.example.fieldagent.utils.visible
import androidx.core.net.toUri
import com.example.fieldagent.utils.IMAGE_BASE_URL
import com.example.fieldagent.utils.showFullScreenImage
class DamageDetailsAdapter(
@ -57,6 +59,10 @@ class DamageDetailsAdapter(
holder.binding.ivCloseImage.setOnClickListener {
damageDetailsFragment.removeImage(position)
}
holder.binding.cardImage.setOnClickListener {
showFullScreenImage(imageList[position].toString(),holder.binding.root.context)
}
} else {
holder.binding.rlUploadImage.visible()
holder.binding.cardImage.gone()

View file

@ -1,15 +1,19 @@
package com.example.fieldagent.ui.damagelist
import android.app.DownloadManager
import android.content.ContentValues
import android.content.Context
import android.content.res.Resources
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.pdf.PdfDocument
import android.net.Uri
import android.os.Bundle
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import android.view.Gravity
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
@ -42,6 +46,25 @@ import javax.inject.Inject
import androidx.core.graphics.toColorInt
import androidx.core.graphics.createBitmap
import androidx.core.text.layoutDirection
import com.example.fieldagent.utils.DOWNLOAD_URL
import okhttp3.OkHttpClient
import java.io.IOException
import okhttp3.ResponseBody
import retrofit2.Retrofit
import retrofit2.*
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Streaming
import retrofit2.http.Url
import java.io.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
@AndroidEntryPoint
@ -63,6 +86,7 @@ class DamageListFragment : Fragment() {
private var inspectionId=""
private var clickDeletePos=-1
private var vatValue=""
private var hashCode=""
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
@ -118,8 +142,12 @@ class DamageListFragment : Fragment() {
binding.btnExportPdf.gone()
}else{
vatValue=tempList[0].vat.toString()
hashCode=tempList[0].uniqueHash.toString()
Log.e("Checkkkschhsh==>","${hashCode}")
binding.clNoData.gone()
binding.btnExportPdf.visible()
}
tempList[0].damages?.let { it1 ->
adapter.submitList(it1)
@ -197,6 +225,18 @@ class DamageListFragment : Fragment() {
binding.btnExportPdf.setOnClickListener {
// setUpPdf()
val url = DOWNLOAD_URL+hashCode
val downloadsFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
val fileName = url.substringAfterLast('/')+".pdf"
val destinationFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName)
Log.e("cHehfehchh===>","${url}");
val success = downloadPdfFile(url, destinationFile)
/* if (success) {
Toast.makeText(context, getString(R.string.pdf_saved), Toast.LENGTH_LONG).show()
} else {
Toast.makeText(context, getString(R.string.pdf_failed), Toast.LENGTH_LONG).show()
}*/
}
}
@ -562,8 +602,97 @@ class DamageListFragment : Fragment() {
}
fun downloadPdfFile(fileUrl: String, outputFile: File) {
val okHttpClient = OkHttpClient.Builder()
.followRedirects(true)
.followSslRedirects(true)
.build()
val retrofit = Retrofit.Builder()
.baseUrl("https://example.com/") // Placeholder, overridden by @Url
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(FileDownloadService::class.java)
val call = service.downloadFile(fileUrl)
call.enqueue(object : Callback<ResponseBody> {
override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
if (!response.isSuccessful) {
println("❌ Server returned error: ${response.code()}")
return
}
val contentType = response.body()?.contentType()?.toString()
val contentLength = response.body()?.contentLength() ?: 0L
println("✅ Content-Type: $contentType")
println("✅ Content-Length: $contentLength bytes")
if (contentType?.contains("pdf", ignoreCase = true) == true) {
response.body()?.let { body ->
val success = saveFile(body, outputFile)
if (success) {
println("✅ PDF saved at: ${outputFile.absolutePath}")
} else {
println("❌ Failed to save PDF.")
}
}
} else {
println("❌ The file is not a PDF (Content-Type: $contentType).")
}
}
override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
println("❌ Download error: ${t.localizedMessage}")
}
})
}
fun saveFile(body: ResponseBody, outputFile: File): Boolean {
return try {
val inputStream = body.byteStream()
val outputStream = FileOutputStream(outputFile)
val buffer = ByteArray(4096)
var bytesRead: Int
while (inputStream.read(buffer).also { bytesRead = it } != -1) {
outputStream.write(buffer, 0, bytesRead)
}
outputStream.flush()
outputStream.close()
inputStream.close()
// Verify PDF file header
val header = FileInputStream(outputFile).use { it.readNBytes(4) }
if (String(header) != "%PDF") {
outputFile.delete()
println("❌ Invalid PDF signature in downloaded file.")
false
} else {
true
}
} catch (e: IOException) {
e.printStackTrace()
false
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
}
interface FileDownloadService {
@Streaming
@GET
fun downloadFile(@Url fileUrl: String): Call<ResponseBody>
}

View file

@ -51,6 +51,7 @@ class DamageListAdapter(val damageListFragment: DamageListFragment) : RecyclerVi
}
}
fun submitList(list: ArrayList<Damage>) {

View file

@ -10,6 +10,7 @@ import com.example.fieldagent.databinding.FillImageAdapterBinding
import com.example.fieldagent.ui.homescreen.adapter.HomeAdapter.ViewHolder
import com.example.fieldagent.utils.DateUtils.getTimeAgo
import com.example.fieldagent.utils.IMAGE_BASE_URL
import com.example.fieldagent.utils.showFullScreenImage
class ShowImageAdapter(private val images: List<String>?) : RecyclerView.Adapter<ShowImageAdapter.ShowImageHolder>() {
@ -24,6 +25,10 @@ class ShowImageAdapter(private val images: List<String>?) : RecyclerView.Adapter
.into(binding.ivUploadImage)
binding.rvImage.setOnClickListener {
showFullScreenImage(IMAGE_BASE_URL + imageUrl,binding.root.context)
}
}
}

View file

@ -117,11 +117,21 @@ class HomeFragment : Fragment() {
prefsManager.save(IS_LOGIN,true)
if (isFirstPage) {
if (viewModel.inspections.value?.data?.data?.inspections.isNullOrEmpty()) {
val hashMap = HashMap<String, String>()
hashMap[LIMIT_TEXT] = PER_PAGE_LOAD
hashMap[PAGE_TEXT] = PER_PAGE
viewModel.getInspectionList(hashMap);
}
parentFragmentManager.setFragmentResultListener("refresh_home", viewLifecycleOwner) { _, _ ->
refreshPagination()
val hashMap = HashMap<String, String>()
hashMap[LIMIT_TEXT] = PER_PAGE_LOAD
hashMap[PAGE_TEXT] = PER_PAGE
viewModel.getInspectionList(hashMap)
binding.rvList.scrollToPosition(0)
}
@ -318,6 +328,8 @@ class HomeFragment : Fragment() {
items.clear() // Clear the list on first load to prevent duplicates
items.addAll(tempList)
adapter.notifyDataSetChanged()
} else {
val oldSize = items.size
// Add only new items to avoid duplication

View file

@ -25,6 +25,7 @@ import com.example.fieldagent.utils.DateUtils.getTimeAgo
import com.example.fieldagent.utils.IMAGE_BASE_URL
import com.example.fieldagent.utils.LoadingStatus.ITEM
import com.example.fieldagent.utils.LoadingStatus.LOADING
import com.example.fieldagent.utils.showFullScreenImage
class HomeAdapter(private val fragment: HomeFragment,private val items: ArrayList<InspectionList>) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() {
@ -76,6 +77,12 @@ class HomeAdapter(private val fragment: HomeFragment,private val items: ArrayLi
.error(R.drawable.home_item) // Set a default image if the requested image fails to load
.fallback(R.drawable.home_item)
.into(binding.ivImage)
binding.ivImage.setOnClickListener {
showFullScreenImage(IMAGE_BASE_URL+item.image,binding.root.context)
}
}
}

View file

@ -14,6 +14,7 @@ const val SEARCH = "search"
const val PAGE_TEXT = "page"
const val PER_PAGE_LOAD = "10"
const val IMAGE_BASE_URL = "https://field-api.dmlabs.in/api/image/"
const val DOWNLOAD_URL = "https://field-admin.dmlabs.in/inspections/report/"

View file

@ -20,6 +20,21 @@ import com.example.fieldagent.R
fun isConnectedToInternet(context: Context, showAlert: Boolean): Boolean {
val isConnected = isConnectedToInternet(context)
if (!isConnected)
{
if(showAlert)
{
Toast.makeText(context,context.getString(R.string.check_internet),Toast.LENGTH_SHORT).show()
}
return false
}else{
return true
}
}
fun isConnectedToInternetHome(context: Context, showAlert: Boolean): Boolean {
val isConnected = isConnectedToInternet(context)
if (!isConnected)
{
Toast.makeText(context,context.getString(R.string.check_internet),Toast.LENGTH_SHORT).show()

View file

@ -1,5 +1,6 @@
package com.example.fieldagent.utils
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.graphics.Color
@ -7,6 +8,7 @@ import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.view.inputmethod.InputMethodManager
import android.widget.TextView
@ -21,6 +23,9 @@ import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody
import java.io.File
import androidx.core.net.toUri
import com.bumptech.glide.Glide
import com.example.fieldagent.databinding.DialogFullScreenImageBinding
import androidx.core.graphics.drawable.toDrawable
fun View.gone() {
@ -139,6 +144,38 @@ fun Context.showUpdateDialog(
dialog.show()
}
fun showFullScreenImage(imagePath: String, context: Context) {
val dialogBinding = DialogFullScreenImageBinding.inflate(LayoutInflater.from(context))
val dialog = AlertDialog.Builder(context, R.style.TransparentDialog)
.setView(dialogBinding.root)
.create()
val isUrl = imagePath.startsWith("http://") || imagePath.startsWith("https://")
if (isUrl) {
Glide.with(context)
.load(imagePath)
.into(dialogBinding.fullscreenImage)
} else {
Glide.with(context)
.load(imagePath.toUri())
.into(dialogBinding.fullscreenImage)
}
dialogBinding.closeButton.setOnClickListener { dialog.dismiss() }
dialog.show()
dialog.window?.setLayout(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
dialog.window?.setBackgroundDrawable(Color.TRANSPARENT.toDrawable())
}
fun hideKeyboard(fragment: Fragment) {
val inputMethodManager = fragment.requireActivity().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

View file

@ -6,11 +6,13 @@
android:layout_height="@dimen/dp_100"
android:layout_marginTop="@dimen/dp_4"
android:layout_marginEnd="@dimen/dp_16"
android:background="@drawable/line_spce_line">
>
<RelativeLayout
android:id="@+id/rlUploadImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_width="@dimen/dp_160"
android:layout_height="@dimen/dp_100"
android:background="@drawable/line_spce_line"
>
<LinearLayout
@ -53,8 +55,10 @@
android:id="@+id/cardImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
app:cardCornerRadius="@dimen/dp_4"
android:layout_margin="@dimen/dp_1"
android:elevation="0dp"
>
<ImageView

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent">
<ImageView
android:id="@+id/fullscreen_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
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>

View file

@ -7,6 +7,7 @@
android:layout_marginTop="@dimen/dp_4"
android:layout_marginEnd="@dimen/dp_16"
android:elevation="0dp"
android:layout_marginStart="@dimen/dp_8"
app:cardCornerRadius="@dimen/dp_6"
android:layout_margin="@dimen/dp_2"
android:background="@drawable/line_space_line_color">

View file

@ -178,7 +178,7 @@
android:hint="@string/please_enter_supervisor_contact_number"
android:maxLines="1"
android:inputType="number"
android:maxLength="15"
android:maxLength="11"
android:singleLine="true"
android:ellipsize="end"
android:fontFamily="@font/montserratregular"
@ -448,7 +448,7 @@
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/txtAddImage"
android:layout_marginTop="@dimen/dp_4"
android:background="@drawable/line_spce_line"
android:layout_marginBottom="@dimen/dp_20"
>
@ -471,6 +471,7 @@
android:visibility="gone"
app:cardCornerRadius="@dimen/dp_4"
android:elevation="0dp"
android:layout_margin="@dimen/dp_1"
>
<ImageView
android:id="@+id/ivSetImage"
@ -486,9 +487,10 @@
<LinearLayout
android:id="@+id/llUploadImage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_height="@dimen/dp_160"
android:orientation="vertical"
android:gravity="center"
android:background="@drawable/line_spce_line"
android:layout_centerInParent="true"
>
<ImageView

View file

@ -63,360 +63,363 @@
</RelativeLayout>
<LinearLayout
android:id="@+id/llMainItem"
<ScrollView
android:id="@+id/scrollViewContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/rlTop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/rlTop">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_item"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dropMainItem"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:endIconMode="custom"
app:endIconDrawable="@drawable/drop_down"
app:layout_constraintTop_toBottomOf="@id/llMainItem">
<AutoCompleteTextView
android:id="@+id/autoCompleteMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/rounded_edit_text_background"
android:inputType="none"
android:focusable="false"
android:clickable="true"
android:text="@string/please_select_category"
android:textSize="@dimen/sp_12"
android:fontFamily="@font/montserratregular"
/>
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:id="@+id/llSubItem"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/dropMainItem">
<LinearLayout
android:fillViewport="true"
android:scrollbars="none"
android:layout_marginBottom="@dimen/dp_20"
android:background="@color/white">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
android:background="@color/white">
<TextView
android:id="@+id/txtSubItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sub_item"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dropSubItem"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:endIconMode="custom"
app:endIconDrawable="@drawable/drop_down">
<AutoCompleteTextView
android:id="@+id/autoCompleteSub"
<LinearLayout
android:id="@+id/llMainItem"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_item"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dropMainItem"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:endIconMode="custom"
app:endIconDrawable="@drawable/drop_down"
app:layout_constraintTop_toBottomOf="@id/llMainItem">
<AutoCompleteTextView
android:id="@+id/autoCompleteMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/rounded_edit_text_background"
android:inputType="none"
android:focusable="false"
android:clickable="true"
android:text="@string/please_select_category"
android:textSize="@dimen/sp_12"
android:fontFamily="@font/montserratregular"
/>
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:id="@+id/llSubItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/dropMainItem">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:id="@+id/txtSubItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sub_item"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dropSubItem"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:endIconMode="custom"
app:endIconDrawable="@drawable/drop_down">
<AutoCompleteTextView
android:id="@+id/autoCompleteSub"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/rounded_edit_text_background"
android:inputType="none"
android:focusable="false"
android:clickable="true"
android:text=""
android:textSize="@dimen/sp_12"
android:fontFamily="@font/montserratregular"
/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llUnits"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/llSubItem"
>
<TextView
android:id="@+id/txtUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/units"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintTop_toBottomOf="@id/llSubItem"
android:textSize="@dimen/sp_14"
/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dropUnits"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<AutoCompleteTextView
android:id="@+id/autoCompleteUnits"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/rounded_edit_text_background"
android:inputType="none"
android:focusable="false"
android:clickable="true"
android:textSize="@dimen/sp_12"
android:fontFamily="@font/montserratregular"
/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llItemQuality"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/llUnits"
android:layout_marginTop="@dimen/dp_12"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/item_quantity"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
<EditText
android:id="@+id/etItemQuantity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/rounded_edit_text_background"
android:inputType="none"
android:focusable="false"
android:clickable="true"
app:layout_constraintTop_toBottomOf="@id/llItemQuality"
android:layout_marginTop="@dimen/dp_4"
android:text=""
android:textSize="@dimen/sp_12"
android:maxLength="4"
android:hint="@string/please_enter_item_quantity"
android:maxLines="1"
android:singleLine="true"
android:ellipsize="end"
android:inputType="number"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llUnits"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/llSubItem"
>
<TextView
android:id="@+id/txtUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/units"
android:fontFamily="@font/montserratregular"
android:layout_marginTop="@dimen/dp_12"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintTop_toBottomOf="@id/llSubItem"
android:textSize="@dimen/sp_14"
/>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dropUnits"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<AutoCompleteTextView
android:id="@+id/autoCompleteUnits"
<LinearLayout
android:id="@+id/llItemValue"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/rounded_edit_text_background"
android:inputType="none"
android:focusable="false"
android:clickable="true"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/etItemQuantity"
android:layout_marginTop="@dimen/dp_12"
>
android:textSize="@dimen/sp_12"
<TextView
android:id="@+id/txtItemValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/item_value"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
<EditText
android:id="@+id/etItemValue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/rounded_edit_text_background"
app:layout_constraintTop_toBottomOf="@id/llItemValue"
android:layout_marginTop="@dimen/dp_4"
android:hint="@string/please_enter_item_value"
android:maxLines="1"
android:singleLine="true"
android:inputType="number"
android:ellipsize="end"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/llImageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/etItemValue"
android:layout_marginTop="@dimen/dp_12"
>
<LinearLayout
android:id="@+id/llItemQuality"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/llUnits"
android:layout_marginTop="@dimen/dp_12"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add_image"
android:fontFamily="@font/montserratregular"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/item_quantity"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
<TextView
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvImage"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_120"
app:layout_constraintTop_toBottomOf="@id/llImageView"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:layout_marginTop="@dimen/dp_8"
android:orientation="horizontal"/>
<Button
android:id="@+id/btnReport"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_16"
app:layout_constraintTop_toBottomOf="@+id/rvImage"
android:layout_marginTop="@dimen/dp_28"
android:text="@string/add_to_report"
android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10"
android:fontFamily="@font/montserratsemibold"
android:background="@drawable/rounded_background"
android:textColor="#FFFFFF"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
<EditText
android:id="@+id/etItemQuantity"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/rounded_edit_text_background"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/llItemQuality"
android:layout_marginTop="@dimen/dp_4"
android:text=""
android:maxLength="4"
android:hint="@string/please_enter_item_quantity"
android:maxLines="1"
android:singleLine="true"
android:ellipsize="end"
android:inputType="number"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
<LinearLayout
android:id="@+id/llItemValue"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/etItemQuantity"
android:layout_marginTop="@dimen/dp_12"
>
<TextView
android:id="@+id/txtItemValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/item_value"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
<EditText
android:id="@+id/etItemValue"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/rounded_edit_text_background"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/llItemValue"
android:layout_marginTop="@dimen/dp_4"
android:hint="@string/please_enter_item_value"
android:maxLines="1"
android:singleLine="true"
android:inputType="number"
android:ellipsize="end"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
<LinearLayout
android:id="@+id/llImageView"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/etItemValue"
android:layout_marginTop="@dimen/dp_12"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/add_image"
android:fontFamily="@font/montserratregular"
android:textSize="@dimen/sp_14"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
android:fontFamily="@font/montserratregular"
android:textColor="@color/star_color"
android:textSize="@dimen/sp_14"
/>
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvImage"
android:layout_width="0dp"
android:layout_height="@dimen/dp_120"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintTop_toBottomOf="@id/llImageView"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:layout_marginTop="@dimen/dp_8"
android:orientation="horizontal"/>
<Button
android:id="@+id/btnReport"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toEndOf="@id/leftGuide"
app:layout_constraintEnd_toStartOf="@id/rightGuide"
android:textSize="@dimen/sp_16"
app:layout_constraintTop_toBottomOf="@+id/rvImage"
android:layout_marginTop="@dimen/dp_28"
android:text="@string/add_to_report"
android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10"
android:fontFamily="@font/montserratsemibold"
android:background="@drawable/rounded_background"
android:textColor="#FFFFFF"/>

View file

@ -146,6 +146,8 @@
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@+id/btnExportPdf"
android:paddingBottom="@dimen/dp_10"
/>
@ -158,14 +160,13 @@
app:layout_constraintEnd_toStartOf="@id/rightGuide"
app:layout_constraintBottom_toBottomOf="parent"
android:textSize="@dimen/sp_16"
android:layout_marginTop="@dimen/dp_28"
android:text="@string/export_pdf"
android:paddingTop="@dimen/dp_10"
android:paddingBottom="@dimen/dp_10"
android:visibility="gone"
android:fontFamily="@font/montserratsemibold"
android:background="@drawable/rounded_background"
android:layout_marginBottom="@dimen/dp_40"
android:layout_marginBottom="@dimen/dp_16"
android:textColor="#FFFFFF"/>
<LinearLayout

View file

@ -100,6 +100,7 @@
app:layout_constraintTop_toBottomOf="@+id/rlTop"
app:layout_constraintBottom_toBottomOf="parent"
android:scrollbars="none"
android:layout_marginBottom="@dimen/dp_20"
>
<LinearLayout
android:layout_width="match_parent"

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 982 B

After

Width:  |  Height:  |  Size: 928 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

View file

@ -106,6 +106,7 @@
<string name="vat">ضريبة القيمة المضافة</string>
<string name="pdf_saved">تم حفظ ملف PDF في المستندات!</string>
<string name="pdf_failed">فشل في حفظ ملف PDF!</string>
<string name="contact_number_length_error">الرجاء إدخال رقم اتصال صالح يتكون من 7 إلى 11 رقمًا</string>
<string name="please_enter_valid_password">يجب أن تتكون كلمة المرور من 6 أحرف على الأقل وتتضمن حرفًا كبيرًا واحدًا ورقمًا واحدًا وحرفًا خاصًا واحدًا</string>
<string-array name="availability">

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View file

@ -106,6 +106,8 @@
<string name="vat">VAT</string>
<string name="pdf_saved">PDF saved to Documents!</string>
<string name="pdf_failed">Failed to save PDF!</string>
<string name="contact_number_length_error">Please enter a valid contact number with 7 to 11 digits</string>
<string-array name="availability">
<item>@string/yes</item>

View file

@ -6,4 +6,12 @@
<item name="android:windowBackground">@android:color/transparent</item>
</style>
<style name="TransparentDialog" parent="Theme.AppCompat.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>