diff --git a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt index ee2fb71..1e3ee45 100644 --- a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt +++ b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt @@ -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) diff --git a/app/src/main/java/net/underdesk/circolapp/adapters/AttachmentAdapter.kt b/app/src/main/java/net/underdesk/circolapp/adapters/AttachmentAdapter.kt index 89cafa8..cac19e9 100644 --- a/app/src/main/java/net/underdesk/circolapp/adapters/AttachmentAdapter.kt +++ b/app/src/main/java/net/underdesk/circolapp/adapters/AttachmentAdapter.kt @@ -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, - private val attachmentsUrls: List + private val attachmentsUrls: List, + private val adapterCallback: CircularLetterAdapter.AdapterCallback ) : RecyclerView.Adapter() { 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) } } diff --git a/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt b/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt index 858e914..80fe51f 100644 --- a/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt +++ b/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt @@ -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, @@ -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() } } diff --git a/app/src/main/java/net/underdesk/circolapp/utils/FileUtils.kt b/app/src/main/java/net/underdesk/circolapp/utils/FileUtils.kt new file mode 100644 index 0000000..6f69911 --- /dev/null +++ b/app/src/main/java/net/underdesk/circolapp/utils/FileUtils.kt @@ -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 +)