Show privacy policy & conditions accept dialog if not accepted yet when creating an account or logging in a third party one

This commit is contained in:
Sylvain Berfini 2023-09-06 17:11:51 +02:00
parent 6f416ab33f
commit a7a22f39d2
8 changed files with 102 additions and 48 deletions

View file

@ -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

View file

@ -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()
}
}

View file

@ -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<Event<Boolean>>()
val conditionsAcceptedEvent = MutableLiveData<Event<Boolean>>()
@UiThread
fun dismiss() {
dismissEvent.value = Event(true)
}
fun denyConditions() {
// TODO
}
@UiThread
fun acceptConditions() {
// TODO
conditionsAcceptedEvent.value = Event(true)
}
}

View file

@ -56,6 +56,8 @@ class AccountLoginViewModel @UiThread constructor() : ViewModel() {
val accountLoginErrorEvent = MutableLiveData<Event<String>>()
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()
}

View file

@ -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()
}

View file

@ -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 {

View file

@ -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,

View file

@ -7,7 +7,7 @@
<import type="android.view.View" />
<variable
name="viewModel"
type="org.linphone.ui.assistant.model.ConfirmConditionsAndPolicyDialogModel" />
type="org.linphone.ui.assistant.model.AcceptConditionsAndPolicyDialogModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
@ -63,7 +63,7 @@
android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:layout_marginTop="10dp"
android:text="En continuant, vous acceptez ces conditions, notre politique de confidentialité et nos conditions d'utilisation."
android:text="En continuant, vous notre politique de confidentialité et nos conditions d'utilisation."
android:textSize="14sp"
app:layout_constraintBottom_toTopOf="@id/cancel"
app:layout_constraintStart_toStartOf="@id/dialog_background"
@ -71,7 +71,7 @@
app:layout_constraintTop_toBottomOf="@id/title" />
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> viewModel.denyConditions()}"
android:onClick="@{() -> viewModel.dismiss()}"
style="@style/default_text_style_600"
android:id="@+id/cancel"
android:layout_width="0dp"