diff --git a/app/src/main/java/org/linphone/activities/main/conference/adapters/ScheduledConferencesAdapter.kt b/app/src/main/java/org/linphone/activities/main/conference/adapters/ScheduledConferencesAdapter.kt index a3ce4ac64..b9a2e3470 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/adapters/ScheduledConferencesAdapter.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/adapters/ScheduledConferencesAdapter.kt @@ -50,6 +50,10 @@ class ScheduledConferencesAdapter( MutableLiveData>>() } + val editConferenceEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + val deleteConferenceInfoEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -117,6 +121,13 @@ class ScheduledConferencesAdapter( } } + setEditConferenceClickListener { + val address = conferenceData.conferenceInfo.uri + if (address != null) { + editConferenceEvent.value = Event(address.asStringUriOnly()) + } + } + setDeleteConferenceClickListener { deleteConferenceInfoEvent.value = Event(conferenceData) } diff --git a/app/src/main/java/org/linphone/activities/main/conference/data/ScheduledConferenceData.kt b/app/src/main/java/org/linphone/activities/main/conference/data/ScheduledConferenceData.kt index feff7598f..f83975489 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/data/ScheduledConferenceData.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/data/ScheduledConferenceData.kt @@ -37,6 +37,7 @@ class ScheduledConferenceData(val conferenceInfo: ConferenceInfo) { val date = MutableLiveData() val duration = MutableLiveData() val organizer = MutableLiveData() + val canEdit = MutableLiveData() val participantsShort = MutableLiveData() val participantsExpanded = MutableLiveData() val showDuration = MutableLiveData() @@ -59,12 +60,19 @@ class ScheduledConferenceData(val conferenceInfo: ConferenceInfo) { val organizerAddress = conferenceInfo.organizer if (organizerAddress != null) { + val localAccount = coreContext.core.accountList.find { account -> + val address = account.params.identityAddress + address != null && organizerAddress.weakEqual(address) + } + canEdit.value = localAccount != null + val contact = coreContext.contactsManager.findContactByAddress(organizerAddress) organizer.value = if (contact != null) contact.fullName else LinphoneUtils.getDisplayName(conferenceInfo.organizer) } else { + canEdit.value = false Log.e("[Scheduled Conference] No organizer SIP URI found for: ${conferenceInfo.uri?.asStringUriOnly()}") } diff --git a/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceSchedulingFragment.kt b/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceSchedulingFragment.kt index 23e1fb610..21dd1ab24 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceSchedulingFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/fragments/ConferenceSchedulingFragment.kt @@ -22,20 +22,26 @@ package org.linphone.activities.main.conference.fragments import android.os.Bundle import android.text.format.DateFormat.is24HourFormat import android.view.View +import androidx.lifecycle.ViewModelProvider import androidx.navigation.navGraphViewModels import com.google.android.material.datepicker.CalendarConstraints import com.google.android.material.datepicker.DateValidatorPointForward import com.google.android.material.datepicker.MaterialDatePicker import com.google.android.material.timepicker.MaterialTimePicker import com.google.android.material.timepicker.TimeFormat +import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.R import org.linphone.activities.GenericFragment import org.linphone.activities.main.conference.viewmodels.ConferenceSchedulingViewModel +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToParticipantsList +import org.linphone.core.Factory +import org.linphone.core.tools.Log import org.linphone.databinding.ConferenceSchedulingFragmentBinding class ConferenceSchedulingFragment : GenericFragment() { private val viewModel: ConferenceSchedulingViewModel by navGraphViewModels(R.id.conference_scheduling_nav_graph) + private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.conference_scheduling_fragment @@ -46,6 +52,29 @@ class ConferenceSchedulingFragment : GenericFragment + val conferenceAddress = Factory.instance().createAddress(address) + if (conferenceAddress != null) { + Log.i("[Conference Scheduling] Trying to edit conference info using address: $address") + val conferenceInfo = coreContext.core.findConferenceInformationFromUri(conferenceAddress) + if (conferenceInfo != null) { + viewModel.populateFromConferenceInfo(conferenceInfo) + } else { + Log.e("[Conference Scheduling] Failed to find ConferenceInfo matching address: $address") + } + } else { + Log.e("[Conference Scheduling] Failed to parse conference address: $address") + } + } + } + binding.setBackClickListener { goBack() } diff --git a/app/src/main/java/org/linphone/activities/main/conference/fragments/ScheduledConferencesFragment.kt b/app/src/main/java/org/linphone/activities/main/conference/fragments/ScheduledConferencesFragment.kt index 1f74142c7..3e79a8960 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/fragments/ScheduledConferencesFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/fragments/ScheduledConferencesFragment.kt @@ -33,16 +33,19 @@ import org.linphone.activities.main.MainActivity import org.linphone.activities.main.conference.adapters.ScheduledConferencesAdapter import org.linphone.activities.main.conference.viewmodels.ScheduledConferencesViewModel import org.linphone.activities.main.viewmodels.DialogViewModel +import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.navigateToConferenceScheduling import org.linphone.activities.navigateToConferenceWaitingRoom import org.linphone.databinding.ConferencesScheduledFragmentBinding import org.linphone.utils.AppUtils import org.linphone.utils.DialogUtils +import org.linphone.utils.Event import org.linphone.utils.RecyclerViewHeaderDecoration class ScheduledConferencesFragment : GenericFragment() { private lateinit var viewModel: ScheduledConferencesViewModel private lateinit var adapter: ScheduledConferencesAdapter + private lateinit var sharedViewModel: SharedMainViewModel override fun getLayoutId(): Int = R.layout.conferences_scheduled_fragment @@ -63,6 +66,10 @@ class ScheduledConferencesFragment : GenericFragment + sharedViewModel.conferenceInfoToEdit.value = Event(address) + navigateToConferenceScheduling() + } + } + adapter.deleteConferenceInfoEvent.observe( viewLifecycleOwner ) { diff --git a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceSchedulingViewModel.kt b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceSchedulingViewModel.kt index 0d9c468c0..deb3ca82f 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceSchedulingViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ConferenceSchedulingViewModel.kt @@ -69,20 +69,9 @@ class ConferenceSchedulingViewModel : ContactsSelectionViewModel() { var hour: Int = 0 var minutes: Int = 0 + private var confInfo: ConferenceInfo? = null private val conferenceScheduler = coreContext.core.createConferenceScheduler() - private val chatRoomListener = object : ChatRoomListenerStub() { - override fun onStateChanged(room: ChatRoom, state: ChatRoom.State) { - if (state == ChatRoom.State.Created) { - Log.i("[Conference Creation] Chat room created") - room.removeListener(this) - } else if (state == ChatRoom.State.CreationFailed) { - Log.e("[Conference Creation] Group chat room creation has failed !") - room.removeListener(this) - } - } - } - private val listener = object : ConferenceSchedulerListenerStub() { override fun onStateChanged( conferenceScheduler: ConferenceScheduler, @@ -179,6 +168,30 @@ class ConferenceSchedulingViewModel : ContactsSelectionViewModel() { super.onCleared() } + fun populateFromConferenceInfo(conferenceInfo: ConferenceInfo) { + confInfo = conferenceInfo + address.value = conferenceInfo.uri + subject.value = conferenceInfo.subject + description.value = conferenceInfo.description + + val dateTime = conferenceInfo.dateTime + val calendar = Calendar.getInstance() + calendar.timeInMillis = dateTime * 1000 + setDate(calendar.timeInMillis) + setTime(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE)) + + val conferenceDuration = conferenceInfo.duration + duration.value = durationList.find { it.value == conferenceDuration } + scheduleForLater.value = conferenceDuration > 0 + + val participantsList = arrayListOf
() + for (participant in conferenceInfo.participants) { + participantsList.add(participant) + } + selectedAddresses.value = participantsList + computeParticipantsData() + } + fun toggleSchedule() { scheduleForLater.value = scheduleForLater.value == false } @@ -221,23 +234,10 @@ class ConferenceSchedulingViewModel : ContactsSelectionViewModel() { val core = coreContext.core val participants = arrayOfNulls
(selectedAddresses.value.orEmpty().size) selectedAddresses.value?.toArray(participants) - val localAddress = core.defaultAccount?.params?.identityAddress + val localAccount = core.defaultAccount + val localAddress = localAccount?.params?.identityAddress - // TODO: Temporary workaround for chat room, to be removed once we can get matching chat room from conference - /*val chatRoomParams = core.createDefaultChatRoomParams() - chatRoomParams.backend = ChatRoomBackend.FlexisipChat - chatRoomParams.enableGroup(true) - chatRoomParams.subject = subject.value - val chatRoom = core.createChatRoom(chatRoomParams, localAddress, participants) - if (chatRoom == null) { - Log.e("[Conference Creation] Failed to create a chat room with same subject & participants as for conference") - } else { - Log.i("[Conference Creation] Creating chat room with same subject [${subject.value}] & participants as for conference") - chatRoom.addListener(chatRoomListener) - }*/ - // END OF TODO - - val conferenceInfo = Factory.instance().createConferenceInfo() + val conferenceInfo = confInfo ?: Factory.instance().createConferenceInfo() conferenceInfo.organizer = localAddress conferenceInfo.subject = subject.value conferenceInfo.description = description.value @@ -248,7 +248,10 @@ class ConferenceSchedulingViewModel : ContactsSelectionViewModel() { val duration = duration.value?.value ?: 0 conferenceInfo.duration = duration } - conferenceScheduler.info = conferenceInfo // Will trigger the conference creation automatically + confInfo = conferenceInfo + conferenceScheduler.account = localAccount + // Will trigger the conference creation/update automatically + conferenceScheduler.info = conferenceInfo } private fun computeTimeZonesList(): List { diff --git a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ScheduledConferencesViewModel.kt b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ScheduledConferencesViewModel.kt index 5e2355d44..a1a0a14fa 100644 --- a/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ScheduledConferencesViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/conference/viewmodels/ScheduledConferencesViewModel.kt @@ -38,6 +38,7 @@ class ScheduledConferencesViewModel : ViewModel() { conferencesList.addAll(conferences.value.orEmpty()) val data = ScheduledConferenceData(conferenceInfo) conferencesList.add(data) + conferencesList.sortBy { it.conferenceInfo.dateTime } conferences.value = conferencesList } } diff --git a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt index bcd29007d..ccc613b5f 100644 --- a/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/viewmodels/SharedMainViewModel.kt @@ -95,6 +95,12 @@ class SharedMainViewModel : ViewModel() { var pendingCallTransfer: Boolean = false + /* Conference */ + + val conferenceInfoToEdit: MutableLiveData> by lazy { + MutableLiveData>() + } + /* Dialer */ var dialerUri: String = "" diff --git a/app/src/main/res/layout/conference_schedule_cell.xml b/app/src/main/res/layout/conference_schedule_cell.xml index 2968a25b3..b23d60089 100644 --- a/app/src/main/res/layout/conference_schedule_cell.xml +++ b/app/src/main/res/layout/conference_schedule_cell.xml @@ -95,7 +95,7 @@ android:visibility="@{data.expanded ? View.GONE : View.VISIBLE}" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="10dp" + android:layout_marginTop="5dp" android:layout_marginBottom="10dp" android:layout_marginStart="5dp" android:layout_marginEnd="5dp" @@ -125,6 +125,7 @@ android:visibility="@{data.expanded ? View.VISIBLE : View.GONE, default=gone}" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="5dp" android:layout_marginStart="5dp" android:layout_marginEnd="5dp"> @@ -255,7 +256,7 @@