Added account menu popup

This commit is contained in:
Sylvain Berfini 2023-08-17 12:55:23 +02:00
parent 405ab20ab2
commit 8fcf3f1baa
7 changed files with 106 additions and 4 deletions

View file

@ -24,6 +24,10 @@ import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.widget.PopupWindow
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
@ -31,6 +35,8 @@ import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.Account
import org.linphone.databinding.AccountPopupMenuBinding
import org.linphone.databinding.MainActivityBinding
import org.linphone.ui.assistant.AssistantActivity
import org.linphone.ui.main.viewmodel.DrawerMenuViewModel
@ -84,6 +90,12 @@ class MainActivity : AppCompatActivity() {
binding.drawerMenu.close()
}
}
drawerMenuViewModel.showAccountPopupMenuEvent.observe(this) {
it.consume { pair ->
showAccountPopupMenu(pair.first, pair.second)
}
}
}
override fun onPostCreate(savedInstanceState: Bundle?) {
@ -152,4 +164,25 @@ class MainActivity : AppCompatActivity() {
}
}*/
}
private fun showAccountPopupMenu(view: View, account: Account) {
val popupView: AccountPopupMenuBinding = DataBindingUtil.inflate(
LayoutInflater.from(baseContext),
R.layout.account_popup_menu,
null,
false
)
popupView.setManageProfileClickListener {
// TODO: navigate to profile
}
val popupWindow = PopupWindow(
popupView.root,
WRAP_CONTENT,
WRAP_CONTENT,
true
)
// Elevation is for showing a shadow around the popup
popupWindow.elevation = 20f
popupWindow.showAsDropDown(view, 0, 0, Gravity.BOTTOM)
}
}

View file

@ -19,6 +19,7 @@
*/
package org.linphone.ui.main.model
import android.view.View
import androidx.lifecycle.MutableLiveData
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.core.Account
@ -27,7 +28,10 @@ import org.linphone.core.Friend
import org.linphone.core.RegistrationState
import org.linphone.ui.main.contacts.model.ContactAvatarModel
class AccountModel(private val account: Account) {
class AccountModel(
private val account: Account,
private val onMenuClicked: ((view: View, account: Account) -> Unit)? = null
) {
val friend: Friend?
val contact = MutableLiveData<ContactAvatarModel>()
@ -81,8 +85,9 @@ class AccountModel(private val account: Account) {
}
}
fun openMenu() {
fun openMenu(view: View) {
// UI thread
onMenuClicked?.invoke(view, account)
}
fun refreshRegister() {

View file

@ -19,6 +19,7 @@
*/
package org.linphone.ui.main.viewmodel
import android.view.View
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import org.linphone.LinphoneApplication.Companion.coreContext
@ -40,6 +41,10 @@ class DrawerMenuViewModel : ViewModel() {
MutableLiveData<Event<Boolean>>()
}
val showAccountPopupMenuEvent: MutableLiveData<Event<Pair<View, Account>>> by lazy {
MutableLiveData<Event<Pair<View, Account>>>()
}
private val coreListener = object : CoreListenerStub() {
override fun onAccountRegistrationStateChanged(
core: Core,
@ -83,7 +88,9 @@ class DrawerMenuViewModel : ViewModel() {
val list = arrayListOf<AccountModel>()
for (account in coreContext.core.accountList) {
val model = AccountModel(account)
val model = AccountModel(account) { view, account ->
showAccountPopupMenuEvent.postValue(Event(Pair(view, account)))
}
list.add(model)
}
accounts.postValue(list)

View file

@ -0,0 +1,15 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:name="vector"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group android:name="group">
<path
android:name="path"
android:pathData="M 4 18 L 4 17.35 C 4 17.01 4.16 16.69 4.41 16.54 C 6.1 15.53 8.03 15 10 15 C 10.03 15 10.05 15 10.08 15.01 C 10.18 14.31 10.38 13.64 10.67 13.03 C 10.45 13.01 10.23 13 10 13 C 7.58 13 5.32 13.67 3.39 14.82 C 2.51 15.34 2 16.32 2 17.35 L 2 20 L 11.26 20 C 10.84 19.4 10.51 18.72 10.29 18 L 4 18 Z M 10 12 C 12.21 12 14 10.21 14 8 C 14 5.79 12.21 4 10 4 C 7.79 4 6 5.79 6 8 C 6 10.21 7.79 12 10 12 Z M 10 6 C 11.1 6 12 6.9 12 8 C 12 9.1 11.1 10 10 10 C 8.9 10 8 9.1 8 8 C 8 6.9 8.9 6 10 6 Z M 20.75 16 C 20.75 15.78 20.72 15.58 20.69 15.37 L 21.83 14.36 L 20.83 12.63 L 19.38 13.12 C 19.06 12.85 18.7 12.64 18.3 12.49 L 18 11 L 16 11 L 15.7 12.49 C 15.3 12.64 14.94 12.85 14.62 13.12 L 13.17 12.63 L 12.17 14.36 L 13.31 15.37 C 13.28 15.58 13.25 15.78 13.25 16 C 13.25 16.22 13.28 16.42 13.31 16.63 L 12.17 17.64 L 13.17 19.37 L 14.62 18.88 C 14.94 19.15 15.3 19.36 15.7 19.51 L 16 21 L 18 21 L 18.3 19.51 C 18.7 19.36 19.06 19.15 19.38 18.88 L 20.83 19.37 L 21.83 17.64 L 20.69 16.63 C 20.72 16.42 20.75 16.22 20.75 16 Z M 17 18 C 15.9 18 15 17.1 15 16 C 15 14.9 15.9 14 17 14 C 18.1 14 19 14.9 19 16 C 19 17.1 18.1 18 17 18 Z"
android:fillColor="#000"
android:strokeWidth="1"/>
</group>
</vector>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="16dp" />
<solid android:color="@color/white"/>
</shape>

View file

@ -101,7 +101,7 @@
app:layout_constraintBottom_toBottomOf="parent"/>
<ImageView
android:onClick="@{() -> model.openMenu()}"
android:onClick="@{() -> model.openMenu(menu)}"
android:id="@+id/menu"
android:layout_width="24dp"
android:layout_height="24dp"

View file

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<import type="android.graphics.Typeface" />
<variable
name="manageProfileClickListener"
type="View.OnClickListener" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_round_popup_menu_background">
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{manageProfileClickListener}"
style="@style/default_text_style"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="Manage the profile"
android:textSize="14sp"
android:textColor="@color/gray_1"
android:drawableStart="@drawable/manage_profile"
android:drawablePadding="5dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>