diff options
19 files changed, 667 insertions, 0 deletions
diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index cee7d8f9a428..e1418678a9f8 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -54,6 +54,7 @@ android_library { "SettingsLibSettingsSpinner", "SettingsLibSettingsTransition", "SettingsLibSliderPreference", + "SettingsLibStatusBannerPreference", "SettingsLibTopIntroPreference", "SettingsLibTwoTargetPreference", "SettingsLibUsageProgressBarPreference", diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml index 88f7eb8737a2..05a1ceacdb65 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml @@ -335,4 +335,15 @@ <item name="android:textSize">14sp</item> <item name="android:textColor">?android:attr/colorAccent</item> </style> + + <style name="SettingsLibStatusBannerCardStyle"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_marginHorizontal">?android:attr/listPreferredItemPaddingStart</item> + <item name="android:layout_marginVertical">@dimen/settingslib_expressive_space_extrasmall4</item> + <item name="cardBackgroundColor">@color/settingslib_materialColorSurfaceBright</item> + <item name="cardCornerRadius">@dimen/settingslib_expressive_radius_extralarge2</item> + <item name="cardElevation">0dp</item> + <item name="rippleColor">?android:attr/colorControlHighlight</item> + </style> </resources>
\ No newline at end of file diff --git a/packages/SettingsLib/StatusBannerPreference/Android.bp b/packages/SettingsLib/StatusBannerPreference/Android.bp new file mode 100644 index 000000000000..d6af318da108 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/Android.bp @@ -0,0 +1,33 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +android_library { + name: "SettingsLibStatusBannerPreference", + use_resource_processor: true, + defaults: [ + "SettingsLintDefaults", + ], + + srcs: [ + "src/**/*.java", + "src/**/*.kt", + ], + resource_dirs: ["res"], + + static_libs: [ + "androidx.annotation_annotation", + "androidx.preference_preference", + "SettingsLibSettingsTheme", + ], + sdk_version: "system_current", + min_sdk_version: "24", + apex_available: [ + "//apex_available:platform", + ], +} diff --git a/packages/SettingsLib/StatusBannerPreference/AndroidManifest.xml b/packages/SettingsLib/StatusBannerPreference/AndroidManifest.xml new file mode 100644 index 000000000000..1dca93f813e3 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/AndroidManifest.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2020 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. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.settingslib.widget.preference.statusbanner"> + + <uses-sdk android:minSdkVersion="24" /> + +</manifest> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_high.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_high.xml new file mode 100644 index 000000000000..b977893c2b89 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_high.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <size android:height="68dp" android:width="68dp" /> + <solid android:color="@color/settingslib_materialColorSurfaceContainerHigh" /> +</shape> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_low.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_low.xml new file mode 100644 index 000000000000..b977893c2b89 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_low.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <size android:height="68dp" android:width="68dp" /> + <solid android:color="@color/settingslib_materialColorSurfaceContainerHigh" /> +</shape> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_medium.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_medium.xml new file mode 100644 index 000000000000..b977893c2b89 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable-night/settingslib_expressive_background_level_medium.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <size android:height="68dp" android:width="68dp" /> + <solid android:color="@color/settingslib_materialColorSurfaceContainerHigh" /> +</shape> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_generic.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_generic.xml new file mode 100644 index 000000000000..b64c09f6f12e --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_generic.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <size android:height="68dp" android:width="68dp" /> + <solid android:color="@color/settingslib_materialColorSurfaceContainerHigh" /> +</shape>
\ No newline at end of file diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_high.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_high.xml new file mode 100644 index 000000000000..c3caaf7fb1c9 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_high.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <size android:height="68dp" android:width="68dp" /> + <solid android:color="#FFECEE" /> +</shape> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_low.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_low.xml new file mode 100644 index 000000000000..4e2254c44016 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_low.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <size android:height="68dp" android:width="68dp" /> + <solid android:color="#DDF8D8" /> +</shape> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_medium.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_medium.xml new file mode 100644 index 000000000000..31ac0596353c --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_background_level_medium.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="oval"> + <size android:height="68dp" android:width="68dp" /> + <solid android:color="#FFF2B4" /> +</shape> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_high.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_high.xml new file mode 100644 index 000000000000..58d0fd023b54 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_high.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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="34dp" + android:height="42dp" + android:viewportWidth="34" + android:viewportHeight="42"> + <path + android:pathData="M0.856,17.569C0.887,19.083 1.004,20.593 1.206,22.094C2.166,28.584 5.804,35.937 15.774,41.089C16.171,41.293 16.61,41.4 17.056,41.4C17.503,41.4 17.942,41.293 18.339,41.089C28.309,35.936 31.947,28.583 32.907,22.093C33.109,20.593 33.226,19.083 33.256,17.569V8.605C33.257,7.919 33.046,7.25 32.652,6.688C32.259,6.127 31.703,5.7 31.059,5.467L18.191,0.8C17.458,0.534 16.655,0.534 15.922,0.8L3.054,5.467C2.41,5.7 1.854,6.127 1.461,6.688C1.067,7.25 0.856,7.919 0.856,8.605V17.569Z" + android:fillColor="#DB372D"/> + <path + android:pathData="M15.067,24.333V10.733H18.933V24.333H15.067ZM15.067,31.267V27.433H18.933V31.267H15.067Z" + android:fillColor="@color/settingslib_materialColorSurfaceContainerLowest"/> +</vector> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_low.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_low.xml new file mode 100644 index 000000000000..d8862e87ba19 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_low.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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="34dp" + android:height="42dp" + android:viewportWidth="34" + android:viewportHeight="42"> + <path + android:pathData="M0.856,17.569C0.887,19.083 1.004,20.593 1.206,22.094C2.166,28.584 5.804,35.937 15.774,41.089C16.171,41.293 16.61,41.4 17.056,41.4C17.503,41.4 17.942,41.293 18.339,41.089C28.309,35.936 31.947,28.583 32.907,22.093C33.109,20.593 33.226,19.083 33.256,17.569V8.605C33.257,7.919 33.046,7.25 32.652,6.688C32.259,6.127 31.703,5.7 31.059,5.467L18.191,0.8C17.458,0.534 16.655,0.534 15.922,0.8L3.054,5.467C2.41,5.7 1.854,6.127 1.461,6.688C1.067,7.25 0.856,7.919 0.856,8.605V17.569Z" + android:fillColor="#1AA64A"/> + <path + android:pathData="M14.389,27.733L8.423,21.767L11.156,19.033L14.389,22.267L22.956,13.7L25.69,16.433L14.389,27.733Z" + android:fillColor="@color/settingslib_materialColorSurfaceContainerLowest"/> +</vector> diff --git a/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_medium.xml b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_medium.xml new file mode 100644 index 000000000000..5e34050e7a3d --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/drawable/settingslib_expressive_icon_status_level_medium.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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="34dp" + android:height="42dp" + android:viewportWidth="34" + android:viewportHeight="42"> + <path + android:pathData="M0.856,17.569C0.887,19.083 1.004,20.593 1.206,22.094C2.166,28.584 5.804,35.937 15.774,41.089C16.171,41.293 16.61,41.4 17.056,41.4C17.503,41.4 17.942,41.293 18.339,41.089C28.309,35.936 31.947,28.583 32.907,22.093C33.109,20.593 33.226,19.083 33.256,17.569V8.605C33.257,7.919 33.046,7.25 32.652,6.688C32.259,6.127 31.703,5.7 31.059,5.467L18.191,0.8C17.458,0.534 16.655,0.534 15.922,0.8L3.054,5.467C2.41,5.7 1.854,6.127 1.461,6.688C1.067,7.25 0.856,7.919 0.856,8.605V17.569Z" + android:fillColor="#FCBD00"/> + <path + android:pathData="M15.067,24.333V10.733H18.933V24.333H15.067ZM15.067,31.267V27.433H18.933V31.267H15.067Z" + android:fillColor="@color/settingslib_materialColorSurfaceContainerLowest"/> +</vector> diff --git a/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml b/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml new file mode 100644 index 000000000000..9a3e5b9e1e50 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/layout/settingslib_expressive_preference_statusbanner.xml @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. + --> + +<com.google.android.material.card.MaterialCardView + xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/SettingsLibStatusBannerCardStyle"> + + <LinearLayout + android:id="@+id/banner_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:baselineAligned="false" + android:paddingVertical="@dimen/settingslib_expressive_space_small1" + android:paddingHorizontal="?android:attr/listPreferredItemPaddingStart" + android:orientation="vertical"> + + <LinearLayout + android:id="@+id/status_container" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="horizontal"> + + <FrameLayout + android:id="@android:id/icon_frame" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="@dimen/settingslib_status_banner_icon_frame_size" + android:minHeight="@dimen/settingslib_status_banner_icon_frame_size" + android:gravity="center" + android:orientation="horizontal"> + + <ImageView + android:id="@+id/icon_background" + android:layout_width="wrap_content" + android:layout_height="wrap_content"/> + + <ImageView + android:id="@android:id/icon" + android:layout_width="@dimen/settingslib_expressive_space_medium4" + android:layout_height="@dimen/settingslib_expressive_space_medium4" + android:layout_gravity="center" + android:scaleType="centerInside"/> + + </FrameLayout> + + <LinearLayout + android:id="@+id/text_container" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:paddingVertical="@dimen/settingslib_expressive_space_extrasmall4" + android:paddingHorizontal="@dimen/settingslib_expressive_space_small1" + android:layout_weight="1" + android:layout_gravity="center" + android:orientation="vertical"> + <TextView + android:id="@android:id/title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hyphenationFrequency="normalFast" + android:lineBreakWordStyle="phrase" + android:textAppearance="@style/SettingsLibTextAppearance.Emphasized.Title.Large"/> + + <TextView + android:id="@android:id/summary" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hyphenationFrequency="normalFast" + android:lineBreakWordStyle="phrase" + android:maxLines="3" + android:textAppearance="@style/SettingsLibTextAppearance.Primary.Body.Medium"/> + </LinearLayout> + </LinearLayout> + + <com.google.android.material.button.MaterialButton + android:id="@+id/status_banner_button" + android:layout_marginTop="@dimen/settingslib_expressive_space_small3" + style="@style/SettingsLibButtonStyle.Expressive.Filled.Extra"/> + + </LinearLayout> +</com.google.android.material.card.MaterialCardView>
\ No newline at end of file diff --git a/packages/SettingsLib/StatusBannerPreference/res/values/attrs.xml b/packages/SettingsLib/StatusBannerPreference/res/values/attrs.xml new file mode 100644 index 000000000000..54860d4af20f --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/values/attrs.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2024 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. +--> + +<resources> + <declare-styleable name="StatusBanner"> + <attr name="iconLevel" format="enum"> + <enum name="generic" value="0"/> + <enum name="low" value="1"/> + <enum name="medium" value="2"/> + <enum name="high" value="3"/> + </attr> + <attr name="buttonLevel" format="enum"> + <enum name="generic" value="0"/> + <enum name="low" value="1"/> + <enum name="medium" value="2"/> + <enum name="high" value="3"/> + </attr> + <attr name="buttonText" format="string"/> + </declare-styleable> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/StatusBannerPreference/res/values/colors.xml b/packages/SettingsLib/StatusBannerPreference/res/values/colors.xml new file mode 100644 index 000000000000..19181dd55852 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/values/colors.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. +--> + +<resources> + <!-- static palette green60 --> + <color name="settingslib_expressive_color_status_level_low">#1AA64A</color> + <!-- static palette yellow80 --> + <color name="settingslib_expressive_color_status_level_medium">#FCBD00</color> + <!-- static palette red50 --> + <color name="settingslib_expressive_color_status_level_high">#DB372D</color> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/StatusBannerPreference/res/values/dimens.xml b/packages/SettingsLib/StatusBannerPreference/res/values/dimens.xml new file mode 100644 index 000000000000..f18f168701c0 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/res/values/dimens.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2024 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. +--> + +<resources> + <dimen name="settingslib_status_banner_icon_frame_size">68dp</dimen> +</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/StatusBannerPreference/src/com/android/settingslib/widget/StatusBannerPreference.kt b/packages/SettingsLib/StatusBannerPreference/src/com/android/settingslib/widget/StatusBannerPreference.kt new file mode 100644 index 000000000000..c1578ef69635 --- /dev/null +++ b/packages/SettingsLib/StatusBannerPreference/src/com/android/settingslib/widget/StatusBannerPreference.kt @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2024 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.settingslib.widget + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.drawable.Drawable +import android.util.AttributeSet +import android.view.View +import android.widget.ImageView +import androidx.annotation.StringRes +import androidx.core.content.ContextCompat +import androidx.preference.Preference +import androidx.preference.PreferenceViewHolder +import com.android.settingslib.widget.preference.statusbanner.R +import com.google.android.material.button.MaterialButton + +class StatusBannerPreference @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : Preference(context, attrs, defStyleAttr, defStyleRes) { + + enum class BannerStatus { + GENERIC, + LOW, + MEDIUM, + HIGH + } + var iconLevel: BannerStatus = BannerStatus.GENERIC + set(value) { + field = value + notifyChanged() + } + var buttonLevel: BannerStatus = BannerStatus.GENERIC + set(value) { + field = value + notifyChanged() + } + private var buttonText: String = "" + set(value) { + field = value + notifyChanged() + } + private var listener: View.OnClickListener? = null + + init { + layoutResource = R.layout.settingslib_expressive_preference_statusbanner + isSelectable = false + + initAttributes(context, attrs, defStyleAttr) + } + + private fun initAttributes(context: Context, attrs: AttributeSet?, defStyleAttr: Int) { + context.obtainStyledAttributes( + attrs, + R.styleable.StatusBanner, defStyleAttr, 0 + ).apply { + iconLevel = getInteger(R.styleable.StatusBanner_iconLevel, 0).toBannerStatus() + if (icon == null) { + icon = getIconDrawable(iconLevel) + } else { + icon!!.setTintList(ColorStateList.valueOf(getBackgroundColor(iconLevel))) + } + buttonLevel = getInteger(R.styleable.StatusBanner_buttonLevel, 0).toBannerStatus() + buttonText = getString(R.styleable.StatusBanner_buttonText) ?: "" + recycle() + } + } + + private fun Int.toBannerStatus(): BannerStatus = when (this) { + 1 -> BannerStatus.LOW + 2 -> BannerStatus.MEDIUM + 3 -> BannerStatus.HIGH + else -> BannerStatus.GENERIC + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + holder.isDividerAllowedBelow = false + holder.isDividerAllowedAbove = false + + (holder.findViewById(R.id.icon_background) as? ImageView)?.apply { + setImageDrawable(getBackgroundDrawable(iconLevel)) + } + + holder.findViewById(android.R.id.icon_frame)?.apply { + visibility = if (icon != null) View.VISIBLE else View.GONE + } + + (holder.findViewById(R.id.status_banner_button) as? MaterialButton)?.apply { + setBackgroundColor(getBackgroundColor(buttonLevel)) + text = buttonText + setOnClickListener(listener) + visibility = if (listener != null) View.VISIBLE else View.GONE + } + } + + /** + * Sets the text to be displayed in button. + */ + fun setButtonText(@StringRes textResId: Int) { + buttonText = context.getString(textResId) + } + + /** + * Register a callback to be invoked when positive button is clicked. + */ + fun setButtonOnClickListener(listener: View.OnClickListener) { + this.listener = listener + notifyChanged() + } + + private fun getBackgroundColor(level: BannerStatus): Int { + return when (level) { + BannerStatus.LOW -> ContextCompat.getColor( + context, + R.color.settingslib_expressive_color_status_level_low + ) + + BannerStatus.MEDIUM -> ContextCompat.getColor( + context, + R.color.settingslib_expressive_color_status_level_medium + ) + + BannerStatus.HIGH -> ContextCompat.getColor( + context, + R.color.settingslib_expressive_color_status_level_high + ) + + else -> ContextCompat.getColor( + context, + com.android.settingslib.widget.theme.R.color.settingslib_materialColorPrimary + ) + } + } + + private fun getIconDrawable(level: BannerStatus): Drawable? { + return when (level) { + BannerStatus.LOW -> ContextCompat.getDrawable( + context, + R.drawable.settingslib_expressive_icon_status_level_low + ) + + BannerStatus.MEDIUM -> ContextCompat.getDrawable( + context, + R.drawable.settingslib_expressive_icon_status_level_medium + ) + + BannerStatus.HIGH -> ContextCompat.getDrawable( + context, + R.drawable.settingslib_expressive_icon_status_level_high + ) + + else -> null + } + } + + private fun getBackgroundDrawable(level: BannerStatus): Drawable? { + return when (level) { + BannerStatus.LOW -> ContextCompat.getDrawable( + context, + R.drawable.settingslib_expressive_background_level_low + ) + + BannerStatus.MEDIUM -> ContextCompat.getDrawable( + context, + R.drawable.settingslib_expressive_background_level_medium + ) + + BannerStatus.HIGH -> ContextCompat.getDrawable( + context, + R.drawable.settingslib_expressive_background_level_high + ) + + else -> ContextCompat.getDrawable( + context, + R.drawable.settingslib_expressive_background_generic + ) + } + } +}
\ No newline at end of file |