Skip to content
Snippets Groups Projects
Commit 082791c1 authored by yansans's avatar yansans
Browse files

feat: init gmail intent with attachment

parent c423553f
Branches
Tags
1 merge request!13Release
...@@ -4,6 +4,18 @@ ...@@ -4,6 +4,18 @@
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_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 <application
android:allowBackup="true" android:allowBackup="true"
...@@ -16,6 +28,16 @@ ...@@ -16,6 +28,16 @@
android:theme="@style/Theme.BondoYap" android:theme="@style/Theme.BondoYap"
tools:targetApi="31"> 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 <service
android:name=".service.jwt.JwtService" android:name=".service.jwt.JwtService"
android:enabled="true" android:enabled="true"
......
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
package com.example.bondoyap.ui.settings package com.example.bondoyap.ui.settings
import EmailHelper
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.core.content.FileProvider
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.example.bondoyap.databinding.FragmentSettingsBinding import com.example.bondoyap.databinding.FragmentSettingsBinding
import com.example.bondoyap.ui.login.LoginActivity import com.example.bondoyap.ui.login.LoginActivity
import java.io.File
class SettingsFragment : Fragment() { class SettingsFragment : Fragment() {
...@@ -17,6 +22,9 @@ class SettingsFragment : Fragment() { ...@@ -17,6 +22,9 @@ class SettingsFragment : Fragment() {
private val binding get() = _binding!! private val binding get() = _binding!!
private lateinit var settingsViewModel: SettingsViewModel private lateinit var settingsViewModel: SettingsViewModel
private val database = MockDatabase()
private lateinit var exporter: TransactionsExporter
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
...@@ -63,8 +71,7 @@ class SettingsFragment : Fragment() { ...@@ -63,8 +71,7 @@ class SettingsFragment : Fragment() {
//todo //todo
} }
val database = MockDatabase() exporter = context?.let { TransactionsExporter(database, it) }!!
val exporter = TransactionsExporter(database)
saveButton.setOnClickListener{ saveButton.setOnClickListener{
Toast.makeText(appContext, "Menyimpan transaksi...", Toast.LENGTH_SHORT).show() Toast.makeText(appContext, "Menyimpan transaksi...", Toast.LENGTH_SHORT).show()
...@@ -77,11 +84,45 @@ class SettingsFragment : Fragment() { ...@@ -77,11 +84,45 @@ class SettingsFragment : Fragment() {
sendButton.setOnClickListener{ sendButton.setOnClickListener{
Toast.makeText(appContext, "Mengirimkan transaksi ...", Toast.LENGTH_SHORT).show() 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() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
_binding = null _binding = null
......
package com.example.bondoyap.ui.settings package com.example.bondoyap.ui.settings
import android.content.Context
import android.os.Environment import android.os.Environment
import android.util.Log import android.util.Log
import io.github.evanrupert.excelkt.Sheet import io.github.evanrupert.excelkt.Sheet
...@@ -32,7 +33,7 @@ fun findTransactions(): List<Transaction> = listOf( ...@@ -32,7 +33,7 @@ fun findTransactions(): List<Transaction> = listOf(
Transaction("2024-04-03", "Pemasukan", 200.0, "Bonus", "CCCC") 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() { fun exportToXLS() {
val transactions = database.getTransactions() val transactions = database.getTransactions()
Log.d("SaveDebug", "xls function") Log.d("SaveDebug", "xls function")
...@@ -46,8 +47,11 @@ class TransactionsExporter(private val database: Database) { ...@@ -46,8 +47,11 @@ class TransactionsExporter(private val database: Database) {
} }
private fun writeToExcel(fileName: String, transactions: List<Transaction>) { private fun writeToExcel(fileName: String, transactions: List<Transaction>) {
val downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS) val documentsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
val file = File(downloadsDir, fileName) val file = File(documentsDir, fileName)
val cacheDir = context.cacheDir
val fileCache = File(cacheDir, fileName)
workbook { workbook {
sheet("Transactions") { sheet("Transactions") {
...@@ -64,6 +68,23 @@ class TransactionsExporter(private val database: Database) { ...@@ -64,6 +68,23 @@ class TransactionsExporter(private val database: Database) {
} }
} }
}.write(file.absolutePath) }.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)
} }
......
<?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
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment