Started settings

This commit is contained in:
Sylvain Berfini 2023-09-13 14:17:08 +02:00
parent 24a5ae8122
commit 54a299f23c
12 changed files with 760 additions and 51 deletions

View file

@ -62,6 +62,20 @@ class CorePreferences @UiThread constructor(private val context: Context) {
config.setBool("app", "publish_presence", value)
}
// Calls settings
var routeAudioToBluetoothIfAvailable: Boolean
get() = config.getBool("app", "route_audio_to_bluetooth_if_available", true)
set(value) {
config.setBool("app", "route_audio_to_bluetooth_if_available", value)
}
var automaticallyStartCallRecording: Boolean
get() = config.getBool("app", "auto_start_call_record", false)
set(value) {
config.setBool("app", "auto_start_call_record", value)
}
// Will disable chat feature completely
@get:WorkerThread
val disableChat: Boolean
@ -91,6 +105,12 @@ class CorePreferences @UiThread constructor(private val context: Context) {
val thirdPartyDefaultValuesPath: String
get() = context.filesDir.absolutePath + "/assistant_third_party_default_values"
private val ringtonesPath: String
get() = context.filesDir.absolutePath + "/share/sounds/linphone/rings/"
val defaultRingtonePath: String
get() = ringtonesPath + "notes_of_the_optimistic.mkv"
@UiThread
fun copyAssetsFromPackage() {
copy("linphonerc_default", configPath)

View file

@ -5,13 +5,20 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.UiThread
import androidx.navigation.navGraphViewModels
import org.linphone.R
import org.linphone.databinding.SettingsFragmentBinding
import org.linphone.ui.main.fragment.GenericFragment
import org.linphone.ui.main.settings.viewmodel.SettingsViewModel
@UiThread
class SettingsFragment : GenericFragment() {
private lateinit var binding: SettingsFragmentBinding
private val viewModel: SettingsViewModel by navGraphViewModels(
R.id.main_nav_graph
)
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@ -24,6 +31,7 @@ class SettingsFragment : GenericFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.lifecycleOwner = viewLifecycleOwner
binding.viewModel = viewModel
binding.setBackClickListener {
goBack()

View file

@ -0,0 +1,181 @@
/*
* 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.main.settings.viewmodel
import android.os.Vibrator
import androidx.annotation.UiThread
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.core.tools.Log
class SettingsViewModel @UiThread constructor() : ViewModel() {
companion object {
private const val TAG = "[Settings ViewModel]"
}
val expandCalls = MutableLiveData<Boolean>()
val expandNetwork = MutableLiveData<Boolean>()
val expandUserInterface = MutableLiveData<Boolean>()
// Calls settings
val echoCancellerEnabled = MutableLiveData<Boolean>()
val routeAudioToBluetooth = MutableLiveData<Boolean>()
val videoEnabled = MutableLiveData<Boolean>()
val autoInitiateVideoCalls = MutableLiveData<Boolean>()
val autoAcceptVideoRequests = MutableLiveData<Boolean>()
val useDeviceRingtone = MutableLiveData<Boolean>()
val vibrateDuringIncomingCall = MutableLiveData<Boolean>()
val autoRecordCalls = MutableLiveData<Boolean>()
// Network settings
val useWifiOnly = MutableLiveData<Boolean>()
// User Interface settings
val isVibrationAvailable = MutableLiveData<Boolean>()
init {
expandCalls.value = true
expandNetwork.value = true
expandUserInterface.value = false
val vibrator = coreContext.context.getSystemService(Vibrator::class.java)
isVibrationAvailable.value = vibrator.hasVibrator()
if (isVibrationAvailable.value == false) {
Log.w("$TAG Device doesn't seem to have a vibrator, hiding related setting")
}
coreContext.postOnCoreThread { core ->
echoCancellerEnabled.postValue(core.isEchoCancellationEnabled)
routeAudioToBluetooth.postValue(corePreferences.routeAudioToBluetoothIfAvailable)
videoEnabled.postValue(core.isVideoEnabled)
autoInitiateVideoCalls.postValue(core.videoActivationPolicy.automaticallyInitiate)
autoAcceptVideoRequests.postValue(core.videoActivationPolicy.automaticallyAccept)
useDeviceRingtone.postValue(core.ring == null)
vibrateDuringIncomingCall.postValue(core.isVibrationOnIncomingCallEnabled)
autoRecordCalls.postValue(corePreferences.automaticallyStartCallRecording)
useWifiOnly.postValue(core.isWifiOnlyEnabled)
}
}
@UiThread
fun toggleEchoCanceller() {
val newValue = echoCancellerEnabled.value == false
coreContext.postOnCoreThread { core ->
core.isEchoCancellationEnabled = newValue
echoCancellerEnabled.postValue(newValue)
}
}
@UiThread
fun toggleRouteAudioToBluetooth() {
val newValue = routeAudioToBluetooth.value == false
coreContext.postOnCoreThread {
corePreferences.routeAudioToBluetoothIfAvailable = newValue
routeAudioToBluetooth.postValue(newValue)
}
}
@UiThread
fun toggleEnableVideo() {
val newValue = videoEnabled.value == false
coreContext.postOnCoreThread { core ->
core.isVideoCaptureEnabled = newValue
core.isVideoDisplayEnabled = newValue
videoEnabled.postValue(newValue)
}
}
@UiThread
fun toggleAutoInitiateVideoCalls() {
val newValue = autoInitiateVideoCalls.value == false
coreContext.postOnCoreThread { core ->
val policy = core.videoActivationPolicy
policy.automaticallyInitiate = newValue
core.videoActivationPolicy = policy
autoInitiateVideoCalls.postValue(newValue)
}
}
@UiThread
fun toggleAutoAcceptVideoRequests() {
val newValue = autoAcceptVideoRequests.value == false
coreContext.postOnCoreThread { core ->
val policy = core.videoActivationPolicy
policy.automaticallyAccept = newValue
core.videoActivationPolicy = policy
autoAcceptVideoRequests.postValue(newValue)
}
}
@UiThread
fun toggleDeviceRingtone() {
val newValue = useDeviceRingtone.value == false
coreContext.postOnCoreThread { core ->
core.ring = if (newValue) null else corePreferences.defaultRingtonePath
useDeviceRingtone.postValue(newValue)
}
}
@UiThread
fun toggleVibrateOnIncomingCalls() {
val newValue = vibrateDuringIncomingCall.value == false
coreContext.postOnCoreThread { core ->
core.isVibrationOnIncomingCallEnabled = newValue
vibrateDuringIncomingCall.postValue(newValue)
}
}
@UiThread
fun toggleAutoRecordCall() {
val newValue = autoRecordCalls.value == false
coreContext.postOnCoreThread {
corePreferences.automaticallyStartCallRecording = newValue
autoRecordCalls.postValue(newValue)
}
}
@UiThread
fun toggleUseWifiOnly() {
val newValue = useWifiOnly.value == false
coreContext.postOnCoreThread { core ->
core.isWifiOnlyEnabled = newValue
useWifiOnly.postValue(newValue)
}
}
@UiThread
fun toggleCallsExpand() {
expandCalls.value = expandCalls.value == false
}
@UiThread
fun toggleNetworkExpand() {
expandNetwork.value = expandNetwork.value == false
}
@UiThread
fun toggleUserInterfaceExpand() {
expandUserInterface.value = expandUserInterface.value == false
}
}

View file

@ -1,13 +1,9 @@
<vector
xmlns:android="http://schemas.android.com/apk/res/android"
android:name="vector"
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:name="path"
android:pathData="M 7.41 16.41 L 12 11.83 L 16.59 16.41 L 18 15 L 12 9 L 6 15 L 7.41 16.41 Z"
android:fillColor="#4e6074"
android:strokeWidth="1"/>
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:pathData="M213.66,165.66a8,8 0,0 1,-11.32 0L128,91.31 53.66,165.66a8,8 0,0 1,-11.32 -11.32l80,-80a8,8 0,0 1,11.32 0l80,80A8,8 0,0 1,213.66 165.66Z"
android:fillColor="#4e6074"/>
</vector>

View file

@ -145,7 +145,7 @@
android:id="@+id/details_background"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_marginTop="8dp"
android:layout_marginStart="17dp"
android:layout_marginEnd="17dp"
android:src="@drawable/shape_squircle_gray_2_background"
@ -351,7 +351,7 @@
android:id="@+id/actions_background"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginTop="8dp"
android:layout_marginStart="17dp"
android:layout_marginEnd="17dp"
android:src="@drawable/shape_squircle_gray_2_background"

View file

@ -63,7 +63,7 @@
style="@style/default_text_style_800"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:text="@string/assistant_secure_mode_default_title"
android:textSize="16sp"
@ -197,7 +197,7 @@
style="@style/default_text_style_800"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:text="@string/assistant_secure_mode_interoperable_title"
android:textSize="16sp"

View file

@ -86,7 +86,7 @@
style="@style/default_text_style_800"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:text="@string/assistant_secure_mode_default_title"
android:textSize="16sp"
@ -220,7 +220,7 @@
style="@style/default_text_style_800"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginTop="32dp"
android:layout_marginStart="16dp"
android:text="@string/assistant_secure_mode_interoperable_title"
android:textSize="16sp"

View file

@ -260,7 +260,7 @@
android:orientation="vertical"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="10dp"
android:layout_marginTop="8dp"
android:padding="10dp"
android:background="@drawable/shape_squircle_gray_2_background"
app:layout_constraintStart_toStartOf="parent"
@ -378,7 +378,7 @@
android:id="@+id/trust_background"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginTop="8dp"
android:layout_marginStart="17dp"
android:layout_marginEnd="17dp"
android:src="@drawable/shape_squircle_gray_2_background"
@ -465,7 +465,7 @@
android:id="@+id/actions_background"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginTop="8dp"
android:layout_marginStart="17dp"
android:layout_marginEnd="17dp"
android:src="@drawable/shape_squircle_gray_2_background"

View file

@ -8,42 +8,529 @@
<variable
name="backClickListener"
type="View.OnClickListener" />
<variable
name="viewModel"
type="org.linphone.ui.main.settings.viewmodel.SettingsViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:background="@color/white">
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginStart="10dp"
android:adjustViewBounds="true"
android:padding="5dp"
android:src="@drawable/caret_left"
android:drawableTint="@color/primary_color"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/title" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="32dp">
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="@dimen/top_bar_height"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:gravity="center_vertical"
android:text="@string/settings_title"
android:textColor="@color/primary_color"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/back"
app:layout_constraintTop_toTopOf="parent"/>
<ImageView
android:id="@+id/back"
android:onClick="@{backClickListener}"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_marginStart="10dp"
android:adjustViewBounds="true"
android:padding="5dp"
android:src="@drawable/caret_left"
android:drawableTint="@color/primary_color"
app:layout_constraintBottom_toBottomOf="@id/title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/title" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/title"
android:layout_width="0dp"
android:layout_height="@dimen/top_bar_height"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:gravity="center_vertical"
android:text="@string/settings_title"
android:textColor="@color/primary_color"
android:textSize="16sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/back"
app:layout_constraintTop_toTopOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:onClick="@{() -> viewModel.toggleCallsExpand()}"
android:id="@+id/calls"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_marginStart="26dp"
android:layout_marginEnd="26dp"
android:layout_marginTop="16dp"
android:text="@string/settings_calls_title"
android:drawableEnd="@{viewModel.expandCalls ? @drawable/caret_up : @drawable/caret_down, default=@drawable/caret_up}"
android:drawableTint="@color/gray_9"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/title"/>
<ImageView
android:id="@+id/calls_background"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginStart="17dp"
android:layout_marginEnd="17dp"
android:src="@drawable/shape_squircle_gray_2_background"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/calls"
app:layout_constraintBottom_toBottomOf="@id/calls_bottom_anchor"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:onClick="@{() -> viewModel.toggleEchoCanceller()}"
android:id="@+id/echo_canceller_title"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_echo_canceller_title"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="1"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/echo_canceller_switch"
app:layout_constraintBottom_toTopOf="@id/echo_canceller_subtitle"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/echo_canceller_switch"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:onClick="@{() -> viewModel.toggleEchoCanceller()}"
android:id="@+id/echo_canceller_subtitle"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_echo_canceller_subtitle"
android:textSize="14sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@id/echo_canceller_title"
app:layout_constraintBottom_toBottomOf="@id/echo_canceller_switch"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/echo_canceller_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/echo_canceller_switch"
android:onClick="@{() -> viewModel.toggleEchoCanceller()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="21dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.echoCancellerEnabled}"
app:layout_constraintEnd_toEndOf="@id/calls_background"
app:layout_constraintTop_toTopOf="@id/calls_background" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:onClick="@{() -> viewModel.toggleRouteAudioToBluetooth()}"
android:id="@+id/route_audio_to_bluetooth_title"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_route_audio_to_bluetooth_title"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/route_audio_to_bluetooth_switch"
app:layout_constraintBottom_toBottomOf="@id/route_audio_to_bluetooth_switch"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/route_audio_to_bluetooth_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/route_audio_to_bluetooth_switch"
android:onClick="@{() -> viewModel.toggleRouteAudioToBluetooth()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.routeAudioToBluetooth}"
app:layout_constraintEnd_toEndOf="@id/calls_background"
app:layout_constraintTop_toBottomOf="@id/echo_canceller_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:onClick="@{() -> viewModel.toggleEnableVideo()}"
android:id="@+id/enable_video_title"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_enable_video_title"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/enable_video_switch"
app:layout_constraintBottom_toBottomOf="@id/enable_video_switch"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/enable_video_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/enable_video_switch"
android:onClick="@{() -> viewModel.toggleEnableVideo()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.videoEnabled}"
app:layout_constraintEnd_toEndOf="@id/calls_background"
app:layout_constraintTop_toBottomOf="@id/route_audio_to_bluetooth_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:onClick="@{() -> viewModel.toggleAutoInitiateVideoCalls()}"
android:id="@+id/auto_initiate_video_title"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_auto_initiate_video_title"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="1"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/auto_initiate_video_switch"
app:layout_constraintBottom_toTopOf="@id/auto_initiate_video_subtitle"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/auto_initiate_video_switch"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:onClick="@{() -> viewModel.toggleAutoInitiateVideoCalls()}"
android:id="@+id/auto_initiate_video_subtitle"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_auto_initiate_video_subtitle"
android:textSize="14sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@id/auto_initiate_video_title"
app:layout_constraintBottom_toBottomOf="@id/auto_initiate_video_switch"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/auto_initiate_video_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/auto_initiate_video_switch"
android:onClick="@{() -> viewModel.toggleAutoInitiateVideoCalls()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.autoInitiateVideoCalls}"
app:layout_constraintEnd_toEndOf="@id/calls_background"
app:layout_constraintTop_toBottomOf="@id/enable_video_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/auto_accept_video_title"
android:onClick="@{() -> viewModel.toggleAutoAcceptVideoRequests()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_auto_accept_video_title"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="1"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/auto_accept_video_switch"
app:layout_constraintBottom_toTopOf="@id/auto_accept_video_subtitle"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/auto_accept_video_switch"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style"
android:id="@+id/auto_accept_video_subtitle"
android:onClick="@{() -> viewModel.toggleAutoAcceptVideoRequests()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_auto_accept_video_subtitle"
android:textSize="14sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toBottomOf="@id/auto_accept_video_title"
app:layout_constraintBottom_toBottomOf="@id/auto_accept_video_switch"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/auto_accept_video_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/auto_accept_video_switch"
android:onClick="@{() -> viewModel.toggleAutoAcceptVideoRequests()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.autoAcceptVideoRequests}"
app:layout_constraintEnd_toEndOf="@id/calls_background"
app:layout_constraintTop_toBottomOf="@id/auto_initiate_video_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:id="@+id/device_ringtone_title"
android:onClick="@{() -> viewModel.toggleDeviceRingtone()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_use_device_ringtone_title"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/device_ringtone_switch"
app:layout_constraintBottom_toBottomOf="@id/device_ringtone_switch"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/device_ringtone_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/device_ringtone_switch"
android:onClick="@{() -> viewModel.toggleDeviceRingtone()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.useDeviceRingtone}"
app:layout_constraintEnd_toEndOf="@id/calls_background"
app:layout_constraintTop_toBottomOf="@id/auto_accept_video_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:onClick="@{() -> viewModel.toggleVibrateOnIncomingCalls()}"
android:id="@+id/vibrate_title"
android:visibility="@{viewModel.expandCalls &amp;&amp; viewModel.isVibrationAvailable ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_vibrate_while_ringing_title"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/vibrate_switch"
app:layout_constraintBottom_toBottomOf="@id/vibrate_switch"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/vibrate_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/vibrate_switch"
android:onClick="@{() -> viewModel.toggleVibrateOnIncomingCalls()}"
android:visibility="@{viewModel.expandCalls &amp;&amp; viewModel.isVibrationAvailable ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.vibrateDuringIncomingCall}"
app:layout_constraintEnd_toEndOf="@id/calls_background"
app:layout_constraintTop_toBottomOf="@id/device_ringtone_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:onClick="@{() -> viewModel.toggleAutoRecordCall()}"
android:id="@+id/auto_record_title"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_calls_auto_record_title"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/auto_record_switch"
app:layout_constraintBottom_toBottomOf="@id/auto_record_switch"
app:layout_constraintStart_toStartOf="@id/calls_background"
app:layout_constraintEnd_toStartOf="@id/auto_record_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/auto_record_switch"
android:onClick="@{() -> viewModel.toggleAutoRecordCall()}"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.autoRecordCalls}"
app:layout_constraintEnd_toEndOf="@id/calls_background"
app:layout_constraintTop_toBottomOf="@id/vibrate_switch" />
<View
android:id="@+id/calls_bottom_anchor"
android:visibility="@{viewModel.expandCalls ? View.VISIBLE : View.GONE}"
android:layout_width="1dp"
android:layout_height="1dp"
android:layout_marginTop="21dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/auto_record_switch"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:onClick="@{() -> viewModel.toggleNetworkExpand()}"
android:id="@+id/network"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_marginStart="26dp"
android:layout_marginEnd="26dp"
android:layout_marginTop="16dp"
android:text="@string/settings_network_title"
android:drawableEnd="@{viewModel.expandNetwork ? @drawable/caret_up : @drawable/caret_down, default=@drawable/caret_up}"
android:drawableTint="@color/gray_9"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/calls_background"/>
<ImageView
android:id="@+id/network_background"
android:visibility="@{viewModel.expandNetwork ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginStart="17dp"
android:layout_marginEnd="17dp"
android:src="@drawable/shape_squircle_gray_2_background"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/network"
app:layout_constraintBottom_toBottomOf="@id/network_bottom_anchor"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_700"
android:onClick="@{() -> viewModel.toggleEnableVideo()}"
android:id="@+id/wifi_only_title"
android:visibility="@{viewModel.expandNetwork ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_network_use_wifi_only"
android:textSize="13sp"
android:textColor="@color/gray_1"
android:maxLines="2"
android:ellipsize="end"
app:layout_constraintTop_toTopOf="@id/wifi_only_switch"
app:layout_constraintBottom_toBottomOf="@id/wifi_only_switch"
app:layout_constraintStart_toStartOf="@id/network_background"
app:layout_constraintEnd_toStartOf="@id/wifi_only_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
android:id="@+id/wifi_only_switch"
android:onClick="@{() -> viewModel.toggleUseWifiOnly()}"
android:visibility="@{viewModel.expandNetwork ? View.VISIBLE : View.GONE}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="21dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.useWifiOnly}"
app:layout_constraintEnd_toEndOf="@id/network_background"
app:layout_constraintTop_toTopOf="@id/network_background" />
<View
android:id="@+id/network_bottom_anchor"
android:visibility="@{viewModel.expandNetwork ? View.VISIBLE : View.GONE}"
android:layout_width="1dp"
android:layout_height="1dp"
android:layout_marginTop="21dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/wifi_only_switch"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:onClick="@{() -> viewModel.toggleUserInterfaceExpand()}"
android:id="@+id/user_interface"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_marginStart="26dp"
android:layout_marginEnd="26dp"
android:layout_marginTop="16dp"
android:text="@string/settings_user_interface_title"
android:drawableEnd="@{viewModel.expandUserInterface ? @drawable/caret_up : @drawable/caret_down, default=@drawable/caret_up}"
android:drawableTint="@color/gray_9"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/network_background"/>
<ImageView
android:id="@+id/user_interface_background"
android:visibility="@{viewModel.expandUserInterface ? View.VISIBLE : View.GONE}"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="8dp"
android:layout_marginStart="17dp"
android:layout_marginEnd="17dp"
android:src="@drawable/shape_squircle_gray_2_background"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/user_interface"
app:layout_constraintBottom_toBottomOf="@id/user_interface_bottom_anchor"/>
<View
android:id="@+id/user_interface_bottom_anchor"
android:visibility="@{viewModel.expandUserInterface ? View.VISIBLE : View.GONE}"
android:layout_width="1dp"
android:layout_height="1dp"
android:layout_marginTop="21dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/network_bottom_anchor"/>
<androidx.appcompat.widget.AppCompatTextView
style="@style/default_text_style_800"
android:id="@+id/advanced_settings"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="5dp"
android:layout_marginStart="26dp"
android:layout_marginEnd="26dp"
android:layout_marginTop="16dp"
android:text="@string/settings_advanced_title"
android:drawableEnd="@drawable/caret_right"
android:drawableTint="@color/gray_9"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/user_interface"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</layout>

View file

@ -15,7 +15,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="@dimen/in_call_main_actions_menu_height"
android:paddingBottom="15dp"
android:paddingBottom="5dp"
android:background="@color/in_call_black">
<com.google.android.material.bottomsheet.BottomSheetDragHandleView
@ -23,7 +23,7 @@
android:visibility="@{showExpandToggle ? View.VISIBLE : View.INVISIBLE}"
android:id="@+id/toggle_expand"
android:layout_width="0dp"
android:layout_height="@dimen/icon_size"
android:layout_height="wrap_content"
android:src="@{viewModel.isActionsMenuExpanded ? @drawable/caret_down : @drawable/caret_up, default=@drawable/caret_up}"
app:tint="@color/white"
app:layout_constraintStart_toStartOf="parent"

View file

@ -24,7 +24,7 @@
<color name="gradient_start">#EEF7F8</color>
<color name="gray_1">#6C7A87</color>0xFF
<color name="gray_1">#6C7A87</color>
<color name="gray_2">#F9F9F9</color>
<color name="gray_3">#EEF6F8</color>
<color name="gray_4">#949494</color>

View file

@ -138,6 +138,23 @@
<string name="help_advanced_debug_logs_url_copied_into_clipboard_toast_message">Debug logs URL copied into clipboard</string>
<string name="help_advanced_debug_logs_upload_error_toast_message">Failed to upload debug logs</string>
<string name="settings_calls_title">Calls</string>
<string name="settings_calls_echo_canceller_title">Use echo canceller</string>
<string name="settings_calls_echo_canceller_subtitle">Prevents echo from being heard by remote end</string>
<string name="settings_calls_route_audio_to_bluetooth_title">Route audio to bluetooth device, if any</string>
<string name="settings_calls_enable_video_title">Enable video</string>
<string name="settings_calls_auto_initiate_video_title">Start video calls</string>
<string name="settings_calls_auto_initiate_video_subtitle">Always initiate calls as video</string>
<string name="settings_calls_auto_accept_video_title">Accept video calls</string>
<string name="settings_calls_auto_accept_video_subtitle">Always accept video calls</string>
<string name="settings_calls_use_device_ringtone_title">Use this device\'s ringtone</string>
<string name="settings_calls_vibrate_while_ringing_title">Vibrate while incoming call is ringing</string>
<string name="settings_calls_auto_record_title">Automatically start recording calls</string>
<string name="settings_network_title">Network</string>
<string name="settings_network_use_wifi_only">Use only Wi-Fi networks</string>
<string name="settings_user_interface_title">User interface</string>
<string name="settings_advanced_title">Advanced settings</string>
<string name="manage_account_title">Manage account</string>
<string name="manage_account_details_title">Details</string>
<string name="manage_account_add_picture">Add a picture</string>