diff --git a/res/color/dream_card_color_state_list.xml b/res/color/dream_card_color_state_list.xml
index 082408d1583..44ed589004f 100644
--- a/res/color/dream_card_color_state_list.xml
+++ b/res/color/dream_card_color_state_list.xml
@@ -17,6 +17,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/res/color/dream_card_icon_color_state_list.xml b/res/color/dream_card_icon_color_state_list.xml
index ed34ae39357..f3e08721b92 100644
--- a/res/color/dream_card_icon_color_state_list.xml
+++ b/res/color/dream_card_icon_color_state_list.xml
@@ -17,6 +17,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/res/color/dream_card_summary_color_state_list.xml b/res/color/dream_card_summary_color_state_list.xml
index a1845f44d95..7252abed0cb 100644
--- a/res/color/dream_card_summary_color_state_list.xml
+++ b/res/color/dream_card_summary_color_state_list.xml
@@ -17,6 +17,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/res/color/dream_card_text_color_state_list.xml b/res/color/dream_card_text_color_state_list.xml
index b39bbed75c9..c4b3ef5f414 100644
--- a/res/color/dream_card_text_color_state_list.xml
+++ b/res/color/dream_card_text_color_state_list.xml
@@ -17,6 +17,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/res/color/modes_icon_selectable_background.xml b/res/color/modes_icon_selectable_background.xml
index f9280c60d6c..b3b393562d3 100644
--- a/res/color/modes_icon_selectable_background.xml
+++ b/res/color/modes_icon_selectable_background.xml
@@ -19,7 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
-
-
-
+
+
+
diff --git a/res/color/modes_icon_selectable_icon.xml b/res/color/modes_icon_selectable_icon.xml
index 8a517d5f474..a5ab92b1d5b 100644
--- a/res/color/modes_icon_selectable_icon.xml
+++ b/res/color/modes_icon_selectable_icon.xml
@@ -19,7 +19,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
-
-
-
+
+
+
diff --git a/res/drawable/accessibility_contrast_button_background.xml b/res/drawable/accessibility_contrast_button_background.xml
index 7e41aaebee4..5f0f5ad09ec 100644
--- a/res/drawable/accessibility_contrast_button_background.xml
+++ b/res/drawable/accessibility_contrast_button_background.xml
@@ -22,9 +22,9 @@
-
-
+
@@ -41,7 +41,7 @@
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
@@ -55,7 +55,7 @@
android:left="@dimen/contrast_button_stroke_width"
android:right="@dimen/contrast_button_stroke_width">
-
+
diff --git a/res/drawable/broadcast_button_outline.xml b/res/drawable/broadcast_button_outline.xml
index c8658a9fccd..1645ad07a25 100644
--- a/res/drawable/broadcast_button_outline.xml
+++ b/res/drawable/broadcast_button_outline.xml
@@ -29,7 +29,7 @@
-
-
+
\ No newline at end of file
diff --git a/res/drawable/color_contrast_preview_bottom_appbar_background.xml b/res/drawable/color_contrast_preview_bottom_appbar_background.xml
index f3392fb01b5..7ffe3742c56 100644
--- a/res/drawable/color_contrast_preview_bottom_appbar_background.xml
+++ b/res/drawable/color_contrast_preview_bottom_appbar_background.xml
@@ -17,7 +17,7 @@
-
+
-
+
diff --git a/res/drawable/color_contrast_preview_dialog_background.xml b/res/drawable/color_contrast_preview_dialog_background.xml
index f60a271ec3d..61219ac36d7 100644
--- a/res/drawable/color_contrast_preview_dialog_background.xml
+++ b/res/drawable/color_contrast_preview_dialog_background.xml
@@ -17,6 +17,6 @@
-
+
\ No newline at end of file
diff --git a/res/drawable/color_contrast_preview_icon_edit_background.xml b/res/drawable/color_contrast_preview_icon_edit_background.xml
index 61fe4fef8f6..b6b2930f134 100644
--- a/res/drawable/color_contrast_preview_icon_edit_background.xml
+++ b/res/drawable/color_contrast_preview_icon_edit_background.xml
@@ -17,6 +17,6 @@
-
+
\ No newline at end of file
diff --git a/res/drawable/color_contrast_preview_icon_group_background.xml b/res/drawable/color_contrast_preview_icon_group_background.xml
index 46cd40d9acf..284d9caea88 100644
--- a/res/drawable/color_contrast_preview_icon_group_background.xml
+++ b/res/drawable/color_contrast_preview_icon_group_background.xml
@@ -17,6 +17,6 @@
-
+
\ No newline at end of file
diff --git a/res/drawable/color_contrast_preview_icon_inbox_background.xml b/res/drawable/color_contrast_preview_icon_inbox_background.xml
index 45d82852456..b63d9181cfa 100644
--- a/res/drawable/color_contrast_preview_icon_inbox_background.xml
+++ b/res/drawable/color_contrast_preview_icon_inbox_background.xml
@@ -17,7 +17,7 @@
-
+
\ No newline at end of file
diff --git a/res/drawable/color_contrast_preview_icon_star_background.xml b/res/drawable/color_contrast_preview_icon_star_background.xml
index 335ee886f7f..027d3e15904 100644
--- a/res/drawable/color_contrast_preview_icon_star_background.xml
+++ b/res/drawable/color_contrast_preview_icon_star_background.xml
@@ -17,6 +17,6 @@
-
+
\ No newline at end of file
diff --git a/res/drawable/color_contrast_preview_tag_background.xml b/res/drawable/color_contrast_preview_tag_background.xml
index a7b051aa280..91b090cd963 100644
--- a/res/drawable/color_contrast_preview_tag_background.xml
+++ b/res/drawable/color_contrast_preview_tag_background.xml
@@ -17,6 +17,6 @@
-
+
\ No newline at end of file
diff --git a/res/drawable/dream_default_preview_icon.xml b/res/drawable/dream_default_preview_icon.xml
index 8989929fdd7..be3f128a39d 100644
--- a/res/drawable/dream_default_preview_icon.xml
+++ b/res/drawable/dream_default_preview_icon.xml
@@ -20,6 +20,6 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
-
\ No newline at end of file
diff --git a/res/drawable/dream_preview_rounded_bg.xml b/res/drawable/dream_preview_rounded_bg.xml
index 7cae599b6c8..c7034e7fbef 100644
--- a/res/drawable/dream_preview_rounded_bg.xml
+++ b/res/drawable/dream_preview_rounded_bg.xml
@@ -17,6 +17,6 @@
-
+
\ No newline at end of file
diff --git a/res/drawable/ic_article_24dp.xml b/res/drawable/ic_article_24dp.xml
index 0b38daaf643..bf9d2f7f8c7 100644
--- a/res/drawable/ic_article_24dp.xml
+++ b/res/drawable/ic_article_24dp.xml
@@ -22,6 +22,6 @@
android:tint="?attr/colorControlNormal"
android:autoMirrored="true">
diff --git a/res/drawable/ic_article_filled_24dp.xml b/res/drawable/ic_article_filled_24dp.xml
index e22d151beb7..9e5f24c0aad 100644
--- a/res/drawable/ic_article_filled_24dp.xml
+++ b/res/drawable/ic_article_filled_24dp.xml
@@ -21,6 +21,6 @@
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
diff --git a/res/drawable/ic_chat_bubble_24dp.xml b/res/drawable/ic_chat_bubble_24dp.xml
index c7ad6bf28a1..5b6536b9655 100644
--- a/res/drawable/ic_chat_bubble_24dp.xml
+++ b/res/drawable/ic_chat_bubble_24dp.xml
@@ -21,6 +21,6 @@
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
diff --git a/res/drawable/ic_edit_24dp.xml b/res/drawable/ic_edit_24dp.xml
index e663b5275c0..fdd82f579d3 100644
--- a/res/drawable/ic_edit_24dp.xml
+++ b/res/drawable/ic_edit_24dp.xml
@@ -21,6 +21,6 @@
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
diff --git a/res/drawable/ic_group_24dp.xml b/res/drawable/ic_group_24dp.xml
index 92815c2cc2f..1c65fc26a4f 100644
--- a/res/drawable/ic_group_24dp.xml
+++ b/res/drawable/ic_group_24dp.xml
@@ -21,6 +21,6 @@
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
diff --git a/res/drawable/ic_inbox_24dp.xml b/res/drawable/ic_inbox_24dp.xml
index 7800ea145ef..18cc3e951ae 100644
--- a/res/drawable/ic_inbox_24dp.xml
+++ b/res/drawable/ic_inbox_24dp.xml
@@ -21,6 +21,6 @@
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
diff --git a/res/drawable/ic_modifier_keys_reset.xml b/res/drawable/ic_modifier_keys_reset.xml
index 5345c2578f9..9fdbab0b53a 100644
--- a/res/drawable/ic_modifier_keys_reset.xml
+++ b/res/drawable/ic_modifier_keys_reset.xml
@@ -21,7 +21,7 @@
android:height="24.0dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
- android:tint="?androidprv:attr/materialColorPrimary">
+ android:tint="@androidprv:color/materialColorPrimary">
diff --git a/res/drawable/ic_star_24dp.xml b/res/drawable/ic_star_24dp.xml
index 667db94e0fd..449067875c4 100644
--- a/res/drawable/ic_star_24dp.xml
+++ b/res/drawable/ic_star_24dp.xml
@@ -21,6 +21,6 @@
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
diff --git a/res/drawable/modifier_key_bordered.xml b/res/drawable/modifier_key_bordered.xml
index 2931679685d..a3c7cc5d318 100644
--- a/res/drawable/modifier_key_bordered.xml
+++ b/res/drawable/modifier_key_bordered.xml
@@ -25,7 +25,7 @@
+ android:color="@androidprv:color/materialColorPrimary"/>
diff --git a/res/drawable/modifier_key_colored.xml b/res/drawable/modifier_key_colored.xml
index 995d7336564..4610738127e 100644
--- a/res/drawable/modifier_key_colored.xml
+++ b/res/drawable/modifier_key_colored.xml
@@ -22,7 +22,7 @@
-
-
+
diff --git a/res/drawable/modifier_key_lisetview_background.xml b/res/drawable/modifier_key_lisetview_background.xml
index 3353cfdaab2..a0d8c03bfac 100644
--- a/res/drawable/modifier_key_lisetview_background.xml
+++ b/res/drawable/modifier_key_lisetview_background.xml
@@ -22,7 +22,7 @@
-
-
+
diff --git a/res/drawable/pointer_icon_fill_container_background.xml b/res/drawable/pointer_icon_fill_container_background.xml
index ca930a74540..7f6bf533073 100644
--- a/res/drawable/pointer_icon_fill_container_background.xml
+++ b/res/drawable/pointer_icon_fill_container_background.xml
@@ -18,5 +18,5 @@
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
-
+
diff --git a/res/drawable/preference_circular_icons_plus_item_background.xml b/res/drawable/preference_circular_icons_plus_item_background.xml
index faaa1fd11fe..e261c76af46 100644
--- a/res/drawable/preference_circular_icons_plus_item_background.xml
+++ b/res/drawable/preference_circular_icons_plus_item_background.xml
@@ -21,5 +21,5 @@
-
+
\ No newline at end of file
diff --git a/res/drawable/rounded_bg.xml b/res/drawable/rounded_bg.xml
index ae12af895dc..0e2743de1c3 100644
--- a/res/drawable/rounded_bg.xml
+++ b/res/drawable/rounded_bg.xml
@@ -17,7 +17,7 @@
-
+
-
+ android:color="@androidprv:color/materialColorPrimary"/>
diff --git a/res/drawable/trackpad_button_done_colored.xml b/res/drawable/trackpad_button_done_colored.xml
index 995d7336564..4610738127e 100644
--- a/res/drawable/trackpad_button_done_colored.xml
+++ b/res/drawable/trackpad_button_done_colored.xml
@@ -22,7 +22,7 @@
-
-
+
diff --git a/res/drawable/user_select_background.xml b/res/drawable/user_select_background.xml
index 7b75160213d..490246c49fe 100644
--- a/res/drawable/user_select_background.xml
+++ b/res/drawable/user_select_background.xml
@@ -19,13 +19,13 @@
android:color="@color/settingslib_ripple_color">
-
-
+
-
-
+
diff --git a/res/drawable/volume_dialog_button_background_outline.xml b/res/drawable/volume_dialog_button_background_outline.xml
index 36ffb93f7a4..f8df90e604b 100644
--- a/res/drawable/volume_dialog_button_background_outline.xml
+++ b/res/drawable/volume_dialog_button_background_outline.xml
@@ -21,7 +21,7 @@
+ android:textColor="@androidprv:color/materialColorOnSurface"/>
+ android:textColor="@androidprv:color/materialColorOnSurface"/>
+ android:textColor="@androidprv:color/materialColorOnSurface"/>
+
+
+
diff --git a/res/layout/modifier_key_item.xml b/res/layout/modifier_key_item.xml
index 683f631f14a..00190367569 100644
--- a/res/layout/modifier_key_item.xml
+++ b/res/layout/modifier_key_item.xml
@@ -31,7 +31,7 @@
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:src="@drawable/ic_check_24dp"
- android:tint="?androidprv:attr/materialColorPrimary"/>
+ android:tint="@androidprv:color/materialColorPrimary"/>
diff --git a/res/layout/notification_ls_minimalism_selector.xml b/res/layout/notification_ls_minimalism_selector.xml
index d37ad5401a2..cf34561082d 100644
--- a/res/layout/notification_ls_minimalism_selector.xml
+++ b/res/layout/notification_ls_minimalism_selector.xml
@@ -74,7 +74,7 @@
android:singleLine="true"
android:textSize="@dimen/contrast_button_text_size"
android:text="@string/lock_screen_notifs_show_compact"
- android:textColor="?androidprv:attr/materialColorOnSurface"/>
+ android:textColor="@androidprv:color/materialColorOnSurface"/>
+ android:textColor="@androidprv:color/materialColorOnSurface"/>
diff --git a/res/layout/pointer_icon_stroke_style_layout.xml b/res/layout/pointer_icon_stroke_style_layout.xml
index 01b58b294ce..a68b5967357 100644
--- a/res/layout/pointer_icon_stroke_style_layout.xml
+++ b/res/layout/pointer_icon_stroke_style_layout.xml
@@ -31,7 +31,7 @@
android:layout_marginTop="@dimen/pointer_stroke_style_padding"
android:text="@string/pointer_stroke_style"
android:textSize="14sp"
- android:textColor="?androidprv:attr/materialColorPrimary"
+ android:textColor="@androidprv:color/materialColorPrimary"
android:textAlignment="viewStart"
android:fontWeight="500"
android:textAppearance="?android:attr/textAppearanceListItem" />
diff --git a/res/layout/preference_background.xml b/res/layout/preference_background.xml
index 51718b8fd5c..1c69be4ac7e 100644
--- a/res/layout/preference_background.xml
+++ b/res/layout/preference_background.xml
@@ -65,7 +65,7 @@
android:layout_height="wrap_content"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceListItem"
- android:textColor="?androidprv:attr/materialColorOnPrimaryContainer"
+ android:textColor="@androidprv:color/materialColorOnPrimaryContainer"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:hyphenationFrequency="normalFast"
@@ -78,7 +78,7 @@
android:layout_alignStart="@android:id/title"
android:layout_alignLeft="@android:id/title"
android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="?androidprv:attr/materialColorOnPrimaryContainer"
+ android:textColor="@androidprv:color/materialColorOnPrimaryContainer"
android:hyphenationFrequency="normalFast"
android:lineBreakWordStyle="phrase"
android:maxLines="4"
diff --git a/res/layout/preference_circular_icons_plus_item.xml b/res/layout/preference_circular_icons_plus_item.xml
index 98820863410..352708806b7 100644
--- a/res/layout/preference_circular_icons_plus_item.xml
+++ b/res/layout/preference_circular_icons_plus_item.xml
@@ -26,7 +26,7 @@
android:padding="4dp"
android:drawablePadding="0dp"
android:background="@drawable/preference_circular_icons_plus_item_background"
- android:textColor="?androidprv:attr/materialColorOnSecondaryContainer"
+ android:textColor="@androidprv:color/materialColorOnSecondaryContainer"
android:maxLines="1"
android:autoSizeTextType="uniform"
android:autoSizeMinTextSize="6sp" />
\ No newline at end of file
diff --git a/res/layout/preference_widget_arrow.xml b/res/layout/preference_widget_arrow.xml
index f36f693f012..50edb3c0bd6 100644
--- a/res/layout/preference_widget_arrow.xml
+++ b/res/layout/preference_widget_arrow.xml
@@ -23,5 +23,5 @@
android:layout_gravity="center_vertical"
android:contentDescription="@null"
android:scaleType="center"
- android:tint="?androidprv:attr/materialColorOnPrimaryContainer"
+ android:tint="@androidprv:color/materialColorOnPrimaryContainer"
android:src="@drawable/ic_arrow_forward" />
\ No newline at end of file
diff --git a/res/layout/trackpad_gesture_preview.xml b/res/layout/trackpad_gesture_preview.xml
index 15cc743196d..978da06319c 100644
--- a/res/layout/trackpad_gesture_preview.xml
+++ b/res/layout/trackpad_gesture_preview.xml
@@ -82,7 +82,7 @@
android:paddingVertical="14dp"
android:drawablePadding="9dp"
style="@style/TrackpadButtonDone"
- android:textColor="?androidprv:attr/materialColorOnPrimary"
+ android:textColor="@androidprv:color/materialColorOnPrimary"
android:text="@string/gesture_button_next"/>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index 69f17f64b88..a117e47a93f 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -19,7 +19,7 @@
#783BE5
#3F5FBD
@*android:color/material_grey_900
- ?androidprv:attr/materialColorSurfaceBright
+ @androidprv:color/materialColorSurfaceBright
#5F6368
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 91598fe6309..0b7e0c1eb65 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -94,7 +94,7 @@
@*android:color/accent_device_default_light
- ?androidprv:attr/materialColorSurfaceBright
+ @androidprv:color/materialColorSurfaceBright
#42a5f5
@@ -166,7 +166,7 @@
@*android:color/primary_text_default_material_light
- ?androidprv:attr/materialColorSurfaceContainer
+ @androidprv:color/materialColorSurfaceContainer
?android:attr/textColorPrimary
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 5bcb805aeaf..c656e138b13 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -249,7 +249,7 @@
- center
- @*android:string/config_headlineFontFamily
- @dimen/search_bar_text_size
- - ?androidprv:attr/materialColorOnSurfaceVariant
+ - @androidprv:color/materialColorOnSurfaceVariant
- true
@@ -448,7 +448,7 @@
- @dimen/contextual_card_vertical_margin
- @dimen/contextual_card_side_margin
- @dimen/contextual_card_side_margin
- - ?androidprv:attr/materialColorSurfaceContainer
+ - @androidprv:color/materialColorSurfaceContainer
- @dimen/contextual_card_corner_radius
- 0dp
- ?android:attr/colorControlHighlight
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 4f20d8c9091..9d416f729fd 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -67,12 +67,12 @@
- @style/Widget.SliceView.Settings
- @android:color/transparent
- - ?androidprv:attr/materialColorOutlineVariant
- - ?androidprv:attr/materialColorOnSurfaceVariant
+ - @androidprv:color/materialColorOutlineVariant
+ - @androidprv:color/materialColorOnSurfaceVariant
- - ?androidprv:attr/materialColorSecondaryContainer
- - ?androidprv:attr/materialColorOnSecondaryContainer
- - ?androidprv:attr/materialColorOnSecondaryContainer
+ - @androidprv:color/materialColorSecondaryContainer
+ - @androidprv:color/materialColorOnSecondaryContainer
+ - @androidprv:color/materialColorOnSecondaryContainer
- ?android:attr/colorAccent
diff --git a/res/values/themes_expressive.xml b/res/values/themes_expressive.xml
index 8342fe0c9e0..0a8b45dafdc 100644
--- a/res/values/themes_expressive.xml
+++ b/res/values/themes_expressive.xml
@@ -59,12 +59,12 @@
- @style/Widget.SliceView.Settings
- @android:color/transparent
- - ?androidprv:attr/materialColorOutlineVariant
- - ?androidprv:attr/materialColorOnSurfaceVariant
+ - @androidprv:color/materialColorOutlineVariant
+ - @androidprv:color/materialColorOnSurfaceVariant
- - ?androidprv:attr/materialColorSecondaryContainer
- - ?androidprv:attr/materialColorOnSecondaryContainer
- - ?androidprv:attr/materialColorOnSecondaryContainer
+ - @androidprv:color/materialColorSecondaryContainer
+ - @androidprv:color/materialColorOnSecondaryContainer
+ - @androidprv:color/materialColorOnSecondaryContainer
- ?android:attr/colorAccent
diff --git a/res/xml/bluetooth_screen.xml b/res/xml/bluetooth_screen.xml
index e815d44410b..51cff333e38 100644
--- a/res/xml/bluetooth_screen.xml
+++ b/res/xml/bluetooth_screen.xml
@@ -16,6 +16,7 @@
R.string.bluetooth_scanning_on_info_message_auto_on_available
+ else -> R.string.bluetooth_scanning_on_info_message
+ }
+ } else {
+ when (isAutoOnFeatureAvailable()) {
+ true -> R.string.bluetooth_empty_list_bluetooth_off_auto_on_available
+ else -> R.string.bluetooth_empty_list_bluetooth_off
+ }
+ }
+ return context.getString(resId)
+ }
+
+ private fun isAutoOnFeatureAvailable() =
+ try {
+ bluetoothDataStore.bluetoothAdapter?.isAutoOnSupported == true
+ } catch (e: Exception) {
+ Log.e(TAG, "isAutoOnSupported failed", e)
+ false
+ }
+
+ companion object {
+ const val KEY = "bluetooth_screen_footer"
+ const val TAG = "BluetoothFooterPreference"
+ }
+}
diff --git a/src/com/android/settings/connecteddevice/BluetoothMainSwitchPreference.kt b/src/com/android/settings/connecteddevice/BluetoothMainSwitchPreference.kt
deleted file mode 100644
index bf806531135..00000000000
--- a/src/com/android/settings/connecteddevice/BluetoothMainSwitchPreference.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.settings.connecteddevice
-
-import android.bluetooth.BluetoothAdapter
-import android.content.BroadcastReceiver
-import android.content.Context
-import android.content.Intent
-import android.content.IntentFilter
-import com.android.settings.R
-import com.android.settings.widget.MainSwitchBarMetadata
-import com.android.settingslib.datastore.KeyValueStore
-import com.android.settingslib.datastore.NoOpKeyedObservable
-import com.android.settingslib.metadata.PreferenceLifecycleContext
-import com.android.settingslib.metadata.PreferenceLifecycleProvider
-import com.android.settingslib.metadata.ReadWritePermit
-
-class BluetoothMainSwitchPreference(private val bluetoothAdapter: BluetoothAdapter?) :
- MainSwitchBarMetadata, PreferenceLifecycleProvider {
-
- private lateinit var broadcastReceiver: BroadcastReceiver
-
- override val key
- get() = "use_bluetooth"
-
- override val title
- get() = R.string.bluetooth_main_switch_title
-
- override fun getReadPermit(context: Context, myUid: Int, callingUid: Int) =
- ReadWritePermit.ALLOW
-
- override fun getWritePermit(context: Context, value: Boolean?, myUid: Int, callingUid: Int) =
- ReadWritePermit.ALLOW
-
- override fun storage(context: Context) = BluetoothStateStore(bluetoothAdapter)
-
- override fun onStart(context: PreferenceLifecycleContext) {
- broadcastReceiver =
- object : BroadcastReceiver() {
- override fun onReceive(receiverContext: Context, intent: Intent) {
- context.notifyPreferenceChange(key)
- }
- }
- context.registerReceiver(
- broadcastReceiver,
- IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED),
- Context.RECEIVER_EXPORTED_UNAUDITED
- )
- }
-
- override fun onStop(context: PreferenceLifecycleContext) {
- if (::broadcastReceiver.isInitialized) {
- context.unregisterReceiver(broadcastReceiver)
- }
- }
-
- override fun isEnabled(context: Context): Boolean {
- return bluetoothAdapter?.state.let {
- it == BluetoothAdapter.STATE_ON || it == BluetoothAdapter.STATE_OFF
- }
- }
-
- @Suppress("UNCHECKED_CAST")
- class BluetoothStateStore(private val bluetoothAdapter: BluetoothAdapter?) :
- NoOpKeyedObservable(), KeyValueStore {
-
- override fun contains(key: String) = true
-
- override fun getValue(key: String, valueType: Class): T? {
- return (bluetoothAdapter?.state.let {
- it == BluetoothAdapter.STATE_ON || it == BluetoothAdapter.STATE_TURNING_ON
- }) as T
- }
-
- override fun setValue(key: String, valueType: Class, value: T?) {
- if (value is Boolean) {
- if (value) {
- bluetoothAdapter?.enable()
- } else {
- bluetoothAdapter?.disable()
- }
- }
- }
- }
-}
diff --git a/src/com/android/settings/connecteddevice/BluetoothPreference.kt b/src/com/android/settings/connecteddevice/BluetoothPreference.kt
new file mode 100644
index 00000000000..c9b39537331
--- /dev/null
+++ b/src/com/android/settings/connecteddevice/BluetoothPreference.kt
@@ -0,0 +1,175 @@
+/*
+ * 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.settings.connecteddevice
+
+import android.annotation.SuppressLint
+import android.bluetooth.BluetoothAdapter
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.os.UserManager
+import android.provider.Settings
+import android.widget.Toast
+import androidx.preference.Preference
+import com.android.settings.PreferenceRestrictionMixin
+import com.android.settings.R
+import com.android.settings.network.SatelliteRepository.Companion.isSatelliteOn
+import com.android.settings.network.SatelliteWarningDialogActivity
+import com.android.settings.widget.MainSwitchBarMetadata
+import com.android.settingslib.WirelessUtils
+import com.android.settingslib.datastore.AbstractKeyedDataObservable
+import com.android.settingslib.datastore.DataChangeReason
+import com.android.settingslib.datastore.KeyValueStore
+import com.android.settingslib.metadata.PreferenceMetadata
+import com.android.settingslib.metadata.ReadWritePermit
+import com.android.settingslib.metadata.SensitivityLevel
+
+@SuppressLint("MissingPermission")
+class BluetoothPreference(private val bluetoothDataStore: BluetoothDataStore) :
+ MainSwitchBarMetadata, PreferenceRestrictionMixin, Preference.OnPreferenceChangeListener {
+
+ override val key
+ get() = KEY
+
+ override val title
+ get() = R.string.bluetooth_main_switch_title
+
+ override val restrictionKeys: Array
+ get() = arrayOf(UserManager.DISALLOW_BLUETOOTH, UserManager.DISALLOW_CONFIG_BLUETOOTH)
+
+ override fun getReadPermit(context: Context, myUid: Int, callingUid: Int) =
+ ReadWritePermit.ALLOW
+
+ override fun getWritePermit(context: Context, value: Boolean?, myUid: Int, callingUid: Int) =
+ when {
+ isSatelliteOn(context, 3000) ||
+ (value == true &&
+ !WirelessUtils.isRadioAllowed(context, Settings.Global.RADIO_BLUETOOTH)) ->
+ ReadWritePermit.DISALLOW
+ else -> ReadWritePermit.ALLOW
+ }
+
+ override val sensitivityLevel
+ get() = SensitivityLevel.LOW_SENSITIVITY
+
+ override fun storage(context: Context) = bluetoothDataStore
+
+ override fun isEnabled(context: Context): Boolean {
+ return super.isEnabled(context) &&
+ bluetoothDataStore.bluetoothAdapter?.state.let {
+ it == BluetoothAdapter.STATE_ON || it == BluetoothAdapter.STATE_OFF
+ }
+ }
+
+ override fun bind(preference: Preference, metadata: PreferenceMetadata) {
+ super.bind(preference, metadata)
+ preference.onPreferenceChangeListener = this
+ }
+
+ override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
+ val context = preference.context
+
+ if (isSatelliteOn(context, 3000)) {
+ context.startActivity(
+ Intent(context, SatelliteWarningDialogActivity::class.java)
+ .putExtra(
+ SatelliteWarningDialogActivity.EXTRA_TYPE_OF_SATELLITE_WARNING_DIALOG,
+ SatelliteWarningDialogActivity.TYPE_IS_BLUETOOTH,
+ )
+ )
+ return false
+ }
+
+ // Show toast message if Bluetooth is not allowed in airplane mode
+ if (
+ newValue == true &&
+ !WirelessUtils.isRadioAllowed(context, Settings.Global.RADIO_BLUETOOTH)
+ ) {
+ Toast.makeText(context, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show()
+ return false
+ }
+
+ return true
+ }
+
+ @Suppress("UNCHECKED_CAST")
+ private class BluetoothStorage(
+ private val context: Context,
+ override val bluetoothAdapter: BluetoothAdapter?,
+ ) : AbstractKeyedDataObservable(), BluetoothDataStore {
+
+ private var broadcastReceiver: BroadcastReceiver? = null
+
+ override fun contains(key: String) = key == KEY && bluetoothAdapter != null
+
+ override fun getValue(key: String, valueType: Class): T {
+ return (bluetoothAdapter?.state.let {
+ it == BluetoothAdapter.STATE_ON || it == BluetoothAdapter.STATE_TURNING_ON
+ })
+ as T
+ }
+
+ @Suppress("DEPRECATION")
+ override fun setValue(key: String, valueType: Class, value: T?) {
+ if (value is Boolean) {
+ if (value) {
+ bluetoothAdapter?.enable()
+ } else {
+ bluetoothAdapter?.disable()
+ }
+ }
+ }
+
+ @SuppressLint("WrongConstant")
+ override fun onFirstObserverAdded() {
+ broadcastReceiver =
+ object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ notifyChange(KEY, DataChangeReason.UPDATE)
+ }
+ }
+ context.registerReceiver(
+ broadcastReceiver,
+ IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED),
+ Context.RECEIVER_EXPORTED_UNAUDITED,
+ )
+ }
+
+ override fun onLastObserverRemoved() {
+ context.unregisterReceiver(broadcastReceiver)
+ }
+ }
+
+ companion object {
+ const val KEY = "use_bluetooth"
+
+ @Suppress("DEPRECATION")
+ fun createDataStore(context: Context) =
+ createDataStore(context, BluetoothAdapter.getDefaultAdapter())
+
+ fun createDataStore(
+ context: Context,
+ bluetoothAdapter: BluetoothAdapter?,
+ ): BluetoothDataStore = BluetoothStorage(context, bluetoothAdapter)
+ }
+}
+
+/** Datastore of the bluetooth preference. */
+interface BluetoothDataStore : KeyValueStore {
+ val bluetoothAdapter: BluetoothAdapter?
+}
diff --git a/src/com/android/settings/dashboard/profileselector/UserAdapter.java b/src/com/android/settings/dashboard/profileselector/UserAdapter.java
index 54887d7b732..b9f585faf2f 100644
--- a/src/com/android/settings/dashboard/profileselector/UserAdapter.java
+++ b/src/com/android/settings/dashboard/profileselector/UserAdapter.java
@@ -39,7 +39,6 @@ import android.widget.TextView;
import com.android.internal.util.UserIcons;
import com.android.internal.widget.RecyclerView;
import com.android.settings.R;
-import com.android.settingslib.Utils;
import java.util.ArrayList;
import java.util.List;
@@ -62,8 +61,8 @@ public class UserAdapter extends BaseAdapter {
mUserHandle = userHandle;
mUserManager = um;
UserInfo userInfo = um.getUserInfo(mUserHandle.getIdentifier());
- int tintColor = Utils.getColorAttrDefaultColor(context,
- com.android.internal.R.attr.materialColorPrimary);
+ int tintColor = context.getColor(com.android.internal.R.color.materialColorPrimary);
+
if (userInfo.isManagedProfile()
|| (android.os.Flags.allowPrivateProfile()
&& android.multiuser.Flags.enablePrivateSpaceFeatures()
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
index 4acaeeaf5bb..88f99c3beaf 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
@@ -332,9 +332,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
setBackgroundColor(Color.TRANSPARENT);
mTrapezoidSolidColor = Utils.getColorAccentDefaultColor(context);
mTrapezoidColor = Utils.getDisabled(context, mTrapezoidSolidColor);
- mTrapezoidHoverColor =
- Utils.getColorAttrDefaultColor(
- context, com.android.internal.R.attr.materialColorSecondaryContainer);
+ mTrapezoidHoverColor = context.getColor(
+ com.android.internal.R.color.materialColorSecondaryContainer);
// Initializes the divider line paint.
final Resources resources = getContext().getResources();
mDividerWidth = resources.getDimensionPixelSize(R.dimen.chartview_divider_width);
diff --git a/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java b/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java
index fa7b372d709..9683b8787b9 100644
--- a/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java
+++ b/src/com/android/settings/inputmethod/ModifierKeysPickerDialogFragment.java
@@ -316,7 +316,6 @@ public class ModifierKeysPickerDialogFragment extends DialogFragment {
}
private int getColorOfMaterialColorPrimary() {
- return Utils.getColorAttrDefaultColor(
- mActivity, com.android.internal.R.attr.materialColorPrimary);
+ return mActivity.getColor(com.android.internal.R.color.materialColorPrimary);
}
}
diff --git a/src/com/android/settings/inputmethod/ModifierKeysPreferenceController.java b/src/com/android/settings/inputmethod/ModifierKeysPreferenceController.java
index 5a5b69e4a16..58e49bf2cd5 100644
--- a/src/com/android/settings/inputmethod/ModifierKeysPreferenceController.java
+++ b/src/com/android/settings/inputmethod/ModifierKeysPreferenceController.java
@@ -36,7 +36,6 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.Utils;
import com.android.settingslib.widget.LayoutPreference;
import java.util.ArrayList;
@@ -202,8 +201,7 @@ public class ModifierKeysPreferenceController extends BasePreferenceController {
}
private int getColorOfMaterialColorPrimary() {
- return Utils.getColorAttrDefaultColor(
- mContext, com.android.internal.R.attr.materialColorPrimary);
+ return mContext.getColor(com.android.internal.R.color.materialColorPrimary);
}
private static boolean isCtrl(int keyCode) {
diff --git a/src/com/android/settings/inputmethod/ModifierKeysRestorePreferenceController.java b/src/com/android/settings/inputmethod/ModifierKeysRestorePreferenceController.java
index 4bb106915d4..20defa9a0cc 100644
--- a/src/com/android/settings/inputmethod/ModifierKeysRestorePreferenceController.java
+++ b/src/com/android/settings/inputmethod/ModifierKeysRestorePreferenceController.java
@@ -28,7 +28,6 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
-import com.android.settingslib.Utils;
public class ModifierKeysRestorePreferenceController extends BasePreferenceController {
@@ -88,7 +87,6 @@ public class ModifierKeysRestorePreferenceController extends BasePreferenceContr
}
private int getColorOfMaterialColorPrimary() {
- return Utils.getColorAttrDefaultColor(
- mParent.getActivity(), com.android.internal.R.attr.materialColorPrimary);
+ return mParent.getActivity().getColor(com.android.internal.R.color.materialColorPrimary);
}
}
diff --git a/src/com/android/settings/network/AirplaneModePreference.kt b/src/com/android/settings/network/AirplaneModePreference.kt
index 758bcfbe487..e3b7f5503d6 100644
--- a/src/com/android/settings/network/AirplaneModePreference.kt
+++ b/src/com/android/settings/network/AirplaneModePreference.kt
@@ -26,13 +26,13 @@ import android.os.UserManager
import android.provider.Settings
import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager
-import android.util.Log
import androidx.annotation.DrawableRes
import androidx.preference.Preference
import com.android.settings.AirplaneModeEnabler
import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R
import com.android.settings.Utils
+import com.android.settings.network.SatelliteRepository.Companion.isSatelliteOn
import com.android.settingslib.RestrictedSwitchPreference
import com.android.settingslib.datastore.AbstractKeyedDataObservable
import com.android.settingslib.datastore.DataChangeReason
@@ -45,8 +45,6 @@ import com.android.settingslib.metadata.PreferenceLifecycleProvider
import com.android.settingslib.metadata.ReadWritePermit
import com.android.settingslib.metadata.SensitivityLevel
import com.android.settingslib.metadata.SwitchPreference
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit
// LINT.IfChange
class AirplaneModePreference :
@@ -113,9 +111,7 @@ class AirplaneModePreference :
context.getSystemService(TelephonyManager::class.java)?.let {
phoneStateListener =
object : PhoneStateListener(Looper.getMainLooper()) {
- @Deprecated("Deprecated in Java")
override fun onRadioPowerStateChanged(state: Int) {
- Log.d(TAG, "onRadioPowerStateChanged(), state=$state")
notifyChange(KEY, DataChangeReason.UPDATE)
}
}
@@ -163,17 +159,6 @@ class AirplaneModePreference :
context.getSystemService(TelephonyManager::class.java),
)
- private fun isSatelliteOn(context: Context): Boolean {
- try {
- return SatelliteRepository(context)
- .requestIsSessionStarted(Executors.newSingleThreadExecutor())
- .get(2000, TimeUnit.MILLISECONDS)
- } catch (e: Exception) {
- Log.e(TAG, "Error to get satellite status : $e")
- }
- return false
- }
-
private fun showEcmDialog(context: PreferenceLifecycleContext) {
val intent =
Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null)
@@ -192,7 +177,6 @@ class AirplaneModePreference :
}
companion object {
- const val TAG = "AirplaneModePreference"
const val KEY = Settings.Global.AIRPLANE_MODE_ON
const val DEFAULT_VALUE = false
const val REQUEST_CODE_EXIT_ECM = 1
diff --git a/src/com/android/settings/network/NetworkDashboardScreen.kt b/src/com/android/settings/network/NetworkDashboardScreen.kt
index 15bf590f462..1ed88c080d1 100644
--- a/src/com/android/settings/network/NetworkDashboardScreen.kt
+++ b/src/com/android/settings/network/NetworkDashboardScreen.kt
@@ -17,9 +17,12 @@ package com.android.settings.network
import android.content.Context
import com.android.settings.R
+import com.android.settings.Settings.NetworkDashboardActivity
import com.android.settings.datausage.DataSaverScreen
import com.android.settings.flags.Flags
+import com.android.settings.utils.makeLaunchIntent
import com.android.settingslib.metadata.PreferenceIconProvider
+import com.android.settingslib.metadata.PreferenceMetadata
import com.android.settingslib.metadata.ProvidePreferenceScreen
import com.android.settingslib.metadata.preferenceHierarchy
import com.android.settingslib.preference.PreferenceScreenCreator
@@ -44,6 +47,9 @@ class NetworkDashboardScreen : PreferenceScreenCreator, PreferenceIconProvider {
override fun fragmentClass() = NetworkDashboardFragment::class.java
+ override fun getLaunchIntent(context: Context, metadata: PreferenceMetadata?) =
+ makeLaunchIntent(context, NetworkDashboardActivity::class.java, metadata?.key)
+
override fun getPreferenceHierarchy(context: Context) =
preferenceHierarchy(this) {
+MobileNetworkListScreen.KEY order -15
diff --git a/src/com/android/settings/network/SatelliteRepository.kt b/src/com/android/settings/network/SatelliteRepository.kt
index b7c25f4f658..c70484a7e7a 100644
--- a/src/com/android/settings/network/SatelliteRepository.kt
+++ b/src/com/android/settings/network/SatelliteRepository.kt
@@ -26,6 +26,8 @@ import androidx.concurrent.futures.CallbackToFutureAdapter
import com.google.common.util.concurrent.Futures.immediateFuture
import com.google.common.util.concurrent.ListenableFuture
import java.util.concurrent.Executor
+import java.util.concurrent.Executors
+import java.util.concurrent.TimeUnit
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor
@@ -203,5 +205,15 @@ class SatelliteRepository(
fun setIsSessionStartedForTesting(isEnabled: Boolean) {
this.isSessionStarted = isEnabled
}
+
+ fun isSatelliteOn(context: Context, timeoutMs: Long = 2000): Boolean =
+ try {
+ SatelliteRepository(context)
+ .requestIsSessionStarted(Executors.newSingleThreadExecutor())
+ .get(timeoutMs, TimeUnit.MILLISECONDS)
+ } catch (e: Exception) {
+ Log.e(TAG, "Error to get satellite status : $e")
+ false
+ }
}
}
diff --git a/src/com/android/settings/notification/LockScreenNotificationsPreferencePageFragment.java b/src/com/android/settings/notification/LockScreenNotificationsPreferencePageFragment.java
index ef53e2da829..53b1377d3ea 100644
--- a/src/com/android/settings/notification/LockScreenNotificationsPreferencePageFragment.java
+++ b/src/com/android/settings/notification/LockScreenNotificationsPreferencePageFragment.java
@@ -33,8 +33,7 @@ public class LockScreenNotificationsPreferencePageFragment extends DashboardFrag
@Override
public int getMetricsCategory() {
- //TODO(b/367455695): create a new metrics category
- return SettingsEnums.SETTINGS_LOCK_SCREEN_PREFERENCES;
+ return SettingsEnums.SETTINGS_NOTIFICATIONS_ON_LOCK_SCREEN;
}
@Override
diff --git a/src/com/android/settings/notification/modes/IconUtil.java b/src/com/android/settings/notification/modes/IconUtil.java
index 23817cbd5db..b589a0bef8e 100644
--- a/src/com/android/settings/notification/modes/IconUtil.java
+++ b/src/com/android/settings/notification/modes/IconUtil.java
@@ -23,6 +23,7 @@ import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
@@ -36,6 +37,7 @@ import android.util.StateSet;
import android.view.Gravity;
import androidx.annotation.AttrRes;
+import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -81,21 +83,19 @@ class IconUtil {
Drawable base = composeIcons(
context.getResources(),
background,
- Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorSecondaryContainer),
+ context.getColor(com.android.internal.R.color.materialColorSecondaryContainer),
outerSizePx,
modeIcon,
- Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorOnSecondaryContainer),
+ context.getColor(com.android.internal.R.color.materialColorOnSecondaryContainer),
innerSizePx);
Drawable selected = composeIcons(
context.getResources(),
background,
- Utils.getColorAttr(context, com.android.internal.R.attr.materialColorPrimary),
+ context.getColor(com.android.internal.R.color.materialColorPrimary),
outerSizePx,
modeIcon,
- Utils.getColorAttr(context, com.android.internal.R.attr.materialColorOnPrimary),
+ context.getColor(com.android.internal.R.color.materialColorOnPrimary),
innerSizePx);
StateListDrawable result = new StateListDrawable();
@@ -114,13 +114,11 @@ class IconUtil {
static Drawable makeIconPickerHeader(@NonNull Context context, Drawable icon) {
return composeIconCircle(
context.getResources(),
- Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorSecondaryContainer),
+ context.getColor(com.android.internal.R.color.materialColorSecondaryContainer),
context.getResources().getDimensionPixelSize(
R.dimen.zen_mode_icon_list_header_circle_diameter),
icon,
- Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorOnSecondaryContainer),
+ context.getColor(com.android.internal.R.color.materialColorOnSecondaryContainer),
context.getResources().getDimensionPixelSize(
R.dimen.zen_mode_icon_list_header_icon_size));
}
@@ -151,13 +149,11 @@ class IconUtil {
@DrawableRes int iconResId) {
return composeIconCircle(
context.getResources(),
- Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorSecondaryContainer),
+ context.getColor(com.android.internal.R.color.materialColorSecondaryContainer),
context.getResources().getDimensionPixelSize(
R.dimen.zen_mode_circular_icon_diameter),
checkNotNull(context.getDrawable(iconResId)),
- Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorOnSecondaryContainer),
+ context.getColor(com.android.internal.R.color.materialColorOnSecondaryContainer),
context.getResources().getDimensionPixelSize(
R.dimen.zen_mode_circular_icon_inner_icon_size));
}
@@ -172,12 +168,10 @@ class IconUtil {
if (Strings.isNullOrEmpty(displayName)) {
return composeIconCircle(
context.getResources(),
- Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorTertiaryContainer),
+ context.getColor(com.android.internal.R.color.materialColorTertiaryContainer),
res.getDimensionPixelSize(R.dimen.zen_mode_circular_icon_diameter),
checkNotNull(context.getDrawable(R.drawable.ic_zen_mode_generic_contact)),
- Utils.getColorAttr(context,
- com.android.internal.R.attr.materialColorOnTertiaryContainer),
+ context.getColor(com.android.internal.R.color.materialColorOnTertiaryContainer),
res.getDimensionPixelSize(R.dimen.zen_mode_circular_icon_inner_icon_size));
}
@@ -187,14 +181,14 @@ class IconUtil {
Canvas canvas = new Canvas(bitmap);
Paint circlePaint = new Paint();
- circlePaint.setColor(Utils.getColorAttrDefaultColor(context,
- com.android.internal.R.attr.materialColorTertiaryContainer));
+ circlePaint.setColor(context.getColor(
+ com.android.internal.R.color.materialColorTertiaryContainer));
circlePaint.setFlags(Paint.ANTI_ALIAS_FLAG);
canvas.drawCircle(diameter / 2f, diameter / 2f, diameter / 2f, circlePaint);
Paint textPaint = new Paint();
- textPaint.setColor(Utils.getColorAttrDefaultColor(context,
- com.android.internal.R.attr.materialColorOnTertiaryContainer));
+ textPaint.setColor(context.getColor(
+ com.android.internal.R.color.materialColorOnTertiaryContainer));
textPaint.setTypeface(Typeface.create("sans-serif", Typeface.NORMAL));
textPaint.setTextAlign(Paint.Align.LEFT);
textPaint.setTextSize(res.getDimensionPixelSize(R.dimen.zen_mode_circular_icon_text_size));
@@ -210,12 +204,24 @@ class IconUtil {
return new BitmapDrawable(context.getResources(), bitmap);
}
+ private static Drawable composeIconCircle(Resources res, @ColorInt int circleColor,
+ @Px int circleDiameterPx, Drawable icon, @ColorInt int iconColor, @Px int iconSizePx) {
+ return composeIconCircle(res, ColorStateList.valueOf(circleColor), circleDiameterPx, icon,
+ ColorStateList.valueOf(iconColor), iconSizePx);
+ }
+
private static Drawable composeIconCircle(Resources res, ColorStateList circleColor,
@Px int circleDiameterPx, Drawable icon, ColorStateList iconColor, @Px int iconSizePx) {
return composeIcons(res, new ShapeDrawable(new OvalShape()), circleColor, circleDiameterPx,
icon, iconColor, iconSizePx);
}
+ private static Drawable composeIcons(Resources res, Drawable outer, @ColorInt int outerColor,
+ @Px int outerSizePx, Drawable icon, @ColorInt int iconColor, @Px int iconSizePx) {
+ return composeIcons(res, outer, ColorStateList.valueOf(outerColor), outerSizePx, icon,
+ ColorStateList.valueOf(iconColor), iconSizePx);
+ }
+
private static Drawable composeIcons(Resources res, Drawable outer, ColorStateList outerColor,
@Px int outerSizePx, Drawable icon, ColorStateList iconColor, @Px int iconSizePx) {
Drawable background = mutateDrawable(res, outer);
diff --git a/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceController.java b/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceController.java
index 4dfb242c239..254bbfdd9a8 100644
--- a/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceController.java
+++ b/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceController.java
@@ -148,7 +148,8 @@ class ZenModePrioritySendersPreferenceController
makeSelectorPreference(KEY_ANY,
R.string.zen_mode_from_anyone, null, mIsMessages, true);
makeSelectorPreference(KEY_NONE,
- R.string.zen_mode_none_messages, null, mIsMessages, true);
+ mIsMessages ? R.string.zen_mode_none_messages : R.string.zen_mode_none_calls,
+ null, mIsMessages, true);
}
super.displayPreference(screen);
}
diff --git a/src/com/android/settings/widget/MainSwitchBarPreference.kt b/src/com/android/settings/widget/MainSwitchBarPreference.kt
index 6ed887790c8..b3b341c75a9 100644
--- a/src/com/android/settings/widget/MainSwitchBarPreference.kt
+++ b/src/com/android/settings/widget/MainSwitchBarPreference.kt
@@ -17,6 +17,8 @@
package com.android.settings.widget
import android.content.Context
+import android.os.Parcel
+import android.os.Parcelable
import android.widget.CompoundButton
import android.widget.CompoundButton.OnCheckedChangeListener
import androidx.preference.TwoStatePreference
@@ -26,26 +28,32 @@ import com.android.settingslib.widget.MainSwitchBar
/** Preference abstraction of the [MainSwitchBar] in settings activity. */
class MainSwitchBarPreference(context: Context, private val metadata: MainSwitchBarMetadata) :
- TwoStatePreference(context), OnCheckedChangeListener {
+ TwoStatePreference(context), OnCheckedChangeListener, MainSwitchBar.PreChangeListener {
- private val mainSwitchBar: MainSwitchBar = (context as SettingsActivity).switchBar
+ // main switch bar might be null when configuration is just changed
+ private val mainSwitchBar: MainSwitchBar?
+ get() = (context as SettingsActivity).switchBar
override fun setTitle(title: CharSequence?) {
- mainSwitchBar.setTitle(title)
+ mainSwitchBar?.setTitle(title)
+ super.setTitle(title)
}
override fun setSummary(summary: CharSequence?) {
- mainSwitchBar.setSummary(summary)
+ mainSwitchBar?.setSummary(summary)
+ super.setSummary(summary)
}
override fun setEnabled(enabled: Boolean) {
- mainSwitchBar.isEnabled = enabled
+ mainSwitchBar?.isEnabled = enabled
+ super.setEnabled(enabled)
}
// Preference.setVisible is final, we cannot override it
fun updateVisibility() {
// always make preference invisible, the UI visibility is reflected on MainSwitchBar
isVisible = false
+ val mainSwitchBar = mainSwitchBar ?: return
if ((metadata as? PreferenceAvailabilityProvider)?.isAvailable(context) != false) {
mainSwitchBar.show()
} else {
@@ -54,6 +62,7 @@ class MainSwitchBarPreference(context: Context, private val metadata: MainSwitch
}
override fun setChecked(checked: Boolean) {
+ val mainSwitchBar = mainSwitchBar ?: return
// remove listener to update UI only
mainSwitchBar.removeOnSwitchChangeListener(this)
mainSwitchBar.isChecked = checked
@@ -62,9 +71,13 @@ class MainSwitchBarPreference(context: Context, private val metadata: MainSwitch
override fun onAttached() {
super.onAttached()
+ val mainSwitchBar = mainSwitchBar!!
+ mainSwitchBar.setPreChangeListener(this)
mainSwitchBar.addOnSwitchChangeListener(this)
}
+ override fun preChange(isCheck: Boolean) = callChangeListener(isCheck)
+
override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) {
// prevent user from toggling the switch before data store operation is done
isEnabled = false
@@ -73,7 +86,65 @@ class MainSwitchBarPreference(context: Context, private val metadata: MainSwitch
}
override fun onDetached() {
+ val mainSwitchBar = mainSwitchBar!!
mainSwitchBar.removeOnSwitchChangeListener(this)
+ mainSwitchBar.setPreChangeListener(null)
super.onDetached()
}
+
+ override fun onSaveInstanceState(): Parcelable =
+ SavedState(super.onSaveInstanceState()!!).also {
+ it.isEnabled = isEnabled
+ it.title = title
+ it.summary = summary
+ it.mainSwitchBarState = mainSwitchBar?.onSaveInstanceState()
+ }
+
+ override fun onRestoreInstanceState(state: Parcelable?) {
+ val savedState = state as SavedState
+ super.onRestoreInstanceState(savedState.superState)
+ isEnabled = savedState.isEnabled
+ title = savedState.title
+ summary = savedState.summary
+ mainSwitchBar?.onRestoreInstanceState(savedState.mainSwitchBarState!!)
+ }
+
+ private class SavedState : BaseSavedState {
+ var isEnabled: Boolean = false
+ var title: CharSequence? = null
+ var summary: CharSequence? = null
+ var mainSwitchBarState: Parcelable? = null
+
+ constructor(source: Parcel) : super(source) {
+ isEnabled = source.readBoolean()
+ title = source.readCharSequence()
+ summary = source.readCharSequence()
+ val stateClass = MainSwitchBar.SavedState::class.java
+ mainSwitchBarState = source.readParcelable(stateClass.classLoader, stateClass)
+ }
+
+ constructor(superState: Parcelable) : super(superState)
+
+ override fun writeToParcel(dest: Parcel, flags: Int) {
+ super.writeToParcel(dest, flags)
+ dest.writeBoolean(isEnabled)
+ dest.writeCharSequence(title)
+ dest.writeCharSequence(summary)
+ dest.writeParcelable(mainSwitchBarState, flags)
+ }
+
+ companion object {
+ @JvmField
+ val CREATOR: Parcelable.Creator =
+ object : Parcelable.Creator {
+ override fun createFromParcel(parcel: Parcel): SavedState {
+ return SavedState(parcel)
+ }
+
+ override fun newArray(size: Int): Array {
+ return arrayOfNulls(size)
+ }
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/widget/SettingsMainSwitchBar.java b/src/com/android/settings/widget/SettingsMainSwitchBar.java
index e8c6fc9b0b9..6bccbd7205d 100644
--- a/src/com/android/settings/widget/SettingsMainSwitchBar.java
+++ b/src/com/android/settings/widget/SettingsMainSwitchBar.java
@@ -109,7 +109,7 @@ public class SettingsMainSwitchBar extends MainSwitchBar {
return true;
}
- return mSwitch.performClick();
+ return callPreChangeListener() && mSwitch.performClick();
}
@Override
diff --git a/src/com/android/settings/wifi/WifiSwitchPreference.kt b/src/com/android/settings/wifi/WifiSwitchPreference.kt
index 2a18d3f5616..ba6fb02b769 100644
--- a/src/com/android/settings/wifi/WifiSwitchPreference.kt
+++ b/src/com/android/settings/wifi/WifiSwitchPreference.kt
@@ -23,13 +23,12 @@ import android.content.IntentFilter
import android.net.wifi.WifiManager
import android.os.UserManager
import android.provider.Settings
-import android.util.Log
import android.widget.Toast
import androidx.preference.Preference
import androidx.preference.Preference.OnPreferenceChangeListener
import com.android.settings.PreferenceRestrictionMixin
import com.android.settings.R
-import com.android.settings.network.SatelliteRepository
+import com.android.settings.network.SatelliteRepository.Companion.isSatelliteOn
import com.android.settings.network.SatelliteWarningDialogActivity
import com.android.settingslib.RestrictedSwitchPreference
import com.android.settingslib.WirelessUtils
@@ -42,8 +41,6 @@ import com.android.settingslib.metadata.ReadWritePermit
import com.android.settingslib.metadata.SensitivityLevel
import com.android.settingslib.metadata.SwitchPreference
import com.android.settingslib.preference.SwitchPreferenceBinding
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit
// LINT.IfChange
class WifiSwitchPreference :
@@ -75,7 +72,7 @@ class WifiSwitchPreference :
val context = preference.context
// Show dialog and do nothing under satellite mode.
- if (context.isSatelliteOn()) {
+ if (isSatelliteOn(context)) {
context.startActivity(
Intent(context, SatelliteWarningDialogActivity::class.java)
.putExtra(
@@ -100,7 +97,7 @@ class WifiSwitchPreference :
override fun getWritePermit(context: Context, value: Boolean?, myUid: Int, callingUid: Int) =
when {
- (value == true && !context.isRadioAllowed()) || context.isSatelliteOn() ->
+ (value == true && !context.isRadioAllowed()) || isSatelliteOn(context) ->
ReadWritePermit.DISALLOW
else -> ReadWritePermit.ALLOW
}
@@ -155,22 +152,11 @@ class WifiSwitchPreference :
}
companion object {
- const val TAG = "WifiSwitchPreference"
const val KEY = "main_toggle_wifi"
private fun Context.isRadioAllowed() =
WirelessUtils.isRadioAllowed(this, Settings.Global.RADIO_WIFI)
- private fun Context.isSatelliteOn() =
- try {
- SatelliteRepository(this)
- .requestIsSessionStarted(Executors.newSingleThreadExecutor())
- .get(2000, TimeUnit.MILLISECONDS)
- } catch (e: Exception) {
- Log.e(TAG, "Error to get satellite status : $e")
- false
- }
-
private val Intent.wifiState
get() = getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN)
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
index 97faa63400e..b8b0699e8c7 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityHearingAidPreferenceControllerTest.java
@@ -208,7 +208,24 @@ public class AccessibilityHearingAidPreferenceControllerTest {
ShadowLooper.idleMainLooper();
assertThat(mHearingAidPreference.getSummary().toString().contentEquals(
- "TEST_HEARING_AID_BT_DEVICE_NAME / Left and right")).isTrue();
+ "TEST_HEARING_AID_BT_DEVICE_NAME active")).isTrue();
+ }
+
+ @Test
+ public void getSummary_connectedLeAudioHearingAidMonoSide_connectedSummary() {
+ when(mCachedBluetoothDevice.getDeviceSide()).thenReturn(
+ HearingAidInfo.DeviceSide.SIDE_MONO);
+ when(mCachedBluetoothDevice.getMemberDevice()).thenReturn(new HashSet<>());
+ when(mHapClientProfile.getConnectedDevices()).thenReturn(generateHearingAidDeviceList());
+
+ mPreferenceController.onStart();
+ Intent intent = new Intent(BluetoothHapClient.ACTION_HAP_CONNECTION_STATE_CHANGED);
+ intent.putExtra(BluetoothHearingAid.EXTRA_STATE, BluetoothHapClient.STATE_CONNECTED);
+ sendIntent(intent);
+ ShadowLooper.idleMainLooper();
+
+ assertThat(mHearingAidPreference.getSummary().toString().contentEquals(
+ "TEST_HEARING_AID_BT_DEVICE_NAME active")).isTrue();
}
@Test
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/BluetoothMainSwitchPreferenceTest.kt b/tests/robotests/src/com/android/settings/connecteddevice/BluetoothPreferenceTest.kt
similarity index 75%
rename from tests/robotests/src/com/android/settings/connecteddevice/BluetoothMainSwitchPreferenceTest.kt
rename to tests/robotests/src/com/android/settings/connecteddevice/BluetoothPreferenceTest.kt
index 15db130795d..8b739dbc776 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/BluetoothMainSwitchPreferenceTest.kt
+++ b/tests/robotests/src/com/android/settings/connecteddevice/BluetoothPreferenceTest.kt
@@ -31,45 +31,42 @@ import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
-class BluetoothMainSwitchPreferenceTest {
+class BluetoothPreferenceTest {
@get:Rule val setFlagsRule = SetFlagsRule()
private val context: Context = ApplicationProvider.getApplicationContext()
private lateinit var bluetoothAdapter: BluetoothAdapter
- private lateinit var bluetoothMainSwitchPreference: BluetoothMainSwitchPreference
+ private lateinit var bluetoothPreference: BluetoothPreference
@Before
fun setUp() {
bluetoothAdapter = spy(BluetoothAdapter.getDefaultAdapter())
whenever(bluetoothAdapter.state).thenReturn(BluetoothAdapter.STATE_ON)
- bluetoothMainSwitchPreference = BluetoothMainSwitchPreference(bluetoothAdapter)
+ bluetoothPreference =
+ BluetoothPreference(BluetoothPreference.createDataStore(context, bluetoothAdapter))
}
@Test
fun isEnabled_bluetoothOn_returnTrue() {
- assertThat(bluetoothMainSwitchPreference.isEnabled(context)).isTrue()
+ assertThat(bluetoothPreference.isEnabled(context)).isTrue()
}
@Test
fun isEnabled_bluetoothTurningOn_returnFalse() {
whenever(bluetoothAdapter.state).thenReturn(BluetoothAdapter.STATE_TURNING_ON)
- assertThat(bluetoothMainSwitchPreference.isEnabled(context)).isFalse()
+ assertThat(bluetoothPreference.isEnabled(context)).isFalse()
}
@Test
fun storageSetOff_turnOff() {
- bluetoothMainSwitchPreference
- .storage(context)
- .setBoolean(bluetoothMainSwitchPreference.key, false)
+ bluetoothPreference.storage(context).setBoolean(bluetoothPreference.key, false)
verify(bluetoothAdapter).disable()
}
@Test
fun storageSetOn_turnOn() {
- bluetoothMainSwitchPreference
- .storage(context)
- .setBoolean(bluetoothMainSwitchPreference.key, true)
+ bluetoothPreference.storage(context).setBoolean(bluetoothPreference.key, true)
verify(bluetoothAdapter).enable()
}