From c72e2cb852334ffbcf6a00da72d2a964879ac48e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 29 Sep 2023 17:03:50 +0200 Subject: [PATCH] Added pause/resume from in-call extras actions + update available dialog + removed unused resources --- .../ui/call/viewmodel/CurrentCallViewModel.kt | 47 ++++++++ .../main/contacts/fragment/ContactFragment.kt | 2 +- .../contacts/fragment/EditContactFragment.kt | 4 +- .../contacts/fragment/NewContactFragment.kt | 2 +- .../ui/main/help/fragment/HelpFragment.kt | 44 +++++++- .../ui/main/help/viewmodel/HelpViewModel.kt | 8 +- .../fragment/HistoryContactFragment.kt | 2 +- .../history/fragment/HistoryListFragment.kt | 2 +- .../history/model/ConfirmationDialogModel.kt | 6 +- .../fragment/AccountProfileFragment.kt | 2 +- .../java/org/linphone/utils/DialogUtils.kt | 20 ++++ .../circle_green_button_background.xml | 9 -- app/src/main/res/drawable/file_text.xml | 9 -- app/src/main/res/drawable/record.xml | 9 -- app/src/main/res/drawable/recordings.xml | 13 --- .../shape_circle_green_background.xml | 5 - ...shape_circle_green_disabled_background.xml | 5 - .../shape_circle_green_pressed_background.xml | 5 - .../shape_rectangle_white_background.xml | 4 - app/src/main/res/drawable/user_gear.xml | 9 -- .../res/layout-land/call_extra_actions.xml | 4 + .../layout/assistant_country_picker_cell.xml | 33 ------ .../assistant_country_picker_fragment.xml | 88 --------------- .../main/res/layout/call_extra_actions.xml | 4 + .../layout/dialog_cancel_contact_changes.xml | 2 +- .../main/res/layout/dialog_delete_contact.xml | 2 +- .../main/res/layout/dialog_remove_account.xml | 2 +- .../layout/dialog_remove_all_call_logs.xml | 2 +- .../res/layout/dialog_remove_call_logs.xml | 2 +- .../res/layout/dialog_update_available.xml | 103 ++++++++++++++++++ .../start_call_suggestion_list_decoration.xml | 3 +- app/src/main/res/values/dimen.xml | 1 - app/src/main/res/values/strings.xml | 8 +- 33 files changed, 241 insertions(+), 220 deletions(-) delete mode 100644 app/src/main/res/drawable/circle_green_button_background.xml delete mode 100644 app/src/main/res/drawable/file_text.xml delete mode 100644 app/src/main/res/drawable/record.xml delete mode 100644 app/src/main/res/drawable/recordings.xml delete mode 100644 app/src/main/res/drawable/shape_circle_green_background.xml delete mode 100644 app/src/main/res/drawable/shape_circle_green_disabled_background.xml delete mode 100644 app/src/main/res/drawable/shape_circle_green_pressed_background.xml delete mode 100644 app/src/main/res/drawable/shape_rectangle_white_background.xml delete mode 100644 app/src/main/res/drawable/user_gear.xml delete mode 100644 app/src/main/res/layout/assistant_country_picker_cell.xml delete mode 100644 app/src/main/res/layout/assistant_country_picker_fragment.xml create mode 100644 app/src/main/res/layout/dialog_update_available.xml diff --git a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt index bae3d3241..9ed55457f 100644 --- a/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt +++ b/app/src/main/java/org/linphone/ui/call/viewmodel/CurrentCallViewModel.kt @@ -78,6 +78,10 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { val remoteRecordingLabel = MutableLiveData() + val canBePaused = MutableLiveData() + + val isPaused = MutableLiveData() + val isMicrophoneMuted = MutableLiveData() val isSpeakerEnabled = MutableLiveData() @@ -207,6 +211,9 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { fullScreenMode.postValue(false) } } + + isPaused.postValue(isCallPaused()) + canBePaused.postValue(canCallBePaused()) } @WorkerThread @@ -539,6 +546,24 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { } } + @UiThread + fun togglePause() { + coreContext.postOnCoreThread { + if (::currentCall.isInitialized) { + when (isCallPaused()) { + true -> { + Log.i("$TAG Resuming call [${currentCall.remoteAddress.asStringUriOnly()}]") + currentCall.resume() + } + false -> { + Log.i("$TAG Pausing call [${currentCall.remoteAddress.asStringUriOnly()}]") + currentCall.pause() + } + } + } + } + } + @UiThread fun toggleFullScreen() { if (fullScreenMode.value == false && isVideoEnabled.value == false) return @@ -647,6 +672,9 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { isOutgoing.postValue(call.dir == Call.Dir.Outgoing) + isPaused.postValue(isCallPaused()) + canBePaused.postValue(canCallBePaused()) + val address = call.remoteAddress.clone() address.clean() displayedAddress.postValue(address.asStringUriOnly()) @@ -695,4 +723,23 @@ class CurrentCallViewModel @UiThread constructor() : ViewModel() { ) isBluetoothEnabled.postValue(audioDevice?.type == AudioDevice.Type.Bluetooth) } + + @WorkerThread + private fun isCallPaused(): Boolean { + if (::currentCall.isInitialized) { + return when (currentCall.state) { + Call.State.Paused, Call.State.Pausing -> true + else -> false + } + } + return false + } + + @WorkerThread + private fun canCallBePaused(): Boolean { + return ::currentCall.isInitialized && !currentCall.mediaInProgress() && when (currentCall.state) { + Call.State.StreamsRunning, Call.State.PausedByRemote, Call.State.Paused -> true + else -> false + } + } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt index 4007e135e..d98d70c50 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/ContactFragment.kt @@ -311,7 +311,7 @@ class ContactFragment : GenericFragment() { } } - model.confirmRemovalEvent.observe(viewLifecycleOwner) { + model.confirmEvent.observe(viewLifecycleOwner) { it.consume { Log.w( "$TAG Deleting contact [${viewModel.contact.value?.name?.value}]" diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt index 588491eb9..eaa36a9bd 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/EditContactFragment.kt @@ -125,7 +125,7 @@ class EditContactFragment : GenericFragment() { } } - model.confirmRemovalEvent.observe(viewLifecycleOwner) { + model.confirmEvent.observe(viewLifecycleOwner) { it.consume { findNavController().popBackStack() dialog.dismiss() @@ -242,7 +242,7 @@ class EditContactFragment : GenericFragment() { } } - model.confirmRemovalEvent.observe(viewLifecycleOwner) { + model.confirmEvent.observe(viewLifecycleOwner) { it.consume { backPressedCallback.isEnabled = false findNavController().popBackStack() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt index 510d58647..09aee38ff 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/fragment/NewContactFragment.kt @@ -223,7 +223,7 @@ class NewContactFragment : GenericFragment() { } } - model.confirmRemovalEvent.observe(viewLifecycleOwner) { + model.confirmEvent.observe(viewLifecycleOwner) { it.consume { backPressedCallback.isEnabled = false findNavController().popBackStack() diff --git a/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt b/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt index d34086c6f..190d71e6b 100644 --- a/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt @@ -15,6 +15,8 @@ import org.linphone.databinding.HelpFragmentBinding import org.linphone.ui.main.MainActivity import org.linphone.ui.main.fragment.GenericFragment import org.linphone.ui.main.help.viewmodel.HelpViewModel +import org.linphone.ui.main.history.model.ConfirmationDialogModel +import org.linphone.utils.DialogUtils @UiThread class HelpFragment : GenericFragment() { @@ -88,11 +90,10 @@ class HelpFragment : GenericFragment() { } viewModel.newVersionAvailableEvent.observe(viewLifecycleOwner) { - it.consume { version -> - (requireActivity() as MainActivity).showGreenToast( - getString(R.string.help_update_available_toast_message, version), - R.drawable.info - ) + it.consume { pair -> + val version = pair.first + val url = pair.second + showUpdateAvailableDialog(version, url) } } @@ -114,4 +115,37 @@ class HelpFragment : GenericFragment() { } } } + + private fun showUpdateAvailableDialog(version: String, url: String) { + val message = getString(R.string.dialog_update_available_message, version) + + val model = ConfirmationDialogModel() + val dialog = DialogUtils.getUpdateAvailableDialog( + requireActivity(), + model, + message + ) + + model.dismissEvent.observe(viewLifecycleOwner) { + it.consume { + dialog.dismiss() + } + } + + model.confirmEvent.observe(viewLifecycleOwner) { + it.consume { + try { + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + startActivity(browserIntent) + } catch (ise: IllegalStateException) { + Log.e( + "$TAG Can't start ACTION_VIEW intent for URL [$url], IllegalStateException: $ise" + ) + } + dialog.dismiss() + } + } + + dialog.show() + } } diff --git a/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt b/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt index 121258e17..2f83d5d84 100644 --- a/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/help/viewmodel/HelpViewModel.kt @@ -45,8 +45,8 @@ class HelpViewModel @UiThread constructor() : ViewModel() { val debugModeEnabled = MutableLiveData() - val newVersionAvailableEvent: MutableLiveData> by lazy { - MutableLiveData>() + val newVersionAvailableEvent: MutableLiveData>> by lazy { + MutableLiveData>>() } val versionUpToDateEvent: MutableLiveData> by lazy { @@ -80,8 +80,8 @@ class HelpViewModel @UiThread constructor() : ViewModel() { when (result) { VersionUpdateCheckResult.NewVersionAvailable -> { Log.i("$TAG Update available, version [$version], url [$url]") - if (!version.isNullOrEmpty()) { - newVersionAvailableEvent.postValue(Event(version)) + if (!version.isNullOrEmpty() && !url.isNullOrEmpty()) { + newVersionAvailableEvent.postValue(Event(Pair(version, url))) } } VersionUpdateCheckResult.UpToDate -> { diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt index 31637afff..c3701cc17 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryContactFragment.kt @@ -204,7 +204,7 @@ class HistoryContactFragment : GenericFragment() { } } - model.confirmRemovalEvent.observe(viewLifecycleOwner) { + model.confirmEvent.observe(viewLifecycleOwner) { it.consume { Log.w( "$TAG Removing call entries with [${viewModel.callLogModel.value?.address?.asStringUriOnly()}] from database" diff --git a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt index ac628a538..3e8011f0f 100644 --- a/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/history/fragment/HistoryListFragment.kt @@ -270,7 +270,7 @@ class HistoryListFragment : AbstractTopBarFragment() { } } - model.confirmRemovalEvent.observe(viewLifecycleOwner) { + model.confirmEvent.observe(viewLifecycleOwner) { it.consume { Log.w("$TAG Removing all call entries from database") listViewModel.removeAllCallLogs() diff --git a/app/src/main/java/org/linphone/ui/main/history/model/ConfirmationDialogModel.kt b/app/src/main/java/org/linphone/ui/main/history/model/ConfirmationDialogModel.kt index 3b7e94abf..95ac1be98 100644 --- a/app/src/main/java/org/linphone/ui/main/history/model/ConfirmationDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/main/history/model/ConfirmationDialogModel.kt @@ -26,7 +26,7 @@ import org.linphone.utils.Event class ConfirmationDialogModel @UiThread constructor() { val dismissEvent = MutableLiveData>() - val confirmRemovalEvent = MutableLiveData>() + val confirmEvent = MutableLiveData>() @UiThread fun dismiss() { @@ -34,7 +34,7 @@ class ConfirmationDialogModel @UiThread constructor() { } @UiThread - fun confirmRemoval() { - confirmRemovalEvent.value = Event(true) + fun confirm() { + confirmEvent.value = Event(true) } } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt index 8ae07c0af..5100400ac 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/AccountProfileFragment.kt @@ -113,7 +113,7 @@ class AccountProfileFragment : GenericFragment() { } } - model.confirmRemovalEvent.observe(viewLifecycleOwner) { + model.confirmEvent.observe(viewLifecycleOwner) { it.consume { viewModel.deleteAccount() dialog.dismiss() diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt index 49158d088..80a108082 100644 --- a/app/src/main/java/org/linphone/utils/DialogUtils.kt +++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt @@ -43,6 +43,7 @@ import org.linphone.databinding.DialogPickNumberOrAddressBinding import org.linphone.databinding.DialogRemoveAccountBinding import org.linphone.databinding.DialogRemoveAllCallLogsBinding import org.linphone.databinding.DialogRemoveCallLogsBinding +import org.linphone.databinding.DialogUpdateAvailableBinding import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel import org.linphone.ui.assistant.model.ConfirmPhoneNumberDialogModel import org.linphone.ui.call.model.ZrtpSasConfirmationDialogModel @@ -246,6 +247,24 @@ class DialogUtils { return getDialog(context, binding) } + @UiThread + fun getUpdateAvailableDialog( + context: Context, + viewModel: ConfirmationDialogModel, + message: String + ): Dialog { + val binding: DialogUpdateAvailableBinding = DataBindingUtil.inflate( + LayoutInflater.from(context), + R.layout.dialog_update_available, + null, + false + ) + binding.viewModel = viewModel + binding.message.text = message + + return getDialog(context, binding) + } + @UiThread fun getZrtpSasConfirmationDialog( context: Context, @@ -262,6 +281,7 @@ class DialogUtils { return getDialog(context, binding) } + @UiThread private fun getDialog(context: Context, binding: ViewDataBinding): Dialog { val dialog = Dialog(context, R.style.Theme_LinphoneDialog) dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) diff --git a/app/src/main/res/drawable/circle_green_button_background.xml b/app/src/main/res/drawable/circle_green_button_background.xml deleted file mode 100644 index 2e9b062ed..000000000 --- a/app/src/main/res/drawable/circle_green_button_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/file_text.xml b/app/src/main/res/drawable/file_text.xml deleted file mode 100644 index da26bb18b..000000000 --- a/app/src/main/res/drawable/file_text.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/record.xml b/app/src/main/res/drawable/record.xml deleted file mode 100644 index a7912ae10..000000000 --- a/app/src/main/res/drawable/record.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/recordings.xml b/app/src/main/res/drawable/recordings.xml deleted file mode 100644 index e897e9bcf..000000000 --- a/app/src/main/res/drawable/recordings.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/shape_circle_green_background.xml b/app/src/main/res/drawable/shape_circle_green_background.xml deleted file mode 100644 index d85e09b4c..000000000 --- a/app/src/main/res/drawable/shape_circle_green_background.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_circle_green_disabled_background.xml b/app/src/main/res/drawable/shape_circle_green_disabled_background.xml deleted file mode 100644 index f78730669..000000000 --- a/app/src/main/res/drawable/shape_circle_green_disabled_background.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_circle_green_pressed_background.xml b/app/src/main/res/drawable/shape_circle_green_pressed_background.xml deleted file mode 100644 index 2094742c3..000000000 --- a/app/src/main/res/drawable/shape_circle_green_pressed_background.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_rectangle_white_background.xml b/app/src/main/res/drawable/shape_rectangle_white_background.xml deleted file mode 100644 index 95a658bb5..000000000 --- a/app/src/main/res/drawable/shape_rectangle_white_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/user_gear.xml b/app/src/main/res/drawable/user_gear.xml deleted file mode 100644 index b9a2cf204..000000000 --- a/app/src/main/res/drawable/user_gear.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout-land/call_extra_actions.xml b/app/src/main/res/layout-land/call_extra_actions.xml index 68a4d5efd..74cb51310 100644 --- a/app/src/main/res/layout-land/call_extra_actions.xml +++ b/app/src/main/res/layout-land/call_extra_actions.xml @@ -137,6 +137,9 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/assistant_country_picker_fragment.xml b/app/src/main/res/layout/assistant_country_picker_fragment.xml deleted file mode 100644 index b8b770cdc..000000000 --- a/app/src/main/res/layout/assistant_country_picker_fragment.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/call_extra_actions.xml b/app/src/main/res/layout/call_extra_actions.xml index 0c7fbe510..8c8ed5c1d 100644 --- a/app/src/main/res/layout/call_extra_actions.xml +++ b/app/src/main/res/layout/call_extra_actions.xml @@ -137,6 +137,9 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/start_call_suggestion_list_decoration.xml b/app/src/main/res/layout/start_call_suggestion_list_decoration.xml index 22f623efd..22580d364 100644 --- a/app/src/main/res/layout/start_call_suggestion_list_decoration.xml +++ b/app/src/main/res/layout/start_call_suggestion_list_decoration.xml @@ -12,7 +12,8 @@ android:background="@color/white" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingStart="21dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" android:paddingTop="16dp" android:paddingBottom="16dp" android:text="@string/history_call_start_suggestions_list_title" diff --git a/app/src/main/res/values/dimen.xml b/app/src/main/res/values/dimen.xml index 6c7dcec5c..8823a0dd7 100644 --- a/app/src/main/res/values/dimen.xml +++ b/app/src/main/res/values/dimen.xml @@ -30,7 +30,6 @@ 55dp 70dp - 5dp 28dp 48dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a6a91b23e..9c9ef4de6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -60,6 +60,7 @@ Call Delete Close + Install Do not show this dialog anymore General terms & privacy policy blah blah blah @@ -85,8 +86,9 @@ Blah Delete %s? You can reconnect at any time by clicking “Add an account”. However, all data on this phone will be deleted. + Update available + A new version %s is available. Do you want to update? - QR code validated! Invalid QR code! SIP address copied into clipboard Number copied into clipboard @@ -97,8 +99,6 @@ Cellular signal is no longer low This call can be trusted - Choose your country - Country name Login Scan QR code Configuration successfully applied @@ -162,7 +162,6 @@ Check update Contribute on &appName; translation Advanced - A new version is available: %s Your version is up-to-date An error occurred while checking for update Troubleshooting @@ -252,7 +251,6 @@ Suggestions No call for the moment… - Contacts No contact for the moment… Favourites All contacts