summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKamaljeet Maini <kmaini@cyngn.com>2016-04-22 14:43:25 -0700
committerKamaljeet Maini <kmaini@cyngn.com>2016-05-05 16:55:10 -0700
commitf023f97370cfbe775a1fab04da3699e0f82c066b (patch)
tree06bf876c8db986469aac7e1deb28126734331cc1
parent24250966360cb48fc8ed64224ea67a03f34454b6 (diff)
downloadpackages_apps_InCallUI-f023f97370cfbe775a1fab04da3699e0f82c066b.tar.gz
packages_apps_InCallUI-f023f97370cfbe775a1fab04da3699e0f82c066b.tar.bz2
packages_apps_InCallUI-f023f97370cfbe775a1fab04da3699e0f82c066b.zip
Add new options for call waiting response in InCallUI
When an incoming call is received while there is already an active call, the user will be given four choices for the response: 1) Left button: hold the current call and answer incoming call 2) Bottom button: end the current call and answer the incoming call 3) Right button: decline the incoming call 4) Top button: Send a text message to the incoming caller if texting is enabled The changes in this component include updated icon graphics, display of text hints, and new APIs for additonal flag. Change-Id: Ic97e0fde12ae98afa0124f4bb5326e874a146e91
-rw-r--r--res/drawable-hdpi/ic_call_end_16dp.pngbin0 -> 316 bytes
-rw-r--r--res/drawable-hdpi/ic_pause_16dp.pngbin0 -> 159 bytes
-rw-r--r--res/drawable-mdpi/ic_call_end_16dp.pngbin0 -> 243 bytes
-rw-r--r--res/drawable-mdpi/ic_pause_16dp.pngbin0 -> 178 bytes
-rw-r--r--res/drawable-xhdpi/ic_call_end_16dp.pngbin0 -> 351 bytes
-rw-r--r--res/drawable-xhdpi/ic_pause_16dp.pngbin0 -> 159 bytes
-rw-r--r--res/drawable-xxhdpi/ic_call_end_16dp.pngbin0 -> 455 bytes
-rw-r--r--res/drawable-xxhdpi/ic_pause_16dp.pngbin0 -> 161 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_call_end_16dp.pngbin0 -> 584 bytes
-rw-r--r--res/drawable-xxxhdpi/ic_pause_16dp.pngbin0 -> 163 bytes
-rw-r--r--res/drawable/ic_lockscreen_answer_activated_layer.xml15
-rw-r--r--res/drawable/ic_lockscreen_answer_end_current.xml27
-rw-r--r--res/drawable/ic_lockscreen_answer_end_current_activated_layer.xml28
-rw-r--r--res/drawable/ic_lockscreen_answer_end_current_normal_layer.xml37
-rw-r--r--res/drawable/ic_lockscreen_answer_hold_current.xml27
-rw-r--r--res/drawable/ic_lockscreen_answer_hold_current_activated_layer.xml28
-rw-r--r--res/drawable/ic_lockscreen_answer_hold_current_normal_layer.xml37
-rw-r--r--res/drawable/ic_lockscreen_answer_normal_layer.xml16
-rw-r--r--res/drawable/ic_lockscreen_block_activated_layer.xml13
-rw-r--r--res/drawable/ic_lockscreen_block_normal_layer.xml20
-rw-r--r--res/drawable/ic_lockscreen_decline_activated_layer.xml13
-rw-r--r--res/drawable/ic_lockscreen_decline_normal_layer.xml17
-rw-r--r--res/drawable/ic_lockscreen_decline_small_layer.xml36
-rw-r--r--res/drawable/ic_lockscreen_hold_small_layer.xml36
-rw-r--r--res/drawable/ic_lockscreen_text_activated_layer.xml19
-rw-r--r--res/drawable/ic_lockscreen_text_normal_layer.xml14
-rw-r--r--res/layout/answer_fragment.xml1
-rw-r--r--res/values/array.xml90
-rw-r--r--res/values/attrs.xml3
-rw-r--r--res/values/cm_colors.xml10
-rw-r--r--res/values/cm_dimens.xml13
-rw-r--r--res/values/cm_strings.xml15
-rw-r--r--src/com/android/incallui/AnswerFragment.java51
-rw-r--r--src/com/android/incallui/AnswerPresenter.java33
-rw-r--r--src/com/android/incallui/GlowPadWrapper.java12
-rw-r--r--src/com/android/incallui/TelecomAdapter.java9
-rw-r--r--src/com/android/incallui/widget/multiwaveview/GlowPadView.java81
37 files changed, 630 insertions, 71 deletions
diff --git a/res/drawable-hdpi/ic_call_end_16dp.png b/res/drawable-hdpi/ic_call_end_16dp.png
new file mode 100644
index 00000000..f049c3ab
--- /dev/null
+++ b/res/drawable-hdpi/ic_call_end_16dp.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pause_16dp.png b/res/drawable-hdpi/ic_pause_16dp.png
new file mode 100644
index 00000000..bda48634
--- /dev/null
+++ b/res/drawable-hdpi/ic_pause_16dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_call_end_16dp.png b/res/drawable-mdpi/ic_call_end_16dp.png
new file mode 100644
index 00000000..0ccf67a9
--- /dev/null
+++ b/res/drawable-mdpi/ic_call_end_16dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pause_16dp.png b/res/drawable-mdpi/ic_pause_16dp.png
new file mode 100644
index 00000000..3d58e3b7
--- /dev/null
+++ b/res/drawable-mdpi/ic_pause_16dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_call_end_16dp.png b/res/drawable-xhdpi/ic_call_end_16dp.png
new file mode 100644
index 00000000..aad29a86
--- /dev/null
+++ b/res/drawable-xhdpi/ic_call_end_16dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pause_16dp.png b/res/drawable-xhdpi/ic_pause_16dp.png
new file mode 100644
index 00000000..ae2617f3
--- /dev/null
+++ b/res/drawable-xhdpi/ic_pause_16dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_call_end_16dp.png b/res/drawable-xxhdpi/ic_call_end_16dp.png
new file mode 100644
index 00000000..0d0f3130
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_call_end_16dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pause_16dp.png b/res/drawable-xxhdpi/ic_pause_16dp.png
new file mode 100644
index 00000000..1d6eaf50
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_pause_16dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_call_end_16dp.png b/res/drawable-xxxhdpi/ic_call_end_16dp.png
new file mode 100644
index 00000000..3ed18ece
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_call_end_16dp.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/ic_pause_16dp.png b/res/drawable-xxxhdpi/ic_pause_16dp.png
new file mode 100644
index 00000000..f27c7be6
--- /dev/null
+++ b/res/drawable-xxxhdpi/ic_pause_16dp.png
Binary files differ
diff --git a/res/drawable/ic_lockscreen_answer_activated_layer.xml b/res/drawable/ic_lockscreen_answer_activated_layer.xml
index c615295e..e06fdb69 100644
--- a/res/drawable/ic_lockscreen_answer_activated_layer.xml
+++ b/res/drawable/ic_lockscreen_answer_activated_layer.xml
@@ -14,12 +14,15 @@
limitations under the License.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/fab_blue" />
+
<item>
- <bitmap
- android:gravity="center"
- android:src="@drawable/fab_ic_call"
- android:tint="@color/glowpad_widget_active_color"
- android:autoMirrored="true" />
+ <shape
+ android:shape="ring"
+ android:innerRadius="@dimen/incoming_call_widget_ring_inner_radius"
+ android:thickness="@dimen/incoming_call_widget_ring_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_activated_ring"/>
+ </shape>
</item>
+ <item android:drawable="@drawable/ic_lockscreen_answer_normal_layer" />
</layer-list>
diff --git a/res/drawable/ic_lockscreen_answer_end_current.xml b/res/drawable/ic_lockscreen_answer_end_current.xml
new file mode 100644
index 00000000..e00afb52
--- /dev/null
+++ b/res/drawable/ic_lockscreen_answer_end_current.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The CyanogenMod Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_end_current_normal_layer"/>
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_end_current_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_answer_end_current_activated_layer" />
+</selector>
diff --git a/res/drawable/ic_lockscreen_answer_end_current_activated_layer.xml b/res/drawable/ic_lockscreen_answer_end_current_activated_layer.xml
new file mode 100644
index 00000000..9469a37c
--- /dev/null
+++ b/res/drawable/ic_lockscreen_answer_end_current_activated_layer.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The CyanogenMod Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape
+ android:shape="ring"
+ android:innerRadius="@dimen/incoming_call_widget_ring_inner_radius"
+ android:thickness="@dimen/incoming_call_widget_ring_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_activated_ring"/>
+ </shape>
+ </item>
+ <item android:drawable="@drawable/ic_lockscreen_answer_end_current_normal_layer" />
+</layer-list>
diff --git a/res/drawable/ic_lockscreen_answer_end_current_normal_layer.xml b/res/drawable/ic_lockscreen_answer_end_current_normal_layer.xml
new file mode 100644
index 00000000..4c53b3aa
--- /dev/null
+++ b/res/drawable/ic_lockscreen_answer_end_current_normal_layer.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The CyanogenMod Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape
+ android:shape="ring"
+ android:innerRadius="0dp"
+ android:thickness="@dimen/incoming_call_widget_circle_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_answer_circle"/>
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_call_white_24dp"
+ android:tint="@color/incoming_call_widget_bitmap"
+ android:autoMirrored="true" />
+ </item>
+ <item android:top="@dimen/incoming_call_widget_small_circle_top_offset"
+ android:left="@dimen/incoming_call_widget_small_circle_left_offset"
+ android:drawable="@drawable/ic_lockscreen_decline_small_layer" />
+</layer-list>
diff --git a/res/drawable/ic_lockscreen_answer_hold_current.xml b/res/drawable/ic_lockscreen_answer_hold_current.xml
new file mode 100644
index 00000000..b96936c2
--- /dev/null
+++ b/res/drawable/ic_lockscreen_answer_hold_current.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The CyanogenMod Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_hold_current_normal_layer"/>
+ <item
+ android:state_enabled="true" android:state_active="true" android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_answer_hold_current_activated_layer" />
+ <item
+ android:state_enabled="true" android:state_active="false" android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_answer_hold_current_activated_layer" />
+</selector>
diff --git a/res/drawable/ic_lockscreen_answer_hold_current_activated_layer.xml b/res/drawable/ic_lockscreen_answer_hold_current_activated_layer.xml
new file mode 100644
index 00000000..7ea65294
--- /dev/null
+++ b/res/drawable/ic_lockscreen_answer_hold_current_activated_layer.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The CyanogenMod Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape
+ android:shape="ring"
+ android:innerRadius="@dimen/incoming_call_widget_ring_inner_radius"
+ android:thickness="@dimen/incoming_call_widget_ring_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_activated_ring"/>
+ </shape>
+ </item>
+ <item android:drawable="@drawable/ic_lockscreen_answer_hold_current_normal_layer" />
+</layer-list>
diff --git a/res/drawable/ic_lockscreen_answer_hold_current_normal_layer.xml b/res/drawable/ic_lockscreen_answer_hold_current_normal_layer.xml
new file mode 100644
index 00000000..662f0d97
--- /dev/null
+++ b/res/drawable/ic_lockscreen_answer_hold_current_normal_layer.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The CyanogenMod Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape
+ android:shape="ring"
+ android:innerRadius="0dp"
+ android:thickness="@dimen/incoming_call_widget_circle_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_answer_circle"/>
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_call_white_24dp"
+ android:tint="@color/incoming_call_widget_bitmap"
+ android:autoMirrored="true" />
+ </item>
+ <item android:top="@dimen/incoming_call_widget_small_circle_top_offset"
+ android:left="@dimen/incoming_call_widget_small_circle_left_offset"
+ android:drawable="@drawable/ic_lockscreen_hold_small_layer" />
+</layer-list>
diff --git a/res/drawable/ic_lockscreen_answer_normal_layer.xml b/res/drawable/ic_lockscreen_answer_normal_layer.xml
index 31b884f9..1bd7cfdd 100644
--- a/res/drawable/ic_lockscreen_answer_normal_layer.xml
+++ b/res/drawable/ic_lockscreen_answer_normal_layer.xml
@@ -14,20 +14,20 @@
limitations under the License.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- A fake circle to fix the size of this layer asset. -->
<item>
- <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
- <solid android:color="#00000000"/>
- <size
- android:width="@dimen/incoming_call_widget_circle_size"
- android:height="@dimen/incoming_call_widget_circle_size" />
+ <shape
+ android:shape="ring"
+ android:innerRadius="0dp"
+ android:thickness="@dimen/incoming_call_widget_circle_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_answer_circle"/>
</shape>
</item>
<item>
<bitmap
android:gravity="center"
- android:src="@drawable/fab_ic_call"
- android:tint="@color/glowpad_call_widget_normal_tint"
+ android:src="@drawable/ic_call_white_24dp"
+ android:tint="@color/incoming_call_widget_bitmap"
android:autoMirrored="true" />
</item>
</layer-list>
diff --git a/res/drawable/ic_lockscreen_block_activated_layer.xml b/res/drawable/ic_lockscreen_block_activated_layer.xml
index 12d12c48..64029aa5 100644
--- a/res/drawable/ic_lockscreen_block_activated_layer.xml
+++ b/res/drawable/ic_lockscreen_block_activated_layer.xml
@@ -14,11 +14,14 @@
limitations under the License.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/fab_red" />
<item>
- <bitmap
- android:gravity="center"
- android:src="@drawable/ic_do_not_disturb_alt_white_24dp"
- android:tint="@color/glowpad_widget_active_color" />
+ <shape
+ android:shape="ring"
+ android:innerRadius="@dimen/incoming_call_widget_ring_inner_radius"
+ android:thickness="@dimen/incoming_call_widget_ring_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_activated_ring"/>
+ </shape>
</item>
+ <item android:drawable="@drawable/ic_lockscreen_block_normal_layer" />
</layer-list>
diff --git a/res/drawable/ic_lockscreen_block_normal_layer.xml b/res/drawable/ic_lockscreen_block_normal_layer.xml
index c42ea64c..0606286a 100644
--- a/res/drawable/ic_lockscreen_block_normal_layer.xml
+++ b/res/drawable/ic_lockscreen_block_normal_layer.xml
@@ -13,21 +13,25 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
+
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- A fake circle to fix the size of this layer asset. -->
<item>
- <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
- <solid android:color="#00000000"/>
- <size
- android:width="@dimen/incoming_call_widget_circle_size"
- android:height="@dimen/incoming_call_widget_circle_size" />
+ <shape
+ android:shape="ring"
+ android:innerRadius="0dp"
+ android:thickness="@dimen/incoming_call_widget_circle_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_sms_circle"/>
</shape>
</item>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/ic_do_not_disturb_alt_white_24dp"
- android:tint="@color/glowpad_text_widget_normal_tint"
- android:autoMirrored="true"/>
+ android:tint="@color/incoming_call_widget_bitmap"
+ android:autoMirrored="true" />
</item>
+ <item android:top="@dimen/incoming_call_widget_small_circle_top_offset"
+ android:left="@dimen/incoming_call_widget_small_circle_left_offset"
+ android:drawable="@drawable/ic_lockscreen_decline_small_layer" />
</layer-list>
diff --git a/res/drawable/ic_lockscreen_decline_activated_layer.xml b/res/drawable/ic_lockscreen_decline_activated_layer.xml
index 096c32b4..19fa49f9 100644
--- a/res/drawable/ic_lockscreen_decline_activated_layer.xml
+++ b/res/drawable/ic_lockscreen_decline_activated_layer.xml
@@ -14,11 +14,14 @@
limitations under the License.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:drawable="@drawable/fab_red" />
<item>
- <bitmap
- android:gravity="center"
- android:src="@drawable/fab_ic_end_call"
- android:tint="@color/glowpad_widget_active_color" />
+ <shape
+ android:shape="ring"
+ android:innerRadius="@dimen/incoming_call_widget_ring_inner_radius"
+ android:thickness="@dimen/incoming_call_widget_ring_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_activated_ring"/>
+ </shape>
</item>
+ <item android:drawable="@drawable/ic_lockscreen_decline_normal_layer" />
</layer-list>
diff --git a/res/drawable/ic_lockscreen_decline_normal_layer.xml b/res/drawable/ic_lockscreen_decline_normal_layer.xml
index 4da5f8d6..8bbfb93b 100644
--- a/res/drawable/ic_lockscreen_decline_normal_layer.xml
+++ b/res/drawable/ic_lockscreen_decline_normal_layer.xml
@@ -14,19 +14,20 @@
limitations under the License.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- A fake circle to fix the size of this layer asset. -->
<item>
- <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
- <solid android:color="#00000000"/>
- <size
- android:width="@dimen/incoming_call_widget_circle_size"
- android:height="@dimen/incoming_call_widget_circle_size" />
+ <shape
+ android:shape="ring"
+ android:innerRadius="0dp"
+ android:thickness="@dimen/incoming_call_widget_circle_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_decline_circle"/>
</shape>
</item>
<item>
<bitmap
android:gravity="center"
- android:src="@drawable/fab_ic_end_call"
- android:tint="@color/glowpad_end_call_widget_normal_tint" />
+ android:src="@drawable/ic_call_end_white_24dp"
+ android:tint="@color/incoming_call_widget_bitmap"
+ android:autoMirrored="true" />
</item>
</layer-list>
diff --git a/res/drawable/ic_lockscreen_decline_small_layer.xml b/res/drawable/ic_lockscreen_decline_small_layer.xml
new file mode 100644
index 00000000..9b51e432
--- /dev/null
+++ b/res/drawable/ic_lockscreen_decline_small_layer.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The CyanogenMod Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape
+ android:shape="ring"
+ android:innerRadius="0dp"
+ android:thickness="@dimen/incoming_call_widget_small_circle_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_decline_small_circle"/>
+ <size android:width="@dimen/incoming_call_widget_small_circle_width"
+ android:height="@dimen/incoming_call_widget_small_circle_height"/>
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_call_end_16dp"
+ android:tint="@color/incoming_call_widget_bitmap"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/res/drawable/ic_lockscreen_hold_small_layer.xml b/res/drawable/ic_lockscreen_hold_small_layer.xml
new file mode 100644
index 00000000..d8da4d0b
--- /dev/null
+++ b/res/drawable/ic_lockscreen_hold_small_layer.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2015 The CyanogenMod Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape
+ android:shape="ring"
+ android:innerRadius="0dp"
+ android:thickness="@dimen/incoming_call_widget_small_circle_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_hold_small_circle"/>
+ <size android:width="@dimen/incoming_call_widget_small_circle_width"
+ android:height="@dimen/incoming_call_widget_small_circle_height"/>
+ </shape>
+ </item>
+ <item>
+ <bitmap
+ android:gravity="center"
+ android:src="@drawable/ic_pause_16dp"
+ android:tint="@color/incoming_call_hold_bitmap"
+ android:autoMirrored="true" />
+ </item>
+</layer-list>
diff --git a/res/drawable/ic_lockscreen_text_activated_layer.xml b/res/drawable/ic_lockscreen_text_activated_layer.xml
index a74e36b3..73b6c7de 100644
--- a/res/drawable/ic_lockscreen_text_activated_layer.xml
+++ b/res/drawable/ic_lockscreen_text_activated_layer.xml
@@ -15,18 +15,13 @@
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
- <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
- <stroke android:color="@color/glowpad_text_widget_ring_color" android:width="1dp"/>
- <size
- android:width="@dimen/incoming_call_widget_circle_size"
- android:height="@dimen/incoming_call_widget_circle_size" />
+ <shape
+ android:shape="ring"
+ android:innerRadius="@dimen/incoming_call_widget_ring_inner_radius"
+ android:thickness="@dimen/incoming_call_widget_ring_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/glowpad_widget_active_color"/>
</shape>
</item>
- <item>
- <bitmap
- android:gravity="center"
- android:src="@drawable/fab_ic_message"
- android:tint="@color/glowpad_widget_active_color"
- android:autoMirrored="true" />
- </item>
+ <item android:drawable="@drawable/ic_lockscreen_text_normal_layer" />
</layer-list>
diff --git a/res/drawable/ic_lockscreen_text_normal_layer.xml b/res/drawable/ic_lockscreen_text_normal_layer.xml
index be32d0ba..888aeb40 100644
--- a/res/drawable/ic_lockscreen_text_normal_layer.xml
+++ b/res/drawable/ic_lockscreen_text_normal_layer.xml
@@ -14,20 +14,20 @@
limitations under the License.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- A fake circle to fix the size of this layer asset. -->
<item>
- <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
- <solid android:color="#00000000"/>
- <size
- android:width="@dimen/incoming_call_widget_circle_size"
- android:height="@dimen/incoming_call_widget_circle_size" />
+ <shape
+ android:shape="ring"
+ android:innerRadius="0dp"
+ android:thickness="@dimen/incoming_call_widget_circle_thickness"
+ android:useLevel="false">
+ <solid android:color="@color/incoming_call_sms_circle"/>
</shape>
</item>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/fab_ic_message"
- android:tint="@color/glowpad_text_widget_normal_tint"
+ android:tint="@color/incoming_call_widget_bitmap"
android:autoMirrored="true" />
</item>
</layer-list>
diff --git a/res/layout/answer_fragment.xml b/res/layout/answer_fragment.xml
index 03357482..bd9083c7 100644
--- a/res/layout/answer_fragment.xml
+++ b/res/layout/answer_fragment.xml
@@ -30,6 +30,7 @@
dc:targetDrawables="@array/incoming_call_widget_audio_with_sms_without_block_targets"
dc:targetDescriptions="@array/incoming_call_widget_audio_with_sms_without_block_target_descriptions"
dc:directionDescriptions="@array/incoming_call_widget_audio_with_sms_without_block_direction_descriptions"
+ dc:targetDisplayText="@array/incoming_call_widget_audio_with_sms_without_block_display_text"
dc:handleDrawable="@drawable/ic_incall_audio_handle"
dc:outerRingDrawable="@drawable/ic_lockscreen_outerring"
dc:outerRadius="@dimen/glowpadview_target_placement_radius"
diff --git a/res/values/array.xml b/res/values/array.xml
index 9e6c007e..42f7d16c 100644
--- a/res/values/array.xml
+++ b/res/values/array.xml
@@ -210,4 +210,94 @@
<item>@null</item>
</array>
+ <!-- For audio calls, if respond via SMS is disabled and no popup is enabled for call waiting:
+ - Hold and answer (drag right)
+ - Ena and answer (drag down)
+ - Decline (drag left) -->
+ <array name="incoming_call_widget_audio_without_sms_with_call_waiting_targets">
+ <item>@drawable/ic_lockscreen_answer_hold_current</item>
+ <item>@null</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@drawable/ic_lockscreen_answer_end_current</item>"
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_with_call_waiting_target_descriptions">
+ <item>@string/description_target_answer_hold_active</item>
+ <item>@null</item>
+ <item>@string/description_target_decline</item>
+ <item>@string/description_target_answer_end_active</item>"
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_with_call_waiting_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@null</item>
+ <item>@string/description_direction_left</item>
+ <item>@string/description_direction_down</item>
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_with_call_waiting_display_text">
+ <item>@string/display_text_target_answer_and_hold_active</item>
+ <item>@null</item>
+ <item>@string/display_text_target_dismiss</item>
+ <item>@string/display_text_target_answer_and_end_active</item>"
+ </array>
+
+ <!-- For audio calls, if respond via SMS is enabled and no popup is enabled for call waiting:
+ - Hold and answer (drag right)
+ - Respond via SMS (drag up)
+ - Ena and answer (drag down)
+ - Decline (drag left) -->
+ <array name="incoming_call_widget_audio_with_sms_and_call_waiting_targets">
+ <item>@drawable/ic_lockscreen_answer_hold_current</item>
+ <item>@drawable/ic_lockscreen_text</item>
+ <item>@drawable/ic_lockscreen_decline</item>
+ <item>@drawable/ic_lockscreen_answer_end_current</item>
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_and_call_waiting_target_descriptions">
+ <item>@string/description_target_answer_hold_active</item>
+ <item>@string/description_target_send_sms</item>
+ <item>@string/description_target_decline</item>
+ <item>@string/description_target_answer_end_active</item>"
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_and_call_waiting_direction_descriptions">
+ <item>@string/description_direction_right</item>
+ <item>@string/description_direction_up</item>
+ <item>@string/description_direction_left</item>
+ <item>@string/description_direction_down</item>
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_and_call_waiting_display_text">
+ <item>@string/display_text_target_answer_and_hold_active</item>
+ <item>@string/display_text_target_sms</item>
+ <item>@string/display_text_target_dismiss</item>
+ <item>@string/display_text_target_answer_and_end_active</item>
+ </array>
+
+ <!-- Display text for the remaining scenarios -->
+ <array name="incoming_call_widget_default_target_display_text">
+ <item>@string/empty_string</item>
+ <item>@string/empty_string</item>
+ <item>@string/empty_string</item>
+ <item>@string/empty_string</item>
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_without_block_display_text">
+ <item>@string/display_text_target_answer</item>
+ <item>@string/display_text_target_sms</item>
+ <item>@string/display_text_target_dismiss</item>
+ <item>@null</item>
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_and_block_display_text">
+ <item>@string/display_text_target_answer</item>
+ <item>@null</item>
+ <item>@string/display_text_target_dismiss</item>
+ <item>@null</item>
+ </array>
+ <array name="incoming_call_widget_audio_with_sms_and_block_display_text">
+ <item>@string/display_text_target_answer</item>
+ <item>@string/display_text_target_sms</item>
+ <item>@string/display_text_target_dismiss</item>
+ <item>@string/display_text_target_block</item>
+ </array>
+ <array name="incoming_call_widget_audio_without_sms_with_block_display_text">
+ <item>@string/display_text_target_answer</item>
+ <item>@null</item>
+ <item>@string/display_text_target_dismiss</item>
+ <item>@string/display_text_target_block</item>
+ </array>
</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index e135fb72..f9471bb4 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -28,6 +28,9 @@
<!-- Reference to an array resource that be used to announce the directions with targets around the circle. -->
<attr name="directionDescriptions" format="reference"/>
+ <!-- Reference to an array resource that be used to display text for the target action. -->
+ <attr name="targetDisplayText" format="reference"/>
+
<!-- Sets a drawable as the center. -->
<attr name="handleDrawable" format="reference"/>
diff --git a/res/values/cm_colors.xml b/res/values/cm_colors.xml
index adee95e2..4b3f214d 100644
--- a/res/values/cm_colors.xml
+++ b/res/values/cm_colors.xml
@@ -23,4 +23,14 @@
<color name="contact_info_spam_info_text_color">#ff402c</color>
<color name="contact_info_attribution_text_color">#ffffff</color>
+
+ <color name="incoming_call_display_text">#b2ffffff</color>
+ <color name="incoming_call_answer_circle">#00c853</color>
+ <color name="incoming_call_decline_circle">#ff2844</color>
+ <color name="incoming_call_decline_small_circle">#ff2844</color>
+ <color name="incoming_call_activated_ring">#ffffff</color>
+ <color name="incoming_call_widget_bitmap">#ffffff</color>
+ <color name="incoming_call_hold_small_circle">#607d8b</color>
+ <color name="incoming_call_hold_bitmap">#b2ffffff</color>
+ <color name="incoming_call_sms_circle">#0288d1</color>
</resources> \ No newline at end of file
diff --git a/res/values/cm_dimens.xml b/res/values/cm_dimens.xml
index e69ebfc2..b73349cf 100644
--- a/res/values/cm_dimens.xml
+++ b/res/values/cm_dimens.xml
@@ -36,4 +36,17 @@
<dimen name="lookup_extra_info_container_margin_top">25dp</dimen>
<dimen name="notification_three_action_padding">12dp</dimen>
+
+ <!-- Call waiting reponse changes -->
+ <dimen name="incoming_call_display_text_size">14sp</dimen>
+ <dimen name="incoming_call_widget_circle_thickness">22dp</dimen>
+ <dimen name="incoming_call_widget_ring_thickness">2dp</dimen>
+ <dimen name="incoming_call_widget_ring_inner_radius">27dp</dimen>
+ <dimen name="incoming_call_widget_small_circle_top_offset">30dp</dimen>
+ <dimen name="incoming_call_widget_small_circle_thickness">11dp</dimen>
+ <dimen name="incoming_call_widget_small_circle_width">20dp</dimen>
+ <dimen name="incoming_call_widget_small_circle_height">20dp</dimen>
+ <dimen name="incoming_call_widget_small_circle_left_offset">30dp</dimen>
+ <dimen name="incoming_call_widget_display_text_side_offset">30dp</dimen>
+
</resources>
diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml
index 77b40f21..18d3a773 100644
--- a/res/values/cm_strings.xml
+++ b/res/values/cm_strings.xml
@@ -70,5 +70,20 @@
<string name="onscreenNoteText">Take note</string>
<!-- Text to place in the name field of a Call DeepLink when the contact name is not known -->
<string name="deeplink_unknown_caller">Unknown</string>
+ <!-- Description of the hold and answer target in the Slide unlock screen of Phone. [CHAR
+ LIMIT=NONE] -->
+ <string name="description_target_answer_hold_active">Hold current call and answer</string>
+ <!-- Description of the end and answer target in the Slide unlock screen of Phone. [CHAR
+ LIMIT=NONE] -->
+ <string name="description_target_answer_end_active">End current call and answer</string>
+
+ <!-- In-call screen: display text for the target action -->
+ <string name="empty_string"></string>
+ <string name="display_text_target_dismiss">DISMISS</string>
+ <string name="display_text_target_block">BLOCK</string>
+ <string name="display_text_target_answer">ANSWER</string>
+ <string name="display_text_target_sms">QUICK MESSAGE</string>
+ <string name="display_text_target_answer_and_hold_active">HOLD CURRENT CALL AND ANSWER</string>
+ <string name="display_text_target_answer_and_end_active">END CURRENT CALL AND ANSWER</string>
</resources>
diff --git a/src/com/android/incallui/AnswerFragment.java b/src/com/android/incallui/AnswerFragment.java
index 6ed5e558..2dfba187 100644
--- a/src/com/android/incallui/AnswerFragment.java
+++ b/src/com/android/incallui/AnswerFragment.java
@@ -21,6 +21,7 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
+import android.telecom.TelecomManager;
import android.telecom.VideoProfile;
import android.text.Editable;
import android.text.TextWatcher;
@@ -57,6 +58,9 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
public static final int TARGET_SET_FOR_VIDEO_WITHOUT_SMS_WITH_BLOCK = 5;
public static final int TARGET_SET_FOR_VIDEO_WITH_SMS = 6;
public static final int TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST = 7;
+ public static final int TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_CALL_WAITING = 8;
+ public static final int TARGET_SET_FOR_AUDIO_WITH_SMS_AND_CALL_WAITING = 9;
+
public static final int TARGET_SET_FOR_QTI_VIDEO_WITHOUT_SMS = 1000;
public static final int TARGET_SET_FOR_QTI_VIDEO_WITH_SMS = 1001;
@@ -71,12 +75,15 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
int targetResourceId;
int targetDescriptionsResourceId;
int directionDescriptionsResourceId;
+ int targetDisplayTextResourceId;
int handleDrawableResourceId;
- public TargetResources(int target, int descs, int directionDescs, int handle) {
+ public TargetResources(int target, int descs, int directionDescs, int displayText, int
+ handle) {
targetResourceId = target;
targetDescriptionsResourceId = descs;
directionDescriptionsResourceId = directionDescs;
+ targetDisplayTextResourceId = displayText;
handleDrawableResourceId = handle;
}
}
@@ -87,66 +94,93 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
R.array.incoming_call_widget_audio_without_sms_and_block_targets,
R.array.incoming_call_widget_audio_without_sms_and_block_target_descriptions,
R.array.incoming_call_widget_audio_without_sms_and_block_direction_descriptions,
+ R.array.incoming_call_widget_audio_without_sms_and_block_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_BLOCK, new TargetResources(
R.array.incoming_call_widget_audio_without_sms_with_block_targets,
R.array.incoming_call_widget_audio_without_sms_with_block_target_descriptions,
R.array.incoming_call_widget_audio_without_sms_with_block_direction_descriptions,
+ R.array.incoming_call_widget_audio_without_sms_with_block_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITH_SMS_WITHOUT_BLOCK, new TargetResources(
R.array.incoming_call_widget_audio_with_sms_without_block_targets,
R.array.incoming_call_widget_audio_with_sms_without_block_target_descriptions,
R.array.incoming_call_widget_audio_with_sms_without_block_direction_descriptions,
+ R.array.incoming_call_widget_audio_with_sms_without_block_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITH_SMS_AND_BLOCK, new TargetResources(
R.array.incoming_call_widget_audio_with_sms_and_block_targets,
R.array.incoming_call_widget_audio_with_sms_and_block_target_descriptions,
R.array.incoming_call_widget_audio_with_sms_and_block_direction_descriptions,
+ R.array.incoming_call_widget_audio_with_sms_and_block_display_text,
+ R.drawable.ic_incall_audio_handle
+ ));
+ RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_CALL_WAITING, new TargetResources(
+ R.array.incoming_call_widget_audio_without_sms_with_call_waiting_targets,
+ R.array
+ .incoming_call_widget_audio_without_sms_with_call_waiting_target_descriptions,
+ R.array
+ .incoming_call_widget_audio_without_sms_with_call_waiting_direction_descriptions,
+ R.array.incoming_call_widget_audio_without_sms_with_call_waiting_display_text,
+ R.drawable.ic_incall_audio_handle
+ ));
+ RESOURCE_LOOKUP.put(TARGET_SET_FOR_AUDIO_WITH_SMS_AND_CALL_WAITING, new TargetResources(
+ R.array.incoming_call_widget_audio_with_sms_and_call_waiting_targets,
+ R.array.incoming_call_widget_audio_with_sms_and_call_waiting_target_descriptions,
+ R.array.incoming_call_widget_audio_with_sms_and_call_waiting_direction_descriptions,
+ R.array.incoming_call_widget_audio_with_sms_and_call_waiting_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_VIDEO_WITHOUT_SMS_AND_BLOCK, new TargetResources(
R.array.incoming_call_widget_video_without_sms_and_block_targets,
R.array.incoming_call_widget_video_without_sms_and_block_target_descriptions,
R.array.incoming_call_widget_video_without_sms_and_block_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_VIDEO_WITHOUT_SMS_WITH_BLOCK, new TargetResources(
R.array.incoming_call_widget_video_without_sms_targets,
R.array.incoming_call_widget_video_without_sms_target_descriptions,
R.array.incoming_call_widget_video_without_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_VIDEO_WITH_SMS, new TargetResources(
R.array.incoming_call_widget_video_with_sms_targets,
R.array.incoming_call_widget_video_with_sms_target_descriptions,
R.array.incoming_call_widget_video_with_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_VIDEO_ACCEPT_REJECT_REQUEST, new TargetResources(
R.array.incoming_call_widget_video_request_targets,
R.array.incoming_call_widget_video_request_target_descriptions,
R.array.incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_WITHOUT_SMS, new TargetResources(
R.array.qti_incoming_call_widget_video_without_sms_targets,
R.array.qti_incoming_call_widget_video_without_sms_target_descriptions,
R.array.qti_incoming_call_widget_video_without_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_WITH_SMS, new TargetResources(
R.array.qti_incoming_call_widget_video_with_sms_targets,
R.array.qti_incoming_call_widget_video_with_sms_target_descriptions,
R.array.qti_incoming_call_widget_video_with_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_ACCEPT_REJECT_REQUEST, new TargetResources(
R.array.qti_incoming_call_widget_video_request_targets,
R.array.qti_incoming_call_widget_video_request_target_descriptions,
R.array.qti_incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_BIDIRECTIONAL_VIDEO_ACCEPT_REJECT_REQUEST,
@@ -154,6 +188,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
R.array.qti_incoming_call_widget_bidirectional_video_accept_reject_request_targets,
R.array.qti_incoming_call_widget_video_request_target_descriptions,
R.array.qti_incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_TRANSMIT_ACCEPT_REJECT_REQUEST,
@@ -161,6 +196,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
R.array.qti_incoming_call_widget_video_transmit_accept_reject_request_targets,
R.array.qti_incoming_call_widget_video_transmit_request_target_descriptions,
R.array.qti_incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_VIDEO_RECEIVE_ACCEPT_REJECT_REQUEST,
@@ -168,18 +204,21 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
R.array.qti_incoming_call_widget_video_receive_accept_reject_request_targets,
R.array.qti_incoming_call_widget_video_receive_request_target_descriptions,
R.array.qti_incoming_call_widget_video_request_target_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_video_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_AUDIO_WITH_SMS, new TargetResources(
R.array.qti_incoming_call_widget_audio_with_sms_targets,
R.array.qti_incoming_call_widget_audio_with_sms_target_descriptions,
R.array.qti_incoming_call_widget_audio_with_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_audio_handle
));
RESOURCE_LOOKUP.put(TARGET_SET_FOR_QTI_AUDIO_WITHOUT_SMS, new TargetResources(
R.array.qti_incoming_call_widget_audio_without_sms_targets,
R.array.qti_incoming_call_widget_audio_without_sms_target_descriptions,
R.array.qti_incoming_call_widget_audio_without_sms_direction_descriptions,
+ R.array.incoming_call_widget_default_target_display_text,
R.drawable.ic_incall_audio_handle
));
}
@@ -275,6 +314,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
mGlowpad.setTargetDescriptionsResourceId(res.targetDescriptionsResourceId);
mGlowpad.setDirectionDescriptionsResourceId(res.directionDescriptionsResourceId);
mGlowpad.setHandleDrawable(res.handleDrawableResourceId);
+ mGlowpad.setTargetDisplayTextResourceId(res.targetDisplayTextResourceId);
mGlowpad.reset(false);
}
}
@@ -442,7 +482,14 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
@Override
public void onAnswer(int videoState, Context context) {
Log.d(this, "onAnswer videoState=" + videoState + " context=" + context);
- getPresenter().onAnswer(videoState, context);
+ getPresenter().onAnswer(videoState, context, TelecomManager
+ .CALL_WAITING_RESPONSE_NO_POPUP_END_CALL);
+ }
+
+ @Override
+ public void onAnswer(int videoState, Context context, int callWaitingResponseType) {
+ Log.d(this, "onAnswer videoState=" + videoState + " context=" + context);
+ getPresenter().onAnswer(videoState, context, callWaitingResponseType);
}
@Override
diff --git a/src/com/android/incallui/AnswerPresenter.java b/src/com/android/incallui/AnswerPresenter.java
index 2fdccdb2..ddf6c0dc 100644
--- a/src/com/android/incallui/AnswerPresenter.java
+++ b/src/com/android/incallui/AnswerPresenter.java
@@ -439,7 +439,7 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
return phoneId;
}
- public void onAnswer(int videoState, Context context) {
+ public void onAnswer(int videoState, Context context, int callWaitingResponseType) {
int phoneId = getActivePhoneId();
Log.i(this, "onAnswer mCallId:" + mCallId + "phoneId:" + phoneId);
if (mCallId == null || phoneId == -1) {
@@ -452,7 +452,8 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
InCallPresenter.getInstance().acceptUpgradeRequest(videoState, context);
} else {
Log.d(this, "onAnswer (answerCall) mCallId=" + mCallId + " videoState=" + videoState);
- TelecomAdapter.getInstance().answerCall(mCall[phoneId].getId(), videoState);
+ TelecomAdapter.getInstance().answerCall(mCall[phoneId].getId(), videoState,
+ callWaitingResponseType);
}
}
@@ -554,6 +555,9 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
&& mHasTextMessages;
boolean withBlock = isBlockingEnabled();
+ Call activeCall = CallList.getInstance().getActiveCall();
+ boolean isCallWaiting = activeCall != null && activeCall != call;
+
// Only present the user with the option to answer as a video call if the incoming call is
// a bi-directional video call.
if (call.isVideoCall(getUi().getContext())) {
@@ -575,14 +579,25 @@ public class AnswerPresenter extends Presenter<AnswerPresenter.AnswerUi>
}
} else {
if (withSms) {
- getUi().showTargets(withBlock
- ? AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS_AND_BLOCK
- : AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS_WITHOUT_BLOCK);
- getUi().configureMessageDialog(textMsgs);
+ if (isCallWaiting) {
+ getUi().showTargets(AnswerFragment
+ .TARGET_SET_FOR_AUDIO_WITH_SMS_AND_CALL_WAITING);
+ getUi().configureMessageDialog(textMsgs);
+ } else {
+ getUi().showTargets(withBlock
+ ? AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS_AND_BLOCK
+ : AnswerFragment.TARGET_SET_FOR_AUDIO_WITH_SMS_WITHOUT_BLOCK);
+ getUi().configureMessageDialog(textMsgs);
+ }
} else {
- getUi().showTargets(withBlock
- ? AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_BLOCK
- : AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS_AND_BLOCK);
+ if (isCallWaiting) {
+ getUi().showTargets(AnswerFragment
+ .TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_CALL_WAITING);
+ } else {
+ getUi().showTargets(withBlock
+ ? AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS_WITH_BLOCK
+ : AnswerFragment.TARGET_SET_FOR_AUDIO_WITHOUT_SMS_AND_BLOCK);
+ }
}
}
}
diff --git a/src/com/android/incallui/GlowPadWrapper.java b/src/com/android/incallui/GlowPadWrapper.java
index eff43a1c..369bfe20 100644
--- a/src/com/android/incallui/GlowPadWrapper.java
+++ b/src/com/android/incallui/GlowPadWrapper.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.telecom.VideoProfile;
+import android.telecom.TelecomManager;
import android.util.AttributeSet;
import android.view.View;
@@ -149,6 +150,16 @@ public class GlowPadWrapper extends GlowPadView implements GlowPadView.OnTrigger
mAnswerListener.onDeflect(getContext());
mTargetTriggered = true;
break;
+ case R.drawable.ic_lockscreen_answer_hold_current:
+ mAnswerListener.onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext(),
+ TelecomManager.CALL_WAITING_RESPONSE_NO_POPUP_HOLD_CALL);
+ mTargetTriggered = true;
+ break;
+ case R.drawable.ic_lockscreen_answer_end_current:
+ mAnswerListener.onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext(),
+ TelecomManager.CALL_WAITING_RESPONSE_NO_POPUP_END_CALL);
+ mTargetTriggered = true;
+ break;
default:
// Code should never reach here.
Log.e(this, "Trigger detected on unhandled resource. Skipping.");
@@ -180,6 +191,7 @@ public class GlowPadWrapper extends GlowPadView implements GlowPadView.OnTrigger
public interface AnswerListener {
void onAnswer(int videoState, Context context);
+ void onAnswer(int videoState, Context context, int callWaitingResponseType);
void onDecline(Context context);
void onDeclineUpgradeRequest(Context context);
void onText();
diff --git a/src/com/android/incallui/TelecomAdapter.java b/src/com/android/incallui/TelecomAdapter.java
index 5de28f5f..ce5f75b6 100644
--- a/src/com/android/incallui/TelecomAdapter.java
+++ b/src/com/android/incallui/TelecomAdapter.java
@@ -68,6 +68,15 @@ final class TelecomAdapter implements InCallServiceListener {
}
}
+ void answerCall(String callId, int videoState, int callWaitingResponseType) {
+ android.telecom.Call call = getTelecommCallById(callId);
+ if (call != null) {
+ call.answer(videoState, callWaitingResponseType);
+ } else {
+ Log.e(this, "error answerCall, call not in call list: " + callId);
+ }
+ }
+
void rejectCall(String callId, boolean rejectWithMessage, String message) {
android.telecom.Call call = getTelecommCallById(callId);
if (call != null) {
diff --git a/src/com/android/incallui/widget/multiwaveview/GlowPadView.java b/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
index 23200279..acbcdba6 100644
--- a/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
+++ b/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
@@ -29,6 +29,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -37,6 +38,10 @@ import android.support.v4.view.ViewCompat;
import android.support.v4.view.accessibility.AccessibilityEventCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.support.v4.widget.ExploreByTouchHelper;
+import android.text.DynamicLayout;
+import android.text.Layout.Alignment;
+import android.text.SpannableStringBuilder;
+import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
@@ -137,6 +142,14 @@ public class GlowPadView extends View {
private AccessibilityNodeProvider mAccessibilityNodeProvider;
private GlowpadExploreByTouchHelper mExploreByTouchHelper;
+ private ArrayList<String> mTargetDisplayText;
+ private boolean mShowHintText = false;
+ private int mTargetDisplayTextResourceId;
+ private TextPaint mTextPaint;
+ private DynamicLayout mTextLayout;
+ private SpannableStringBuilder mDisplayText;
+ private int mDisplayTextWidth;
+
private class AnimationBundle extends ArrayList<Tweener> {
private static final long serialVersionUID = 0xA84D78726F127468L;
private boolean mSuspended;
@@ -274,12 +287,36 @@ public class GlowPadView extends View {
setDirectionDescriptionsResourceId(resourceId);
}
+ // Read array of display text
+ if (a.getValue(R.styleable.GlowPadView_targetDisplayText, outValue)) {
+ final int resourceId = outValue.resourceId;
+ if (resourceId == 0) {
+ throw new IllegalStateException("Must specify display text");
+ }
+ setTargetDisplayTextResourceId(resourceId);
+ }
+
+ mTextPaint = new TextPaint();
+ mTextPaint.setColor(getResources().getColor(R.color.incoming_call_display_text));
+
+ // This SpannableStringBuilder is used as first parameter when creating DynamicLayout.
+ // DynamicLayout creates instance of internal static class DynamicLayout.ChangeWatcher
+ // and attaches it to SpannableStringBuilder. As a result, whenever
+ // SpannableStringBuilder is updated, DynamicLayout receives change notification
+ mDisplayText = new SpannableStringBuilder("");
+
+ mDisplayTextWidth = (int) (getRingWidth() - mMaxTargetWidth - getResources()
+ .getDimensionPixelSize(R.dimen.incoming_call_widget_display_text_side_offset));
+ mTextPaint.setTextSize(getResources().getDimensionPixelSize(R.dimen
+ .incoming_call_display_text_size));
+ mTextLayout = new DynamicLayout(mDisplayText, mTextPaint, mDisplayTextWidth,
+ android.text.Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);
+
// Use gravity attribute from LinearLayout
//a = context.obtainStyledAttributes(attrs, R.styleable.LinearLayout);
mGravity = a.getInt(R.styleable.GlowPadView_android_gravity, Gravity.TOP);
a.recycle();
-
setVibrateEnabled(mVibrationDuration > 0);
assignDefaultsIfNeeded();
@@ -678,6 +715,18 @@ public class GlowPadView extends View {
}
/**
+ * Sets the resource id specifying the target display text
+ *
+ * @param resourceId The resource id.
+ */
+ public void setTargetDisplayTextResourceId(int resourceId) {
+ mTargetDisplayTextResourceId = resourceId;
+ if (mTargetDisplayText != null) {
+ mTargetDisplayText.clear();
+ }
+ }
+
+ /**
* Gets the resource id specifying the target descriptions for accessibility.
*
* @return The resource id.
@@ -943,9 +992,11 @@ public class GlowPadView extends View {
if (activeTarget != -1) {
switchToState(STATE_SNAP, x,y);
updateGlowPosition(x, y);
+ mShowHintText = true;
} else {
switchToState(STATE_TRACKING, x, y);
updateGlowPosition(x, y);
+ mShowHintText = false;
}
if (mActiveTarget != activeTarget) {
@@ -1196,6 +1247,18 @@ public class GlowPadView extends View {
target.draw(canvas);
}
}
+ if (mShowHintText && mActiveTarget >= 0) {
+ String displayText = getTargetDisplayText(mActiveTarget);
+
+ if (displayText != null && !TextUtils.equals(displayText, mDisplayText.toString())) {
+ mDisplayText.replace(0, mDisplayText.length(), displayText);
+ }
+ int textHeight = mTextLayout.getHeight();
+ canvas.save();
+ canvas.translate(mWaveCenterX-mDisplayTextWidth/2, mWaveCenterY-textHeight/2);
+ mTextLayout.draw(canvas);
+ canvas.restore();
+ }
mHandleDrawable.draw(canvas);
}
@@ -1253,6 +1316,22 @@ public class GlowPadView extends View {
return mTargetDescriptions.get(index);
}
+ private String getTargetDisplayText(int index) {
+ if (mTargetDisplayText == null || mTargetDisplayText.isEmpty()) {
+ mTargetDisplayText = loadDescriptions(mTargetDisplayTextResourceId);
+ if (mTargetDrawables.size() > mTargetDisplayText.size()) {
+ Log.w(TAG, "The number of target drawables must be"
+ + " less than or equal to the number of target display text.");
+ return null;
+ }
+ }
+ if (index < mTargetDisplayText.size()) {
+ return mTargetDisplayText.get(index);
+ } else {
+ return null;
+ }
+ }
+
private String getDirectionDescription(int index) {
if (mDirectionDescriptions == null || mDirectionDescriptions.isEmpty()) {
mDirectionDescriptions = loadDescriptions(mDirectionDescriptionsResourceId);