diff --git a/app/src/main/java/net/vonforst/evmap/fragment/ChargepriceFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/ChargepriceFragment.kt index 6805b3fc..9f2ae6be 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/ChargepriceFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/ChargepriceFragment.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AlertDialog import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -17,6 +16,7 @@ import androidx.navigation.ui.setupWithNavController import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.color.MaterialColors +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.google.android.material.transition.MaterialContainerTransform import net.vonforst.evmap.MapsActivity @@ -69,7 +69,7 @@ class ChargepriceFragment : Fragment() { } private fun showDonationDialog() { - AlertDialog.Builder(requireContext()) + MaterialAlertDialogBuilder(requireContext()) .setTitle(R.string.chargeprice_donation_dialog_title) .setMessage(R.string.chargeprice_donation_dialog_detail) .setNegativeButton(R.string.ok) { di, _ -> diff --git a/app/src/main/java/net/vonforst/evmap/fragment/DataSourceSelectDialog.kt b/app/src/main/java/net/vonforst/evmap/fragment/DataSourceSelectDialog.kt index c59b4d6c..2456fd50 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/DataSourceSelectDialog.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/DataSourceSelectDialog.kt @@ -4,13 +4,12 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AppCompatDialogFragment import net.vonforst.evmap.databinding.DialogDataSourceSelectBinding import net.vonforst.evmap.model.FILTERS_DISABLED import net.vonforst.evmap.storage.PreferenceDataSource -import java.util.* +import net.vonforst.evmap.ui.MaterialDialogFragment -class DataSourceSelectDialog : AppCompatDialogFragment() { +class DataSourceSelectDialog : MaterialDialogFragment() { private lateinit var binding: DialogDataSourceSelectBinding var okListener: ((String) -> Unit)? = null @@ -41,11 +40,7 @@ class DataSourceSelectDialog : AppCompatDialogFragment() { override fun onStart() { super.onStart() - // dialog with 95% screen height - dialog?.window?.setLayout( - ViewGroup.LayoutParams.MATCH_PARENT, - (resources.displayMetrics.heightPixels * 0.95).toInt() - ) + setFullSize() } private lateinit var prefs: PreferenceDataSource diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt index d94236df..9032faf8 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MapFragment.kt @@ -20,7 +20,6 @@ import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.RequiresPermission -import androidx.appcompat.app.AlertDialog import androidx.appcompat.widget.PopupMenu import androidx.core.content.ContextCompat import androidx.core.location.LocationListenerCompat @@ -52,6 +51,7 @@ import com.car2go.maps.model.BitmapDescriptor import com.car2go.maps.model.LatLng import com.car2go.maps.model.Marker import com.car2go.maps.model.MarkerOptions +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.google.android.material.transition.MaterialArcMotion import com.google.android.material.transition.MaterialContainerTransform @@ -805,7 +805,7 @@ class MapFragment : Fragment(), OnMapReadyCallback, MapsActivity.FragmentCallbac it.name } } - AlertDialog.Builder(activity) + MaterialAlertDialogBuilder(activity) .setTitle(R.string.charge_cards) .setItems(names.toTypedArray()) { _, i -> val card = data[i] diff --git a/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt b/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt index a1dc1496..7e0e8085 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/MultiSelectDialog.kt @@ -4,20 +4,16 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.WindowManager -import androidx.appcompat.app.AppCompatDialogFragment import androidx.core.widget.doAfterTextChanged import androidx.recyclerview.widget.LinearLayoutManager import net.vonforst.evmap.R import net.vonforst.evmap.adapter.DataBindingAdapter import net.vonforst.evmap.adapter.Equatable import net.vonforst.evmap.databinding.DialogMultiSelectBinding +import net.vonforst.evmap.ui.MaterialDialogFragment import java.util.* -import kotlin.collections.HashMap -import kotlin.collections.HashSet -import kotlin.math.roundToInt -class MultiSelectDialog : AppCompatDialogFragment() { +class MultiSelectDialog : MaterialDialogFragment() { companion object { fun getInstance( title: String, @@ -54,16 +50,7 @@ class MultiSelectDialog : AppCompatDialogFragment() { override fun onStart() { super.onStart() - - val density = resources.displayMetrics.density - val width = resources.displayMetrics.widthPixels - val maxWidth = (500 * density).roundToInt() - - // dialog with 95% screen height - dialog?.window?.setLayout( - if (width < maxWidth) WindowManager.LayoutParams.MATCH_PARENT else maxWidth, - (resources.displayMetrics.heightPixels * 0.95).toInt() - ) + setFullSize(maxWidthDp = 500) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/net/vonforst/evmap/fragment/updatedialogs/OpensourceDonationsDialogFramgent.kt b/app/src/main/java/net/vonforst/evmap/fragment/updatedialogs/OpensourceDonationsDialogFramgent.kt index fbaca157..9129946e 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/updatedialogs/OpensourceDonationsDialogFramgent.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/updatedialogs/OpensourceDonationsDialogFramgent.kt @@ -4,15 +4,13 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.WindowManager -import androidx.appcompat.app.AppCompatDialogFragment import androidx.navigation.fragment.findNavController import net.vonforst.evmap.R import net.vonforst.evmap.databinding.DialogOpensourceDonationsBinding import net.vonforst.evmap.storage.PreferenceDataSource -import kotlin.math.roundToInt +import net.vonforst.evmap.ui.MaterialDialogFragment -class OpensourceDonationsDialogFramgent : AppCompatDialogFragment() { +class OpensourceDonationsDialogFramgent : MaterialDialogFragment() { private lateinit var binding: DialogOpensourceDonationsBinding override fun onCreateView( @@ -45,13 +43,6 @@ class OpensourceDonationsDialogFramgent : AppCompatDialogFragment() { override fun onStart() { super.onStart() - val density = resources.displayMetrics.density - val width = resources.displayMetrics.widthPixels - val maxWidth = (500 * density).roundToInt() - - dialog?.window?.setLayout( - if (width < maxWidth) WindowManager.LayoutParams.MATCH_PARENT else maxWidth, - WindowManager.LayoutParams.WRAP_CONTENT - ) + setFullSize(maxWidthDp = 500) } } \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/ui/Dialogs.kt b/app/src/main/java/net/vonforst/evmap/ui/Dialogs.kt index bdbdc1a3..a9fb0734 100644 --- a/app/src/main/java/net/vonforst/evmap/ui/Dialogs.kt +++ b/app/src/main/java/net/vonforst/evmap/ui/Dialogs.kt @@ -1,14 +1,20 @@ package net.vonforst.evmap.ui +import android.app.Dialog import android.content.Context import android.content.DialogInterface +import android.os.Bundle +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.view.WindowManager import android.view.inputmethod.EditorInfo import android.widget.EditText import android.widget.FrameLayout import androidx.appcompat.app.AlertDialog +import androidx.appcompat.app.AppCompatDialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder +import kotlin.math.roundToInt private fun dialogEditText(ctx: Context): Pair { val container = FrameLayout(ctx) @@ -49,4 +55,55 @@ fun showEditTextDialog( false } return dialog +} + +/** + * DialogFragment that uses Material styling. + * This needs a bit of a workaround, see also + * https://github.com/material-components/material-components-android/issues/540 and + * https://dev.to/bhullnatik/how-to-use-material-dialogs-with-dialogfragment-28i1 + */ +open class MaterialDialogFragment : AppCompatDialogFragment() { + + private lateinit var dialogView: View + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = MaterialAlertDialogBuilder(requireContext(), theme).apply { + dialogView = + onCreateView(LayoutInflater.from(requireContext()), null, savedInstanceState)!! + + setView(dialogView) + }.create() + onViewCreated(dialogView, savedInstanceState) + return dialog + } + + override fun getView(): View { + return dialogView + } + + override fun onStart() { + super.onStart() + // make sure that custom view fills whole dialog height + (view.parent as View).layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT + (view.parent.parent as View).layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT + (view.parent.parent.parent as View).layoutParams.height = + ViewGroup.LayoutParams.MATCH_PARENT + } + + /** + * Makes the dialog fill the whole width & height of the screen, with an optional maximum + * width in dp. Call this during onStart. + */ + fun setFullSize(maxWidthDp: Int? = null) { + val width = resources.displayMetrics.widthPixels + val maxWidth = if (maxWidthDp != null) { + val density = resources.displayMetrics.density + (maxWidthDp * density).roundToInt() + } else null + + dialog?.window?.setLayout( + if (maxWidth == null || width < maxWidth) WindowManager.LayoutParams.MATCH_PARENT else maxWidth, + WindowManager.LayoutParams.MATCH_PARENT + ) + } } \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a369b55f..5e1a9615 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -13,6 +13,7 @@ @color/colorSecondaryDark true @style/AppTheme.Preference + @style/AppTheme.AlertDialog @style/AppTheme.AlertDialog @@ -71,6 +72,7 @@