diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index b953aa161..98a393bd2 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -46,6 +46,7 @@ import androidx.core.view.updatePadding import androidx.databinding.DataBindingUtil import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.observe import androidx.navigation.NavController import androidx.navigation.NavDestination import androidx.navigation.NavOptions @@ -154,7 +155,8 @@ class MainActivity : GenericActivity() { binding.lifecycleOwner = this setUpToastsArea(binding.toastsArea) - ViewCompat.setOnApplyWindowInsetsListener(binding.inCallTopBar.root) { v, windowInsets -> + // Will give the device's status bar background color + ViewCompat.setOnApplyWindowInsetsListener(binding.notificationsArea) { v, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) v.updatePadding(0, insets.top, 0, 0) windowInsets @@ -248,6 +250,20 @@ class MainActivity : GenericActivity() { } } + viewModel.clearFilesPendingSharingEvent.observe(this) { + it.consume { + sharedViewModel.filesToShareFromIntent.value = arrayListOf() + } + } + + sharedViewModel.filesToShareFromIntent.observe(this) { list -> + if (list.isNotEmpty()) { + viewModel.addFilesPendingSharing(list) + } else { + viewModel.filesPendingSharingListCleared() + } + } + // Wait for latest visited fragment to be displayed before hiding the splashscreen binding.root.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { diff --git a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt index 8bbd9548c..1151d128b 100644 --- a/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/chat/fragment/ConversationsListFragment.kt @@ -44,7 +44,6 @@ import org.linphone.ui.main.chat.adapter.ConversationsListAdapter import org.linphone.ui.main.chat.viewmodel.ConversationsListViewModel import org.linphone.ui.main.fragment.AbstractMainFragment import org.linphone.ui.main.history.fragment.HistoryMenuDialogFragment -import org.linphone.utils.AppUtils import org.linphone.utils.Event import org.linphone.utils.LinphoneUtils @@ -251,20 +250,6 @@ class ConversationsListFragment : AbstractMainFragment() { } } - sharedViewModel.filesToShareFromIntent.observe(viewLifecycleOwner) { filesToShare -> - val count = filesToShare.size - if (count > 0) { - val message = AppUtils.getStringWithPlural( - R.plurals.conversations_files_waiting_to_be_shared_toast, - count, - filesToShare.size.toString() - ) - val icon = R.drawable.file - (requireActivity() as GenericActivity).showGreenToast(message, icon) - Log.i("$TAG Found [$count] files waiting to be shared") - } - } - sharedViewModel.textToShareFromIntent.observe(viewLifecycleOwner) { textToShare -> if (textToShare.isNotEmpty()) { val message = getString(R.string.conversations_text_waiting_to_be_shared_toast) diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt index c4f780d4e..26266e87b 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/MainViewModel.kt @@ -62,8 +62,6 @@ class MainViewModel const val SEND_NOTIFICATIONS_PERMISSION_NOT_GRANTED = 15 const val DEFAULT_ACCOUNT_DISABLED = 18 const val NETWORK_NOT_REACHABLE = 19 - const val SINGLE_CALL = 20 - const val MULTIPLE_CALLS = 21 } val showAlert = MutableLiveData() @@ -76,8 +74,16 @@ class MainViewModel val atLeastOneCall = MutableLiveData() + val callLabel = MutableLiveData() + val callsStatus = MutableLiveData() + val pendingFileSharing = MutableLiveData() + + val filesCountPendingSharing = MutableLiveData() + + val filesPendingSharingLabel = MutableLiveData() + val goBackToCallEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -106,6 +112,10 @@ class MainViewModel MutableLiveData>() } + val clearFilesPendingSharingEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private var accountsFound = -1 var mainIntentHandled = false @@ -130,7 +140,6 @@ class MainViewModel @WorkerThread override fun onLastCallEnded(core: Core) { Log.i("$TAG Last call ended, removing in-call 'alert'") - removeAlert(SINGLE_CALL) atLeastOneCall.postValue(false) computeNonDefaultAccountNotificationsCount() } @@ -166,9 +175,6 @@ class MainViewModel ) { updateCallAlert() } else if (core.callsNb == 1) { - if (LinphoneUtils.isCallEnding(call.state)) { - removeAlert(MULTIPLE_CALLS) - } callsStatus.postValue(LinphoneUtils.callStateToString(call.state)) } } @@ -342,6 +348,11 @@ class MainViewModel atLeastOneCall.value = false maxAlertLevel.value = NONE nonDefaultAccountNotificationsCount = 0 + + pendingFileSharing.value = false + filesCountPendingSharing.value = 0 + filesPendingSharingLabel.value = "" + enableAccountMonitoring(true) coreContext.postOnCoreThread { core -> @@ -457,6 +468,42 @@ class MainViewModel } } + @UiThread + fun onCallTopBarClicked() { + if (atLeastOneCall.value == true) { + goBackToCallEvent.value = Event(true) + } + } + + @UiThread + fun addFilesPendingSharing(list: ArrayList) { + val count = list.size + Log.i("$TAG Adding [$count] files to pending sharing files list") + if (count > 0) { + filesCountPendingSharing.value = count + filesPendingSharingLabel.value = AppUtils.getStringWithPlural( + R.plurals.conversations_files_waiting_to_be_shared_toast, + count, + "$count" + ) + pendingFileSharing.value = true + } + } + + @UiThread + fun filesPendingSharingListCleared() { + pendingFileSharing.value = false + filesCountPendingSharing.value = 0 + filesPendingSharingLabel.value = "" + Log.i("$TAG List of files pending sharing has been cleared") + } + + @UiThread + fun cancelFileSharing() { + Log.i("$TAG Clearing list of files pending sharing") + clearFilesPendingSharingEvent.value = Event(true) + } + @UiThread fun enableAccountMonitoring(enable: Boolean) { if (enable != monitorAccount) { @@ -500,8 +547,6 @@ class MainViewModel val core = coreContext.core val callsNb = core.callsNb if (callsNb == 1) { - removeAlert(MULTIPLE_CALLS) - val currentCall = core.currentCall ?: core.calls.firstOrNull() if (currentCall != null) { val address = currentCall.callLog.remoteAddress @@ -513,16 +558,11 @@ class MainViewModel contact?.name ?: LinphoneUtils.getDisplayName(address) } Log.i("$TAG Showing single call alert with label [$label]") - addAlert(SINGLE_CALL, label) + callLabel.postValue(label) callsStatus.postValue(LinphoneUtils.callStateToString(currentCall.state)) } } else if (callsNb > 1) { - removeAlert(SINGLE_CALL) - - addAlert( - MULTIPLE_CALLS, - AppUtils.getFormattedString(R.string.calls_count_label, callsNb) - ) + callLabel.postValue(AppUtils.getFormattedString(R.string.calls_count_label, callsNb)) callsStatus.postValue("") // TODO: improve ? } } @@ -589,9 +629,6 @@ class MainViewModel SEND_NOTIFICATIONS_PERMISSION_NOT_GRANTED, FULL_SCREEN_INTENTS_PERMISSION_NOT_GRANTED -> { R.drawable.bell_simple_slash } - SINGLE_CALL, MULTIPLE_CALLS -> { - R.drawable.phone - } else -> { R.drawable.bell_simple } @@ -599,11 +636,8 @@ class MainViewModel alertIcon.postValue(icon) alertLabel.postValue(label) - if (type < SINGLE_CALL) { - // Call alert is displayed using atLeastOnCall mutable, not showAlert - Log.i("$TAG Alert top-bar is currently invisible, display it now") - showAlert.postValue(true) - } + Log.i("$TAG Alert top-bar is currently invisible, display it now") + showAlert.postValue(true) } } diff --git a/app/src/main/res/drawable/files.xml b/app/src/main/res/drawable/files.xml new file mode 100644 index 000000000..41d445997 --- /dev/null +++ b/app/src/main/res/drawable/files.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index 87cf08324..9b7ce23f7 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -22,15 +22,39 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:orientation="vertical" + android:background="@{viewModel.showAlert ? (viewModel.maxAlertLevel >= 10 ? @drawable/color_danger_500 : @drawable/color_main_activity_top_bar) : (viewModel.pendingFileSharing ? @drawable/color_main_activity_top_bar : (viewModel.atLeastOneCall ? @drawable/color_success_500 : @drawable/color_main1_500)), default=@drawable/color_main1_500}" + app:layout_constraintTop_toTopOf="parent"> + + + + + + + + - - - - diff --git a/app/src/main/res/layout/main_activity_in_call_top_bar.xml b/app/src/main/res/layout/main_activity_in_call_top_bar.xml new file mode 100644 index 000000000..9130c5bb2 --- /dev/null +++ b/app/src/main/res/layout/main_activity_in_call_top_bar.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_activity_pending_file_sharing_top_bar.xml b/app/src/main/res/layout/main_activity_pending_file_sharing_top_bar.xml new file mode 100644 index 000000000..a30148cce --- /dev/null +++ b/app/src/main/res/layout/main_activity_pending_file_sharing_top_bar.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file