diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.kt b/app/src/main/java/org/linphone/contacts/ContactsManager.kt index 622e3c923..2c4332488 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.kt +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.kt @@ -114,6 +114,7 @@ class ContactsManager { val address = account.params.identityAddress ?: continue friend.address = address + friend.photo = "file:/storage/emulated/0/Android/data/org.linphone/files/Pictures/john.jpg" // TODO REMOVE Log.i( "$TAG Local contact created for account [${address.asString()}] and picture [${friend.photo}]" diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt index 8a7824f39..467acf55a 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt @@ -64,7 +64,7 @@ class EditContactFragment : GenericFragment() { if (uri != null) { Log.i("$TAG Picture picked [$uri]") // TODO FIXME: use a better file name - val localFileName = FileUtils.getFileStoragePath("temp", true) + val localFileName = FileUtils.getFileStoragePath("temp.jpg", true) lifecycleScope.launch { if (FileUtils.copyFile(uri, localFileName)) { viewModel.picturePath.postValue(localFileName.absolutePath) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt index 84386f45d..59afbadd5 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt @@ -62,7 +62,7 @@ class NewContactFragment : GenericFragment() { if (uri != null) { Log.i("$TAG Picture picked [$uri]") // TODO FIXME: use a better file name - val localFileName = FileUtils.getFileStoragePath("temp", true) + val localFileName = FileUtils.getFileStoragePath("temp.jpg", true) lifecycleScope.launch { if (FileUtils.copyFile(uri, localFileName)) { viewModel.picturePath.postValue(localFileName.absolutePath) diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt index 89cf11323..2cb9b6273 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt @@ -29,6 +29,7 @@ import org.linphone.core.FriendList.Status import org.linphone.core.tools.Log import org.linphone.ui.main.contacts.model.NewOrEditNumberOrAddressModel import org.linphone.utils.Event +import org.linphone.utils.FileUtils class ContactNewOrEditViewModel() : ViewModel() { companion object { @@ -123,10 +124,9 @@ class ContactNewOrEditViewModel() : ViewModel() { vCard.familyName = lastName.value vCard.givenName = firstName.value - // TODO FIXME : doesn't work for newly created contact val picture = picturePath.value.orEmpty() if (picture.isNotEmpty()) { - friend.photo = picture + friend.photo = FileUtils.getProperFilePath(picture) } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt index a8ed19790..ba1321a78 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt @@ -37,9 +37,14 @@ class AccountProfileFragment : GenericFragment() { private val pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri -> if (uri != null) { - Log.i("$TAG Picture picked [$uri]") - // TODO FIXME: use a better file name - val localFileName = FileUtils.getFileStoragePath("temp", true) + val identity = "john" // TODO FIXME + val localFileName = FileUtils.getFileStoragePath( + "$identity.jpg", + isImage = true, + overrideExisting = true + ) + Log.i("$TAG Picture picked [$uri], will be stored as [${localFileName.absolutePath}]") + lifecycleScope.launch { if (FileUtils.copyFile(uri, localFileName)) { withContext(Dispatchers.Main) { @@ -94,7 +99,9 @@ class AccountProfileFragment : GenericFragment() { if (found) { startPostponedEnterTransition() } else { - Log.e("$TAG Failed to find an account matching this identity address [$identity]") + Log.e( + "$TAG Failed to find an account matching this identity address [$identity]" + ) // TODO Error goBack() } diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt index e7c1f6412..ea75f2000 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt @@ -8,6 +8,7 @@ import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.core.Account import org.linphone.core.tools.Log import org.linphone.utils.Event +import org.linphone.utils.FileUtils class AccountProfileViewModel : ViewModel() { companion object { @@ -72,8 +73,9 @@ class AccountProfileViewModel : ViewModel() { @UiThread fun setImage(file: File) { - val path = file.absolutePath + val path = FileUtils.getProperFilePath(file.absolutePath) picturePath.value = path + coreContext.postOnCoreThread { if (::account.isInitialized) { val friend = coreContext.contactsManager.localFriends.find { @@ -82,6 +84,7 @@ class AccountProfileViewModel : ViewModel() { } != null } if (friend != null) { + // TODO FIXME: photo must be set on Account not Friend, Friend will be re-created from Account right after this friend.edit() friend.photo = path friend.done() diff --git a/app/src/main/java/org/linphone/utils/FileUtils.kt b/app/src/main/java/org/linphone/utils/FileUtils.kt index ec4acfeca..4d6c3a49d 100644 --- a/app/src/main/java/org/linphone/utils/FileUtils.kt +++ b/app/src/main/java/org/linphone/utils/FileUtils.kt @@ -21,6 +21,7 @@ package org.linphone.utils import android.net.Uri import android.os.Environment +import androidx.annotation.AnyThread import java.io.File import java.io.FileInputStream import java.io.FileOutputStream @@ -34,33 +35,54 @@ class FileUtils { companion object { const val TAG = "[File Utils]" - fun getFileStoragePath(fileName: String, isImage: Boolean = false): File { + @AnyThread + fun getProperFilePath(path: String): String { + if (path.startsWith("file:") || path.startsWith("content:")) { + return path + } else if (path.startsWith("/")) { + return "file:$path" + } + return "file:/$path" + } + + @AnyThread + fun getFileStoragePath( + fileName: String, + isImage: Boolean = false, + overrideExisting: Boolean = false + ): File { val path = getFileStorageDir(isImage) var file = File(path, fileName) - var prefix = 1 - while (file.exists()) { - file = File(path, prefix.toString() + "_" + fileName) - Log.w("$TAG File with that name already exists, renamed to ${file.name}") - prefix += 1 + if (!overrideExisting) { + var prefix = 1 + while (file.exists()) { + file = File(path, prefix.toString() + "_" + fileName) + Log.w("$TAG File with that name already exists, renamed to ${file.name}") + prefix += 1 + } } return file } - fun getFileStorageCacheDir(fileName: String): File { + @AnyThread + fun getFileStorageCacheDir(fileName: String, overrideExisting: Boolean = false): File { val path = coreContext.context.cacheDir Log.i("$TAG Cache directory is: $path") var file = File(path, fileName) - var prefix = 1 - while (file.exists()) { - file = File(path, prefix.toString() + "_" + fileName) - Log.w("$TAG File with that name already exists, renamed to ${file.name}") - prefix += 1 + if (!overrideExisting) { + var prefix = 1 + while (file.exists()) { + file = File(path, prefix.toString() + "_" + fileName) + Log.w("$TAG File with that name already exists, renamed to ${file.name}") + prefix += 1 + } } return file } + @AnyThread suspend fun copyFile(from: Uri, to: File): Boolean { try { withContext(Dispatchers.IO) { @@ -82,6 +104,7 @@ class FileUtils { return false } + @AnyThread suspend fun dumpStringToFile(data: String, to: File): Boolean { try { withContext(Dispatchers.IO) { @@ -101,6 +124,7 @@ class FileUtils { return false } + @AnyThread private fun getFileStorageDir(isPicture: Boolean = false): File { var path: File? = null if (Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED) {