Added numpad

This commit is contained in:
Sylvain Berfini 2023-08-30 11:46:16 +02:00
parent 3201655870
commit 973afe08c5
33 changed files with 436 additions and 46 deletions

View file

@ -100,7 +100,7 @@ dependencies {
// https://github.com/tommybuonomo/dotsindicator/blob/master/LICENSE Apache v2.0
implementation("com.tbuonomo:dotsindicator:5.0")
implementation platform('com.google.firebase:firebase-bom:30.3.2')
implementation platform('com.google.firebase:firebase-bom:32.2.3')
implementation 'com.google.firebase:firebase-messaging'
implementation 'org.linphone:linphone-sdk-android:5.3+'

View file

@ -43,6 +43,9 @@ import org.linphone.ui.main.contacts.viewmodel.ContactsListViewModel
import org.linphone.ui.main.fragment.GenericFragment
import org.linphone.ui.main.model.isInSecureMode
import org.linphone.utils.DialogUtils
import org.linphone.utils.hideKeyboard
import org.linphone.utils.setKeyboardInsetListener
import org.linphone.utils.showKeyboard
@UiThread
class StartCallFragment : GenericFragment() {
@ -103,6 +106,10 @@ class StartCallFragment : GenericFragment() {
goBack()
}
binding.setHideNumpadClickListener {
viewModel.hideNumpad()
}
contactsAdapter = ContactsListAdapter(viewLifecycleOwner, disableLongClick = true)
binding.contactsList.setHasFixedSize(true)
binding.contactsList.adapter = contactsAdapter
@ -140,6 +147,32 @@ class StartCallFragment : GenericFragment() {
contactsListViewModel.applyFilter(filter)
viewModel.applyFilter(filter)
}
viewModel.appendDigitToSearchBarEvent.observe(viewLifecycleOwner) {
it.consume { digit ->
val newValue = "${binding.searchBar.text}$digit"
binding.searchBar.setText(newValue)
binding.searchBar.setSelection(newValue.length)
}
}
viewModel.requestKeyboardVisibilityChangedEvent.observe(viewLifecycleOwner) {
it.consume { show ->
if (show) {
// To automatically open keyboard
binding.searchBar.showKeyboard(requireActivity().window)
} else {
binding.searchBar.requestFocus()
binding.searchBar.hideKeyboard()
}
}
}
binding.root.setKeyboardInsetListener { keyboardVisible ->
if (keyboardVisible) {
viewModel.isNumpadVisible.value = false
}
}
}
private fun startCall(model: ContactAvatarModel) {

View file

@ -0,0 +1,50 @@
/*
* 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.calls.model
import androidx.annotation.UiThread
import org.linphone.core.tools.Log
class NumpadModel @UiThread constructor(
private val onDigitClicked: (value: String) -> (Unit),
private val onCallClicked: () -> (Unit)
) {
companion object {
private const val TAG = "[Numpad Model]"
}
@UiThread
fun onDigitClicked(value: String) {
Log.i("$TAG Clicked on digit [$value]")
onDigitClicked.invoke(value)
}
fun onDigitLongClicked(value: String): Boolean {
Log.i("$TAG Long clicked on digit [$value]")
onDigitClicked.invoke(value)
return true
}
@UiThread
fun onCallClicked() {
Log.i("$TAG Starting call")
onCallClicked.invoke()
}
}

View file

@ -33,6 +33,7 @@ import org.linphone.core.MagicSearch
import org.linphone.core.MagicSearchListenerStub
import org.linphone.core.SearchResult
import org.linphone.core.tools.Log
import org.linphone.ui.main.calls.model.NumpadModel
import org.linphone.ui.main.calls.model.SuggestionModel
import org.linphone.ui.main.model.isInSecureMode
import org.linphone.utils.Event
@ -49,6 +50,18 @@ class StartCallViewModel @UiThread constructor() : ViewModel() {
val suggestionsList = MutableLiveData<ArrayList<SuggestionModel>>()
val numpadModel: NumpadModel
val isNumpadVisible = MutableLiveData<Boolean>()
val appendDigitToSearchBarEvent: MutableLiveData<Event<String>> by lazy {
MutableLiveData<Event<String>>()
}
val requestKeyboardVisibilityChangedEvent: MutableLiveData<Event<Boolean>> by lazy {
MutableLiveData<Event<Boolean>>()
}
val onSuggestionClickedEvent: MutableLiveData<Event<Address>> by lazy {
MutableLiveData<Event<Address>>()
}
@ -81,6 +94,31 @@ class StartCallViewModel @UiThread constructor() : ViewModel() {
}
init {
isNumpadVisible.value = false
numpadModel = NumpadModel(
{ digit ->
// onDigitClicked
appendDigitToSearchBarEvent.value = Event(digit)
// Don't do that, cursor will stay at start
// searchFilter.value = "${searchFilter.value.orEmpty()}$digit"
},
{ // OnCallClicked
val suggestion = searchFilter.value.orEmpty()
if (suggestion.isNotEmpty()) {
Log.i("$TAG Using numpad dial button to call [$suggestion]")
coreContext.postOnCoreThread { core ->
val address = core.interpretUrl(suggestion, true)
if (address != null) {
Log.i("$TAG Calling [${address.asStringUriOnly()}]")
onSuggestionClickedEvent.postValue(Event(address))
} else {
Log.e("$TAG Failed to parse [$suggestion] as SIP address")
}
}
}
}
)
coreContext.postOnCoreThread { core ->
val defaultAccount = core.defaultAccount
limitSearchToLinphoneAccounts = defaultAccount?.isInSecureMode() ?: false
@ -108,6 +146,17 @@ class StartCallViewModel @UiThread constructor() : ViewModel() {
searchFilter.value = ""
}
@UiThread
fun switchBetweenKeyboardAndNumpad() {
requestKeyboardVisibilityChangedEvent.value = Event(isNumpadVisible.value == true)
isNumpadVisible.value = isNumpadVisible.value == false
}
@UiThread
fun hideNumpad() {
isNumpadVisible.value = false
}
@WorkerThread
fun processMagicSearchResults(results: Array<SearchResult>) {
Log.i("$TAG Processing [${results.size}] results")

View file

@ -40,6 +40,7 @@ import androidx.core.view.doOnLayout
import androidx.databinding.BindingAdapter
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.lifecycle.LifecycleOwner
import coil.load
import coil.transform.CircleCropTransformation
import io.getstream.avatarview.AvatarView
@ -120,7 +121,7 @@ fun View.setKeyboardInsetListener(lambda: (visible: Boolean) -> Unit) {
lambda(isKeyboardVisible)
} catch (ise: IllegalStateException) {
Log.e(
"[Databinding Utils] Failed to called lambda after keyboard visibility changed: $ise"
"[Data Binding Utils] Failed to called lambda after keyboard visibility changed: $ise"
)
}
@ -137,7 +138,7 @@ fun View.setKeyboardInsetListener(lambda: (visible: Boolean) -> Unit) {
lambda(isKeyboardVisible)
} catch (ise: IllegalStateException) {
Log.e(
"[Databinding Utils] Failed to called lambda after keyboard visibility changed: $ise"
"[Data Binding Utils] Failed to called lambda after keyboard visibility changed: $ise"
)
}
}
@ -284,3 +285,12 @@ fun setConstraintLayoutBottomMargin(view: View, margins: Float) {
params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, m)
view.layoutParams = params
}
@BindingAdapter("inflatedLifecycleOwner")
fun setInflatedViewStubLifecycleOwner(view: View, enable: Boolean) {
val binding = DataBindingUtil.bind<ViewDataBinding>(view)
// This is a bit hacky...
if (view.context is LifecycleOwner) {
binding?.lifecycleOwner = view.context as? LifecycleOwner
}
}

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="oval">
<size android:width="70dp" android:height="70dp" />
<solid android:color="@color/green_online"/>
</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">
<size android:width="75dp" android:height="5dp" />
<corners android:radius="5dp"/>
<solid android:color="@color/drawer_handle"/>
</shape>

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:topRightRadius="20dp" android:topLeftRadius="20dp" />
<solid android:color="@color/gray_7"/>
</shape>

View file

@ -47,7 +47,7 @@
<ImageView
android:onClick="@{menuClickListener}"
android:id="@+id/menu"
android:layout_width="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="0dp"
android:layout_marginEnd="9dp"
android:src="@drawable/dots_three_vertical"

View file

@ -51,7 +51,7 @@
<ImageView
android:onClick="@{filterClickListener}"
android:id="@+id/filter"
android:layout_width="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="0dp"
android:layout_marginEnd="9dp"
android:src="@drawable/funnel"

View file

@ -108,7 +108,7 @@
<ImageView
android:onClick="@{() -> model.openMenu(menu)}"
android:id="@+id/menu"
android:layout_width="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="0dp"
android:layout_marginEnd="16dp"
android:src="@drawable/dots_three_vertical"

View file

@ -32,8 +32,8 @@
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:layout_width="24dp"
android:layout_height="24dp"
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"
@ -120,7 +120,7 @@
<ImageView
android:onClick="@{() -> viewModel.toggleShowPassword()}"
android:id="@+id/eye"
android:layout_width="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="0dp"
android:padding="4dp"
android:layout_marginEnd="20dp"

View file

@ -33,8 +33,8 @@
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:layout_width="24dp"
android:layout_height="24dp"
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"

View file

@ -25,8 +25,8 @@
<ImageView
android:onClick="@{backClickListener}"
android:id="@+id/back"
android:layout_width="24dp"
android:layout_height="24dp"
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"

View file

@ -25,7 +25,7 @@
<ImageView
android:id="@+id/back"
android:layout_width="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="0dp"
android:layout_marginStart="10dp"
android:adjustViewBounds="true"
@ -54,7 +54,7 @@
<ImageView
android:onClick="@{menuClickListener}"
android:id="@+id/menu"
android:layout_width="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="0dp"
android:layout_marginEnd="10dp"
android:src="@drawable/dots_three_vertical"

View file

@ -102,8 +102,8 @@
<ImageView
android:onClick="@{onCallClickListener}"
android:id="@+id/call"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="6dp"
android:src="@drawable/phone"
app:tint="@color/gray_1"

View file

@ -1,13 +1,16 @@
<?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">
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:bind="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="backClickListener"
type="View.OnClickListener" />
<variable
name="hideNumpadClickListener"
type="View.OnClickListener" />
<variable
name="viewModel"
type="org.linphone.ui.main.calls.viewmodel.StartCallViewModel" />
@ -16,7 +19,7 @@
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white">
android:background="@color/gray_7">
<ImageView
android:id="@+id/back"
@ -51,7 +54,7 @@
android:id="@+id/background"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/gray_7"
android:background="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@ -81,10 +84,23 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/title" />
<ImageView
android:id="@+id/numpad"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="15dp"
android:onClick="@{() -> viewModel.switchBetweenKeyboardAndNumpad()}"
android:src="@{viewModel.isNumpadVisible ? @drawable/keyboard : @drawable/numpad, default=@drawable/numpad}"
android:visibility="@{viewModel.searchFilter.length() == 0 ? View.VISIBLE : View.GONE}"
app:layout_constraintBottom_toBottomOf="@id/search_bar"
app:layout_constraintEnd_toEndOf="@id/search_bar"
app:layout_constraintTop_toTopOf="@id/search_bar"
app:tint="@color/gray_9" />
<ImageView
android:id="@+id/clear_field"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="15dp"
android:onClick="@{() -> viewModel.clearFilter()}"
android:src="@drawable/x"
@ -226,6 +242,20 @@
app:layout_constraintTop_toBottomOf="@id/suggestions_label"
app:layout_constraintBottom_toBottomOf="parent" />
<ViewStub
android:id="@+id/numpad_layout"
android:inflatedId="@+id/numpad_inflated"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout="@layout/call_start_numpad"
android:visibility="@{viewModel.isNumpadVisible ? View.VISIBLE : View.GONE}"
inflatedVisibility="@{viewModel.isNumpadVisible ? View.VISIBLE : View.GONE}"
handleClickedListener="@{hideNumpadClickListener}"
model="@{viewModel.numpadModel}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -0,0 +1,191 @@
<?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="handleClickedListener"
type="View.OnClickListener" />
<variable
name="model"
type="org.linphone.ui.main.calls.model.NumpadModel" />
<variable
name="inflatedVisibility"
type="Integer" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_numpad_background"
android:visibility="@{inflatedVisibility}"
inflatedLifecycleOwner="@{true}"
android:clickable="true"
android:focusable="true">
<ImageView
android:id="@+id/handle"
android:onClick="@{handleClickedListener}"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:padding="11dp"
android:src="@drawable/shape_drawer_handle"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
<androidx.constraintlayout.helper.widget.Flow
android:id="@+id/flow"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="14dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/handle"
app:flow_horizontalStyle="spread"
app:flow_wrapMode="aligned"
app:flow_verticalGap="16dp"
app:flow_maxElementsWrap="3"
app:constraint_referenced_ids="digit_1, digit_2, digit_3, digit_4, digit_5, digit_6, digit_7, digit_8, digit_9, digit_star, digit_0, digit_sharp" />
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`1`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`2`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`3`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`4`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="4"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`5`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`6`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="6"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`7`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="7"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`8`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="8"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`9`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="9"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`*`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_star"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="*"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`0`)}"
android:onLongClick="@{() -> model.onDigitLongClicked(`+`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<androidx.appcompat.widget.AppCompatTextView
android:onClick="@{() -> model.onDigitClicked(`#`)}"
style="@style/call_start_numpad_digits_style"
android:id="@+id/digit_sharp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#"
app:layout_constraintTop_toBottomOf="@id/handle"
app:layout_constraintStart_toStartOf="parent"/>
<ImageView
android:id="@+id/call"
android:onClick="@{() -> model.onCallClicked()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="21dp"
android:src="@drawable/phone"
android:padding="15dp"
android:elevation="3dp"
android:background="@drawable/shape_circle_green_background"
app:tint="@color/white"
app:layout_constraintTop_toBottomOf="@id/flow"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View file

@ -47,7 +47,7 @@
<ImageView
android:onClick="@{menuClickListener}"
android:id="@+id/menu"
android:layout_width="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="0dp"
android:layout_marginEnd="9dp"
android:src="@drawable/dots_three_vertical"

View file

@ -36,7 +36,7 @@
<ImageView
android:id="@+id/avatar"
android:layout_width="wrap_content"
android:layout_height="24dp"
android:layout_height="@dimen/icon_size"
android:adjustViewBounds="true"
android:src="@drawable/contact_avatar"
coilContact="@{data.contactData}"

View file

@ -44,8 +44,8 @@
<ImageView
android:id="@+id/trusted"
android:visibility="@{model.trusted ? View.VISIBLE : View.GONE}"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="10dp"
android:src="@drawable/trusted"
app:layout_constraintTop_toTopOf="parent"

View file

@ -55,8 +55,8 @@
android:onClick="@{() -> model.remove()}"
android:id="@+id/remove"
android:visibility="@{model.showRemoveButton ? View.VISIBLE : View.INVISIBLE, default=invisible}"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="16dp"
android:src="@drawable/x"
app:tint="@color/gray_8"

View file

@ -41,7 +41,7 @@
<ImageView
android:onClick="@{filterClickListener}"
android:id="@+id/filter"
android:layout_width="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="0dp"
android:layout_marginEnd="9dp"
android:src="@drawable/funnel"

View file

@ -32,8 +32,8 @@
<ImageView
android:id="@+id/toast_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:adjustViewBounds="true"
android:src="@{icon, default=@drawable/trusted}"
app:layout_constraintBottom_toBottomOf="parent"

View file

@ -32,8 +32,8 @@
<ImageView
android:id="@+id/toast_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:adjustViewBounds="true"
android:src="@{icon, default=@drawable/check_fat_fill}"
app:layout_constraintBottom_toBottomOf="parent"

View file

@ -32,8 +32,8 @@
<ImageView
android:id="@+id/toast_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:adjustViewBounds="true"
android:src="@{icon, default=@drawable/wifi_low}"
app:layout_constraintBottom_toBottomOf="parent"

View file

@ -17,8 +17,8 @@
<ImageView
android:id="@+id/call_direction_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginStart="10dp"
android:adjustViewBounds="true"
android:visibility="@{viewModel.fullScreenMode ? View.GONE : View.VISIBLE}"

View file

@ -24,7 +24,7 @@
android:visibility="@{showExpandToggle ? View.VISIBLE : View.INVISIBLE}"
android:id="@+id/toggle_expand"
android:layout_width="0dp"
android:layout_height="24dp"
android:layout_height="@dimen/icon_size"
android:layout_marginBottom="15dp"
android:src="@{viewModel.isActionsMenuExpanded ? @drawable/caret_down : @drawable/caret_up, default=@drawable/caret_up}"
app:tint="@color/white"

View file

@ -17,8 +17,8 @@
<ImageView
android:id="@+id/call_direction_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginStart="10dp"
android:adjustViewBounds="true"
android:src="@drawable/incoming_call"

View file

@ -17,8 +17,8 @@
<ImageView
android:id="@+id/call_direction_icon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginStart="10dp"
android:adjustViewBounds="true"
android:src="@drawable/outgoing_call"
@ -44,8 +44,8 @@
<ImageView
android:onClick="@{() -> viewModel.switchCamera()}"
android:id="@+id/switch_camera"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_width="@dimen/icon_size"
android:layout_height="@dimen/icon_size"
android:layout_marginEnd="10dp"
android:adjustViewBounds="true"
android:src="@drawable/camera_rotate"

View file

@ -19,6 +19,7 @@
<color name="warning_orange_background">#FFEACB</color>
<color name="warning_orange_pressed_background">#FFB266</color>
<color name="dialog_background">#22334D</color>
<color name="drawer_handle">#C0D1D9</color>
<color name="gradient_start">#EEF7F8</color>

View file

@ -8,6 +8,8 @@
<dimen name="sliding_pane_left_fragment_with_nav_width">355dp</dimen>
<dimen name="sliding_pane_right_fragment_width">300dp</dimen>
<dimen name="icon_size">24dp</dimen>
<dimen name="avatar_list_cell_size">45dp</dimen>
<dimen name="avatar_favorite_list_cell_size">50dp</dimen>
<dimen name="avatar_big_size">100dp</dimen>

View file

@ -50,6 +50,14 @@
<item name="android:drawableTint">@color/red_danger</item>
<item name="android:drawablePadding">8dp</item>
</style>
<style name="call_start_numpad_digits_style">
<item name="android:fontFamily">@font/noto_sans</item>
<item name="android:textColor">@color/gray_9</item>
<item name="android:textSize">32sp</item>
<item name="android:gravity">center</item>
<item name="android:elevation">3dp</item>
<item name="android:background">@drawable/shape_circle_white_background</item>
</style>
<style name="in_call_extra_action_label_style">
<item name="android:fontFamily">@font/noto_sans</item>
<item name="android:textSize">14sp</item>