diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 524104533e9a21551af37a80fdf31a32e97deb80..7e8d5e59a39d2d68a750f5003db96c271feef31b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,18 @@ <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> + + <queries> + <intent> + <action android:name="android.intent.action.SENDTO" /> + <data android:scheme="mailto" /> + </intent> + <intent> + <action android:name="android.intent.action.SEND" /> + <data android:mimeType="text/plain" /> + </intent> + </queries> <application android:allowBackup="true" @@ -16,6 +28,16 @@ android:theme="@style/Theme.BondoYap" tools:targetApi="31"> + <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_path"/> + </provider> + <service android:name=".service.jwt.JwtService" android:enabled="true" diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/EmailHelper.kt b/app/src/main/java/com/example/bondoyap/ui/settings/EmailHelper.kt new file mode 100644 index 0000000000000000000000000000000000000000..2a5feeec4e05570ff34de137f4ccc06c21381f51 --- /dev/null +++ b/app/src/main/java/com/example/bondoyap/ui/settings/EmailHelper.kt @@ -0,0 +1,26 @@ +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.widget.Toast + +class EmailHelper(private val context: Context) { + + fun sendGmail(recipientEmail: String, subject: String, message: String, attachment: Uri) { + val emailIntent = Intent(Intent.ACTION_SEND ).apply { + type = "application/vnd.ms-excel" + putExtra(Intent.EXTRA_EMAIL, arrayOf(recipientEmail)) + putExtra(Intent.EXTRA_SUBJECT, subject) + putExtra(Intent.EXTRA_TEXT, message) + putExtra(Intent.EXTRA_STREAM, attachment) + setPackage("com.google.android.gm") + } + + if (emailIntent.resolveActivity(context.packageManager) != null) { + // Start the intent + context.startActivity(emailIntent) + } else { + Toast.makeText(context, "Gmail is client installed.", Toast.LENGTH_SHORT).show(); + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt index 4e59685263b89adacc8550050b17a4e34b81a240..c54a4780d83221cacd7610b6c5875a1f5725c251 100644 --- a/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/example/bondoyap/ui/settings/SettingsFragment.kt @@ -1,15 +1,20 @@ package com.example.bondoyap.ui.settings +import EmailHelper import android.content.Intent +import android.net.Uri import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.core.content.FileProvider import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.example.bondoyap.databinding.FragmentSettingsBinding import com.example.bondoyap.ui.login.LoginActivity +import java.io.File class SettingsFragment : Fragment() { @@ -17,6 +22,9 @@ class SettingsFragment : Fragment() { private val binding get() = _binding!! private lateinit var settingsViewModel: SettingsViewModel + private val database = MockDatabase() + private lateinit var exporter: TransactionsExporter + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -63,8 +71,7 @@ class SettingsFragment : Fragment() { //todo } - val database = MockDatabase() - val exporter = TransactionsExporter(database) + exporter = context?.let { TransactionsExporter(database, it) }!! saveButton.setOnClickListener{ Toast.makeText(appContext, "Menyimpan transaksi...", Toast.LENGTH_SHORT).show() @@ -77,11 +84,45 @@ class SettingsFragment : Fragment() { sendButton.setOnClickListener{ Toast.makeText(appContext, "Mengirimkan transaksi ...", Toast.LENGTH_SHORT).show() - //todo + + var recipientEmail: String + val subject = "Transaksi Aplikasi Bondoman" + val message = "Halo, Berikut adalah detail transaksi aplikasi Bondoman.\n " + + "File Transaksi terlampir." + + settingsViewModel.getUser()?.let { user -> + recipientEmail = user.email + val attachment = getAttachmentUri("transactions.xls") + Log.d("Attachment", "Attachment URI: $attachment") + context?.let { EmailHelper(it) }?.sendGmail(recipientEmail, subject, message, attachment) + } } } + private fun getAttachmentUri(fileName: String): Uri { + val cacheDir = context?.cacheDir + val fileCache = File(cacheDir, fileName) +// val documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) +// val file = File(documentsDir, fileName) + + Log.d("Attachment", "File path: ${fileCache.absolutePath}") + + if (!fileCache.exists()) { + Log.d("Attachment", "Creating file: ${fileCache.absolutePath}") + if (fileName.endsWith(".xls")) { + exporter.exportToXLS() + } else if (fileName.endsWith(".xlsx")) { + exporter.exportToXLSX() + } +// Toast.makeText(requireContext(),"File belum tersimpan! Simpan File terlebih dahulu!", Toast.LENGTH_SHORT).show() + } + + Log.d("Attachment", "File path: ${fileCache.absolutePath}") + + return FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.provider", fileCache) + } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/com/example/bondoyap/ui/settings/TransactionsExporter.kt b/app/src/main/java/com/example/bondoyap/ui/settings/TransactionsExporter.kt index f145acb54d27261c0369c924ba8ccc3efb5e5491..5d8ddf822e5cc6fe258eabf1539f2b666525015f 100644 --- a/app/src/main/java/com/example/bondoyap/ui/settings/TransactionsExporter.kt +++ b/app/src/main/java/com/example/bondoyap/ui/settings/TransactionsExporter.kt @@ -1,5 +1,6 @@ package com.example.bondoyap.ui.settings +import android.content.Context import android.os.Environment import android.util.Log import io.github.evanrupert.excelkt.Sheet @@ -32,7 +33,7 @@ fun findTransactions(): List<Transaction> = listOf( Transaction("2024-04-03", "Pemasukan", 200.0, "Bonus", "CCCC") ) -class TransactionsExporter(private val database: Database) { +class TransactionsExporter(private val database: Database, private val context: Context) { fun exportToXLS() { val transactions = database.getTransactions() Log.d("SaveDebug", "xls function") @@ -46,8 +47,11 @@ class TransactionsExporter(private val database: Database) { } private fun writeToExcel(fileName: String, transactions: List<Transaction>) { - val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) - val file = File(downloadsDir, fileName) + val documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) + val file = File(documentsDir, fileName) + + val cacheDir = context.cacheDir + val fileCache = File(cacheDir, fileName) workbook { sheet("Transactions") { @@ -64,6 +68,23 @@ class TransactionsExporter(private val database: Database) { } } }.write(file.absolutePath) + + workbook { + sheet("Transactions") { + transactionsHeader() + + for (transaction in transactions) { + row { + cell(transaction.date) + cell(transaction.category) + cell(transaction.amount) + cell(transaction.name) + cell(transaction.location) + } + } + } + }.write(fileCache.absolutePath) + } diff --git a/app/src/main/res/xml/file_path.xml b/app/src/main/res/xml/file_path.xml new file mode 100644 index 0000000000000000000000000000000000000000..9033488b18da2bc4907e27d2daa03711ae6ae8d7 --- /dev/null +++ b/app/src/main/res/xml/file_path.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<paths xmlns:android="http://schemas.android.com/apk/res/android"> + <cache-path + name="cache" + path="." /> + + <external-path + name="external_files" + path="."/> +</paths> \ No newline at end of file