Started account profile mode (secure/default vs interop)

This commit is contained in:
Sylvain Berfini 2023-09-12 16:34:31 +02:00
parent 34424dfbc3
commit 7f78cf23d7
16 changed files with 476 additions and 14 deletions

View file

@ -114,8 +114,9 @@ class LoginFragment : Fragment() {
viewModel.accountLoggedInEvent.observe(viewLifecycleOwner) {
it.consume {
Log.i("$TAG Account successfully logged-in, leaving assistant")
goBack()
Log.i("$TAG Account successfully logged-in, go to profile mode fragment")
val action = LoginFragmentDirections.actionLoginFragmentToProfileModeFragment()
findNavController().navigate(action)
}
}

View file

@ -0,0 +1,85 @@
/*
* Copyright (c) 2010-2023 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.linphone.ui.assistant.fragment
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.UiThread
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import androidx.navigation.navGraphViewModels
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.AssistantLoginFragmentBinding
import org.linphone.databinding.AssistantSecureModeFragmentBinding
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
class ProfileModeFragment : Fragment() {
companion object {
private const val TAG = "[Profile Mode Fragment]"
}
private lateinit var binding: AssistantSecureModeFragmentBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = AssistantSecureModeFragmentBinding.inflate(layoutInflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = viewLifecycleOwner
binding.setBackClickListener {
findNavController().popBackStack()
}
binding.setContinueClickListener {
requireActivity().finish()
}
binding.setDefaultModeTooltipClickListener {
// TODO
}
binding.setInteropModeTooltipClickListener {
// TODO
}
}
}

View file

@ -102,7 +102,7 @@ class ContactFragment : GenericFragment() {
binding.setDeleteClickListener {
viewModel.deleteContact()
goBack()
// TODO: show toast ?
// TODO: show toast ? show confirmation dialog ?
}
sharedViewModel.isSlidingPaneSlideable.observe(viewLifecycleOwner) { slideable ->

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:pathData="M221.66,133.66l-72,72A8,8 0,0 1,136 200V136H40a8,8 0,0 1,0 -16h96V56a8,8 0,0 1,13.66 -5.66l72,72A8,8 0,0 1,221.66 133.66Z"
android:fillColor="#4e6074"/>
</vector>

View file

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:pathData="M128,24A104,104 0,1 0,232 128,104.11 104.11,0 0,0 128,24ZM128,216a88,88 0,1 1,88 -88A88.1,88.1 0,0 1,128 216ZM144,176a8,8 0,0 1,-8 8,16 16,0 0,1 -16,-16L120,128a8,8 0,0 1,0 -16,16 16,0 0,1 16,16v40A8,8 0,0 1,144 176ZM112,84a12,12 0,1 1,12 12A12,12 0,0 1,112 84Z"
android:fillColor="#4e6074"/>
</vector>

View file

@ -0,0 +1,5 @@
<?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/gray_2"/>
</shape>

View file

@ -80,7 +80,7 @@
android:paddingEnd="8dp"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:background="@drawable/shape_squircle_gray_background"
android:background="@drawable/shape_squircle_gray_3_background"
android:gravity="center"
android:text="@{model.registrationState, default=@string/drawer_menu_account_connection_status_connected}"
android:textColor="@{model.isConnected ? @color/green_online : model.inError ? @color/red_danger : @color/gray_1, default=@color/green_online}"

View file

@ -47,9 +47,10 @@
app:layout_constraintStart_toStartOf="parent"/>
<ImageView
android:id="@+id/image"
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="19dp"
android:src="@drawable/header"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
@ -64,7 +65,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:paddingBottom="30dp"
android:paddingBottom="27dp"
android:text="@string/assistant_account_login"
android:textSize="20sp"
android:textColor="@color/white"

View file

@ -52,9 +52,10 @@
app:layout_constraintStart_toStartOf="parent"/>
<ImageView
android:id="@+id/image"
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="19dp"
android:src="@drawable/header"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
@ -69,7 +70,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:paddingBottom="30dp"
android:paddingBottom="27dp"
android:text="@string/assistant_account_register"
android:textSize="20sp"
android:textColor="@color/white"

View file

@ -0,0 +1,291 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="backClickListener"
type="View.OnClickListener" />
<variable
name="defaultModeTooltipClickListener"
type="View.OnClickListener" />
<variable
name="interopModeTooltipClickListener"
type="View.OnClickListener" />
<variable
name="continueClickListener"
type="View.OnClickListener" />
</data>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:visibility="invisible"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginTop="7dp"
android:layout_marginStart="15dp"
android:src="@drawable/caret_left"
app:tint="@color/gray_1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
<ImageView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginTop="19dp"
android:src="@drawable/header"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/back"
app:layout_constraintBottom_toBottomOf="@id/sub_title"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:text="@string/assistant_account_secure_mode_title"
android:textSize="20sp"
android:textColor="@color/white"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/sub_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="25dp"
android:text="@string/assistant_account_secure_mode_subtitle"
android:textSize="14sp"
android:textColor="@color/white"
app:layout_constraintTop_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<RadioButton
android:id="@+id/default_mode"
style="@style/default_text_style_800"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginStart="16dp"
android:text="@string/assistant_secure_mode_default_title"
android:textSize="16sp"
android:textColor="@color/black"
android:buttonTint="@color/primary_color"
android:checked="true"
app:layout_constraintTop_toBottomOf="@id/sub_title"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/default_mode_tooltip"
style="@style/default_text_style_800"
android:onClick="@{defaultModeTooltipClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:src="@drawable/info"
app:tint="@color/black"
app:layout_constraintTop_toTopOf="@id/default_mode"
app:layout_constraintBottom_toBottomOf="@id/default_mode"
app:layout_constraintStart_toEndOf="@id/default_mode" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/default_mode_summary"
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_gray_2_background"
android:paddingTop="21dp"
android:paddingBottom="21dp"
android:paddingStart="17dp"
android:paddingEnd="17dp"
android:text="Explication :\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam velit sapien, egestas sit amet dictum eget, condimentum a ligula. "
android:textSize="14sp"
android:gravity="center"
app:layout_constraintTop_toBottomOf="@id/default_mode"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<io.getstream.avatarview.AvatarView
android:id="@+id/image1"
android:layout_width="@dimen/avatar_list_cell_size"
android:layout_height="@dimen/avatar_list_cell_size"
android:adjustViewBounds="true"
android:layout_marginEnd="16dp"
android:layout_marginTop="21dp"
android:background="@drawable/shape_circle_light_blue_background"
android:src="@drawable/contact_avatar"
app:avatarViewPlaceholder="@drawable/contact_avatar"
app:avatarViewInitialsBackgroundColor="@color/blue_light"
app:avatarViewInitialsTextColor="@color/gray_9"
app:avatarViewInitialsTextSize="16sp"
app:avatarViewInitialsTextStyle="bold"
app:avatarViewShape="circle"
app:avatarViewInitials="JD"
app:avatarViewBorderWidth="0dp"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/arrow"
app:layout_constraintTop_toBottomOf="@id/default_mode_summary"/>
<ImageView
android:id="@+id/image1_presence_badge"
android:layout_width="@dimen/avatar_presence_badge_size"
android:layout_height="@dimen/avatar_presence_badge_size"
android:layout_marginEnd="@dimen/avatar_presence_badge_end_margin"
android:background="@drawable/led_background"
android:padding="@dimen/avatar_presence_badge_padding"
android:src="@drawable/led_online"
app:layout_constraintEnd_toEndOf="@id/image1"
app:layout_constraintBottom_toBottomOf="@id/image1"/>
<ImageView
android:id="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:src="@drawable/arrow_right_fill"
app:tint="@color/black"
app:layout_constraintStart_toEndOf="@id/image1"
app:layout_constraintEnd_toStartOf="@id/image2"
app:layout_constraintTop_toTopOf="@id/image1"
app:layout_constraintBottom_toBottomOf="@id/image1"/>
<io.getstream.avatarview.AvatarView
android:id="@+id/image2"
android:layout_width="@dimen/avatar_list_cell_size"
android:layout_height="@dimen/avatar_list_cell_size"
android:adjustViewBounds="true"
android:background="@drawable/shape_circle_light_blue_background"
android:src="@drawable/contact_avatar"
app:avatarViewPlaceholder="@drawable/contact_avatar"
app:avatarViewInitialsBackgroundColor="@color/blue_light"
app:avatarViewInitialsTextColor="@color/gray_9"
app:avatarViewInitialsTextSize="16sp"
app:avatarViewInitialsTextStyle="bold"
app:avatarViewShape="circle"
app:avatarViewInitials="JD"
app:avatarViewBorderWidth="2dp"
app:avatarViewBorderColor="@color/blue_trusted"
app:layout_constraintStart_toEndOf="@id/arrow"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/image1"
app:layout_constraintBottom_toBottomOf="@id/image1"/>
<ImageView
android:id="@+id/image2_trust_badge"
android:layout_width="@dimen/avatar_presence_badge_size"
android:layout_height="@dimen/avatar_presence_badge_size"
android:src="@drawable/trusted"
app:layout_constraintStart_toStartOf="@id/image2"
app:layout_constraintBottom_toBottomOf="@id/image2"/>
<ImageView
android:id="@+id/image2_presence_badge"
android:layout_width="@dimen/avatar_presence_badge_size"
android:layout_height="@dimen/avatar_presence_badge_size"
android:layout_marginEnd="@dimen/avatar_presence_badge_end_margin"
android:background="@drawable/led_background"
android:padding="@dimen/avatar_presence_badge_padding"
android:src="@drawable/led_online"
app:layout_constraintEnd_toEndOf="@id/image2"
app:layout_constraintBottom_toBottomOf="@id/image2"/>
<RadioButton
android:id="@+id/interop_mode"
style="@style/default_text_style_800"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginStart="16dp"
android:text="@string/assistant_secure_mode_interoperable_title"
android:textSize="16sp"
android:textColor="@color/black"
android:buttonTint="@color/primary_color"
app:layout_constraintTop_toBottomOf="@id/image1"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/interop_mode_tooltip"
style="@style/default_text_style_800"
android:onClick="@{interopModeTooltipClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:src="@drawable/info"
app:tint="@color/black"
app:layout_constraintTop_toTopOf="@id/interop_mode"
app:layout_constraintBottom_toBottomOf="@id/interop_mode"
app:layout_constraintStart_toEndOf="@id/interop_mode" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/interop_mode_summary"
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_gray_2_background"
android:paddingTop="21dp"
android:paddingBottom="21dp"
android:paddingStart="17dp"
android:paddingEnd="17dp"
android:text="Explication :\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam velit sapien, egestas sit amet dictum eget, condimentum a ligula. "
android:textSize="14sp"
android:gravity="center"
app:layout_constraintTop_toBottomOf="@id/interop_mode"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_600"
android:onClick="@{continueClickListener}"
android:id="@+id/login"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="138dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:paddingTop="@dimen/primary_secondary_buttons_label_padding"
android:paddingBottom="@dimen/primary_secondary_buttons_label_padding"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@string/dialog_continue"
android:textSize="18sp"
android:textColor="@color/primary_button_label_color"
android:gravity="center"
android:background="@drawable/primary_button_background"
app:layout_constraintWidth_max="@dimen/button_max_width"
app:layout_constraintTop_toBottomOf="@id/interop_mode_summary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</layout>

View file

@ -4,14 +4,27 @@
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:src="@drawable/header"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@id/title_second_line"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/title_first_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="65dp"
android:layout_marginTop="16dp"
android:text="Welcome"
android:textColor="@color/black"
android:textColor="@color/white"
android:textSize="36sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
@ -22,8 +35,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="65dp"
android:paddingBottom="16dp"
android:text="in Linphone"
android:textColor="@color/black"
android:textColor="@color/white"
android:textSize="26sp"
app:layout_constraintTop_toBottomOf="@id/title_first_line"
app:layout_constraintEnd_toEndOf="parent"/>

View file

@ -4,14 +4,27 @@
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:src="@drawable/header"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@id/title_second_line"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/title_first_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="65dp"
android:layout_marginTop="16dp"
android:text="Welcome"
android:textColor="@color/black"
android:textColor="@color/white"
android:textSize="36sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
@ -22,8 +35,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="65dp"
android:paddingBottom="16dp"
android:text="in Linphone"
android:textColor="@color/black"
android:textColor="@color/white"
android:textSize="26sp"
app:layout_constraintTop_toBottomOf="@id/title_first_line"
app:layout_constraintEnd_toEndOf="parent"/>

View file

@ -4,14 +4,27 @@
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/header"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:src="@drawable/header"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@id/title_second_line"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/title_first_line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="65dp"
android:layout_marginTop="16dp"
android:text="Welcome"
android:textColor="@color/black"
android:textColor="@color/white"
android:textSize="36sp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
@ -22,8 +35,9 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="65dp"
android:paddingBottom="16dp"
android:text="in Linphone"
android:textColor="@color/black"
android:textColor="@color/white"
android:textSize="26sp"
app:layout_constraintTop_toBottomOf="@id/title_first_line"
app:layout_constraintEnd_toEndOf="parent"/>

View file

@ -37,6 +37,14 @@
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"
app:launchSingleTop="true" />
<action
android:id="@+id/action_loginFragment_to_profileModeFragment"
app:destination="@id/profileModeFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"
app:launchSingleTop="true" />
</fragment>
@ -118,4 +126,10 @@
</fragment>
<fragment
android:id="@+id/profileModeFragment"
android:name="org.linphone.ui.assistant.fragment.ProfileModeFragment"
android:label="ProfileModeFragment"
tools:layout="@layout/assistant_secure_mode_fragment" />
</navigation>

View file

@ -85,6 +85,10 @@
<string name="assistant_third_party_sip_account_warning_explanation">Some features require a Linphone account, such as group messaging, video conferences…\n\nThese features are hidden when you register with a third party SIP account.\n\nTo enable it in a commercial project, please contact us.</string>
<string name="assistant_third_party_sip_account_create_linphone_account">I prefer to create an account</string>
<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_interoperable_title">Interoperable</string>
<string name="drawer_menu_default_account_label">Default</string>
<string name="drawer_menu_manage_account">Manage the profile</string>