@mica/sdk (SDK contract v1)
    Preparing search index...

    Function useSystemHardware

    • The phone's hardware: battery, cellular signal, cell service, bluetooth, and volume controls — read-only. Changing any of it is useSystemHardwareWrite (MICA-127).

      Returns {
          bluetoothEnabled: Writable<boolean>;
          cellServiceEnabled: Writable<boolean>;
          charge: Writable<number>;
          isBluetoothDiscoverable: Readable<boolean>;
          notificationTone: Writable<string>;
          notificationToneChoices: Readable<readonly RingtoneOption[]>;
          ringMode: Writable<RingMode>;
          ringModeChoices: Readable<readonly RingModeChoice[]>;
          ringtone: Writable<string>;
          ringtoneChoices: Readable<readonly RingtoneOption[]>;
          signalLevel: Writable<number>;
          soundMuted: Writable<boolean>;
          soundVolume: Writable<number>;
          volumeStep: Writable<number>;
          volumeStepChoices: readonly [1, 2, 5, 10, 20];
      }

      • bluetoothEnabled: Writable<boolean>
      • cellServiceEnabled: Writable<boolean>
      • charge: Writable<number>
      • isBluetoothDiscoverable: Readable<boolean>
      • notificationTone: Writable<string>

        MICA-256: the tone a notification plays.

      • notificationToneChoices: Readable<readonly RingtoneOption[]>

        The owner's sounds only. 'default' (the phone's own notification tone) is always a valid notificationTone and is deliberately not listed, so a caller renders it in its own language (Settings prepends a translated "Default" row).

      • ringMode: Writable<RingMode>

        The ringer switch: 'normal' | 'vibrate' | 'silent'. MICA-62.

      • ringModeChoices: Readable<readonly RingModeChoice[]>

        The choice lists are readable wrappers rather than the bare arrays, and that is a transport decision, not a second source of truth — shell/state/audio.ts still owns the one list. A plain value on a facet has to be hand-carried through AddOnConstants (as volumeStepChoices is, because the first paint needs it synchronously); a store rides the generic subscribe path an iframe twin already has. Nothing renders a ringer picker before hydration, so the store is the cheaper half of that trade.

      • ringtone: Writable<string>
      • ringtoneChoices: Readable<readonly RingtoneOption[]>

        The built-in tones, then the owner's sounds (MICA-256).

      • signalLevel: Writable<number>
      • soundMuted: Writable<boolean>
      • soundVolume: Writable<number>
      • volumeStep: Writable<number>

        How far one physical volume-button press moves the volume, in whole percent.

      • volumeStepChoices: readonly [1, 2, 5, 10, 20]