diff --git a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt
index 5f1acae..418270c 100644
--- a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt
+++ b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt
@@ -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, 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 {
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 f06cbb0..fd50ad9 100644
--- a/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt
+++ b/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt
@@ -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) :
+class CircularLetterAdapter(
+ private val circulars: List,
+ private val adapterCallback: AdapterCallback
+) :
RecyclerView.Adapter() {
private lateinit var context: Context
private var collapsedItems = -1
@@ -108,14 +116,36 @@ class CircularLetterAdapter(private val circulars: List) :
}
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) :
}
override fun getItemCount() = circulars.size
+
+ interface AdapterCallback {
+ var circularToDownload: Circular?
+ fun downloadCircular()
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt
index 43f0815..28951ca 100644
--- a/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt
+++ b/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt
@@ -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(R.id.container)?.let { view ->
diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt
index 06df961..7abe2b8 100644
--- a/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt
+++ b/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt
@@ -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
}
diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt
index 5e618ac..fbc297e 100644
--- a/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt
+++ b/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt
@@ -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
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a3f7dc9..acace3a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -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.
+ Permission required
+ We need your permission to save this circular letter to local storage
+
+ Unable to save this circular letter to local storage. Permission not granted
+ The circular letter will be saved into the download folder
+
Network not available. Results may be outdated