Updated layout for default/interop mode selection + added logs to contacts manager

This commit is contained in:
Sylvain Berfini 2023-11-21 14:21:19 +01:00
parent bd9947a705
commit 0d31bfe3c3
10 changed files with 199 additions and 28 deletions

View file

@ -66,7 +66,7 @@ class ContactsManager @UiThread constructor() {
@WorkerThread
override fun onPresenceReceived(list: FriendList, friends: Array<Friend>) {
Log.i(
"$TAG Presence received for list [${list.displayName}] and [${friends.size}] friends"
"$TAG Presence received for list [${list.displayName}] and [${friends.size}] friends, cleaning avatars map"
)
avatarsMap.values.forEach(ContactAvatarModel::destroy)
@ -127,6 +127,7 @@ class ContactsManager @UiThread constructor() {
@WorkerThread
fun onNativeContactsLoaded() {
nativeContactsLoaded = true
Log.i("$TAG Native contacts have been loaded, cleaning avatars map")
avatarsMap.values.forEach(ContactAvatarModel::destroy)
avatarsMap.clear()
@ -143,10 +144,15 @@ class ContactsManager @UiThread constructor() {
@WorkerThread
fun findContactById(id: String): Friend? {
Log.i("$TAG Looking for a friend with ref key [$id]")
for (friendList in coreContext.core.friendsLists) {
val found = friendList.findFriendByRefKey(id)
if (found != null) return found
if (found != null) {
Log.i("$TAG Found friend [${found.name}] matching ref key [$id]")
return found
}
}
Log.i("$TAG No friend matching ref key [$id] has been found")
return null
}
@ -156,7 +162,7 @@ class ContactsManager @UiThread constructor() {
clonedAddress.clean()
val sipUri = clonedAddress.asStringUriOnly()
Log.d("$TAG Looking for friend with SIP URI [$sipUri]")
Log.i("$TAG Looking for friend with SIP URI [$sipUri]")
val username = clonedAddress.username
val found = coreContext.core.findFriend(clonedAddress)
return if (found != null) {
@ -194,6 +200,7 @@ class ContactsManager @UiThread constructor() {
@WorkerThread
fun getContactAvatarModelForAddress(address: Address?): ContactAvatarModel {
if (address == null) {
Log.w("$TAG Address is null, generic model will be used")
val fakeFriend = coreContext.core.createFriend()
return ContactAvatarModel(fakeFriend)
}
@ -203,22 +210,29 @@ class ContactsManager @UiThread constructor() {
val key = clone.asStringUriOnly()
val foundInMap = if (avatarsMap.keys.contains(key)) avatarsMap[key] else null
if (foundInMap != null) return foundInMap
if (foundInMap != null) {
Log.i("$TAG Avatar model found in map for SIP URI [$key]")
return foundInMap
}
val localAccount = coreContext.core.accountList.find {
it.params.identityAddress?.weakEqual(clone) == true
}
val avatar = if (localAccount != null) {
Log.i("$TAG [$key] SIP URI matches one of the local account")
val fakeFriend = coreContext.core.createFriend()
fakeFriend.address = clone
fakeFriend.name = LinphoneUtils.getDisplayName(localAccount.params.identityAddress)
fakeFriend.photo = localAccount.params.pictureUri
ContactAvatarModel(fakeFriend)
} else {
Log.i("$TAG Looking for friend matching SIP URI [$key]")
val friend = coreContext.contactsManager.findContactByAddress(clone)
if (friend != null) {
Log.i("$TAG Matching friend [${friend.name}] found for SIP URI [$key]")
ContactAvatarModel(friend)
} else {
Log.i("$TAG No matching friend found for SIP URI [$key]...")
val fakeFriend = coreContext.core.createFriend()
fakeFriend.name = LinphoneUtils.getDisplayName(address)
fakeFriend.address = clone
@ -234,20 +248,28 @@ class ContactsManager @UiThread constructor() {
@WorkerThread
fun getContactAvatarModelForFriend(friend: Friend?): ContactAvatarModel {
if (friend == null) {
Log.w("$TAG Friend is null, using generic avatar model")
val fakeFriend = coreContext.core.createFriend()
return ContactAvatarModel(fakeFriend)
}
val address = friend.address ?: friend.addresses.firstOrNull()
?: return ContactAvatarModel(friend)
Log.i(
"$TAG Looking for avatar model for friend [${friend.name}] using SIP URI [${address.asStringUriOnly()}]"
)
val clone = address.clone()
clone.clean()
val key = clone.asStringUriOnly()
val foundInMap = if (avatarsMap.keys.contains(key)) avatarsMap[key] else null
if (foundInMap != null) return foundInMap
if (foundInMap != null) {
Log.i("$TAG Found avatar model in map using SIP URI [$key]")
return foundInMap
}
Log.w("$TAG Avatar model not found in map with SIP URI [$key]")
val avatar = ContactAvatarModel(friend)
avatarsMap[key] = avatar
@ -291,7 +313,7 @@ class ContactsManager @UiThread constructor() {
@WorkerThread
fun findNativeContact(address: String, searchAsPhoneNumber: Boolean, number: String = ""): Friend? {
if (nativeContactsLoaded) {
Log.d(
Log.i(
"$TAG Native contacts already loaded, no need to search further, no native contact matches address [$address]"
)
return null
@ -303,7 +325,7 @@ class ContactsManager @UiThread constructor() {
Manifest.permission.READ_CONTACTS
) == PackageManager.PERMISSION_GRANTED
) {
Log.d(
Log.i(
"$TAG Looking for native contact with address [$address] ${if (searchAsPhoneNumber) "or phone number [$number]" else ""}"
)
@ -376,7 +398,7 @@ class ContactsManager @UiThread constructor() {
friend.done()
Log.d("$TAG Found native contact [${friend.name}] with address [$address]")
Log.i("$TAG Found native contact [${friend.name}] with address [$address]")
cursor.close()
return friend
}

View file

@ -26,7 +26,10 @@ import android.view.ViewGroup
import androidx.annotation.UiThread
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import androidx.navigation.navGraphViewModels
import org.linphone.R
import org.linphone.databinding.AssistantSecureModeFragmentBinding
import org.linphone.ui.assistant.viewmodel.AccountLoginViewModel
import org.linphone.utils.DialogUtils
@UiThread
@ -37,6 +40,10 @@ class ProfileModeFragment : Fragment() {
private lateinit var binding: AssistantSecureModeFragmentBinding
private val viewModel: AccountLoginViewModel by navGraphViewModels(
R.id.assistant_nav_graph
)
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,

View file

@ -57,6 +57,8 @@ class AccountLoginViewModel @UiThread constructor() : ViewModel() {
val registrationInProgress = MutableLiveData<Boolean>()
val isCurrentlySelectedModeSecure = MutableLiveData<Boolean>()
val accountLoggedInEvent: MutableLiveData<Event<Boolean>> by lazy {
MutableLiveData<Event<Boolean>>()
}
@ -129,6 +131,8 @@ class AccountLoginViewModel @UiThread constructor() : ViewModel() {
loginEnabled.addSource(password) {
loginEnabled.value = isLoginButtonEnabled()
}
isCurrentlySelectedModeSecure.value = true
}
@UiThread
@ -179,6 +183,16 @@ class AccountLoginViewModel @UiThread constructor() : ViewModel() {
showPassword.value = showPassword.value == false
}
@UiThread
fun switchToSecureMode() {
isCurrentlySelectedModeSecure.value = true
}
@UiThread
fun switchToInteropMode() {
isCurrentlySelectedModeSecure.value = false
}
@UiThread
private fun isLoginButtonEnabled(): Boolean {
return username.value.orEmpty().isNotEmpty() && password.value.orEmpty().isNotEmpty()

View file

@ -0,0 +1,41 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="71dp"
android:height="62dp"
android:viewportWidth="71"
android:viewportHeight="62">
<path
android:pathData="M41.868,11.55V34.649C41.868,35.415 41.563,36.149 41.022,36.69C40.48,37.232 39.746,37.536 38.98,37.536H12.401L9.099,42.609C9.092,42.617 9.084,42.623 9.075,42.629C8.557,43.069 7.899,43.311 7.219,43.311C6.795,43.31 6.377,43.217 5.993,43.037C5.494,42.807 5.072,42.438 4.778,41.975C4.483,41.511 4.328,40.973 4.331,40.424V11.55C4.331,10.784 4.635,10.049 5.177,9.508C5.718,8.966 6.453,8.662 7.219,8.662H38.98C39.746,8.662 40.48,8.966 41.022,9.508C41.563,10.049 41.868,10.784 41.868,11.55Z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="66.137"
android:startY="-10.699"
android:endX="-17.264"
android:endY="60.058"
android:type="linear">
<item android:offset="0" android:color="#FFFF9730"/>
<item android:offset="1" android:color="#B2FFB266"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M28.813,23.889H17.872C17.581,23.889 17.303,24.005 17.098,24.21C16.893,24.415 16.777,24.693 16.777,24.983V28.266C16.777,28.556 16.893,28.834 17.098,29.04C17.303,29.245 17.581,29.36 17.872,29.36H28.813C29.104,29.36 29.382,29.245 29.587,29.04C29.792,28.834 29.907,28.556 29.907,28.266V24.983C29.907,24.693 29.792,24.415 29.587,24.21C29.382,24.005 29.104,23.889 28.813,23.889ZM28.813,28.266H17.872V24.983H28.813V28.266ZM28.813,17.324H17.872C17.581,17.324 17.303,17.44 17.098,17.645C16.893,17.85 16.777,18.128 16.777,18.418V21.701C16.777,21.991 16.893,22.269 17.098,22.475C17.303,22.68 17.581,22.795 17.872,22.795H28.813C29.104,22.795 29.382,22.68 29.587,22.475C29.792,22.269 29.907,21.991 29.907,21.701V18.418C29.907,18.128 29.792,17.85 29.587,17.645C29.382,17.44 29.104,17.324 28.813,17.324ZM28.813,21.701H17.872V18.418H28.813V21.701ZM27.719,20.06C27.719,20.222 27.671,20.381 27.581,20.516C27.491,20.65 27.362,20.756 27.212,20.818C27.063,20.88 26.898,20.896 26.738,20.865C26.579,20.833 26.433,20.755 26.318,20.64C26.203,20.525 26.125,20.379 26.094,20.22C26.062,20.061 26.078,19.896 26.14,19.746C26.202,19.596 26.308,19.468 26.443,19.377C26.577,19.287 26.736,19.239 26.899,19.239C27.116,19.239 27.325,19.326 27.479,19.479C27.633,19.633 27.719,19.842 27.719,20.06ZM27.719,26.625C27.719,26.787 27.671,26.946 27.581,27.081C27.491,27.216 27.362,27.321 27.212,27.383C27.063,27.445 26.898,27.461 26.738,27.43C26.579,27.398 26.433,27.32 26.318,27.205C26.203,27.09 26.125,26.944 26.094,26.785C26.062,26.626 26.078,26.461 26.14,26.311C26.202,26.161 26.308,26.033 26.443,25.942C26.577,25.852 26.736,25.804 26.899,25.804C27.116,25.804 27.325,25.891 27.479,26.045C27.633,26.198 27.719,26.407 27.719,26.625Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M33.462,29.607V52.487C33.462,53.245 33.767,53.973 34.308,54.509C34.85,55.045 35.584,55.347 36.35,55.347H62.93L66.232,60.371C66.239,60.379 66.247,60.385 66.255,60.391C66.774,60.827 67.432,61.067 68.112,61.067C68.536,61.066 68.954,60.973 69.338,60.795C69.837,60.567 70.259,60.202 70.553,59.743C70.848,59.284 71.003,58.751 71,58.207V29.607C71,28.848 70.696,28.121 70.154,27.584C69.613,27.048 68.878,26.747 68.112,26.747H36.35C35.584,26.747 34.85,27.048 34.308,27.584C33.767,28.121 33.462,28.848 33.462,29.607Z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="9.192"
android:startY="7.569"
android:endX="91.927"
android:endY="78.436"
android:type="linear">
<item android:offset="0" android:color="#FFFF9730"/>
<item android:offset="1" android:color="#B2FFB266"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M45.956,42.43H58.113C58.436,42.43 58.745,42.558 58.973,42.786C59.201,43.014 59.329,43.323 59.329,43.646V47.293C59.329,47.615 59.201,47.924 58.973,48.153C58.745,48.381 58.436,48.508 58.113,48.508H45.956C45.633,48.508 45.324,48.381 45.096,48.153C44.868,47.924 44.74,47.615 44.74,47.293V43.646C44.74,43.323 44.868,43.014 45.096,42.786C45.324,42.558 45.633,42.43 45.956,42.43ZM45.956,47.293H58.113V43.646H45.956V47.293ZM45.956,35.135H58.113C58.436,35.135 58.745,35.263 58.973,35.491C59.201,35.719 59.329,36.029 59.329,36.351V39.998C59.329,40.321 59.201,40.63 58.973,40.858C58.745,41.086 58.436,41.214 58.113,41.214H45.956C45.633,41.214 45.324,41.086 45.096,40.858C44.868,40.63 44.74,40.321 44.74,39.998V36.351C44.74,36.029 44.868,35.719 45.096,35.491C45.324,35.263 45.633,35.135 45.956,35.135ZM45.956,39.998H58.113V36.351H45.956V39.998ZM47.171,38.175C47.171,38.355 47.225,38.531 47.325,38.681C47.425,38.831 47.568,38.948 47.734,39.017C47.901,39.086 48.084,39.104 48.261,39.069C48.438,39.034 48.6,38.947 48.728,38.819C48.855,38.692 48.942,38.529 48.978,38.353C49.013,38.176 48.995,37.992 48.926,37.826C48.857,37.659 48.74,37.517 48.59,37.417C48.44,37.316 48.264,37.263 48.083,37.263C47.841,37.263 47.61,37.359 47.438,37.53C47.268,37.701 47.171,37.933 47.171,38.175ZM47.171,45.469C47.171,45.65 47.225,45.826 47.325,45.976C47.425,46.126 47.568,46.243 47.734,46.312C47.901,46.381 48.084,46.399 48.261,46.363C48.438,46.328 48.6,46.241 48.728,46.114C48.855,45.986 48.942,45.824 48.978,45.647C49.013,45.47 48.995,45.287 48.926,45.12C48.857,44.954 48.74,44.811 48.59,44.711C48.44,44.611 48.264,44.557 48.083,44.557C47.841,44.557 47.61,44.653 47.438,44.824C47.268,44.995 47.171,45.227 47.171,45.469Z"
android:fillColor="#ffffff"/>
</vector>

View file

@ -0,0 +1,35 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="71dp"
android:height="71dp"
android:viewportWidth="71"
android:viewportHeight="71">
<group>
<clip-path
android:pathData="M0,0h71v71h-71z"/>
<path
android:pathData="M64.344,17.75V53.25C64.344,54.427 63.876,55.556 63.044,56.388C62.212,57.22 61.083,57.688 59.906,57.688H19.058L13.984,65.484C13.973,65.495 13.961,65.506 13.948,65.514C13.151,66.191 12.139,66.563 11.094,66.563C10.443,66.561 9.8,66.418 9.211,66.141C8.444,65.788 7.795,65.221 7.342,64.509C6.889,63.797 6.651,62.969 6.656,62.125V17.75C6.656,16.573 7.124,15.444 7.956,14.612C8.788,13.78 9.917,13.313 11.094,13.313H59.906C61.083,13.313 62.212,13.78 63.044,14.612C63.876,15.444 64.344,16.573 64.344,17.75Z">
<aapt:attr name="android:fillColor">
<gradient
android:startX="64.274"
android:startY="5.605"
android:endX="-13.453"
android:endY="92.3"
android:type="linear">
<item android:offset="0" android:color="#FF4AA8FF"/>
<item android:offset="1" android:color="#5E4AA8FF"/>
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M44.842,27.653H26.345C25.899,27.653 25.471,27.83 25.156,28.145C24.84,28.461 24.663,28.888 24.663,29.334V42.787C24.663,43.233 24.84,43.661 25.156,43.976C25.471,44.292 25.899,44.469 26.345,44.469H44.842C45.288,44.469 45.716,44.292 46.031,43.976C46.347,43.661 46.524,43.233 46.524,42.787V29.334C46.524,28.888 46.347,28.461 46.031,28.145C45.716,27.83 45.288,27.653 44.842,27.653ZM28.867,40.265C28.867,40.488 28.779,40.701 28.621,40.859C28.463,41.017 28.249,41.105 28.026,41.105C27.803,41.105 27.59,41.017 27.432,40.859C27.274,40.701 27.186,40.488 27.186,40.265V31.857C27.186,31.634 27.274,31.42 27.432,31.262C27.59,31.105 27.803,31.016 28.026,31.016C28.249,31.016 28.463,31.105 28.621,31.262C28.779,31.42 28.867,31.634 28.867,31.857V40.265ZM36.571,36.081L35.272,36.501L36.075,37.605C36.14,37.694 36.186,37.796 36.212,37.904C36.238,38.011 36.242,38.123 36.224,38.232C36.207,38.342 36.168,38.447 36.11,38.541C36.052,38.635 35.976,38.717 35.886,38.782C35.797,38.847 35.695,38.894 35.587,38.919C35.479,38.945 35.368,38.949 35.258,38.932C35.149,38.914 35.044,38.875 34.95,38.817C34.855,38.759 34.773,38.683 34.708,38.594L33.912,37.491L33.11,38.596C32.979,38.777 32.781,38.899 32.56,38.934C32.339,38.969 32.113,38.916 31.932,38.784C31.751,38.653 31.629,38.456 31.594,38.235C31.559,38.014 31.613,37.788 31.744,37.607L32.547,36.503L31.248,36.083C31.143,36.048 31.045,35.993 30.962,35.921C30.878,35.849 30.809,35.762 30.759,35.663C30.659,35.464 30.641,35.233 30.711,35.021C30.746,34.916 30.801,34.819 30.872,34.735C30.944,34.651 31.032,34.582 31.131,34.533C31.33,34.432 31.561,34.415 31.773,34.484L33.071,34.905V33.538C33.071,33.315 33.16,33.102 33.317,32.944C33.475,32.786 33.689,32.698 33.912,32.698C34.135,32.698 34.349,32.786 34.506,32.944C34.664,33.102 34.753,33.315 34.753,33.538V34.905L36.051,34.484C36.156,34.45 36.266,34.436 36.376,34.444C36.487,34.453 36.594,34.483 36.693,34.533C36.791,34.582 36.879,34.651 36.951,34.735C37.023,34.819 37.078,34.916 37.113,35.021C37.147,35.126 37.161,35.236 37.152,35.347C37.144,35.457 37.114,35.564 37.064,35.663C37.014,35.762 36.946,35.849 36.862,35.921C36.778,35.993 36.681,36.048 36.576,36.083L36.571,36.081ZM44.138,36.081L42.839,36.501L43.642,37.605C43.707,37.694 43.754,37.796 43.779,37.904C43.805,38.011 43.809,38.123 43.792,38.232C43.774,38.342 43.735,38.447 43.677,38.541C43.619,38.635 43.543,38.717 43.453,38.782C43.364,38.847 43.262,38.894 43.154,38.919C43.047,38.945 42.935,38.949 42.825,38.932C42.716,38.914 42.611,38.875 42.517,38.817C42.423,38.759 42.341,38.683 42.276,38.594L41.479,37.491L40.677,38.596C40.546,38.777 40.348,38.899 40.127,38.934C39.907,38.969 39.681,38.916 39.5,38.784C39.318,38.653 39.197,38.456 39.161,38.235C39.126,38.014 39.18,37.788 39.311,37.607L40.114,36.503L38.815,36.083C38.71,36.048 38.613,35.993 38.529,35.921C38.445,35.849 38.376,35.762 38.326,35.663C38.226,35.464 38.208,35.233 38.278,35.021C38.313,34.916 38.368,34.819 38.44,34.735C38.512,34.651 38.599,34.582 38.698,34.533C38.897,34.432 39.128,34.415 39.34,34.484L40.638,34.905V33.538C40.638,33.315 40.727,33.102 40.884,32.944C41.042,32.786 41.256,32.698 41.479,32.698C41.702,32.698 41.916,32.786 42.074,32.944C42.231,33.102 42.32,33.315 42.32,33.538V34.905L43.618,34.484C43.723,34.45 43.833,34.436 43.944,34.444C44.054,34.453 44.161,34.483 44.26,34.533C44.359,34.582 44.446,34.651 44.518,34.735C44.59,34.819 44.645,34.916 44.68,35.021C44.714,35.126 44.728,35.236 44.72,35.347C44.711,35.457 44.681,35.564 44.632,35.663C44.582,35.762 44.513,35.849 44.429,35.921C44.345,35.993 44.248,36.048 44.143,36.083L44.138,36.081Z"
android:fillColor="#ffffff"/>
<group>
<clip-path
android:pathData="M46.337,44.095h26.905v26.905h-26.905z"/>
<path
android:pathData="M68.197,52.503H64.834V49.98C64.834,48.642 64.303,47.359 63.357,46.413C62.41,45.467 61.127,44.936 59.789,44.936C58.451,44.936 57.168,45.467 56.222,46.413C55.276,47.359 54.745,48.642 54.745,49.98V52.503H51.382C50.936,52.503 50.508,52.68 50.193,52.995C49.877,53.311 49.7,53.738 49.7,54.184V65.955C49.7,66.401 49.877,66.829 50.193,67.144C50.508,67.46 50.936,67.637 51.382,67.637H68.197C68.643,67.637 69.071,67.46 69.386,67.144C69.702,66.829 69.879,66.401 69.879,65.955V54.184C69.879,53.738 69.702,53.311 69.386,52.995C69.071,52.68 68.643,52.503 68.197,52.503ZM60.63,60.767V63.433C60.63,63.656 60.542,63.87 60.384,64.027C60.226,64.185 60.012,64.274 59.789,64.274C59.566,64.274 59.353,64.185 59.195,64.027C59.037,63.87 58.949,63.656 58.949,63.433V60.767C58.388,60.568 57.915,60.178 57.614,59.665C57.313,59.152 57.203,58.548 57.303,57.962C57.404,57.375 57.709,56.843 58.164,56.46C58.618,56.076 59.194,55.866 59.789,55.866C60.384,55.866 60.96,56.076 61.415,56.46C61.87,56.843 62.175,57.375 62.276,57.962C62.376,58.548 62.266,59.152 61.965,59.665C61.664,60.178 61.191,60.568 60.63,60.767ZM63.153,52.503H56.426V49.98C56.426,49.088 56.781,48.233 57.411,47.602C58.042,46.972 58.897,46.617 59.789,46.617C60.681,46.617 61.537,46.972 62.167,47.602C62.798,48.233 63.153,49.088 63.153,49.98V52.503Z"
android:fillColor="#02528D"/>
</group>
</group>
</vector>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="15dp" />
<solid android:color="@color/white"/>
<stroke android:color="@color/blue_info_500" android:width="2dp"/>
</shape>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<corners android:radius="15dp" />
<solid android:color="@color/white"/>
<stroke android:color="@color/orange_main_500" android:width="2dp"/>
</shape>

View file

@ -67,20 +67,30 @@
android:layout_height="wrap_content"
android:layout_marginTop="16dp">
<View
android:id="@+id/default_mode_background"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@{viewModel.isCurrentlySelectedModeSecure ? @drawable/shape_squircle_white_background_blue_border : @drawable/shape_squircle_white_background, default=@drawable/shape_squircle_white_background_blue_border}"
app:layout_constraintTop_toTopOf="@id/default_mode"
app:layout_constraintStart_toStartOf="@id/default_mode_summary"
app:layout_constraintEnd_toEndOf="@id/default_mode_summary"
app:layout_constraintBottom_toBottomOf="@id/default_mode_summary" />
<com.google.android.material.radiobutton.MaterialRadioButton
style="@style/default_text_style_800"
android:id="@+id/default_mode"
android:onClick="@{() -> viewModel.switchToSecureMode()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginStart="20dp"
android:text="@string/assistant_secure_mode_default_title"
android:textSize="16sp"
android:textColor="@color/black"
android:checked="@{viewModel.isCurrentlySelectedModeSecure}"
android:enabled="@{!viewModel.isCurrentlySelectedModeSecure}"
app:useMaterialThemeColors="false"
app:buttonTint="@color/orange_main_500"
app:buttonTint="@color/blue_info_500"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
@ -99,19 +109,20 @@
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/default_mode_summary"
android:onClick="@{() -> viewModel.switchToSecureMode()}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="10dp"
android:background="@drawable/shape_squircle_white_background"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:paddingBottom="10dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:text="@string/manage_account_secure_mode_default_summary"
android:textSize="14sp"
android:gravity="center"
android:gravity="start"
android:drawableEnd="@drawable/profile_secure_logo"
android:drawablePadding="10dp"
app:layout_constraintTop_toBottomOf="@id/default_mode"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
@ -122,7 +133,8 @@
android:layout_width="@dimen/avatar_list_cell_size"
android:layout_height="@dimen/avatar_list_cell_size"
android:layout_marginEnd="16dp"
android:layout_marginTop="20dp"
android:layout_marginTop="10dp"
android:visibility="gone"
coilAvatarNoTrust="@{viewModel.accountModel}"
app:strokeWidth="0dp"
app:strokeColor="@color/transparent_color"
@ -139,6 +151,7 @@
android:background="@drawable/led_background"
android:padding="@dimen/avatar_presence_badge_padding"
android:src="@drawable/led_online"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="@id/image1"
app:layout_constraintBottom_toBottomOf="@id/image1"/>
@ -149,6 +162,7 @@
android:layout_marginEnd="16dp"
android:src="@drawable/arrow_right_fill"
app:tint="@color/black"
android:visibility="gone"
app:layout_constraintStart_toEndOf="@id/image1"
app:layout_constraintEnd_toStartOf="@id/image2"
app:layout_constraintTop_toTopOf="@id/image1"
@ -159,6 +173,7 @@
android:id="@+id/image2"
android:layout_width="@dimen/avatar_list_cell_size"
android:layout_height="@dimen/avatar_list_cell_size"
android:visibility="gone"
coilAvatarNoTrust="@{viewModel.accountModel}"
app:strokeWidth="@dimen/avatar_trust_border_width"
app:strokeColor="@color/blue_info_500"
@ -172,6 +187,7 @@
android:layout_width="@dimen/avatar_presence_badge_size"
android:layout_height="@dimen/avatar_presence_badge_size"
android:src="@drawable/trusted"
android:visibility="gone"
app:layout_constraintStart_toStartOf="@id/image2"
app:layout_constraintBottom_toBottomOf="@id/image2"/>
@ -183,9 +199,20 @@
android:background="@drawable/led_background"
android:padding="@dimen/avatar_presence_badge_padding"
android:src="@drawable/led_online"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="@id/image2"
app:layout_constraintBottom_toBottomOf="@id/image2"/>
<View
android:id="@+id/interop_mode_background"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@{!viewModel.isCurrentlySelectedModeSecure ? @drawable/shape_squircle_white_background_orange_border : @drawable/shape_squircle_white_background, default=@drawable/shape_squircle_white_background}"
app:layout_constraintTop_toTopOf="@id/interop_mode"
app:layout_constraintStart_toStartOf="@id/interop_mode_summary"
app:layout_constraintEnd_toEndOf="@id/interop_mode_summary"
app:layout_constraintBottom_toBottomOf="@id/interop_mode_summary" />
<com.google.android.material.radiobutton.MaterialRadioButton
style="@style/default_text_style_800"
android:id="@+id/interop_mode"
@ -193,7 +220,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:layout_marginStart="20dp"
android:text="@string/assistant_secure_mode_interoperable_title"
android:textSize="16sp"
android:textColor="@color/black"
@ -219,19 +246,20 @@
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/interop_mode_summary"
android:onClick="@{() -> viewModel.switchToInteropMode()}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="10dp"
android:background="@drawable/shape_squircle_white_background"
android:paddingTop="20dp"
android:paddingBottom="20dp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:text="@string/manage_account_secure_mode_interoperable_summary"
android:textSize="14sp"
android:gravity="center"
android:gravity="start"
android:drawableEnd="@drawable/profile_interop_logo"
android:drawablePadding="10dp"
app:layout_constraintTop_toBottomOf="@id/interop_mode"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

View file

@ -17,6 +17,9 @@
<variable
name="continueClickListener"
type="View.OnClickListener" />
<variable
name="viewModel"
type="org.linphone.ui.assistant.viewmodel.AccountLoginViewModel" />
</data>
<ScrollView
@ -81,6 +84,7 @@
<com.google.android.material.radiobutton.MaterialRadioButton
android:id="@+id/default_mode"
style="@style/default_text_style_800"
android:onClick="@{() -> viewModel.switchToSecureMode()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
@ -88,9 +92,10 @@
android:text="@string/assistant_secure_mode_default_title"
android:textSize="16sp"
android:textColor="@color/black"
android:checked="true"
android:checked="@{viewModel.isCurrentlySelectedModeSecure}"
android:enabled="@{!viewModel.isCurrentlySelectedModeSecure}"
app:useMaterialThemeColors="false"
app:buttonTint="@color/orange_main_500"
app:buttonTint="@color/blue_info_500"
app:layout_constraintTop_toBottomOf="@id/sub_title"
app:layout_constraintStart_toStartOf="parent" />
@ -121,7 +126,9 @@
android:paddingEnd="16dp"
android:text="@string/manage_account_secure_mode_default_summary"
android:textSize="14sp"
android:gravity="center"
android:gravity="start"
android:drawableEnd="@drawable/profile_secure_logo"
android:drawablePadding="10dp"
app:layout_constraintTop_toBottomOf="@id/default_mode"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
@ -132,7 +139,7 @@
android:layout_height="@dimen/avatar_list_cell_size"
android:adjustViewBounds="true"
android:layout_marginEnd="16dp"
android:layout_marginTop="20dp"
android:layout_marginTop="10dp"
android:background="@drawable/shape_circle_light_blue_background"
android:src="@drawable/user_circle"
coilInitials="@{`JD`}"
@ -201,6 +208,7 @@
<com.google.android.material.radiobutton.MaterialRadioButton
android:id="@+id/interop_mode"
style="@style/default_text_style_800"
android:onClick="@{() -> viewModel.switchToInteropMode()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
@ -208,6 +216,8 @@
android:text="@string/assistant_secure_mode_interoperable_title"
android:textSize="16sp"
android:textColor="@color/black"
android:checked="@{!viewModel.isCurrentlySelectedModeSecure}"
android:enabled="@{viewModel.isCurrentlySelectedModeSecure}"
app:useMaterialThemeColors="false"
app:buttonTint="@color/orange_main_500"
app:layout_constraintTop_toBottomOf="@id/image1"
@ -240,7 +250,9 @@
android:paddingEnd="16dp"
android:text="@string/manage_account_secure_mode_interoperable_summary"
android:textSize="14sp"
android:gravity="center"
android:gravity="start"
android:drawableEnd="@drawable/profile_interop_logo"
android:drawablePadding="10dp"
app:layout_constraintTop_toBottomOf="@id/interop_mode"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

View file

@ -152,7 +152,7 @@
<string name="assistant_third_party_sip_account_warning_ok">I understand</string>
<string name="assistant_account_secure_mode_title">Personalize your profile mode</string>
<string name="assistant_account_secure_mode_subtitle">You may change that mode later</string>
<string name="assistant_secure_mode_default_title">Default</string>
<string name="assistant_secure_mode_default_title">End-to-end encrypted</string>
<string name="assistant_secure_mode_interoperable_title">Interoperable</string>
<string name="assistant_secure_mode_finish_account_login">Continue</string>
<string name="assistant_account_register_unavailable_no_push_toast">Push notifications not available, account creation disabled</string>
@ -176,7 +176,7 @@
<string name="assistant_account_login_forbidden_error">Wrong username or password</string>
<string name="assistant_account_login_error">Failed to login: error code is %i</string>
<string name="assistant_permissions_title">Grant permissions</string>
<string name="assistant_permissions_grant_all_of_them">Grant all</string>
<string name="assistant_permissions_grant_all_of_them">OK</string>
<string name="assistant_permissions_skip_permissions">Do it later</string>
<string name="assistant_permissions_subtitle">To fully enjoy &appName; we need you to grant us the following permissions :</string>
@ -262,8 +262,8 @@
<string name="manage_account_choose_mode_apply_label">Apply</string>
<string name="manage_account_secure_mode_default_title">Default mode</string>
<string name="manage_account_secure_mode_interoperable_title">Interoperable mode</string>
<string name="manage_account_secure_mode_default_summary">End-to-end encryption of your communications</string>
<string name="manage_account_secure_mode_interoperable_summary">Allows to communicate with other SIP services, point to point encryption</string>
<string name="manage_account_secure_mode_default_summary">This mode guarantee your data confidentiality. Our end-to-end encryption technology provide the highest level or security for your communications.</string>
<string name="manage_account_secure_mode_interoperable_summary">This mode allows you to enjoy all &appName; features while staying interoperable with any SIP service through point-to-point encryption.</string>
<string name="manage_account_device_remove">Remove</string>
<string name="manage_account_device_last_connection">Last connection:</string>