From 2fd53592e8bb935a49a41cbde830130dc02d32eb Mon Sep 17 00:00:00 2001 From: Hemant Khadase Date: Thu, 5 Jan 2023 20:33:18 +0530 Subject: [PATCH] completed image upload --- .../production/bajajfd/model/GetCodes.kt | 2 +- .../ui/fragment/StepThreeBajajFDFragment.kt | 156 +++++++++++------- .../nivesh/production/bajajfd/util/Common.kt | 22 +++ .../production/bajajfd/util/ImageUtil.kt | 27 +++ .../layout/fragment_bajajfd_step_three.xml | 2 +- 5 files changed, 148 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/com/nivesh/production/bajajfd/util/ImageUtil.kt diff --git a/app/src/main/java/com/nivesh/production/bajajfd/model/GetCodes.kt b/app/src/main/java/com/nivesh/production/bajajfd/model/GetCodes.kt index 6741a5c..0a4d577 100644 --- a/app/src/main/java/com/nivesh/production/bajajfd/model/GetCodes.kt +++ b/app/src/main/java/com/nivesh/production/bajajfd/model/GetCodes.kt @@ -2,7 +2,7 @@ package com.nivesh.production.bajajfd.model data class GetCodes( val Label: String, - val Value: String, + var Value: String, var isSelected : Boolean ) { override fun toString(): String { diff --git a/app/src/main/java/com/nivesh/production/bajajfd/ui/fragment/StepThreeBajajFDFragment.kt b/app/src/main/java/com/nivesh/production/bajajfd/ui/fragment/StepThreeBajajFDFragment.kt index 0abdaac..83f2787 100644 --- a/app/src/main/java/com/nivesh/production/bajajfd/ui/fragment/StepThreeBajajFDFragment.kt +++ b/app/src/main/java/com/nivesh/production/bajajfd/ui/fragment/StepThreeBajajFDFragment.kt @@ -6,6 +6,8 @@ import android.app.ActionBar.LayoutParams import android.app.Dialog import android.content.pm.PackageManager import android.database.Cursor +import android.graphics.Bitmap +import android.graphics.BitmapFactory import android.net.Uri import android.os.Bundle import android.provider.OpenableColumns @@ -31,24 +33,25 @@ import com.nivesh.production.bajajfd.repositories.MainRepository import com.nivesh.production.bajajfd.ui.activity.BajajFdMainActivity import com.nivesh.production.bajajfd.ui.providerfactory.StepThreeModelProviderFactory import com.nivesh.production.bajajfd.util.Common +import com.nivesh.production.bajajfd.util.Common.Companion.getFileExtension import com.nivesh.production.bajajfd.util.Constants +import com.nivesh.production.bajajfd.util.ImageUtil import com.nivesh.production.bajajfd.util.Resource import com.nivesh.production.bajajfd.viewModel.StepThreeBajajFDViewModel -import java.io.File -import java.io.FileInputStream -import java.io.IOException -import java.io.InputStream +import java.io.* + class StepThreeBajajFDFragment : BaseFragment() { + private var bitmap: Bitmap? = null private var latestTmpUri: Uri? = null private var _binding: FragmentBajajfdStepThreeBinding? = null private val binding get() = _binding!! private lateinit var listOfDocType: List - lateinit var getCodes: GetCodes + private var docValue: String = "" - private lateinit var stepThreeBajajFDViewModel: StepThreeBajajFDViewModel + private lateinit var stepThreeBajajFDViewModel: StepThreeBajajFDViewModel private lateinit var dialog: Dialog private var takeImageResult: ActivityResultLauncher? = null private var selectImageIntent: ActivityResultLauncher? = null @@ -57,24 +60,16 @@ class StepThreeBajajFDFragment : BaseFragment() { private var photoString: String = "" private var docString: String = "" private var docString2: String = "" - private var panFileExt: String? = "" private var photoFileExt: String? = "" private var doc1FileExt: String? = "" private var doc2fileExt: String? = "" - private var uniqueId: String? = "" - - // private var actionType: AccountCaptureType? = null -// -// enum class AccountCaptureType { -// MAIN_PAN_UPLOAD, MAIN_PHOTO_UPLOAD, FIRST_UPLOAD, SECOND_UPLOAD -// } - val MAIN_PAN_UPLOAD: Int = 1 - val MAIN_PHOTO_UPLOAD: Int = 2 - val FIRST_UPLOAD: Int = 3 - val SECOND_UPLOAD: Int = 4 - var actionType: Int = -1 + private val MAIN_PAN_UPLOAD: Int = 1 + private val MAIN_PHOTO_UPLOAD: Int = 2 + private val FIRST_UPLOAD: Int = 3 + private val SECOND_UPLOAD: Int = 4 + private var actionType: Int = -1 private val requestPermission = registerForActivityResult( ActivityResultContracts.RequestPermission() @@ -105,7 +100,8 @@ class StepThreeBajajFDFragment : BaseFragment() { selectImageIntent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> if (uri != null) { - uploadDocument(uri) + bitmap = uriToBitmap(uri) + uploadDocument(uri,"g") } } @@ -113,7 +109,7 @@ class StepThreeBajajFDFragment : BaseFragment() { registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess -> if (isSuccess) { latestTmpUri?.let { uri -> - uploadDocument(uri) + uploadDocument(uri,"c") } } } @@ -122,7 +118,7 @@ class StepThreeBajajFDFragment : BaseFragment() { if (validate()) { uploadDocApi( "PAN", - "data:image/.".plus(panFileExt).plus(";base64").plus(panString), + "data:image/".plus(panFileExt).plus(";base64, ").plus(panString), 1 ) } @@ -153,7 +149,8 @@ class StepThreeBajajFDFragment : BaseFragment() { binding.spDocType.onItemClickListener = AdapterView.OnItemClickListener { parent, _, position, _ -> - getCodes = parent.getItemAtPosition(position) as GetCodes + val getCodes : GetCodes = parent.getItemAtPosition(position) as GetCodes + docValue = getCodes.Value docString = "" docString2 = "" when (getCodes.Label) { @@ -235,7 +232,7 @@ class StepThreeBajajFDFragment : BaseFragment() { dialog.window?.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) } - private fun setOtherUploadLayout(itemName: String) { + private fun setOtherUploadLayout(itemName: String?) { binding.tvAadhaarFront.text = itemName.plus(" Front *") if (binding.tvAadhaarBack.visibility == View.VISIBLE) binding.tvAadhaarBack.visibility = View.INVISIBLE @@ -254,78 +251,104 @@ class StepThreeBajajFDFragment : BaseFragment() { binding.btnAadhaarFrontUpload.visibility = View.VISIBLE } - private fun uploadDocument(uri: Uri) { + private fun uploadDocument(uri: Uri,type: String) { when (actionType) { MAIN_PAN_UPLOAD -> { binding.ivPan.visibility = View.VISIBLE val fileDir: File = requireActivity().cacheDir val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri))) - panFileExt = fileExtension.extension - encodedPANBase64(fileExtension) + panFileExt = getFileExtension(getFileName(uri)) + val size : Double = Common.getFileSizeInMB(fileExtension.length()) + if (size < 5){ + if(type == "c") encodedPANBase64(fileExtension) + else panString = bitmap?.let { ImageUtil.convert(it) }.toString() + } else{ + panString = "" + panFileExt = "" + } } MAIN_PHOTO_UPLOAD -> { binding.ivPhotograph.visibility = View.VISIBLE binding.ivPan.visibility = View.VISIBLE val fileDir: File = requireActivity().cacheDir val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri))) - photoFileExt = fileExtension.extension - encodedPhotoBase64(fileExtension) + photoFileExt = getFileExtension(getFileName(uri)) + val size : Double = Common.getFileSizeInMB(fileExtension.length()) + if (size < 5) { + if (type == "c") encodedPhotoBase64(fileExtension) + else photoString = bitmap?.let { ImageUtil.convert(it) }.toString() + }else{ + photoString = "" + photoFileExt = "" + } } FIRST_UPLOAD -> { binding.ivAadharFront.visibility = View.VISIBLE val fileDir: File = requireActivity().cacheDir val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri))) - doc1FileExt = fileExtension.extension - encodedUpload1Base64(fileExtension) + doc1FileExt = getFileExtension(getFileName(uri)) + val size : Double = Common.getFileSizeInMB(fileExtension.length()) + if (size < 5) { + if (type == "c") encodedUpload1Base64(fileExtension) + else docString = bitmap?.let { ImageUtil.convert(it) }.toString() + }else{ + docString = "" + doc1FileExt = "" + } } else -> { binding.ivAadharBack.visibility = View.VISIBLE val fileDir: File = requireActivity().cacheDir val fileExtension = File(fileDir.toString().plus("/").plus(getFileName(uri))) - doc2fileExt = fileExtension.extension - encodedFileToBase64(fileExtension) + doc2fileExt = getFileExtension(getFileName(uri)) + val size : Double = Common.getFileSizeInMB(fileExtension.length()) + if (size < 5) { + if (type == "c") encodedFileToBase64(fileExtension) + else docString2 = bitmap?.let { ImageUtil.convert(it) }.toString() + }else{ + docString2 = "" + doc2fileExt = "" + } } } } - private fun encodedPANBase64(fileName: File?) { + + + private fun encodedPANBase64(fileName: File) { panString = try { - val bytes: ByteArray? = fileName?.let { loadFile(it) } - Base64.encodeToString(bytes, Base64.DEFAULT).trim { it <= ' ' } - .replace("\n".toRegex(), "").replace("\\s+".toRegex(), "") + val bytes: ByteArray = loadFile(fileName) + Base64.encodeToString(bytes, Base64.DEFAULT).trim().replace("\n", "").replace("\\s+", "") } catch (e: Exception) { e.printStackTrace() "" } } - private fun encodedPhotoBase64(fileName: File?) { + private fun encodedPhotoBase64(fileName: File) { photoString = try { - val bytes: ByteArray? = fileName?.let { loadFile(it) } - Base64.encodeToString(bytes, Base64.DEFAULT).trim { it <= ' ' } - .replace("\n".toRegex(), "").replace("\\s+".toRegex(), "") + val bytes: ByteArray = loadFile(fileName) + Base64.encodeToString(bytes, Base64.DEFAULT).trim().replace("\n", "").replace("\\s+", "") } catch (e: Exception) { e.printStackTrace() "" } } - private fun encodedUpload1Base64(fileName: File?) { + private fun encodedUpload1Base64(fileName: File) { docString = try { - val bytes: ByteArray? = fileName?.let { loadFile(it) } - Base64.encodeToString(bytes, Base64.DEFAULT).trim { it <= ' ' } - .replace("\n".toRegex(), "").replace("\\s+".toRegex(), "") + val bytes: ByteArray = loadFile(fileName) + Base64.encodeToString(bytes, Base64.DEFAULT).trim().replace("\n", "").replace("\\s+", "") } catch (e: Exception) { e.printStackTrace() "" } } - private fun encodedFileToBase64(fileName: File?) { + private fun encodedFileToBase64(fileName: File) { docString2 = try { - val bytes: ByteArray? = fileName?.let { loadFile(it) } - Base64.encodeToString(bytes, Base64.DEFAULT).trim { it <= ' ' } - .replace("\n".toRegex(), "").replace("\\s+".toRegex(), "") + val bytes: ByteArray = loadFile(fileName) + Base64.encodeToString(bytes, Base64.DEFAULT).trim().replace("\n", "").replace("\\s+", "") } catch (e: Exception) { e.printStackTrace() "" @@ -378,22 +401,22 @@ class StepThreeBajajFDFragment : BaseFragment() { if (uploadPosition == 1) { uploadDocApi( "Photograph", - "data:image/.".plus(photoFileExt).plus(";base64") + "data:image/".plus(photoFileExt).plus(";base64, ") .plus(photoString), 2 ) } else if (uploadPosition == 2) { uploadDocApi( - getCodes.Value, - "data:image/.".plus(doc1FileExt).plus(";base64") + docValue, + "data:image/".plus(doc1FileExt).plus(";base64, ") .plus(docString), 3 ) } else if (uploadPosition == 3) { - if (getCodes.Value == "Aadhar") { + if (docValue == "Aadhar") { uploadDocApi( - getCodes.Value, - "data:image/.".plus(doc2fileExt).plus(";base64") + docValue, + "data:image/".plus(doc2fileExt).plus(";base64, ") .plus(docString2), 4 ) @@ -409,7 +432,7 @@ class StepThreeBajajFDFragment : BaseFragment() { else -> { Common.showDialogValidation( activity as BajajFdMainActivity, - getUploadResponse.Response.Message + getUploadResponse.Response.Errors[0].ErrorMessage ) } } @@ -513,7 +536,9 @@ class StepThreeBajajFDFragment : BaseFragment() { adapter.getItem(0)?.Value, false ) - setOtherUploadLayout(listOfDocType[0].Value) + setOtherUploadLayout(adapter.getItem(0)?.Value) + docValue = adapter.getItem(0)?.Value.toString() + } } // 650 -> refreshToken() @@ -560,10 +585,10 @@ class StepThreeBajajFDFragment : BaseFragment() { } else if (docString.isEmpty()) { Common.showDialogValidation( activity as BajajFdMainActivity, - "Upload " + getCodes.Value + " Image" + "Upload $docValue Image" ) return false - } else if (getCodes.Value == "Aadhar" && docString2.isEmpty()) { + } else if (docValue == "Aadhar" && docString2.isEmpty()) { Common.showDialogValidation( activity as BajajFdMainActivity, "Upload Aadhar Back Image" @@ -605,4 +630,17 @@ class StepThreeBajajFDFragment : BaseFragment() { fun displayReceivedData(createFDApplicationResponse: CreateFDApplicationResponse) { uniqueId = createFDApplicationResponse.Response.FDCreationDetailsResponse.UniqueId } + + private fun uriToBitmap(selectedFileUri: Uri): Bitmap? { + try { + val parcelFileDescriptor = requireActivity().contentResolver.openFileDescriptor(selectedFileUri, "r") + val fileDescriptor: FileDescriptor = parcelFileDescriptor!!.fileDescriptor + val image = BitmapFactory.decodeFileDescriptor(fileDescriptor) + parcelFileDescriptor.close() + return image + } catch (e: IOException) { + e.printStackTrace() + } + return null + } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/bajajfd/util/Common.kt b/app/src/main/java/com/nivesh/production/bajajfd/util/Common.kt index 9d5bc8b..779be5d 100644 --- a/app/src/main/java/com/nivesh/production/bajajfd/util/Common.kt +++ b/app/src/main/java/com/nivesh/production/bajajfd/util/Common.kt @@ -8,6 +8,7 @@ import android.graphics.drawable.GradientDrawable import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.os.Build +import android.os.Environment import android.provider.ContactsContract import android.text.format.DateFormat import android.util.Patterns @@ -18,6 +19,7 @@ import com.google.gson.JsonObject import com.nivesh.production.bajajfd.R import kotlinx.coroutines.CoroutineExceptionHandler import retrofit2.HttpException +import java.io.File import java.io.IOException import java.text.SimpleDateFormat import java.util.* @@ -233,5 +235,25 @@ class Common { minAdultAge.add(Calendar.YEAR, -18) return minAdultAge.before(userAge) } + + /* this function is used for file size in readable formate(End)*/ + fun getFileSizeInMB(length: Long): Double { + // Get length of file in bytes + val fileSizeInBytes = length.toDouble() + // Convert the bytes to Kilobytes (1 KB = 1024 Bytes) + val fileSizeInKB = fileSizeInBytes / 1024 + // Convert the KB to MegaBytes (1 MB = 1024 KBytes) + return fileSizeInKB / 1024 + } + + fun getFileExtension(name: String): String { + val index = name.lastIndexOf('.') + return if (index > 0) { + name.substring(index + 1) + } else { + "" + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/nivesh/production/bajajfd/util/ImageUtil.kt b/app/src/main/java/com/nivesh/production/bajajfd/util/ImageUtil.kt new file mode 100644 index 0000000..0d1340f --- /dev/null +++ b/app/src/main/java/com/nivesh/production/bajajfd/util/ImageUtil.kt @@ -0,0 +1,27 @@ +package com.nivesh.production.bajajfd.util + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.util.Base64; +import java.io.ByteArrayOutputStream; + + +class ImageUtil { + + @Throws(IllegalArgumentException::class) + fun convert(base64Str: String): Bitmap? { + val decodedBytes: ByteArray = Base64.decode( + base64Str.substring(base64Str.indexOf(",") + 1), + Base64.DEFAULT + ) + return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size) + } + + companion object { + fun convert(bitmap: Bitmap): String? { + val outputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + return Base64.encodeToString(outputStream.toByteArray(), Base64.DEFAULT) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_bajajfd_step_three.xml b/app/src/main/res/layout/fragment_bajajfd_step_three.xml index 9467bfd..a0ef82f 100644 --- a/app/src/main/res/layout/fragment_bajajfd_step_three.xml +++ b/app/src/main/res/layout/fragment_bajajfd_step_three.xml @@ -109,7 +109,7 @@ android:textColor="@color/black" app:layout_constraintBottom_toTopOf="@+id/btnPhotoUpload" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.925" + app:layout_constraintHorizontal_bias="0.78" app:layout_constraintStart_toEndOf="@+id/tvPAN" app:layout_constraintTop_toBottomOf="@+id/tvUploadKYCDocument" tools:ignore="DuplicateSpeakableTextCheck" />