2929
3030package thecodemonks.org.nottzapp.ui.details
3131
32+ import android.Manifest
3233import android.annotation.SuppressLint
34+ import android.content.Intent
35+ import android.content.pm.PackageManager
3336import android.os.Bundle
34- import android.view.*
37+ import android.view.LayoutInflater
38+ import android.view.Menu
39+ import android.view.MenuInflater
40+ import android.view.MenuItem
41+ import android.view.View
42+ import android.view.ViewGroup
3543import android.widget.Toast
44+ import androidx.activity.result.contract.ActivityResultContracts
3645import androidx.core.app.ShareCompat
46+ import androidx.core.content.ContextCompat
47+ import androidx.core.view.drawToBitmap
3748import androidx.fragment.app.Fragment
3849import androidx.fragment.app.activityViewModels
3950import androidx.navigation.fragment.findNavController
@@ -42,6 +53,8 @@ import dagger.hilt.android.AndroidEntryPoint
4253import thecodemonks.org.nottzapp.R
4354import thecodemonks.org.nottzapp.databinding.FragmentNotesDetailsBinding
4455import thecodemonks.org.nottzapp.ui.notes.NotesViewModel
56+ import thecodemonks.org.nottzapp.utils.saveBitmap
57+ import thecodemonks.org.nottzapp.utils.showOrHide
4558
4659@AndroidEntryPoint
4760class NotesDetailsFragment : Fragment (R .layout.fragment_notes_details) {
@@ -52,11 +65,59 @@ class NotesDetailsFragment : Fragment(R.layout.fragment_notes_details) {
5265 private lateinit var _binding : FragmentNotesDetailsBinding
5366 private val binding get() = _binding
5467
68+ // handle permission dialog
69+ private val requestLauncher =
70+ registerForActivityResult(ActivityResultContracts .RequestPermission ()) { isGranted ->
71+ if (isGranted) shareImage() else showErrorDialog()
72+ }
73+
74+ private fun showErrorDialog () = findNavController().navigate(
75+ NotesDetailsFragmentDirections .actionNotesDetailsFragmentToErrorDialog(
76+ " Image share failed!" ,
77+ " You have to enable storage permission to share transaction as Image"
78+ )
79+ )
80+
81+ private fun shareImage () {
82+
83+ if (! isStoragePermissionGranted()) {
84+ requestLauncher.launch(Manifest .permission.WRITE_EXTERNAL_STORAGE )
85+ return
86+ }
87+
88+ // unHide watermark
89+ showLogo(true )
90+ val imageURI = binding.noteLayout.noteDetailLayout.drawToBitmap().let { bitmap ->
91+ // hide watermark
92+ showLogo(false )
93+ saveBitmap(requireActivity(), bitmap)
94+ } ? : run {
95+ Toast .makeText(requireContext(), " Error Occured" , Toast .LENGTH_SHORT ).show()
96+ return
97+ }
98+
99+ val intent = ShareCompat .IntentBuilder (requireActivity())
100+ .setType(" image/jpeg" )
101+ .setStream(imageURI)
102+ .intent
103+
104+ startActivity(Intent .createChooser(intent, null ))
105+ }
106+
107+ private fun showLogo (isVisible : Boolean ) = with (binding) {
108+ noteLayout.logo.showOrHide(isVisible)
109+ }
110+
111+ private fun isStoragePermissionGranted (): Boolean = ContextCompat .checkSelfPermission(
112+ requireContext(),
113+ Manifest .permission.WRITE_EXTERNAL_STORAGE
114+ ) == PackageManager .PERMISSION_GRANTED
115+
55116 override fun onCreateView (
56117 inflater : LayoutInflater ,
57118 container : ViewGroup ? ,
58119 savedInstanceState : Bundle ? ,
59- ): View ? {
120+ ): View {
60121 _binding = FragmentNotesDetailsBinding .inflate(inflater, container, false )
61122 return binding.root
62123 }
@@ -107,21 +168,13 @@ class NotesDetailsFragment : Fragment(R.layout.fragment_notes_details) {
107168 true
108169 }
109170
110- R .id.action_share -> {
111- val shareMsg = getString(
112- R .string.share_message,
113- args.notes.title,
114- args.notes.description
115- )
116-
117- val intent = ShareCompat .IntentBuilder .from(requireActivity())
118- .setType(" text/plain" )
119- .setText(shareMsg)
120- .intent
171+ R .id.action_share_text -> {
172+ shareText()
173+ true
174+ }
121175
122- if (intent.resolveActivity(requireActivity().packageManager) != null ) {
123- startActivity(intent)
124- }
176+ R .id.action_share_image -> {
177+ shareImage()
125178 true
126179 }
127180
@@ -135,4 +188,20 @@ class NotesDetailsFragment : Fragment(R.layout.fragment_notes_details) {
135188 it.noteET.text.toString()
136189 )
137190 }
191+
192+ @SuppressLint(" StringFormatMatches" )
193+ private fun shareText () = with (binding) {
194+ val shareMsg = getString(
195+ R .string.share_message,
196+ args.notes.title,
197+ args.notes.description
198+ )
199+
200+ val intent = ShareCompat .IntentBuilder (requireActivity())
201+ .setType(" text/plain" )
202+ .setText(shareMsg)
203+ .intent
204+
205+ startActivity(Intent .createChooser(intent, null ))
206+ }
138207}
0 commit comments