diff options
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); |