mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-01-17 11:28:06 +00:00
Added numpad
This commit is contained in:
parent
3201655870
commit
973afe08c5
33 changed files with 436 additions and 46 deletions
|
|
@ -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+'
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
6
app/src/main/res/drawable/shape_drawer_handle.xml
Normal file
6
app/src/main/res/drawable/shape_drawer_handle.xml
Normal 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>
|
||||
5
app/src/main/res/drawable/shape_numpad_background.xml
Normal file
5
app/src/main/res/drawable/shape_numpad_background.xml
Normal 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>
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
191
app/src/main/res/layout/call_start_numpad.xml
Normal file
191
app/src/main/res/layout/call_start_numpad.xml
Normal 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>
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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}"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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}"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue