@@ -71,6 +71,8 @@ public final class SystemEventsBreadcrumbsIntegration implements Integration, Cl
7171 private volatile boolean isStopped = false ;
7272 private volatile IntentFilter filter = null ;
7373 private final @ NotNull AutoClosableReentrantLock receiverLock = new AutoClosableReentrantLock ();
74+ // Track previous battery state to avoid duplicate breadcrumbs when values haven't changed
75+ private @ Nullable BatteryState previousBatteryState ;
7476
7577 public SystemEventsBreadcrumbsIntegration (final @ NotNull Context context ) {
7678 this (context , getDefaultActionsInternal ());
@@ -331,51 +333,14 @@ public void onStop(@NonNull LifecycleOwner owner) {
331333 }
332334 }
333335
334- static final class SystemEventsBroadcastReceiver extends BroadcastReceiver {
336+ final class SystemEventsBroadcastReceiver extends BroadcastReceiver {
335337
336338 private static final long DEBOUNCE_WAIT_TIME_MS = 60 * 1000 ;
337339 private final @ NotNull IScopes scopes ;
338340 private final @ NotNull SentryAndroidOptions options ;
339341 private final @ NotNull Debouncer batteryChangedDebouncer =
340342 new Debouncer (AndroidCurrentDateProvider .getInstance (), DEBOUNCE_WAIT_TIME_MS , 0 );
341343
342- // Track previous battery state to avoid duplicate breadcrumbs when values haven't changed
343- private @ Nullable BatteryState previousBatteryState ;
344-
345- static final class BatteryState {
346- private final @ Nullable Float level ;
347- private final @ Nullable Boolean charging ;
348-
349- BatteryState (final @ Nullable Float level , final @ Nullable Boolean charging ) {
350- this .level = level ;
351- this .charging = charging ;
352- }
353-
354- @ Override
355- public boolean equals (final @ Nullable Object other ) {
356- if (!(other instanceof BatteryState )) return false ;
357- BatteryState that = (BatteryState ) other ;
358- return isSimilarLevel (level , that .level ) && Objects .equals (charging , that .charging );
359- }
360-
361- @ Override
362- public int hashCode () {
363- // Use rounded level for hash consistency
364- Float roundedLevel = level != null ? Math .round (level * 100f ) / 100f : null ;
365- return Objects .hash (roundedLevel , charging );
366- }
367-
368- private boolean isSimilarLevel (final @ Nullable Float level1 , final @ Nullable Float level2 ) {
369- if (level1 == null && level2 == null ) return true ;
370- if (level1 == null || level2 == null ) return false ;
371-
372- // Round both levels to 2 decimal places and compare
373- float rounded1 = Math .round (level1 * 100f ) / 100f ;
374- float rounded2 = Math .round (level2 * 100f ) / 100f ;
375- return rounded1 == rounded2 ;
376- }
377- }
378-
379344 SystemEventsBroadcastReceiver (
380345 final @ NotNull IScopes scopes , final @ NotNull SentryAndroidOptions options ) {
381346 this .scopes = scopes ;
@@ -395,7 +360,9 @@ public void onReceive(final Context context, final @NotNull Intent intent) {
395360 }
396361
397362 // For battery changes, check if the actual values have changed
398- final @ Nullable Float currentBatteryLevel = DeviceInfoUtil .getBatteryLevel (intent , options );
363+ final @ Nullable Float batteryLevel = DeviceInfoUtil .getBatteryLevel (intent , options );
364+ final @ Nullable Integer currentBatteryLevel =
365+ batteryLevel != null ? batteryLevel .intValue () : null ;
399366 final @ Nullable Boolean currentChargingState = DeviceInfoUtil .isCharging (intent , options );
400367 batteryState = new BatteryState (currentBatteryLevel , currentChargingState );
401368
@@ -508,4 +475,26 @@ String getStringAfterDotFast(final @Nullable String str) {
508475 return breadcrumb ;
509476 }
510477 }
478+
479+ static final class BatteryState {
480+ private final @ Nullable Integer level ;
481+ private final @ Nullable Boolean charging ;
482+
483+ BatteryState (final @ Nullable Integer level , final @ Nullable Boolean charging ) {
484+ this .level = level ;
485+ this .charging = charging ;
486+ }
487+
488+ @ Override
489+ public boolean equals (final @ Nullable Object other ) {
490+ if (!(other instanceof BatteryState )) return false ;
491+ BatteryState that = (BatteryState ) other ;
492+ return Objects .equals (level , that .level ) && Objects .equals (charging , that .charging );
493+ }
494+
495+ @ Override
496+ public int hashCode () {
497+ return Objects .hash (level , charging );
498+ }
499+ }
511500}
0 commit comments