# @ohos.multimodalInput.inputDevice (Input Device) The **inputDevice** module allows you to listen for hot swap events of input devices and query information about input devices. > **NOTE** > > The initial APIs of this module are supported since API version 8. Newly added APIs will be marked with a superscript to indicate their earliest API version. ## Modules to Import ```js import inputDevice from '@ohos.multimodalInput.inputDevice'; ``` ## inputDevice.getDeviceList9+ getDeviceList(callback: AsyncCallback<Array<number>>): void Obtains the IDs of all input devices. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | ---------------------------------------- | ---- | ---------------------------------------- | | callback | AsyncCallback<Array<number>> | Yes | Callback used to return the result.| **Example** ```js try { inputDevice.getDeviceList((error, ids) => { if (error) { console.log(`Failed to get device id list, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Device id list: ${JSON.stringify(ids)}`); }); } catch (error) { console.log(`Failed to get device id list, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getDeviceList9+ getDeviceList(): Promise<Array<number>> Obtains the IDs of all input devices. This API uses a promise to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Return value** | Parameters | Description | | ---------------------------------- | ------------------------------------------- | | Promise<Array<number>> | Promise used to return the result.| **Example** ```js try { inputDevice.getDeviceList().then((ids: Array) => { console.log(`Device id list: ${JSON.stringify(ids)}`); }); } catch (error) { console.log(`Failed to get device id list, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getDeviceInfo9+ getDeviceInfo(deviceId: number, callback: AsyncCallback<InputDeviceData>): void Obtains information about an input device. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | -------------------------------------------------------- | ---- | --------------------------------------- | | deviceId | number | Yes | ID of the input device. | | callback | AsyncCallback<[InputDeviceData](#inputdevicedata)> | Yes | Callback used to return the result, which is an **InputDeviceData** object.| **Example** ```js // Obtain the name of the device whose ID is 1. try { inputDevice.getDeviceInfo(1, (error, deviceData) => { if (error) { console.log(`Failed to get device info, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Device info: ${JSON.stringify(deviceData)}`); }); } catch (error) { console.log(`Failed to get device info, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getDeviceInfo9+ getDeviceInfo(deviceId: number): Promise<InputDeviceData> Obtains information about an input device. This API uses a promise to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | ------ | ---- | ---------------------- | | deviceId | number | Yes | ID of the input device.| **Return value** | Parameters | Description | | -------------------------------------------------- | ------------------------------- | | Promise<[InputDeviceData](#inputdevicedata)> | Promise used to return the result.| **Example** ```js // Obtain the name of the device whose ID is 1. try { inputDevice.getDeviceInfo(1).then((deviceData) => { console.log(`Device info: ${JSON.stringify(deviceData)}`); }); } catch (error) { console.log(`Failed to get device info, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.on9+ on(type: "change", listener: Callback<DeviceListener>): void Enables listening for device hot swap events. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory | Description | | -------- | ---------------------------------------- | ---- | ----------- | | type | string | Yes | Event type of the input device. | | listener | Callback<[DeviceListener](#devicelistener9)> | Yes | Listener for events of the input device.| **Example** ```js let isPhysicalKeyboardExist = true; try { inputDevice.on("change", (data: inputDevice.DeviceListener) => { console.log(`Device event info: ${JSON.stringify(data)}`); inputDevice.getKeyboardType(data.deviceId, (err: Error, type: inputDevice.KeyboardType) => { console.log("The keyboard type is: " + type); if (type == inputDevice.KeyboardType.ALPHABETIC_KEYBOARD && data.type == 'add') { // The physical keyboard is connected. isPhysicalKeyboardExist = true; } else if (type == inputDevice.KeyboardType.ALPHABETIC_KEYBOARD && data.type == 'remove') { // The physical keyboard is disconnected. isPhysicalKeyboardExist = false; } }); }); // Check whether the soft keyboard is open based on the value of isPhysicalKeyboardExist. } catch (error) { console.log(`Get device info failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.off9+ off(type: "change", listener?: Callback<DeviceListener>): void Disables listening for device hot swap events. This API is called before the application exits. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory | Description | | -------- | ---------------------------------------- | ---- | ----------- | | type | string | Yes | Event type of the input device. | | listener | Callback<[DeviceListener](#devicelistener9)> | No | Listener for events of the input device.| **Example** ```js function callback(data) { console.log(`Report device event info: ${JSON.stringify(data, [`type`, `deviceId`])}`); }; try { inputDevice.on("change", callback); } catch (error) { console.log(`Listen device event failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } // Disable this listener. try { inputDevice.off("change", callback); } catch (error) { console.log(`Cancel listening device event failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } // Disable all listeners. try { inputDevice.off("change"); } catch (error) { console.log(`Cancel all listening device event failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getDeviceIds(deprecated) getDeviceIds(callback: AsyncCallback<Array<number>>): void Obtains the IDs of all input devices. This API uses an asynchronous callback to return the result. This API is deprecated since API version 9. You are advised to use [inputDevice.getDeviceList](#inputdevicegetdevicelist9) instead. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | ---------------------------------------- | ---- | ---------------------------------------- | | callback | AsyncCallback<Array<number>> | Yes | Callback used to return the result.| **Example** ```js inputDevice.getDeviceIds((error: Error, ids: Array) => { if (error) { console.log(`Failed to get device id list, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Device id list: ${JSON.stringify(ids)}`); }); ``` ## inputDevice.getDeviceIds(deprecated) getDeviceIds(): Promise<Array<number>> Obtains the IDs of all input devices. This API uses a promise to return the result. This API is deprecated since API version 9. You are advised to use [inputDevice.getDeviceList](#inputdevicegetdevicelist9) instead. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Return value** | Parameters | Description | | ---------------------------------- | ------------------------------------------- | | Promise<Array<number>> | Promise used to return the result.| **Example** ```js inputDevice.getDeviceIds().then((ids: Array) => { console.log(`Device id list: ${JSON.stringify(ids)}`); }); ``` ## inputDevice.getDevice(deprecated) getDevice(deviceId: number, callback: AsyncCallback<InputDeviceData>): void Obtains information about an input device. This API uses an asynchronous callback to return the result. This API is deprecated since API version 9. You are advised to use [inputDevice.getDeviceInfo](#inputdevicegetdeviceinfo9) instead. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | -------------------------------------------------------- | ---- | -------------------------------- | | deviceId | number | Yes | ID of the input device. | | callback | AsyncCallback<[InputDeviceData](#inputdevicedata)> | Yes | Callback used to return the result, which is an **InputDeviceData** object.| **Example** ```js // Obtain the name of the device whose ID is 1. inputDevice.getDevice(1, (error, deviceData) => { if (error) { console.log(`Failed to get device info, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Device info: ${JSON.stringify(deviceData)}`); }); ``` ## inputDevice.getDevice(deprecated) getDevice(deviceId: number): Promise<InputDeviceData> Obtains information about an input device. This API uses a promise to return the result. This API is deprecated since API version 9. You are advised to use [inputDevice.getDeviceInfo](#inputdevicegetdeviceinfo9) instead. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | ------ | ---- | ------------ | | deviceId | number | Yes | ID of the input device.| **Return value** | Parameters | Description | | -------------------------------------------------- | ----------------------------------- | | Promise<[InputDeviceData](#inputdevicedata)> | Promise used to return the result.| **Example** ```js // Obtain the name of the device whose ID is 1. inputDevice.getDevice(1).then((deviceData) => { console.log(`Device info: ${JSON.stringify(deviceData)}`); }); ``` ## inputDevice.supportKeys9+ supportKeys(deviceId: number, keys: Array<KeyCode>, callback: AsyncCallback <Array<boolean>>): void Obtains the key codes supported by the input device. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | ----------------------------------------- | ---- | ------------------------------------------------------ | | deviceId | number | Yes | Unique ID of the input device. If the same physical device is repeatedly inserted and removed, its ID changes.| | keys | Array<KeyCode> | Yes | Key codes to be queried. A maximum of five key codes can be specified. | | callback | AsyncCallback<Array<boolean>> | Yes | Callback used to return the result. | **Example** ```js // Check whether the input device whose ID is 1 supports key codes 17, 22, and 2055. try { inputDevice.supportKeys(1, [17, 22, 2055], (error: Error, supportResult: Array) => { console.log(`Query result: ${JSON.stringify(supportResult)}`); }); } catch (error) { console.log(`Query failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.supportKeys9+ supportKeys(deviceId: number, keys: Array<KeyCode>): Promise<Array<boolean>> Obtains the key codes supported by the input device. This API uses a promise to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | -------------------- | ---- | ------------------------------------------------------ | | deviceId | number | Yes | Unique ID of the input device. If the same physical device is repeatedly inserted and removed, its ID changes.| | keys | Array<KeyCode> | Yes | Key codes to be queried. A maximum of five key codes can be specified. | **Return value** | Parameters | Description | | ----------------------------------- | ------------------------------- | | Promise<Array<boolean>> | Promise used to return the result.| **Example** ```js // Check whether the input device whose ID is 1 supports key codes 17, 22, and 2055. try { inputDevice.supportKeys(1, [17, 22, 2055]).then((supportResult) => { console.log(`Query result: ${JSON.stringify(supportResult)}`); }); } catch (error) { console.log(`Query failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getKeyboardType9+ getKeyboardType(deviceId: number, callback: AsyncCallback<KeyboardType>): void Obtains the keyboard type of an input device. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | --------------------------------------------------- | ---- | ------------------------------------------------------------ | | deviceId | number | Yes | Unique ID of the input device. If the same physical device is repeatedly inserted and removed, its ID changes.| | callback | AsyncCallback<[KeyboardType](#keyboardtype9)> | Yes | Callback used to return the result. | **Example** ```js // Query the keyboard type of the input device whose ID is 1. try { inputDevice.getKeyboardType(1, (error, type) => { if (error) { console.log(`Failed to get keyboard type, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Keyboard type: ${JSON.stringify(type)}`); }); } catch (error) { console.log(`Failed to get keyboard type, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getKeyboardType9+ getKeyboardType(deviceId: number): Promise<KeyboardType> Obtains the keyboard type of an input device. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **Parameters** | Name | Type | Mandatory| Description | | -------- | ------ | ---- | ------------------------------------------------------------ | | deviceId | number | Yes | Unique ID of the input device. If the same physical device is repeatedly inserted and removed, its ID changes.| **Return value** | Parameters | Description | | --------------------------------------------- | ------------------------------- | | Promise<[KeyboardType](#keyboardtype9)> | Promise used to return the result.| **Example** ```js // Query the keyboard type of the input device whose ID is 1. try { inputDevice.getKeyboardType(1).then((type: number) => { console.log(`Keyboard type: ${JSON.stringify(type)}`); }); } catch (error) { console.log(`Failed to get keyboard type, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.setKeyboardRepeatDelay10+ setKeyboardRepeatDelay(delay: number, callback: AsyncCallback<void>): void Sets the keyboard repeat delay. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **System API**: This is a system API. **Parameters** | Name | Type | Mandatory| Description | | -------- | ------ | ---- | ------------------------------------------------------------ | | delay | number | Yes | Keyboard repeat delay, in ms. The value range is [300, 1000] and the default value is **500**.| | callback | AsyncCallback<void> | Yes | Callback used to return the result.| **Example** ```js try { inputDevice.setKeyboardRepeatDelay(350, (error) => { if (error) { console.log(`Set keyboard repeat delay failed, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Set keyboard repeat delay success`); }); } catch (error) { console.log(`Set keyboard repeat delay failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.setKeyboardRepeatDelay10+ setKeyboardRepeatDelay(delay: number): Promise<void> Sets the keyboard repeat delay. This API uses a promise to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **System API**: This is a system API. **Parameters** | Name | Type | Mandatory | Description | | ----- | ------ | ---- | ----------------------------------- | | delay | number | Yes | Keyboard repeat delay, in ms. The value range is [300, 1000] and the default value is **500**.| **Return value** | Parameters | Description | | ------------------- | ---------------- | | Promise<void> | Promise used to return the result.| **Example** ```js try { inputDevice.setKeyboardRepeatDelay(350).then(() => { console.log(`Set keyboard repeat delay success`); }); } catch (error) { console.log(`Set keyboard repeat delay failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getKeyboardRepeatDelay10+ getKeyboardRepeatDelay(callback: AsyncCallback<number>): void Obtains the keyboard repeat delay. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **System API**: This is a system API. **Parameters** | Name | Type | Mandatory| Description | | -------- | ------ | ---- | ------------------------------------------------------------ | | callback | AsyncCallback<number> | Yes | Callback used to return the result.| **Example** ```js try { inputDevice.getKeyboardRepeatDelay((error: Error, delay: number) => { if (error) { console.log(`Get keyboard repeat delay failed, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Get keyboard repeat delay success`); }); } catch (error) { console.log(`Get keyboard repeat delay failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getKeyboardRepeatDelay10+ getKeyboardRepeatDelay(): Promise<number> Obtains the keyboard repeat delay. This API uses a promise to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **System API**: This is a system API. **Return value** | Parameters | Description | | --------------------- | ------------------- | | Promise<number> | Promise used to return the result.| **Example** ```js try { inputDevice.getKeyboardRepeatDelay().then(delay => { console.log(`Get keyboard repeat delay success`); }); } catch (error) { console.log(`Get keyboard repeat delay failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.setKeyboardRepeatRate10+ setKeyboardRepeatRate(rate: number, callback: AsyncCallback<void>): void Sets the keyboard repeat rate. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **System API**: This is a system API. **Parameters** | Name | Type | Mandatory| Description | | -------- | ------ | ---- | ------------------------------------------------------------ | | rate | number | Yes | Keyboard repeat rate, in ms/time. The value range is [36, 100] and the default value is 50.| | callback | AsyncCallback<void> | Yes | Callback used to return the result.| **Example** ```js try { inputDevice.setKeyboardRepeatRate(60, (error) => { if (error) { console.log(`Set keyboard repeat rate failed, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Set keyboard repeat rate success`); }); } catch (error) { console.log(`Set keyboard repeat rate failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.setKeyboardRepeatRate10+ setKeyboardRepeatRate(rate: number): Promise<void> Sets the keyboard repeat rate. This API uses a promise to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **System API**: This is a system API. **Parameters** | Name | Type | Mandatory | Description | | ----- | ------ | ---- | ----------------------------------- | | rate | number | Yes | Keyboard repeat rate, in ms/time. The value range is [36, 100] and the default value is 50.| **Return value** | Parameters | Description | | ------------------- | ---------------- | | Promise<void> | Promise used to return the result.| **Example** ```js try { inputDevice.setKeyboardRepeatRate(60).then(() => { console.log(`Set keyboard repeat rate success`); }); } catch (error) { console.log(`Set keyboard repeat rate failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getKeyboardRepeatRate10+ getKeyboardRepeatRate(callback: AsyncCallback<number>): void Obtains the keyboard repeat rate. This API uses an asynchronous callback to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **System API**: This is a system API. **Parameters** | Name | Type | Mandatory | Description | | -------- | --------------------------- | ---- | -------------- | | callback | AsyncCallback<number> | Yes | Callback used to return the result.| **Example** ```js try { inputDevice.getKeyboardRepeatRate((error, rate) => { if (error) { console.log(`Get keyboard repeat rate failed, error: ${JSON.stringify(error, [`code`, `message`])}`); return; } console.log(`Get keyboard repeat rate success`); }); } catch (error) { console.log(`Get keyboard repeat rate failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## inputDevice.getKeyboardRepeatRate10+ getKeyboardRepeatRate(): Promise<number> Obtains the keyboard repeat rate. This API uses a promise to return the result. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice **System API**: This is a system API. **Return value** | Parameters | Description | | --------------------- | ------------------- | | Promise<number> | Promise used to return the result.| **Example** ```js try { inputDevice.getKeyboardRepeatRate().then(rate => { console.log(`Get keyboard repeat rate success`); }); } catch (error) { console.log(`Get keyboard repeat rate failed, error: ${JSON.stringify(error, [`code`, `message`])}`); } ``` ## DeviceListener9+ Defines the listener for hot swap events of an input device. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice | Name | Type | Readable | Writable | Description | | --------- | ------ | ---- | ---- | ------- | | type | [ChangedType](#changedtype) | Yes| No| Device change type, which indicates whether an input device is inserted or removed.| | deviceId | number | Yes| No| Unique ID of the input device. If the same physical device is repeatedly inserted and removed, its ID changes.| ## InputDeviceData Defines the information about an input device. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice | Name | Type | Readable | Writable | Description | | --------- | ------ | ---- | ---- | ------- | | id | number | Yes| No| Unique ID of the input device. If the same physical device is repeatedly inserted and removed, its ID changes.| | name | string | Yes| No| Name of the input device. | | sources | Array<[SourceType](#sourcetype)> | Yes| No| Source type of the input device. For example, if a keyboard is attached with a touchpad, the device has two input sources: keyboard and touchpad.| | axisRanges | Array<[AxisRange](#axisrange)> | Yes| No| Axis information of the input device. | | bus9+ | number | Yes| No| Bus type of the input device. | | product9+ | number | Yes| No| Product information of the input device. | | vendor9+ | number | Yes| No| Vendor information of the input device. | | version9+ | number | Yes| No| Version information of the input device. | | phys9+ | string | Yes| No| Physical address of the input device. | | uniq9+ | string | Yes| No| Unique ID of the input device. | ## AxisType9+ Defines the axis type of an input device. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice | Name | Type | Readable | Writable | Description | | --------- | ------ | ---- | ---- | ------- | | touchmajor | string | Yes| No| **touchmajor** axis. | | touchminor | string | Yes| No| **touchminor** axis. | | toolminor | string | Yes| No| **toolminor** axis. | | toolmajor | string | Yes| No| **toolmajor** axis. | | orientation | string | Yes| No| Orientation axis.| | pressure | string | Yes| No| Pressure axis. | | x | string | Yes| No| X axis. | | y | string | Yes| No| Y axis. | | null | string | Yes| No| None. | ## AxisRange Defines the axis range of an input device. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice | Name | Type | Readable | Writable | Description | | --------- | ------ | ---- | ---- | ------- | | source | [SourceType](#sourcetype) | Yes| No| Input source type of the axis.| | axis | [AxisType](#axistype9) | Yes| No| Axis type. | | max | number | Yes| No| Maximum value of the axis. | | min | number | Yes| No| Minimum value of the axis. | | fuzz9+ | number | Yes| No| Fuzzy value of the axis. | | flat9+ | number | Yes| No| Benchmark value of the axis. | | resolution9+ | number | Yes| No| Resolution of the axis. | ## SourceType9+ Input source type of the axis. For example, if a mouse reports an x-axis event, the input source of the x-axis is the mouse. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice | Name | Type | Readable | Writable | Description | | --------- | ------ | ---- | ---- | ------- | | keyboard | string | Yes| No| The input device is a keyboard. | | touchscreen | string | Yes| No| The input device is a touchscreen.| | mouse | string | Yes| No| The input device is a mouse. | | trackball | string | Yes| No| The input device is a trackball.| | touchpad | string | Yes| No| The input device is a touchpad.| | joystick | string | Yes| No| The input device is a joystick.| ## ChangedType9+ Defines the change type for the hot swap event of an input device. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice | Name | Type | Readable | Writable | Description | | --------- | ------ | ---- | ---- | ------- | | add | string | Yes| No| An input device is inserted.| | remove | string | Yes| No| An input device is removed.| ## KeyboardType9+ Enumerates the keyboard types. **System capability**: SystemCapability.MultimodalInput.Input.InputDevice | Name | Value | Description | | ------------------- | ---- | --------- | | NONE | 0 | Keyboard without keys. | | UNKNOWN | 1 | Keyboard with unknown keys.| | ALPHABETIC_KEYBOARD | 2 | Full keyboard. | | DIGITAL_KEYBOARD | 3 | Keypad. | | HANDWRITING_PEN | 4 | Stylus. | | REMOTE_CONTROL | 5 | Remote control. |