diff options
23 files changed, 872 insertions, 17 deletions
diff --git a/core/java/com/android/internal/logging/MetricsConstants.java b/core/java/com/android/internal/logging/MetricsConstants.java index 6cc8ba9a99cf..bb4ca3da2654 100644 --- a/core/java/com/android/internal/logging/MetricsConstants.java +++ b/core/java/com/android/internal/logging/MetricsConstants.java @@ -280,6 +280,7 @@ public interface MetricsConstants { public static final int ACTION_FINGERPRINT_RENAME = 254; public static final int ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE = 255; public static final int ACTION_WIGGLE_CAMERA_GESTURE = 256; + public static final int QS_WORKMODE = 257; // These constants must match those in the analytic pipeline, do not edit. // Add temporary values to the top of MetricsLogger instead. diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_cross_1.xml new file mode 100644 index 000000000000..661ab08ff5aa --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_cross_1.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <objectAnimator + android:duration="350" + android:propertyName="pathData" + android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 " + android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 " + android:valueType="pathType" + android:interpolator="@interpolator/ic_signal_workmode_disable_cross_1_pathdata_interpolator" /> + <objectAnimator + android:duration="17" + android:propertyName="strokeAlpha" + android:valueFrom="0" + android:valueTo="1" + android:interpolator="@android:interpolator/linear" /> +</set> diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_mask.xml new file mode 100644 index 000000000000..1199442a2491 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_mask.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <objectAnimator + android:duration="350" + android:propertyName="pathData" + android:valueFrom="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" + android:valueTo="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" + android:valueType="pathType" + android:interpolator="@android:interpolator/fast_out_slow_in" /> +</set> diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_root.xml b/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_root.xml new file mode 100644 index 000000000000..72834c90f4b9 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_workmode_disable_animation_root.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <objectAnimator + android:duration="350" + android:propertyName="alpha" + android:valueFrom="1.0" + android:valueTo="0.3" + android:interpolator="@android:interpolator/fast_out_slow_in" /> +</set> diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_cross_1.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_cross_1.xml new file mode 100644 index 000000000000..6c7e75118f5c --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_cross_1.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <objectAnimator + android:duration="350" + android:propertyName="pathData" + android:valueFrom="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 " + android:valueTo="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 " + android:valueType="pathType" + android:interpolator="@interpolator/ic_signal_workmode_enable_cross_1_pathdata_interpolator" /> + <set + android:ordering="sequentially" > + <objectAnimator + android:duration="333" + android:propertyName="strokeAlpha" + android:valueFrom="1" + android:valueTo="1" + android:interpolator="@android:interpolator/linear" /> + <objectAnimator + android:duration="17" + android:propertyName="strokeAlpha" + android:valueFrom="1" + android:valueTo="0" + android:interpolator="@android:interpolator/linear" /> + </set> +</set> diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_ic_signal_briefcase.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_ic_signal_briefcase.xml new file mode 100644 index 000000000000..c699fe280f66 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_ic_signal_briefcase.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <set + android:ordering="sequentially" > + <objectAnimator + android:duration="200" + android:propertyName="alpha" + android:valueFrom="0.5" + android:valueTo="0.5" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + <objectAnimator + android:duration="350" + android:propertyName="alpha" + android:valueFrom="0.5" + android:valueTo="1" + android:interpolator="@android:interpolator/fast_out_slow_in" /> + </set> +</set> diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_mask.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_mask.xml new file mode 100644 index 000000000000..5595e5c76297 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_mask.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <objectAnimator + android:duration="350" + android:propertyName="pathData" + android:valueFrom="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" + android:valueTo="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" + android:valueType="pathType" + android:interpolator="@interpolator/ic_signal_workmode_enable_mask_pathdata_interpolator" /> +</set> diff --git a/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_root.xml b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_root.xml new file mode 100644 index 000000000000..85573e05bc81 --- /dev/null +++ b/packages/SystemUI/res/anim/ic_signal_workmode_enable_animation_root.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<set xmlns:android="http://schemas.android.com/apk/res/android" > + <objectAnimator + android:duration="350" + android:propertyName="alpha" + android:valueFrom="0.3" + android:valueTo="1.0" + android:interpolator="@android:interpolator/fast_out_slow_in" /> +</set> diff --git a/packages/SystemUI/res/drawable/ic_signal_workmode_disable.xml b/packages/SystemUI/res/drawable/ic_signal_workmode_disable.xml new file mode 100644 index 000000000000..1feb49c689c3 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_signal_workmode_disable.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:name="root" + android:alpha="1.0" + android:height="42dp" + android:width="42dp" + android:viewportHeight="42" + android:viewportWidth="42" > + <group + android:name="ic_signal_briefcase" + android:translateX="21.9995" + android:translateY="25.73401" > + <group + android:name="ic_signal_briefcase_pivot" + android:translateX="-23.21545" + android:translateY="-18.86649" > + <clip-path + android:name="mask" + android:pathData="M 37.8337860107,-40.4599914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 9.55097961426,9.55285644531 9.55097961426,9.55285644531 c 0.0,0.0 -2.61698913574,2.09387207031 -2.61698913574,2.09387207031 c 0.0,0.0 -9.75096130371,-9.56428527832 -9.75096130371,-9.56428527832 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" /> + <group + android:name="cross" > + <path + android:name="cross_1" + android:pathData="M 7.54049682617,3.9430847168 c 0.0,0.0 0.324981689453,0.399978637695 0.324981689453,0.399978637695 " + android:strokeColor="#FFFFFFFF" + android:strokeAlpha="0" + android:strokeWidth="3.5" + android:fillColor="#00000000" /> + </group> + <group + android:name="briefcase" + android:translateX="23.481" + android:translateY="18.71151" > + <path + android:fillColor="#FFFFFFFF" + android:fillAlpha="1" + android:pathData="M-4.83333,-14.3333 L-7.16667,-11.8333 L-7.16667,-9.5 L-4.83333,-9.5 L-4.83333,-11.8333 L4.83333,-11.8333 L4.83333,-9.5 L7.16667,-9.5 L7.16667,-11.8333 L4.83333,-14.3333 Z" /> + <path + android:fillColor="#FFFFFFFF" + android:fillAlpha="1" + android:pathData="M13.1667,-9.5 L-13.1667,-9.5 C-14.5,-9.5,-15.5,-8.5,-15.5,-7.16666 L-15.5,0.00000286102 C-15.5,1.33334,-14.5,2.33334,-13.1667,2.33334 L-3.66667,2.33334 L-3.66667,0.00000286102 L3.5,0.00000286102 L3.5,2.33334 L13,2.33334 C14.3333,2.33334,15.3333,1.33334,15.3333,0 L15.3333,-7.16666 C15.5,-8.5,14.3333,-9.5,13.1667,-9.5 Z" /> + <path + android:fillColor="#FFFFFFFF" + android:fillAlpha="1" + android:pathData="M-3.5,7.16667 L-3.5,4.83334 L-14.3333,4.83334 L-14.3333,10.8333 C-14.3333,12.1667,-13.3333,13.1667,-12,13.1667 L11.8333,13.1667 C13.1667,13.1667,14.1667,12.1667,14.1667,10.8333 L14.1667,4.83334 L3.5,4.83334 L3.5,7.16667 L-3.5,7.16667 Z" /> + </group> + </group> + </group> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_signal_workmode_disable_animation.xml b/packages/SystemUI/res/drawable/ic_signal_workmode_disable_animation.xml new file mode 100644 index 000000000000..a15a1271dace --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_signal_workmode_disable_animation.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/ic_signal_workmode_disable" > + <target + android:name="root" + android:animation="@anim/ic_signal_workmode_disable_animation_root" /> + <target + android:name="mask" + android:animation="@anim/ic_signal_workmode_disable_animation_mask" /> + <target + android:name="cross_1" + android:animation="@anim/ic_signal_workmode_disable_animation_cross_1" /> +</animated-vector> diff --git a/packages/SystemUI/res/drawable/ic_signal_workmode_enable.xml b/packages/SystemUI/res/drawable/ic_signal_workmode_enable.xml new file mode 100644 index 000000000000..ad14505795d0 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_signal_workmode_enable.xml @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:name="root" + android:alpha="0.3" + android:height="42dp" + android:width="42dp" + android:viewportHeight="42" + android:viewportWidth="42" > + <group + android:name="ic_signal_briefcase" + android:translateX="21.9995" + android:translateY="25.73401" > + <group + android:name="ic_signal_briefcase_pivot" + android:translateX="-23.21545" + android:translateY="-18.86649" > + <clip-path + android:name="mask" + android:pathData="M 37.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,40.9278411865 40.9884796143,40.9278411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-40.9392852783 -41.1884460449,-40.9392852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" /> + <group + android:name="cross" > + <path + android:name="cross_1" + android:pathData="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 " + android:strokeColor="#FFFFFFFF" + android:strokeAlpha="1" + android:strokeWidth="3.5" + android:fillColor="#00000000" /> + </group> + <group + android:name="briefcase" + android:translateX="23.481" + android:translateY="18.71151" > + <path + android:fillColor="#FFFFFFFF" + android:fillAlpha="1" + android:pathData="M-4.83333,-14.3333 L-7.16667,-11.8333 L-7.16667,-9.5 L-4.83333,-9.5 L-4.83333,-11.8333 L4.83333,-11.8333 L4.83333,-9.5 L7.16667,-9.5 L7.16667,-11.8333 L4.83333,-14.3333 Z" /> + <path + android:fillColor="#FFFFFFFF" + android:fillAlpha="1" + android:pathData="M13.1667,-9.5 L-13.1667,-9.5 C-14.5,-9.5,-15.5,-8.5,-15.5,-7.16666 L-15.5,0.00000286102 C-15.5,1.33334,-14.5,2.33334,-13.1667,2.33334 L-3.66667,2.33334 L-3.66667,0.00000286102 L3.5,0.00000286102 L3.5,2.33334 L13,2.33334 C14.3333,2.33334,15.3333,1.33334,15.3333,0 L15.3333,-7.16666 C15.5,-8.5,14.3333,-9.5,13.1667,-9.5 Z" /> + <path + android:fillColor="#FFFFFFFF" + android:fillAlpha="1" + android:pathData="M-3.5,7.16667 L-3.5,4.83334 L-14.3333,4.83334 L-14.3333,10.8333 C-14.3333,12.1667,-13.3333,13.1667,-12,13.1667 L11.8333,13.1667 C13.1667,13.1667,14.1667,12.1667,14.1667,10.8333 L14.1667,4.83334 L3.5,4.83334 L3.5,7.16667 L-3.5,7.16667 Z" /> + </group> + </group> + </group> +</vector> diff --git a/packages/SystemUI/res/drawable/ic_signal_workmode_enable_animation.xml b/packages/SystemUI/res/drawable/ic_signal_workmode_enable_animation.xml new file mode 100644 index 000000000000..41d2b427d8e9 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_signal_workmode_enable_animation.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/ic_signal_workmode_enable" > + <target + android:name="root" + android:animation="@anim/ic_signal_workmode_enable_animation_root" /> + <target + android:name="ic_signal_briefcase" + android:animation="@anim/ic_signal_workmode_enable_animation_ic_signal_briefcase" /> + <target + android:name="mask" + android:animation="@anim/ic_signal_workmode_enable_animation_mask" /> + <target + android:name="cross_1" + android:animation="@anim/ic_signal_workmode_enable_animation_cross_1" /> +</animated-vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_managed_profile_disable_animation.xml b/packages/SystemUI/res/drawable/stat_sys_managed_profile_disable_animation.xml new file mode 100644 index 000000000000..c6a2fdd089b4 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_managed_profile_disable_animation.xml @@ -0,0 +1,47 @@ +<!-- +Copyright (C) 2015 The Android Open Source 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="27.0dp" + android:height="22.0dp" + android:alpha="0.3" + android:viewportWidth="27.0" + android:viewportHeight="22.0"> + <clip-path + android:name="mask" + android:pathData="M 38.8337860107,-40.3974914551 c 0.0,0.0 -35.8077850342,31.5523681641 -35.8077850342,31.5523681641 c 0.0,0.0 40.9884796143,41.1153411865 40.9884796143,41.1153411865 c 0.0,0.0 -2.61700439453,2.0938873291 -2.61700439453,2.0938873291 c 0.0,0.0 -41.1884460449,-41.1267852783 -41.1884460449,-41.1267852783 c 0.0,0.0 -34.6200408936,25.4699249268 -34.6200408936,25.4699249268 c 0.0,0.0 55.9664764404,69.742401123 55.9664764404,69.742401123 c 0.0,0.0 73.2448120117,-59.1047973633 73.2448120117,-59.1047973633 c 0.0,0.0 -55.9664916992,-69.7423400879 -55.9664916992,-69.7423400879 Z" /> + <group + android:name="cross" > + <path + android:name="cross_1" + android:pathData="M 7.54049682617,3.9430847168 c 0.0,0.0 31.5749816895,31.4499664307 31.5749816895,31.4499664307 " + android:strokeColor="#FFFFFFFF" + android:strokeAlpha="1" + android:strokeWidth="3.5" + android:fillColor="#00000000" /> + </group> + <group + android:name="work_badge" + android:translateX="3.0" + android:scaleX="1.4" + android:scaleY="1.4"> + <path + android:fillColor="@android:color/white" + android:pathData="M9.9,11.6H7v-1.1H2.1v2.8c0,0.8,0.6,1.4,1.4,1.4h9.9c0.8,0,1.4,-0.6,1.4,-1.4v-2.8H9.9V11.6z"/> + <path + android:fillColor="@android:color/white" + android:pathData="M14.1,4.2h-2.5V3.2l-1.1,-1.1H6.3L5.3,3.2v1H2.8C2,4.2,1.4,4.9,1.4,5.6v2.8c0,0.8,0.6,1.4,1.4,1.4H7V8.8h2.8v1.1h4.2 c0.8,0,1.4,-0.6,1.4,-1.4V5.6C15.5,4.9,14.8,4.2,14.1,4.2z M10.6,4.2H6.3V3.2h4.2V4.2z"/> + </group> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_managed_profile_enable_animation.xml b/packages/SystemUI/res/drawable/stat_sys_managed_profile_enable_animation.xml new file mode 100644 index 000000000000..d67c89ac3865 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_managed_profile_enable_animation.xml @@ -0,0 +1,34 @@ +<!-- +Copyright (C) 2015 The Android Open Source 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="27.0dp" + android:height="22.0dp" + android:alpha="1.0" + android:viewportWidth="27.0" + android:viewportHeight="22.0"> + <group + android:name="work_badge" + android:translateX="3.0" + android:scaleX="1.4" + android:scaleY="1.4"> + <path + android:fillColor="@android:color/white" + android:pathData="M9.9,11.6H7v-1.1H2.1v2.8c0,0.8,0.6,1.4,1.4,1.4h9.9c0.8,0,1.4,-0.6,1.4,-1.4v-2.8H9.9V11.6z"/> + <path + android:fillColor="@android:color/white" + android:pathData="M14.1,4.2h-2.5V3.2l-1.1,-1.1H6.3L5.3,3.2v1H2.8C2,4.2,1.4,4.9,1.4,5.6v2.8c0,0.8,0.6,1.4,1.4,1.4H7V8.8h2.8v1.1h4.2 c0.8,0,1.4,-0.6,1.4,-1.4V5.6C15.5,4.9,14.8,4.2,14.1,4.2z M10.6,4.2H6.3V3.2h4.2V4.2z"/> + </group> +</vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_managed_profile_status.xml b/packages/SystemUI/res/drawable/stat_sys_managed_profile_status.xml index 2bfa39d2392c..370f89c2e0e4 100644 --- a/packages/SystemUI/res/drawable/stat_sys_managed_profile_status.xml +++ b/packages/SystemUI/res/drawable/stat_sys_managed_profile_status.xml @@ -14,16 +14,29 @@ Copyright (C) 2015 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="23.0dp" - android:height="18.0dp" - android:viewportWidth="21.0" - android:viewportHeight="17.0"> - <group android:translateX="2.0"> - <path - android:fillColor="@android:color/white" - android:pathData="M9.9,11.6H7v-1.1H2.1v2.8c0,0.8,0.6,1.4,1.4,1.4h9.9c0.8,0,1.4,-0.6,1.4,-1.4v-2.8H9.9V11.6z"/> - <path - android:fillColor="@android:color/white" - android:pathData="M14.1,4.2h-2.5V3.2l-1.1,-1.1H6.3L5.3,3.2v1H2.8C2,4.2,1.4,4.9,1.4,5.6v2.8c0,0.8,0.6,1.4,1.4,1.4H7V8.8h2.8v1.1h4.2 c0.8,0,1.4,-0.6,1.4,-1.4V5.6C15.5,4.9,14.8,4.2,14.1,4.2z M10.6,4.2H6.3V3.2h4.2V4.2z"/> - </group> + android:width="23dp" + android:height="18dp" + android:viewportWidth="23" + android:viewportHeight="18"> +<!-- + The asset contains a briefcase symbol of 15.26dp x 13.6dp in the center. +--> + <path + android:fillColor="@android:color/white" + android:pathData="M15.0815,4.5903 L15.0815,3.43636 L13.9276,2.2 L9.14696,2.2 L7.99302,3.43636 +L7.99302,4.5903 L9.14696,4.5903 L9.14696,3.43636 L13.9276,3.43636 +L13.9276,4.5903 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M18.0488,4.5903 L5.02575,4.5903 C4.36635,4.5903,3.87181,5.08485,3.87181,5.74424 +L3.87181,9.28848 C3.87181,9.94788,4.36635,10.4424,5.02575,10.4424 +L9.72393,10.4424 L9.72393,9.28848 L13.2682,9.28848 L13.2682,10.4424 +L17.9664,10.4424 C18.6257,10.4424,19.1203,9.94788,19.1203,9.28848 +L19.1203,5.74424 C19.2027,5.08485,18.6257,4.5903,18.0488,4.5903 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M9.80635,12.8327 L9.80635,11.6788 L4.44878,11.6788 L4.44878,14.6461 +C4.44878,15.3055,4.94332,15.8,5.60272,15.8 L17.3894,15.8 +C18.0488,15.8,18.5433,15.3055,18.5433,14.6461 L18.5433,11.6788 L13.2682,11.6788 +L13.2682,12.8327 L9.80635,12.8327 Z" /> </vector> diff --git a/packages/SystemUI/res/drawable/stat_sys_managed_profile_status_off.xml b/packages/SystemUI/res/drawable/stat_sys_managed_profile_status_off.xml new file mode 100644 index 000000000000..35602b61b89f --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_managed_profile_status_off.xml @@ -0,0 +1,53 @@ +<!-- +Copyright (C) 2015 The Android Open Source 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="23dp" + android:height="18dp" + android:viewportWidth="23" + android:viewportHeight="18"> +<!-- + The asset contains a briefcase symbol of 15.26dp x 13.6dp in the center. +--> + <path + android:pathData="M0,-6 L24,-6 L24,18 L0,18 L0,-6 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M13.9892,11.6542 L13.4088,11.6542 L13.4088,12.8152 L9.843,12.8152 L9.843,11.6542 +L4.4529,11.6542 L4.4529,14.6395 C4.4529,15.3029,4.95045,15.8005,5.61384,15.8005 +L17.4721,15.8005 C17.6379,15.8005,17.8038,15.8005,17.9696,15.7175 +L13.9892,11.6542 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M18.7159,13.8932 L18.7159,11.6542 L16.477,11.6542 +C17.3062,12.4835,18.1355,13.3127,18.7159,13.8932 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M6.85771,4.52272 L5.03337,4.52272 +C4.36998,4.52272,3.87243,5.02027,3.87243,5.68366 L3.87243,9.24942 +C3.87243,9.91282,4.36998,10.4104,5.03337,10.4104 L9.76008,10.4104 +L9.76008,9.24942 L11.5844,9.24942 L6.85771,4.52272 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M9.1796,4.35687 L9.1796,3.36177 L13.9063,3.36177 L13.9063,4.52272 +L9.34545,4.52272 C11.1698,6.34706,13.3258,8.5031,15.2331,10.4104 +L18.0525,10.4104 C18.7159,10.4104,19.2135,9.91282,19.2135,9.24942 +L19.2135,5.68366 C19.2135,5.02027,18.7159,4.52272,18.0525,4.52272 +L15.0673,4.52272 L15.0673,3.36177 L13.9063,2.20083 L9.1796,2.20083 +L8.10158,3.27885 C8.43328,3.61055,8.84791,4.02517,9.1796,4.35687 Z" /> + <path + android:fillColor="@android:color/white" + android:pathData="M3.281,3.42136 L4.51236,2.19 L18.585,16.2626 L17.3536,17.494 L3.281,3.42136 Z" /> +</vector>
\ No newline at end of file diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_cross_1_pathdata_interpolator.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_cross_1_pathdata_interpolator.xml new file mode 100644 index 000000000000..66cfaffd9936 --- /dev/null +++ b/packages/SystemUI/res/interpolator/ic_signal_workmode_disable_cross_1_pathdata_interpolator.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" + android:pathData="M 0,0 c 0.166666667,0 0.2,1 1,1" /> diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_cross_1_pathdata_interpolator.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_cross_1_pathdata_interpolator.xml new file mode 100644 index 000000000000..a0118d707951 --- /dev/null +++ b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_cross_1_pathdata_interpolator.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" + android:pathData="M 0,0 c 0.8,0 0.833333333,1 1,1" /> diff --git a/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_mask_pathdata_interpolator.xml b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_mask_pathdata_interpolator.xml new file mode 100644 index 000000000000..1820bab9e469 --- /dev/null +++ b/packages/SystemUI/res/interpolator/ic_signal_workmode_enable_mask_pathdata_interpolator.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2015 The Android Open Source 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. +--> +<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" + android:pathData="M 0,0 c 0.8,0 0.6,1 1,1" /> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 002b9f504e52..6c87cd6b83c4 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -401,6 +401,9 @@ <!-- Content description of the cast icon in the notification panel for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_casting">@string/quick_settings_casting</string> + <!-- Content description of the work mode icon in the notification panel for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_work_mode">Work mode</string> + <!-- Content description to tell the user that this button will remove an application from recents --> <string name="accessibility_recents_item_will_be_dismissed">Dismiss <xliff:g id="app" example="Calendar">%s</xliff:g>.</string> <!-- Content description to tell the user an application has been removed from recents --> @@ -505,6 +508,14 @@ <string name="accessibility_quick_settings_hotspot_changed_on">Mobile hotspot turned on.</string> <!-- Announcement made when the screen stopped casting (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_casting_turned_off">Screen casting stopped.</string> + <!-- Content description of the work mode title in quick settings when off (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_quick_settings_work_mode_off">Work mode off.</string> + <!-- Content description of the work mode title in quick settings when on (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_quick_settings_work_mode_on">Work mode on.</string> + <!-- Announcement made when the work mode changes to off (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_quick_settings_work_mode_changed_off">Work mode turned off.</string> + <!-- Announcement made when the work mode changes to on (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_quick_settings_work_mode_changed_on">Work mode turned on.</string> <!-- Content description of the display brightness slider (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_brightness">Display brightness</string> @@ -687,6 +698,8 @@ <string name="quick_settings_cellular_detail_data_limit"><xliff:g id="data_limit" example="2.0 GB">%s</xliff:g> limit</string> <!-- QuickSettings: Cellular detail panel, data warning format string [CHAR LIMIT=NONE] --> <string name="quick_settings_cellular_detail_data_warning"><xliff:g id="data_limit" example="2.0 GB">%s</xliff:g> warning</string> + <!-- QuickSettings: Work mode [CHAR LIMIT=NONE] --> + <string name="quick_settings_work_mode_label">Work mode</string> <!-- Recents: The empty recents string. [CHAR LIMIT=NONE] --> <string name="recents_empty_message">Your recent screens appear here</string> diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java new file mode 100644 index 000000000000..7605f3b89bf1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java @@ -0,0 +1,216 @@ +/* + * Copyright (C) 2015 The Android Open Source 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. + */ + +package com.android.systemui.qs.tiles; + +import android.app.ActivityManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.UserInfo; +import android.os.IUserManager; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.ArraySet; +import android.util.Log; + +import com.android.internal.logging.MetricsLogger; +import com.android.systemui.R; +import com.android.systemui.qs.QSTile; + +import java.util.LinkedList; +import java.util.List; + +/** Quick settings tile: Work profile on/off */ +public class WorkModeTile extends QSTile<QSTile.BooleanState> { + private final AnimationIcon mEnable = + new AnimationIcon(R.drawable.ic_signal_workmode_enable_animation); + private final AnimationIcon mDisable = + new AnimationIcon(R.drawable.ic_signal_workmode_disable_animation); + + private boolean mListening; + + private UserManager mUserManager; + private List<UserInfo> mProfiles; + + public WorkModeTile(Host host) { + super(host); + mUserManager = UserManager.get(mContext); + mProfiles = new LinkedList<UserInfo>(); + } + + @Override + protected BooleanState newTileState() { + return new BooleanState(); + } + + @Override + public void handleClick() { + MetricsLogger.action(mContext, getMetricsCategory(), !mState.value); + setWorkModeEnabled(!mState.value); + } + + private void reloadManagedProfiles(int userHandle) { + synchronized (mProfiles) { + mProfiles.clear(); + + if (userHandle == UserHandle.USER_CURRENT) { + userHandle = ActivityManager.getCurrentUser(); + } + for (UserInfo ui : mUserManager.getEnabledProfiles(userHandle)) { + if (ui.isManagedProfile()) { + mProfiles.add(ui); + } + } + } + } + + private boolean hasActiveProfile() { + synchronized (mProfiles) { + return mProfiles.size() > 0; + } + } + + private boolean isWorkModeEnabled() { + synchronized (mProfiles) { + for (UserInfo ui : mProfiles) { + if (ui.isQuietModeEnabled()) { + return false; + } + } + return true; + } + } + + private void refreshQuietModeState(boolean backgroundRefresh) { + if (backgroundRefresh) { + refreshState(isWorkModeEnabled() ? UserBoolean.BACKGROUND_TRUE + : UserBoolean.BACKGROUND_FALSE); + } else { + refreshState(isWorkModeEnabled() ? UserBoolean.USER_TRUE : UserBoolean.USER_FALSE); + } + } + + @Override + protected void handleUpdateState(BooleanState state, Object arg) { + if (!hasActiveProfile()) { + state.visible = false; + state.value = false; + return; + } + + final boolean userInitialized; + if (arg instanceof UserBoolean) { + state.value = ((UserBoolean) arg).value; + userInitialized = ((UserBoolean) arg).userInitiated; + } else { + state.value = isWorkModeEnabled(); + userInitialized = false; + } + + state.visible = true; + final AnimationIcon icon; + state.label = mContext.getString(R.string.quick_settings_work_mode_label); + if (state.value) { + icon = mEnable; + state.contentDescription = mContext.getString( + R.string.accessibility_quick_settings_work_mode_on); + } else { + icon = mDisable; + state.contentDescription = mContext.getString( + R.string.accessibility_quick_settings_work_mode_off); + } + icon.setAllowAnimation(userInitialized); + state.icon = icon; + } + + @Override + public int getMetricsCategory() { + return MetricsLogger.QS_WORKMODE; + } + + @Override + protected String composeChangeAnnouncement() { + if (mState.value) { + return mContext.getString(R.string.accessibility_quick_settings_work_mode_changed_on); + } else { + return mContext.getString(R.string.accessibility_quick_settings_work_mode_changed_off); + } + } + + @Override + public void setListening(boolean listening) { + if (mListening == listening) { + return; + } + mListening = listening; + if (listening) { + reloadManagedProfiles(UserHandle.USER_CURRENT); + + final IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_USER_SWITCHED); + filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED); + filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED); + filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED); + mContext.registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null); + } else { + mContext.unregisterReceiver(mReceiver); + } + } + + private void setWorkModeEnabled(boolean enabled) { + synchronized (mProfiles) { + for (UserInfo ui : mProfiles) { + mUserManager.setQuietModeEnabled(ui.id, !enabled); + } + } + } + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + final int targetUser; + final boolean isBackgroundRefresh; + switch (action) { + case Intent.ACTION_USER_SWITCHED: + targetUser = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, + UserHandle.USER_CURRENT); + isBackgroundRefresh = true; + break; + case Intent.ACTION_MANAGED_PROFILE_ADDED: + case Intent.ACTION_MANAGED_PROFILE_REMOVED: + targetUser = UserHandle.USER_CURRENT; + isBackgroundRefresh = true; + break; + case Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED: + targetUser = UserHandle.USER_CURRENT; + isBackgroundRefresh = false; + break; + default: + targetUser = UserHandle.USER_NULL; + isBackgroundRefresh = false; + } + if (targetUser != UserHandle.USER_NULL) { + reloadManagedProfiles(targetUser); + refreshQuietModeState(isBackgroundRefresh); + } + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 1f52a52a36fe..b89cd228819c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; +import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AlarmManager; import android.app.AlarmManager.AlarmClockInfo; @@ -71,6 +72,7 @@ public class PhoneStatusBarPolicy implements Callback { private final HotspotController mHotspot; private final AlarmManager mAlarmManager; private final UserInfoController mUserInfoController; + private final UserManager mUserManager; // Assume it's all good unless we hear otherwise. We don't always seem // to get broadcasts that it *is* there. @@ -83,7 +85,8 @@ public class PhoneStatusBarPolicy implements Callback { private int mZen; private boolean mManagedProfileFocused = false; - private boolean mManagedProfileIconVisible = true; + private boolean mManagedProfileIconVisible = false; + private boolean mManagedProfileInQuietMode = false; private boolean mKeyguardVisible = true; private BluetoothController mBluetooth; @@ -105,6 +108,10 @@ public class PhoneStatusBarPolicy implements Callback { else if (action.equals(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED)) { updateTTY(intent); } + else if (action.equals(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED)) { + updateQuietState(); + updateManagedProfile(); + } } }; @@ -126,6 +133,7 @@ public class PhoneStatusBarPolicy implements Callback { mService = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE); mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); mUserInfoController = userInfoController; + mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); // listen for broadcasts IntentFilter filter = new IntentFilter(); @@ -134,6 +142,7 @@ public class PhoneStatusBarPolicy implements Callback { filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED); + filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED); mContext.registerReceiver(mIntentReceiver, filter, null, mHandler); // listen for user / profile change. @@ -177,7 +186,7 @@ public class PhoneStatusBarPolicy implements Callback { // managed profile mService.setIcon(SLOT_MANAGED_PROFILE, R.drawable.stat_sys_managed_profile_status, 0, mContext.getString(R.string.accessibility_managed_profile)); - mService.setIconVisibility(SLOT_MANAGED_PROFILE, false); + mService.setIconVisibility(SLOT_MANAGED_PROFILE, mManagedProfileIconVisible); } public void setZenMode(int zen) { @@ -348,8 +357,18 @@ public class PhoneStatusBarPolicy implements Callback { } } + private void updateQuietState() { + mManagedProfileInQuietMode = false; + int currentUserId = ActivityManager.getCurrentUser(); + for (UserInfo ui : mUserManager.getEnabledProfiles(currentUserId)) { + if (ui.isManagedProfile() && ui.isQuietModeEnabled()) { + mManagedProfileInQuietMode = true; + return; + } + } + } + private void profileChanged(int userId) { - UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); UserInfo user = null; if (userId == UserHandle.USER_CURRENT) { try { @@ -358,7 +377,7 @@ public class PhoneStatusBarPolicy implements Callback { // Ignore } } else { - user = userManager.getUserInfo(userId); + user = mUserManager.getUserInfo(userId); } mManagedProfileFocused = user != null && user.isManagedProfile(); @@ -370,7 +389,18 @@ public class PhoneStatusBarPolicy implements Callback { if (DEBUG) Log.v(TAG, "updateManagedProfile: mManagedProfileFocused: " + mManagedProfileFocused + " mKeyguardVisible: " + mKeyguardVisible); - boolean showIcon = mManagedProfileFocused && !mKeyguardVisible; + final boolean showIcon; + if (mManagedProfileFocused && !mKeyguardVisible) { + showIcon = true; + mService.setIcon(SLOT_MANAGED_PROFILE, R.drawable.stat_sys_managed_profile_status, 0, + mContext.getString(R.string.accessibility_managed_profile)); + } else if (mManagedProfileInQuietMode) { + showIcon = true; + mService.setIcon(SLOT_MANAGED_PROFILE, R.drawable.stat_sys_managed_profile_status_off, 0, + mContext.getString(R.string.accessibility_managed_profile)); + } else { + showIcon = false; + } if (mManagedProfileIconVisible != showIcon) { mService.setIconVisibility(SLOT_MANAGED_PROFILE, showIcon); mManagedProfileIconVisible = showIcon; @@ -388,6 +418,8 @@ public class PhoneStatusBarPolicy implements Callback { public void onUserSwitchComplete(int newUserId) throws RemoteException { updateAlarm(); profileChanged(newUserId); + updateQuietState(); + updateManagedProfile(); } @Override @@ -423,5 +455,6 @@ public class PhoneStatusBarPolicy implements Callback { if (mCurrentUserSetup == userSetup) return; mCurrentUserSetup = userSetup; updateAlarm(); + updateQuietState(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index f7ff8aa13909..327b81ea6b22 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -54,6 +54,7 @@ import com.android.systemui.qs.tiles.QWifiTile; import com.android.systemui.qs.tiles.RotationLockTile; import com.android.systemui.qs.tiles.UserTile; import com.android.systemui.qs.tiles.WifiTile; +import com.android.systemui.qs.tiles.WorkModeTile; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BluetoothController; import com.android.systemui.statusbar.policy.CastController; @@ -338,6 +339,7 @@ public final class QSTileHost extends IQSService.Stub implements QSTile.Host, Tu else if (tileSpec.equals("inversion")) return new ColorInversionTile(this); else if (tileSpec.equals("cell")) return new CellularTile(this); else if (tileSpec.equals("airplane")) return new AirplaneModeTile(this); + else if (tileSpec.equals("work")) return new WorkModeTile(this); else if (tileSpec.equals("dnd")) return new DndTile(this); else if (tileSpec.equals("rotation")) return new RotationLockTile(this); else if (tileSpec.equals("flashlight")) return new FlashlightTile(this); |