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