diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt index f64b2386..96eb536c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt @@ -21,7 +21,6 @@ import android.view.animation.AccelerateDecelerateInterpolator import android.view.animation.OvershootInterpolator import android.widget.ImageView import androidx.core.view.children -import com.simplemobiletools.commons.dialogs.SimpleBottomSheetChooserDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.LOWER_ALPHA import com.simplemobiletools.commons.helpers.MINUTE_SECONDS @@ -29,6 +28,7 @@ import com.simplemobiletools.commons.helpers.isOreoMr1Plus import com.simplemobiletools.commons.helpers.isOreoPlus import com.simplemobiletools.commons.models.SimpleListItem import com.simplemobiletools.dialer.R +import com.simplemobiletools.dialer.dialogs.DynamicBottomSheetChooserDialog import com.simplemobiletools.dialer.extensions.* import com.simplemobiletools.dialer.helpers.* import com.simplemobiletools.dialer.models.AudioRoute @@ -61,7 +61,7 @@ class CallActivity : SimpleActivity() { private var viewsUnderDialpad = arrayListOf>() private var dialpadHeight = 0f - private var audioRouteChooserDialog: SimpleBottomSheetChooserDialog? = null + private var audioRouteChooserDialog: DynamicBottomSheetChooserDialog? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -399,19 +399,19 @@ class CallActivity : SimpleActivity() { } private fun createOrUpdateAudioRouteChooser(routes: Array, create: Boolean = true) { + val callAudioRoute = CallManager.getCallAudioRoute() val items = routes .sortedByDescending { it.route } - .map { SimpleListItem(it.route, it.iconRes, it.stringRes) } + .map { SimpleListItem(it.route, it.iconRes, it.stringRes, selected = it == callAudioRoute) } .toTypedArray() if (audioRouteChooserDialog?.isVisible == true) { audioRouteChooserDialog?.updateChooserItems(items) } else if (create) { - audioRouteChooserDialog = SimpleBottomSheetChooserDialog.createChooser( + audioRouteChooserDialog = DynamicBottomSheetChooserDialog.createChooser( fragmentManager = supportFragmentManager, title = R.string.choose_audio_route, - subtitle = null, - data = items + items = items ) { audioRouteChooserDialog = null CallManager.setAudioRoute(it.id) diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/DynamicBottomSheetChooserDialog.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/DynamicBottomSheetChooserDialog.kt new file mode 100644 index 00000000..eebe3ae1 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/DynamicBottomSheetChooserDialog.kt @@ -0,0 +1,70 @@ +package com.simplemobiletools.dialer.dialogs + +import android.os.Bundle +import android.view.ViewGroup +import androidx.fragment.app.FragmentManager +import com.simplemobiletools.commons.adapters.SimpleListItemAdapter +import com.simplemobiletools.commons.fragments.BaseBottomSheetDialogFragment +import com.simplemobiletools.commons.models.SimpleListItem +import com.simplemobiletools.dialer.R +import kotlinx.android.synthetic.main.layout_simple_recycler_view.* + +// same as BottomSheetChooserDialog but with dynamic updates +class DynamicBottomSheetChooserDialog : BaseBottomSheetDialogFragment() { + + var onItemClick: ((SimpleListItem) -> Unit)? = null + + override fun setupContentView(parent: ViewGroup) { + val child = layoutInflater.inflate(R.layout.layout_simple_recycler_view, parent, false) + parent.addView(child) + setupRecyclerView() + } + + private fun setupRecyclerView() { + @Suppress("UNCHECKED_CAST") + val listItems = arguments?.getParcelableArray(ITEMS) as Array + getRecyclerViewAdapter().submitList(listItems.toList()) + } + + private fun getRecyclerViewAdapter(): SimpleListItemAdapter { + var adapter = recycler_view.adapter as? SimpleListItemAdapter + if (adapter == null) { + adapter = SimpleListItemAdapter(requireActivity()) { + onItemClick?.invoke(it) + dismissAllowingStateLoss() + } + recycler_view.adapter = adapter + } + return adapter + } + + fun updateChooserItems(newItems: Array) { + if (isAdded) { + getRecyclerViewAdapter().submitList(newItems.toList()) + } + } + + companion object { + private const val TAG = "BottomSheetChooserDialog" + private const val ITEMS = "data" + + fun createChooser( + fragmentManager: FragmentManager, + title: Int?, + items: Array, + callback: (SimpleListItem) -> Unit + ): DynamicBottomSheetChooserDialog { + val extras = Bundle().apply { + if (title != null) { + putInt(BOTTOM_SHEET_TITLE, title) + } + putParcelableArray(ITEMS, items) + } + return DynamicBottomSheetChooserDialog().apply { + arguments = extras + onItemClick = callback + show(fragmentManager, TAG) + } + } + } +} diff --git a/app/src/main/res/layout/layout_simple_recycler_view.xml b/app/src/main/res/layout/layout_simple_recycler_view.xml new file mode 100644 index 00000000..81f31970 --- /dev/null +++ b/app/src/main/res/layout/layout_simple_recycler_view.xml @@ -0,0 +1,10 @@ +