mirror of
https://github.com/Matte23/circolapp.git
synced 2025-12-06 07:29:10 +00:00
Add support for all file types for circulars and attachments
This commit is contained in:
@@ -40,7 +40,7 @@ import com.google.android.material.snackbar.Snackbar
|
||||
import com.mikepenz.aboutlibraries.LibsBuilder
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
||||
import net.underdesk.circolapp.data.Circular
|
||||
import net.underdesk.circolapp.utils.DownloadableFile
|
||||
import net.underdesk.circolapp.works.PollWork
|
||||
|
||||
class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback {
|
||||
@@ -51,7 +51,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
|
||||
|
||||
var searchCallback: SearchCallback? = null
|
||||
var refreshCallback: RefreshCallback? = null
|
||||
override var circularToDownload: Circular? = null
|
||||
override var fileToDownload: DownloadableFile? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
loadDarkTheme()
|
||||
@@ -131,7 +131,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
|
||||
PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE -> {
|
||||
// If request is cancelled, the result arrays are empty.
|
||||
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
|
||||
downloadCircular()
|
||||
downloadFile()
|
||||
} else {
|
||||
Snackbar.make(
|
||||
container,
|
||||
@@ -144,12 +144,18 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
|
||||
}
|
||||
}
|
||||
|
||||
override fun downloadCircular() {
|
||||
val request = DownloadManager.Request(Uri.parse(circularToDownload!!.url))
|
||||
request.setTitle(circularToDownload!!.name)
|
||||
override fun downloadFile() {
|
||||
val regexDots = Regex("""\.+$""")
|
||||
val safeFilename = fileToDownload!!.name.replace(regexDots, "")
|
||||
|
||||
var extension = fileToDownload!!.url.substringAfterLast(".", "html")
|
||||
if (!extension.matches(Regex("""[a-zA-Z]+"""))) extension = "html"
|
||||
|
||||
val request = DownloadManager.Request(Uri.parse(fileToDownload!!.url))
|
||||
request.setTitle(fileToDownload!!.name)
|
||||
request.setDestinationInExternalPublicDir(
|
||||
Environment.DIRECTORY_DOWNLOADS,
|
||||
"Circolapp/" + circularToDownload!!.id + ".pdf"
|
||||
"Circolapp/$safeFilename.$extension"
|
||||
)
|
||||
|
||||
(getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request)
|
||||
|
||||
@@ -18,24 +18,22 @@
|
||||
|
||||
package net.underdesk.circolapp.adapters
|
||||
|
||||
import android.app.DownloadManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Environment
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageButton
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import kotlinx.android.synthetic.main.item_attachment.view.*
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.utils.DownloadableFile
|
||||
import net.underdesk.circolapp.utils.FileUtils
|
||||
|
||||
class AttachmentAdapter(
|
||||
private val attachmentsNames: List<String>,
|
||||
private val attachmentsUrls: List<String>
|
||||
private val attachmentsUrls: List<String>,
|
||||
private val adapterCallback: CircularLetterAdapter.AdapterCallback
|
||||
) :
|
||||
RecyclerView.Adapter<AttachmentAdapter.AttachmentViewHolder>() {
|
||||
private lateinit var context: Context
|
||||
@@ -58,35 +56,12 @@ class AttachmentAdapter(
|
||||
holder.title.text = attachmentsNames[position]
|
||||
|
||||
holder.viewButton.setOnClickListener {
|
||||
val viewIntent = Intent(Intent.ACTION_VIEW)
|
||||
viewIntent.setDataAndType(Uri.parse(attachmentsUrls[position]), "application/pdf")
|
||||
if (viewIntent.resolveActivity(context.packageManager) != null) {
|
||||
context.startActivity(viewIntent)
|
||||
} else {
|
||||
val builder = AlertDialog.Builder(context)
|
||||
builder.apply {
|
||||
setTitle(R.string.dialog_install_pdf_reader_title)
|
||||
setMessage(R.string.dialog_install_pdf_reader_content)
|
||||
setPositiveButton(
|
||||
R.string.dialog_ok
|
||||
) { dialog, _ ->
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
builder.create().show()
|
||||
}
|
||||
FileUtils.viewFile(attachmentsUrls[position], context)
|
||||
}
|
||||
|
||||
holder.downloadButton.setOnClickListener {
|
||||
val request = DownloadManager.Request(Uri.parse(attachmentsUrls[position]))
|
||||
request.setTitle(attachmentsNames[position])
|
||||
request.setDestinationInExternalPublicDir(
|
||||
Environment.DIRECTORY_DOWNLOADS,
|
||||
"Circolapp/" + attachmentsNames[position] + ".pdf"
|
||||
)
|
||||
|
||||
(context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request)
|
||||
val file = DownloadableFile(attachmentsNames[position], attachmentsUrls[position])
|
||||
FileUtils.downloadFile(file, adapterCallback, context)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,33 +18,27 @@
|
||||
|
||||
package net.underdesk.circolapp.adapters
|
||||
|
||||
import android.Manifest
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.net.Uri
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.ImageButton
|
||||
import android.widget.TextView
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.cardview.widget.CardView
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.content.ContextCompat.getDrawable
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import kotlinx.android.synthetic.main.item_circular.view.*
|
||||
import net.underdesk.circolapp.AlarmBroadcastReceiver
|
||||
import net.underdesk.circolapp.MainActivity
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.data.AppDatabase
|
||||
import net.underdesk.circolapp.data.Circular
|
||||
import net.underdesk.circolapp.fragments.NewReminderFragment
|
||||
import net.underdesk.circolapp.utils.DownloadableFile
|
||||
import net.underdesk.circolapp.utils.FileUtils
|
||||
|
||||
class CircularLetterAdapter(
|
||||
private var circulars: List<Circular>,
|
||||
@@ -146,7 +140,8 @@ class CircularLetterAdapter(
|
||||
holder.attachmentsList.visibility = View.VISIBLE
|
||||
holder.attachmentsList.adapter = AttachmentAdapter(
|
||||
circulars[position].attachmentsNames,
|
||||
circulars[position].attachmentsUrls
|
||||
circulars[position].attachmentsUrls,
|
||||
adapterCallback
|
||||
)
|
||||
} else {
|
||||
holder.attachmentsList.adapter = null
|
||||
@@ -154,56 +149,12 @@ class CircularLetterAdapter(
|
||||
}
|
||||
|
||||
holder.viewButton.setOnClickListener {
|
||||
val viewIntent = Intent(Intent.ACTION_VIEW)
|
||||
viewIntent.setDataAndType(Uri.parse(circulars[position].url), "application/pdf")
|
||||
if (viewIntent.resolveActivity(context.packageManager) != null) {
|
||||
context.startActivity(viewIntent)
|
||||
} else {
|
||||
val builder = AlertDialog.Builder(context)
|
||||
builder.apply {
|
||||
setTitle(R.string.dialog_install_pdf_reader_title)
|
||||
setMessage(R.string.dialog_install_pdf_reader_content)
|
||||
setPositiveButton(
|
||||
R.string.dialog_ok
|
||||
) { dialog, _ ->
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
builder.create().show()
|
||||
}
|
||||
FileUtils.viewFile(circulars[position].url, context)
|
||||
}
|
||||
|
||||
holder.downloadButton.setOnClickListener {
|
||||
adapterCallback.circularToDownload = circulars[position]
|
||||
|
||||
val permission = ContextCompat.checkSelfPermission(
|
||||
context,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
|
||||
if (permission != PackageManager.PERMISSION_GRANTED) {
|
||||
|
||||
val builder = AlertDialog.Builder(context)
|
||||
|
||||
builder.apply {
|
||||
setMessage(context.getString(R.string.dialog_message_permission_write))
|
||||
setTitle(context.getString(R.string.dialog_title_permission_required))
|
||||
setPositiveButton(
|
||||
context.getString(R.string.dialog_next)
|
||||
) { _, _ ->
|
||||
ActivityCompat.requestPermissions(
|
||||
adapterCallback as AppCompatActivity,
|
||||
arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
|
||||
MainActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
builder.create().show()
|
||||
} else {
|
||||
adapterCallback.downloadCircular()
|
||||
}
|
||||
val file = DownloadableFile(circulars[position].name, circulars[position].url)
|
||||
FileUtils.downloadFile(file, adapterCallback, context)
|
||||
}
|
||||
|
||||
holder.favouriteButton.setOnClickListener {
|
||||
@@ -274,7 +225,7 @@ class CircularLetterAdapter(
|
||||
override fun getItemId(position: Int) = circulars[position].id
|
||||
|
||||
interface AdapterCallback {
|
||||
var circularToDownload: Circular?
|
||||
fun downloadCircular()
|
||||
var fileToDownload: DownloadableFile?
|
||||
fun downloadFile()
|
||||
}
|
||||
}
|
||||
|
||||
85
app/src/main/java/net/underdesk/circolapp/utils/FileUtils.kt
Normal file
85
app/src/main/java/net/underdesk/circolapp/utils/FileUtils.kt
Normal file
@@ -0,0 +1,85 @@
|
||||
package net.underdesk.circolapp.utils
|
||||
|
||||
import android.Manifest
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.net.Uri
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import net.underdesk.circolapp.MainActivity
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
||||
|
||||
object FileUtils {
|
||||
fun viewFile(url: String, context: Context) {
|
||||
val viewIntent = Intent(Intent.ACTION_VIEW)
|
||||
|
||||
if (url.endsWith(".pdf")) {
|
||||
viewIntent.setDataAndType(Uri.parse(url), "application/pdf")
|
||||
|
||||
if (viewIntent.resolveActivity(context.packageManager) == null) {
|
||||
val builder = MaterialAlertDialogBuilder(context)
|
||||
builder.apply {
|
||||
setTitle(R.string.dialog_install_pdf_reader_title)
|
||||
setMessage(R.string.dialog_install_pdf_reader_content)
|
||||
setPositiveButton(
|
||||
R.string.dialog_ok
|
||||
) { dialog, _ ->
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
builder.create().show()
|
||||
|
||||
return
|
||||
}
|
||||
} else {
|
||||
viewIntent.data = Uri.parse(url)
|
||||
}
|
||||
|
||||
context.startActivity(viewIntent)
|
||||
}
|
||||
|
||||
fun downloadFile(
|
||||
file: DownloadableFile,
|
||||
adapterCallback: CircularLetterAdapter.AdapterCallback,
|
||||
context: Context
|
||||
) {
|
||||
adapterCallback.fileToDownload = file
|
||||
|
||||
val permission = ContextCompat.checkSelfPermission(
|
||||
context,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
|
||||
if (permission != PackageManager.PERMISSION_GRANTED) {
|
||||
val builder = MaterialAlertDialogBuilder(context)
|
||||
|
||||
builder.apply {
|
||||
setMessage(context.getString(R.string.dialog_message_permission_write))
|
||||
setTitle(context.getString(R.string.dialog_title_permission_required))
|
||||
setPositiveButton(
|
||||
context.getString(R.string.dialog_next)
|
||||
) { _, _ ->
|
||||
ActivityCompat.requestPermissions(
|
||||
adapterCallback as AppCompatActivity,
|
||||
arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
|
||||
MainActivity.PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
builder.create().show()
|
||||
} else {
|
||||
adapterCallback.downloadFile()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data class DownloadableFile(
|
||||
val name: String,
|
||||
val url: String
|
||||
)
|
||||
Reference in New Issue
Block a user