1
1
package com.edwin.recipeapp.presentation.ui.recipeDetails.recipePicture
2
2
3
+ import android.Manifest
4
+ import android.content.pm.PackageManager
5
+ import android.graphics.Bitmap
6
+ import android.graphics.drawable.Drawable
3
7
import android.os.Bundle
4
8
import android.view.Menu
5
9
import android.view.MenuInflater
10
+ import android.view.MenuItem
6
11
import android.view.View
12
+ import android.widget.Toast
13
+ import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
14
+ import androidx.appcompat.app.AlertDialog
15
+ import androidx.core.content.ContextCompat
7
16
import androidx.fragment.app.Fragment
8
17
import androidx.fragment.app.viewModels
9
18
import com.bumptech.glide.Glide
19
+ import com.bumptech.glide.request.target.CustomTarget
20
+ import com.bumptech.glide.request.transition.Transition
10
21
import com.edwin.recipeapp.R
11
22
import com.edwin.recipeapp.databinding.RecipePicuterFragmentBinding
23
+ import com.edwin.recipeapp.util.saveToGallery
24
+
12
25
13
26
class RecipePictureFragment : Fragment (R .layout.recipe_picuter_fragment) {
14
27
15
28
private val viewModel: RecipePictureViewModel by viewModels()
16
29
30
+ private val requestPermissionLauncher =
31
+ registerForActivityResult(RequestPermission ()
32
+ ) { isGranted: Boolean ->
33
+ if (isGranted) {
34
+ Toast .makeText(requireContext(), " Permission granted" , Toast .LENGTH_LONG ).show()
35
+ } else {
36
+ Toast .makeText(requireContext(), " Permission denied" , Toast .LENGTH_LONG ).show()
37
+ }
38
+ }
39
+
17
40
override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
18
41
super .onViewCreated(view, savedInstanceState)
19
42
val binding = RecipePicuterFragmentBinding .bind(view)
20
- Glide .with (view)
21
- .load(viewModel.imageUrl)
22
- .into(binding.recipePicture)
43
+ Glide .with (requireContext())
44
+ .asBitmap()
45
+ .load(viewModel.imageUrl)
46
+ .into(binding.recipePicture)
23
47
setHasOptionsMenu(true )
24
48
}
25
49
26
50
override fun onCreateOptionsMenu (menu : Menu , inflater : MenuInflater ) {
27
51
inflater.inflate(R .menu.menu_fragment_recipe_picture, menu)
28
52
super .onCreateOptionsMenu(menu, inflater)
29
53
}
54
+
55
+ override fun onOptionsItemSelected (item : MenuItem ): Boolean {
56
+ return if (item.itemId == R .id.action_download) {
57
+ checkPermission()
58
+ true
59
+ } else {
60
+ super .onOptionsItemSelected(item)
61
+ }
62
+ }
63
+
64
+ private fun checkPermission () {
65
+ when {
66
+ ContextCompat .checkSelfPermission(
67
+ requireContext(), Manifest .permission.WRITE_EXTERNAL_STORAGE )
68
+ == PackageManager .PERMISSION_GRANTED -> {
69
+ saveImage()
70
+ }
71
+ shouldShowRequestPermissionRationale(Manifest .permission.WRITE_EXTERNAL_STORAGE ) -> {
72
+ showDialog()
73
+ }
74
+ else -> requestPermissionLauncher.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
75
+ }
76
+ }
77
+
78
+ private fun saveImage () {
79
+ Glide .with (this )
80
+ .asBitmap()
81
+ .load(viewModel.imageUrl)
82
+ .into(object : CustomTarget <Bitmap >() {
83
+ override fun onResourceReady (resource : Bitmap , transition : Transition <in Bitmap >? ) {
84
+ resource.saveToGallery(requireContext())
85
+ }
86
+
87
+ override fun onLoadCleared (placeholder : Drawable ? ) {}
88
+ })
89
+ Toast .makeText(requireContext(), " Image downloaded" , Toast .LENGTH_LONG ).show()
90
+ }
91
+
92
+ private fun showDialog () {
93
+ AlertDialog .Builder (requireContext(), R .style.AlertDialogTheme ).apply { }
94
+ .setMessage(" Permission to access your storage is required to use this function" )
95
+ .setTitle(" Permission required" )
96
+ .setPositiveButton(" OK" ) { _, _ ->
97
+ requestPermissionLauncher.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
98
+ }
99
+ .setNegativeButton(" No, thanks" ) { _, _ -> }
100
+ .create().show()
101
+ }
30
102
}
0 commit comments