Updated meeting icon + using newly added callbacks in SDK for default account

This commit is contained in:
Sylvain Berfini 2023-11-20 10:20:26 +01:00
parent 975473b2e4
commit ed23268672
22 changed files with 98 additions and 54 deletions

View file

@ -709,7 +709,7 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() {
val avatarModel = contact.value
if (avatarModel != null) {
avatarModel.trust.postValue(securityLevel)
contact.postValue(avatarModel)
contact.postValue(avatarModel!!)
} else {
Log.e("$TAG No avatar model found!")
}

View file

@ -63,7 +63,6 @@ class ContactsListFragment : AbstractTopBarFragment() {
Log.i(
"$TAG Default account changed, updating avatar in top bar & refreshing contacts list"
)
listViewModel.update()
listViewModel.applyCurrentDefaultAccountFilter()
}

View file

@ -162,7 +162,6 @@ abstract class AbstractTopBarFragment : GenericFragment() {
sharedViewModel.defaultAccountChangedEvent.observe(viewLifecycleOwner) {
it.consume {
Log.i("$TAG Default account changed")
viewModel.update()
onDefaultAccountChanged()
}
}

View file

@ -170,9 +170,4 @@ class DrawerMenuFragment : GenericFragment() {
popupWindow.elevation = 20f
popupWindow.showAsDropDown(view, 0, 0, Gravity.BOTTOM)
}
override fun onResume() {
super.onResume()
viewModel.updateAccountsList()
}
}

View file

@ -66,7 +66,6 @@ class HistoryListFragment : AbstractTopBarFragment() {
Log.i(
"$TAG Default account changed, updating avatar in top bar & re-computing call logs"
)
listViewModel.update()
listViewModel.applyFilter()
}

View file

@ -39,8 +39,7 @@ import org.linphone.utils.LinphoneUtils
class AccountModel @WorkerThread constructor(
val account: Account,
private val onMenuClicked: ((view: View, account: Account) -> Unit)? = null,
private val onSetAsDefault: ((account: Account) -> Unit)? = null
private val onMenuClicked: ((view: View, account: Account) -> Unit)? = null
) : AbstractAvatarModel() {
companion object {
private const val TAG = "[Account Model]"
@ -109,22 +108,23 @@ class AccountModel @WorkerThread constructor(
@UiThread
fun setAsDefault() {
coreContext.postOnCoreThread { core ->
core.defaultAccount = account
if (core.defaultAccount != account) {
core.defaultAccount = account
for (friendList in core.friendsLists) {
if (friendList.isSubscriptionsEnabled) {
Log.i(
"$TAG Default account has changed, refreshing friend list [${friendList.displayName}] subscriptions"
)
// friendList.updateSubscriptions() won't trigger a refresh unless a friend has changed
friendList.isSubscriptionsEnabled = false
friendList.isSubscriptionsEnabled = true
for (friendList in core.friendsLists) {
if (friendList.isSubscriptionsEnabled) {
Log.i(
"$TAG Default account has changed, refreshing friend list [${friendList.displayName}] subscriptions"
)
// friendList.updateSubscriptions() won't trigger a refresh unless a friend has changed
friendList.isSubscriptionsEnabled = false
friendList.isSubscriptionsEnabled = true
}
}
}
}
isDefault.value = true
onSetAsDefault?.invoke(account)
}
@UiThread

View file

@ -25,6 +25,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.core.Account
import org.linphone.core.Call
import org.linphone.core.ChatMessage
import org.linphone.core.ChatRoom
@ -116,6 +117,20 @@ open class AbstractTopBarViewModel @UiThread constructor() : ViewModel() {
override fun onChatRoomRead(core: Core, chatRoom: ChatRoom) {
updateUnreadMessagesCount()
}
@WorkerThread
override fun onDefaultAccountChanged(core: Core, defaultAccount: Account) {
Log.i(
"$TAG Default account has changed [${defaultAccount.params.identityAddress?.asStringUriOnly()}]"
)
account.value?.destroy()
account.postValue(AccountModel(defaultAccount))
updateUnreadMessagesCount()
updateMissedCallsCount()
updateAvailableMenus()
}
}
init {

View file

@ -26,6 +26,8 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.core.Account
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
@ -53,9 +55,43 @@ class DrawerMenuViewModel @UiThread constructor() : ViewModel() {
MutableLiveData<Event<String>>()
}
private val coreListener = object : CoreListenerStub() {
@WorkerThread
override fun onDefaultAccountChanged(core: Core, account: Account) {
Log.i(
"$TAG Account [${account.params.identityAddress?.asStringUriOnly()}] has been set as default"
)
for (model in accounts.value.orEmpty()) {
if (model.account != account) {
model.isDefault.postValue(false)
}
}
defaultAccountChangedEvent.postValue(
Event(account.params.identityAddress?.asStringUriOnly() ?: "")
)
}
@WorkerThread
override fun onNewAccountAdded(core: Core, account: Account) {
Log.i(
"$TAG Account [${account.params.identityAddress?.asStringUriOnly()}] has been added to the Core"
)
computeAccountsList()
}
}
init {
coreContext.postOnCoreThread { core ->
core.addListener(coreListener)
computeAccountsList()
}
}
@UiThread
override fun onCleared() {
coreContext.postOnCoreThread {
coreContext.postOnCoreThread { core ->
core.removeListener(coreListener)
accounts.value.orEmpty().forEach(AccountModel::destroy)
}
@ -85,23 +121,10 @@ class DrawerMenuViewModel @UiThread constructor() : ViewModel() {
val list = arrayListOf<AccountModel>()
for (account in coreContext.core.accountList) {
val model = AccountModel(account, { view, account ->
val model = AccountModel(account) { view, account ->
// onClicked
showAccountPopupMenuEvent.postValue(Event(Pair(view, account)))
}, { account ->
// onSetAsDefault
Log.i(
"$TAG Account [${account.params.identityAddress?.asStringUriOnly()}] has been set as default by user"
)
for (model in accounts.value.orEmpty()) {
if (model.account != account) {
model.isDefault.value = false
}
}
defaultAccountChangedEvent.postValue(
Event(account.params.identityAddress?.asStringUriOnly() ?: "")
)
})
}
list.add(model)
}
accounts.postValue(list)

View file

@ -357,7 +357,7 @@ private fun loadContactPictureWithCoil(
val context = imageView.context
if (model != null) {
if (model.forceConferenceIcon.value == true) {
imageView.load(R.drawable.inset_users_three)
imageView.load(R.drawable.inset_meeting)
return
}
@ -425,7 +425,7 @@ private fun getErrorImageLoader(
val initials = model.initials.value.orEmpty()
return if (initials.isEmpty() || initials == "+" || model.skipInitials.value == true) {
if (model.defaultToConferenceIcon.value == true) {
R.drawable.inset_users_three
R.drawable.inset_meeting
} else {
R.drawable.inset_user_circle
}

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/users_three"
android:drawable="@drawable/meeting"
android:inset="8dp">
</inset>

View file

@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M2,3.75L22,3.75A1.25,1.25 0,0 1,23.25 5L23.25,19.462A1.25,1.25 0,0 1,22 20.712L2,20.712A1.25,1.25 0,0 1,0.75 19.462L0.75,5A1.25,1.25 0,0 1,2 3.75z"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#FE5E00"/>
<path
android:pathData="M19.799,12.399C19.746,12.438 19.686,12.467 19.623,12.483C19.559,12.499 19.493,12.503 19.428,12.494C19.363,12.484 19.3,12.462 19.244,12.429C19.187,12.396 19.138,12.351 19.099,12.299C18.797,11.894 18.405,11.565 17.954,11.339C17.502,11.113 17.004,10.997 16.499,10.999C16.401,10.999 16.305,10.97 16.222,10.915C16.141,10.861 16.076,10.784 16.038,10.693C16.012,10.632 15.999,10.566 15.999,10.499C15.999,10.432 16.012,10.366 16.038,10.305C16.076,10.214 16.141,10.137 16.222,10.082C16.305,10.028 16.401,9.999 16.499,9.999C16.779,9.999 17.054,9.92 17.292,9.772C17.53,9.623 17.722,9.411 17.846,9.159C17.969,8.908 18.019,8.626 17.991,8.347C17.962,8.068 17.856,7.802 17.684,7.581C17.513,7.359 17.282,7.19 17.019,7.092C16.756,6.995 16.471,6.974 16.196,7.03C15.921,7.087 15.668,7.219 15.465,7.413C15.262,7.606 15.117,7.853 15.047,8.124C15.03,8.188 15.001,8.248 14.962,8.3C14.922,8.353 14.873,8.397 14.816,8.43C14.76,8.463 14.697,8.485 14.632,8.495C14.567,8.504 14.501,8.5 14.437,8.484C14.374,8.467 14.314,8.438 14.261,8.399C14.209,8.359 14.165,8.31 14.131,8.253C14.098,8.197 14.076,8.134 14.067,8.069C14.058,8.004 14.061,7.938 14.078,7.874C14.175,7.498 14.359,7.149 14.615,6.856C14.871,6.563 15.191,6.333 15.552,6.186C15.912,6.039 16.301,5.978 16.689,6.007C17.077,6.037 17.452,6.157 17.786,6.357C18.119,6.558 18.401,6.833 18.61,7.162C18.818,7.49 18.946,7.863 18.985,8.25C19.024,8.637 18.972,9.028 18.833,9.391C18.695,9.755 18.473,10.081 18.186,10.343C18.866,10.638 19.457,11.105 19.9,11.698C19.94,11.751 19.968,11.811 19.985,11.875C20.001,11.938 20.004,12.005 19.995,12.07C19.985,12.135 19.963,12.197 19.929,12.254C19.896,12.31 19.851,12.359 19.799,12.399ZM16.431,16.248C16.468,16.305 16.492,16.369 16.503,16.435C16.514,16.502 16.511,16.57 16.495,16.635C16.479,16.701 16.45,16.763 16.41,16.816C16.369,16.87 16.318,16.916 16.26,16.949C16.201,16.983 16.137,17.005 16.07,17.013C16.003,17.021 15.935,17.015 15.87,16.997C15.805,16.978 15.745,16.946 15.693,16.903C15.641,16.861 15.598,16.808 15.566,16.748C15.252,16.215 14.803,15.773 14.265,15.466C13.727,15.159 13.119,14.998 12.499,14.998C11.88,14.998 11.271,15.159 10.733,15.466C10.196,15.773 9.747,16.215 9.432,16.748C9.401,16.808 9.358,16.861 9.306,16.903C9.254,16.946 9.193,16.978 9.128,16.997C9.064,17.015 8.996,17.021 8.929,17.013C8.862,17.005 8.797,16.983 8.739,16.949C8.681,16.916 8.63,16.87 8.589,16.816C8.549,16.763 8.52,16.701 8.504,16.635C8.488,16.57 8.485,16.502 8.496,16.435C8.507,16.369 8.531,16.305 8.567,16.248C9.052,15.415 9.791,14.76 10.676,14.378C10.178,13.997 9.812,13.47 9.63,12.87C9.447,12.27 9.457,11.628 9.658,11.034C9.86,10.44 10.242,9.924 10.752,9.559C11.261,9.194 11.872,8.997 12.499,8.997C13.126,8.997 13.738,9.194 14.247,9.559C14.757,9.924 15.139,10.44 15.34,11.034C15.542,11.628 15.552,12.27 15.369,12.87C15.187,13.47 14.821,13.997 14.323,14.378C15.208,14.76 15.947,15.415 16.431,16.248ZM12.499,13.999C12.895,13.999 13.281,13.881 13.61,13.661C13.939,13.442 14.196,13.13 14.347,12.764C14.498,12.399 14.538,11.997 14.461,11.609C14.384,11.221 14.193,10.864 13.913,10.585C13.634,10.305 13.277,10.115 12.889,10.037C12.502,9.96 12.099,10 11.734,10.151C11.369,10.303 11.056,10.559 10.837,10.888C10.617,11.217 10.5,11.603 10.5,11.999C10.5,12.529 10.71,13.038 11.085,13.413C11.46,13.788 11.969,13.999 12.499,13.999ZM9,10.499C9,10.366 8.947,10.239 8.853,10.145C8.76,10.052 8.632,9.999 8.5,9.999C8.219,9.999 7.944,9.92 7.706,9.772C7.468,9.623 7.277,9.411 7.153,9.159C7.03,8.908 6.979,8.626 7.008,8.347C7.036,8.068 7.142,7.802 7.314,7.581C7.486,7.359 7.717,7.19 7.98,7.092C8.243,6.995 8.528,6.974 8.803,7.03C9.077,7.087 9.331,7.219 9.534,7.413C9.737,7.606 9.882,7.853 9.952,8.124C9.985,8.253 10.068,8.363 10.182,8.43C10.297,8.497 10.433,8.517 10.561,8.484C10.69,8.45 10.8,8.368 10.867,8.253C10.935,8.139 10.954,8.003 10.921,7.874C10.823,7.498 10.639,7.149 10.384,6.856C10.128,6.563 9.807,6.333 9.447,6.186C9.087,6.039 8.698,5.978 8.31,6.007C7.922,6.037 7.546,6.157 7.213,6.357C6.879,6.558 6.597,6.833 6.389,7.162C6.181,7.49 6.052,7.863 6.013,8.25C5.974,8.637 6.026,9.028 6.165,9.391C6.304,9.755 6.526,10.081 6.812,10.343C6.133,10.638 5.543,11.105 5.1,11.698C5.021,11.804 4.986,11.938 5.005,12.069C5.024,12.2 5.094,12.319 5.2,12.398C5.306,12.478 5.439,12.512 5.571,12.494C5.702,12.475 5.82,12.405 5.9,12.299C6.201,11.894 6.594,11.565 7.045,11.339C7.497,11.113 7.995,10.997 8.5,10.999C8.632,10.999 8.76,10.946 8.853,10.852C8.947,10.759 9,10.632 9,10.499Z"
android:fillColor="#FE5E00"/>
</vector>

View file

@ -101,7 +101,7 @@
android:onClick="@{() -> viewModel.navigateToMeetings()}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:drawableTop="@drawable/users_three"
android:drawableTop="@drawable/meeting"
android:drawablePadding="10dp"
android:drawableTint="@{viewModel.meetingsSelected ? @color/orange_main_500 : @color/gray_main2_600, default=@color/gray_main2_600}"
android:text="@string/bottom_navigation_meetings_label"

View file

@ -120,7 +120,7 @@
android:layout_marginStart="18dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:drawableTop="@drawable/users_three"
android:drawableTop="@drawable/meeting"
android:drawablePadding="10dp"
android:drawableTint="@{viewModel.meetingsSelected ? @color/orange_main_500 : @color/gray_main2_600, default=@color/gray_main2_600}"
android:text="@string/bottom_navigation_meetings_label"

View file

@ -123,7 +123,7 @@
android:layout_height="@dimen/icon_size"
android:layout_marginStart="10dp"
android:adjustViewBounds="true"
android:src="@drawable/users_three"
android:src="@drawable/meeting"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/conference_subject"
app:layout_constraintBottom_toBottomOf="@id/conference_subject"

View file

@ -57,7 +57,7 @@
android:layout_height="@dimen/icon_size"
android:layout_marginStart="10dp"
android:adjustViewBounds="true"
android:src="@drawable/users_three"
android:src="@drawable/meeting"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/conference_subject"
app:layout_constraintBottom_toBottomOf="@id/conference_subject"

View file

@ -87,7 +87,7 @@
android:textColor="@color/gray_main2_600"
android:maxLines="1"
android:ellipsize="end"
android:drawableStart="@drawable/users_three"
android:drawableStart="@drawable/meeting"
android:drawablePadding="8dp"
app:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toEndOf="@id/day_background"

View file

@ -77,7 +77,7 @@
android:layout_width="@dimen/avatar_big_size"
android:layout_height="@dimen/avatar_big_size"
android:layout_marginTop="8dp"
android:src="@drawable/inset_users_three"
android:src="@drawable/inset_meeting"
coilBigAvatar="@{viewModel.avatarModel}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@ -218,7 +218,7 @@
android:layout_marginTop="40dp"
android:background="@drawable/circle_light_blue_button_background"
android:padding="16dp"
android:src="@drawable/users_three"
android:src="@drawable/meeting"
app:tint="@color/gray_main2_500"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/call"

View file

@ -105,7 +105,7 @@
android:textColor="@color/gray_main2_600"
android:maxLines="2"
android:ellipsize="end"
android:drawableStart="@{viewModel.isBroadcast ? @drawable/slideshow : @drawable/users_three, default=@drawable/users_three}"
android:drawableStart="@{viewModel.isBroadcast ? @drawable/slideshow : @drawable/meeting, default=@drawable/meeting}"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:background="@color/transparent_color"

View file

@ -112,7 +112,7 @@
android:textColor="@color/gray_main2_600"
android:maxLines="1"
android:ellipsize="end"
android:drawableStart="@{model.isBroadcast ? @drawable/slideshow : @drawable/users_three, default=@drawable/users_three}"
android:drawableStart="@{model.isBroadcast ? @drawable/slideshow : @drawable/meeting, default=@drawable/meeting}"
android:drawablePadding="8dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"

View file

@ -101,7 +101,7 @@
android:textColor="@color/primary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/users_three"
android:drawableStart="@drawable/meeting"
android:drawableTint="@color/primary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/primary_button_background"
@ -153,7 +153,7 @@
android:textColor="@color/secondary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/users_three"
android:drawableStart="@drawable/meeting"
android:drawableTint="@color/secondary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/secondary_button_background"
@ -241,7 +241,7 @@
android:textSize="20sp"
android:textColor="@color/gray_main2_600"
android:inputType="text|textCapSentences"
android:drawableStart="@{viewModel.isBroadcastSelected ? @drawable/slideshow : @drawable/users_three, default=@drawable/users_three}"
android:drawableStart="@{viewModel.isBroadcastSelected ? @drawable/slideshow : @drawable/meeting, default=@drawable/meeting}"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:background="@color/transparent_color"

View file

@ -138,7 +138,7 @@
android:layout_marginTop="28dp"
android:background="@drawable/shape_orange_round"
android:padding="10dp"
android:src="@drawable/users_three"
android:src="@drawable/meeting"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/search_bar"
app:tint="@color/white" />

View file

@ -219,7 +219,7 @@
android:layout_marginTop="28dp"
android:background="@drawable/shape_orange_round"
android:padding="10dp"
android:src="@drawable/users_three"
android:src="@drawable/meeting"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/search_bar"
app:tint="@color/white" />