diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index 0e2086884..ec0273b32 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -83,14 +83,6 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C showCallActivity() } } - Call.State.UpdatedByRemote -> { - // TODO FIXME: remove - val params = core.createCallParams(call) - params?.isVideoEnabled = true - core.isVideoCaptureEnabled = true - core.isVideoDisplayEnabled = true - call.acceptUpdate(params) - } else -> { } } diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt index 4de0da4f1..f15c302ef 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/LoginFragment.kt @@ -124,8 +124,6 @@ class LoginFragment : Fragment() { viewModel.accountLoginErrorEvent.observe(viewLifecycleOwner) { it.consume { message -> - Log.e("$TAG Failed to log in account [$message]") - // TODO FIXME: don't use message from callback (requireActivity() as AssistantActivity).showRedToast( message, R.drawable.warning_circle diff --git a/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt b/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt index 4541a6525..e66960ba8 100644 --- a/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt +++ b/app/src/main/java/org/linphone/ui/assistant/fragment/ThirdPartySipAccountLoginFragment.kt @@ -110,8 +110,6 @@ class ThirdPartySipAccountLoginFragment : Fragment() { viewModel.accountLoginErrorEvent.observe(viewLifecycleOwner) { it.consume { message -> - Log.e("$TAG Failed to log in account [$message]") - // TODO FIXME: don't use message from callback (requireActivity() as AssistantActivity).showRedToast( message, R.drawable.warning_circle diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountCreationViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountCreationViewModel.kt index befb070ad..ffe3d21f9 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountCreationViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountCreationViewModel.kt @@ -42,6 +42,7 @@ import org.linphone.core.CoreListenerStub import org.linphone.core.DialPlan import org.linphone.core.tools.Log import org.linphone.ui.assistant.fragment.CountryPickerFragment +import org.linphone.utils.AppUtils import org.linphone.utils.Event class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPickerFragment.CountryPickedListener { @@ -98,8 +99,11 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic AccountCreator.Status.AccountExist, AccountCreator.Status.AccountExistWithAlias -> { operationInProgress.postValue(false) createEnabled.postValue(false) - // TODO FIXME: use translated string - usernameError.postValue("Account already exists") + + val error = AppUtils.getString( + R.string.assistant_account_register_username_already_in_use_error + ) + usernameError.postValue(error) } AccountCreator.Status.AccountNotExist -> { operationInProgress.postValue(false) @@ -126,8 +130,11 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic AccountCreator.Status.AliasExist, AccountCreator.Status.AliasIsAccount -> { operationInProgress.postValue(false) createEnabled.postValue(false) - // TODO FIXME: use translated string - phoneNumberError.postValue("Phone number already used") + + val error = AppUtils.getString( + R.string.assistant_account_register_phone_number_already_in_use_error + ) + phoneNumberError.postValue(error) } AccountCreator.Status.AliasNotExist -> { operationInProgress.postValue(false) @@ -305,19 +312,20 @@ class AccountCreationViewModel @UiThread constructor() : ViewModel(), CountryPic "$TAG Failed to compute phone number using international prefix [$digitsPrefix] and number [$number]" ) operationInProgress.postValue(false) - // TODO FIXME: use translated string - phoneNumberError.postValue( - "Wrong international prefix / local phone number" + + val error = AppUtils.getString( + R.string.assistant_account_register_invalid_phone_number_error ) + phoneNumberError.postValue(error) } } else { Log.e( "$TAG Failed to set phone number [$number] and prefix [$digitsPrefix] into account creator!" ) - // TODO FIXME: use translated string - phoneNumberError.postValue( - "Failed to configure phone number and prefix in account creator!" + val error = AppUtils.getString( + R.string.assistant_account_register_invalid_phone_number_error ) + phoneNumberError.postValue(error) } } else { Log.e("$TAG Account creator hasn't been initialized!") diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt index 5ae50726e..6f6055921 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/AccountLoginViewModel.kt @@ -85,7 +85,7 @@ class AccountLoginViewModel @UiThread constructor() : ViewModel() { // TODO: show translated string accountLoginErrorEvent.postValue(Event(message)) - Log.e("$TAG Account failed to REGISTER, removing it") + Log.e("$TAG Account failed to REGISTER [$message], removing it") core.removeAuthInfo(newlyCreatedAuthInfo) core.removeAccount(newlyCreatedAccount) } diff --git a/app/src/main/java/org/linphone/ui/assistant/viewmodel/ThirdPartySipAccountLoginViewModel.kt b/app/src/main/java/org/linphone/ui/assistant/viewmodel/ThirdPartySipAccountLoginViewModel.kt index fe4a276c0..0134878a0 100644 --- a/app/src/main/java/org/linphone/ui/assistant/viewmodel/ThirdPartySipAccountLoginViewModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/viewmodel/ThirdPartySipAccountLoginViewModel.kt @@ -96,7 +96,7 @@ class ThirdPartySipAccountLoginViewModel @UiThread constructor() : ViewModel() { // TODO: show translated string accountLoginErrorEvent.postValue(Event(message)) - Log.e("$TAG Account failed to REGISTER, removing it") + Log.e("$TAG Account failed to REGISTER [$message], removing it") core.removeAuthInfo(newlyCreatedAuthInfo) core.removeAccount(newlyCreatedAccount) } diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt index cc124d9d7..0c644972d 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallLogViewModel.kt @@ -81,6 +81,6 @@ class CallLogViewModel @UiThread constructor() : ViewModel() { @UiThread fun sendMessage() { - // TODO + // TODO: chat feature } } diff --git a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt index cc7f4e5f1..db93f8adf 100644 --- a/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/calls/viewmodel/CallsListViewModel.kt @@ -109,7 +109,7 @@ class CallsListViewModel @UiThread constructor() : AbstractTopBarViewModel() { private fun computeCallLogsList(filter: String) { val list = arrayListOf() - // TODO : Add support for call logs in magic search + // TODO? : Add support for call logs in magic search val account = LinphoneUtils.getDefaultAccount() val logs = account?.callLogs ?: coreContext.core.callLogs for (callLog in logs) { 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 aa5f7afd2..5e81d751c 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 @@ -247,11 +247,16 @@ class ContactFragment : GenericFragment() { private fun inviteContactBySms(number: String) { Log.i("$TAG Sending SMS to [$number]") + + val smsBody = getString( + R.string.contact_sms_invite_content, + getString(R.string.website_download_page) + ) val smsIntent: Intent = Intent().apply { action = Intent.ACTION_SENDTO data = Uri.parse("smsto:$number") putExtra("address", number) - putExtra("sms_body", "Coucou <3") // TODO FIXME + putExtra("sms_body", smsBody) } startActivity(smsIntent) } 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 64599d518..1c380d583 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 @@ -130,9 +130,16 @@ class EditContactFragment : GenericFragment() { it.consume { refKey -> if (refKey.isNotEmpty()) { Log.i("$TAG Changes were applied, going back to details page") + (requireActivity() as MainActivity).showGreenToast( + getString(R.string.contact_editor_saved_changes_toast), + R.drawable.info + ) goBack() } else { - // TODO : show error + (requireActivity() as MainActivity).showRedToast( + getString(R.string.contact_editor_error_saving_changes_toast), + R.drawable.warning_circle + ) } } } 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 52c3f8cff..8e242b701 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 @@ -131,8 +131,15 @@ class NewContactFragment : GenericFragment() { backPressedCallback.isEnabled = false goBack() sharedViewModel.showContactEvent.value = Event(refKey) + (requireActivity() as MainActivity).showGreenToast( + getString(R.string.contact_editor_saved_contact_toast), + R.drawable.info + ) } else { - // TODO : show error + (requireActivity() as MainActivity).showRedToast( + getString(R.string.contact_editor_error_saving_contact_toast), + R.drawable.warning_circle + ) } } } diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt index 9be138901..309249de9 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactNewOrEditViewModel.kt @@ -97,7 +97,7 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { firstName.postValue(vCard.givenName) lastName.postValue(vCard.familyName) } else { - // TODO ? + // TODO ? What to do when vCard is null } picturePath.postValue(friend.photo) @@ -184,7 +184,7 @@ class ContactNewOrEditViewModel @UiThread constructor() : ViewModel() { ) } else { Log.e("$TAG Failed to generate a ref key using vCard's generateUniqueId()") - // TODO : generate unique ref key + // TODO? : generate unique ref key } friend.done() diff --git a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt index e506da868..5f0f298dc 100644 --- a/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/contacts/viewmodel/ContactViewModel.kt @@ -384,7 +384,7 @@ class ContactViewModel @UiThread constructor() : ViewModel() { Log.i( "$TAG Only 1 SIP address found for contact [${friend.name}], sending message directly" ) - // TODO + // TODO: send message feature } else if (addressesCount == 0 && numbersCount == 1 && enablePhoneNumbers) { val number = friend.phoneNumbers.first() val address = core.interpretUrl(number, true) @@ -392,7 +392,7 @@ class ContactViewModel @UiThread constructor() : ViewModel() { Log.i( "$TAG Only 1 phone number found for contact [${friend.name}], sending message directly" ) - // TODO + // TODO: send message feature } else { Log.e("$TAG Failed to interpret phone number [$number] as SIP address") } diff --git a/app/src/main/java/org/linphone/ui/main/fragment/BottomNavBarFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/BottomNavBarFragment.kt index feb0e9cf1..10ccfa9fa 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/BottomNavBarFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/BottomNavBarFragment.kt @@ -83,11 +83,11 @@ class BottomNavBarFragment : Fragment() { } binding.setOnConversationsClicked { - // TODO + // TODO: chat feature } binding.setOnMeetingsClicked { - // TODO + // TODO: meeting feature } sharedViewModel.currentlyDisplayedFragment.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt index ff98c7cfb..f2f6ba1df 100644 --- a/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/fragment/DrawerMenuFragment.kt @@ -77,7 +77,7 @@ class DrawerMenuFragment : GenericFragment() { } binding.setRecordingsClickListener { - // TODO FIXME + // TODO: recordings feature /*val navController = (requireActivity() as MainActivity).findNavController() navController.navigate(R.id.action_global_recordingsFragment) (requireActivity() as MainActivity).closeDrawerMenu()*/ diff --git a/app/src/main/java/org/linphone/ui/main/model/AccountModel.kt b/app/src/main/java/org/linphone/ui/main/model/AccountModel.kt index d11dd8e56..7630a0d62 100644 --- a/app/src/main/java/org/linphone/ui/main/model/AccountModel.kt +++ b/app/src/main/java/org/linphone/ui/main/model/AccountModel.kt @@ -183,6 +183,6 @@ class AccountModel @WorkerThread constructor( } fun Account.isInSecureMode(): Boolean { - // TODO FIXME + // TODO FIXME: use real API when available return params.identityAddress?.domain == "sip.linphone.org" } 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 add59a80e..ff8233b93 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 @@ -87,11 +87,14 @@ class AccountProfileFragment : GenericFragment() { } binding.setSettingsClickListener { - // TODO + // TODO: account settings feature } - binding.setDeleteClickListener { - // TODO + viewModel.accountRemovedEvent.observe(viewLifecycleOwner) { + it.consume { + Log.i("$TAG Account has been removed, leaving profile") + findNavController().popBackStack() + } } viewModel.accountFoundEvent.observe(viewLifecycleOwner) { diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt index 02549cc33..97e440d48 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/AccountProfileViewModel.kt @@ -32,6 +32,10 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { val expandDetails = MutableLiveData() + val accountRemovedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + private lateinit var account: Account init { @@ -59,7 +63,7 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { accountModel.postValue(AccountModel(account)) currentMode.postValue( AppUtils.getString(R.string.manage_account_secure_mode_default_title) - ) // TODO FIXME + ) // TODO: use real API when available registerEnabled.postValue(account.params.isRegisterEnabled) sipAddress.postValue(account.params.identityAddress?.asStringUriOnly()) @@ -73,6 +77,25 @@ class AccountProfileViewModel @UiThread constructor() : ViewModel() { } } + @UiThread + fun deleteAccount() { + coreContext.postOnCoreThread { core -> + if (::account.isInitialized) { + val authInfo = account.findAuthInfo() + if (authInfo != null) { + Log.i("$TAG Found auth info for account, removing it") + core.removeAuthInfo(authInfo) + } else { + Log.w("$TAG Failed to find matching auth info for account") + } + + core.removeAccount(account) + Log.i("$TAG Account has been removed") + accountRemovedEvent.postValue(Event(true)) + } + } + } + @UiThread fun setNewPicturePath(path: String) { coreContext.postOnCoreThread { diff --git a/app/src/main/java/org/linphone/ui/main/viewmodel/BottomNavBarViewModel.kt b/app/src/main/java/org/linphone/ui/main/viewmodel/BottomNavBarViewModel.kt index 577ba150c..89a610cc5 100644 --- a/app/src/main/java/org/linphone/ui/main/viewmodel/BottomNavBarViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/viewmodel/BottomNavBarViewModel.kt @@ -70,8 +70,8 @@ class BottomNavBarViewModel @UiThread constructor() : ViewModel() { updateMissedCallsCount() } - hideConversations.value = corePreferences.disableChat || true // TODO - hideMeetings.value = true // TODO + hideConversations.value = corePreferences.disableChat || true // TODO: chat feature + hideMeetings.value = true // TODO: meetings feature } @UiThread diff --git a/app/src/main/java/org/linphone/ui/voip/fragment/ActiveCallFragment.kt b/app/src/main/java/org/linphone/ui/voip/fragment/ActiveCallFragment.kt index 72639ac02..54f68c992 100644 --- a/app/src/main/java/org/linphone/ui/voip/fragment/ActiveCallFragment.kt +++ b/app/src/main/java/org/linphone/ui/voip/fragment/ActiveCallFragment.kt @@ -121,11 +121,6 @@ class ActiveCallFragment : GenericCallFragment() { getString(R.string.toast_call_can_be_trusted), R.drawable.trusted ) - // TODO: improve - binding.avatar.avatarBorderColor = resources.getColor( - R.color.blue_trusted, - requireContext().theme - ) binding.avatar.avatarBorderWidth = AppUtils.getDimension( R.dimen.avatar_trust_border_width ).toInt() diff --git a/app/src/main/java/org/linphone/ui/voip/model/ZrtpSasConfirmationDialogModel.kt b/app/src/main/java/org/linphone/ui/voip/model/ZrtpSasConfirmationDialogModel.kt index 94c4043ca..222629b7b 100644 --- a/app/src/main/java/org/linphone/ui/voip/model/ZrtpSasConfirmationDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/model/ZrtpSasConfirmationDialogModel.kt @@ -48,7 +48,7 @@ class ZrtpSasConfirmationDialogModel @UiThread constructor( init { message.value = "Dites $authTokenToRead et cliquez sur les lettres données par votre interlocuteur :" - // TODO: improve algo + // TODO: improve algo? val rnd = Random() val randomLetters1 = "${alphabet[rnd.nextInt(alphabet.length)]}${alphabet[ rnd.nextInt( diff --git a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt index 3ffcd4074..1435600e9 100644 --- a/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/voip/viewmodel/CallsViewModel.kt @@ -112,7 +112,6 @@ class CallsViewModel @UiThread constructor() : ViewModel() { @WorkerThread override fun onNewAlertTriggered(core: Core, alert: Alert) { val remote = alert.call.remoteAddress.asStringUriOnly() - // TODO: differentiate WiFi from Cellular Log.w("$TAG Alert of type [${alert.type}] triggered for call from [$remote]") alert.addListener(alertListener) diff --git a/app/src/main/res/layout/account_profile_fragment.xml b/app/src/main/res/layout/account_profile_fragment.xml index 6e2580a36..2c27ccd17 100644 --- a/app/src/main/res/layout/account_profile_fragment.xml +++ b/app/src/main/res/layout/account_profile_fragment.xml @@ -17,9 +17,6 @@ - @@ -384,7 +381,7 @@ app:layout_constraintTop_toBottomOf="@+id/action_settings"/> linphone-android@belledonne-communications.com https://linphone.org/contact + https://linphone.org/download https://linphone.org/privacy-policy https://linphone.org/general-terms https://subscribe.linphone.org @@ -106,6 +107,9 @@ Default Interoperable Continue + This account already exists + Phone number already used + Invalid phone number and/or prefix Default Manage the profile @@ -214,6 +218,10 @@ Last name Company Job title + Changes were successfully saved + Failed to save changes! + Contact was successfully created + Failed to create contact! Phone numbers & SIP addresses Company: @@ -226,6 +234,7 @@ Remove from favourites Share Delete + Hello, join me on &appName;! You can download it for free at %s Outgoing call Incoming call