# @ohos.cooperate (Screen Hopping)
The **cooperate** module implements screen hopping for two or more networked devices to share the keyboard and mouse for collaborative operations.
> **NOTE**
>
> - The initial APIs of this module are supported since API version 10. Newly added APIs will be marked with a superscript to indicate their earliest API version.
>
> - The APIs provided by this module are system APIs.
## Modules to Import
```js
import cooperate from '@ohos.cooperate'
```
## cooperate.prepare
prepare(callback: AsyncCallback<void>): void;
Prepares for screen hopping. This API uses an asynchronous callback to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory | Description |
| -------- | ------------------------- | ---- | --------------------------- |
| callback | AsyncCallback<void> | Yes|Callback used to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error object. |
**Example**
```js
try {
cooperate.prepare((error) => {
if (error) {
console.log(`Keyboard mouse crossing prepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Keyboard mouse crossing prepare success.`);
});
} catch (error) {
console.log(`Keyboard mouse crossing prepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.prepare
prepare(): Promise<void>
Prepares for screen hopping. This API uses a promise to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Return value**
| Parameters | Description |
| ------------------- | ------------------------------- |
| Promise<void> | Promise that returns no value.|
**Example**
```js
try {
cooperate.prepare().then(() => {
console.log(`Keyboard mouse crossing prepare success.`);
}, (error) => {
console.log(`Keyboard mouse crossing prepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Keyboard mouse crossing prepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.unprepare
unprepare(callback: AsyncCallback<void>): void;
Cancels the preparation for screen hopping. This API uses an asynchronous callback to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
| Name | Type | Mandatory| Description |
| -------- | ------------------------- | ---- | ------------------------------------------ |
| callback | AsyncCallback<void> | Yes | Callback used to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error object.|
**Example**
```js
try {
cooperate.unprepare((error) => {
if (error) {
console.log(`Keyboard mouse crossing unprepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Keyboard mouse crossing unprepare success.`);
});
} catch (error) {
console.log(`Keyboard mouse crossing unprepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.unprepare
unprepare(): Promise<void>;
Cancels the preparation for screen hopping. This API uses a promise to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Return value**
| Parameters | Description |
| ------------------- | --------------------------------------------- |
| Promise<void> | Promise that returns no value.|
```js
try {
cooperate.unprepare().then(() => {
console.log(`Keyboard mouse crossing unprepare success.`);
}, (error) => {
console.log(`Keyboard mouse crossing unprepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Keyboard mouse crossing unprepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.activate
activate(targetNetworkId: string, inputDeviceId: number, callback: AsyncCallback<void>): void;
Starts screen hopping. This API uses an asynchronous callback to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory | Description |
| -------- | ---------------------------- | ---- | ---------------------------- |
| targetNetworkId | string | Yes | Descriptor of the target device for screen hopping. |
| inputDeviceId | number | Yes | Identifier of the input device for screen hopping.|
| callback | AsyncCallback<void> | Yes | Callback used to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error object.|
**Error codes**
For details about the error codes, see [Screen Hopping Error Codes](../errorcodes/errorcode-devicestatus.md).
| ID| Error Message|
| -------- | ---------------------------------------- |
| 20900001 | Operation failed.|
**Example**
```js
let targetNetworkId = "networkId";
let inputDeviceId = 0;
try {
cooperate.activate(targetNetworkId, inputDeviceId, (error) => {
if (error) {
console.log(`Start Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Start Keyboard mouse crossing success.`);
});
} catch (error) {
console.log(`Start Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.activate
activate(targetNetworkId: string, inputDeviceId: number): Promise<void>;
Starts screen hopping. This API uses a promise to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory | Description |
| -------- | ---------------------------- | ---- | ---------------------------- |
| targetNetworkId | string | Yes | Descriptor of the target device for screen hopping. |
| inputDeviceId | number | Yes | Identifier of the input device for screen hopping.|
**Return value**
| Name | Description |
| ---------------------- | ------------------------------- |
| Promise<void> | Promise that returns no value. |
**Error codes**
For details about the error codes, see [Screen Hopping Error Codes](../errorcodes/errorcode-devicestatus.md).
| ID| Error Message|
| -------- | ---------------------------------------- |
| 20900001 | Operation failed. |
**Example**
```js
let targetNetworkId = "networkId";
let inputDeviceId = 0;
try {
cooperate.activate(targetNetworkId, inputDeviceId).then(() => {
console.log(`Start Keyboard mouse crossing success.`);
}, (error) => {
console.log(`Start Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Start Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.deactivate
deactivate(isUnchained: boolean, callback: AsyncCallback<void>): void;
Stops screen hopping. This API uses an asynchronous callback to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory | Description |
| -------- | ---------------------------- | ---- | ---------------------------- |
| isUnchained | boolean | Yes| Whether to disable the cross-device link.
The value **true** means to disable the cross-device link, and the value **false** means the opposite.|
| callback | AsyncCallback<void> | Yes | Callback used to return the result. If the operation is successful, **err** is **undefined**. Otherwise, **err** is an error object.|
**Example**
```js
try {
cooperate.deactivate(false, (error) => {
if (error) {
console.log(`Stop Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Stop Keyboard mouse crossing success.`);
});
} catch (error) {
console.log(`Stop Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.deactivate
deactivate(isUnchained: boolean): Promise<void>;
Stops screen hopping. This API uses a promise to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory| Description |
| ----------- | ------- | ---- | ------------------ |
| isUnchained | boolean | Yes | Whether to disable the cross-device link.
The value **true** means to disable the cross-device link, and the value **false** means the opposite.|
**Return value**
| Name | Description |
| -------- | ---------------------------- |
| Promise<void> | Promise that returns no value. |
**Example**
```js
try {
cooperate.deactivate(false).then(() => {
console.log(`Stop Keyboard mouse crossing success.`);
}, (error) => {
console.log(`Stop Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Stop Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.getCrossingSwitchState
getCrossingSwitchState(networkId: string, callback: AsyncCallback<boolean>): void;
Obtains the screen hopping status of the target device. This API uses an asynchronous callback to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory | Description |
| -------- | --------- | ---- | ---------------------------- |
| networkId | string | Yes | Descriptor of the target device for screen hopping. |
| callback | AsyncCallback<boolean> | Yes | Callback used to return the result. The value **true** indicates that screen hopping is enabled, and the value **false** indicates the opposite.|
**Example**
```js
let deviceDescriptor = "networkId";
try {
cooperate.getCrossingSwitchState(deviceDescriptor, (error, data) => {
if (error) {
console.log(`Get the status failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Get the status success, data: ${JSON.stringify(data)}`);
});
} catch (error) {
console.log(`Get the status failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.getCrossingSwitchState
getCrossingSwitchState(networkId: string): Promise<boolean>;
Obtains the screen hopping status of the target device. This API uses a promise to return the result.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory | Description |
| -------- | --------- | ---- | ---------------------------- |
| networkId | string | Yes | Descriptor of the target device for screen hopping. |
**Return value**
| Parameters | Description |
| ------------------- | ------------------------------- |
| Promise<boolean> | Promise used to return the result. The value **true** indicates that screen hopping is enabled, and the value **false** indicates the opposite.|
**Example**
```js
let deviceDescriptor = "networkId";
try {
cooperate.getCrossingSwitchState(deviceDescriptor).then((data) => {
console.log(`Get the status success, data: ${JSON.stringify(data)}`);
}, (error) => {
console.log(`Get the status failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Get the status failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## on('cooperate')
on(type: 'cooperate', callback: Callback<{ networkId: string, msg: CooperateMsg }>): void;
Enables listening for screen hopping status change events.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory| Description |
| -------- | ---------------------------- | ---- | ---------------------------- |
| type | string | Yes | Event type. The value is **cooperate**.|
| callback | Callback<{ networkId: string, msg: [CooperateMsg](#cooperatemsg) }> | Yes | Callback used to return the result.|
**Example**
```js
try {
cooperate.on('cooperate', (data) => {
console.log(`Keyboard mouse crossing event: ${JSON.stringify(data)}`);
});
} catch (error) {
console.log(`Register failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## off('cooperate')
off(type: 'cooperate', callback?: Callback<void>): void;
Disables listening for screen hopping status change events.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
**Parameters**
| Name | Type | Mandatory | Description |
| -------- | ---------------------------- | ---- | ---------------------------- |
| type | string | Yes | Event type. The value is **cooperate**.|
| callback | AsyncCallback<void> | No | Callback to be unregistered. If this parameter is not specified, all callbacks registered by the current application will be unregistered.|
**Example**
```js
// Unregister a single callback.
function callback(event) {
console.log(`Keyboard mouse crossing event: ${JSON.stringify(event)}`);
return false;
}
try {
cooperate.on('cooperate', callback);
cooperate.off("cooperate", callback);
} catch (error) {
console.log(`Execute failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
```js
// Unregister all callbacks.
function callback(event) {
console.log(`Keyboard mouse crossing event: ${JSON.stringify(event)}`);
return false;
}
try {
cooperate.on('cooperate', callback);
cooperate.off("cooperate");
} catch (error) {
console.log(`Execute failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## CooperateMsg
Represents a screen hopping message notification.
**System capability**: SystemCapability.Msdp.DeviceStatus.Cooperate
| Name | Value | Description |
| -------- | ----------------- | ----------------- |
| COOPERATE_PREPARE | 0 | The preparation for screen hopping is finished. |
| COOPERATE_UNPREPARE | 1 | The preparation for screen hopping is cancelled. |
| COOPERATE_ACTIVATE | 2 | Screen hopping starts. |
| COOPERATE_ACTIVATE_SUCCESS | 3 | Starting screen hopping succeeds.|
| COOPERATE_ACTIVATE_FAIL | 4 | Starting screen hopping fails.|
| COOPERATE_DEACTIVATE_SUCCESS | 5 | Stopping screen hopping succeeds.|
| COOPERATE_DEACTIVATE_FAIL | 6 | Stopping screen hopping fails.|
| COOPERATE_SESSION_DISCONNECTED | 7 | The screen hopping session is disconnected.|