From 7fefd85424a34b146c683ead9303dedc13ca0602 Mon Sep 17 00:00:00 2001 From: 0nko Date: Mon, 11 Aug 2025 22:31:43 +0200 Subject: [PATCH 1/2] Upate the DaxListItem and simplify duck.ai item --- .../layout/view_settings_item_duck_chat.xml | 44 +++---------------- .../common/ui/view/listitem/DaxListItem.kt | 9 ++++ 2 files changed, 14 insertions(+), 39 deletions(-) diff --git a/app/src/main/res/layout/view_settings_item_duck_chat.xml b/app/src/main/res/layout/view_settings_item_duck_chat.xml index 9de1153cf944..9b9abc51d9a8 100644 --- a/app/src/main/res/layout/view_settings_item_duck_chat.xml +++ b/app/src/main/res/layout/view_settings_item_duck_chat.xml @@ -13,46 +13,12 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - - - - - - - - \ No newline at end of file + app:primaryText="@string/duck_chat_title" + app:leadingIcon="@drawable/ic_ai_chat_color_24"/> \ No newline at end of file diff --git a/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/listitem/DaxListItem.kt b/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/listitem/DaxListItem.kt index 5d7fed00ab50..f489223ff679 100644 --- a/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/listitem/DaxListItem.kt +++ b/common/common-ui/src/main/java/com/duckduckgo/common/ui/view/listitem/DaxListItem.kt @@ -27,6 +27,7 @@ import android.widget.ImageView import androidx.annotation.ColorInt import androidx.annotation.ColorRes import androidx.annotation.DrawableRes +import androidx.annotation.StringRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import com.duckduckgo.common.ui.view.DaxSwitch @@ -55,6 +56,9 @@ abstract class DaxListItem( internal abstract val itemContainer: View internal abstract val verticalPadding: Int + val primaryTextString: String + get() = primaryText.text.toString() + /** Sets the item click listener */ fun setClickListener(onClick: () -> Unit) { itemContainer.setOnClickListener { onClick() } @@ -80,6 +84,11 @@ abstract class DaxListItem( primaryText.text = title } + /** Sets primary text resource */ + fun setPrimaryTextResource(@StringRes idRes: Int) { + primaryText.setText(idRes) + } + /** Sets primary text color */ fun setPrimaryTextColor(@ColorRes colorRes: Int) { primaryText.setTextColor(ContextCompat.getColorStateList(context, colorRes)) From 4ecc5399a721fcd2ac06d0e7617e40d769f60d9e Mon Sep 17 00:00:00 2001 From: 0nko Date: Mon, 11 Aug 2025 22:35:33 +0200 Subject: [PATCH 2/2] Sort the Other settings alphabetically --- .../app/settings/SettingsActivity.kt | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt b/app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt index 958eee466e6e..4143d7398103 100644 --- a/app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt @@ -20,6 +20,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.view.View +import android.widget.LinearLayout import androidx.core.view.children import androidx.core.view.isVisible import androidx.lifecycle.Lifecycle @@ -78,6 +79,7 @@ import com.duckduckgo.browser.api.ui.BrowserScreens.SettingsScreenNoParams import com.duckduckgo.common.ui.DuckDuckGoActivity import com.duckduckgo.common.ui.view.gone import com.duckduckgo.common.ui.view.listitem.DaxListItem.IconSize.Small +import com.duckduckgo.common.ui.view.listitem.OneLineListItem import com.duckduckgo.common.ui.view.listitem.TwoLineListItem import com.duckduckgo.common.ui.view.show import com.duckduckgo.common.ui.viewbinding.viewBinding @@ -196,6 +198,25 @@ class SettingsActivity : DuckDuckGoActivity() { observeViewModel() } + private fun sortSettingItemsAlphabetically() { + // sort the children by their primary text + val items = viewsMain.settingsSectionGeneral.children.drop(ITEMS_TO_SKIP_WHEN_SORTING_SETTING_ITEMS).toMutableList() + + items.sortBy { child -> + if (child is OneLineListItem) { + child.primaryTextString.lowercase() + } else if (child is LinearLayout && child.childCount == 1 && child.children.elementAt(0) is OneLineListItem) { + // this is used for settings that are injected from plugins + (child.children.elementAt(0) as OneLineListItem).primaryTextString.lowercase() + } else { + "" + } + } + + items.forEach { viewsMain.settingsSectionGeneral.removeView(it) } + items.forEach { viewsMain.settingsSectionGeneral.addView(it) } + } + private fun configureCompleteSetupSettings() { watchForCompleteSetupSettingsChanges() updateCompleteSetupSettings() @@ -301,6 +322,7 @@ class SettingsActivity : DuckDuckGoActivity() { updateDuckChat(it.isDuckChatEnabled, it.isAiFeaturesRebrandingEnabled) updateVoiceSearchVisibility(it.isVoiceSearchVisible) updateAddWidgetInProtections(it.isAddWidgetInProtectionsVisible, it.widgetsInstalled) + sortSettingItemsAlphabetically() } }.launchIn(lifecycleScope) @@ -347,8 +369,8 @@ class SettingsActivity : DuckDuckGoActivity() { titleRes = R.string.settingsDuckAi } viewsMain.includeDuckChatSetting.duckChatSetting.show() - viewsMain.includeDuckChatSetting.leadingIcon.setImageResource(imageRes) - viewsMain.includeDuckChatSetting.primaryText.setText(titleRes) + viewsMain.includeDuckChatSetting.duckChatSetting.setLeadingIconResource(imageRes) + viewsMain.includeDuckChatSetting.duckChatSetting.setPrimaryTextResource(titleRes) } else { viewsMain.includeDuckChatSetting.duckChatSetting.gone() } @@ -480,6 +502,9 @@ class SettingsActivity : DuckDuckGoActivity() { } companion object { + // header, divider and "General" item + const val ITEMS_TO_SKIP_WHEN_SORTING_SETTING_ITEMS = 3 + fun intent(context: Context): Intent { return Intent(context, SettingsActivity::class.java) }