Started meeting detail view

This commit is contained in:
Sylvain Berfini 2023-10-10 18:11:52 +02:00
parent 5531dabae4
commit 3ae9740336
17 changed files with 1200 additions and 452 deletions

View file

@ -83,7 +83,7 @@ class MeetingsListAdapter(
lifecycleOwner = viewLifecycleOwner
binding.root.isSelected = bindingAdapterPosition == selectedAdapterPosition
binding.cardview.isSelected = bindingAdapterPosition == selectedAdapterPosition
binding.setOnClickListener {
meetingClickedEvent.value = Event(meetingModel)

View file

@ -19,14 +19,22 @@
*/
package org.linphone.ui.main.meetings.fragment
import android.content.ActivityNotFoundException
import android.content.Intent
import android.os.Bundle
import android.provider.CalendarContract
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.UiThread
import androidx.core.view.doOnPreDraw
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import org.linphone.core.tools.Log
import org.linphone.databinding.MeetingFragmentBinding
import org.linphone.ui.main.fragment.GenericFragment
import org.linphone.ui.main.meetings.viewmodel.MeetingViewModel
import org.linphone.utils.Event
@UiThread
@ -37,6 +45,10 @@ class MeetingFragment : GenericFragment() {
private lateinit var binding: MeetingFragmentBinding
private lateinit var viewModel: MeetingViewModel
private val args: MeetingFragmentArgs by navArgs()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -60,5 +72,66 @@ class MeetingFragment : GenericFragment() {
postponeEnterTransition()
binding.lifecycleOwner = viewLifecycleOwner
viewModel = requireActivity().run {
ViewModelProvider(this)[MeetingViewModel::class.java]
}
binding.viewModel = viewModel
val uri = args.conferenceUri
Log.i(
"$TAG Looking up for conference with SIP URI [$uri]"
)
viewModel.findConferenceInfo(uri)
binding.setBackClickListener {
goBack()
}
binding.setShareClickListener {
val intent = Intent(Intent.ACTION_EDIT)
intent.type = "vnd.android.cursor.item/event"
intent.putExtra(CalendarContract.Events.TITLE, viewModel.subject.value)
val description = viewModel.description.value.orEmpty()
if (description.isNotEmpty()) {
intent.putExtra(CalendarContract.Events.DESCRIPTION, description)
}
intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, viewModel.startTimeStamp.value)
intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, viewModel.endTimeStamp.value)
intent.putExtra(CalendarContract.Events.CUSTOM_APP_URI, viewModel.sipUri.value)
intent.putExtra(
CalendarContract.Events.CUSTOM_APP_PACKAGE,
requireContext().packageName
)
try {
startActivity(intent)
} catch (exception: ActivityNotFoundException) {
Log.e("$TAG No activity found to handle intent: $exception")
}
}
sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable ->
viewModel.showBackButton.value = slideable
}
viewModel.conferenceInfoFoundEvent.observe(viewLifecycleOwner) {
it.consume { found ->
if (found) {
(view.parent as? ViewGroup)?.doOnPreDraw {
startPostponedEnterTransition()
sharedViewModel.openSlidingPaneEvent.value = Event(true)
}
} else {
Log.e("$TAG Failed to find meeting with URI [$uri], going back")
(view.parent as? ViewGroup)?.doOnPreDraw {
goBack()
}
}
}
}
}
}

View file

@ -103,6 +103,14 @@ class MeetingsFragment : GenericFragment() {
}
}
sharedViewModel.showMeetingEvent.observe(viewLifecycleOwner) {
it.consume { uri ->
Log.i("$TAG Navigating to meeting fragment with URI [$uri]")
val action = MeetingFragmentDirections.actionGlobalMeetingFragment(uri)
binding.meetingsNavContainer.findNavController().navigate(action)
}
}
sharedViewModel.navigateToContactsEvent.observe(viewLifecycleOwner) {
it.consume {
if (findNavController().currentDestination?.id == R.id.meetingsFragment) {

View file

@ -24,6 +24,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.UiThread
import androidx.core.view.doOnPreDraw
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import org.linphone.R
@ -59,6 +60,7 @@ class MeetingsListFragment : AbstractTopBarFragment() {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
postponeEnterTransition()
listViewModel = requireActivity().run {
ViewModelProvider(this)[MeetingsListViewModel::class.java]
@ -85,13 +87,23 @@ class MeetingsListFragment : AbstractTopBarFragment() {
scrollToToday()
}
adapter.meetingClickedEvent.observe(viewLifecycleOwner) {
it.consume { model ->
Log.i("$TAG Show conversation with ID [${model.id}]")
sharedViewModel.showMeetingEvent.value = Event(model.id)
}
}
listViewModel.meetings.observe(viewLifecycleOwner) {
val currentCount = adapter.itemCount
adapter.submitList(it)
Log.i("$TAG Meetings list ready with [${it.size}] items")
if (currentCount < it.size) {
scrollToToday()
(view.parent as? ViewGroup)?.doOnPreDraw {
startPostponedEnterTransition()
scrollToToday()
}
}
}

View file

@ -73,10 +73,6 @@ class ScheduleMeetingFragment : GenericFragment() {
}
binding.viewModel = viewModel
sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable ->
viewModel.showBackButton.value = slideable
}
binding.setBackClickListener {
goBack()
}

View file

@ -26,7 +26,7 @@ import org.linphone.core.Participant
import org.linphone.utils.TimestampUtils
class MeetingModel @WorkerThread constructor(conferenceInfo: ConferenceInfo) {
val id = conferenceInfo.uri?.asStringUriOnly()
val id = conferenceInfo.uri?.asStringUriOnly() ?: ""
private val timestamp = conferenceInfo.dateTime

View file

@ -0,0 +1,47 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.linphone.ui.main.meetings.model
import androidx.annotation.WorkerThread
import androidx.lifecycle.MutableLiveData
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.core.Address
import org.linphone.ui.main.contacts.model.ContactAvatarModel
class ParticipantModel @WorkerThread constructor(address: Address, val isOrganizer: Boolean) {
val avatarModel = MutableLiveData<ContactAvatarModel>()
init {
val friend = coreContext.contactsManager.findContactByAddress(address)
val avatar = if (friend != null) {
ContactAvatarModel(friend)
} else {
val fakeFriend = coreContext.core.createFriend()
fakeFriend.address = address
ContactAvatarModel(fakeFriend)
}
avatarModel.postValue(avatar)
}
@WorkerThread
fun destroy() {
avatarModel.value?.destroy()
}
}

View file

@ -0,0 +1,191 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.linphone.ui.main.meetings.viewmodel
import androidx.annotation.UiThread
import androidx.annotation.WorkerThread
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import java.util.Locale
import java.util.TimeZone
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.ConferenceInfo
import org.linphone.core.Factory
import org.linphone.core.Participant
import org.linphone.core.tools.Log
import org.linphone.ui.main.meetings.model.ParticipantModel
import org.linphone.utils.AppUtils
import org.linphone.utils.Event
import org.linphone.utils.TimestampUtils
class MeetingViewModel @UiThread constructor() : ViewModel() {
companion object {
private const val TAG = "[Meeting ViewModel]"
}
val showBackButton = MutableLiveData<Boolean>()
val isBroadcast = MutableLiveData<Boolean>()
val isEditable = MutableLiveData<Boolean>()
val subject = MutableLiveData<String>()
val sipUri = MutableLiveData<String>()
val dateTime = MutableLiveData<String>()
val timezone = MutableLiveData<String>()
val description = MutableLiveData<String>()
val speakers = MutableLiveData<ArrayList<ParticipantModel>>()
val participants = MutableLiveData<ArrayList<ParticipantModel>>()
val conferenceInfoFoundEvent = MutableLiveData<Event<Boolean>>()
val startTimeStamp = MutableLiveData<Long>()
val endTimeStamp = MutableLiveData<Long>()
private lateinit var conferenceInfo: ConferenceInfo
init {
}
override fun onCleared() {
super.onCleared()
coreContext.postOnCoreThread {
speakers.value.orEmpty().forEach(ParticipantModel::destroy)
participants.value.orEmpty().forEach(ParticipantModel::destroy)
}
}
@UiThread
fun findConferenceInfo(uri: String) {
coreContext.postOnCoreThread { core ->
val address = Factory.instance().createAddress(uri)
if (address != null) {
val found = core.findConferenceInformationFromUri(address)
if (found != null) {
conferenceInfo = found
configureConferenceInfo()
conferenceInfoFoundEvent.postValue(Event(true))
} else {
conferenceInfoFoundEvent.postValue(Event(false))
}
} else {
conferenceInfoFoundEvent.postValue(Event(false))
}
}
}
@UiThread
fun join() {
// TODO
}
@WorkerThread
private fun configureConferenceInfo() {
if (::conferenceInfo.isInitialized) {
subject.postValue(conferenceInfo.subject)
sipUri.postValue(conferenceInfo.uri?.asStringUriOnly() ?: "")
description.postValue(conferenceInfo.description)
val timestamp = conferenceInfo.dateTime
val duration = conferenceInfo.duration
val date = TimestampUtils.toString(
timestamp,
onlyDate = true,
shortDate = false,
hideYear = false
)
val startTime = TimestampUtils.timeToString(timestamp)
val end = timestamp + (duration * 60)
val endTime = TimestampUtils.timeToString(end)
startTimeStamp.postValue(timestamp * 1000)
endTimeStamp.postValue(end * 1000)
dateTime.postValue("$date | $startTime - $endTime")
timezone.postValue(
AppUtils.getFormattedString(
R.string.meeting_schedule_timezone_title,
TimeZone.getDefault().displayName
)
.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
)
val organizerAddress = conferenceInfo.organizer
if (organizerAddress != null) {
val localAccount = coreContext.core.accountList.find { account ->
val address = account.params.identityAddress
address != null && organizerAddress.weakEqual(address)
}
isEditable.postValue(localAccount != null)
} else {
isEditable.postValue(false)
Log.e(
"$TAG No organizer SIP URI found for: ${conferenceInfo.uri?.asStringUriOnly()}"
)
}
computeParticipantsList()
}
}
private fun computeParticipantsList() {
speakers.value.orEmpty().forEach(ParticipantModel::destroy)
participants.value.orEmpty().forEach(ParticipantModel::destroy)
val speakersList = arrayListOf<ParticipantModel>()
val participantsList = arrayListOf<ParticipantModel>()
var allSpeaker = true
val organizer = conferenceInfo.organizer
var organizerFound = false
for (info in conferenceInfo.participantInfos) {
val participant = info.address
val isOrganizer = organizer?.weakEqual(participant) ?: false
Log.i(
"$TAG Conference [${subject.value}] ${if (isOrganizer) "organizer" else "participant"} [${participant.asStringUriOnly()}] is a [${info.role}]"
)
if (isOrganizer) {
organizerFound = true
}
if (info.role == Participant.Role.Listener) {
allSpeaker = false
participantsList.add(ParticipantModel(participant, isOrganizer))
} else {
speakersList.add(ParticipantModel(participant, isOrganizer))
}
}
if (!organizerFound && organizer != null) {
Log.i("$TAG Organizer not found in participants list, adding it to participants list")
participantsList.add(ParticipantModel(organizer, true))
}
isBroadcast.postValue(!allSpeaker)
speakers.postValue(speakersList)
participants.postValue(participantsList)
}
}

View file

@ -35,8 +35,6 @@ class ScheduleMeetingViewModel @UiThread constructor() : ViewModel() {
private const val TAG = "[Schedule Meeting ViewModel]"
}
val showBackButton = MutableLiveData<Boolean>()
val isBroadcastSelected = MutableLiveData<Boolean>()
val showBroadcastHelp = MutableLiveData<Boolean>()

View file

@ -114,4 +114,8 @@ class SharedMainViewModel @UiThread constructor() : ViewModel() {
val showScheduleMeetingEvent: MutableLiveData<Event<Boolean>> by lazy {
MutableLiveData<Event<Boolean>>()
}
val showMeetingEvent: MutableLiveData<Event<String>> by lazy {
MutableLiveData<Event<String>>()
}
}

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:color="@color/gray_main2_100" />
<item android:state_pressed="true"
android:color="@color/gray_main2_100" />
<item
android:color="@color/white"/>
</selector>

View file

@ -7,20 +7,326 @@
<variable
name="backClickListener"
type="View.OnClickListener" />
<variable
name="shareClickListener"
type="View.OnClickListener" />
<variable
name="viewModel"
type="org.linphone.ui.main.meetings.viewmodel.MeetingViewModel" />
</data>
<androidx.coordinatorlayout.widget.CoordinatorLayout
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="@color/white">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="80dp"
android:background="@color/white">
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:adjustViewBounds="true"
android:padding="15dp"
android:src="@drawable/caret_left"
app:tint="@color/orange_main_500"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/title" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatTextView
style="@style/main_page_title_style"
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="@dimen/top_bar_height"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
app:layout_constraintEnd_toStartOf="@id/edit"
app:layout_constraintStart_toEndOf="@id/back"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<ImageView
android:id="@+id/edit"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:padding="15dp"
android:adjustViewBounds="true"
android:src="@drawable/pencil_simple"
android:visibility="@{viewModel.isEditable ? View.VISIBLE : View.GONE, default=gone}"
app:tint="@color/primary_color_selector"
app:layout_constraintStart_toEndOf="@id/title"
app:layout_constraintEnd_toStartOf="@id/menu"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintTop_toTopOf="@id/title" />
<ImageView
android:id="@+id/menu"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:padding="15dp"
android:adjustViewBounds="true"
android:src="@drawable/dots_three_vertical"
app:tint="@color/primary_color_selector"
app:layout_constraintStart_toEndOf="@id/edit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintTop_toTopOf="@id/title" />
<ScrollView
android:id="@+id/scrollView"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/subject"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@{viewModel.subject, default=`Broadcast about agility in software development`}"
android:textSize="20sp"
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:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:background="@color/transparent_color"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<View
android:id="@+id/separator"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="@color/gray_main2_200"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/subject" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/sip_uri"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@{viewModel.sipUri, default=`linphone.com/wjre.fr`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:maxLines="1"
android:ellipsize="end"
android:drawableStart="@drawable/video_camera"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintTop_toBottomOf="@id/separator"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/share" />
<ImageView
android:id="@+id/share"
android:onClick="@{shareClickListener}"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="16dp"
android:src="@drawable/share_network"
app:layout_constraintTop_toTopOf="@id/sip_uri"
app:layout_constraintBottom_toBottomOf="@id/sip_uri"
app:layout_constraintStart_toEndOf="@id/sip_uri"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/date_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@{viewModel.dateTime, default=`October 11th, 2023 | 17:00 - 18:00`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:maxLines="1"
android:ellipsize="end"
android:drawableStart="@drawable/clock"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintTop_toBottomOf="@id/sip_uri"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/timezone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@{viewModel.timezone, default=@string/meeting_schedule_timezone_title}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:maxLines="1"
android:ellipsize="end"
android:drawableStart="@drawable/globe_hemisphere_west"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintTop_toBottomOf="@id/date_time"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<View
android:id="@+id/separator_2"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="@color/gray_main2_200"
android:visibility="@{viewModel.description.length() > 0 ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/timezone" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@{viewModel.description, default=`Lorem ipsum dolor sit amet`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:maxLines="3"
android:ellipsize="end"
android:drawableStart="@drawable/file_text"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:visibility="@{viewModel.description.length() > 0 ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toBottomOf="@id/separator_2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<View
android:id="@+id/separator_3"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="@color/gray_main2_200"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/description" />
<ImageView
android:id="@+id/speakers_icon"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:src="@drawable/user_square"
android:visibility="@{viewModel.isBroadcast ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toBottomOf="@id/separator_3"
app:layout_constraintStart_toStartOf="parent"
app:tint="@color/gray_main2_600" />
<LinearLayout
android:id="@+id/speakers"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:visibility="@{viewModel.isBroadcast ? View.VISIBLE : View.GONE}"
entries="@{viewModel.speakers}"
layout="@{@layout/meeting_participant_list_cell}"
app:layout_constraintTop_toBottomOf="@id/separator_3"
app:layout_constraintStart_toEndOf="@id/speakers_icon"
app:layout_constraintEnd_toEndOf="parent" />
<View
android:id="@+id/separator_4"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="@color/gray_main2_200"
android:visibility="@{viewModel.isBroadcast ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/speakers" />
<ImageView
android:id="@+id/participants_icon"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:src="@drawable/users"
app:layout_constraintTop_toBottomOf="@id/separator_4"
app:layout_constraintStart_toStartOf="parent"
app:tint="@color/gray_main2_600"/>
<LinearLayout
android:id="@+id/participants"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
entries="@{viewModel.participants}"
layout="@{@layout/meeting_participant_list_cell}"
app:layout_constraintTop_toBottomOf="@id/separator_4"
app:layout_constraintStart_toEndOf="@id/participants_icon"
app:layout_constraintEnd_toEndOf="parent" />
<View
android:id="@+id/separator_5"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:background="@color/gray_main2_200"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/participants" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/primary_button_label_style"
android:id="@+id/join"
android:onClick="@{() -> viewModel.join()}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="@dimen/screen_bottom_margin"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@string/meeting_info_join_title"
app:layout_constraintWidth_max="@dimen/button_max_width"
app:layout_constraintVertical_bias="1"
app:layout_constraintTop_toBottomOf="@id/separator_5"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -20,8 +20,6 @@
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:onClick="@{onClickListener}"
android:onLongClick="@{onLongClickListener}"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@ -66,12 +64,16 @@
app:layout_constraintTop_toBottomOf="@id/header_day"/>
<androidx.cardview.widget.CardView
android:id="@+id/cardview"
android:onClick="@{onClickListener}"
android:onLongClick="@{onLongClickListener}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginEnd="5dp"
android:layout_marginTop="@{firstMeetingOfTheDay ? @dimen/meeting_margin : @dimen/zero, default=@dimen/zero}"
android:layout_marginBottom="8dp"
app:cardBackgroundColor="@color/list_cell_background_color"
app:cardElevation="5dp"
app:cardCornerRadius="10dp"
app:layout_constraintStart_toEndOf="@id/header_day"

View file

@ -0,0 +1,84 @@
<?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="org.linphone.core.ConsolidatedPresence" />
<variable
name="model"
type="org.linphone.ui.main.meetings.model.ParticipantModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<io.getstream.avatarview.AvatarView
android:id="@+id/avatar"
android:layout_width="@dimen/avatar_list_cell_size"
android:layout_height="@dimen/avatar_list_cell_size"
android:layout_marginStart="12dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:adjustViewBounds="true"
android:background="@drawable/shape_circle_light_blue_background"
contactAvatar="@{model.avatarModel}"
app:avatarViewPlaceholder="@drawable/user_circle"
app:avatarViewInitialsBackgroundColor="@color/gray_main2_200"
app:avatarViewInitialsTextColor="@color/gray_main2_600"
app:avatarViewInitialsTextSize="16sp"
app:avatarViewInitialsTextStyle="bold"
app:avatarViewShape="circle"
app:avatarViewBorderWidth="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/presence_badge"
android:layout_width="@dimen/avatar_presence_badge_size"
android:layout_height="@dimen/avatar_presence_badge_size"
android:layout_marginEnd="@dimen/avatar_presence_badge_end_margin"
android:background="@drawable/led_background"
android:padding="@dimen/avatar_presence_badge_padding"
app:presenceIcon="@{model.avatarModel.presenceStatus}"
android:visibility="@{model.avatarModel.presenceStatus == ConsolidatedPresence.Offline ? View.GONE : View.VISIBLE}"
app:layout_constraintEnd_toEndOf="@id/avatar"
app:layout_constraintBottom_toBottomOf="@id/avatar"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@{model.avatarModel.name, default=`John Doe`}"
android:textSize="14sp"
android:layout_marginStart="10dp"
app:layout_constraintStart_toEndOf="@id/avatar"
app:layout_constraintEnd_toStartOf="@id/organizer"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_300"
android:id="@+id/organizer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:text="@string/meeting_info_organizer_label"
android:textSize="12sp"
android:textColor="@color/gray_main2_400"
android:gravity="center"
android:visibility="@{model.isOrganizer ? View.VISIBLE : View.GONE}"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@id/name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -24,463 +24,474 @@
type="org.linphone.ui.main.meetings.viewmodel.ScheduleMeetingViewModel" />
</data>
<androidx.coordinatorlayout.widget.CoordinatorLayout
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="@color/white">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<ImageView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:padding="15dp"
android:adjustViewBounds="true"
android:onClick="@{backClickListener}"
android:src="@drawable/caret_left"
app:tint="@color/orange_main_500"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/title"/>
<ImageView
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:padding="15dp"
android:adjustViewBounds="true"
android:onClick="@{backClickListener}"
android:visibility="@{viewModel.showBackButton ? View.VISIBLE : View.GONE}"
android:src="@drawable/caret_left"
app:tint="@color/orange_main_500"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/title"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/main_page_title_style"
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="@dimen/top_bar_height"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:text="@string/meeting_schedule_title"
app:layout_constraintEnd_toStartOf="@id/schedule"
app:layout_constraintStart_toEndOf="@id/back"
app:layout_constraintTop_toTopOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/main_page_title_style"
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="@dimen/top_bar_height"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:text="@string/meeting_schedule_title"
app:layout_constraintEnd_toStartOf="@id/schedule"
app:layout_constraintStart_toEndOf="@id/back"
app:layout_constraintTop_toTopOf="parent"/>
<ImageView
android:id="@+id/schedule"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:padding="15dp"
android:adjustViewBounds="true"
android:src="@drawable/check"
app:tint="@color/orange_main_500"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/title" />
<ImageView
android:id="@+id/schedule"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:padding="15dp"
android:adjustViewBounds="true"
android:src="@drawable/check"
app:tint="@color/orange_main_500"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/title" />
<ScrollView
android:id="@+id/scrollView"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/meeting_selected"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_meeting_label"
android:textColor="@color/primary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/users_three"
android:drawableTint="@color/primary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/primary_button_background"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.GONE : View.VISIBLE}"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/broadcast"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/broadcast"
android:onClick="@{() -> viewModel.selectBroadcast()}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_broadcast_label"
android:textColor="@color/secondary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/slideshow"
android:drawableTint="@color/secondary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/secondary_button_background"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.GONE : View.VISIBLE}"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toEndOf="@id/meeting_selected"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/meeting"
android:onClick="@{() -> viewModel.selectMeeting()}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_meeting_label"
android:textColor="@color/secondary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/users_three"
android:drawableTint="@color/secondary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/secondary_button_background"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.VISIBLE : View.GONE, default=gone}"
app:layout_constraintTop_toBottomOf="@id/meeting_selected"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/broadcast_selected"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/broadcast_selected"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_broadcast_label"
android:textColor="@color/primary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/slideshow"
android:drawableTint="@color/primary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/primary_button_background"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.VISIBLE : View.GONE, default=gone}"
app:layout_constraintTop_toBottomOf="@id/broadcast"
app:layout_constraintStart_toEndOf="@id/meeting"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/broadcast_help"
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:text="@string/meeting_schedule_broadcast_help"
android:textSize="14sp"
android:textColor="@color/gray_main2_500"
android:drawableStart="@drawable/info"
android:drawablePadding="5dp"
android:gravity="center"
android:background="@drawable/shape_squircle_main2_100_background"
android:visibility="@{viewModel.showBroadcastHelp ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toBottomOf="@id/meeting"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
android:layout_height="wrap_content">
<ImageView
android:id="@+id/close_broadcast_help"
android:onClick="@{() -> viewModel.closeBroadcastHelp()}"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="16dp"
android:src="@drawable/x"
android:visibility="@{viewModel.showBroadcastHelp ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toTopOf="@id/broadcast_help"
app:layout_constraintBottom_toBottomOf="@id/broadcast_help"
app:layout_constraintEnd_toEndOf="@id/broadcast_help" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/meeting_selected"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_meeting_label"
android:textColor="@color/primary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/users_three"
android:drawableTint="@color/primary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/primary_button_background"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.GONE : View.VISIBLE}"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/broadcast"/>
<androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style_800"
android:id="@+id/subject"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:hint="@string/meeting_schedule_subject_hint"
android:textColorHint="@color/gray_main2_600"
android:text="@={viewModel.subject}"
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:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:background="@color/transparent_color"
app:layout_constraintTop_toBottomOf="@id/broadcast_help"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/broadcast"
android:onClick="@{() -> viewModel.selectBroadcast()}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_broadcast_label"
android:textColor="@color/secondary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/slideshow"
android:drawableTint="@color/secondary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/secondary_button_background"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.GONE : View.VISIBLE}"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/meeting_selected"
app:layout_constraintEnd_toEndOf="parent"/>
<View
android:id="@+id/separator"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/subject"
android:background="@color/gray_main2_200" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/meeting"
android:onClick="@{() -> viewModel.selectMeeting()}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_meeting_label"
android:textColor="@color/secondary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/users_three"
android:drawableTint="@color/secondary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/secondary_button_background"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.VISIBLE : View.GONE, default=gone}"
app:layout_constraintTop_toBottomOf="@id/meeting_selected"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/broadcast_selected"/>
<com.google.android.material.materialswitch.MaterialSwitch
style="@style/material_switch_style"
android:id="@+id/all_day_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="16dp"
android:checked="@={viewModel.allDayMeeting}"
app:layout_constraintStart_toEndOf="@id/all_day"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/separator"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/broadcast_selected"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_broadcast_label"
android:textColor="@color/primary_button_label_color"
android:textSize="16sp"
android:gravity="center"
android:drawableStart="@drawable/slideshow"
android:drawableTint="@color/primary_button_label_color"
android:drawablePadding="5dp"
android:background="@drawable/primary_button_background"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.VISIBLE : View.GONE, default=gone}"
app:layout_constraintTop_toBottomOf="@id/broadcast"
app:layout_constraintStart_toEndOf="@id/meeting"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/all_day"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/meeting_schedule_date_all_day_title"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:drawableStart="@drawable/clock"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/all_day_switch"
app:layout_constraintTop_toTopOf="@id/all_day_switch"
app:layout_constraintBottom_toBottomOf="@id/all_day_switch"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/broadcast_help"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:text="@string/meeting_schedule_broadcast_help"
android:textSize="14sp"
android:textColor="@color/gray_main2_500"
android:drawableStart="@drawable/info"
android:drawablePadding="5dp"
android:gravity="center"
android:background="@drawable/shape_squircle_main2_100_background"
android:visibility="@{viewModel.showBroadcastHelp ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toBottomOf="@id/meeting"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/from_date"
android:onClick="@{pickStartDateClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="16dp"
android:text="@{viewModel.fromDate, default=`Tue. October 10th, 2023`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="@id/all_day"
app:layout_constraintTop_toBottomOf="@id/all_day_switch" />
<ImageView
android:id="@+id/close_broadcast_help"
android:onClick="@{() -> viewModel.closeBroadcastHelp()}"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="16dp"
android:src="@drawable/x"
android:visibility="@{viewModel.showBroadcastHelp ? View.VISIBLE : View.GONE}"
app:layout_constraintTop_toTopOf="@id/broadcast_help"
app:layout_constraintBottom_toBottomOf="@id/broadcast_help"
app:layout_constraintEnd_toEndOf="@id/broadcast_help" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/from_time"
android:onClick="@{pickStartTimeClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.fromTime, default=`17:00`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:visibility="@{viewModel.allDayMeeting ? View.GONE : View.VISIBLE}"
app:layout_constraintEnd_toEndOf="@id/all_day_switch"
app:layout_constraintTop_toTopOf="@id/from_date" />
<androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style_800"
android:id="@+id/subject"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:hint="@string/meeting_schedule_subject_hint"
android:textColorHint="@color/gray_main2_600"
android:text="@={viewModel.subject}"
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:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:background="@color/transparent_color"
app:layout_constraintTop_toBottomOf="@id/broadcast_help"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/to_date"
android:onClick="@{pickEndDateClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@{viewModel.toDate, default=`Tue. October 10th, 2023`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:visibility="@{viewModel.allDayMeeting ? View.GONE : View.VISIBLE}"
app:layout_constraintStart_toStartOf="@id/from_date"
app:layout_constraintTop_toBottomOf="@id/from_date" />
<View
android:id="@+id/separator"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="10dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/subject"
android:background="@color/gray_main2_200" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/to_time"
android:onClick="@{pickEndTimeClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.toTime, default=`17:00`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:visibility="@{viewModel.allDayMeeting ? View.GONE : View.VISIBLE}"
app:layout_constraintEnd_toEndOf="@id/all_day_switch"
app:layout_constraintTop_toTopOf="@id/to_date" />
<com.google.android.material.materialswitch.MaterialSwitch
style="@style/material_switch_style"
android:id="@+id/all_day_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="16dp"
android:checked="@={viewModel.allDayMeeting}"
app:layout_constraintStart_toEndOf="@id/all_day"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/separator"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/timezone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="26dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@{viewModel.timezone, default=@string/meeting_schedule_timezone_title}"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:maxLines="1"
android:ellipsize="end"
android:drawableStart="@drawable/globe_hemisphere_west"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/to_date" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/all_day"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/meeting_schedule_date_all_day_title"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:drawableStart="@drawable/clock"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/all_day_switch"
app:layout_constraintTop_toTopOf="@id/all_day_switch"
app:layout_constraintBottom_toBottomOf="@id/all_day_switch"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/repeat"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_one_time_label"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:drawableStart="@drawable/arrow_clockwise"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/timezone" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/from_date"
android:onClick="@{pickStartDateClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginTop="16dp"
android:text="@{viewModel.fromDate, default=`Tue. October 10th, 2023`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="@id/all_day"
app:layout_constraintTop_toBottomOf="@id/all_day_switch" />
<View
android:id="@+id/separator_2"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/repeat"
android:background="@color/gray_main2_200" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/from_time"
android:onClick="@{pickStartTimeClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.fromTime, default=`17:00`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:visibility="@{viewModel.allDayMeeting ? View.GONE : View.VISIBLE}"
app:layout_constraintEnd_toEndOf="@id/all_day_switch"
app:layout_constraintTop_toTopOf="@id/from_date" />
<androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style_700"
android:id="@+id/description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:hint="@string/meeting_schedule_description_hint"
android:textColorHint="@color/gray_main2_600"
android:text="@={viewModel.description}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:inputType="text|textCapSentences"
android:drawableStart="@drawable/file_text"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:background="@color/transparent_color"
app:layout_constraintTop_toBottomOf="@id/separator_2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/to_date"
android:onClick="@{pickEndDateClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@{viewModel.toDate, default=`Tue. October 10th, 2023`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:visibility="@{viewModel.allDayMeeting ? View.GONE : View.VISIBLE}"
app:layout_constraintStart_toStartOf="@id/from_date"
app:layout_constraintTop_toBottomOf="@id/from_date" />
<View
android:id="@+id/separator_3"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/description"
android:background="@color/gray_main2_200" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/to_time"
android:onClick="@{pickEndTimeClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.toTime, default=`17:00`}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:visibility="@{viewModel.allDayMeeting ? View.GONE : View.VISIBLE}"
app:layout_constraintEnd_toEndOf="@id/all_day_switch"
app:layout_constraintTop_toTopOf="@id/to_date" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/speakers"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_add_speaker_title"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:drawableStart="@drawable/user_square"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:visibility="@{viewModel.isBroadcastSelected ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/separator_3" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/timezone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="26dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@{viewModel.timezone, default=@string/meeting_schedule_timezone_title}"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:maxLines="1"
android:ellipsize="end"
android:drawableStart="@drawable/globe_hemisphere_west"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/to_date" />
<View
android:id="@+id/separator_4"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/speakers"
android:background="@color/gray_main2_200" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/repeat"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_one_time_label"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:drawableStart="@drawable/arrow_clockwise"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/timezone" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/participants"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_add_participants_title"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:drawableStart="@drawable/users"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/separator_4" />
<View
android:id="@+id/separator_2"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/repeat"
android:background="@color/gray_main2_200" />
<View
android:id="@+id/separator_5"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/participants"
android:background="@color/gray_main2_200" />
<androidx.appcompat.widget.AppCompatEditText
style="@style/default_text_style_700"
android:id="@+id/description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:hint="@string/meeting_schedule_description_hint"
android:textColorHint="@color/gray_main2_600"
android:text="@={viewModel.description}"
android:textSize="14sp"
android:textColor="@color/gray_main2_600"
android:inputType="text|textCapSentences"
android:drawableStart="@drawable/file_text"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:background="@color/transparent_color"
app:layout_constraintTop_toBottomOf="@id/separator_2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<CheckBox
style="@style/default_text_style"
android:id="@+id/send_invitations"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_send_invitations_title"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:checked="@={viewModel.sendInvitations}"
app:layout_constraintTop_toBottomOf="@id/separator_5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<View
android:id="@+id/separator_3"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
android:visibility="@{viewModel.isBroadcastSelected ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/description"
android:background="@color/gray_main2_200" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/speakers"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_add_speaker_title"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:drawableStart="@drawable/user_square"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
android:visibility="@{viewModel.isBroadcastSelected ? View.VISIBLE : View.GONE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/separator_3" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<View
android:id="@+id/separator_4"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/speakers"
android:background="@color/gray_main2_200" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/participants"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_add_participants_title"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:drawableStart="@drawable/users"
android:drawablePadding="8dp"
android:drawableTint="@color/gray_main2_600"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/separator_4" />
<View
android:id="@+id/separator_5"
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_marginTop="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/participants"
android:background="@color/gray_main2_200" />
<CheckBox
style="@style/default_text_style"
android:id="@+id/send_invitations"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/meeting_schedule_send_invitations_title"
android:textColor="@color/gray_main2_600"
android:textSize="14sp"
android:checked="@={viewModel.sendInvitations}"
app:layout_constraintTop_toBottomOf="@id/separator_5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -15,10 +15,15 @@
android:id="@+id/meetingFragment"
android:name="org.linphone.ui.main.meetings.fragment.MeetingFragment"
android:label="MeetingFragment"
tools:layout="@layout/meeting_fragment"/>
tools:layout="@layout/meeting_fragment">
<argument
android:name="conferenceUri"
app:argType="string" />
</fragment>
<action
android:id="@+id/action_global_meetingFragment"
app:destination="@id/meetingFragment"/>
app:destination="@id/meetingFragment"
app:launchSingleTop="true" />
</navigation>

View file

@ -348,6 +348,8 @@
<string name="meeting_schedule_add_participants_title">Add participants</string>
<string name="meeting_schedule_add_speaker_title">Add speaker</string>
<string name="meeting_schedule_send_invitations_title">Send invitation to participants</string>
<string name="meeting_info_join_title">Join the meeting now</string>
<string name="meeting_info_organizer_label">Organizer</string>
<string name="operation_in_progress_overlay">Operation in progress, please wait</string>