Preparations
Before you can use the OPPO Fluid Cloud feature, you must complete the following preparations:
Integrate the software development kit (SDK) and the OPPO channel. For more information, see Android SDK integration and OPPO channel integration.
Refer to Access Preparation to clarify your requirements and contact OPPO for confirmation.
Obtain the client_id and client_secret. Then, configure the Fluid Cloud ClientId and Fluid Cloud ClientSecret in the EMAS console. For more information, see Obtain client_id and client_secret and Configure channel keys.
Getting started
After you complete the preparations, follow these steps to quickly create a Fluid Cloud instance in a staging environment:
Set up a staging environment on the client. For more information, see Environment setup.
Call the Advanced push API. The following code provides a parameter example:
PushRequest pushRequest = new PushRequest();
// Basic parameters
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0 indicates the production environment, and 1 indicates the staging environment.
// Set the parameters for remotely creating a Fluid Cloud instance.
String startIntelligentIntent = """
{
"intentName": "Example.Progress",
"identifier": "d71ebd3119877b12ecdb6c4fe96b068e",
"timestamp": 1729485000989,
"serviceId": {
"launcher": "999800001",
"fluidCloud": "999900001"
},
"intentAction": {
"actionStatus": 0
},
"intentEntity": {
"entityName": "TAXI",
"entityId": "A580202509130712",
"milestone": {
"code": 30,
"text": "vehicle_coming"
},
"capsule": {
"leftImg": "https://xxxx",
"rightText": "Picking up",
"legacyImg": "https://xxxx",
"legacyText": "Picking up"
},
"primary": {
"title": [
{
"text": "Driver is on the way",
"color": "#00FF00",
"darkColor": "#00FF00"
}
],
"content": "Yue BDG4251 Gray GAC Aion",
"rightImg": "https://xxxx",
"clickAction": "xxxx",
"miniImg": "xxxx"
},
"secondaryData": {
"type": "PROGRESS",
"progress": 20,
"indicatorImg": "https://xxxx",
"style": "inside",
"nodeLabels": ["Order accepted", "Pickup point", "Destination"]
}
}
}
""";
pushRequest.setAndroidOppoIntelligentIntent(startIntelligentIntent);
// Send the push notification.
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n",
pushResponse.getRequestId(), pushResponse.getMessageId());
The client displays the following:


Core concepts
OPPO Fluid Cloud presents information in a lightweight, focused format. It flows freely between devices, consolidates various system interactions, and distributes them uniformly. The information is intelligently displayed in appropriate scenarios, so that users can receive it more intuitively.
Supported scenario types for Fluid Cloud
Scenario type |
entityName value |
Ride-hailing service |
TAXI |
Food delivery |
DELIVERY |
In-store pickup |
PICKUP |
Match scores |
MATCH |
Driving navigation |
NAVIGATION |
Task |
TASK |
Fluid Cloud style templates
Fluid Cloud currently offers five style templates: progress visualization, match, highlighted information, large graphic, and symmetrical.
Create, update, or end a Fluid Cloud instance on the client
When the application process is active, you can use ContentProviderClient to perform local operations on Fluid Cloud. For more information, see Intent Sharing (Client-side). For the parameter structure, see Intent Sharing Data Structure. For the actionStatus parameter, the values 0/1/2 correspond to the create, update, and end operations for Fluid Cloud, respectively.
Remotely create, update, or end a Fluid Cloud instance using the Mobile Push API
Mobile Push lets you remotely create, update, or end a Fluid Cloud instance using the Push or MassPush API.
Parameter settings
When you call the API, note the following key parameters:
PushType: Set this parameter to
NOTICEwhen you push a Fluid Cloud notification.AndroidTargetUserType or AndroidOppoIntentEnv: Set this parameter to
1for the staging environment or0for the production environment.AndroidOppoIntelligentIntent: A JSON string that represents the Fluid Cloud intent-sharing data structure IntelligentIntent, where
actionStatusis set to0/1/2for creation, update, or end, respectively.AndroidOppoDeleteIntentData: A JSON string that represents the data structure for deleting a Fluid Cloud intent. This parameter is typically used to forcibly end a Fluid Cloud instance when handling abnormal states. This parameter is invalid if the AndroidOppoIntelligentIntent parameter is also specified.
The following table describes the structure of AndroidOppoIntelligentIntent.
Parameter |
Required |
Parameter type |
Description |
intentName |
String |
Yes. |
The name of the intent. |
identifier |
String |
String |
The unique ID for this intent sharing instance. You can generate a UUID or create an ID based on your business needs. This ID serves as the unique identifier for a single sharing record. |
timestamp |
Long |
Yes, it is. |
The system timestamp when the intent sharing occurs, in milliseconds. |
serviceId |
JSON |
Yes, it is. |
The card ID. Each serviceId corresponds to one card, and each entry point corresponds to one serviceId. |
intentAction |
JSON |
JSON |
Describes the action of the intent. |
actionStatus |
Int |
Int |
The operation type for the Fluid Cloud instance: 0. Creating Fluid Cloud 1. Update Fluid Cloud 2. Terminate Fluid Cloud. |
intentEntity |
JSON |
Yes. |
The entity information for intent sharing. This describes the content of the domain-specific entity. |
entityName |
String |
Yes. |
Vertical Domains |
entityId |
String |
Yes, it is. |
The entity ID. This is the unique identifier for the entity. You can use an identifier such as an order number. |
milestone |
JSON |
Yes, it is. |
The milestone status. For more information, see Domain Milestones. |
capsule |
JSON |
Yes, it is. |
The capsule information. |
primary |
JSON |
JSON |
The primary information for the card. |
secondaryData |
JSON |
No |
The extended information for the card. |
extra |
JSON |
No. |
Extended business data. |
isSensitive |
Boolean |
No |
Specifies whether sensitive data, such as amounts or geographical locations, is included. If you do not specify this parameter, no sensitive data is included by default. |
... |
- |
No |
Other business fields. These must be synchronized with OPPO. |
For more information about the AndroidOppoIntelligentIntent parameters for each style template, see the following documents:
The following table describes the structure of AndroidOppoDeleteIntentData.
Parameter |
Required |
Type |
Description |
intentName |
String |
Yes. |
The name of the intent. |
entityIds |
List<String> |
Yes, it is. |
A list of entity IDs. |
serviceId |
JSON |
JSON |
A list of services. |
Sample code
Remotely create a Fluid Cloud instance
PushRequest pushRequest = new PushRequest();
// Basic parameters
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0 indicates the production environment, and 1 indicates the staging environment.
// Set the parameters for remotely creating a Fluid Cloud instance.
String startIntelligentIntent = """
{
"intentName": "Example.Progress",
"identifier": "d71ebd3119877b12ecdb6c4fe96b068e",
"timestamp": 1729485000989,
"serviceId": {
"launcher": "999800001",
"fluidCloud": "999900001"
},
"intentAction": {
"actionStatus": 0
},
"intentEntity": {
"entityName": "TAXI",
"entityId": "A580202509130712",
"milestone": {
"code": 30,
"text": "vehicle_coming"
},
"capsule": {
"leftImg": "https://xxxx",
"rightText": "Picking up",
"legacyImg": "https://xxxx",
"legacyText": "Picking up"
},
"primary": {
"title": [
{
"text": "Driver is on the way",
"color": "#00FF00",
"darkColor": "#00FF00"
}
],
"content": "Yue BDG4251 Gray GAC Aion",
"rightImg": "https://xxxx",
"clickAction": "xxxx",
"miniImg": "xxxx"
},
"secondaryData": {
"type": "PROGRESS",
"progress": 20,
"indicatorImg": "https://xxxx",
"style": "inside",
"nodeLabels": ["Order accepted", "Pickup point", "Destination"]
}
}
}
""";
pushRequest.setAndroidOppoIntelligentIntent(startIntelligentIntent);
// Send the push notification.
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n",
pushResponse.getRequestId(), pushResponse.getMessageId());
Remotely update a Fluid Cloud instance
PushRequest pushRequest = new PushRequest();
// Basic parameters
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0 indicates the production environment, and 1 indicates the staging environment.
// Set the parameters for remotely creating a Fluid Cloud instance.
String updateIntelligentIntent = """
{
"intentName": "Example.Progress",
"identifier": "d71ebd3119877b12ecdb6c4fe96b068e",
"timestamp": 1729485000989,
"serviceId": {
"launcher": "999800001",
"fluidCloud": "999900001"
},
"intentAction": {
"actionStatus": 1
},
"intentEntity": {
"entityName": "TAXI",
"entityId": "A580202509130712",
"milestone": {
"code": 30,
"text": "vehicle_coming"
},
"capsule": {
"leftImg": "https://xxxx",
"rightText": "Boarding",
"legacyImg": "https://xxxx",
"legacyText": "Boarding"
},
"primary": {
"title": [
{
"text": "Driver has arrived at the pickup point",
"color": "#00FF00",
"darkColor": "#00FF00"
}
],
"content": "Yue BDG4251 Gray GAC Aion",
"rightImg": "https://xxxx",
"clickAction": "xxxx",
"miniImg": "xxxx"
},
"secondaryData": {
"type": "PROGRESS",
"progress": 50,
"indicatorImg": "https://xxxx",
"style": "inside",
"nodeLabels": ["Order accepted", "Pickup point", "Destination"]
}
}
}
""";
pushRequest.setAndroidOppoIntelligentIntent(updateIntelligentIntent);
// Send the push notification.
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n",
pushResponse.getRequestId(), pushResponse.getMessageId());
Remotely end a Fluid Cloud instance
Method 1: End the instance using the AndroidOppoIntelligentIntent parameter
PushRequest pushRequest = new PushRequest();
// Basic parameters
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0 indicates the production environment, and 1 indicates the staging environment.
// Set the parameters for remotely creating a Fluid Cloud instance.
String stopIntelligentIntent = """
{
"intentName": "Example.Progress",
"identifier": "d71ebd3119877b12ecdb6c4fe96b068e",
"timestamp": 1729485000989,
"serviceId": {
"launcher": "999800001",
"fluidCloud": "999900001"
},
"intentAction": {
"actionStatus": 2
},
"intentEntity": {
"entityName": "TAXI",
"entityId": "A580202509130712",
"milestone": {
"code": 30,
"text": "vehicle_coming"
},
"capsule": {
"leftImg": "https://xxxx",
"rightText": "Boarding",
"legacyImg": "https://xxxx",
"legacyText": "Boarding"
},
"primary": {
"title": [
{
"text": "Driver has arrived at the pickup point",
"color": "#00FF00",
"darkColor": "#00FF00"
}
],
"content": "Yue BDG4251 Gray GAC Aion",
"rightImg": "https://xxxx",
"clickAction": "xxxx",
"miniImg": "xxxx"
},
"secondaryData": {
"type": "PROGRESS",
"progress": 50,
"indicatorImg": "https://xxxx",
"style": "inside",
"nodeLabels": ["Order accepted", "Pickup point", "Destination"]
}
}
}
""";
pushRequest.setAndroidOppoIntelligentIntent(stopIntelligentIntent);
// Send the push notification.
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n",
pushResponse.getRequestId(), pushResponse.getMessageId());
Method 2: End the instance using the AndroidOppoDeleteIntentData parameter
PushRequest pushRequest = new PushRequest();
// Basic parameters
pushRequest.setAppKey(appKey);
pushRequest.setPushType("NOTICE");
pushRequest.setDeviceType("ANDROID");
pushRequest.setTarget(target);
pushRequest.setTargetValue(targetValue);
pushRequest.setAndroidTargetUserType(1); // 0 indicates the production environment, and 1 indicates the staging environment.
// Set the parameters for remotely creating a Fluid Cloud instance.
String stopData = """
{
"intentName": "Example.Progress",
"entityIds": [
"A580202509130712"
],
"serviceId": {
"launcher": "999800001",
"fluidCloud": "999900001"
}
}
""";
pushRequest.setAndroidOppoDeleteIntentData(stopData);
// Send the push notification.
PushResponse pushResponse = client.getAcsResponse(pushRequest);
System.out.printf("RequestId: %s, MessageId: %s\n",
pushResponse.getRequestId(), pushResponse.getMessageId());
Fluid Cloud limits
Fluid Cloud is supported on OPPO phones running ColorOS 15 and later. You must set up a staging environment on the client. For more information, see Environment setup.
Different entityName values have different card dismissal delays, which define the scenario exit time. The card is dismissed if no new data is pushed for the same order within this time. When the card is dismissed, all its entry points and the Breeno suggestion card disappear. The Fluid Cloud capsule has a system-imposed limit. On ColorOS 15, it is displayed for a maximum of 5 minutes, though this may vary on different OS versions, and is not affected by the card dismissal delay. For more information, see Domain Milestones.
Troubleshooting
Failed to create a Fluid Cloud instance
Check if the device is running ColorOS 15 or later.
Check if the intent sharing feature is enabled in the system. For more information, see Query switch.
Check if a staging environment is set up on the client. For more information, see Environment setup.
Use the message ID and device ID to check the Fluid Cloud push link on the Troubleshoot Message page of the troubleshooting tool in the Mobile Push console.
Failed to update or end a Fluid Cloud instance
Check whether the
entityIdin theAndroidOppoIntelligentIntentorAndroidOppoDeleteIntentDataparameter is the same as theentityIdused when the Fluid Cloud instance was created.Use the message ID and device ID to check the Fluid Cloud push link on the Troubleshoot Message page of the troubleshooting tool in the Mobile Push console.