From ff13b2fd1f268ae900ec2d2a4a99fc3b9d660a20 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 18 Aug 2020 13:51:13 +0200 Subject: [PATCH] Added missing local default account avatar --- .../chat/fragments/DetailChatRoomFragment.kt | 32 +----------- .../fragments/ContactEditorFragment.kt | 40 ++------------- .../sidemenu/fragments/SideMenuFragment.kt | 50 +++++++++++++++++++ .../sidemenu/viewmodels/SideMenuViewModel.kt | 7 +++ .../java/org/linphone/core/CorePreferences.kt | 6 +++ .../org/linphone/utils/DataBindingUtils.kt | 10 ++++ .../java/org/linphone/utils/ImageUtils.kt | 38 ++++++++++++++ .../main/res/layout/side_menu_fragment.xml | 16 +++++- 8 files changed, 132 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt index 32e4c2e1f..41185b5ed 100644 --- a/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/chat/fragments/DetailChatRoomFragment.kt @@ -311,37 +311,7 @@ class DetailChatRoomFragment : MasterFragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK) { lifecycleScope.launch { - var fileToUploadPath: String? = null - val temporaryFileUploadPath = chatSendingViewModel.temporaryFileUploadPath - if (temporaryFileUploadPath != null) { - if (data != null) { - val dataUri = data.data - if (dataUri != null) { - fileToUploadPath = dataUri.toString() - Log.i("[Chat Room] Using data URI $fileToUploadPath") - } else if (temporaryFileUploadPath.exists()) { - fileToUploadPath = temporaryFileUploadPath.absolutePath - Log.i("[Chat Room] Data URI is null, using $fileToUploadPath") - } - } else if (temporaryFileUploadPath.exists()) { - fileToUploadPath = temporaryFileUploadPath.absolutePath - Log.i("[Chat Room] Data is null, using $fileToUploadPath") - } - } - - if (fileToUploadPath != null) { - if (fileToUploadPath.startsWith("content://") || - fileToUploadPath.startsWith("file://") - ) { - val uriToParse = Uri.parse(fileToUploadPath) - fileToUploadPath = FileUtils.getFilePath(requireContext(), uriToParse) - Log.i("[Chat] Path was using a content or file scheme, real path is: $fileToUploadPath") - if (fileToUploadPath == null) { - Log.e("[Chat] Failed to get access to file $uriToParse") - } - } - } - + val fileToUploadPath = ImageUtils.getImageFilePathFromPickerIntent(data, chatSendingViewModel.temporaryFileUploadPath) if (fileToUploadPath != null) { chatSendingViewModel.addAttachment(fileToUploadPath) } diff --git a/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt b/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt index 401562e0b..d80a3548b 100644 --- a/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/contact/fragments/ContactEditorFragment.kt @@ -44,6 +44,7 @@ import org.linphone.contact.NativeContact import org.linphone.core.tools.Log import org.linphone.databinding.ContactEditorFragmentBinding import org.linphone.utils.FileUtils +import org.linphone.utils.ImageUtils import org.linphone.utils.PermissionHelper class ContactEditorFragment : Fragment() { @@ -133,40 +134,9 @@ class ContactEditorFragment : Fragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK) { lifecycleScope.launch { - var fileToUploadPath: String? = null - - val temporaryFileUploadPath = temporaryPicturePath - if (temporaryFileUploadPath != null) { - if (data != null) { - val dataUri = data.data - if (dataUri != null) { - fileToUploadPath = dataUri.toString() - Log.i("[Chat Room] Using data URI $fileToUploadPath") - } else if (temporaryFileUploadPath.exists()) { - fileToUploadPath = temporaryFileUploadPath.absolutePath - Log.i("[Chat Room] Data URI is null, using $fileToUploadPath") - } - } else if (temporaryFileUploadPath.exists()) { - fileToUploadPath = temporaryFileUploadPath.absolutePath - Log.i("[Chat Room] Data is null, using $fileToUploadPath") - } - } - - if (fileToUploadPath != null) { - if (fileToUploadPath.startsWith("content://") || - fileToUploadPath.startsWith("file://") - ) { - val uriToParse = Uri.parse(fileToUploadPath) - fileToUploadPath = FileUtils.getFilePath(requireContext(), uriToParse) - Log.i("[Chat] Path was using a content or file scheme, real path is: $fileToUploadPath") - if (fileToUploadPath == null) { - Log.e("[Chat] Failed to get access to file $uriToParse") - } - } - } - - if (fileToUploadPath != null) { - viewModel.setPictureFromPath(fileToUploadPath) + val contactImageFilePath = ImageUtils.getImageFilePathFromPickerIntent(data, temporaryPicturePath) + if (contactImageFilePath != null) { + viewModel.setPictureFromPath(contactImageFilePath) } } } @@ -175,7 +145,7 @@ class ContactEditorFragment : Fragment() { private fun pickFile() { val cameraIntents = ArrayList() - // Handles image & video picking + // Handles image picking val galleryIntent = Intent(Intent.ACTION_PICK) galleryIntent.type = "image/*" diff --git a/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt b/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt index 6e2c729e6..1115d22b2 100644 --- a/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/sidemenu/fragments/SideMenuFragment.kt @@ -19,15 +19,22 @@ */ package org.linphone.activities.main.sidemenu.fragments +import android.app.Activity import android.content.Intent +import android.net.Uri import android.os.Bundle +import android.os.Parcelable +import android.provider.MediaStore import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import java.io.File +import kotlinx.coroutines.launch import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.assistant.AssistantActivity @@ -38,11 +45,15 @@ import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.core.tools.Log import org.linphone.databinding.SideMenuFragmentBinding import org.linphone.utils.Event +import org.linphone.utils.FileUtils +import org.linphone.utils.ImageUtils +import org.linphone.utils.PermissionHelper class SideMenuFragment : Fragment() { private lateinit var binding: SideMenuFragmentBinding private lateinit var viewModel: SideMenuViewModel private lateinit var sharedViewModel: SharedMainViewModel + private var temporaryPicturePath: File? = null override fun onCreateView( inflater: LayoutInflater, @@ -81,6 +92,10 @@ class SideMenuFragment : Fragment() { } } + binding.setSelfPictureClickListener { + pickFile() + } + binding.setAssistantClickListener { sharedViewModel.toggleDrawerEvent.value = Event(true) startActivity(Intent(context, AssistantActivity::class.java)) @@ -106,4 +121,39 @@ class SideMenuFragment : Fragment() { coreContext.stop() } } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK) { + lifecycleScope.launch { + val contactImageFilePath = ImageUtils.getImageFilePathFromPickerIntent(data, temporaryPicturePath) + if (contactImageFilePath != null) { + viewModel.setPictureFromPath(contactImageFilePath) + } + } + } + } + + private fun pickFile() { + val cameraIntents = ArrayList() + + // Handles image picking + val galleryIntent = Intent(Intent.ACTION_PICK) + galleryIntent.type = "image/*" + + if (PermissionHelper.get().hasCameraPermission()) { + // Allows to capture directly from the camera + val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + val tempFileName = System.currentTimeMillis().toString() + ".jpeg" + temporaryPicturePath = FileUtils.getFileStoragePath(tempFileName) + val uri = Uri.fromFile(temporaryPicturePath) + captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri) + cameraIntents.add(captureIntent) + } + + val chooserIntent = + Intent.createChooser(galleryIntent, getString(R.string.chat_message_pick_file_dialog)) + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(arrayOf())) + + startActivityForResult(chooserIntent, 0) + } } diff --git a/app/src/main/java/org/linphone/activities/main/sidemenu/viewmodels/SideMenuViewModel.kt b/app/src/main/java/org/linphone/activities/main/sidemenu/viewmodels/SideMenuViewModel.kt index 000d68150..95acd6617 100644 --- a/app/src/main/java/org/linphone/activities/main/sidemenu/viewmodels/SideMenuViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/sidemenu/viewmodels/SideMenuViewModel.kt @@ -37,6 +37,7 @@ class SideMenuViewModel : ViewModel() { val defaultAccount = MutableLiveData() val defaultAccountFound = MutableLiveData() + val defaultAccountAvatar = MutableLiveData() val accounts = MutableLiveData>() @@ -64,6 +65,7 @@ class SideMenuViewModel : ViewModel() { init { defaultAccountFound.value = false + defaultAccountAvatar.value = corePreferences.defaultAccountAvatarPath coreContext.core.addListener(listener) updateAccountsList() } @@ -94,4 +96,9 @@ class SideMenuViewModel : ViewModel() { } accounts.value = list } + + fun setPictureFromPath(picturePath: String) { + corePreferences.defaultAccountAvatarPath = picturePath + defaultAccountAvatar.value = corePreferences.defaultAccountAvatarPath + } } diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index ca8628584..8a9481b42 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -276,6 +276,12 @@ class CorePreferences constructor(private val context: Context) { /* Side Menu */ + var defaultAccountAvatarPath: String? + get() = config.getString("app", "default_avatar_path", null) + set(value) { + config.setString("app", "default_avatar_path", value) + } + val showAccountsInSideMenu: Boolean get() = config.getBool("app", "side_menu_accounts", true) diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index dcbd01b25..740fa2fee 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -263,6 +263,16 @@ fun setEntries( setEntries(viewGroup, entries, layoutId, null, parent) } +@BindingAdapter("glideAvatarFallback") +fun loadAvatarWithGlideFallback(imageView: ImageView, path: String?) { + if (path != null && path.isNotEmpty() && FileUtils.isExtensionImage(path)) { + Glide.with(imageView).load(path).apply(RequestOptions.circleCropTransform()).into(imageView) + } else { + Log.w("[Data Binding] [Glide] Can't load $path") + imageView.setImageResource(R.drawable.avatar) + } +} + @BindingAdapter("glidePath") fun loadImageWithGlide(imageView: ImageView, path: String) { if (path.isNotEmpty() && FileUtils.isExtensionImage(path)) { diff --git a/app/src/main/java/org/linphone/utils/ImageUtils.kt b/app/src/main/java/org/linphone/utils/ImageUtils.kt index d277f15de..cc1e43238 100644 --- a/app/src/main/java/org/linphone/utils/ImageUtils.kt +++ b/app/src/main/java/org/linphone/utils/ImageUtils.kt @@ -20,10 +20,14 @@ package org.linphone.utils import android.content.Context +import android.content.Intent import android.graphics.* import android.media.ThumbnailUtils import android.net.Uri import android.provider.MediaStore +import java.io.File +import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.core.tools.Log class ImageUtils { companion object { @@ -67,6 +71,40 @@ class ImageUtils { return ThumbnailUtils.createVideoThumbnail(path, MediaStore.Images.Thumbnails.MINI_KIND) } + suspend fun getImageFilePathFromPickerIntent(data: Intent?, temporaryImageFilePath: File?): String? { + var imageFilePath: String? = null + if (temporaryImageFilePath != null) { + if (data != null) { + val dataUri = data.data + if (dataUri != null) { + imageFilePath = dataUri.toString() + Log.i("[Image Utils] Using data URI $imageFilePath") + } else if (temporaryImageFilePath.exists()) { + imageFilePath = temporaryImageFilePath.absolutePath + Log.i("[Image Utils] Data URI is null, using $imageFilePath") + } + } else if (temporaryImageFilePath.exists()) { + imageFilePath = temporaryImageFilePath.absolutePath + Log.i("[Image Utils] Data is null, using $imageFilePath") + } + } + + if (imageFilePath != null) { + if (imageFilePath.startsWith("content://") || + imageFilePath.startsWith("file://") + ) { + val uriToParse = Uri.parse(imageFilePath) + imageFilePath = FileUtils.getFilePath(coreContext.context, uriToParse) + Log.i("[Image Utils] Path was using a content or file scheme, real path is: $imageFilePath") + if (imageFilePath == null) { + Log.e("[Image Utils] Failed to get access to file $uriToParse") + } + } + } + + return imageFilePath + } + private fun getRoundBitmap(bitmap: Bitmap): Bitmap? { val output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) diff --git a/app/src/main/res/layout/side_menu_fragment.xml b/app/src/main/res/layout/side_menu_fragment.xml index 216451fe2..46ded7274 100644 --- a/app/src/main/res/layout/side_menu_fragment.xml +++ b/app/src/main/res/layout/side_menu_fragment.xml @@ -4,6 +4,9 @@ + @@ -39,10 +42,21 @@ android:layout_height="70dp" android:background="?attr/lightToolbarBackgroundColor"> + +