Advertisement
Vassa007

EntryNilai

Dec 26th, 2024
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 23.00 KB | None | 0 0
  1. package com.siakad.lecturer.menu.nilai.detail
  2.  
  3. import android.Manifest
  4. import android.app.Activity
  5. import android.content.Context
  6. import android.content.DialogInterface
  7. import android.content.Intent
  8. import android.content.pm.PackageManager
  9. import android.net.Uri
  10. import android.os.AsyncTask
  11. import android.os.Build
  12. import android.os.Bundle
  13. import android.os.Environment
  14. import android.util.Log
  15. import android.view.LayoutInflater
  16. import android.view.ViewGroup
  17. import android.webkit.MimeTypeMap
  18. import androidx.annotation.RequiresApi
  19. import androidx.appcompat.app.AlertDialog
  20. import androidx.appcompat.app.AppCompatActivity
  21. import androidx.core.app.ActivityCompat
  22. import androidx.core.content.ContextCompat
  23. import androidx.core.content.FileProvider
  24. import androidx.navigation.fragment.findNavController
  25. import androidx.recyclerview.widget.LinearLayoutManager
  26. import com.google.android.material.dialog.MaterialAlertDialogBuilder
  27. import com.siakad.lecturer.R
  28. import com.siakad.lecturer.activity.base.BaseFragment
  29. import com.siakad.lecturer.activity.dashboard.kehadiran.EntryNilaiAdapter
  30. import com.siakad.lecturer.config.connection.Resource
  31. import com.siakad.lecturer.config.crypts.EncDec
  32. import com.siakad.lecturer.config.endpoint.Nilai
  33. import com.siakad.lecturer.config.response.ResponseModel
  34. import com.siakad.lecturer.config.util.*
  35. import com.siakad.lecturer.databinding.FragmentEntryNilaiBinding
  36. import com.siakad.lecturer.menu.nilai.detail.upload.FormUpload
  37. import kotlinx.coroutines.flow.first
  38. import kotlinx.coroutines.runBlocking
  39. import okhttp3.MediaType
  40. import okhttp3.MultipartBody
  41. import okhttp3.RequestBody
  42. import okhttp3.ResponseBody
  43. import org.json.JSONObject
  44. import java.io.*
  45.  
  46. class EntryNilaiFragment : BaseFragment<EntryNilaiViewModel, FragmentEntryNilaiBinding, EntryNilaiRepository>(),
  47.         EntryNilaiAdapter.OnItemClickListener{
  48.     private val TAG = "EntryNilaiFragment"
  49.     val sp_nilaihuruf = arrayOf("A", "AB", "B", "BC", "C", "D", "E")
  50.  
  51.     //Tak Push Bang
  52.  
  53.     private var nilai = ""
  54.     private var nilaiganti = ""
  55.  
  56.     private var nim = ""
  57.     private var thnakademik = ""
  58.     private var idmatakuliah = ""
  59.     private var nilaibaru = ""
  60.     private var idkelas = ""
  61.  
  62.     private var kelas = ""
  63.  
  64.     private val NILAI_PICK = 111
  65.     private val REQUEST_STORAGE_PERMISSION = 101
  66.  
  67.     var select_file: String? = null
  68.     var kind = 0
  69.  
  70.  
  71.     override fun onActivityCreated(savedInstanceState: Bundle?) {
  72.         super.onActivityCreated(savedInstanceState)
  73.  
  74.         val tokens = runBlocking { userPrefrences.authToken.first()}
  75.         (activity as AppCompatActivity).setSupportActionBar(binding.topAppBar)
  76.         binding.topAppBar.apply {
  77.             navigationIcon = ContextCompat.getDrawable(context, R.drawable.ic_back)
  78.             setNavigationOnClickListener {
  79.                 findNavController().popBackStack()
  80.             }
  81.         }
  82.  
  83.         kelas = "${arguments?.getString("kelas")}"
  84.  
  85.         binding.btDownload.setOnClickListener {
  86.             if (hasReadPermission()) {
  87.                 downloadNilai()
  88.             } else {
  89.                 context?.let { it1 ->
  90.                     AlertDialogManager.DialogPermisssion(it1, ".")
  91.                             .setPositiveButton(
  92.                                     "Aktifkan".toLowerCase()
  93.                             ) { dialog: DialogInterface, which: Int ->
  94.                                 ActivityCompat.requestPermissions(
  95.                                         context as Activity,
  96.                                         arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
  97.                                         REQUEST_STORAGE_PERMISSION
  98.                                 )
  99.                                 dialog.dismiss()
  100.                             }.show()
  101.                 }
  102.             }
  103.         }
  104.  
  105.         binding.btUpload.setOnClickListener {
  106.  
  107.             when(kind) {
  108.                 0 -> {
  109.                     if (hasReadPermission()) {
  110.                         pick_file()
  111.                     } else {
  112.                         AlertDialogManager.DialogPermisssion(requireContext(), ".")
  113.                                 .setPositiveButton(
  114.                                         "Aktifkan".toLowerCase()
  115.                                 ) { dialog: DialogInterface, which: Int ->
  116.                                     ActivityCompat.requestPermissions(requireActivity(),
  117.                                             arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
  118.                                             REQUEST_STORAGE_PERMISSION)
  119.                                     dialog.dismiss()
  120.                                 }.show()
  121.                     }
  122.                 }
  123.                 1 -> {
  124.                     val bottomSheetFragment = FormUpload()
  125.                     bottomSheetFragment.show(requireActivity().supportFragmentManager, bottomSheetFragment.tag)
  126.                 }
  127.             }
  128.  
  129.         }
  130.  
  131.         nilaiPeserta()
  132.  
  133.     }
  134.  
  135.     private fun nilaiPeserta(){
  136.         try {
  137.             val jsonOb = JSONObject()
  138.             jsonOb.put("idkelas", arguments?.getString("idkelas"))
  139.  
  140.             Log.e(TAG, "idkelase: ${arguments?.getString("idkelas")}")
  141.            
  142.             val param = EncDec().toEncrypt(jsonOb.toString())
  143.             val streams = param?.replace("\\n", "")
  144.  
  145.             streams?.let { it -> viewModel.nilaiModel(it) }
  146.             val progressDialogManager = context?.let { it -> ProgressDialogManager(it).loader("Sedang memuat data") }
  147.             viewModel.nilaiPesertaResponse.observe(viewLifecycleOwner) {
  148.                 when (it) {
  149.                     is Resource.Loading -> progressDialogManager?.show()
  150.                     is Resource.Success -> {
  151.                         val responseModel: ResponseModel = it.value
  152.                         val decrypt = EncDec().toDerypt(responseModel.streams)
  153.                         Log.e(TAG, "nilaiPeserta: $decrypt", )
  154.                         val jsonObject = JSONObject(decrypt)
  155.                         val jsonArray = jsonObject.getJSONArray("data")
  156.                         thnakademik = jsonObject.getString("thnakademik")
  157.                         idmatakuliah = jsonObject.getString("idmatakuliah")
  158.  
  159.  
  160.                         val list = ArrayList<EntryNilaiPesertaModel>()
  161.                         for (i in 0 until jsonArray.length()) {
  162.                             val model = EntryNilaiPesertaModel(
  163.  
  164.                                 jsonArray.getJSONObject(i).getString("nama"),
  165.                                 jsonArray.getJSONObject(i).getString("penginput"),
  166.                                 jsonArray.getJSONObject(i).getString("idkelas"),
  167.                                 jsonArray.getJSONObject(i).getString("nim"),
  168.                                 jsonArray.getJSONObject(i).getString("namaprogramstudi"),
  169.                                 jsonArray.getJSONObject(i).getString("nilaihuruf"),
  170.                                 jsonArray.getJSONObject(i).getString("stskehadiran")
  171.  
  172.                             )
  173.                             list.add(model)
  174.                         }
  175.  
  176.                         val entryNilaiAdapter = context?.let { it -> EntryNilaiAdapter(it, list) }
  177.                         binding.rcEntryNilai.apply {
  178.                             layoutManager = LinearLayoutManager(
  179.                                 context,
  180.                                 LinearLayoutManager.VERTICAL,
  181.                                 false
  182.                             )
  183.                             setHasFixedSize(true)
  184.                             adapter = entryNilaiAdapter
  185.                         }
  186.  
  187.                         entryNilaiAdapter?.setOnItemClickListener(this)
  188.                         progressDialogManager?.dismiss()
  189.                     }
  190.  
  191.                     is Resource.Failure -> {
  192.                         progressDialogManager?.dismiss()
  193.                         handleApiError(it)
  194.                     }
  195.                 }
  196.             }
  197.  
  198.         } catch (e: Exception){
  199.             e.printStackTrace()
  200.         }
  201.     }
  202.  
  203.     override fun onItemClick(item: EntryNilaiAdapter.ViewHolder?, position: Int) {
  204.         val alertDialog = AlertDialog.Builder(requireContext())
  205.  
  206.         alertDialog.setTitle("Rubah Nilai")
  207.         alertDialog.setSingleChoiceItems(sp_nilaihuruf, -1) { _, which ->
  208.             nilaiganti = sp_nilaihuruf[which]
  209.         }
  210.         alertDialog.setPositiveButton("OK") { dialog, which ->
  211.             nilaibaru = nilaiganti
  212.             nim = item!!.parent.getNim()
  213.             idkelas = item.parent.getIdKelas()
  214.             gantiNilaiPeserta()
  215.             Log.e("TAG", "onItemClick nim: " + item.parent.getNim())
  216.         }
  217.         alertDialog.setNegativeButton("Tutup") { dialog, which ->
  218.             dialog.dismiss()
  219.         }
  220.  
  221.         if (nilai == "0") {
  222.             alertNoEdit()
  223.         } else {
  224.             alertDialog.show()
  225.         }
  226.  
  227.     }
  228.  
  229.     private fun alertNoEdit() {
  230.         val alertDialog = AlertDialog.Builder(requireContext())
  231.         alertDialog.setTitle("Rubah Nilai")
  232.         alertDialog.setMessage("Tidak Bisa Merubah Nilai")
  233.         alertDialog.setPositiveButton("Ok") { dialogInterface, i -> dialogInterface.dismiss() }
  234.         alertDialog.show()
  235.     }
  236.  
  237.     private fun gantiNilaiPeserta(){
  238.         try {
  239.             val jsonObject = JSONObject()
  240.             jsonObject.put("idkelas", idkelas)
  241.             jsonObject.put("nim", nim)
  242.             jsonObject.put("thnakademik", thnakademik)
  243.             jsonObject.put("idmatakuliah", idmatakuliah)
  244.             jsonObject.put("nilai", nilaibaru)
  245.  
  246.             Log.e(TAG, "AKUSOPO?: $jsonObject", )
  247.  
  248.             val param = EncDec().toEncrypt(jsonObject.toString())
  249.             val streams = param?.replace("\\n", "")
  250.  
  251.             streams?.let { it -> viewModel.gantiNilaiModel(it) }
  252.             val progressDialogManager = context?.let { it -> ProgressDialogManager(it).loader("Sedang mengirim data") }
  253.             viewModel.gantinilaiPesertaResponse.observe(viewLifecycleOwner) {
  254.                 when (it) {
  255.                     is Resource.Loading -> progressDialogManager?.show()
  256.                     is Resource.Success -> {
  257.                         val responseModel: ResponseModel = it.value
  258.                         val decrypt = EncDec().toDerypt(responseModel.streams)
  259.                         val message = responseModel.message
  260.  
  261. //                        context?.let { it ->
  262. //                            MaterialAlertDialogBuilder(it)
  263. //                                .setTitle("Siakad Lecturer")
  264. //                                .setMessage(message)
  265. //                                .setCancelable(false)
  266. //                                .setPositiveButton("Ok") { dialog, which ->
  267. ////                                    findNavController().navigate(R.id.action_entryNilaiFragment_self)
  268. //                                    nilaiPeserta()
  269. //                                    dialog.dismiss()
  270. //                                }
  271. //                                .show()
  272. //                        }
  273.                         progressDialogManager?.dismiss()
  274.                         nilaiPeserta()
  275.                         requireView().snackbar(message)
  276.                     }
  277.  
  278.                     is Resource.Failure -> {
  279.                         progressDialogManager?.dismiss()
  280.                         handleApiError(it)
  281.                     }
  282.                 }
  283.             }
  284.  
  285.         } catch (e: Exception){
  286.             e.printStackTrace()
  287.         }
  288.     }
  289.  
  290.     private fun downloadNilai() {
  291.         try {
  292.             val jsonOb = JSONObject()
  293.             jsonOb.put("idmatakuliah", idmatakuliah)
  294.             jsonOb.put("idkelas", arguments?.getString("idkelas"))
  295.  
  296.             Log.e(TAG, "downloadNilai: $idmatakuliah", )
  297.  
  298.             val param = EncDec().toEncrypt(jsonOb.toString())
  299.             val streams = param?.replace("\\n", "")
  300.  
  301.             streams?.let { it -> viewModel.downloadNilaiModel(it) }
  302.             val progressDialogManager = context?.let { it -> ProgressDialogManager(it).loader("Sedang mendownload nilai") }
  303.             viewModel.downloadNilaiResponse.observe(viewLifecycleOwner) {
  304.                 when (it) {
  305.  
  306.                     is Resource.Loading -> progressDialogManager?.show()
  307.                     is Resource.Success -> {
  308.                         val responseBody: ResponseBody = it.value
  309.  
  310.                         val downloadFileAsyncTask = DownloadFileAsyncTask(
  311.                             context as Activity,
  312.                             "$kelas ${System.currentTimeMillis()}",
  313.                             ".xlsx"
  314.                         )
  315.                         downloadFileAsyncTask.execute(responseBody.byteStream())
  316.  
  317.  
  318.                         progressDialogManager?.dismiss()
  319.                     }
  320.  
  321.                     is Resource.Failure -> {
  322.                         progressDialogManager?.dismiss()
  323.                         handleApiError(it)
  324.                     }
  325.                 }
  326.             }
  327.  
  328.         } catch (e: Exception){
  329.             e.printStackTrace()
  330.         }
  331.     }
  332.  
  333.     private class DownloadFileAsyncTask(
  334.             val activity: Activity,
  335.             file_name: String?,
  336.             format: String?
  337.     ) : AsyncTask<InputStream, Void, Boolean>() {
  338.         var builder: MaterialAlertDialogBuilder? = null
  339.         val appDirectoryName = "SML_File"
  340.         val jurnalFile = File(
  341.                 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
  342.                 appDirectoryName
  343.         )
  344.  
  345.         val ext = format
  346.         val filename = file_name
  347.         override fun doInBackground(vararg params: InputStream?): Boolean {
  348.             if(!jurnalFile.isDirectory) {
  349.                 jurnalFile.mkdirs() // create Folder
  350.             }
  351.             val inputStream = params[0]!!
  352.             val file = File(jurnalFile, "$filename$ext")
  353.  
  354.             var output: OutputStream? = null
  355.  
  356.             try {
  357.                 output = FileOutputStream(file)
  358.                 val buffer = ByteArray(1024)
  359.                 var read: Int
  360.                 Log.d("TAG", "nyimpen >> $jurnalFile/$filename")
  361.                 while (inputStream.read(buffer).also { read = it } != -1) {
  362.                     output.write(buffer, 0, read)
  363.                 }
  364.                 output.flush()
  365.  
  366.             } catch (e: IOException) {
  367.                 e.printStackTrace()
  368.  
  369.                 return false
  370.             } finally {
  371.                 try {
  372.                     if (output != null) {
  373.                         output.close()
  374.  
  375.                     } else {
  376.                         Log.d("TAG", "Output stream e null")
  377.                     }
  378.                 } catch (e: IOException) {
  379.                     Log.e("TAG", ">> " + e.message)
  380.                     e.printStackTrace()
  381.                     return false
  382.                 }
  383.             }
  384.             return true
  385.         }
  386.  
  387.         override fun onPostExecute(result: Boolean?) {
  388.             super.onPostExecute(result)
  389.             MaterialAlertDialogBuilder(activity)
  390.                     .setTitle(R.string.app_name)
  391.                     .setIcon(R.mipmap.ic_launcher)
  392.                     .setMessage("Jurnal $filename Berhasil di download")
  393.                     .setPositiveButton("Buka File") { dialog, which ->
  394.                         openFiles()
  395.                     }
  396.                     .setNegativeButton("Nanti saja") { dialog, which ->
  397.                         dialog.dismiss()
  398.                     }
  399.                     .show()
  400.         }
  401.  
  402.         fun openFiles() {
  403.             val appDirectoryName = "SML_File"
  404.             val file = File(
  405.                     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
  406.                     "$appDirectoryName/$filename$ext"
  407.             )
  408.             Log.e("ape mbukak iki ==>", "" + file)
  409.  
  410.             val uri = FileProvider.getUriForFile(
  411.                     activity,
  412.                     "com.siakad.lecturer.fileprovider",
  413.                     file
  414.             )
  415.             Log.e("create pdf uri path==>", "" + uri)
  416.  
  417.  
  418.             val intent = Intent(Intent.ACTION_VIEW)
  419.             intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
  420.             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
  421.             if (file.toString().contains(".doc") || file.toString().contains(".docx")) {
  422.                 // Word document
  423.                 intent.setDataAndType(uri, "application/msword")
  424.             } else if(file.toString().contains(".pdf")) {
  425.                 // PDF file
  426.                 intent.setDataAndType(uri, "application/pdf")
  427.             } else if(file.toString().contains(".ppt") || file.toString().contains(".pptx")) {
  428.                 // Powerpoint file
  429.                 intent.setDataAndType(uri, "application/vnd.ms-powerpoint")
  430.             } else if(file.toString().contains(".xls") || file.toString().contains(".xlsx")) {
  431.                 // Excel file
  432.                 intent.setDataAndType(uri, "application/vnd.ms-excel")
  433.             } else if(file.toString().contains(".jpg") || file.toString().contains(".jpeg")) {
  434.                 // jpeg/jpg file
  435.                 intent.setDataAndType(uri, "image/jpeg")
  436.             } else {
  437.                 intent.setDataAndType(uri, "*/*")
  438.             }
  439.             activity.startActivity(Intent.createChooser(intent, "Buka Jurnal $filename"))
  440.         }
  441.  
  442.     }
  443.  
  444.     private fun hasReadPermission(): Boolean {
  445.         return context?.let { ActivityCompat.checkSelfPermission(
  446.                 it,
  447.                 Manifest.permission.WRITE_EXTERNAL_STORAGE
  448.         ) } == PackageManager.PERMISSION_GRANTED
  449.     }
  450.  
  451.     override fun onRequestPermissionsResult(
  452.             requestCode: Int,
  453.             permissions: Array<out String>,
  454.             grantResults: IntArray
  455.     ) {
  456.         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  457.         if (requestCode == REQUEST_STORAGE_PERMISSION) {
  458.             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  459.                 downloadNilai()
  460.             }
  461.         }
  462.     }
  463.  
  464.     override fun getViewModel() = EntryNilaiViewModel::class.java
  465.  
  466.     private fun pick_file() {
  467.         val intent = Intent()
  468.         intent.type = "*/*"
  469.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  470.             intent.action = Intent.ACTION_OPEN_DOCUMENT
  471.         } else {
  472.             intent.action = Intent.ACTION_OPEN_DOCUMENT
  473.         }
  474.  
  475.         intent.addCategory(Intent.CATEGORY_OPENABLE)
  476.         intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true)
  477.         startActivityForResult(Intent.createChooser(intent, "Select a file"), NILAI_PICK)
  478.     }
  479.  
  480.     override fun getFragmentBinding(
  481.             inflater: LayoutInflater,
  482.             container: ViewGroup?
  483.     ) = FragmentEntryNilaiBinding.inflate(inflater, container, false)
  484.  
  485.     override fun getFragmentRepository(): EntryNilaiRepository {
  486.         val token = runBlocking { userPrefrences.authToken.first()  }
  487.         val api = clientRemote.buildApi(Nilai::class.java, token)
  488.         return EntryNilaiRepository(api)
  489.     }
  490.  
  491.     @RequiresApi(Build.VERSION_CODES.KITKAT)
  492.     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  493.         super.onActivityResult(requestCode, resultCode, data)
  494.         if (requestCode == NILAI_PICK && resultCode == AppCompatActivity.RESULT_OK) {
  495.             val selectedFileUri = data?.data //The uri with the location of the file
  496.             val takeFlags = data?.flags?.and((Intent.FLAG_GRANT_READ_URI_PERMISSION
  497.                     or Intent.FLAG_GRANT_WRITE_URI_PERMISSION))
  498.  
  499.             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  500.                 if (selectedFileUri != null) {
  501.                     requireActivity().contentResolver.takePersistableUriPermission(selectedFileUri, takeFlags!!)
  502.                 }
  503.             }
  504.  
  505.             var uriString: String  = selectedFileUri.toString()
  506.             val file = File(uriString)
  507.  
  508.             val path: String = FileUtils.getPath(context, selectedFileUri)
  509.             uploadNilai(selectedFileUri)
  510.         }
  511.     }
  512.  
  513.     private fun uploadNilai(path: Uri?) {
  514.         try {
  515.  
  516.             Log.e(TAG, "onActivityResult: ${context?.let { path?.let { it1 -> fileFromContentUri(it, it1) } }}" )
  517.             val mFile = RequestBody.create(MediaType.parse("application/vnd.ms-excel"), context?.let { path?.let { it1 -> fileFromContentUri(it, it1) } })
  518.             val excelUpload = MultipartBody.Part.createFormData("template", context?.let { FileUtils.getFileName(it, path) }, mFile)
  519.             val idmatakuliah = RequestBody.create(MediaType.parse("text/plain"), idmatakuliah)
  520.             val idstafdosen = RequestBody.create(MediaType.parse("text/plain"), runBlocking { userPrefrences.idStafDosenFlow.first() })
  521.  
  522.  
  523.             viewModel.uploadNilaiModel(idmatakuliah, idstafdosen, excelUpload)
  524.             val progressDialogManager = context?.let { it -> ProgressDialogManager(it).loader("Sedang mengirim data") }
  525.             viewModel.uploadNilaiResponse.observe(viewLifecycleOwner) {
  526.                 when (it) {
  527.                     is Resource.Loading -> progressDialogManager?.show()
  528.                     is Resource.Success -> {
  529.                         val responseModel: ResponseModel = it.value
  530.                         val decrypt = EncDec().toDerypt(responseModel.streams)
  531.                         Log.e("TAG", "upload : $decrypt")
  532.  
  533.  
  534.                         progressDialogManager?.dismiss()
  535.                     }
  536.  
  537.                     is Resource.Failure -> {
  538.                         progressDialogManager?.dismiss()
  539.                         handleApiError(it)
  540.                         Log.e(TAG, "uploadNilai: ${it}")
  541.                     }
  542.                 }
  543.             }
  544.  
  545.         } catch (e: Exception){
  546.             e.printStackTrace()
  547.         }
  548.     }
  549.  
  550.     fun fileFromContentUri(context: Context, contentUri: Uri): File {
  551.         // Preparing Temp file name
  552.         val fileExtension = getFileExtension(context, contentUri)
  553.         val fileName = "temp_file"+ if (fileExtension != null) ".$fileExtension" else ""
  554.  
  555.         // Creating Temp file
  556.         val tempFile = File(context.cacheDir, fileName)
  557.         tempFile.createNewFile()
  558.  
  559.         try {
  560.             val oStream = FileOutputStream(tempFile)
  561.             val inputStream = context.contentResolver.openInputStream(contentUri)
  562.  
  563.             inputStream?.let {
  564.                 copy(inputStream, oStream)
  565.             }
  566.  
  567.             oStream.flush()
  568.         } catch (e: Exception) {
  569.             e.printStackTrace()
  570.         }
  571.  
  572.         return tempFile
  573.     }
  574.  
  575.     private fun getFileExtension(context: Context, uri: Uri): String? {
  576.         val fileType: String? = context.contentResolver.getType(uri)
  577.         return MimeTypeMap.getSingleton().getExtensionFromMimeType(fileType)
  578.     }
  579.  
  580.     @Throws(IOException::class)
  581.     private fun copy(source: InputStream, target: OutputStream) {
  582.         val buf = ByteArray(8192)
  583.         var length: Int
  584.         while (source.read(buf).also { length = it } > 0) {
  585.             target.write(buf, 0, length)
  586.         }
  587.     }
  588. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement