diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 312bf2eab8b229c84f94db3fd525d55fab3ad5ff..b589d56e9f285d8cfdc6c270853a5d439021a278 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="CompilerConfiguration"> - <bytecodeTargetLevel target="20" /> + <bytecodeTargetLevel target="17" /> </component> </project> \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 1026ee158eb30a72805ac4f497ab5e0636d20508..a59dad3ed4fd5b5cc9ac925010bdca6e7aae0f06 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -10,12 +10,12 @@ <deviceKey> <Key> <type value="SERIAL_NUMBER" /> - <value value="adb-RRCT400LBLA-VDbMwR._adb-tls-connect._tcp" /> + <value value="adb-RR8RB07XHJE-thKlaa._adb-tls-connect._tcp" /> </Key> </deviceKey> </Target> </runningDeviceTargetSelectedWithDropDown> - <timeTargetWasSelectedWithDropDown value="2024-04-04T18:09:34.930937Z" /> + <timeTargetWasSelectedWithDropDown value="2024-04-05T06:31:53.707226200Z" /> </State> </entry> </value> diff --git a/.idea/misc.xml b/.idea/misc.xml index 42da8e87c91e9cb5366621afb4dec6a8a5750139..824785de182ab146db70f15ae47b10a232c50bf1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> - <component name="ProjectRootManager" version="2" languageLevel="JDK_20" default="true" project-jdk-name="corretto-20" project-jdk-type="JavaSDK" /> + <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK" /> </project> \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ff3d6e7d678942a1cb5f55ac0aa0249a3b280c3e..0af54e02768497ce456e4844a8f6d1405a6f4110 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,6 @@ <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> - <application android:name=".MainApp" android:allowBackup="true" @@ -24,6 +23,18 @@ android:supportsRtl="true" android:theme="@style/Theme.PSI" tools:targetApi="31"> + + <!-- Add the provider declaration --> + <provider + android:name="androidx.core.content.FileProvider" + android:authorities="${applicationId}.provider" + android:exported="false" + android:grantUriPermissions="true"> + <meta-data + android:name="android.support.FILE_PROVIDER_PATHS" + android:resource="@xml/file_paths" /> + </provider> + <activity android:name=".TransactionDetailActivity" android:exported="false" /> @@ -56,4 +67,4 @@ <service android:name=".services.BackgroundService" /> </application> -</manifest> \ No newline at end of file +</manifest> diff --git a/app/src/main/java/com/pbd/psi/ui/settings/SettingsFragment.kt b/app/src/main/java/com/pbd/psi/ui/settings/SettingsFragment.kt index 11dc096f5094f6e8051eb4bb13c45e9e1648a089..29e89eeefba7b0fc5def388b6b27a9acf5463766 100644 --- a/app/src/main/java/com/pbd/psi/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/pbd/psi/ui/settings/SettingsFragment.kt @@ -12,6 +12,7 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.FileProvider import androidx.documentfile.provider.DocumentFile import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -25,6 +26,8 @@ import org.apache.poi.ss.usermodel.HorizontalAlignment import org.apache.poi.ss.usermodel.IndexedColors import org.apache.poi.ss.usermodel.VerticalAlignment import org.apache.poi.xssf.usermodel.XSSFWorkbook +import java.io.File +import java.io.FileOutputStream import kotlin.collections.ArrayList @AndroidEntryPoint @@ -40,6 +43,7 @@ class SettingsFragment : Fragment() { private lateinit var sharedpreferences: SharedPreferences private lateinit var fileName: String private val viewModel: SettingsViewModel by viewModels() + private lateinit var fileUri : DocumentFile override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -65,13 +69,25 @@ class SettingsFragment : Fragment() { } binding.btnUploadHistory.setOnClickListener { - val email = sharedpreferences.getString(EMAIL, "") - val intentEmail = Intent(Intent.ACTION_SEND) - intentEmail.type = "text/plain" - intentEmail.putExtra(Intent.EXTRA_EMAIL, arrayOf(email)) - intentEmail.putExtra(Intent.EXTRA_SUBJECT, "Upload History") - intentEmail.putExtra(Intent.EXTRA_TEXT, "Berikut ini laporan hasil transaksi akun $email :\n") - startActivity(Intent.createChooser(intentEmail, "Send Email")) + + + + try { + val email = sharedpreferences.getString(EMAIL, "") + val intentEmail = Intent(Intent.ACTION_SEND) + intentEmail.type = "text/plain" + intentEmail.putExtra(Intent.EXTRA_EMAIL, arrayOf(email)) + intentEmail.putExtra(Intent.EXTRA_SUBJECT, "Upload History") + intentEmail.putExtra(Intent.EXTRA_TEXT, "Berikut ini laporan hasil transaksi akun $email :\n") + intentEmail.putExtra(Intent.EXTRA_STREAM, this.fileUri.uri) + intentEmail.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + startActivity(Intent.createChooser(intentEmail, "Send Email")) + } + catch (e: Exception) { + Log.e("Error", e.toString()) + Toast.makeText(requireContext(), "Please save transaction file", Toast.LENGTH_SHORT).show() + } + } binding.btnSettings.setOnClickListener { @@ -82,11 +98,11 @@ class SettingsFragment : Fragment() { builder.setItems(exportOptions) { _: DialogInterface?, which: Int -> when (which) { 0 -> { - fileName = "transaction_data.xlsx" + fileName = "transaction_"+sharedpreferences.getString(EMAIL, "")+".xlsx" launchFilePicker() } 1 -> { - fileName = "transaction_data.xls" + fileName = "transaction_"+sharedpreferences.getString(EMAIL, "")+"xls" launchFilePicker() } } @@ -148,13 +164,23 @@ class SettingsFragment : Fragment() { dataRow.createCell(4).setCellValue(transaction.location ?: "") } +// val cacheDir = requireContext().cacheDir +// val cacheFile = File(cacheDir, "transaction.xlsx") +// val outputStreamCache = FileOutputStream(cacheFile) +// workbook.write(outputStreamCache) +// workbook.close() +// outputStreamCache.close() + + val file: DocumentFile - if(fileName === "transaction_data.xls"){ + if(fileName === "transaction_"+sharedpreferences.getString(EMAIL, "")+".xls"){ file = directory.createFile("application/vnd.ms-excel", fileName)!! }else{ file = directory.createFile("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName)!! } val outputStream = requireContext().contentResolver.openOutputStream(file!!.uri) + this.fileUri= file + Log.d("File xlsx location", "File: $outputStream") workbook.write(outputStream) workbook.close() outputStream?.close() @@ -164,4 +190,12 @@ class SettingsFragment : Fragment() { Toast.makeText(requireContext(), "No transaction data available", Toast.LENGTH_SHORT).show() } } + private fun getFile(): File { + val fileName = "transaction_data"+sharedpreferences.getString(EMAIL, "")+".xlsx" + val dir = File(requireContext().cacheDir, "excel") + if (!dir.exists()) dir.mkdirs() + return File(dir, fileName) + } + + }