This commit is contained in:
Philipp Heckel 2025-12-26 16:52:32 -05:00
parent cb87b4b5f1
commit 413a5bab00
6 changed files with 244 additions and 90 deletions

View file

@ -13,7 +13,9 @@ data class PriorityItem(
val priority: Int,
val label: String,
val iconResId: Int
)
) {
override fun toString(): String = label
}
class PriorityAdapter(
context: Context,

View file

@ -55,6 +55,9 @@ class PublishFragment : DialogFragment() {
// Chips
private lateinit var chipGroup: ChipGroup
private lateinit var chipTitle: Chip
private lateinit var chipTags: Chip
private lateinit var chipPriority: Chip
private lateinit var chipClickUrl: Chip
private lateinit var chipEmail: Chip
private lateinit var chipDelay: Chip
@ -62,6 +65,11 @@ class PublishFragment : DialogFragment() {
private lateinit var chipAttachFile: Chip
private lateinit var chipPhoneCall: Chip
// Toggleable field layouts
private lateinit var titleLayout: View
private lateinit var tagsLayout: View
private lateinit var priorityLayout: View
// Optional field layouts
private lateinit var clickUrlLayout: View
private lateinit var emailLayout: View
@ -176,13 +184,18 @@ class PublishFragment : DialogFragment() {
val priorityItems = PriorityAdapter.createPriorityItems(requireContext())
val priorityAdapter = PriorityAdapter(requireContext(), priorityItems)
priorityDropdown.setAdapter(priorityAdapter)
priorityDropdown.setText(priorityItems[2].label, false) // Default priority (index 2 = priority 3)
// Set default priority (index 2 = priority 3)
priorityDropdown.setText(priorityItems[2].label, false)
priorityDropdown.setOnItemClickListener { _, _, position, _ ->
selectedPriority = priorityItems[position].priority
priorityDropdown.setText(priorityItems[position].label, false)
}
// Setup chips
chipGroup = view.findViewById(R.id.publish_dialog_chip_group)
chipTitle = view.findViewById(R.id.publish_dialog_chip_title)
chipTags = view.findViewById(R.id.publish_dialog_chip_tags)
chipPriority = view.findViewById(R.id.publish_dialog_chip_priority)
chipClickUrl = view.findViewById(R.id.publish_dialog_chip_click_url)
chipEmail = view.findViewById(R.id.publish_dialog_chip_email)
chipDelay = view.findViewById(R.id.publish_dialog_chip_delay)
@ -190,6 +203,11 @@ class PublishFragment : DialogFragment() {
chipAttachFile = view.findViewById(R.id.publish_dialog_chip_attach_file)
chipPhoneCall = view.findViewById(R.id.publish_dialog_chip_phone_call)
// Setup toggleable field layouts
titleLayout = view.findViewById(R.id.publish_dialog_title_layout)
tagsLayout = view.findViewById(R.id.publish_dialog_tags_layout)
priorityLayout = view.findViewById(R.id.publish_dialog_priority_layout)
// Setup optional field layouts
clickUrlLayout = view.findViewById(R.id.publish_dialog_click_url_layout)
emailLayout = view.findViewById(R.id.publish_dialog_email_layout)
@ -244,6 +262,26 @@ class PublishFragment : DialogFragment() {
}
private fun setupChipListeners() {
chipTitle.setOnCheckedChangeListener { _, isChecked ->
titleLayout.visibility = if (isChecked) View.VISIBLE else View.GONE
if (!isChecked) titleText.setText("")
}
chipTags.setOnCheckedChangeListener { _, isChecked ->
tagsLayout.visibility = if (isChecked) View.VISIBLE else View.GONE
if (!isChecked) tagsText.setText("")
}
chipPriority.setOnCheckedChangeListener { _, isChecked ->
priorityLayout.visibility = if (isChecked) View.VISIBLE else View.GONE
if (!isChecked) {
// Reset to default priority
selectedPriority = 3
val priorityItems = PriorityAdapter.createPriorityItems(requireContext())
priorityDropdown.setText(priorityItems[2].label, false)
}
}
chipClickUrl.setOnCheckedChangeListener { _, isChecked ->
clickUrlLayout.visibility = if (isChecked) View.VISIBLE else View.GONE
if (!isChecked) clickUrlText.setText("")
@ -291,6 +329,15 @@ class PublishFragment : DialogFragment() {
}
private fun setupRemoveButtonListeners(view: View) {
view.findViewById<ImageButton>(R.id.publish_dialog_title_remove).setOnClickListener {
chipTitle.isChecked = false
}
view.findViewById<ImageButton>(R.id.publish_dialog_tags_remove).setOnClickListener {
chipTags.isChecked = false
}
view.findViewById<ImageButton>(R.id.publish_dialog_priority_remove).setOnClickListener {
chipPriority.isChecked = false
}
view.findViewById<ImageButton>(R.id.publish_dialog_click_url_remove).setOnClickListener {
chipClickUrl.isChecked = false
}
@ -359,10 +406,11 @@ class PublishFragment : DialogFragment() {
}
private fun onSendClick() {
val title = titleText.text.toString()
val title = if (chipTitle.isChecked) titleText.text.toString() else ""
val message = messageText.text.toString()
val markdown = markdownCheckbox.isChecked
val tagsString = tagsText.text.toString()
val priority = if (chipPriority.isChecked) selectedPriority else 3 // Default priority if not shown
val tagsString = if (chipTags.isChecked) tagsText.text.toString() else ""
val tags = if (tagsString.isNotEmpty()) {
tagsString.split(",").map { it.trim() }.filter { it.isNotEmpty() }
} else {
@ -401,7 +449,7 @@ class PublishFragment : DialogFragment() {
user = user,
message = message,
title = title,
priority = selectedPriority,
priority = priority,
tags = tags,
delay = delay,
body = body,
@ -419,7 +467,7 @@ class PublishFragment : DialogFragment() {
user = user,
message = message,
title = title,
priority = selectedPriority,
priority = priority,
tags = tags,
delay = delay,
click = clickUrl,
@ -474,6 +522,9 @@ class PublishFragment : DialogFragment() {
priorityDropdown.isEnabled = enable
// Chips
chipTitle.isEnabled = enable
chipTags.isEnabled = enable
chipPriority.isEnabled = enable
chipClickUrl.isEnabled = enable
chipEmail.isEnabled = enable
chipDelay.isEnabled = enable

View file

@ -61,23 +61,42 @@
</FrameLayout>
<!-- Title -->
<com.google.android.material.textfield.TextInputLayout
<!-- Title (toggleable) -->
<LinearLayout
android:id="@+id/publish_dialog_title_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp">
android:orientation="horizontal"
android:visibility="gone"
android:layout_marginTop="8dp"
android:gravity="center_vertical">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/publish_dialog_title_text"
android:layout_width="match_parent"
<com.google.android.material.textfield.TextInputLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/publish_dialog_title_hint"
android:importantForAutofill="no"
android:maxLines="1"
android:inputType="text"/>
android:layout_weight="1">
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/publish_dialog_title_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/publish_dialog_title_hint"
android:importantForAutofill="no"
android:maxLines="1"
android:inputType="text"/>
</com.google.android.material.textfield.TextInputLayout>
<ImageButton
android:id="@+id/publish_dialog_title_remove"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_cancel_gray_24dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/publish_dialog_remove_field"
app:tint="?attr/colorOnSurfaceVariant"/>
</LinearLayout>
<!-- Message -->
<com.google.android.material.textfield.TextInputLayout
@ -106,20 +125,20 @@
android:layout_marginTop="4dp"
android:text="@string/publish_dialog_format_markdown"/>
<!-- Tags and Priority row -->
<!-- Tags (toggleable) -->
<LinearLayout
android:id="@+id/publish_dialog_tags_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone"
android:layout_marginTop="10dp"
android:baselineAligned="false">
android:gravity="center_vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/publish_dialog_tags_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginEnd="8dp">
android:layout_weight="1">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/publish_dialog_tags_text"
@ -132,86 +151,53 @@
</com.google.android.material.textfield.TextInputLayout>
<ImageButton
android:id="@+id/publish_dialog_tags_remove"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_cancel_gray_24dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/publish_dialog_remove_field"
app:tint="?attr/colorOnSurfaceVariant"/>
</LinearLayout>
<!-- Priority (toggleable) -->
<LinearLayout
android:id="@+id/publish_dialog_priority_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone"
android:layout_marginTop="10dp"
android:gravity="center_vertical">
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
android:id="@+id/publish_dialog_priority_layout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1">
android:layout_weight="1"
android:hint="@string/publish_dialog_priority_hint">
<AutoCompleteTextView
android:id="@+id/publish_dialog_priority_dropdown"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="none"
android:text="@string/publish_dialog_priority_default"/>
android:inputType="none"/>
</com.google.android.material.textfield.TextInputLayout>
<ImageButton
android:id="@+id/publish_dialog_priority_remove"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_cancel_gray_24dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/publish_dialog_remove_field"
app:tint="?attr/colorOnSurfaceVariant"/>
</LinearLayout>
<!-- Other features section -->
<TextView
android:id="@+id/publish_dialog_other_features_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/publish_dialog_other_features"
android:textAppearance="@style/TextAppearance.Material3.LabelMedium"
android:textColor="?attr/colorOnSurfaceVariant"/>
<!-- Feature chips -->
<com.google.android.material.chip.ChipGroup
android:id="@+id/publish_dialog_chip_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:singleLine="false">
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_click_url"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_click_url"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_email"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_email"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_delay"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_delay"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_attach_url"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_attach_url"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_attach_file"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_attach_file"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_phone_call"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_phone_call"/>
</com.google.android.material.chip.ChipGroup>
<!-- Click URL field -->
<LinearLayout
android:id="@+id/publish_dialog_click_url_layout"
@ -460,6 +446,109 @@
</LinearLayout>
<!-- Other features section -->
<TextView
android:id="@+id/publish_dialog_other_features_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/publish_dialog_other_features"
android:textAppearance="@style/TextAppearance.Material3.LabelMedium"
android:textColor="?attr/colorOnSurfaceVariant"/>
<!-- Feature chips -->
<com.google.android.material.chip.ChipGroup
android:id="@+id/publish_dialog_chip_group"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:chipSpacingVertical="0dp"
app:chipSpacingHorizontal="8dp"
app:singleLine="false">
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_title"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_title"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_tags"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_tags"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_priority"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_priority"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_click_url"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_click_url"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_email"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_email"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_delay"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_delay"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_attach_url"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_attach_url"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_attach_file"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_attach_file"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
<com.google.android.material.chip.Chip
android:id="@+id/publish_dialog_chip_phone_call"
style="@style/Widget.Material3.Chip.Filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/publish_dialog_chip_phone_call"
app:chipBackgroundColor="@color/chip_background_color"
app:chipStrokeWidth="0dp"/>
</com.google.android.material.chip.ChipGroup>
<!-- Documentation link -->
<TextView
android:id="@+id/publish_dialog_docs_link"
@ -468,7 +557,7 @@
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:text="@string/publish_dialog_docs_link"
android:textColor="?attr/colorPrimary"
android:textColor="?android:attr/textColorSecondary"
android:textAppearance="@style/TextAppearance.Material3.BodySmall"/>
<!-- Error section -->

View file

@ -144,4 +144,8 @@
<color name="action_bar">#1B2023</color> <!-- md_theme_surfaceContainer (dark) - matches card color -->
<color name="detail_activity_background">#121212</color> <!-- Black for detail activity in dark mode -->
<!-- Chip colors -->
<color name="chip_background_color">#2C2C2C</color> <!-- Dark gray background -->
<color name="chip_stroke_color">#424242</color> <!-- Dark gray stroke -->
</resources>

View file

@ -145,6 +145,10 @@
<color name="action_bar">#338574</color> <!-- md_theme_primary (light) -->
<color name="detail_activity_background">#EEEEEE</color> <!-- Light gray for detail activity in light mode -->
<!-- Chip colors -->
<color name="chip_background_color">#E8E8E8</color> <!-- Light gray background -->
<color name="chip_stroke_color">#BDBDBD</color> <!-- Gray stroke -->
<!-- Remove black status bar in Action mode: https://stackoverflow.com/a/79456725 -->
<color name="abc_decor_view_status_guard" tools:override="true">@android:color/transparent</color>
<color name="abc_decor_view_status_guard_light" tools:override="true">@android:color/transparent</color>

View file

@ -201,9 +201,10 @@
<!-- Publish dialog -->
<string name="publish_dialog_title">Publish to %1$s</string>
<string name="publish_dialog_title_hint">Title (optional)</string>
<string name="publish_dialog_title_hint">Title</string>
<string name="publish_dialog_message_hint">Message</string>
<string name="publish_dialog_tags_hint">Tags</string>
<string name="publish_dialog_priority_hint">Priority</string>
<string name="publish_dialog_priority_default">Default priority</string>
<string name="publish_dialog_priority_min">Min priority</string>
<string name="publish_dialog_priority_low">Low priority</string>
@ -215,6 +216,9 @@
<string name="publish_dialog_message_published">Message published</string>
<string name="publish_dialog_format_markdown">Format as Markdown</string>
<string name="publish_dialog_other_features">Other features:</string>
<string name="publish_dialog_chip_title">Title</string>
<string name="publish_dialog_chip_tags">Tags</string>
<string name="publish_dialog_chip_priority">Priority</string>
<string name="publish_dialog_chip_click_url">Click URL</string>
<string name="publish_dialog_chip_email">Email</string>
<string name="publish_dialog_chip_delay">Delay</string>