Add a way to go to Help page from assistant

This commit is contained in:
Sylvain Berfini 2025-07-07 15:10:23 +02:00
parent df0fabce01
commit 53435b4bf8
10 changed files with 109 additions and 23 deletions

View file

@ -78,6 +78,14 @@ class LandingFragment : GenericFragment() {
requireActivity().finish() requireActivity().finish()
} }
binding.setHelpClickListener {
if (findNavController().currentDestination?.id == R.id.landingFragment) {
val action =
LandingFragmentDirections.actionLandingFragmentToHelpFragment()
findNavController().navigate(action)
}
}
binding.setRegisterClickListener { binding.setRegisterClickListener {
if (viewModel.conditionsAndPrivacyPolicyAccepted) { if (viewModel.conditionsAndPrivacyPolicyAccepted) {
goToRegisterFragment() goToRegisterFragment()

View file

@ -66,7 +66,6 @@ import org.linphone.databinding.MainActivityBinding
import org.linphone.ui.GenericActivity import org.linphone.ui.GenericActivity
import org.linphone.ui.assistant.AssistantActivity import org.linphone.ui.assistant.AssistantActivity
import org.linphone.ui.main.chat.fragment.ConversationsListFragmentDirections import org.linphone.ui.main.chat.fragment.ConversationsListFragmentDirections
import org.linphone.ui.main.help.fragment.DebugFragmentDirections
import org.linphone.utils.PasswordDialogModel import org.linphone.utils.PasswordDialogModel
import org.linphone.ui.main.sso.fragment.SingleSignOnFragmentDirections import org.linphone.ui.main.sso.fragment.SingleSignOnFragmentDirections
import org.linphone.ui.main.viewmodel.MainViewModel import org.linphone.ui.main.viewmodel.MainViewModel
@ -722,8 +721,13 @@ class MainActivity : GenericActivity() {
sharedViewModel.showConversationEvent.value = Event(conversationId) sharedViewModel.showConversationEvent.value = Event(conversationId)
} }
val action = DebugFragmentDirections.actionDebugFragmentToConversationsListFragment() val action = ConversationsListFragmentDirections.actionGlobalConversationsListFragment()
findNavController().navigate(action) val options = NavOptions.Builder()
options.apply {
setPopUpTo(R.id.helpFragment, true)
setLaunchSingleTop(true)
}
findNavController().navigate(action, options.build())
} else { } else {
val conversationId = parseShortcutIfAny(intent) val conversationId = parseShortcutIfAny(intent)
if (conversationId != null) { if (conversationId != null) {

View file

@ -28,22 +28,22 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.navGraphViewModels
import org.linphone.R import org.linphone.R
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.databinding.HelpDebugFragmentBinding import org.linphone.databinding.HelpDebugFragmentBinding
import org.linphone.ui.GenericActivity import org.linphone.ui.GenericActivity
import org.linphone.ui.assistant.AssistantActivity
import org.linphone.ui.fileviewer.FileViewerActivity import org.linphone.ui.fileviewer.FileViewerActivity
import org.linphone.ui.main.MainActivity
import org.linphone.ui.main.fragment.GenericMainFragment import org.linphone.ui.main.fragment.GenericMainFragment
import org.linphone.ui.main.help.viewmodel.HelpViewModel import org.linphone.ui.main.help.viewmodel.HelpViewModel
class DebugFragment : GenericMainFragment() { class DebugFragment : GenericMainFragment() {
private lateinit var binding: HelpDebugFragmentBinding private lateinit var binding: HelpDebugFragmentBinding
val viewModel: HelpViewModel by navGraphViewModels( private lateinit var viewModel: HelpViewModel
R.id.main_nav_graph
)
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -57,9 +57,13 @@ class DebugFragment : GenericMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = viewLifecycleOwner binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this)[HelpViewModel::class.java]
binding.viewModel = viewModel binding.viewModel = viewModel
observeToastEvents(viewModel) observeToastEvents(viewModel)
viewModel.canConfigFileBeViewed.postValue(requireActivity() is MainActivity)
binding.setBackClickListener { binding.setBackClickListener {
goBack() goBack()
} }
@ -91,6 +95,13 @@ class DebugFragment : GenericMainFragment() {
viewModel.uploadDebugLogsFinishedEvent.observe(viewLifecycleOwner) { viewModel.uploadDebugLogsFinishedEvent.observe(viewLifecycleOwner) {
it.consume { url -> it.consume { url ->
if (requireActivity() is AssistantActivity) {
val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val label = "Logs upload URL"
clipboard.setPrimaryClip(ClipData.newPlainText(label, url))
return@consume
}
val appName = requireContext().getString(R.string.app_name) val appName = requireContext().getString(R.string.app_name)
val intent = Intent(Intent.ACTION_SEND) val intent = Intent(Intent.ACTION_SEND)
intent.putExtra( intent.putExtra(

View file

@ -27,7 +27,6 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.annotation.UiThread import androidx.annotation.UiThread
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.navGraphViewModels
import org.linphone.R import org.linphone.R
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.databinding.HelpFragmentBinding import org.linphone.databinding.HelpFragmentBinding
@ -37,6 +36,7 @@ import org.linphone.ui.main.help.viewmodel.HelpViewModel
import org.linphone.utils.ConfirmationDialogModel import org.linphone.utils.ConfirmationDialogModel
import org.linphone.utils.DialogUtils import org.linphone.utils.DialogUtils
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.lifecycle.ViewModelProvider
@UiThread @UiThread
class HelpFragment : GenericMainFragment() { class HelpFragment : GenericMainFragment() {
@ -46,9 +46,7 @@ class HelpFragment : GenericMainFragment() {
private lateinit var binding: HelpFragmentBinding private lateinit var binding: HelpFragmentBinding
val viewModel: HelpViewModel by navGraphViewModels( private lateinit var viewModel: HelpViewModel
R.id.main_nav_graph
)
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
@ -62,6 +60,8 @@ class HelpFragment : GenericMainFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = viewLifecycleOwner binding.lifecycleOwner = viewLifecycleOwner
viewModel = ViewModelProvider(this)[HelpViewModel::class.java]
binding.viewModel = viewModel binding.viewModel = viewModel
observeToastEvents(viewModel) observeToastEvents(viewModel)

View file

@ -62,6 +62,8 @@ class HelpViewModel
val versionClickCount = MutableLiveData<Int>() val versionClickCount = MutableLiveData<Int>()
val canConfigFileBeViewed = MutableLiveData<Boolean>()
val newVersionAvailableEvent: MutableLiveData<Event<Pair<String, String>>> by lazy { val newVersionAvailableEvent: MutableLiveData<Event<Pair<String, String>>> by lazy {
MutableLiveData<Event<Pair<String, String>>>() MutableLiveData<Event<Pair<String, String>>>()
} }

View file

@ -8,6 +8,9 @@
<variable <variable
name="backClickListener" name="backClickListener"
type="View.OnClickListener" /> type="View.OnClickListener" />
<variable
name="helpClickListener"
type="View.OnClickListener" />
<variable <variable
name="forgottenPasswordClickListener" name="forgottenPasswordClickListener"
type="View.OnClickListener" /> type="View.OnClickListener" />
@ -79,6 +82,23 @@
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@id/back"/> app:layout_constraintStart_toEndOf="@id/back"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/help"
android:onClick="@{helpClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="20dp"
android:text="@string/help_title"
android:textSize="14sp"
android:textColor="?attr/color_main2_500"
android:drawableStart="@drawable/question"
android:drawablePadding="5dp"
app:drawableTint="?attr/color_main2_500"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style" style="@style/default_text_style"
android:id="@+id/no_account_yet" android:id="@+id/no_account_yet"
@ -101,15 +121,14 @@
android:onClick="@{registerClickListener}" android:onClick="@{registerClickListener}"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:layout_marginEnd="40dp" android:layout_marginEnd="40dp"
android:paddingStart="20dp" android:paddingStart="20dp"
android:paddingEnd="20dp" android:paddingEnd="20dp"
android:text="@string/assistant_account_register" android:text="@string/assistant_account_register"
android:visibility="@{viewModel.hideCreateAccount ? View.GONE : View.VISIBLE}" android:visibility="@{viewModel.hideCreateAccount ? View.GONE : View.VISIBLE}"
app:layout_constraintVertical_bias="1"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/title" app:layout_constraintTop_toBottomOf="@id/help"/>
app:layout_constraintBottom_toBottomOf="@id/title"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
style="@style/header_style" style="@style/header_style"

View file

@ -8,6 +8,9 @@
<variable <variable
name="backClickListener" name="backClickListener"
type="View.OnClickListener" /> type="View.OnClickListener" />
<variable
name="helpClickListener"
type="View.OnClickListener" />
<variable <variable
name="forgottenPasswordClickListener" name="forgottenPasswordClickListener"
type="View.OnClickListener" /> type="View.OnClickListener" />
@ -60,6 +63,23 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/> app:layout_constraintEnd_toEndOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/help"
android:onClick="@{helpClickListener}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:text="@string/help_title"
android:textSize="14sp"
android:textColor="?attr/color_main2_500"
android:drawableStart="@drawable/question"
android:drawablePadding="5dp"
app:drawableTint="?attr/color_main2_500"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/title"
app:layout_constraintBottom_toBottomOf="@id/title"/>
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
style="@style/header_style" style="@style/header_style"
android:id="@+id/sip_identity_label" android:id="@+id/sip_identity_label"

View file

@ -292,6 +292,7 @@
android:text="@string/help_troubleshooting_show_config_file" android:text="@string/help_troubleshooting_show_config_file"
android:maxLines="1" android:maxLines="1"
android:ellipsize="end" android:ellipsize="end"
android:visibility="@{viewModel.canConfigFileBeViewed ? View.VISIBLE : View.GONE, default=gone}"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/firebase_project_subtitle"/> app:layout_constraintTop_toBottomOf="@id/firebase_project_subtitle"/>

View file

@ -152,7 +152,14 @@
app:popEnterAnim="@anim/slide_in_left" app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" app:popExitAnim="@anim/slide_out_right"
app:launchSingleTop="true"/> app:launchSingleTop="true"/>
<action
android:id="@+id/action_landingFragment_to_helpFragment"
app:destination="@id/helpFragment"
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> </fragment>
<fragment <fragment
@ -192,6 +199,27 @@
app:launchSingleTop="true"/> app:launchSingleTop="true"/>
</fragment> </fragment>
<fragment
android:id="@+id/helpFragment"
android:name="org.linphone.ui.main.help.fragment.HelpFragment"
android:label="HelpFragment"
tools:layout="@layout/help_fragment">
<action
android:id="@+id/action_helpFragment_to_debugFragment"
app:destination="@id/debugFragment"
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>
<fragment
android:id="@+id/debugFragment"
android:name="org.linphone.ui.main.help.fragment.DebugFragment"
android:label="DebugFragment"
tools:layout="@layout/help_debug_fragment"/>
<fragment <fragment
android:id="@+id/recoverPhoneAccountFragment" android:id="@+id/recoverPhoneAccountFragment"
android:name="org.linphone.ui.assistant.fragment.RecoverPhoneAccountFragment" android:name="org.linphone.ui.assistant.fragment.RecoverPhoneAccountFragment"

View file

@ -228,14 +228,7 @@
android:id="@+id/debugFragment" android:id="@+id/debugFragment"
android:name="org.linphone.ui.main.help.fragment.DebugFragment" android:name="org.linphone.ui.main.help.fragment.DebugFragment"
android:label="DebugFragment" android:label="DebugFragment"
tools:layout="@layout/help_debug_fragment" > tools:layout="@layout/help_debug_fragment"/>
<action
android:id="@+id/action_debugFragment_to_conversationsListFragment"
app:destination="@id/conversationsListFragment"
app:launchSingleTop="true"
app:popUpTo="@id/helpFragment"
app:popUpToInclusive="true"/>
</fragment>
<fragment <fragment
android:id="@+id/accountSettingsFragment" android:id="@+id/accountSettingsFragment"