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

View File

@@ -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)
}
}

View File

@@ -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()
}
}

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
)