diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index 75e320dc9..d0e600aee 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -20,7 +20,6 @@ package org.linphone.core import android.content.Context -import android.content.SharedPreferences import androidx.annotation.AnyThread import androidx.annotation.UiThread import androidx.annotation.WorkerThread @@ -42,25 +41,12 @@ class CorePreferences @UiThread constructor(private val context: Context) { _config = value } - @UiThread - fun chatRoomMuted(id: String): Boolean { - val sharedPreferences: SharedPreferences = coreContext.context.getSharedPreferences( - "notifications", - Context.MODE_PRIVATE - ) - return sharedPreferences.getBoolean(id, false) - } - - @UiThread - fun muteChatRoom(id: String, mute: Boolean) { - val sharedPreferences: SharedPreferences = coreContext.context.getSharedPreferences( - "notifications", - Context.MODE_PRIVATE - ) - val editor = sharedPreferences.edit() - editor.putBoolean(id, mute) - editor.apply() - } + @get:WorkerThread @set:WorkerThread + var conditionsAndPrivacyPolicyAccepted: Boolean + get() = config.getBool("app", "read_and_agree_terms_and_privacy", false) + set(value) { + config.setBool("app", "read_and_agree_terms_and_privacy", value) + } @get:WorkerThread @set:WorkerThread var publishPresence: Boolean 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 fda3677e2..e038db5ba 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 @@ -38,7 +38,9 @@ import org.linphone.R import org.linphone.core.tools.Log import org.linphone.databinding.AssistantLoginFragmentBinding import org.linphone.ui.assistant.AssistantActivity +import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel import org.linphone.ui.assistant.viewmodel.AccountLoginViewModel +import org.linphone.utils.DialogUtils import org.linphone.utils.PhoneNumberUtils @UiThread @@ -73,8 +75,11 @@ class LoginFragment : Fragment() { } binding.setRegisterClickListener { - val action = LoginFragmentDirections.actionLoginFragmentToRegisterFragment() - findNavController().navigate(action) + if (viewModel.conditionsAndPrivacyPolicyAccepted) { + goToRegisterFragment() + } else { + showAcceptConditionsAndPrivacyDialog(goToAccountCreate = true) + } } binding.setForgottenPasswordClickListener { @@ -93,8 +98,11 @@ class LoginFragment : Fragment() { } binding.setThirdPartySipAccountLoginClickListener { - val action = LoginFragmentDirections.actionLoginFragmentToThirdPartySipAccountWarningFragment() - findNavController().navigate(action) + if (viewModel.conditionsAndPrivacyPolicyAccepted) { + goToLoginThirdPartySipAccountFragment() + } else { + showAcceptConditionsAndPrivacyDialog(goToThirdPartySipAccountLogin = true) + } } viewModel.showPassword.observe(viewLifecycleOwner) { @@ -142,4 +150,50 @@ class LoginFragment : Fragment() { private fun goBack() { requireActivity().finish() } + + private fun goToRegisterFragment() { + val action = LoginFragmentDirections.actionLoginFragmentToRegisterFragment() + findNavController().navigate(action) + } + + private fun goToLoginThirdPartySipAccountFragment() { + val action = LoginFragmentDirections.actionLoginFragmentToThirdPartySipAccountWarningFragment() + findNavController().navigate(action) + } + + private fun showAcceptConditionsAndPrivacyDialog( + goToAccountCreate: Boolean = false, + goToThirdPartySipAccountLogin: Boolean = false + ) { + val model = AcceptConditionsAndPolicyDialogModel() + val dialog = DialogUtils.getAcceptConditionsAndPrivacyDialog( + requireActivity(), + model + ) + + model.dismissEvent.observe(viewLifecycleOwner) { + it.consume { + dialog.dismiss() + } + } + + model.conditionsAcceptedEvent.observe(viewLifecycleOwner) { + it.consume { + Log.i("$TAG Conditions & Privacy policy have been accepted") + coreContext.postOnCoreThread { + // TODO FIXME: uncomment + // corePreferences.conditionsAndPrivacyPolicyAccepted = true + } + dialog.dismiss() + + if (goToAccountCreate) { + goToRegisterFragment() + } else if (goToThirdPartySipAccountLogin) { + goToLoginThirdPartySipAccountFragment() + } + } + } + + dialog.show() + } } diff --git a/app/src/main/java/org/linphone/ui/assistant/model/ConfirmConditionsAndPolicyDialogModel.kt b/app/src/main/java/org/linphone/ui/assistant/model/AcceptConditionsAndPolicyDialogModel.kt similarity index 85% rename from app/src/main/java/org/linphone/ui/assistant/model/ConfirmConditionsAndPolicyDialogModel.kt rename to app/src/main/java/org/linphone/ui/assistant/model/AcceptConditionsAndPolicyDialogModel.kt index 89686c76a..93dadbc6d 100644 --- a/app/src/main/java/org/linphone/ui/assistant/model/ConfirmConditionsAndPolicyDialogModel.kt +++ b/app/src/main/java/org/linphone/ui/assistant/model/AcceptConditionsAndPolicyDialogModel.kt @@ -23,20 +23,18 @@ import androidx.annotation.UiThread import androidx.lifecycle.MutableLiveData import org.linphone.utils.Event -class ConfirmConditionsAndPolicyDialogModel @UiThread constructor() { +class AcceptConditionsAndPolicyDialogModel @UiThread constructor() { val dismissEvent = MutableLiveData>() + val conditionsAcceptedEvent = MutableLiveData>() + @UiThread fun dismiss() { dismissEvent.value = Event(true) } - fun denyConditions() { - // TODO - } - @UiThread fun acceptConditions() { - // TODO + conditionsAcceptedEvent.value = Event(true) } } 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 8bf9dcd13..bed1b2a4e 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 @@ -56,6 +56,8 @@ class AccountLoginViewModel @UiThread constructor() : ViewModel() { val accountLoginErrorEvent = MutableLiveData>() + var conditionsAndPrivacyPolicyAccepted = false + private lateinit var newlyCreatedAuthInfo: AuthInfo private lateinit var newlyCreatedAccount: Account @@ -94,6 +96,10 @@ class AccountLoginViewModel @UiThread constructor() : ViewModel() { showPassword.value = false registrationInProgress.value = false + coreContext.postOnCoreThread { + conditionsAndPrivacyPolicyAccepted = corePreferences.conditionsAndPrivacyPolicyAccepted + } + loginEnabled.addSource(username) { loginEnabled.value = isLoginButtonEnabled() } diff --git a/app/src/main/java/org/linphone/ui/main/conversations/ConversationMenuDialogFragment.kt b/app/src/main/java/org/linphone/ui/main/conversations/ConversationMenuDialogFragment.kt index 99748e03c..c970b907f 100644 --- a/app/src/main/java/org/linphone/ui/main/conversations/ConversationMenuDialogFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/conversations/ConversationMenuDialogFragment.kt @@ -26,10 +26,8 @@ import android.view.View import android.view.ViewGroup import com.google.android.material.bottomsheet.BottomSheetDialogFragment import org.linphone.LinphoneApplication.Companion.coreContext -import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.core.ChatRoom import org.linphone.databinding.ChatRoomMenuBinding -import org.linphone.utils.LinphoneUtils class ConversationMenuDialogFragment( private val chatRoom: ChatRoom, @@ -57,27 +55,26 @@ class ConversationMenuDialogFragment( // TODO FIXME: use a viewmodel and use core thread val view = ChatRoomMenuBinding.inflate(layoutInflater) - val id = LinphoneUtils.getChatRoomId(chatRoom) - view.isMuted = corePreferences.chatRoomMuted(id) + view.isMuted = chatRoom.muted view.isRead = chatRoom.unreadMessagesCount == 0 view.setMarkAsReadClickListener { - coreContext.postOnCoreThread { core -> + coreContext.postOnCoreThread { chatRoom.markAsRead() } dismiss() } view.setMuteClickListener { - coreContext.postOnCoreThread { core -> - corePreferences.muteChatRoom(id, true) + coreContext.postOnCoreThread { + chatRoom.muted = true } dismiss() } view.setUnMuteClickListener { - coreContext.postOnCoreThread { core -> - corePreferences.muteChatRoom(id, false) + coreContext.postOnCoreThread { + chatRoom.muted = false } dismiss() } diff --git a/app/src/main/java/org/linphone/ui/main/conversations/data/ChatRoomData.kt b/app/src/main/java/org/linphone/ui/main/conversations/data/ChatRoomData.kt index 40782d3b4..42c999a30 100644 --- a/app/src/main/java/org/linphone/ui/main/conversations/data/ChatRoomData.kt +++ b/app/src/main/java/org/linphone/ui/main/conversations/data/ChatRoomData.kt @@ -22,7 +22,6 @@ package org.linphone.ui.main.conversations.data import androidx.lifecycle.MutableLiveData import java.lang.StringBuilder import org.linphone.LinphoneApplication.Companion.coreContext -import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.R import org.linphone.contacts.ContactData import org.linphone.core.* @@ -121,7 +120,7 @@ class ChatRoomData(val chatRoom: ChatRoom) { isSecure.postValue(chatRoom.securityLevel == ChatRoom.SecurityLevel.Encrypted) isSecureVerified.postValue(chatRoom.securityLevel == ChatRoom.SecurityLevel.Safe) isEphemeral.postValue(chatRoom.isEphemeralEnabled) - isMuted.postValue(areNotificationsMuted()) + isMuted.postValue(chatRoom.muted) } fun onCleared() { @@ -240,10 +239,6 @@ class ChatRoomData(val chatRoom: ChatRoom) { lastMessage.postValue(text) } } - - private fun areNotificationsMuted(): Boolean { - return corePreferences.chatRoomMuted(id) - } } abstract class ChatRoomDataListener { diff --git a/app/src/main/java/org/linphone/utils/DialogUtils.kt b/app/src/main/java/org/linphone/utils/DialogUtils.kt index 30e14f697..200ae97c4 100644 --- a/app/src/main/java/org/linphone/utils/DialogUtils.kt +++ b/app/src/main/java/org/linphone/utils/DialogUtils.kt @@ -31,6 +31,7 @@ import androidx.core.content.ContextCompat import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import org.linphone.R +import org.linphone.databinding.DialogAssistantAcceptConditionsAndPolicyBinding import org.linphone.databinding.DialogAssistantCreateAccountConfirmPhoneNumberBinding import org.linphone.databinding.DialogCancelContactChangesBinding import org.linphone.databinding.DialogConfirmZrtpSasBinding @@ -38,6 +39,7 @@ import org.linphone.databinding.DialogContactConfirmTrustCallBinding import org.linphone.databinding.DialogContactTrustProcessBinding import org.linphone.databinding.DialogPickNumberOrAddressBinding import org.linphone.databinding.DialogRemoveAllCallLogsBinding +import org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel import org.linphone.ui.assistant.model.ConfirmPhoneNumberDialogModel import org.linphone.ui.main.calls.model.ConfirmationDialogModel import org.linphone.ui.main.contacts.model.NumberOrAddressPickerDialogModel @@ -46,6 +48,22 @@ import org.linphone.ui.voip.model.ZrtpSasConfirmationDialogModel class DialogUtils { companion object { + @UiThread + fun getAcceptConditionsAndPrivacyDialog( + context: Context, + viewModel: AcceptConditionsAndPolicyDialogModel + ): Dialog { + val binding: DialogAssistantAcceptConditionsAndPolicyBinding = DataBindingUtil.inflate( + LayoutInflater.from(context), + R.layout.dialog_assistant_accept_conditions_and_policy, + null, + false + ) + binding.viewModel = viewModel + + return getDialog(context, binding) + } + @UiThread fun getAccountCreationPhoneNumberConfirmationDialog( context: Context, diff --git a/app/src/main/res/layout/dialog_assistant_accept_conditions_and_policy.xml b/app/src/main/res/layout/dialog_assistant_accept_conditions_and_policy.xml index 82fb8ee15..f453f07f8 100644 --- a/app/src/main/res/layout/dialog_assistant_accept_conditions_and_policy.xml +++ b/app/src/main/res/layout/dialog_assistant_accept_conditions_and_policy.xml @@ -7,7 +7,7 @@ + type="org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel" />