diff --git a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt index fa99d64d5..63c8edfbd 100644 --- a/app/src/main/java/org/linphone/notifications/NotificationsManager.kt +++ b/app/src/main/java/org/linphone/notifications/NotificationsManager.kt @@ -39,7 +39,6 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.app.Person import androidx.core.app.RemoteInput -import androidx.core.content.ContextCompat import androidx.core.content.LocusIdCompat import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences @@ -703,7 +702,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) setAutoCancel(false) setShowWhen(true) setOngoing(true) - color = ContextCompat.getColor(context, R.color.orange_main_500) + color = AppUtils.getColor(R.color.orange_main_500) setFullScreenIntent(pendingIntent, true) } @@ -759,7 +758,7 @@ class NotificationsManager @MainThread constructor(private val context: Context) .setSmallIcon(R.drawable.chat_text) .setAutoCancel(true) .setLargeIcon(largeIcon) - .setColor(ContextCompat.getColor(context, R.color.orange_main_500)) + .setColor(AppUtils.getColor(R.color.orange_main_500)) .setCategory(NotificationCompat.CATEGORY_MESSAGE) .setGroup(CHAT_NOTIFICATIONS_GROUP) .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) diff --git a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt index 4aab752f0..f4788ca6d 100644 --- a/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/call/fragment/ActiveCallFragment.kt @@ -252,6 +252,8 @@ class ActiveCallFragment : GenericCallFragment() { override fun onSlide(bottomSheet: View, slideOffset: Float) {} }) + + binding.bottomBar.chat.isEnabled = false // TODO FIXME : remove later when chat will be available } @SuppressLint("ClickableViewAccessibility") diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index 68b44ef25..b47cc6a11 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -30,12 +30,14 @@ import androidx.annotation.UiThread import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.findNavController import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.databinding.MainActivityBinding +import org.linphone.ui.main.viewmodel.MainViewModel import org.linphone.utils.AppUtils import org.linphone.utils.slideInToastFromTopForDuration @@ -51,6 +53,8 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: MainActivityBinding + private lateinit var viewModel: MainViewModel + override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, true) super.onCreate(savedInstanceState) @@ -67,6 +71,28 @@ class MainActivity : AppCompatActivity() { binding = DataBindingUtil.setContentView(this, R.layout.main_activity) binding.lifecycleOwner = this + + viewModel = run { + ViewModelProvider(this)[MainViewModel::class.java] + } + binding.viewModel = viewModel + + viewModel.changeSystemTopBarColorToInCallEvent.observe(this) { + it.consume { useInCallColor -> + val color = if (useInCallColor) { + AppUtils.getColor(R.color.green_success_500) + } else { + AppUtils.getColor(R.color.orange_main_500) + } + window.statusBarColor = color + } + } + + viewModel.goBackToCallEvent.observe(this) { + it.consume { + coreContext.showCallActivity() + } + } } override fun onPostCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt index 29ab7ef22..cc003b7aa 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/AbstractTopBarFragment.kt @@ -20,9 +20,6 @@ package org.linphone.ui.main.fragment import androidx.annotation.UiThread -import androidx.core.content.ContextCompat -import org.linphone.LinphoneApplication -import org.linphone.R import org.linphone.ui.main.MainActivity import org.linphone.ui.main.viewmodel.AbstractTopBarViewModel @@ -36,28 +33,5 @@ abstract class AbstractTopBarFragment : GenericFragment() { (requireActivity() as MainActivity).toggleDrawerMenu() } } - - viewModel.changeSystemTopBarColorToInCallEvent.observe(viewLifecycleOwner) { - it.consume { useInCallColor -> - val color = if (useInCallColor) { - ContextCompat.getColor( - requireContext(), - R.color.green_success_500 - ) - } else { - ContextCompat.getColor( - requireContext(), - R.color.orange_main_500 - ) - } - requireActivity().window.statusBarColor = color - } - } - - viewModel.goBackToCallEvent.observe(viewLifecycleOwner) { - it.consume { - LinphoneApplication.coreContext.showCallActivity() - } - } } } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt index 0a8c9d61a..bdbc7a707 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/AbstractTopBarViewModel.kt @@ -20,17 +20,12 @@ package org.linphone.ui.main.viewmodel import androidx.annotation.UiThread -import androidx.annotation.WorkerThread 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.ui.main.model.AccountModel import org.linphone.utils.Event -import org.linphone.utils.LinphoneUtils open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { companion object { @@ -45,12 +40,6 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { val searchFilter = MutableLiveData() - val atLastOneCall = MutableLiveData() - - val callDisplayName = MutableLiveData() - - val callStatus = MutableLiveData() - val focusSearchBarEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -59,46 +48,9 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { MutableLiveData>() } - val changeSystemTopBarColorToInCallEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - - val goBackToCallEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - - private val coreListener = object : CoreListenerStub() { - @WorkerThread - override fun onLastCallEnded(core: Core) { - Log.i("$TAG Last call ended, asking fragment to change back status bar color") - changeSystemTopBarColorToInCallEvent.postValue(Event(false)) - } - - @WorkerThread - override fun onCallStateChanged( - core: Core, - call: Call, - state: Call.State?, - message: String - ) { - if (core.callsNb > 0) { - updateCurrentCallInfo() - } - atLastOneCall.postValue(core.callsNb > 0) - } - } - init { searchBarVisible.value = false - coreContext.postOnCoreThread { core -> - core.addListener(coreListener) - if (core.callsNb > 0) { - updateCurrentCallInfo() - } - atLastOneCall.postValue(core.callsNb > 0) - } - update() } @@ -107,7 +59,6 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { super.onCleared() coreContext.postOnCoreThread { core -> - core.removeListener(coreListener) account.value?.destroy() } } @@ -143,44 +94,6 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() { val defaultAccount = core.defaultAccount ?: core.accountList.first() account.postValue(AccountModel(defaultAccount)) } - - if (core.callsNb > 0) { - updateCurrentCallInfo() - } - atLastOneCall.postValue(core.callsNb > 0) } } - - @UiThread - fun goBackToCall() { - goBackToCallEvent.value = Event(true) - } - - @WorkerThread - private fun updateCurrentCallInfo() { - val core = coreContext.core - val currentCall = core.currentCall - if (currentCall != null) { - val contact = coreContext.contactsManager.findContactByAddress( - currentCall.remoteAddress - ) - callDisplayName.postValue( - contact?.name ?: LinphoneUtils.getDisplayName(currentCall.remoteAddress) - ) - callStatus.postValue(LinphoneUtils.callStateToString(currentCall.state)) - } else { - val firstCall = core.calls.firstOrNull() - if (firstCall != null) { - val contact = coreContext.contactsManager.findContactByAddress( - firstCall.remoteAddress - ) - callDisplayName.postValue( - contact?.name ?: LinphoneUtils.getDisplayName(firstCall.remoteAddress) - ) - callStatus.postValue(LinphoneUtils.callStateToString(firstCall.state)) - } - } - Log.i("$TAG At least a call, asking fragment to change status bar color") - changeSystemTopBarColorToInCallEvent.postValue(Event(true)) - } } diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt new file mode 100644 index 000000000..44b60adfb --- /dev/null +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt @@ -0,0 +1,126 @@ +/* + * 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.main.viewmodel + +import androidx.annotation.UiThread +import androidx.annotation.WorkerThread +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 +import org.linphone.utils.LinphoneUtils + +class MainViewModel @UiThread constructor() : ViewModel() { + companion object { + private const val TAG = "[Main ViewModel]" + } + + val atLastOneCall = MutableLiveData() + + val callDisplayName = MutableLiveData() + + val callStatus = MutableLiveData() + + val changeSystemTopBarColorToInCallEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + val goBackToCallEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + private val coreListener = object : CoreListenerStub() { + @WorkerThread + override fun onLastCallEnded(core: Core) { + Log.i("$TAG Last call ended, asking fragment to change back status bar color") + changeSystemTopBarColorToInCallEvent.postValue(Event(false)) + } + + @WorkerThread + override fun onCallStateChanged( + core: Core, + call: Call, + state: Call.State?, + message: String + ) { + if (core.callsNb > 0) { + updateCurrentCallInfo() + } + atLastOneCall.postValue(core.callsNb > 0) + } + } + + init { + coreContext.postOnCoreThread { core -> + core.addListener(coreListener) + + if (core.callsNb > 0) { + updateCurrentCallInfo() + } + atLastOneCall.postValue(core.callsNb > 0) + } + } + + @UiThread + override fun onCleared() { + super.onCleared() + + coreContext.postOnCoreThread { core -> + core.removeListener(coreListener) + } + } + + @UiThread + fun goBackToCall() { + goBackToCallEvent.value = Event(true) + } + + @WorkerThread + private fun updateCurrentCallInfo() { + val core = coreContext.core + val currentCall = core.currentCall + if (currentCall != null) { + val contact = coreContext.contactsManager.findContactByAddress( + currentCall.remoteAddress + ) + callDisplayName.postValue( + contact?.name ?: LinphoneUtils.getDisplayName(currentCall.remoteAddress) + ) + callStatus.postValue(LinphoneUtils.callStateToString(currentCall.state)) + } else { + val firstCall = core.calls.firstOrNull() + if (firstCall != null) { + val contact = coreContext.contactsManager.findContactByAddress( + firstCall.remoteAddress + ) + callDisplayName.postValue( + contact?.name ?: LinphoneUtils.getDisplayName(firstCall.remoteAddress) + ) + callStatus.postValue(LinphoneUtils.callStateToString(firstCall.state)) + } + } + Log.i("$TAG At least a call, asking fragment to change status bar color") + changeSystemTopBarColorToInCallEvent.postValue(Event(true)) + } +} diff --git a/app/src/main/java/org/linphone/utils/AppUtils.kt b/app/src/main/java/org/linphone/utils/AppUtils.kt index dd54d9c30..fe56060ed 100644 --- a/app/src/main/java/org/linphone/utils/AppUtils.kt +++ b/app/src/main/java/org/linphone/utils/AppUtils.kt @@ -34,11 +34,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.AnyThread +import androidx.annotation.ColorInt +import androidx.annotation.ColorRes import androidx.annotation.DimenRes import androidx.annotation.DrawableRes import androidx.annotation.MainThread import androidx.annotation.StringRes import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import androidx.emoji2.text.EmojiCompat import java.util.Locale @@ -66,6 +69,14 @@ class AppUtils { return coreContext.context.getString(id, args) } + @AnyThread @ColorInt + fun getColor(@ColorRes colorId: Int): Int { + return ContextCompat.getColor( + coreContext.context, + colorId + ) + } + @MainThread fun getPipRatio( activity: Activity, diff --git a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt index ae8f858bc..6f1031b6c 100644 --- a/app/src/main/java/org/linphone/utils/DataBindingUtils.kt +++ b/app/src/main/java/org/linphone/utils/DataBindingUtils.kt @@ -37,7 +37,6 @@ import androidx.annotation.UiThread import androidx.appcompat.widget.AppCompatEditText import androidx.appcompat.widget.AppCompatTextView import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat @@ -214,12 +213,12 @@ fun ImageView.setPresenceIcon(presence: ConsolidatedPresence?) { @BindingAdapter("tint") fun ImageView.setTintColor(@ColorRes color: Int) { - setColorFilter(ContextCompat.getColor(context, color), PorterDuff.Mode.SRC_IN) + setColorFilter(AppUtils.getColor(color), PorterDuff.Mode.SRC_IN) } @BindingAdapter("textColor") fun AppCompatTextView.setColor(@ColorRes color: Int) { - setTextColor(ContextCompat.getColor(context, color)) + setTextColor(AppUtils.getColor(color)) } @UiThread diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt index d21590247..49158d088 100644 --- a/app/src/main/java/org/linphone/utils/DialogUtils.kt +++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt @@ -28,7 +28,6 @@ import android.view.LayoutInflater import android.view.Window import android.view.WindowManager import androidx.annotation.UiThread -import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import org.linphone.R @@ -269,7 +268,7 @@ class DialogUtils { dialog.setContentView(binding.root) val d: Drawable = ColorDrawable( - ContextCompat.getColor(dialog.context, R.color.gray_main2_800_alpha_65) + AppUtils.getColor(R.color.gray_main2_800_alpha_65) ) // d.alpha = 166 dialog.window diff --git a/app/src/main/res/color/in_call_button_tint_color.xml b/app/src/main/res/color/in_call_button_tint_color.xml new file mode 100644 index 000000000..1eda9d9d7 --- /dev/null +++ b/app/src/main/res/color/in_call_button_tint_color.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/layout-land/call_extra_actions.xml b/app/src/main/res/layout-land/call_extra_actions.xml index c3f26ca15..7198a10b7 100644 --- a/app/src/main/res/layout-land/call_extra_actions.xml +++ b/app/src/main/res/layout-land/call_extra_actions.xml @@ -14,6 +14,9 @@ + @@ -53,7 +56,7 @@ app:layout_constraintEnd_toEndOf="@id/transfer_label" app:layout_constraintStart_toStartOf="@id/transfer_label" app:layout_constraintTop_toBottomOf="@id/main_actions" - app:tint="@color/white" /> + app:tint="@color/in_call_button_tint_color" /> + app:tint="@color/in_call_button_tint_color" /> + app:tint="@color/in_call_button_tint_color" /> + app:tint="@color/in_call_button_tint_color" /> + app:tint="@color/in_call_button_tint_color" /> + app:tint="@color/in_call_button_tint_color" /> + app:tint="@color/in_call_button_tint_color" /> - - - - + @@ -49,7 +52,7 @@ android:padding="@dimen/call_button_icon_padding" android:background="@drawable/in_call_button_background" android:src="@drawable/transfer" - app:tint="@color/white" + app:tint="@color/in_call_button_tint_color" app:layout_constraintDimensionRatio="1:1" app:layout_constraintStart_toStartOf="@id/transfer_label" app:layout_constraintEnd_toEndOf="@id/transfer_label" @@ -64,7 +67,7 @@ android:padding="@dimen/call_button_icon_padding" android:background="@drawable/in_call_button_background" android:src="@drawable/phone_plus" - app:tint="@color/white" + app:tint="@color/in_call_button_tint_color" app:layout_constraintDimensionRatio="1:1" app:layout_constraintStart_toStartOf="@id/new_call_label" app:layout_constraintEnd_toEndOf="@id/new_call_label" @@ -79,7 +82,7 @@ android:padding="@dimen/call_button_icon_padding" android:background="@drawable/in_call_button_background" android:src="@drawable/calls_list" - app:tint="@color/white" + app:tint="@color/in_call_button_tint_color" app:layout_constraintDimensionRatio="1:1" app:layout_constraintStart_toStartOf="@id/calls_list_label" app:layout_constraintEnd_toEndOf="@id/calls_list_label" @@ -111,7 +114,7 @@ android:padding="@dimen/call_button_icon_padding" android:background="@drawable/in_call_button_background" android:src="@drawable/dialer" - app:tint="@color/white" + app:tint="@color/in_call_button_tint_color" app:layout_constraintDimensionRatio="1:1" app:layout_constraintStart_toStartOf="@id/dialer_label" app:layout_constraintEnd_toEndOf="@id/dialer_label" @@ -119,13 +122,14 @@ @@ -85,7 +85,7 @@ android:padding="@dimen/call_button_icon_padding" android:src="@{viewModel.isHeadsetEnabled ? @drawable/headset : viewModel.isBluetoothEnabled ? @drawable/bluetooth : viewModel.isSpeakerEnabled ? @drawable/speaker_high : @drawable/speaker_slash, default=@drawable/speaker_slash}" android:background="@drawable/in_call_button_background" - app:tint="@color/white" + app:tint="@color/in_call_button_tint_color" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@id/toggle_mute_mic" app:layout_constraintEnd_toEndOf="parent" /> diff --git a/app/src/main/res/layout/contacts_list_fragment.xml b/app/src/main/res/layout/contacts_list_fragment.xml index 5045bb9fa..1064033cb 100644 --- a/app/src/main/res/layout/contacts_list_fragment.xml +++ b/app/src/main/res/layout/contacts_list_fragment.xml @@ -33,7 +33,7 @@ - - - - + + + + type="org.linphone.ui.main.viewmodel.MainViewModel" /> @@ -20,9 +20,11 @@ style="@style/default_text_style_800" android:id="@+id/call_display_name" android:layout_width="0dp" - android:layout_height="@dimen/top_bar_height" - android:layout_marginStart="20dp" + android:layout_height="wrap_content" + android:layout_marginStart="16dp" android:layout_marginEnd="10dp" + android:layout_marginTop="5dp" + android:layout_marginBottom="5dp" android:gravity="center_vertical" android:text="@{viewModel.callDisplayName, default=`John Doe`}" android:textColor="@color/white" @@ -32,21 +34,23 @@ android:drawableTint="@color/white" app:layout_constraintEnd_toStartOf="@id/call_time" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent"/> diff --git a/app/src/main/res/layout/main_activity_top_bar.xml b/app/src/main/res/layout/top_bar.xml similarity index 100% rename from app/src/main/res/layout/main_activity_top_bar.xml rename to app/src/main/res/layout/top_bar.xml