Integrating Clouds &
Humans with Wearable Apps
@_JamesWard
Salesforce.com
Salesforce Wear Developer
Packs
• Six Open Source Developer Packs
developer.salesforce.com/wear
• Android Wear, Google Glass, Pebble, Samsung
Gear, Myo, Nymi
• Getting Started Guides, Sample Apps, and
architecture overviews
Android Wear
• Android-based Wearable SDK
developer.android.com/wear
• Wearables as companions to Android Phones
• Glanceable notifications & interactions
• Phones push to wearables
• Moto360 & LG G
Salesforce Wear Developer
Pack for Android Wear
• Quote Discount Approval Sample
• Native Android Phone App
• Salesforce Mobile Push
• Gradle Build
Sample: Quote Discount Approval
Sales Rep
Discount >= 20%
trigger QuoteApproval on Quote (before insert, before update) {
One beautiful Gradle build does everything (almost)
• Salesforce Metadata Deploy
$ ./gradlew forceMetadataDeploy
• Dependency Management
dependencies {
compile "com.force:SalesforceSDK:2.1.1-3"
compile "com.android.support:support-v4:19.+"
compile files("libs/wearable-preview-support.jar")
}
• Builds & runs the app
$ ./gradlew installDebug
Architecture
• Salesforce
• Quotes on Opportunities
• Approval Workflow: Quote with Discount >= 20% requires approval from
manager
• Trigger on Quote update/insert: creates approval process & sends mobile
push message
• Android Phone App
• Receives push message
• Creates notification on watch
• Handles watch actions (Approve, Reject, Open)
Code Highlights - Trigger
Messaging.PushNotification msg = new Messaging.PushNotification();
!
Map<String, Object> payload = new Map<String, Object>();
payload.put('ownerName', owner.Name);
...
msg.setPayload(payload);
!
String userId = result.actorIds[0];
Set<String> users = new Set<String>();
users.add(userId);
!
msg.send('QuoteDiscountApproval', users);
Code Highlights - Push Receiver
public class QPN implements PushNotificationInterface {
!
@Override
public void onPushMessageReceived(final Bundle bundle) {
!
final QM quoteMessage = new QM(bundle);
!
...
}
!
}
!
!
SalesforceSDKManager.getInstance()
.setPushNotificationReceiver(new QPM(this));
Code Highlights - Wear Notification
WearableNotifications.Builder wearableBuilder = new
WearableNotifications.Builder(mainNotification);
!
wearableBuilder
.addPage(detailNotification)
.addAction(rejectAction);
!
mainNotification
.setContentIntent(openPendingIntent);
!
NotificationManagerCompat.from(context)
.notify(1, wearableBuilder.build());
Code Highlights - Approve or Reject
JSONObject approvalRequest = new JSONObject();
approvalRequest.put("actionType", action);
approvalRequest.put("contextId", workItemId);
approvalRequest.put("comments", comments);
!
JSONArray requests = new JSONArray();
requests.put(approvalRequest);
!
JSONObject json = new JSONObject();
json.put("requests", requests);
!
StringEntity entity = new StringEntity(json.toString(), HTTP.UTF_8);
entity.setContentType("application/json");
!
String url = "/services/data/" + c.getString(R.string.api_version) + "/process/approvals/";
!
final RestRequest restRequest = new RestRequest(RestRequest.RestMethod.POST, url, entity);
!
QuoteDiscountApprovalSetup.client.sendAsync(restRequest,
new RestClient.AsyncRequestCallback() {
@Override
public void onSuccess(RestRequest request, RestResponse result) { }
!
@Override
public void onError(Exception exception) { }
}
);
https://github.com/
developerforce/
WearablePack-AndroidWear

Integrating Clouds & Humans with Wearable Apps

  • 1.
    Integrating Clouds & Humanswith Wearable Apps @_JamesWard Salesforce.com
  • 3.
    Salesforce Wear Developer Packs •Six Open Source Developer Packs developer.salesforce.com/wear • Android Wear, Google Glass, Pebble, Samsung Gear, Myo, Nymi • Getting Started Guides, Sample Apps, and architecture overviews
  • 4.
    Android Wear • Android-basedWearable SDK developer.android.com/wear • Wearables as companions to Android Phones • Glanceable notifications & interactions • Phones push to wearables • Moto360 & LG G
  • 5.
    Salesforce Wear Developer Packfor Android Wear • Quote Discount Approval Sample • Native Android Phone App • Salesforce Mobile Push • Gradle Build
  • 6.
    Sample: Quote DiscountApproval Sales Rep Discount >= 20% trigger QuoteApproval on Quote (before insert, before update) {
  • 7.
    One beautiful Gradlebuild does everything (almost) • Salesforce Metadata Deploy $ ./gradlew forceMetadataDeploy • Dependency Management dependencies { compile "com.force:SalesforceSDK:2.1.1-3" compile "com.android.support:support-v4:19.+" compile files("libs/wearable-preview-support.jar") } • Builds & runs the app $ ./gradlew installDebug
  • 8.
    Architecture • Salesforce • Quoteson Opportunities • Approval Workflow: Quote with Discount >= 20% requires approval from manager • Trigger on Quote update/insert: creates approval process & sends mobile push message • Android Phone App • Receives push message • Creates notification on watch • Handles watch actions (Approve, Reject, Open)
  • 9.
    Code Highlights -Trigger Messaging.PushNotification msg = new Messaging.PushNotification(); ! Map<String, Object> payload = new Map<String, Object>(); payload.put('ownerName', owner.Name); ... msg.setPayload(payload); ! String userId = result.actorIds[0]; Set<String> users = new Set<String>(); users.add(userId); ! msg.send('QuoteDiscountApproval', users);
  • 10.
    Code Highlights -Push Receiver public class QPN implements PushNotificationInterface { ! @Override public void onPushMessageReceived(final Bundle bundle) { ! final QM quoteMessage = new QM(bundle); ! ... } ! } ! ! SalesforceSDKManager.getInstance() .setPushNotificationReceiver(new QPM(this));
  • 11.
    Code Highlights -Wear Notification WearableNotifications.Builder wearableBuilder = new WearableNotifications.Builder(mainNotification); ! wearableBuilder .addPage(detailNotification) .addAction(rejectAction); ! mainNotification .setContentIntent(openPendingIntent); ! NotificationManagerCompat.from(context) .notify(1, wearableBuilder.build());
  • 12.
    Code Highlights -Approve or Reject JSONObject approvalRequest = new JSONObject(); approvalRequest.put("actionType", action); approvalRequest.put("contextId", workItemId); approvalRequest.put("comments", comments); ! JSONArray requests = new JSONArray(); requests.put(approvalRequest); ! JSONObject json = new JSONObject(); json.put("requests", requests); ! StringEntity entity = new StringEntity(json.toString(), HTTP.UTF_8); entity.setContentType("application/json"); ! String url = "/services/data/" + c.getString(R.string.api_version) + "/process/approvals/"; ! final RestRequest restRequest = new RestRequest(RestRequest.RestMethod.POST, url, entity); ! QuoteDiscountApprovalSetup.client.sendAsync(restRequest, new RestClient.AsyncRequestCallback() { @Override public void onSuccess(RestRequest request, RestResponse result) { } ! @Override public void onError(Exception exception) { } } );
  • 13.