diff options
author | Kamaljeet Maini <kmaini@cyngn.com> | 2016-04-22 14:43:25 -0700 |
---|---|---|
committer | Kamaljeet Maini <kmaini@cyngn.com> | 2016-05-05 16:55:10 -0700 |
commit | f023f97370cfbe775a1fab04da3699e0f82c066b (patch) | |
tree | 06bf876c8db986469aac7e1deb28126734331cc1 | |
parent | 24250966360cb48fc8ed64224ea67a03f34454b6 (diff) | |
download | packages_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
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 Binary files differnew file mode 100644 index 00000000..f049c3ab --- /dev/null +++ b/res/drawable-hdpi/ic_call_end_16dp.png diff --git a/res/drawable-hdpi/ic_pause_16dp.png b/res/drawable-hdpi/ic_pause_16dp.png Binary files differnew file mode 100644 index 00000000..bda48634 --- /dev/null +++ b/res/drawable-hdpi/ic_pause_16dp.png diff --git a/res/drawable-mdpi/ic_call_end_16dp.png b/res/drawable-mdpi/ic_call_end_16dp.png Binary files differnew file mode 100644 index 00000000..0ccf67a9 --- /dev/null +++ b/res/drawable-mdpi/ic_call_end_16dp.png diff --git a/res/drawable-mdpi/ic_pause_16dp.png b/res/drawable-mdpi/ic_pause_16dp.png Binary files differnew file mode 100644 index 00000000..3d58e3b7 --- /dev/null +++ b/res/drawable-mdpi/ic_pause_16dp.png diff --git a/res/drawable-xhdpi/ic_call_end_16dp.png b/res/drawable-xhdpi/ic_call_end_16dp.png Binary files differnew file mode 100644 index 00000000..aad29a86 --- /dev/null +++ b/res/drawable-xhdpi/ic_call_end_16dp.png diff --git a/res/drawable-xhdpi/ic_pause_16dp.png b/res/drawable-xhdpi/ic_pause_16dp.png Binary files differnew file mode 100644 index 00000000..ae2617f3 --- /dev/null +++ b/res/drawable-xhdpi/ic_pause_16dp.png diff --git a/res/drawable-xxhdpi/ic_call_end_16dp.png b/res/drawable-xxhdpi/ic_call_end_16dp.png Binary files differnew file mode 100644 index 00000000..0d0f3130 --- /dev/null +++ b/res/drawable-xxhdpi/ic_call_end_16dp.png diff --git a/res/drawable-xxhdpi/ic_pause_16dp.png b/res/drawable-xxhdpi/ic_pause_16dp.png Binary files differnew file mode 100644 index 00000000..1d6eaf50 --- /dev/null +++ b/res/drawable-xxhdpi/ic_pause_16dp.png diff --git a/res/drawable-xxxhdpi/ic_call_end_16dp.png b/res/drawable-xxxhdpi/ic_call_end_16dp.png Binary files differnew file mode 100644 index 00000000..3ed18ece --- /dev/null +++ b/res/drawable-xxxhdpi/ic_call_end_16dp.png diff --git a/res/drawable-xxxhdpi/ic_pause_16dp.png b/res/drawable-xxxhdpi/ic_pause_16dp.png Binary files differnew file mode 100644 index 00000000..f27c7be6 --- /dev/null +++ b/res/drawable-xxxhdpi/ic_pause_16dp.png 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); |