Skip to content

Commit c0de10f

Browse files
committed
RUM-11120: Additional tests for isRtlEnabled
1 parent 7153c75 commit c0de10f

File tree

7 files changed

+88
-84
lines changed

7 files changed

+88
-84
lines changed

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/accessibility/DefaultAccessibilityReader.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,11 @@ internal class DefaultAccessibilityReader(
149149
}
150150

151151
private fun isDisplayInversionEnabled(): Boolean? {
152-
return getSecureInt(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED)
152+
return isSettingEnabled(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED)
153153
}
154154

155155
private fun isClosedCaptioningEnabled(): Boolean? {
156-
return getSecureInt(CAPTIONING_ENABLED_KEY)
156+
return isSettingEnabled(CAPTIONING_ENABLED_KEY)
157157
}
158158

159159
private fun isLockToScreenEnabled(): Boolean? {
@@ -177,12 +177,14 @@ internal class DefaultAccessibilityReader(
177177
}
178178
}
179179

180-
private fun getSecureInt(key: String): Boolean? {
180+
private fun isSettingEnabled(key: String): Boolean? {
181181
return secureWrapper.getInt(
182182
internalLogger = internalLogger,
183183
applicationContext = applicationContext,
184184
key = key
185-
)
185+
)?.let {
186+
it == 1
187+
}
186188
}
187189

188190
private fun getTextSize(): String {

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/accessibility/DefaultAccessibilitySnapshotManager.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ internal class DefaultAccessibilitySnapshotManager(
1818
override fun latestSnapshot(): AccessibilityInfo {
1919
val newAccessibilitySnapshot = accessibilityReader.getState()
2020

21-
// Create delta by comparing new snapshot to last snapshot
22-
// Only include properties that have changed (null for unchanged properties)
2321
val deltaSnapshot = AccessibilityInfo(
2422
textSize =
2523
if (newAccessibilitySnapshot.textSize != lastSnapshot.textSize) {
@@ -71,7 +69,6 @@ internal class DefaultAccessibilitySnapshotManager(
7169
}
7270
)
7371

74-
// Update last snapshot for future comparisons
7572
lastSnapshot = newAccessibilitySnapshot
7673

7774
return deltaSnapshot

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/accessibility/GlobalWrapper.kt

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import android.provider.Settings.SettingNotFoundException
1212
import com.datadog.android.api.InternalLogger
1313

1414
internal class GlobalWrapper {
15-
@Suppress("TooGenericExceptionCaught", "UnsafeThirdPartyFunctionCall") // exceptions caught
15+
@Suppress("UnsafeThirdPartyFunctionCall")
1616
internal fun getFloat(
1717
internalLogger: InternalLogger,
1818
applicationContext: Context,
@@ -31,22 +31,6 @@ internal class GlobalWrapper {
3131
e
3232
)
3333
null
34-
} catch (e: NumberFormatException) {
35-
internalLogger.log(
36-
InternalLogger.Level.ERROR,
37-
listOf(InternalLogger.Target.MAINTAINER),
38-
{ "Number format exception getting $key" },
39-
e
40-
)
41-
null
42-
} catch (e: RuntimeException) {
43-
internalLogger.log(
44-
InternalLogger.Level.ERROR,
45-
listOf(InternalLogger.Target.MAINTAINER),
46-
{ "Runtime exception getting $key" },
47-
e
48-
)
49-
null
5034
}
5135
}
5236
}

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/accessibility/SecureWrapper.kt

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,42 +12,35 @@ import android.provider.Settings.SettingNotFoundException
1212
import com.datadog.android.api.InternalLogger
1313

1414
internal class SecureWrapper {
15-
@Suppress("TooGenericExceptionCaught", "UnsafeThirdPartyFunctionCall") // exceptions caught
15+
@Suppress("UnsafeThirdPartyFunctionCall")
1616
internal fun getInt(
1717
internalLogger: InternalLogger,
1818
applicationContext: Context,
1919
key: String
20-
): Boolean? {
20+
): Int? {
21+
// returns -1 if unable to retrieve the key
2122
return try {
2223
Settings.Secure.getInt(
2324
applicationContext.contentResolver,
2425
key,
25-
0
26-
) != 0
26+
-1
27+
)
2728
} catch (e: SettingNotFoundException) {
2829
internalLogger.log(
2930
InternalLogger.Level.ERROR,
3031
listOf(InternalLogger.Target.MAINTAINER),
3132
{ "Setting cannot be found $key" },
3233
e
3334
)
34-
null
35+
-1
3536
} catch (e: SecurityException) {
3637
internalLogger.log(
3738
InternalLogger.Level.ERROR,
3839
listOf(InternalLogger.Target.MAINTAINER),
3940
{ "Security exception accessing $key" },
4041
e
4142
)
42-
null
43-
} catch (e: RuntimeException) {
44-
internalLogger.log(
45-
InternalLogger.Level.ERROR,
46-
listOf(InternalLogger.Target.MAINTAINER),
47-
{ "Runtime exception $key" },
48-
e
49-
)
50-
null
43+
-1
5144
}
5245
}
5346
}

features/dd-sdk-android-rum/src/main/kotlin/com/datadog/android/rum/internal/domain/battery/DefaultBatteryInfoProvider.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ internal class DefaultBatteryInfoProvider(
125125

126126
private companion object {
127127
const val FULL_BATTERY_PCT = 100f
128-
const val DECIMAL_SCALING = 10f
129128
const val BATTERY_POLL_INTERVAL_MS = 60_000 // 60 seconds
130129
}
131130
}

features/dd-sdk-android-rum/src/test/kotlin/com/datadog/android/rum/internal/domain/accessibility/DefaultAccessibilityReaderTest.kt

Lines changed: 67 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import android.os.Build
1616
import android.os.Handler
1717
import android.provider.Settings
1818
import android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED
19+
import android.view.View
1920
import android.view.accessibility.AccessibilityManager
2021
import android.view.accessibility.AccessibilityManager.TouchExplorationStateChangeListener
2122
import com.datadog.android.api.InternalLogger
@@ -173,6 +174,7 @@ internal class DefaultAccessibilityReaderTest {
173174
assertThat(result.isScreenPinningEnabled).isFalse()
174175
assertThat(result.isColorInversionEnabled).isNull()
175176
assertThat(result.textSize).isEqualTo("1.0")
177+
assertThat(result.isRtlEnabled).isFalse()
176178
}
177179

178180
@Test
@@ -182,7 +184,8 @@ internal class DefaultAccessibilityReaderTest {
182184
@BoolForgery isColorInversionEnabled: Boolean,
183185
@BoolForgery isClosedCaptioningEnabled: Boolean,
184186
@BoolForgery isReducedAnimationsEnabled: Boolean,
185-
@BoolForgery isScreenPinningEnabled: Boolean
187+
@BoolForgery isScreenPinningEnabled: Boolean,
188+
@BoolForgery isRtlEnabled: Boolean
186189
) {
187190
// Given
188191
mockConfiguration.fontScale = textSize
@@ -202,15 +205,18 @@ internal class DefaultAccessibilityReaderTest {
202205
applicationContext = any(),
203206
key = eq(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED)
204207
)
205-
) doReturn isColorInversionEnabled
208+
) doReturn if (isColorInversionEnabled) 1 else 0
206209

207210
whenever(
208211
mockSecureWrapper.getInt(
209212
internalLogger = any(),
210213
applicationContext = any(),
211214
key = eq(CAPTIONING_ENABLED_KEY)
212215
)
213-
) doReturn isClosedCaptioningEnabled
216+
) doReturn if (isClosedCaptioningEnabled) 1 else 0
217+
218+
whenever(mockConfiguration.layoutDirection) doReturn
219+
if (isRtlEnabled) View.LAYOUT_DIRECTION_RTL else View.LAYOUT_DIRECTION_LTR
214220

215221
val animationDurationValue = if (isReducedAnimationsEnabled) 0.0f else 1.0f
216222
whenever(
@@ -233,6 +239,7 @@ internal class DefaultAccessibilityReaderTest {
233239
assertThat(result.isColorInversionEnabled).isEqualTo(isColorInversionEnabled)
234240
assertThat(result.isClosedCaptioningEnabled).isEqualTo(isClosedCaptioningEnabled)
235241
assertThat(result.isReducedAnimationsEnabled).isEqualTo(isReducedAnimationsEnabled)
242+
assertThat(result.isRtlEnabled).isEqualTo(isRtlEnabled)
236243
}
237244

238245
// region Text Size Tests
@@ -252,9 +259,11 @@ internal class DefaultAccessibilityReaderTest {
252259
// Then
253260
assertThat(result.textSize).isEqualTo(fontScale.toString())
254261
}
262+
255263
// endregion
256264

257265
// region Screen Reader Tests
266+
258267
@Test
259268
fun `M return screen reader state W getState { touch exploration enabled }`() {
260269
// Given
@@ -268,9 +277,11 @@ internal class DefaultAccessibilityReaderTest {
268277
// Then
269278
assertThat(result.isScreenReaderEnabled as Boolean).isTrue()
270279
}
280+
271281
// endregion
272282

273283
// region Screen Pinning Tests
284+
274285
@TestTargetApi(Build.VERSION_CODES.LOLLIPOP)
275286
@Test
276287
fun `M return screen pinning state W getState { api below 23 }`(
@@ -355,9 +366,11 @@ internal class DefaultAccessibilityReaderTest {
355366
// Then
356367
assertThat(result.isScreenPinningEnabled).isNull()
357368
}
369+
358370
// endregion
359371

360372
// region Color Inversion Tests
373+
361374
@Test
362375
fun `M return color inversion state W getState { setting available }`(
363376
@BoolForgery isEnabled: Boolean
@@ -369,7 +382,7 @@ internal class DefaultAccessibilityReaderTest {
369382
applicationContext = mockContext,
370383
key = ACCESSIBILITY_DISPLAY_INVERSION_ENABLED
371384
)
372-
) doReturn isEnabled
385+
) doReturn if (isEnabled) 1 else 0
373386

374387
testedReader = createReader()
375388

@@ -397,9 +410,11 @@ internal class DefaultAccessibilityReaderTest {
397410
// Then
398411
assertThat(result.isColorInversionEnabled).isNull()
399412
}
413+
400414
// endregion
401415

402416
// region Closed Captioning Tests
417+
403418
@Test
404419
fun `M return closed captioning state W getState { setting available }`(
405420
@BoolForgery isEnabled: Boolean
@@ -411,7 +426,7 @@ internal class DefaultAccessibilityReaderTest {
411426
applicationContext = mockContext,
412427
key = CAPTIONING_ENABLED_KEY
413428
)
414-
) doReturn isEnabled
429+
) doReturn if (isEnabled) 1 else 0
415430

416431
testedReader = createReader()
417432

@@ -442,6 +457,7 @@ internal class DefaultAccessibilityReaderTest {
442457
// endregion
443458

444459
// region Reduced Animations Tests
460+
445461
@Test
446462
fun `M return true for reduced animations W getState { enabled }`() {
447463
// Given
@@ -456,8 +472,7 @@ internal class DefaultAccessibilityReaderTest {
456472
testedReader = createReader()
457473

458474
// When
459-
val result = testedReader.getState()
460-
val isReducedAnimations = result.isReducedAnimationsEnabled as Boolean
475+
val isReducedAnimations = testedReader.getState().isReducedAnimationsEnabled as Boolean
461476

462477
// Then
463478
assertThat(isReducedAnimations).isTrue()
@@ -477,8 +492,7 @@ internal class DefaultAccessibilityReaderTest {
477492
testedReader = createReader()
478493

479494
// When
480-
val result = testedReader.getState()
481-
val isReducedAnimations = result.isReducedAnimationsEnabled as Boolean
495+
val isReducedAnimations = testedReader.getState().isReducedAnimationsEnabled as Boolean
482496

483497
// Then
484498
assertThat(isReducedAnimations).isFalse()
@@ -503,6 +517,42 @@ internal class DefaultAccessibilityReaderTest {
503517
}
504518
// endregion
505519

520+
// region RTLEnabled Tests
521+
522+
@Test
523+
fun `M return true for isRtlEnabled W getState { enabled }`() {
524+
// Given
525+
whenever(
526+
mockConfiguration.layoutDirection
527+
) doReturn View.LAYOUT_DIRECTION_RTL
528+
529+
testedReader = createReader()
530+
531+
// When
532+
val isRtlEnabled = testedReader.getState().isRtlEnabled as Boolean
533+
534+
// Then
535+
assertThat(isRtlEnabled).isTrue()
536+
}
537+
538+
@Test
539+
fun `M return false for isRtlEnabled W getState { not enabled }`() {
540+
// Given
541+
whenever(
542+
mockConfiguration.layoutDirection
543+
) doReturn View.LAYOUT_DIRECTION_LTR
544+
545+
testedReader = createReader()
546+
547+
// When
548+
val isRtlEnabled = testedReader.getState().isRtlEnabled as Boolean
549+
550+
// Then
551+
assertThat(isRtlEnabled).isFalse()
552+
}
553+
554+
// endregion
555+
506556
// region ComponentCallbacks Tests
507557
@Test
508558
fun `M update text size W onConfigurationChanged { font scale changes }`(
@@ -623,6 +673,7 @@ internal class DefaultAccessibilityReaderTest {
623673
// endregion
624674

625675
// region Listener Tests
676+
626677
@Test
627678
fun `M update state W displayInversionListener onChange { display inversion changes }`() {
628679
// Given
@@ -632,7 +683,7 @@ internal class DefaultAccessibilityReaderTest {
632683
applicationContext = any(),
633684
key = eq(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED)
634685
)
635-
) doReturn true
686+
) doReturn 1
636687

637688
testedReader.getState()
638689

@@ -656,7 +707,7 @@ internal class DefaultAccessibilityReaderTest {
656707
applicationContext = any(),
657708
key = eq(CAPTIONING_ENABLED_KEY)
658709
)
659-
) doReturn true
710+
) doReturn 1
660711

661712
testedReader.getState()
662713

@@ -712,9 +763,11 @@ internal class DefaultAccessibilityReaderTest {
712763
val result = testedReader.getState()
713764
assertThat(result.isScreenReaderEnabled as Boolean).isTrue()
714765
}
766+
715767
// endregion
716768

717769
// region Polling Threshold Tests
770+
718771
@Test
719772
fun `M update lastPollTime W getState { after threshold exceeded }`() {
720773
// Given
@@ -750,7 +803,7 @@ internal class DefaultAccessibilityReaderTest {
750803
applicationContext = any(),
751804
key = any()
752805
)
753-
) doReturn false
806+
) doReturn 0
754807

755808
val initialResult = testedReader.getState()
756809

@@ -760,7 +813,7 @@ internal class DefaultAccessibilityReaderTest {
760813
applicationContext = any(),
761814
key = eq(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED)
762815
)
763-
) doReturn true
816+
) doReturn 1
764817

765818
// When
766819
val listenerField = testedReader.javaClass.getDeclaredField("displayInversionListener")
@@ -773,5 +826,6 @@ internal class DefaultAccessibilityReaderTest {
773826
assertThat(updatedResult.isColorInversionEnabled as Boolean).isTrue()
774827
assertThat(updatedResult.isColorInversionEnabled).isNotEqualTo(initialResult.isColorInversionEnabled)
775828
}
829+
776830
// endregion
777831
}

0 commit comments

Comments
 (0)