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