From 24cf1a6f8c1334198e87f5e4fdf6f4195ebefbf5 Mon Sep 17 00:00:00 2001 From: darken Date: Mon, 10 Jan 2022 21:09:44 +0100 Subject: [PATCH] Improve "UnknownDevice" and "NoPairedDeviceConnected" cards --- .../capod/main/ui/overview/OverviewAdapter.kt | 2 + .../main/ui/overview/OverviewFragmentVM.kt | 15 +++-- .../ui/overview/cards/NoPairedDeviceCardVH.kt | 35 ++++++++++++ .../ui/overview/cards/PermissionCardVH.kt | 10 ++-- .../{KnownDevices.kt => PairedDevices.kt} | 4 +- .../darken/capod/monitor/core/PodReactions.kt | 4 +- .../monitor/core/worker/MonitorWorker.kt | 4 +- .../capod/monitor/ui/MonitorNotifications.kt | 2 +- .../pods/core/apple/UnknownAppleDevice.kt | 4 +- .../layout/overview_nopaireddevice_item.xml | 55 +++++++++++++++++++ ..._item.xml => overview_permission_item.xml} | 2 +- .../res/layout/overview_pods_unknown_item.xml | 20 ++++++- app/src/main/res/values/strings.xml | 16 ++++-- 13 files changed, 144 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/eu/darken/capod/main/ui/overview/cards/NoPairedDeviceCardVH.kt rename app/src/main/java/eu/darken/capod/monitor/core/{KnownDevices.kt => PairedDevices.kt} (89%) create mode 100644 app/src/main/res/layout/overview_nopaireddevice_item.xml rename app/src/main/res/layout/{main_permission_item.xml => overview_permission_item.xml} (97%) diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewAdapter.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewAdapter.kt index 42a15d03..d52e2802 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewAdapter.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewAdapter.kt @@ -11,6 +11,7 @@ import eu.darken.capod.common.lists.differ.setupDiffer import eu.darken.capod.common.lists.modular.ModularAdapter import eu.darken.capod.common.lists.modular.mods.DataBinderMod import eu.darken.capod.common.lists.modular.mods.TypedVHCreatorMod +import eu.darken.capod.main.ui.overview.cards.NoPairedDeviceCardVH import eu.darken.capod.main.ui.overview.cards.PermissionCardVH import eu.darken.capod.main.ui.overview.cards.pods.BasicSingleApplePodsCardVH import eu.darken.capod.main.ui.overview.cards.pods.DualApplePodsCardVH @@ -31,6 +32,7 @@ class OverviewAdapter @Inject constructor() : modules.add(TypedVHCreatorMod({ data[it] is SingleApplePodsCardVH.Item }) { SingleApplePodsCardVH(it) }) modules.add(TypedVHCreatorMod({ data[it] is BasicSingleApplePodsCardVH.Item }) { BasicSingleApplePodsCardVH(it) }) modules.add(TypedVHCreatorMod({ data[it] is UnknownPodDeviceCardVH.Item }) { UnknownPodDeviceCardVH(it) }) + modules.add(TypedVHCreatorMod({ data[it] is NoPairedDeviceCardVH.Item }) { NoPairedDeviceCardVH(it) }) } override fun getItemCount(): Int = data.size diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewFragmentVM.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewFragmentVM.kt index d9461f42..c7b17197 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewFragmentVM.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/OverviewFragmentVM.kt @@ -13,11 +13,9 @@ import eu.darken.capod.common.uix.ViewModel3 import eu.darken.capod.main.core.GeneralSettings import eu.darken.capod.main.core.MonitorMode import eu.darken.capod.main.core.PermissionTool +import eu.darken.capod.main.ui.overview.cards.NoPairedDeviceCardVH import eu.darken.capod.main.ui.overview.cards.PermissionCardVH -import eu.darken.capod.main.ui.overview.cards.pods.BasicSingleApplePodsCardVH -import eu.darken.capod.main.ui.overview.cards.pods.DualApplePodsCardVH -import eu.darken.capod.main.ui.overview.cards.pods.SingleApplePodsCardVH -import eu.darken.capod.main.ui.overview.cards.pods.UnknownPodDeviceCardVH +import eu.darken.capod.main.ui.overview.cards.pods.* import eu.darken.capod.monitor.core.PodMonitor import eu.darken.capod.monitor.core.worker.MonitorControl import eu.darken.capod.pods.core.PodDevice @@ -90,7 +88,8 @@ class OverviewFragmentVM @Inject constructor( requiredPermissions, pods, debugSettings.isDebugModeEnabled.flow, - ) { tick, permissions, pods, isDebugMode -> + generalSettings.showAll.flow, + ) { tick, permissions, pods, isDebugMode, showAll -> val items = mutableListOf() val now = Instant.now() @@ -129,6 +128,12 @@ class OverviewFragmentVM @Inject constructor( } .run { items.addAll(this) } + if (!showAll && items.none { it is PodDeviceVH.Item }) { + NoPairedDeviceCardVH.Item { + generalSettings.showAll.value = true + }.run { items.add(this) } + } + items } .catch { errorEvents.postValue(it) } diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/NoPairedDeviceCardVH.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/NoPairedDeviceCardVH.kt new file mode 100644 index 00000000..0ad9d21f --- /dev/null +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/NoPairedDeviceCardVH.kt @@ -0,0 +1,35 @@ +package eu.darken.capod.main.ui.overview.cards + +import android.view.ViewGroup +import eu.darken.capod.R +import eu.darken.capod.common.lists.binding +import eu.darken.capod.common.lists.differ.DifferItem +import eu.darken.capod.databinding.OverviewNopaireddeviceItemBinding +import eu.darken.capod.main.ui.overview.OverviewAdapter + +class NoPairedDeviceCardVH(parent: ViewGroup) : + OverviewAdapter.BaseVH( + R.layout.overview_nopaireddevice_item, + parent + ) { + + override val viewBinding = lazy { + OverviewNopaireddeviceItemBinding.bind(itemView) + } + + override val onBindData: OverviewNopaireddeviceItemBinding.( + item: Item, + payloads: List + ) -> Unit = binding(payload = true) { item -> + showAllAction.setOnClickListener { item.onShowAll() } + } + + data class Item( + val onShowAll: () -> Unit + ) : OverviewAdapter.Item { + override val stableId: Long = Item::class.hashCode().toLong() + + override val payloadProvider: ((DifferItem, DifferItem) -> DifferItem?) + get() = { old, new -> if (new::class.isInstance(old)) new else null } + } +} \ No newline at end of file diff --git a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/PermissionCardVH.kt b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/PermissionCardVH.kt index a2b292d1..cae457ca 100644 --- a/app/src/main/java/eu/darken/capod/main/ui/overview/cards/PermissionCardVH.kt +++ b/app/src/main/java/eu/darken/capod/main/ui/overview/cards/PermissionCardVH.kt @@ -5,20 +5,20 @@ import eu.darken.capod.R import eu.darken.capod.common.lists.binding import eu.darken.capod.common.lists.differ.DifferItem import eu.darken.capod.common.permissions.Permission -import eu.darken.capod.databinding.MainPermissionItemBinding +import eu.darken.capod.databinding.OverviewPermissionItemBinding import eu.darken.capod.main.ui.overview.OverviewAdapter class PermissionCardVH(parent: ViewGroup) : - OverviewAdapter.BaseVH( - R.layout.main_permission_item, + OverviewAdapter.BaseVH( + R.layout.overview_permission_item, parent ) { override val viewBinding = lazy { - MainPermissionItemBinding.bind(itemView) + OverviewPermissionItemBinding.bind(itemView) } - override val onBindData: MainPermissionItemBinding.( + override val onBindData: OverviewPermissionItemBinding.( item: Item, payloads: List ) -> Unit = binding(payload = true) { item -> diff --git a/app/src/main/java/eu/darken/capod/monitor/core/KnownDevices.kt b/app/src/main/java/eu/darken/capod/monitor/core/PairedDevices.kt similarity index 89% rename from app/src/main/java/eu/darken/capod/monitor/core/KnownDevices.kt rename to app/src/main/java/eu/darken/capod/monitor/core/PairedDevices.kt index 63dc6500..fabaa0d4 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/KnownDevices.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/PairedDevices.kt @@ -13,12 +13,12 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton -class KnownDevices @Inject constructor( +class PairedDevices @Inject constructor( @AppScope private val scope: CoroutineScope, private val bluetoothManager2: BluetoothManager2, ) { - fun currentKnownDevices(): Flow> = bluetoothManager2 + fun connectedDevices(): Flow> = bluetoothManager2 .isBluetoothEnabled .flatMapLatest { bluetoothManager2.connectedDevices() } .map { devices -> diff --git a/app/src/main/java/eu/darken/capod/monitor/core/PodReactions.kt b/app/src/main/java/eu/darken/capod/monitor/core/PodReactions.kt index 2f92d8cc..602fa917 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/PodReactions.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/PodReactions.kt @@ -17,12 +17,12 @@ import javax.inject.Inject @Reusable class PodReactions @Inject constructor( private val podMonitor: PodMonitor, - private val knownDevices: KnownDevices, + private val pairedDevices: PairedDevices, private val generalSettings: GeneralSettings, private val mediaControl: MediaControl, ) { - fun podReactions() = knownDevices.currentKnownDevices() + fun podReactions() = pairedDevices.connectedDevices() .flatMapLatest { if (it.isEmpty()) { log(TAG) { "No known devices connected." } diff --git a/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt b/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt index cfd62be2..c123a1f3 100644 --- a/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt +++ b/app/src/main/java/eu/darken/capod/monitor/core/worker/MonitorWorker.kt @@ -34,7 +34,7 @@ class MonitorWorker @AssistedInject constructor( private val notificationManager: NotificationManager, private val generalSettings: GeneralSettings, private val permissionTool: PermissionTool, - private val knownDevices: KnownDevices, + private val pairedDevices: PairedDevices, private val podMonitor: PodMonitor, private val podReactions: PodReactions, ) : CoroutineWorker(context, params) { @@ -105,7 +105,7 @@ class MonitorWorker @AssistedInject constructor( return@flatMapLatest emptyFlow() } - knownDevices.currentKnownDevices().map { knownDevices -> + pairedDevices.connectedDevices().map { knownDevices -> monitorMode to knownDevices } } diff --git a/app/src/main/java/eu/darken/capod/monitor/ui/MonitorNotifications.kt b/app/src/main/java/eu/darken/capod/monitor/ui/MonitorNotifications.kt index 2855eaa1..28332e4f 100644 --- a/app/src/main/java/eu/darken/capod/monitor/ui/MonitorNotifications.kt +++ b/app/src/main/java/eu/darken/capod/monitor/ui/MonitorNotifications.kt @@ -56,7 +56,7 @@ class MonitorNotifications @Inject constructor( fun getBuilder(device: PodDevice?): NotificationCompat.Builder { if (device == null) { - builder.setContentTitle(context.getString(R.string.device_none_label)) + builder.setContentTitle(context.getString(R.string.pods_none_label_short)) builder.setSmallIcon(R.drawable.ic_device_generic_earbuds) return builder } diff --git a/app/src/main/java/eu/darken/capod/pods/core/apple/UnknownAppleDevice.kt b/app/src/main/java/eu/darken/capod/pods/core/apple/UnknownAppleDevice.kt index 88b884fa..10d1ea80 100644 --- a/app/src/main/java/eu/darken/capod/pods/core/apple/UnknownAppleDevice.kt +++ b/app/src/main/java/eu/darken/capod/pods/core/apple/UnknownAppleDevice.kt @@ -15,10 +15,10 @@ data class UnknownAppleDevice( ) : ApplePods { override fun getLabel(context: Context): String { - return context.getString(R.string.device_unknown_label) + return context.getString(R.string.pods_unknown_label) } override fun getShortStatus(context: Context): String { - return context.getString(R.string.device_unknown_label) + return context.getString(R.string.pods_unknown_label) } } \ No newline at end of file diff --git a/app/src/main/res/layout/overview_nopaireddevice_item.xml b/app/src/main/res/layout/overview_nopaireddevice_item.xml new file mode 100644 index 00000000..94c69ca2 --- /dev/null +++ b/app/src/main/res/layout/overview_nopaireddevice_item.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/main_permission_item.xml b/app/src/main/res/layout/overview_permission_item.xml similarity index 97% rename from app/src/main/res/layout/main_permission_item.xml rename to app/src/main/res/layout/overview_permission_item.xml index af8d37c7..6b3486e0 100644 --- a/app/src/main/res/layout/main_permission_item.xml +++ b/app/src/main/res/layout/overview_permission_item.xml @@ -57,7 +57,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="8dp" android:layout_marginTop="16dp" - android:text="Grant permission" + android:text="@string/general_grant_permission_action" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/permission_description" /> diff --git a/app/src/main/res/layout/overview_pods_unknown_item.xml b/app/src/main/res/layout/overview_pods_unknown_item.xml index 20cc4193..dff0b881 100644 --- a/app/src/main/res/layout/overview_pods_unknown_item.xml +++ b/app/src/main/res/layout/overview_pods_unknown_item.xml @@ -26,7 +26,7 @@ app:layout_constraintEnd_toStartOf="@id/reception" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:text="Apple AirPods Max" /> + tools:text="Unknown device" /> + + + app:layout_constraintTop_toBottomOf="@id/contact_dev_hint" /> Unknown Thank you N/A + Grant permission Size Compressed size @@ -31,12 +32,14 @@ Disable battery optimizations Battery optimizations can prevent CAPod from receiving Bluetooth data while the app is in the background. + Headphones: %1$s + Headphones Left pod Right pod + L %1$s | C %2$s | R %3$s Case Open Closed - Raw data Reception %s White Yellow @@ -57,6 +60,12 @@ In call mode Ringing Hanging up + Raw data + Unknown device + This is an unknown device, but it is using Apple\'s message format. Let\'s add support for it, contact me :). + No device + No paired device connected. + Connect a paired device or enable the \'Show all\' option. Settings Privacy policy @@ -82,9 +91,6 @@ Note that I can only respond in german or english. Automatic bug reports Automatically reports issues, e.g. details on an app crash so I can figure out how to fix it. - Unknown device - No device - Headphones Debug mode Show additional information to troubleshoot issues. Monitor mode @@ -103,8 +109,6 @@ Show other people\'s devices that are near you. Auto play Start music playback music when wearing the device (if supported). - L %1$s | C %2$s | R %3$s - Headphones: %1$s Fake data Show fake data, i.e. simulate device that don\'t exist. Debug settings