summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);