From a77f993d78791bf88811efc5103340195d1a7f03 Mon Sep 17 00:00:00 2001 From: Aryankc2 Date: Fri, 2 May 2025 17:51:28 +0530 Subject: [PATCH] issues almost done --- app/src/main/AndroidManifest.xml | 4 + app/src/main/ic_launcher-playstore.png | Bin 0 -> 31853 bytes .../fieldagent/data/apis/WebService.kt | 3 +- .../data/models/responses/InspectionData.kt | 3 + .../fieldagent/ui/addsite/AddSiteFragment.kt | 38 +- .../ui/damagedetails/DamageDetailsFragment.kt | 4 +- .../adapter/DamageDetailsAdapter.kt | 6 + .../ui/damagelist/DamageListFragment.kt | 131 +++- .../damagelist/adapter/DamageListAdapter.kt | 1 + .../ui/damagelist/adapter/ShowImageAdapter.kt | 5 + .../fieldagent/ui/homescreen/HomeFragment.kt | 14 +- .../ui/homescreen/adapter/HomeAdapter.kt | 7 + .../example/fieldagent/utils/AppConstant.kt | 1 + .../fieldagent/utils/ConnectionDetector.kt | 15 + .../fieldagent/utils/GeneralFunction.kt | 37 + .../main/res/layout/damage_image_adapter.xml | 10 +- .../res/layout/dialog_full_screen_image.xml | 24 + .../main/res/layout/fill_image_adapter.xml | 1 + app/src/main/res/layout/fragment_add_site.xml | 8 +- .../res/layout/fragment_damage_details.xml | 645 +++++++++--------- .../main/res/layout/fragment_damage_list.xml | 5 +- app/src/main/res/layout/fragment_profile.xml | 1 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 1564 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 2294 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 2964 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 928 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 1332 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 1760 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 2204 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 3354 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 4284 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 3470 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 6020 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 7114 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 3660 bytes .../ic_launcher_foreground.webp | Bin 0 -> 6362 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 8388 bytes app/src/main/res/values-ar/strings.xml | 1 + .../res/values/ic_launcher_background.xml | 4 + app/src/main/res/values/strings.xml | 2 + app/src/main/res/values/styles.xml | 8 + 43 files changed, 646 insertions(+), 342 deletions(-) create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/res/layout/dialog_full_screen_image.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 app/src/main/res/values/ic_launcher_background.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6f519f4..b9190a4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -39,11 +41,13 @@ diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..2d21e277e3cae6eaa14f6d661a803dccf57d97a1 GIT binary patch literal 31853 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 P`1epvSGD?q-OK+2cPS;Z literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/example/fieldagent/data/apis/WebService.kt b/app/src/main/java/com/example/fieldagent/data/apis/WebService.kt index 952e163..0245813 100644 --- a/app/src/main/java/com/example/fieldagent/data/apis/WebService.kt +++ b/app/src/main/java/com/example/fieldagent/data/apis/WebService.kt @@ -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*/ diff --git a/app/src/main/java/com/example/fieldagent/data/models/responses/InspectionData.kt b/app/src/main/java/com/example/fieldagent/data/models/responses/InspectionData.kt index f315b79..0f729ad 100644 --- a/app/src/main/java/com/example/fieldagent/data/models/responses/InspectionData.kt +++ b/app/src/main/java/com/example/fieldagent/data/models/responses/InspectionData.kt @@ -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, diff --git a/app/src/main/java/com/example/fieldagent/ui/addsite/AddSiteFragment.kt b/app/src/main/java/com/example/fieldagent/ui/addsite/AddSiteFragment.kt index 00814b7..1bfd694 100644 --- a/app/src/main/java/com/example/fieldagent/ui/addsite/AddSiteFragment.kt +++ b/app/src/main/java/com/example/fieldagent/ui/addsite/AddSiteFragment.kt @@ -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.) ... } } diff --git a/app/src/main/java/com/example/fieldagent/ui/damagedetails/DamageDetailsFragment.kt b/app/src/main/java/com/example/fieldagent/ui/damagedetails/DamageDetailsFragment.kt index 69e68e5..7512863 100644 --- a/app/src/main/java/com/example/fieldagent/ui/damagedetails/DamageDetailsFragment.kt +++ b/app/src/main/java/com/example/fieldagent/ui/damagedetails/DamageDetailsFragment.kt @@ -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 } diff --git a/app/src/main/java/com/example/fieldagent/ui/damagedetails/adapter/DamageDetailsAdapter.kt b/app/src/main/java/com/example/fieldagent/ui/damagedetails/adapter/DamageDetailsAdapter.kt index 25178b6..7964c1c 100644 --- a/app/src/main/java/com/example/fieldagent/ui/damagedetails/adapter/DamageDetailsAdapter.kt +++ b/app/src/main/java/com/example/fieldagent/ui/damagedetails/adapter/DamageDetailsAdapter.kt @@ -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() diff --git a/app/src/main/java/com/example/fieldagent/ui/damagelist/DamageListFragment.kt b/app/src/main/java/com/example/fieldagent/ui/damagelist/DamageListFragment.kt index 06b3e5f..5f50fb9 100644 --- a/app/src/main/java/com/example/fieldagent/ui/damagelist/DamageListFragment.kt +++ b/app/src/main/java/com/example/fieldagent/ui/damagelist/DamageListFragment.kt @@ -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 { + override fun onResponse(call: Call, response: Response) { + 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, 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 } -} \ No newline at end of file +} + +interface FileDownloadService { + @Streaming + @GET + fun downloadFile(@Url fileUrl: String): Call +} + diff --git a/app/src/main/java/com/example/fieldagent/ui/damagelist/adapter/DamageListAdapter.kt b/app/src/main/java/com/example/fieldagent/ui/damagelist/adapter/DamageListAdapter.kt index 9ff19cf..97cfc9e 100644 --- a/app/src/main/java/com/example/fieldagent/ui/damagelist/adapter/DamageListAdapter.kt +++ b/app/src/main/java/com/example/fieldagent/ui/damagelist/adapter/DamageListAdapter.kt @@ -51,6 +51,7 @@ class DamageListAdapter(val damageListFragment: DamageListFragment) : RecyclerVi } + } fun submitList(list: ArrayList) { diff --git a/app/src/main/java/com/example/fieldagent/ui/damagelist/adapter/ShowImageAdapter.kt b/app/src/main/java/com/example/fieldagent/ui/damagelist/adapter/ShowImageAdapter.kt index 9565a09..32d9c0e 100644 --- a/app/src/main/java/com/example/fieldagent/ui/damagelist/adapter/ShowImageAdapter.kt +++ b/app/src/main/java/com/example/fieldagent/ui/damagelist/adapter/ShowImageAdapter.kt @@ -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?) : RecyclerView.Adapter() { @@ -24,6 +25,10 @@ class ShowImageAdapter(private val images: List?) : RecyclerView.Adapter .into(binding.ivUploadImage) + binding.rvImage.setOnClickListener { + + showFullScreenImage(IMAGE_BASE_URL + imageUrl,binding.root.context) + } } } diff --git a/app/src/main/java/com/example/fieldagent/ui/homescreen/HomeFragment.kt b/app/src/main/java/com/example/fieldagent/ui/homescreen/HomeFragment.kt index c97e7d6..c5d4b69 100644 --- a/app/src/main/java/com/example/fieldagent/ui/homescreen/HomeFragment.kt +++ b/app/src/main/java/com/example/fieldagent/ui/homescreen/HomeFragment.kt @@ -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() hashMap[LIMIT_TEXT] = PER_PAGE_LOAD hashMap[PAGE_TEXT] = PER_PAGE viewModel.getInspectionList(hashMap); + + } + + parentFragmentManager.setFragmentResultListener("refresh_home", viewLifecycleOwner) { _, _ -> + refreshPagination() + val hashMap = HashMap() + 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 diff --git a/app/src/main/java/com/example/fieldagent/ui/homescreen/adapter/HomeAdapter.kt b/app/src/main/java/com/example/fieldagent/ui/homescreen/adapter/HomeAdapter.kt index 96ecd8f..416ca40 100644 --- a/app/src/main/java/com/example/fieldagent/ui/homescreen/adapter/HomeAdapter.kt +++ b/app/src/main/java/com/example/fieldagent/ui/homescreen/adapter/HomeAdapter.kt @@ -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) : RecyclerView.Adapter() { @@ -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) + } + } } diff --git a/app/src/main/java/com/example/fieldagent/utils/AppConstant.kt b/app/src/main/java/com/example/fieldagent/utils/AppConstant.kt index 60cc0a1..baff96b 100644 --- a/app/src/main/java/com/example/fieldagent/utils/AppConstant.kt +++ b/app/src/main/java/com/example/fieldagent/utils/AppConstant.kt @@ -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/" diff --git a/app/src/main/java/com/example/fieldagent/utils/ConnectionDetector.kt b/app/src/main/java/com/example/fieldagent/utils/ConnectionDetector.kt index d18eaf9..9adf927 100644 --- a/app/src/main/java/com/example/fieldagent/utils/ConnectionDetector.kt +++ b/app/src/main/java/com/example/fieldagent/utils/ConnectionDetector.kt @@ -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() diff --git a/app/src/main/java/com/example/fieldagent/utils/GeneralFunction.kt b/app/src/main/java/com/example/fieldagent/utils/GeneralFunction.kt index 4b443fa..a239a8f 100644 --- a/app/src/main/java/com/example/fieldagent/utils/GeneralFunction.kt +++ b/app/src/main/java/com/example/fieldagent/utils/GeneralFunction.kt @@ -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 diff --git a/app/src/main/res/layout/damage_image_adapter.xml b/app/src/main/res/layout/damage_image_adapter.xml index 16cc78d..80c4b88 100644 --- a/app/src/main/res/layout/damage_image_adapter.xml +++ b/app/src/main/res/layout/damage_image_adapter.xml @@ -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"> + > + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fill_image_adapter.xml b/app/src/main/res/layout/fill_image_adapter.xml index b16f2ed..12104de 100644 --- a/app/src/main/res/layout/fill_image_adapter.xml +++ b/app/src/main/res/layout/fill_image_adapter.xml @@ -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"> diff --git a/app/src/main/res/layout/fragment_add_site.xml b/app/src/main/res/layout/fragment_add_site.xml index d3d081a..6361e80 100644 --- a/app/src/main/res/layout/fragment_add_site.xml +++ b/app/src/main/res/layout/fragment_add_site.xml @@ -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" > - - - - - - - - - - - - - - - - - - - - - - + + android:background="@color/white"> - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - android:textSize="@dimen/sp_12" + + + + + + + + + + + - - + + - + - + + 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" + /> - + + + +