diff --git a/app/src/main/java/com/atm/bondowowo/ui/settings/ExportToFileActivity.kt b/app/src/main/java/com/atm/bondowowo/ui/settings/ExportToFileActivity.kt deleted file mode 100644 index efed7bed338e46d7d40fb2d28fd931d7ad9d0b3c..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/atm/bondowowo/ui/settings/ExportToFileActivity.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.atm.bondowowo.ui.settings - -import android.os.Bundle -import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.Observer -import com.atm.bondowowo.data.local.entity.TransactionEntity -import com.atm.bondowowo.utils.DialogHelper -import com.atm.bondowowo.utils.NetworkHelper -import com.atm.bondowowo.utils.NetworkStateLiveData -import org.apache.poi.xssf.usermodel.XSSFWorkbook -import java.io.File -import java.io.FileOutputStream - -class ExportToFileActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) -// setContentView(R.layout.fragment_transaction) - val networkStateLiveData = NetworkStateLiveData(this) - networkStateLiveData.observe(this, Observer { isConnected -> - if (!isConnected) { - DialogHelper.showNoInternetDialog(this) - } - }) - - val transactionEntities: ArrayList<TransactionEntity>? = intent.getSerializableExtra("transactions") as? ArrayList<TransactionEntity> - - if (transactionEntities != null) { - exportDataToFile(transactionEntities) - } else { - Toast.makeText(this, "No transaction data available", Toast.LENGTH_SHORT).show() - } - } - - private fun exportDataToFile(transactionEntities: List<TransactionEntity>) { - val workbook = XSSFWorkbook() - val sheet = workbook.createSheet("Transaction Data") - - val headerRow = sheet.createRow(0) - val headers = arrayOf("Date", "Name", "Category", "Amount", "Location") -// val headers = arrayOf("ID", "Date", "Name", "Category", "Amount", "Location") - - headers.forEachIndexed { index, headerText -> - val cell = headerRow.createCell(index) - cell.setCellValue(headerText) - } - - transactionEntities.forEachIndexed { rowIndex, transaction -> - val dataRow = sheet.createRow(rowIndex + 1) -// dataRow.createCell(0).setCellValue(transaction.id ?: -1) - dataRow.createCell(0).setCellValue(transaction.date.toString()) - dataRow.createCell(1).setCellValue(transaction.nama ?: "") - dataRow.createCell(2).setCellValue(transaction.kategori ?: "") - dataRow.createCell(3).setCellValue(transaction.nominal ?: 0.0) - dataRow.createCell(4).setCellValue(transaction.lokasi ?: "") - } - - - - val file = File(getExternalFilesDir(null), "transaction_data.xlsx") // sesuaikan nama filenya nnti - val outputStream = FileOutputStream(file) - workbook.write(outputStream) - workbook.close() - outputStream.close() - - Toast.makeText(this, "Data exported to ${file.absolutePath}", Toast.LENGTH_SHORT).show() - } - -} diff --git a/app/src/main/java/com/atm/bondowowo/ui/settings/SendEmailActivity.kt b/app/src/main/java/com/atm/bondowowo/ui/settings/SendEmailActivity.kt deleted file mode 100644 index 5cf79b4d5d078ec5f9baafe39854e041ba18a100..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/atm/bondowowo/ui/settings/SendEmailActivity.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.atm.bondowowo.ui.settings - -import android.content.Intent -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle -import android.widget.Toast -import androidx.core.content.FileProvider -import com.atm.bondowowo.R -import java.io.File -import android.content.pm.PackageManager -import androidx.lifecycle.Observer -import com.atm.bondowowo.utils.DialogHelper -import com.atm.bondowowo.utils.NetworkHelper -import com.atm.bondowowo.utils.NetworkStateLiveData - - -class SendEmailActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.fragment_transaction) - - val networkStateLiveData = NetworkStateLiveData(this) - networkStateLiveData.observe(this, Observer { isConnected -> - if (!isConnected) { - DialogHelper.showNoInternetDialog(this) - } - }) - - sendEmailWithAttachment2() - } - - private fun sendEmailWithAttachment2() { - val file = getLatestFileFromStorage() - - if (file != null && file.exists()) { - val uri = FileProvider.getUriForFile(this, "${packageName}.fileprovider", file) - - val resInfoList = packageManager.queryIntentActivities(Intent(Intent.ACTION_SEND).apply { - type = "application/vnd.ms-excel" - putExtra(Intent.EXTRA_STREAM, uri) - }, PackageManager.MATCH_DEFAULT_ONLY) - - for (resolveInfo in resInfoList) { - val packageName = resolveInfo.activityInfo.packageName - grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION) - } - - val emailIntent = Intent(Intent.ACTION_SEND) - emailIntent.type = "application/vnd.ms-excel" - emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("shidqizh@gmail.com")) // tar benerin ini kirim ke user yang lagi login - emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Export File") - emailIntent.putExtra(Intent.EXTRA_TEXT, "Berikut terlampir file transaksi dalam format spreadsheet.") - emailIntent.putExtra(Intent.EXTRA_STREAM, uri) - - try { - startActivity(Intent.createChooser(emailIntent, "Send mail...")) - } catch (ex: android.content.ActivityNotFoundException) { - Toast.makeText(this, "No email clients installed.", Toast.LENGTH_SHORT).show() - } - } else { - Toast.makeText(this, "No transaction file found or attached.", Toast.LENGTH_SHORT).show() - } - } - - private fun getLatestFileFromStorage(): File? { - val directoryPath = "/storage/emulated/0/Android/data/com.atm.bondowowo/files" - val directory = File(directoryPath) - - if (!directory.exists() || !directory.isDirectory) { - return null - } - - val files = directory.listFiles()?.filter { it.isFile }?.sortedByDescending { it.lastModified() } - return files?.firstOrNull() - } - -} diff --git a/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsActivity.kt b/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsActivity.kt deleted file mode 100644 index 6b389b4ca9dfa91da201117c260b177c65281adf..0000000000000000000000000000000000000000 --- a/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsActivity.kt +++ /dev/null @@ -1,4 +0,0 @@ -package com.atm.bondowowo.ui.settings - -class SettingsActivity { -} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt index 34b88565e0c2c6b78956156e9177b5b82d7ac39e..6afe42f25df48f5f456f320bb17786c2f765afcc 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt @@ -10,6 +10,8 @@ import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.atm.bondowowo.R import com.atm.bondowowo.data.local.database.AppDatabase +import com.atm.bondowowo.utils.ExportToFileUtil +import com.atm.bondowowo.utils.SendEmailUtil class SettingsFragment : Fragment(){ @@ -34,13 +36,12 @@ class SettingsFragment : Fragment(){ database = AppDatabase.getInstance(context) btn_export.setOnClickListener { - val intent = Intent(requireContext(), ExportToFileActivity::class.java) - var listOfTransactions = database.transactionDao().getAll() - intent.putExtra("transactions", ArrayList(listOfTransactions)) - startActivity(intent) } + val listOfTransactions = database.transactionDao().getAll() + ExportToFileUtil.exportDataToFile(requireContext(), listOfTransactions) + } btn_send_email.setOnClickListener { - startActivity(Intent(requireContext(), SendEmailActivity::class.java)) + SendEmailUtil.sendEmailWithAttachment(requireContext()) } btn_logout.setOnClickListener { diff --git a/app/src/main/java/com/atm/bondowowo/utils/ExportToFileUtil.kt b/app/src/main/java/com/atm/bondowowo/utils/ExportToFileUtil.kt new file mode 100644 index 0000000000000000000000000000000000000000..383fe812b14cd50780de7318ae90c29c7688838f --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/utils/ExportToFileUtil.kt @@ -0,0 +1,54 @@ +package com.atm.bondowowo.utils + +import android.content.Context +import android.widget.Toast +import com.atm.bondowowo.data.local.entity.TransactionEntity +import org.apache.poi.xssf.usermodel.XSSFWorkbook +import java.io.File +import java.io.FileOutputStream + +object ExportToFileUtil { + + fun exportDataToFile( + context: Context, + transactionEntities: List<TransactionEntity> + ) { + val networkStateLiveData = NetworkStateLiveData(context) + networkStateLiveData.observeForever { isConnected -> + if (!isConnected) { + DialogHelper.showNoInternetDialog(context) + } + } + + if (transactionEntities.isNotEmpty()) { + val workbook = XSSFWorkbook() + val sheet = workbook.createSheet("Transaction Data") + + val headerRow = sheet.createRow(0) + val headers = arrayOf("Date", "Name", "Category", "Amount", "Location") + headers.forEachIndexed { index, headerText -> + val cell = headerRow.createCell(index) + cell.setCellValue(headerText) + } + + transactionEntities.forEachIndexed { rowIndex, transaction -> + val dataRow = sheet.createRow(rowIndex + 1) + dataRow.createCell(0).setCellValue(transaction.date.toString()) + dataRow.createCell(1).setCellValue(transaction.nama ?: "") + dataRow.createCell(2).setCellValue(transaction.kategori ?: "") + dataRow.createCell(3).setCellValue(transaction.nominal ?: 0.0) + dataRow.createCell(4).setCellValue(transaction.lokasi ?: "") + } + + val file = File(context.getExternalFilesDir(null), "transaction_data.xlsx") + val outputStream = FileOutputStream(file) + workbook.write(outputStream) + workbook.close() + outputStream.close() + + Toast.makeText(context, "Data exported to ${file.absolutePath}", Toast.LENGTH_SHORT).show() + } else { + Toast.makeText(context, "No transaction data available", Toast.LENGTH_SHORT).show() + } + } +} diff --git a/app/src/main/java/com/atm/bondowowo/utils/SendEmailUtil.kt b/app/src/main/java/com/atm/bondowowo/utils/SendEmailUtil.kt new file mode 100644 index 0000000000000000000000000000000000000000..2d03679d6bfab7207c03d70ff17199f50773b544 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/utils/SendEmailUtil.kt @@ -0,0 +1,62 @@ +package com.atm.bondowowo.utils + +import android.content.Context +import android.content.Intent +import android.widget.Toast +import androidx.core.content.FileProvider +import java.io.File + +object SendEmailUtil { + + fun sendEmailWithAttachment(context: Context) { + val networkStateLiveData = NetworkStateLiveData(context) + networkStateLiveData.observeForever { isConnected -> + if (!isConnected) { + DialogHelper.showNoInternetDialog(context) + } + } + + val file = getLatestFileFromStorage(context) + + if (file != null && file.exists()) { + val uri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", file) + + val resInfoList = context.packageManager.queryIntentActivities(Intent(Intent.ACTION_SEND).apply { + type = "application/vnd.ms-excel" + putExtra(Intent.EXTRA_STREAM, uri) + }, Context.MODE_PRIVATE) + + for (resolveInfo in resInfoList) { + val packageName = resolveInfo.activityInfo.packageName + context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + + val emailIntent = Intent(Intent.ACTION_SEND) + emailIntent.type = "application/vnd.ms-excel" + emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("shidqizh@gmail.com")) // masi pr ini benerin ke email pengguna sekarang + emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Export File") + emailIntent.putExtra(Intent.EXTRA_TEXT, "Berikut terlampir file transaksi dalam format spreadsheet.") + emailIntent.putExtra(Intent.EXTRA_STREAM, uri) + + try { + context.startActivity(Intent.createChooser(emailIntent, "Send mail...")) + } catch (ex: android.content.ActivityNotFoundException) { + Toast.makeText(context, "No email clients installed.", Toast.LENGTH_SHORT).show() + } + } else { + Toast.makeText(context, "No transaction file found or attached.", Toast.LENGTH_SHORT).show() + } + } + + private fun getLatestFileFromStorage(context: Context): File? { + val directoryPath = "/storage/emulated/0/Android/data/com.atm.bondowowo/files" + val directory = File(directoryPath) + + if (!directory.exists() || !directory.isDirectory) { + return null + } + + val files = directory.listFiles()?.filter { it.isFile }?.sortedByDescending { it.lastModified() } + return files?.firstOrNull() + } +}