diff options
author | 2024-11-06 20:47:59 +0000 | |
---|---|---|
committer | 2024-11-06 20:47:59 +0000 | |
commit | f06190e7ce43891f16c5e9109dcd265288493b10 (patch) | |
tree | b5fbab1e766135755f5a36c5036a657a0471fb88 | |
parent | b2de438c02c6c2d1d6816d5eefe06222dfd3dcb3 (diff) | |
parent | 7b0bb6bff586c3698c6204b82e89f362a5872487 (diff) |
Merge "Added highlighted background support" into main
7 files changed, 183 insertions, 15 deletions
diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt index 5f4b88f81de6..41a626fe8efa 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt @@ -21,16 +21,16 @@ import android.content.Intent import android.os.Bundle import android.util.Log import androidx.annotation.XmlRes -import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceScreen import com.android.settingslib.metadata.EXTRA_BINDING_SCREEN_KEY import com.android.settingslib.metadata.PreferenceScreenBindingKeyProvider import com.android.settingslib.metadata.PreferenceScreenRegistry import com.android.settingslib.preference.PreferenceScreenBindingHelper.Companion.bindRecursively +import com.android.settingslib.widget.SettingsBasePreferenceFragment /** Fragment to display a preference screen. */ open class PreferenceFragment : - PreferenceFragmentCompat(), PreferenceScreenProvider, PreferenceScreenBindingKeyProvider { + SettingsBasePreferenceFragment(), PreferenceScreenProvider, PreferenceScreenBindingKeyProvider { private var preferenceScreenBindingHelper: PreferenceScreenBindingHelper? = null diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom_highlighted.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom_highlighted.xml new file mode 100644 index 000000000000..c0c08699cc2a --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_bottom_highlighted.xml @@ -0,0 +1,36 @@ +<?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. + --> + +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="?android:colorControlHighlight"> + <item + android:bottom="16dp" + android:end="?android:attr/listPreferredItemPaddingEnd" + android:start="?android:attr/listPreferredItemPaddingStart" + android:top="2dp"> + <shape + android:shape="rectangle" + android:tint="?android:attr/colorAccent"> + <corners + android:bottomLeftRadius="@dimen/settingslib_preference_corner_radius" + android:bottomRightRadius="@dimen/settingslib_preference_corner_radius" + android:topLeftRadius="4dp" + android:topRightRadius="4dp" /> + <padding android:bottom="16dp" /> + <solid android:color="#42000000" /> + </shape> + </item> +</ripple>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center_highlighted.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center_highlighted.xml new file mode 100644 index 000000000000..8099d9b3d7f7 --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_center_highlighted.xml @@ -0,0 +1,30 @@ +<?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. + --> + +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="?android:colorControlHighlight"> + <item + android:end="?android:attr/listPreferredItemPaddingEnd" + android:start="?android:attr/listPreferredItemPaddingStart" + android:top="2dp"> + <shape + android:shape="rectangle" + android:tint="?android:attr/colorAccent"> + <corners android:radius="4dp" /> + <solid android:color="#42000000" /> + </shape> + </item> +</ripple>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_highlighted.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_highlighted.xml new file mode 100644 index 000000000000..a119a4ae083f --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_highlighted.xml @@ -0,0 +1,32 @@ +<?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. + --> + +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="?android:colorControlHighlight"> + <item + android:bottom="16dp" + android:end="?android:attr/listPreferredItemPaddingEnd" + android:start="?android:attr/listPreferredItemPaddingStart" + android:top="2dp"> + <shape + android:shape="rectangle" + android:tint="?android:attr/colorAccent"> + <corners android:radius="@dimen/settingslib_preference_corner_radius" /> + <padding android:bottom="16dp" /> + <solid android:color="#42000000" /> + </shape> + </item> +</ripple>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top_highlighted.xml b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top_highlighted.xml new file mode 100644 index 000000000000..052eb01cab8d --- /dev/null +++ b/packages/SettingsLib/SettingsTheme/res/drawable-v35/settingslib_round_background_top_highlighted.xml @@ -0,0 +1,35 @@ +<?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. + --> + +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="?android:colorControlHighlight"> + <item + android:color="?android:attr/colorAccent" + android:end="?android:attr/listPreferredItemPaddingEnd" + android:start="?android:attr/listPreferredItemPaddingStart" + android:top="2dp"> + <shape + android:shape="rectangle" + android:tint="?android:attr/colorAccent"> + <corners + android:bottomLeftRadius="4dp" + android:bottomRightRadius="4dp" + android:topLeftRadius="@dimen/settingslib_preference_corner_radius" + android:topRightRadius="@dimen/settingslib_preference_corner_radius" /> + <solid android:color="#42000000" /> + </shape> + </item> +</ripple>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsBasePreferenceFragment.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsBasePreferenceFragment.kt index 535d80f609fb..265c065e924e 100644 --- a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsBasePreferenceFragment.kt +++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsBasePreferenceFragment.kt @@ -21,7 +21,7 @@ import androidx.preference.PreferenceScreen import androidx.recyclerview.widget.RecyclerView /** Base class for Settings to use PreferenceFragmentCompat */ -open abstract class SettingsBasePreferenceFragment : PreferenceFragmentCompat() { +abstract class SettingsBasePreferenceFragment : PreferenceFragmentCompat() { override fun onCreateAdapter(preferenceScreen: PreferenceScreen): RecyclerView.Adapter<*> { if (SettingsThemeHelper.isExpressiveTheme(requireContext())) diff --git a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsPreferenceGroupAdapter.kt b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsPreferenceGroupAdapter.kt index 98b7f7664b1b..6a0632073de9 100644 --- a/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsPreferenceGroupAdapter.kt +++ b/packages/SettingsLib/SettingsTheme/src/com/android/settingslib/widget/SettingsPreferenceGroupAdapter.kt @@ -16,8 +16,10 @@ package com.android.settingslib.widget +import android.annotation.SuppressLint import android.os.Handler import android.os.Looper +import android.util.TypedValue import androidx.annotation.DrawableRes import androidx.preference.Preference import androidx.preference.PreferenceCategory @@ -27,12 +29,12 @@ import androidx.preference.PreferenceViewHolder import com.android.settingslib.widget.theme.R /** - * A custom adapter for displaying settings preferences in a list, handling rounded corners - * for preference items within a group. + * A custom adapter for displaying settings preferences in a list, handling rounded corners for + * preference items within a group. */ -open class SettingsPreferenceGroupAdapter @JvmOverloads constructor( - preferenceGroup: PreferenceGroup -) : PreferenceGroupAdapter(preferenceGroup) { +@SuppressLint("RestrictedApi") +open class SettingsPreferenceGroupAdapter(preferenceGroup: PreferenceGroup) : + PreferenceGroupAdapter(preferenceGroup) { private val mPreferenceGroup = preferenceGroup private var mRoundCornerMappingList: ArrayList<Int> = ArrayList() @@ -41,6 +43,7 @@ open class SettingsPreferenceGroupAdapter @JvmOverloads constructor( private var mGroupPaddingStart = 0 private var mNormalPaddingEnd = 0 private var mGroupPaddingEnd = 0 + @DrawableRes private var mLegacyBackgroundRes: Int private val mHandler = Handler(Looper.getMainLooper()) @@ -54,9 +57,17 @@ open class SettingsPreferenceGroupAdapter @JvmOverloads constructor( mNormalPaddingEnd = context.resources.getDimensionPixelSize(R.dimen.settingslib_expressive_space_small1) mGroupPaddingEnd = mNormalPaddingEnd * 2 + val outValue = TypedValue() + context.theme.resolveAttribute( + android.R.attr.selectableItemBackground, + outValue, + true, /* resolveRefs */ + ) + mLegacyBackgroundRes = outValue.resourceId updatePreferences() } + @SuppressLint("RestrictedApi") override fun onPreferenceHierarchyChange(preference: Preference) { super.onPreferenceHierarchyChange(preference) @@ -65,6 +76,7 @@ open class SettingsPreferenceGroupAdapter @JvmOverloads constructor( mHandler.post(syncRunnable) } + @SuppressLint("RestrictedApi") override fun onBindViewHolder(holder: PreferenceViewHolder, position: Int) { super.onBindViewHolder(holder, position) updateBackground(holder, position) @@ -79,6 +91,7 @@ open class SettingsPreferenceGroupAdapter @JvmOverloads constructor( } } + @SuppressLint("RestrictedApi") private fun mappingPreferenceGroup(cornerStyles: MutableList<Int>, group: PreferenceGroup) { cornerStyles.clear() cornerStyles.addAll(MutableList(itemCount) { 0 }) @@ -151,20 +164,38 @@ open class SettingsPreferenceGroupAdapter @JvmOverloads constructor( } } - /** handle roundCorner background */ + /** handle roundCorner background */ private fun updateBackground(holder: PreferenceViewHolder, position: Int) { - @DrawableRes val backgroundRes = getRoundCornerDrawableRes(position, false /* isSelected*/) + val context = holder.itemView.context + @DrawableRes + val backgroundRes = + when (SettingsThemeHelper.isExpressiveTheme(context)) { + true -> getRoundCornerDrawableRes(position, isSelected = false) + else -> mLegacyBackgroundRes + } val v = holder.itemView - val paddingStart = if (backgroundRes == 0) mNormalPaddingStart else mGroupPaddingStart - val paddingEnd = if (backgroundRes == 0) mNormalPaddingEnd else mGroupPaddingEnd - - v.setPaddingRelative(paddingStart, v.paddingTop, paddingEnd, v.paddingBottom) + // Update padding + if (SettingsThemeHelper.isExpressiveTheme(context)) { + val paddingStart = if (backgroundRes == 0) mNormalPaddingStart else mGroupPaddingStart + val paddingEnd = if (backgroundRes == 0) mNormalPaddingEnd else mGroupPaddingEnd + v.setPaddingRelative(paddingStart, v.paddingTop, paddingEnd, v.paddingBottom) + } + // Update background v.setBackgroundResource(backgroundRes) } @DrawableRes protected fun getRoundCornerDrawableRes(position: Int, isSelected: Boolean): Int { + return getRoundCornerDrawableRes(position, isSelected, false) + } + + @DrawableRes + protected fun getRoundCornerDrawableRes( + position: Int, + isSelected: Boolean, + isHighlighted: Boolean, + ): Int { val cornerType = mRoundCornerMappingList[position] if ((cornerType and ROUND_CORNER_CENTER) == 0) { @@ -175,24 +206,28 @@ open class SettingsPreferenceGroupAdapter @JvmOverloads constructor( (cornerType and ROUND_CORNER_TOP) != 0 && (cornerType and ROUND_CORNER_BOTTOM) == 0 -> { // the first if (isSelected) R.drawable.settingslib_round_background_top_selected + else if (isHighlighted) R.drawable.settingslib_round_background_top_highlighted else R.drawable.settingslib_round_background_top } (cornerType and ROUND_CORNER_BOTTOM) != 0 && (cornerType and ROUND_CORNER_TOP) == 0 -> { // the last if (isSelected) R.drawable.settingslib_round_background_bottom_selected + else if (isHighlighted) R.drawable.settingslib_round_background_bottom_highlighted else R.drawable.settingslib_round_background_bottom } (cornerType and ROUND_CORNER_TOP) != 0 && (cornerType and ROUND_CORNER_BOTTOM) != 0 -> { // the only one preference if (isSelected) R.drawable.settingslib_round_background_selected + else if (isHighlighted) R.drawable.settingslib_round_background_highlighted else R.drawable.settingslib_round_background } else -> { // in the center if (isSelected) R.drawable.settingslib_round_background_center_selected + else if (isHighlighted) R.drawable.settingslib_round_background_center_highlighted else R.drawable.settingslib_round_background_center } } @@ -203,4 +238,4 @@ open class SettingsPreferenceGroupAdapter @JvmOverloads constructor( private const val ROUND_CORNER_TOP: Int = 1 shl 1 private const val ROUND_CORNER_BOTTOM: Int = 1 shl 2 } -}
\ No newline at end of file +} |