Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f8a69144 authored by chelseahao's avatar chelseahao Committed by Chelsea Hao
Browse files

Filled in devices for BluetoothTileDialog and implemented click callback.

Flag: BLUETOOTH_QS_TILE_DIALOG
Test: atest -c BluetoothTileDialogTest BluetoothTileDialogViewModelTest DeviceItemFactoryTest DeviceItemInteractorTest BluetoothTileDialogRepositoryTest
Bug: 298124674
Change-Id: Iec95b955ca064acbb3c9d0be800d689c8400810d
parent 5ca8cc0b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginBottom="10dp">
    android:layout_marginBottom="4dp">

    <LinearLayout
        android:id="@+id/bluetooth_device"
+2 −0
Original line number Diff line number Diff line
@@ -632,6 +632,8 @@
    <string name="turn_on_bluetooth">Use Bluetooth</string>
    <!-- QuickSettings: Bluetooth dialog device connected default summary [CHAR LIMIT=NONE]-->
    <string name="quick_settings_bluetooth_device_connected">Connected</string>
    <!-- QuickSettings: Bluetooth dialog device saved default summary [CHAR LIMIT=NONE]-->
    <string name="quick_settings_bluetooth_device_saved">Saved</string>

    <!-- QuickSettings: Bluetooth secondary label for the battery level of a connected device [CHAR LIMIT=20]-->
    <string name="quick_settings_bluetooth_secondary_label_battery_level"><xliff:g id="battery_level_as_percentage">%s</xliff:g> battery</string>
+33 −8
Original line number Diff line number Diff line
@@ -33,11 +33,14 @@ import com.android.systemui.statusbar.phone.SystemUIDialog
@SysUISingleton
internal class BluetoothTileDialog
constructor(
    private val deviceItem: List<DeviceItem>,
    private val deviceItemOnClickCallback: DeviceItemOnClickCallback,
    deviceItem: List<DeviceItem>,
    deviceItemOnClickCallback: DeviceItemOnClickCallback,
    context: Context,
) : SystemUIDialog(context, DEFAULT_THEME, DEFAULT_DISMISS_ON_DEVICE_LOCK) {

    private val deviceItemAdapter: Adapter =
        Adapter(deviceItem.toMutableList(), deviceItemOnClickCallback)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

@@ -47,6 +50,10 @@ constructor(
        setupRecyclerView()
    }

    internal fun onDeviceItemUpdated(deviceItem: DeviceItem, position: Int) {
        deviceItemAdapter.refreshDeviceItem(deviceItem, position)
    }

    private fun setupDoneButton() {
        requireViewById<View>(R.id.done_button).setOnClickListener { dismiss() }
    }
@@ -54,12 +61,12 @@ constructor(
    private fun setupRecyclerView() {
        requireViewById<RecyclerView>(R.id.device_list).apply {
            layoutManager = LinearLayoutManager(context)
            adapter = Adapter(deviceItem, deviceItemOnClickCallback)
            adapter = deviceItemAdapter
        }
    }

    internal class Adapter(
        private val deviceItem: List<DeviceItem>,
        private var deviceItem: MutableList<DeviceItem>,
        private val onClickCallback: DeviceItemOnClickCallback
    ) : RecyclerView.Adapter<Adapter.DeviceItemViewHolder>() {

@@ -74,21 +81,34 @@ constructor(

        override fun onBindViewHolder(holder: DeviceItemViewHolder, position: Int) {
            val item = getItem(position)
            holder.bind(item, onClickCallback)
            holder.bind(item, position, onClickCallback)
        }

        internal fun getItem(position: Int) = deviceItem[position]

        internal fun refreshDeviceItem(updated: DeviceItem, position: Int) {
            deviceItem[position] = updated
            notifyItemChanged(position)
        }

        internal class DeviceItemViewHolder(view: View) : RecyclerView.ViewHolder(view) {
            private val container = view.requireViewById<View>(R.id.bluetooth_device)
            private val nameView = view.requireViewById<TextView>(R.id.bluetooth_device_name)
            private val summaryView = view.requireViewById<TextView>(R.id.bluetooth_device_summary)
            private val iconView = view.requireViewById<ImageView>(R.id.bluetooth_device_icon)

            internal fun bind(item: DeviceItem, onClickCallback: DeviceItemOnClickCallback) {
            internal fun bind(
                item: DeviceItem,
                position: Int,
                deviceItemOnClickCallback: DeviceItemOnClickCallback
            ) {
                container.apply {
                    item.background?.let { background = context.getDrawable(it) }
                    setOnClickListener { onClickCallback.onClicked(item) }
                    isEnabled = item.isEnabled
                    alpha = item.alpha
                    background = item.background
                    setOnClickListener {
                        deviceItemOnClickCallback.onDeviceItemClicked(item, position)
                    }
                }
                nameView.text = item.deviceName
                summaryView.text = item.connectionSummary
@@ -101,4 +121,9 @@ constructor(
            }
        }
    }

    internal companion object {
        const val ENABLED_ALPHA = 1.0f
        const val DISABLED_ALPHA = 0.3f
    }
}
+14 −3
Original line number Diff line number Diff line
@@ -33,10 +33,11 @@ constructor(
    private val deviceItemInteractor: DeviceItemInteractor,
    private val dialogLaunchAnimator: DialogLaunchAnimator,
    @Main private val uiHandler: Handler
) {
) : DeviceItemOnClickCallback {
    private var deviceItems: List<DeviceItem> = emptyList()

    @VisibleForTesting var dialog: BluetoothTileDialog? = null
    @VisibleForTesting
    var dialog: BluetoothTileDialog? = null

    /**
     * Shows the dialog.
@@ -50,14 +51,24 @@ constructor(
        deviceItems = deviceItemInteractor.getDeviceItems(context)

        uiHandler.post {
            dialog = BluetoothTileDialog(deviceItems, deviceItemInteractor, context)
            dialog = BluetoothTileDialog(deviceItems, this, context)

            view?.let { dialogLaunchAnimator.showFromView(dialog!!, it) } ?: dialog!!.show()
        }
    }

    override fun onDeviceItemClicked(deviceItem: DeviceItem, position: Int) {
        if (deviceItemInteractor.updateDeviceItemOnClick(deviceItem)) {
            dialog?.onDeviceItemUpdated(deviceItem, position)
        }
    }

    private fun dismissDialog() {
        dialog?.dismiss()
        dialog = null
    }
}

internal interface DeviceItemOnClickCallback {
    fun onDeviceItemClicked(deviceItem: DeviceItem, position: Int)
}
+10 −13
Original line number Diff line number Diff line
@@ -34,24 +34,21 @@ package com.android.systemui.qs.tiles.dialog.bluetooth

import android.graphics.drawable.Drawable
import com.android.settingslib.bluetooth.CachedBluetoothDevice
import com.android.systemui.qs.tiles.dialog.bluetooth.BluetoothTileDialog.Companion.ENABLED_ALPHA

enum class DeviceItemType {
    // TODO(b/298124674): Add other types
    AVAILABLE_MEDIA_BLUETOOTH_DEVICE,
}

interface DeviceItemInterface {
    val deviceName: String
    val connectionSummary: String
    val iconWithDescription: Pair<Drawable, String>?
    val background: Int?
    CONNECTED_BLUETOOTH_DEVICE,
    SAVED_BLUETOOTH_DEVICE,
}

data class DeviceItem(
    val type: DeviceItemType,
    val cachedBluetoothDevice: CachedBluetoothDevice,
    override val deviceName: String = "",
    override val connectionSummary: String = "",
    override val iconWithDescription: Pair<Drawable, String>? = null,
    override val background: Int? = null
) : DeviceItemInterface
    val deviceName: String = "",
    val connectionSummary: String = "",
    val iconWithDescription: Pair<Drawable, String>? = null,
    val background: Drawable? = null,
    var isEnabled: Boolean = true,
    var alpha: Float = ENABLED_ALPHA
)
Loading