Package 

Class DeviceSignals


  • 
    public final class DeviceSignals
    
                        

    What the collector observed about this device.

    Every field is nullable and every field means three things, not two: true, false, and null for "could not determine". That distinction is load bearing. A signal that collapses an honest false into "absent" destroys its own denominator, and you can no longer compute a rate for it at all. We have already paid for that lesson once server-side, where osMismatch recorded 121 rows, all of them true, across 12,172 devices, because false || false || undefined is undefined. Send the boolean you actually measured.

    • Method Detail

      • getIsEmulator

         final Boolean getIsEmulator()

        running under an emulator (BlueStacks, LDPlayer, Nox, the AVD)

      • getIsRooted

         final Boolean getIsRooted()

        root is present: su, Magisk, or a test-keys build

      • getIsCloned

         final Boolean getIsCloned()

        an app-cloning container (Parallel Space, Island, Dual Space)

      • getIsAutoTimeOff

         final Boolean getIsAutoTimeOff()

        Automatic network time is OFF, so the wall clock is whatever the user set.

        Corroboration only, never a verdict on its own. Turning auto-time off is a legitimate thing people do, and a phone whose battery died reports a wildly wrong clock through no fault of its owner. It matters because it is the precondition for the thing we actually care about: a clock moved forward to defeat a cooldown.

      • toWireMap

         final Map<String, Boolean> toWireMap()

        Beacon wire form. Only what we actually measured: a null is omitted rather than sent, so the server can tell silence from a measured false.