From 71aaba1b860d7f7c672774d9868be269735e1080 Mon Sep 17 00:00:00 2001 From: Matthias Urhahn Date: Fri, 3 Feb 2023 22:31:23 +0100 Subject: [PATCH] Fix data display for non dual apple pods (#98) * Fix data display for fake pods and beats devices (with two pods) * Rename methods --- .../capod/common/bluetooth/FakeBleData.kt | 28 +++++-------------- .../ui/MonitorNotificationViewFactory.kt | 23 +++++++++------ .../reaction/ui/popup/PopUpPodViewFactory.kt | 20 +++++++------ .../monitor_notification_dual_pods_small.xml | 1 + 4 files changed, 33 insertions(+), 39 deletions(-) diff --git a/app-common/src/main/java/eu/darken/capod/common/bluetooth/FakeBleData.kt b/app-common/src/main/java/eu/darken/capod/common/bluetooth/FakeBleData.kt index c9b8b704..96e9b712 100644 --- a/app-common/src/main/java/eu/darken/capod/common/bluetooth/FakeBleData.kt +++ b/app-common/src/main/java/eu/darken/capod/common/bluetooth/FakeBleData.kt @@ -27,9 +27,7 @@ class FakeBleData @Inject constructor( generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 100, manufacturerSpecificData = mapOf(76 to "07 19 01 02 20 75 AA B6 31 00 05 9C 5A A4 5D C0 2C A0 B4 6F B9 ED 8E CE 03 97 CA".hexToByteArray()) ).run { - if (Random.nextBoolean()) { - fakeDevices.add(this) - } + fakeDevices.add(this) } // AirPods Gen2 @@ -40,9 +38,7 @@ class FakeBleData @Inject constructor( generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 100, manufacturerSpecificData = mapOf(76 to "07 19 01 0F 20 75 AA B6 31 00 05 9C 5A A4 5D C0 2C A0 B4 6F B9 ED 8E CE 03 97 CA".hexToByteArray()) ).run { - if (Random.nextBoolean()) { - fakeDevices.add(this) - } + fakeDevices.add(this) } // AirPods Gen3 @@ -53,9 +49,7 @@ class FakeBleData @Inject constructor( generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 200, manufacturerSpecificData = mapOf(76 to "07 19 01 13 20 55 AF 56 31 00 06 6F E4 DF 10 AF 10 60 81 03 3B 76 D9 C7 11 22 88".hexToByteArray()) ).run { - if (Random.nextBoolean()) { - fakeDevices.add(this) - } + fakeDevices.add(this) } // AirPods Max BleScanResult( @@ -65,9 +59,7 @@ class FakeBleData @Inject constructor( generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 300, manufacturerSpecificData = mapOf(76 to "07 19 01 0A 20 02 05 80 04 0F 44 A7 60 9B F8 3C FD B1 D8 1C 61 EA 82 60 A3 2C 4E".hexToByteArray()) ).run { - if (Random.nextBoolean()) { - fakeDevices.add(this) - } + fakeDevices.add(this) } // BeatsFlex BleScanResult( @@ -77,9 +69,7 @@ class FakeBleData @Inject constructor( generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 400, manufacturerSpecificData = mapOf(76 to "07 19 01 10 20 0A F4 8F 00 01 00 C4 71 9F 9C EF A2 E3 BA 66 FE 1D 45 9F C9 2F A0".hexToByteArray()) ).run { - if (Random.nextBoolean()) { - fakeDevices.add(this) - } + fakeDevices.add(this) } // Tws i99999 @@ -90,9 +80,7 @@ class FakeBleData @Inject constructor( generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 400, manufacturerSpecificData = mapOf(76 to "07 13 01 02 20 71 AA 37 32 00 10 00 64 64 FF 00 00 00 00 00 00".hexToByteArray()) ).run { - if (Random.nextBoolean()) { - fakeDevices.add(this) - } + fakeDevices.add(this) } // Unknown Device @@ -103,9 +91,7 @@ class FakeBleData @Inject constructor( generatedAtNanos = SystemClockWrap.elapsedRealtimeNanos + 500, manufacturerSpecificData = mapOf(76 to "07 19 01 FF 20 0A F4 8F 00 01 00 C4 71 9F 9C EF A2 E3 BA 66 FE 1D 45 9F C9 2F A0".hexToByteArray()) ).run { - if (Random.nextBoolean()) { - fakeDevices.add(this) - } + fakeDevices.add(this) } return fakeDevices diff --git a/app/src/main/java/eu/darken/capod/monitor/ui/MonitorNotificationViewFactory.kt b/app/src/main/java/eu/darken/capod/monitor/ui/MonitorNotificationViewFactory.kt index e63f570f..a2be77cf 100644 --- a/app/src/main/java/eu/darken/capod/monitor/ui/MonitorNotificationViewFactory.kt +++ b/app/src/main/java/eu/darken/capod/monitor/ui/MonitorNotificationViewFactory.kt @@ -6,8 +6,6 @@ import android.widget.RemoteViews import dagger.hilt.android.qualifiers.ApplicationContext import eu.darken.capod.R import eu.darken.capod.pods.core.* -import eu.darken.capod.pods.core.apple.DualApplePods -import eu.darken.capod.pods.core.apple.SingleApplePods import javax.inject.Inject @@ -16,12 +14,12 @@ class MonitorNotificationViewFactory @Inject constructor( ) { fun createContentView(device: PodDevice): RemoteViews = when (device) { - is DualApplePods -> createDualApplePods(device) - is SingleApplePods -> createSingleApplePods(device) + is DualPodDevice -> createDualPods(device) + is SinglePodDevice -> createSinglePod(device) else -> createUnknownDevice(device) } - private fun createDualApplePods(device: DualApplePods): RemoteViews = RemoteViews( + private fun createDualPods(device: DualPodDevice): RemoteViews = RemoteViews( context.packageName, R.layout.monitor_notification_dual_pods_small ).apply { @@ -29,23 +27,30 @@ class MonitorNotificationViewFactory @Inject constructor( // Left setImageViewResource(R.id.pod_left_icon, device.leftPodIcon) setTextViewText(R.id.pod_left_label, getBatteryLevelLeftPod(context)) + val isLeftPodCharging = (device as? HasChargeDetectionDual)?.isLeftPodCharging ?: false setViewVisibility(R.id.pod_left_charging, if (isLeftPodCharging) View.VISIBLE else View.GONE) + val isLeftPodInEar = (device as? HasEarDetectionDual)?.isLeftPodInEar ?: false setViewVisibility(R.id.pod_left_ear, if (isLeftPodInEar) View.VISIBLE else View.GONE) // Case - setImageViewResource(R.id.pod_case_icon, device.caseIcon) - setTextViewText(R.id.pod_case_label, getBatteryLevelCase(context)) - setViewVisibility(R.id.pod_case_charging, if (isCaseCharging) View.VISIBLE else View.GONE) + setViewVisibility(R.id.pod_case_charging, if (device is HasCase) View.VISIBLE else View.GONE) + (device as? HasCase)?.let { case -> + setImageViewResource(R.id.pod_case_icon, device.caseIcon) + setTextViewText(R.id.pod_case_label, case.getBatteryLevelCase(context)) + setViewVisibility(R.id.pod_case_charging, if (case.isCaseCharging) View.VISIBLE else View.GONE) + } // Right setImageViewResource(R.id.pod_right_icon, device.rightPodIcon) setTextViewText(R.id.pod_right_label, getBatteryLevelRightPod(context)) + val isRightPodCharging = (device as? HasChargeDetectionDual)?.isRightPodCharging ?: false setViewVisibility(R.id.pod_right_charging, if (isRightPodCharging) View.VISIBLE else View.GONE) + val isRightPodInEar = (device as? HasEarDetectionDual)?.isRightPodInEar ?: false setViewVisibility(R.id.pod_right_ear, if (isRightPodInEar) View.VISIBLE else View.GONE) } } - private fun createSingleApplePods(device: SingleApplePods): RemoteViews = RemoteViews( + private fun createSinglePod(device: SinglePodDevice): RemoteViews = RemoteViews( context.packageName, R.layout.monitor_notification_single_pods_small ).apply { diff --git a/app/src/main/java/eu/darken/capod/reaction/ui/popup/PopUpPodViewFactory.kt b/app/src/main/java/eu/darken/capod/reaction/ui/popup/PopUpPodViewFactory.kt index 53805d0c..c503877e 100644 --- a/app/src/main/java/eu/darken/capod/reaction/ui/popup/PopUpPodViewFactory.kt +++ b/app/src/main/java/eu/darken/capod/reaction/ui/popup/PopUpPodViewFactory.kt @@ -6,14 +6,13 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.view.ContextThemeWrapper import androidx.core.view.isInvisible +import androidx.core.view.isVisible import dagger.hilt.android.qualifiers.ApplicationContext import eu.darken.capod.R import eu.darken.capod.common.debug.DebugSettings import eu.darken.capod.databinding.PopupNotificationDualPodsBinding import eu.darken.capod.databinding.PopupNotificationSinglePodsBinding import eu.darken.capod.pods.core.* -import eu.darken.capod.pods.core.apple.DualApplePods -import eu.darken.capod.pods.core.apple.SingleApplePods import javax.inject.Inject @@ -26,13 +25,13 @@ class PopUpPodViewFactory @Inject constructor( private val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater fun createContentView(parent: ViewGroup, device: PodDevice): View = when (device) { - is DualApplePods -> createDualApplePods(parent, device) + is DualPodDevice -> createDualPods(parent, device) // Unused, has no case to trigger reaction? - is SingleApplePods -> createSingleApplePods(parent, device) + is SinglePodDevice -> createSinglePod(parent, device) else -> throw IllegalArgumentException("Unexpected device: $device") } - private fun createDualApplePods(parent: ViewGroup, device: DualApplePods): View = + private fun createDualPods(parent: ViewGroup, device: DualPodDevice): View = PopupNotificationDualPodsBinding.inflate(layoutInflater, parent, false).apply { device.apply { podIcon.setImageResource(iconRes) @@ -46,9 +45,12 @@ class PopUpPodViewFactory @Inject constructor( podLeftBatteryLabel.text = getBatteryLevelLeftPod(context) // Case - podCaseIcon.setImageResource(device.caseIcon) - podCaseBatteryIcon.setImageResource(getBatteryDrawable(batteryCasePercent)) - podCaseBatteryLabel.text = getBatteryLevelCase(context) + podCaseContainer.isVisible = device is HasCase + (device as? HasCase)?.let { case -> + podCaseIcon.setImageResource(case.caseIcon) + podCaseBatteryIcon.setImageResource(getBatteryDrawable(case.batteryCasePercent)) + podCaseBatteryLabel.text = case.getBatteryLevelCase(context) + } // Right podRightIcon.setImageResource(device.rightPodIcon) @@ -57,7 +59,7 @@ class PopUpPodViewFactory @Inject constructor( } }.root - private fun createSingleApplePods(parent: ViewGroup, device: SingleApplePods): View = + private fun createSinglePod(parent: ViewGroup, device: SinglePodDevice): View = PopupNotificationSinglePodsBinding.inflate(layoutInflater, parent, false).apply { device.apply { headphonesIcon.setImageResource(iconRes) diff --git a/app/src/main/res/layout/monitor_notification_dual_pods_small.xml b/app/src/main/res/layout/monitor_notification_dual_pods_small.xml index 218fd529..316110f6 100644 --- a/app/src/main/res/layout/monitor_notification_dual_pods_small.xml +++ b/app/src/main/res/layout/monitor_notification_dual_pods_small.xml @@ -57,6 +57,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_vertical" + android:id="@+id/pod_case_container" android:orientation="horizontal">