Add support for all file types for circulars and attachments

This commit is contained in:
Matte23
2020-11-06 13:07:09 +01:00
parent 66bcc00017
commit 64c1e52b74
4 changed files with 114 additions and 97 deletions

View File

@@ -40,7 +40,7 @@ import com.google.android.material.snackbar.Snackbar
import com.mikepenz.aboutlibraries.LibsBuilder import com.mikepenz.aboutlibraries.LibsBuilder
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.adapters.CircularLetterAdapter
import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.utils.DownloadableFile
import net.underdesk.circolapp.works.PollWork import net.underdesk.circolapp.works.PollWork
class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback { class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback {
@@ -51,7 +51,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
var searchCallback: SearchCallback? = null var searchCallback: SearchCallback? = null
var refreshCallback: RefreshCallback? = null var refreshCallback: RefreshCallback? = null
override var circularToDownload: Circular? = null override var fileToDownload: DownloadableFile? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
loadDarkTheme() loadDarkTheme()
@@ -131,7 +131,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE -> { PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE -> {
// If request is cancelled, the result arrays are empty. // If request is cancelled, the result arrays are empty.
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
downloadCircular() downloadFile()
} else { } else {
Snackbar.make( Snackbar.make(
container, container,
@@ -144,12 +144,18 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
} }
} }
override fun downloadCircular() { override fun downloadFile() {
val request = DownloadManager.Request(Uri.parse(circularToDownload!!.url)) val regexDots = Regex("""\.+$""")
request.setTitle(circularToDownload!!.name) 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( request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS, Environment.DIRECTORY_DOWNLOADS,
"Circolapp/" + circularToDownload!!.id + ".pdf" "Circolapp/$safeFilename.$extension"
) )
(getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request) (getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request)

View File

@@ -18,24 +18,22 @@
package net.underdesk.circolapp.adapters package net.underdesk.circolapp.adapters
import android.app.DownloadManager
import android.content.Context import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Environment
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.ImageButton import android.widget.ImageButton
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.item_attachment.view.* import kotlinx.android.synthetic.main.item_attachment.view.*
import net.underdesk.circolapp.R import net.underdesk.circolapp.R
import net.underdesk.circolapp.utils.DownloadableFile
import net.underdesk.circolapp.utils.FileUtils
class AttachmentAdapter( class AttachmentAdapter(
private val attachmentsNames: List<String>, private val attachmentsNames: List<String>,
private val attachmentsUrls: List<String> private val attachmentsUrls: List<String>,
private val adapterCallback: CircularLetterAdapter.AdapterCallback
) : ) :
RecyclerView.Adapter<AttachmentAdapter.AttachmentViewHolder>() { RecyclerView.Adapter<AttachmentAdapter.AttachmentViewHolder>() {
private lateinit var context: Context private lateinit var context: Context
@@ -58,35 +56,12 @@ class AttachmentAdapter(
holder.title.text = attachmentsNames[position] holder.title.text = attachmentsNames[position]
holder.viewButton.setOnClickListener { holder.viewButton.setOnClickListener {
val viewIntent = Intent(Intent.ACTION_VIEW) FileUtils.viewFile(attachmentsUrls[position], context)
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()
}
} }
holder.downloadButton.setOnClickListener { holder.downloadButton.setOnClickListener {
val request = DownloadManager.Request(Uri.parse(attachmentsUrls[position])) val file = DownloadableFile(attachmentsNames[position], attachmentsUrls[position])
request.setTitle(attachmentsNames[position]) FileUtils.downloadFile(file, adapterCallback, context)
request.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS,
"Circolapp/" + attachmentsNames[position] + ".pdf"
)
(context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request)
} }
} }

View File

@@ -18,33 +18,27 @@
package net.underdesk.circolapp.adapters package net.underdesk.circolapp.adapters
import android.Manifest
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
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.ImageButton import android.widget.ImageButton
import android.widget.TextView import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.cardview.widget.CardView import androidx.cardview.widget.CardView
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat.getDrawable import androidx.core.content.ContextCompat.getDrawable
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.item_circular.view.* import kotlinx.android.synthetic.main.item_circular.view.*
import net.underdesk.circolapp.AlarmBroadcastReceiver import net.underdesk.circolapp.AlarmBroadcastReceiver
import net.underdesk.circolapp.MainActivity
import net.underdesk.circolapp.R import net.underdesk.circolapp.R
import net.underdesk.circolapp.data.AppDatabase import net.underdesk.circolapp.data.AppDatabase
import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.data.Circular
import net.underdesk.circolapp.fragments.NewReminderFragment import net.underdesk.circolapp.fragments.NewReminderFragment
import net.underdesk.circolapp.utils.DownloadableFile
import net.underdesk.circolapp.utils.FileUtils
class CircularLetterAdapter( class CircularLetterAdapter(
private var circulars: List<Circular>, private var circulars: List<Circular>,
@@ -146,7 +140,8 @@ class CircularLetterAdapter(
holder.attachmentsList.visibility = View.VISIBLE holder.attachmentsList.visibility = View.VISIBLE
holder.attachmentsList.adapter = AttachmentAdapter( holder.attachmentsList.adapter = AttachmentAdapter(
circulars[position].attachmentsNames, circulars[position].attachmentsNames,
circulars[position].attachmentsUrls circulars[position].attachmentsUrls,
adapterCallback
) )
} else { } else {
holder.attachmentsList.adapter = null holder.attachmentsList.adapter = null
@@ -154,56 +149,12 @@ class CircularLetterAdapter(
} }
holder.viewButton.setOnClickListener { holder.viewButton.setOnClickListener {
val viewIntent = Intent(Intent.ACTION_VIEW) FileUtils.viewFile(circulars[position].url, context)
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()
}
} }
holder.downloadButton.setOnClickListener { holder.downloadButton.setOnClickListener {
adapterCallback.circularToDownload = circulars[position] val file = DownloadableFile(circulars[position].name, circulars[position].url)
FileUtils.downloadFile(file, adapterCallback, context)
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()
}
} }
holder.favouriteButton.setOnClickListener { holder.favouriteButton.setOnClickListener {
@@ -274,7 +225,7 @@ class CircularLetterAdapter(
override fun getItemId(position: Int) = circulars[position].id override fun getItemId(position: Int) = circulars[position].id
interface AdapterCallback { interface AdapterCallback {
var circularToDownload: Circular? var fileToDownload: DownloadableFile?
fun downloadCircular() fun downloadFile()
} }
} }

View 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
)