Improve notification layouts

This commit is contained in:
darken
2022-01-23 20:52:39 +01:00
parent 6cd799130e
commit 57cd823b63
9 changed files with 167 additions and 71 deletions
@@ -7,6 +7,7 @@ import eu.darken.capod.R
import eu.darken.capod.common.lists.binding
import eu.darken.capod.databinding.OverviewPodsAppleSingleBasicItemBinding
import eu.darken.capod.pods.core.apple.BasicSingleApplePods
import eu.darken.capod.pods.core.getBatteryDrawable
import eu.darken.capod.pods.core.getBatteryLevelHeadset
import eu.darken.capod.pods.core.getSignalQuality
import eu.darken.capod.pods.core.lastSeenFormatted
@@ -1,10 +1,8 @@
package eu.darken.capod.main.ui.overview.cards.pods
import android.view.ViewGroup
import androidx.annotation.DrawableRes
import androidx.annotation.LayoutRes
import androidx.viewbinding.ViewBinding
import eu.darken.capod.R
import eu.darken.capod.common.lists.BindableVH
import eu.darken.capod.common.lists.differ.DifferItem
import eu.darken.capod.common.lists.modular.ModularAdapter
@@ -17,19 +15,6 @@ abstract class PodDeviceVH<D : PodDeviceVH.Item, B : ViewBinding>(
parent: ViewGroup
) : ModularAdapter.VH(layoutId, parent), BindableVH<D, B> {
@DrawableRes
fun getBatteryDrawable(percent: Float?): Int = when {
percent == null -> R.drawable.ic_baseline_battery_unknown_24
percent > 0.95f -> R.drawable.ic_baseline_battery_full_24
percent > 0.80f -> R.drawable.ic_baseline_battery_6_bar_24
percent > 0.65f -> R.drawable.ic_baseline_battery_5_bar_24
percent > 0.50f -> R.drawable.ic_baseline_battery_4_bar_24
percent > 0.35f -> R.drawable.ic_baseline_battery_3_bar_24
percent > 0.20f -> R.drawable.ic_baseline_battery_2_bar_24
percent > 0.05f -> R.drawable.ic_baseline_battery_1_bar_24
else -> R.drawable.ic_baseline_battery_0_bar_24
}
interface Item : OverviewAdapter.Item {
val now: Instant
@@ -8,6 +8,7 @@ import eu.darken.capod.R
import eu.darken.capod.common.lists.binding
import eu.darken.capod.databinding.OverviewPodsAppleSingleItemBinding
import eu.darken.capod.pods.core.apple.SingleApplePods
import eu.darken.capod.pods.core.getBatteryDrawable
import eu.darken.capod.pods.core.getBatteryLevelHeadset
import eu.darken.capod.pods.core.getSignalQuality
import eu.darken.capod.pods.core.lastSeenFormatted
@@ -1,6 +1,7 @@
package eu.darken.capod.monitor.ui
import android.content.Context
import android.view.View
import android.widget.RemoteViews
import dagger.hilt.android.qualifiers.ApplicationContext
import eu.darken.capod.R
@@ -26,38 +27,45 @@ class MonitorNotificationViewFactory @Inject constructor(
context.packageName,
R.layout.monitor_notification_dual_pods_small
).apply {
device.getBatteryLevelLeftPod(context)
.let { if (device.isLeftPodCharging) "$it" else it }
.run { setTextViewText(R.id.pod_left, this) }
device.apply {
// Left
setTextViewText(R.id.pod_left_label, getBatteryLevelLeftPod(context))
setViewVisibility(R.id.pod_left_charging, if (isLeftPodCharging) View.VISIBLE else View.GONE)
setViewVisibility(R.id.pod_left_ear, if (isLeftPodInEar) View.VISIBLE else View.GONE)
device.getBatteryLevelCase(context)
.let { if (device.isCaseCharging) "$it" else it }
.run { setTextViewText(R.id.pod_case, this) }
// Case
setTextViewText(R.id.pod_case_label, getBatteryLevelCase(context))
setViewVisibility(R.id.pod_case_charging, if (isCaseCharging) View.VISIBLE else View.GONE)
device.getBatteryLevelRightPod(context)
.let { if (device.isRightPodCharging) "$it" else it }
.run { setTextViewText(R.id.pod_right, this) }
// Right
setTextViewText(R.id.pod_right_label, getBatteryLevelRightPod(context))
setViewVisibility(R.id.pod_right_charging, if (isRightPodCharging) View.VISIBLE else View.GONE)
setViewVisibility(R.id.pod_right_ear, if (isRightPodInEar) View.VISIBLE else View.GONE)
}
}
private fun createSingleApplePods(device: SingleApplePods): RemoteViews = RemoteViews(
context.packageName,
R.layout.monitor_notification_single_pods_small
).apply {
setTextViewText(R.id.headphones_label, device.getLabel(context))
device.getBatteryLevelHeadset(context)
.let { if (!device.isHeadsetBeingCharged) "$it" else it }
.run { setTextViewText(R.id.headphones, this) }
device.apply {
setTextViewText(R.id.headphones_label, getLabel(context))
setImageViewResource(R.id.headphones_battery_icon, getBatteryDrawable(batteryHeadsetPercent))
setTextViewText(R.id.headphones_battery_label, getBatteryLevelHeadset(context))
setViewVisibility(R.id.headphones_charging, if (isHeadsetBeingCharged) View.VISIBLE else View.GONE)
setViewVisibility(R.id.headphones_worn, if (isHeadphonesBeingWorn) View.VISIBLE else View.GONE)
}
}
private fun createSingleBasicApplePods(device: BasicSingleApplePods): RemoteViews = RemoteViews(
context.packageName,
R.layout.monitor_notification_single_pods_basic_small
).apply {
setTextViewText(R.id.headphones_label, device.getLabel(context))
device.getBatteryLevelHeadset(context)
.run { setTextViewText(R.id.headphones, this) }
device.apply {
setTextViewText(R.id.headphones_label, getLabel(context))
setImageViewResource(R.id.headphones_battery_icon, getBatteryDrawable(batteryHeadsetPercent))
setTextViewText(R.id.headphones_battery_label, getBatteryLevelHeadset(context))
}
}
private fun createUnknownDevice(device: PodDevice): RemoteViews = RemoteViews(
@@ -2,6 +2,7 @@ package eu.darken.capod.pods.core
import android.content.Context
import android.icu.text.RelativeDateTimeFormatter
import androidx.annotation.DrawableRes
import eu.darken.capod.R
import java.time.Duration
import java.time.Instant
@@ -28,6 +29,19 @@ fun PodDevice.getSignalQuality(context: Context): String {
return "~${percentage.roundToInt()}%"
}
@DrawableRes
fun getBatteryDrawable(percent: Float?): Int = when {
percent == null -> R.drawable.ic_baseline_battery_unknown_24
percent > 0.95f -> R.drawable.ic_baseline_battery_full_24
percent > 0.80f -> R.drawable.ic_baseline_battery_6_bar_24
percent > 0.65f -> R.drawable.ic_baseline_battery_5_bar_24
percent > 0.50f -> R.drawable.ic_baseline_battery_4_bar_24
percent > 0.35f -> R.drawable.ic_baseline_battery_3_bar_24
percent > 0.20f -> R.drawable.ic_baseline_battery_2_bar_24
percent > 0.05f -> R.drawable.ic_baseline_battery_1_bar_24
else -> R.drawable.ic_baseline_battery_0_bar_24
}
private val lastSeenFormatter = RelativeDateTimeFormatter.getInstance()
fun PodDevice.lastSeenFormatted(now: Instant): String {
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:layout_marginHorizontal="8dp"
android:orientation="horizontal">
@@ -11,43 +11,97 @@
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:id="@+id/pod_left"
style="@style/TextAppearance.Compat.Notification.Title"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableStart="@drawable/ic_airpod_left_24"
tools:text="100%" />
android:orientation="horizontal">
<ImageView
android:id="@+id/pod_left_icon"
style="@style/MiniTextIcon"
android:src="@drawable/ic_airpod_left_24" />
<TextView
android:id="@+id/pod_left_label"
style="@style/TextAppearance.Compat.Notification.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="100%" />
<ImageView
android:id="@+id/pod_left_charging"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_power_24" />
<ImageView
android:id="@+id/pod_left_ear"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_hearing_24" />
</LinearLayout>
<FrameLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:id="@+id/pod_case"
style="@style/TextAppearance.Compat.Notification.Title"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="8dp"
android:drawableStart="@drawable/ic_airpod_case_24"
tools:text="100%" />
android:orientation="horizontal">
<ImageView
android:id="@+id/pod_case_icon"
style="@style/MiniTextIcon"
android:src="@drawable/ic_airpod_case_24" />
<TextView
android:id="@+id/pod_case_label"
style="@style/TextAppearance.Compat.Notification.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="100%" />
<ImageView
android:id="@+id/pod_case_charging"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_power_24" />
</LinearLayout>
<FrameLayout
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:id="@+id/pod_right"
style="@style/TextAppearance.Compat.Notification.Title"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:drawableStart="@drawable/ic_airpod_right_24"
tools:text="100%" />
android:orientation="horizontal">
<ImageView
android:id="@+id/pod_right_icon"
style="@style/MiniTextIcon"
android:src="@drawable/ic_airpod_right_24" />
<TextView
android:id="@+id/pod_right_label"
style="@style/TextAppearance.Compat.Notification.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="100%" />
<ImageView
android:id="@+id/pod_right_charging"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_power_24" />
<ImageView
android:id="@+id/pod_right_ear"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_hearing_24" />
</LinearLayout>
<FrameLayout
android:layout_width="0dp"
@@ -2,7 +2,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<TextView
android:id="@+id/headphones_label"
@@ -10,16 +11,27 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
tools:text="AirPods Max" />
tools:text="Beats Solo 3" />
<TextView
android:id="@+id/headphones"
style="@style/TextAppearance.Compat.Notification.Title"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:drawableStart="@drawable/ic_device_generic_headphones"
android:gravity="center"
tools:text="100%" />
android:layout_marginHorizontal="8dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/headphones_battery_icon"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_battery_unknown_24" />
<TextView
android:id="@+id/headphones_battery_label"
style="@style/TextAppearance.Compat.Notification.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="8dp"
tools:text="100%" />
</LinearLayout>
</LinearLayout>
@@ -2,7 +2,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:gravity="center_horizontal">
<TextView
android:id="@+id/headphones_label"
@@ -12,14 +13,35 @@
android:gravity="center"
tools:text="AirPods Max" />
<TextView
android:id="@+id/headphones"
style="@style/TextAppearance.Compat.Notification.Title"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:drawableStart="@drawable/ic_device_generic_headphones"
android:gravity="center"
tools:text="100%" />
android:layout_marginHorizontal="8dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/headphones_battery_icon"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_battery_unknown_24" />
<TextView
android:id="@+id/headphones_battery_label"
style="@style/TextAppearance.Compat.Notification.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginHorizontal="8dp"
tools:text="100%" />
<ImageView
android:id="@+id/headphones_charging"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_power_24" />
<ImageView
android:id="@+id/headphones_worn"
style="@style/MiniTextIcon"
android:src="@drawable/ic_baseline_hearing_24" />
</LinearLayout>
</LinearLayout>
-1
View File
@@ -10,6 +10,5 @@
<style name="MiniTextIcon">
<item name="android:layout_height">20dp</item>
<item name="android:layout_width">20dp</item>
<item name="android:layout_marginEnd">8dp</item>
</style>
</resources>