Coverage Summary for Class: MediaStoreAccess (com.vsevolodganin.clicktrack.common)

Class Method, % Branch, % Line, % Instruction, %
MediaStoreAccess 0% (0/2) 0% (0/10) 0% (0/20) 0% (0/131)
MediaStoreAccess$Companion
Total 0% (0/2) 0% (0/10) 0% (0/20) 0% (0/131)


 package com.vsevolodganin.clicktrack.common
 
 import android.content.ContentResolver
 import android.content.ContentValues
 import android.net.Uri
 import android.os.Build
 import android.os.Environment
 import android.provider.MediaStore
 import me.tatarka.inject.annotations.Inject
 import java.io.File
 
 @Inject
 class MediaStoreAccess(private val resolver: ContentResolver) {
     fun addAudioFile(file: File): Uri? {
         val audioCollection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
             MediaStore.Audio.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
         } else {
             MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
         }
 
         val fileDetails = ContentValues().apply {
             put(MediaStore.Audio.Media.DISPLAY_NAME, file.name)
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                 put(MediaStore.Audio.Media.IS_PENDING, 1)
                 put(MediaStore.Audio.Media.RELATIVE_PATH, "${Environment.DIRECTORY_MUSIC}${File.separator}$CATEGORY_NAME")
             } else {
                 // Workarounds NullPointerException in MediaProvider on some older Androids: https://stackoverflow.com/a/72678037/4707823
                 val targetFile = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC), file.name)
                 put(MediaStore.Audio.Media.DATA, targetFile.absolutePath)
             }
         }
 
         val accessUri = resolver.insert(audioCollection, fileDetails) ?: return null
 
         resolver.openOutputStream(accessUri)?.use {
             file.inputStream().copyTo(it)
         }
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
             fileDetails.clear()
             fileDetails.put(MediaStore.Audio.Media.IS_PENDING, 0)
             resolver.update(accessUri, fileDetails, null, null)
         }
 
         return accessUri
     }
 
     private companion object {
         const val CATEGORY_NAME = "ClickTrack"
     }
 }