diff --git a/app/build.gradle b/app/build.gradle index 26c2c7611..4af8dccac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,16 +8,14 @@ plugins { id 'androidx.navigation.safeargs.kotlin' } -static def getPackageName() { - return "org.linphone" -} +def packageName = "org.linphone" android { namespace 'org.linphone' compileSdk 34 defaultConfig { - applicationId getPackageName() + applicationId packageName minSdk 27 targetSdk 34 versionCode 60000 @@ -28,14 +26,14 @@ android { buildTypes { debug { - resValue "string", "file_provider", getPackageName() + ".fileprovider" + resValue "string", "file_provider", packageName + ".fileprovider" } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - resValue "string", "file_provider", getPackageName() + ".fileprovider" + resValue "string", "file_provider", packageName + ".fileprovider" } } compileOptions { diff --git a/app/src/main/java/org/linphone/contacts/ContactLoader.kt b/app/src/main/java/org/linphone/contacts/ContactLoader.kt index 4b383e8fb..c3c1fce8c 100644 --- a/app/src/main/java/org/linphone/contacts/ContactLoader.kt +++ b/app/src/main/java/org/linphone/contacts/ContactLoader.kt @@ -48,17 +48,14 @@ class ContactLoader : LoaderManager.LoaderCallbacks { ContactsContract.CommonDataKinds.Phone.LABEL, ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER ) - - const val linphoneMime = "vnd.android.cursor.item/vnd.org.linphone.provider.sip_address" } override fun onCreateLoader(id: Int, args: Bundle?): Loader { val mimeType = ContactsContract.Data.MIMETYPE - val mimeSelection = "$mimeType = ? OR $mimeType = ? OR $mimeType = ? OR $mimeType = ?" + val mimeSelection = "$mimeType = ? OR $mimeType = ? OR $mimeType = ?" val selection = ContactsContract.Data.IN_DEFAULT_DIRECTORY + " == 1 AND ($mimeSelection)" val selectionArgs = arrayOf( - linphoneMime, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE @@ -210,7 +207,7 @@ class ContactLoader : LoaderManager.LoaderCallbacks { } } } - linphoneMime, ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE -> { + ContactsContract.CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE -> { val sipAddress: String? = cursor.getString( cursor.getColumnIndexOrThrow( diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 9a8c00f5b..85dae6730 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -59,6 +59,9 @@ class CoreContext(val context: Context) : HandlerThread("Core Thread") { Log.i("[Context] Call state changed [$state]") if (state == Call.State.OutgoingProgress) { showCallActivity() + } else if (state == Call.State.IncomingReceived) { + // TODO FIXME : remove when full screen intent notification + showCallActivity() } } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt index fe15fabd5..7aeec5c71 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt @@ -39,7 +39,7 @@ import org.linphone.ui.main.contacts.viewmodel.ContactViewModel import org.linphone.ui.main.fragment.GenericFragment import org.linphone.utils.DialogUtils import org.linphone.utils.Event -import org.linphone.utils.slideInToastFromTop +import org.linphone.utils.slideInToastFromTopForDuration class ContactFragment : GenericFragment() { private lateinit var binding: ContactFragmentBinding @@ -137,6 +137,6 @@ class ContactFragment : GenericFragment() { binding.greenToast.icon.setImageResource(R.drawable.check) val target = binding.greenToast.root - target.slideInToastFromTop(binding.root as ViewGroup, lifecycleScope) + target.slideInToastFromTopForDuration(binding.root as ViewGroup, lifecycleScope) } } diff --git a/app/src/main/java/org/linphone/ui/voip/VoipActivity.kt b/app/src/main/java/org/linphone/ui/voip/VoipActivity.kt index 42e670081..fc3efa0ad 100644 --- a/app/src/main/java/org/linphone/ui/voip/VoipActivity.kt +++ b/app/src/main/java/org/linphone/ui/voip/VoipActivity.kt @@ -25,15 +25,20 @@ import androidx.core.content.ContextCompat import androidx.core.view.WindowCompat import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController import org.linphone.LinphoneApplication import org.linphone.R import org.linphone.databinding.VoipActivityBinding +import org.linphone.ui.voip.fragment.ActiveCallFragmentDirections +import org.linphone.ui.voip.fragment.IncomingCallFragmentDirections +import org.linphone.ui.voip.fragment.OutgoingCallFragmentDirections import org.linphone.ui.voip.viewmodel.CallsViewModel class VoipActivity : AppCompatActivity() { private lateinit var binding: VoipActivityBinding - private lateinit var callViewModel: CallsViewModel + private lateinit var callsViewModel: CallsViewModel override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, true) @@ -53,11 +58,39 @@ class VoipActivity : AppCompatActivity() { binding = DataBindingUtil.setContentView(this, R.layout.voip_activity) binding.lifecycleOwner = this - callViewModel = run { + callsViewModel = run { ViewModelProvider(this)[CallsViewModel::class.java] } - callViewModel.noMoreCallEvent.observe(this) { + callsViewModel.showIncomingCallEvent.observe(this) { + it.consume { + val action = IncomingCallFragmentDirections.actionGlobalIncomingCallFragment() + findNavController(R.id.voip_nav_container).navigate(action) + } + } + + callsViewModel.showOutgoingCallEvent.observe(this) { + it.consume { + val action = OutgoingCallFragmentDirections.actionGlobalOutgoingCallFragment() + findNavController(R.id.voip_nav_container).navigate(action) + } + } + + callsViewModel.goToActiveCallEvent.observe(this) { + it.consume { + val navController = findNavController(R.id.voip_nav_container) + val action = if (navController.currentDestination?.id == R.id.outgoingCallFragment) { + OutgoingCallFragmentDirections.actionOutgoingCallFragmentToActiveCallFragment() + } else if (navController.currentDestination?.id == R.id.outgoingCallFragment) { + IncomingCallFragmentDirections.actionIncomingCallFragmentToActiveCallFragment() + } else { + ActiveCallFragmentDirections.actionGlobalActiveCallFragment() + } + navController.navigate(action) + } + } + + callsViewModel.noMoreCallEvent.observe(this) { it.consume { finish() } diff --git a/app/src/main/java/org/linphone/ui/voip/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/voip/fragment/ActiveCallFragment.kt new file mode 100644 index 000000000..0a7712324 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/voip/fragment/ActiveCallFragment.kt @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.voip.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import org.linphone.R +import org.linphone.databinding.VoipActiveCallFragmentBinding +import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.voip.viewmodel.CallViewModel + +class ActiveCallFragment : GenericFragment() { + private lateinit var binding: VoipActiveCallFragmentBinding + + private lateinit var callViewModel: CallViewModel + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = VoipActiveCallFragmentBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + callViewModel = requireActivity().run { + ViewModelProvider(this)[CallViewModel::class.java] + } + + binding.lifecycleOwner = viewLifecycleOwner + binding.viewModel = callViewModel + + callViewModel.toggleExtraActionMenuVisibilityEvent.observe(viewLifecycleOwner) { + /*it.consume { opened -> + val visibility = if (opened) View.VISIBLE else View.GONE + binding.extraActions.slideInExtraActionsMenu(binding.root as ViewGroup, visibility) + }*/ + } + + binding.blueToast.icon.setImageResource(R.drawable.trusted) + binding.blueToast.message.text = "This call can be trusted" + } +} diff --git a/app/src/main/java/org/linphone/ui/voip/fragment/IncomingCallFragment.kt b/app/src/main/java/org/linphone/ui/voip/fragment/IncomingCallFragment.kt new file mode 100644 index 000000000..d88e75342 --- /dev/null +++ b/app/src/main/java/org/linphone/ui/voip/fragment/IncomingCallFragment.kt @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2010-2023 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.linphone.ui.voip.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import org.linphone.databinding.VoipIncomingCallFragmentBinding +import org.linphone.ui.main.fragment.GenericFragment +import org.linphone.ui.voip.viewmodel.CallViewModel + +class IncomingCallFragment : GenericFragment() { + private lateinit var binding: VoipIncomingCallFragmentBinding + + private lateinit var callViewModel: CallViewModel + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = VoipIncomingCallFragmentBinding.inflate(layoutInflater) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + callViewModel = requireActivity().run { + ViewModelProvider(this)[CallViewModel::class.java] + } + + binding.lifecycleOwner = viewLifecycleOwner + binding.viewModel = callViewModel + } +} diff --git a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallViewModel.kt b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallViewModel.kt index 0c55e062f..d241b489a 100644 --- a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallViewModel.kt @@ -19,25 +19,60 @@ */ package org.linphone.ui.voip.viewmodel +import android.animation.ValueAnimator import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.R import org.linphone.core.Call import org.linphone.core.tools.Log +import org.linphone.ui.main.contacts.model.ContactModel +import org.linphone.utils.Event +import org.linphone.utils.LinphoneUtils class CallViewModel() : ViewModel() { companion object { const val TAG = "[Call ViewModel]" } + val contact = MutableLiveData() + + val displayedName = MutableLiveData() + + val displayedAddress = MutableLiveData() + val isVideoEnabled = MutableLiveData() val isOutgoing = MutableLiveData() + val isActionsMenuExpanded = MutableLiveData() + + val extraActionsMenuTranslateY = MutableLiveData() + + private val extraActionsMenuHeight = coreContext.context.resources.getDimension( + R.dimen.in_call_extra_actions_menu_height + ) + private val extraButtonsMenuAnimator: ValueAnimator by lazy { + ValueAnimator.ofFloat( + extraActionsMenuHeight, + 0f + ).apply { + addUpdateListener { + val value = it.animatedValue as Float + extraActionsMenuTranslateY.value = value + } + duration = 500 + } + } + + val toggleExtraActionMenuVisibilityEvent = MutableLiveData>() + private lateinit var call: Call init { isVideoEnabled.value = false + isActionsMenuExpanded.value = false + extraActionsMenuTranslateY.value = extraActionsMenuHeight coreContext.postOnCoreThread { core -> val currentCall = core.currentCall ?: core.calls.firstOrNull() @@ -52,6 +87,18 @@ class CallViewModel() : ViewModel() { isVideoEnabled.postValue(call.params.isVideoEnabled) } isOutgoing.postValue(call.dir == Call.Dir.Outgoing) + + val address = call.remoteAddress + address.clean() + displayedAddress.postValue(address.asStringUriOnly()) + + val friend = core.findFriend(address) + if (friend != null) { + displayedName.postValue(friend.name) + contact.postValue(ContactModel(friend)) + } else { + displayedName.postValue(LinphoneUtils.getDisplayName(address)) + } } else { Log.e("$TAG Failed to find outgoing call!") } @@ -65,4 +112,16 @@ class CallViewModel() : ViewModel() { call.terminate() } } + + fun toggleExpandActionsMenu() { + // UI thread + isActionsMenuExpanded.value = isActionsMenuExpanded.value == false + + if (isActionsMenuExpanded.value == true) { + extraButtonsMenuAnimator.start() + } else { + extraButtonsMenuAnimator.reverse() + } + // toggleExtraActionMenuVisibilityEvent.value = Event(isActionsMenuExpanded.value == true) + } } diff --git a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt index 075dffec8..0d69473ab 100644 --- a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt @@ -22,15 +22,20 @@ package org.linphone.ui.voip.viewmodel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.core.Call import org.linphone.core.Core import org.linphone.core.CoreListenerStub import org.linphone.core.tools.Log import org.linphone.utils.Event class CallsViewModel : ViewModel() { - val noMoreCallEvent: MutableLiveData> by lazy { - MutableLiveData>() - } + val goToActiveCallEvent = MutableLiveData>() + + val showIncomingCallEvent = MutableLiveData>() + + val showOutgoingCallEvent = MutableLiveData>() + + val noMoreCallEvent = MutableLiveData>() private val coreListener = object : CoreListenerStub() { override fun onLastCallEnded(core: Core) { @@ -38,11 +43,49 @@ class CallsViewModel : ViewModel() { Log.i("[Calls ViewModel] No more call, leaving VoIP activity") noMoreCallEvent.postValue(Event(true)) } + + override fun onCallStateChanged( + core: Core, + call: Call, + state: Call.State, + message: String + ) { + // Core thread + if (call == core.currentCall || core.currentCall == null) { + when (call.state) { + Call.State.Connected -> { + goToActiveCallEvent.postValue(Event(true)) + } + else -> { + } + } + } + } } init { coreContext.postOnCoreThread { core -> core.addListener(coreListener) + + if (core.callsNb > 0) { + val currentCall = core.currentCall ?: core.calls.first() + + when (currentCall.state) { + Call.State.Connected, Call.State.StreamsRunning, Call.State.Paused, Call.State.Pausing, Call.State.PausedByRemote, Call.State.UpdatedByRemote, Call.State.Updating -> { + goToActiveCallEvent.postValue(Event(true)) + } + Call.State.OutgoingInit, Call.State.OutgoingRinging, Call.State.OutgoingProgress, Call.State.OutgoingEarlyMedia -> { + showOutgoingCallEvent.postValue(Event(true)) + } + Call.State.IncomingReceived, Call.State.IncomingEarlyMedia -> { + showIncomingCallEvent.postValue(Event(true)) + } + else -> { + } + } + } else { + noMoreCallEvent.postValue(Event(true)) + } } } diff --git a/app/src/main/java/org/linphone/utils/AnimationsUtils.kt b/app/src/main/java/org/linphone/utils/AnimationsUtils.kt index a3d63f72a..52c4c8bcd 100644 --- a/app/src/main/java/org/linphone/utils/AnimationsUtils.kt +++ b/app/src/main/java/org/linphone/utils/AnimationsUtils.kt @@ -31,7 +31,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -fun View.slideInToastFromTop( +fun View.slideInToastFromTopForDuration( root: ViewGroup, lifecycleScope: LifecycleCoroutineScope, duration: Long = 5000 @@ -55,3 +55,15 @@ fun View.slideInToastFromTop( } } } + +fun View.slideInExtraActionsMenu( + root: ViewGroup, + visibility: Int +) { + val transition: Transition = Slide(Gravity.BOTTOM) + transition.duration = 600 + transition.addTarget(this) + + TransitionManager.beginDelayedTransition(root, transition) + this.translationY = 0f +} diff --git a/app/src/main/res/drawable/calls_list.xml b/app/src/main/res/drawable/calls_list.xml new file mode 100644 index 000000000..3a56ba128 --- /dev/null +++ b/app/src/main/res/drawable/calls_list.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/dialer.xml b/app/src/main/res/drawable/dialer.xml new file mode 100644 index 000000000..692e4aa60 --- /dev/null +++ b/app/src/main/res/drawable/dialer.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/new_call.xml b/app/src/main/res/drawable/new_call.xml new file mode 100644 index 000000000..531d2546c --- /dev/null +++ b/app/src/main/res/drawable/new_call.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/numpad.xml b/app/src/main/res/drawable/numpad.xml new file mode 100644 index 000000000..086c499fe --- /dev/null +++ b/app/src/main/res/drawable/numpad.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/pause_call.xml b/app/src/main/res/drawable/pause_call.xml new file mode 100644 index 000000000..b380c2569 --- /dev/null +++ b/app/src/main/res/drawable/pause_call.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/record_call.xml b/app/src/main/res/drawable/record_call.xml new file mode 100644 index 000000000..dc79c1cc1 --- /dev/null +++ b/app/src/main/res/drawable/record_call.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/app/src/main/res/drawable/transfer.xml b/app/src/main/res/drawable/transfer.xml new file mode 100644 index 000000000..22384d444 --- /dev/null +++ b/app/src/main/res/drawable/transfer.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/layout/toast_blue.xml b/app/src/main/res/layout/toast_blue.xml index b52f88075..6c9a8b501 100644 --- a/app/src/main/res/layout/toast_blue.xml +++ b/app/src/main/res/layout/toast_blue.xml @@ -63,7 +63,7 @@ android:layout_marginStart="8dp" android:paddingTop="8dp" android:paddingBottom="8dp" - android:text="@{message, default=`Call is completely secured`}" + android:text="@{message, default=`This call can be trusted`}" android:textSize="14sp" android:textColor="@color/trusted_blue" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/voip_active_call_fragment.xml b/app/src/main/res/layout/voip_active_call_fragment.xml index f9fc403e4..f623919a8 100644 --- a/app/src/main/res/layout/voip_active_call_fragment.xml +++ b/app/src/main/res/layout/voip_active_call_fragment.xml @@ -39,6 +39,31 @@ app:layout_constraintStart_toEndOf="@id/call_direction_icon" app:layout_constraintTop_toTopOf="parent"/> + + + + @@ -81,7 +109,7 @@ android:layout_width="@dimen/avatar_in_call_size" android:layout_height="@dimen/avatar_in_call_size" app:avatarViewBorderWidth="0dp" - app:avatarViewInitials="SB" + contactAvatar="@{viewModel.contact}" app:avatarViewInitialsBackgroundColor="@color/blue_outgoing_message" app:avatarViewInitialsTextColor="@color/gray_9" app:avatarViewInitialsTextSize="36sp" @@ -99,7 +127,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="15dp" - android:text="Sylvain Berfini" + android:text="@{viewModel.displayedName, default=`John Doe`}" android:textColor="@color/white" android:textSize="22sp" app:layout_constraintTop_toBottomOf="@id/avatar" @@ -111,7 +139,7 @@ android:id="@+id/address" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="sip:sberfini@sip.linphone.org" + android:text="@{viewModel.displayedAddress, default=`sip:johndoe@sip.linphone.org`}" android:textColor="@color/white" android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/name" @@ -119,11 +147,12 @@ app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/voip_call_extra_actions.xml b/app/src/main/res/layout/voip_call_extra_actions.xml new file mode 100644 index 000000000..dd817860a --- /dev/null +++ b/app/src/main/res/layout/voip_call_extra_actions.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/voip_call_bottom_bar.xml b/app/src/main/res/layout/voip_call_main_actions.xml similarity index 76% rename from app/src/main/res/layout/voip_call_bottom_bar.xml rename to app/src/main/res/layout/voip_call_main_actions.xml index 562047206..296cd74be 100644 --- a/app/src/main/res/layout/voip_call_bottom_bar.xml +++ b/app/src/main/res/layout/voip_call_main_actions.xml @@ -8,15 +8,30 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/voip_incoming_call_fragment.xml b/app/src/main/res/layout/voip_incoming_call_fragment.xml index c18f6e3d1..0b2e81dfc 100644 --- a/app/src/main/res/layout/voip_incoming_call_fragment.xml +++ b/app/src/main/res/layout/voip_incoming_call_fragment.xml @@ -57,7 +57,7 @@ android:layout_width="@dimen/avatar_in_call_size" android:layout_height="@dimen/avatar_in_call_size" app:avatarViewBorderWidth="0dp" - app:avatarViewInitials="SB" + contactAvatar="@{viewModel.contact}" app:avatarViewInitialsBackgroundColor="@color/blue_outgoing_message" app:avatarViewInitialsTextColor="@color/gray_9" app:avatarViewInitialsTextSize="36sp" @@ -97,7 +97,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="15dp" - android:text="Sylvain Berfini" + android:text="@{viewModel.displayedName, default=`John Doe`}" android:textColor="@color/white" android:textSize="22sp" app:layout_constraintTop_toBottomOf="@id/avatar" @@ -109,7 +109,7 @@ android:id="@+id/address" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="sip:sberfini@sip.linphone.org" + android:text="@{viewModel.displayedAddress, default=`sip:johndoe@sip.linphone.org`}" android:textColor="@color/white" android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/name" @@ -119,7 +119,7 @@ diff --git a/app/src/main/res/navigation/voip_nav_graph.xml b/app/src/main/res/navigation/voip_nav_graph.xml index c43e7a400..37fa9cc80 100644 --- a/app/src/main/res/navigation/voip_nav_graph.xml +++ b/app/src/main/res/navigation/voip_nav_graph.xml @@ -9,6 +9,50 @@ android:id="@+id/outgoingCallFragment" android:name="org.linphone.ui.voip.fragment.OutgoingCallFragment" android:label="OutgoingCallFragment" - tools:layout="@layout/voip_outgoing_call_fragment"/> + tools:layout="@layout/voip_outgoing_call_fragment"> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index 4f6427125..5d74d6bcd 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -10,4 +10,10 @@ 50dp 100dp 120dp + + 116dp + 237dp + 353dp + + 360dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0268f2388..14c162131 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,5 @@ Linphone + + | \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0c8d6ab95..83bcb19c8 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -46,4 +46,12 @@ @color/red_danger 8dp +