Skip to content

Commit ad4d86f

Browse files
committed
Added new code
1 parent 863b8d4 commit ad4d86f

File tree

2 files changed

+88
-5
lines changed

2 files changed

+88
-5
lines changed

Application/app/src/main/java/com/istudio/distancetracker/features/map/presentation/view/MapFragment.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@ package com.istudio.distancetracker.features.map.presentation.view
22

33
import android.annotation.SuppressLint
44
import android.app.Dialog
5+
import android.content.ContentValues
56
import android.content.Intent
67
import android.content.res.Configuration
8+
import android.graphics.Bitmap
79
import android.graphics.Color
810
import android.graphics.drawable.ColorDrawable
11+
import android.os.Build
912
import android.os.Bundle
13+
import android.os.Environment
14+
import android.provider.MediaStore
1015
import android.provider.Settings
1116
import android.view.Gravity
1217
import android.view.LayoutInflater
@@ -15,6 +20,7 @@ import android.view.ViewGroup
1520
import android.view.Window
1621
import android.widget.LinearLayout
1722
import androidx.activity.result.contract.ActivityResultContracts
23+
import androidx.annotation.RequiresApi
1824
import androidx.appcompat.app.AppCompatDelegate
1925
import androidx.fragment.app.Fragment
2026
import androidx.fragment.app.viewModels
@@ -49,14 +55,18 @@ import com.istudio.distancetracker.features.map.domain.entities.outputs.Calculat
4955
import com.istudio.distancetracker.features.map.events.EventMapStyleSelected
5056
import com.istudio.distancetracker.features.map.presentation.state.MapStates
5157
import com.istudio.distancetracker.features.map.presentation.vm.MapsVm
58+
import com.istudio.distancetracker.features.map.util.FileOperations
5259
import com.istudio.distancetracker.features.map.util.MapUtil.setCameraPosition
5360
import com.istudio.distancetracker.model.Result
5461
import com.istudio.distancetracker.service.TrackerService
5562
import com.istudio.feat_inappreview.dialog.ReviewDialog
5663
import com.istudio.feat_inappreview.manager.InAppReviewManager
5764
import dagger.hilt.android.AndroidEntryPoint
65+
import kotlinx.coroutines.Dispatchers
5866
import kotlinx.coroutines.delay
5967
import kotlinx.coroutines.launch
68+
import kotlinx.coroutines.withContext
69+
import java.io.File
6070
import javax.inject.Inject
6171

6272

@@ -328,6 +338,7 @@ class MapFragment : Fragment(), GoogleMap.OnMyLocationButtonClickListener {
328338
resultPageNavigation(resultCalculated)
329339
// Display the reset state for map since the result is calculated and shown
330340
binding.mapMasterViewId.resetMapUiState()
341+
setMapSnapshot()
331342
}
332343
}
333344

@@ -514,12 +525,16 @@ class MapFragment : Fragment(), GoogleMap.OnMyLocationButtonClickListener {
514525
/**
515526
* Getting a snapshot from the Map fragment
516527
*/
517-
fun setMapSnapshot() {
518-
map.snapshot {
519-
log.i(TAG,"Taking the snapshot for the map:-> $it")
520-
val mapImage = it?: return@snapshot
521-
522528

529+
fun setMapSnapshot() {
530+
map.snapshot { imgBitmap ->
531+
log.i(TAG,"Taking the snapshot for the map:-> $imgBitmap")
532+
val mapImage = imgBitmap?: return@snapshot
533+
lifecycleScope.launchWhenStarted {
534+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
535+
FileOperations.saveImage(requireContext(),imgBitmap)
536+
}
537+
}
523538
}
524539
}
525540
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.istudio.distancetracker.features.map.util
2+
3+
import android.app.RecoverableSecurityException
4+
import android.content.*
5+
import android.graphics.Bitmap
6+
import android.graphics.Bitmap.CompressFormat
7+
import android.net.Uri
8+
import android.os.Build
9+
import android.os.Environment
10+
import android.provider.MediaStore
11+
import android.util.Log
12+
import androidx.annotation.RequiresApi
13+
import com.istudio.distancetracker.R
14+
import kotlinx.coroutines.Dispatchers
15+
import kotlinx.coroutines.withContext
16+
import java.io.File
17+
import java.io.FileOutputStream
18+
19+
20+
private const val TAG = "FileOperations"
21+
private const val QUALITY = 100
22+
23+
object FileOperations {
24+
25+
@RequiresApi(Build.VERSION_CODES.Q)
26+
suspend fun saveImage(context: Context, bitmap: Bitmap) {
27+
withContext(Dispatchers.IO) {
28+
val collection =
29+
MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
30+
31+
val dirDest = File(Environment.DIRECTORY_PICTURES, context.getString(R.string.app_name))
32+
val date = System.currentTimeMillis()
33+
val extension = Bitmap.CompressFormat.PNG
34+
35+
val newImage = ContentValues().apply {
36+
put(MediaStore.Images.Media.DISPLAY_NAME, "$date.$extension")
37+
put(MediaStore.MediaColumns.MIME_TYPE, "image/$extension")
38+
put(MediaStore.MediaColumns.DATE_ADDED, date)
39+
put(MediaStore.MediaColumns.DATE_MODIFIED, date)
40+
put(MediaStore.MediaColumns.SIZE, bitmap.byteCount)
41+
put(MediaStore.MediaColumns.WIDTH, bitmap.width)
42+
put(MediaStore.MediaColumns.HEIGHT, bitmap.height)
43+
put(MediaStore.MediaColumns.RELATIVE_PATH, "$dirDest${File.separator}")
44+
put(MediaStore.Images.Media.IS_PENDING, 1)
45+
}
46+
47+
val newImageUri = context.contentResolver.insert(collection, newImage)
48+
49+
context.contentResolver.openOutputStream(newImageUri!!, "w").use {
50+
bitmap.compress(extension, QUALITY, it)
51+
}
52+
53+
newImage.clear()
54+
newImage.put(MediaStore.Images.Media.IS_PENDING, 0)
55+
context.contentResolver.update(newImageUri, newImage, null, null)
56+
}
57+
}
58+
59+
fun getPhotoDirFromAppStorage(dirName: String,context:Context): File? {
60+
val file = File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), dirName)
61+
if (!file.mkdirs()) {
62+
Log.e("TEST", "Directory not created")
63+
}
64+
return file
65+
}
66+
67+
68+
}

0 commit comments

Comments
 (0)