diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index da074f987b24fe43136886688495d221b55d74a9..2f063f1ceb837032872c0b40aa8d1b09c07596ea 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,18 @@ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <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:name=".ui.transactions.TransactionsApplication" @@ -27,6 +39,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 52b63050d563695799b81b4d3222b160e68f6526..5cef2c9ca4362d231fbfdf8fcfd4029621ae23f4 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 @@ -4,6 +4,9 @@ import android.app.AlertDialog import android.content.DialogInterface import android.content.Intent import android.content.pm.PackageManager +import EmailHelper +import android.content.Intent +import android.net.Uri import android.os.Bundle import android.util.Log import android.view.LayoutInflater @@ -12,6 +15,7 @@ import android.view.ViewGroup import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.ViewModelProvider @@ -23,6 +27,7 @@ import com.example.bondoyap.ui.transactions.TransactionsApplication import com.example.bondoyap.ui.transactions.TransactionsViewModel import com.example.bondoyap.ui.transactions.TransactionsViewModelFactory import android.Manifest +import java.io.File class SettingsFragment : Fragment() { @@ -33,6 +38,8 @@ class SettingsFragment : Fragment() { private val transactionsViewModel: TransactionsViewModel by viewModels { TransactionsViewModelFactory((requireContext().applicationContext as TransactionsApplication).repository) } + private val database = MockDatabase() + private lateinit var exporter: TransactionsExporter override fun onCreateView( inflater: LayoutInflater, @@ -96,6 +103,8 @@ class SettingsFragment : Fragment() { val exporter = TransactionsExporter(transactionsViewModel, requireContext()) + // exporter = context?.let { TransactionsExporter(database, it) }!! + saveButton.setOnClickListener { if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(appContext, "Allow storage permission untuk menyimpan transaksi ke file xls/xlsx", Toast.LENGTH_SHORT).show() @@ -124,7 +133,18 @@ 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) + } } resetButton.setOnClickListener{ @@ -155,6 +175,29 @@ class SettingsFragment : Fragment() { private const val PERMISSION_REQUEST_CODE = 1001 } + 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 05c76159446de6ac39e1ac0589deff017b8bfe8c..347373d8bf2984270c9f746f383abe857910d271 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 @@ -35,9 +35,12 @@ class TransactionsExporter(private val transactionsViewModel: TransactionsViewMo } } - private fun writeToExcel(fileName: String, transactions: List<Transactions>) { - val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) - val file = File(downloadsDir, fileName) + private fun writeToExcel(fileName: String, transactions: List<Transaction>) { + val documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) + val file = File(documentsDir, fileName) + + val cacheDir = context.cacheDir + val fileCache = File(cacheDir, fileName) workbook { sheet("Transactions") { @@ -75,6 +78,23 @@ class TransactionsExporter(private val transactionsViewModel: TransactionsViewMo } } }.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