mirror of
https://github.com/Matte23/circolapp.git
synced 2025-12-06 07:29:10 +00:00
Request write permission when downloading circulars
This commit is contained in:
@@ -18,9 +18,13 @@
|
||||
|
||||
package net.underdesk.circolapp
|
||||
|
||||
import android.app.DownloadManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.PackageManager
|
||||
import android.net.Uri
|
||||
import android.os.Bundle
|
||||
import android.os.Environment
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
@@ -30,9 +34,19 @@ import androidx.navigation.ui.AppBarConfiguration
|
||||
import androidx.navigation.ui.setupActionBarWithNavController
|
||||
import androidx.navigation.ui.setupWithNavController
|
||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import kotlinx.android.synthetic.main.activity_main.*
|
||||
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
||||
import net.underdesk.circolapp.data.Circular
|
||||
import net.underdesk.circolapp.works.PollWork
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback {
|
||||
|
||||
companion object {
|
||||
internal const val PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 10
|
||||
}
|
||||
|
||||
override var circularToDownload: Circular? = null
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@@ -80,6 +94,44 @@ class MainActivity : AppCompatActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun onRequestPermissionsResult(
|
||||
requestCode: Int,
|
||||
permissions: Array<String>, grantResults: IntArray
|
||||
) {
|
||||
when (requestCode) {
|
||||
PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE -> {
|
||||
// If request is cancelled, the result arrays are empty.
|
||||
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
|
||||
downloadCircular()
|
||||
} else {
|
||||
Snackbar.make(
|
||||
container,
|
||||
resources.getString(R.string.snackbar_write_permission_not_granted),
|
||||
Snackbar.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun downloadCircular() {
|
||||
val request = DownloadManager.Request(Uri.parse(circularToDownload!!.url))
|
||||
request.setTitle(circularToDownload!!.name)
|
||||
request.setDestinationInExternalPublicDir(
|
||||
Environment.DIRECTORY_DOWNLOADS,
|
||||
"Circolapp/" + circularToDownload!!.id + ".pdf"
|
||||
)
|
||||
|
||||
(getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request)
|
||||
|
||||
Snackbar.make(
|
||||
container,
|
||||
resources.getString(R.string.snackbar_circular_downloaded),
|
||||
Snackbar.LENGTH_LONG
|
||||
).show()
|
||||
}
|
||||
|
||||
private fun showInfoDialog() {
|
||||
val builder = AlertDialog.Builder(this)
|
||||
builder.apply {
|
||||
|
||||
@@ -18,29 +18,37 @@
|
||||
|
||||
package net.underdesk.circolapp.adapters
|
||||
|
||||
import android.app.DownloadManager
|
||||
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.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.appcompat.app.AppCompatActivity
|
||||
import androidx.core.app.ActivityCompat
|
||||
import androidx.core.content.ContextCompat
|
||||
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
|
||||
|
||||
|
||||
class CircularLetterAdapter(private val circulars: List<Circular>) :
|
||||
class CircularLetterAdapter(
|
||||
private val circulars: List<Circular>,
|
||||
private val adapterCallback: AdapterCallback
|
||||
) :
|
||||
RecyclerView.Adapter<CircularLetterAdapter.CircularLetterViewHolder>() {
|
||||
private lateinit var context: Context
|
||||
private var collapsedItems = -1
|
||||
@@ -108,14 +116,36 @@ class CircularLetterAdapter(private val circulars: List<Circular>) :
|
||||
}
|
||||
|
||||
holder.downloadButton.setOnClickListener {
|
||||
val request = DownloadManager.Request(Uri.parse(circulars[position].url))
|
||||
request.setTitle(circulars[position].name)
|
||||
request.setDestinationInExternalPublicDir(
|
||||
Environment.DIRECTORY_DOWNLOADS,
|
||||
"Circolapp/" + circulars[position].id + ".pdf"
|
||||
)
|
||||
adapterCallback.circularToDownload = circulars[position]
|
||||
|
||||
(context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request)
|
||||
if (ContextCompat.checkSelfPermission(
|
||||
context,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE
|
||||
)
|
||||
!= PackageManager.PERMISSION_GRANTED
|
||||
) {
|
||||
|
||||
val builder: AlertDialog.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 {
|
||||
@@ -163,4 +193,9 @@ class CircularLetterAdapter(private val circulars: List<Circular>) :
|
||||
}
|
||||
|
||||
override fun getItemCount() = circulars.size
|
||||
|
||||
interface AdapterCallback {
|
||||
var circularToDownload: Circular?
|
||||
fun downloadCircular()
|
||||
}
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.google.android.material.snackbar.Snackbar
|
||||
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
|
||||
import net.underdesk.circolapp.MainActivity
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
||||
import net.underdesk.circolapp.viewmodels.CircularLetterViewModel
|
||||
@@ -49,7 +50,7 @@ class CircularLetterFragment : Fragment() {
|
||||
circularLetterViewModel =
|
||||
ViewModelProviders.of(this).get(CircularLetterViewModel::class.java)
|
||||
circularLetterViewModel.circulars.observe(this, Observer {
|
||||
root.circulars_list.adapter = CircularLetterAdapter(it)
|
||||
root.circulars_list.adapter = CircularLetterAdapter(it, activity as MainActivity)
|
||||
})
|
||||
circularLetterViewModel.showMessage.observe(this, Observer {
|
||||
if (it) activity?.findViewById<ConstraintLayout>(R.id.container)?.let { view ->
|
||||
|
||||
@@ -27,6 +27,7 @@ import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
|
||||
import net.underdesk.circolapp.MainActivity
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
||||
import net.underdesk.circolapp.viewmodels.FavouritesViewModel
|
||||
@@ -47,7 +48,7 @@ class FavouritesFragment : Fragment() {
|
||||
favouritesViewModel =
|
||||
ViewModelProviders.of(this).get(FavouritesViewModel::class.java)
|
||||
favouritesViewModel.circulars.observe(this, Observer {
|
||||
root.circulars_list.adapter = CircularLetterAdapter(it)
|
||||
root.circulars_list.adapter = CircularLetterAdapter(it, activity as MainActivity)
|
||||
})
|
||||
return root
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
|
||||
import net.underdesk.circolapp.MainActivity
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
||||
import net.underdesk.circolapp.viewmodels.RemindersViewModel
|
||||
@@ -47,7 +48,7 @@ class RemindersFragment : Fragment() {
|
||||
remindersViewModel =
|
||||
ViewModelProviders.of(this).get(RemindersViewModel::class.java)
|
||||
remindersViewModel.circulars.observe(this, Observer {
|
||||
root.circulars_list.adapter = CircularLetterAdapter(it)
|
||||
root.circulars_list.adapter = CircularLetterAdapter(it, activity as MainActivity)
|
||||
})
|
||||
return root
|
||||
}
|
||||
|
||||
@@ -32,5 +32,11 @@
|
||||
© 2019 Matteo Schiff\nThis program comes with ABSOLUTELY NO WARRANTY.\nThis is free software, and you are welcome to redistribute it
|
||||
under certain conditions.</string>
|
||||
|
||||
<string name="dialog_title_permission_required">Permission required</string>
|
||||
<string name="dialog_message_permission_write">We need your permission to save this circular letter to local storage</string>
|
||||
|
||||
<string name="snackbar_write_permission_not_granted">Unable to save this circular letter to local storage. Permission not granted</string>
|
||||
<string name="snackbar_circular_downloaded">The circular letter will be saved into the download folder</string>
|
||||
|
||||
<string name="snackbar_connection_not_available">Network not available. Results may be outdated</string>
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user