Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions app/src/main/java/com/duckduckgo/app/settings/SettingsActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -301,6 +322,7 @@ class SettingsActivity : DuckDuckGoActivity() {
updateDuckChat(it.isDuckChatEnabled, it.isAiFeaturesRebrandingEnabled)
updateVoiceSearchVisibility(it.isVoiceSearchVisible)
updateAddWidgetInProtections(it.isAddWidgetInProtectionsVisible, it.widgetsInstalled)
sortSettingItemsAlphabetically()
}
}.launchIn(lifecycleScope)

Expand Down Expand Up @@ -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()
}
Expand Down Expand Up @@ -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)
}
Expand Down
44 changes: 5 additions & 39 deletions app/src/main/res/layout/view_settings_item_duck_chat.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,46 +13,12 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"

<com.duckduckgo.common.ui.view.listitem.OneLineListItem
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/duckChatSetting"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:paddingHorizontal="16dp">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/oneLineItemHeight">

<ImageView
android:id="@+id/leadingIcon"
android:layout_width="@dimen/listItemImageMediumSize"
android:layout_height="@dimen/listItemImageMediumSize"
android:layout_gravity="center"
android:importantForAccessibility="no"
android:src="@drawable/ic_ai_chat_color_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.duckduckgo.common.ui.view.text.DaxTextView
android:id="@+id/primaryText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/keyline_4"
android:breakStrategy="balanced"
android:text="@string/duck_chat_title"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@id/leadingIcon"
app:layout_constraintTop_toTopOf="parent"
app:layout_constrainedWidth="true"
app:typography="body1" />

</androidx.constraintlayout.widget.ConstraintLayout>

</FrameLayout>
app:primaryText="@string/duck_chat_title"
app:leadingIcon="@drawable/ic_ai_chat_color_24"/>
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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() }
Expand All @@ -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))
Expand Down
Loading