diff --git a/app/src/main/java/io/heckel/ntfy/ui/ConnectionErrorFragment.kt b/app/src/main/java/io/heckel/ntfy/ui/ConnectionErrorFragment.kt index 14096044..287d6bd9 100644 --- a/app/src/main/java/io/heckel/ntfy/ui/ConnectionErrorFragment.kt +++ b/app/src/main/java/io/heckel/ntfy/ui/ConnectionErrorFragment.kt @@ -5,15 +5,15 @@ import android.graphics.Color import android.os.Bundle import android.view.View import android.view.ViewGroup -import android.widget.AdapterView import android.widget.ArrayAdapter +import android.widget.AutoCompleteTextView import android.widget.HorizontalScrollView -import android.widget.Spinner import android.widget.TextView -import android.widget.Toast import androidx.fragment.app.DialogFragment import com.google.android.material.appbar.MaterialToolbar +import com.google.android.material.chip.Chip import com.google.android.material.color.MaterialColors +import com.google.android.material.textfield.TextInputLayout import io.heckel.ntfy.R import io.heckel.ntfy.db.ConnectionError import io.heckel.ntfy.db.Repository @@ -23,14 +23,13 @@ class ConnectionErrorFragment : DialogFragment() { private lateinit var repository: Repository private var connectionErrors: Map = emptyMap() private var selectedBaseUrl: String? = null - private var detailsVisible = false private var filterBaseUrl: String? = null private lateinit var toolbar: MaterialToolbar - private lateinit var serverLabel: TextView - private lateinit var serverSpinner: Spinner + private lateinit var serverLayout: TextInputLayout + private lateinit var serverDropdown: AutoCompleteTextView private lateinit var errorTextView: TextView - private lateinit var showDetailsTextView: TextView + private lateinit var detailsChip: Chip private lateinit var detailsScrollView: HorizontalScrollView private lateinit var stackTraceTextView: TextView @@ -75,41 +74,35 @@ class ConnectionErrorFragment : DialogFragment() { copyMenuItem?.icon?.setTint(iconColor) // Get view references - serverLabel = view.findViewById(R.id.connection_error_dialog_server_label) - serverSpinner = view.findViewById(R.id.connection_error_dialog_server_spinner) + serverLayout = view.findViewById(R.id.connection_error_dialog_server_layout) + serverDropdown = view.findViewById(R.id.connection_error_dialog_server_dropdown) errorTextView = view.findViewById(R.id.connection_error_dialog_error_text) - showDetailsTextView = view.findViewById(R.id.connection_error_dialog_show_details) + detailsChip = view.findViewById(R.id.connection_error_dialog_details_chip) detailsScrollView = view.findViewById(R.id.connection_error_dialog_details_scroll) stackTraceTextView = view.findViewById(R.id.connection_error_dialog_stack_trace) - // Setup server spinner if multiple errors + // Setup server dropdown if multiple errors val baseUrls = connectionErrors.keys.toList() if (baseUrls.size > 1) { - serverLabel.visibility = View.VISIBLE - serverSpinner.visibility = View.VISIBLE - val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, baseUrls) - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) - serverSpinner.adapter = adapter - serverSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - selectedBaseUrl = baseUrls[position] - updateErrorDisplay() - } - override fun onNothingSelected(parent: AdapterView<*>?) {} + serverLayout.visibility = View.VISIBLE + val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_dropdown_item_1line, baseUrls) + serverDropdown.setAdapter(adapter) + serverDropdown.setText(baseUrls.first(), false) + serverDropdown.setOnItemClickListener { _, _, position, _ -> + selectedBaseUrl = baseUrls[position] + updateErrorDisplay() } } else { - serverLabel.visibility = View.GONE - serverSpinner.visibility = View.GONE + serverLayout.visibility = View.GONE } // Select first error by default selectedBaseUrl = baseUrls.firstOrNull() updateErrorDisplay() - // Toggle details visibility - showDetailsTextView.setOnClickListener { - detailsVisible = !detailsVisible - updateDetailsVisibility() + // Toggle details visibility using chip checked state + detailsChip.setOnCheckedChangeListener { _, isChecked -> + updateDetailsVisibility(isChecked) } // Build dialog @@ -140,17 +133,11 @@ class ConnectionErrorFragment : DialogFragment() { errorTextView.text = getString(R.string.connection_error_dialog_no_error) stackTraceTextView.text = "" } - updateDetailsVisibility() + updateDetailsVisibility(detailsChip.isChecked) } - private fun updateDetailsVisibility() { - if (detailsVisible) { - detailsScrollView.visibility = View.VISIBLE - showDetailsTextView.text = getString(R.string.connection_error_dialog_hide_details) - } else { - detailsScrollView.visibility = View.GONE - showDetailsTextView.text = getString(R.string.connection_error_dialog_show_details) - } + private fun updateDetailsVisibility(visible: Boolean) { + detailsScrollView.visibility = if (visible) View.VISIBLE else View.GONE } private fun copyErrorToClipboard() { @@ -163,7 +150,6 @@ class ConnectionErrorFragment : DialogFragment() { append(error.getStackTraceString().ifEmpty { "No stack trace available" }) } copyToClipboard(requireContext(), "connection error", text) - Toast.makeText(context, R.string.connection_error_dialog_copied, Toast.LENGTH_SHORT).show() } companion object { diff --git a/app/src/main/res/layout/fragment_connection_error_dialog.xml b/app/src/main/res/layout/fragment_connection_error_dialog.xml index bf93ce92..727b9856 100644 --- a/app/src/main/res/layout/fragment_connection_error_dialog.xml +++ b/app/src/main/res/layout/fragment_connection_error_dialog.xml @@ -36,89 +36,82 @@ android:paddingHorizontal="?dialogPreferredPadding" app:layout_behavior="@string/appbar_scrolling_view_behavior"> - - + + android:text="@string/connection_error_dialog_message" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - - - - - - - - - - - - - - - - - - + + android:hint="@string/connection_error_dialog_server_label" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/connection_error_dialog_description"> + + + + + + + + + + + + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/connection_error_dialog_details_chip"> + android:textSize="10sp" /> - + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3493339f..4c34beda 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -368,12 +368,12 @@ Verwendung der ntfy-Themenfarben Veröffentlichen unter %1$s Titel - z. B. Jemand steht vor der Tür + z.B. Jemand steht vor der Tür Sprache Systemstandard verwenden Systemstandard Nachricht - z. B. Warnung, Totenkopf + z.B. Warnung, Totenkopf Priorität Veröffentlichen Nachricht kann nicht veröffentlicht werden: %1$s @@ -392,17 +392,17 @@ Lokale Datei anhängen Telefonanruf URL anklicken - z. B. https://example.com/alerts/1234 + z.B. https://example.com/alerts/1234 E-Mail - z. B. phil@example.com + z.B. phil@example.com Übertragungsverzögerung - z. B. 30m, 1h, today 9pm (nur auf Englisch) + z.B. 30m, 1h, today 9pm (nur auf Englisch) Anhang-URL - z. B. https://example.com/flowers.jpg + z.B. https://example.com/flowers.jpg Dateiname der Anlage - z. B. Lilien.jpg + z.B. Lilien.jpg Telefonanruf - z. B. +1234567890 + z.B. +1234567890 Beispiele und eine detaillierte Beschreibung aller Veröffentlichungsfunktionen findest du in der Dokumentation. Nachricht hier eingeben Nachricht veröffentlichen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dd6ec893..e7c56d39 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -290,16 +290,14 @@ Until resumed - Connection Error - There was a problem connecting to the server. The app will keep trying to reconnect. + Connection error + There was a problem connecting to the server. The app will keep trying to reconnect in the background. Server Error message - Show details - Hide details + Details No additional details available No error Copy - Error details copied to clipboard Open