SyncSlides: Using new discovery API

MultiPart: 2/2

Change-Id: I2b1457740df62a1cd0ada1c3c7ede46373429de7
diff --git a/dart/lib/discovery/client.dart b/dart/lib/discovery/client.dart
index b5c8ecd..cf3d7dc 100644
--- a/dart/lib/discovery/client.dart
+++ b/dart/lib/discovery/client.dart
@@ -8,6 +8,8 @@
 import 'package:logging/logging.dart';
 import 'package:v23discovery/discovery.dart' as discovery;
 
+export 'package:v23discovery/discovery.dart' show UpdateType;
+
 import '../models/all.dart' as model;
 
 final Logger log = new Logger('discovery/client');
@@ -58,18 +60,12 @@
   _advertisers.remove(presentationId);
 }
 
-// TODO(aghassemi): Remove use once
-// https://github.com/vanadium/issues/issues/1071 is resolved
-// Currently we need to keep this mapping since discovery's lost event only
-// contains an auto generated instanceId which we need to map back to presentationId.
-Map<String, String> instanceIdToPresentationIdMap = new Map();
-
 // Transforms a stream of discovery services to PresentationAdvertisement model objects.
-StreamTransformer toPresentation = new StreamTransformer.fromHandlers(
-    handleData:
-        (discovery.Service s, EventSink<model.PresentationAdvertisement> sink) {
+StreamTransformer toPresentationUpdate = new StreamTransformer.fromHandlers(
+    handleData: (discovery.Update u, EventSink<PresentationUpdate> sink) {
+  discovery.Service s = u.service;
+
   String key = s.attrs['presentationid'];
-  instanceIdToPresentationIdMap[s.instanceId] = key;
   log.info('Found presentation ${s.attrs['name']} under $key.');
   // Ignore our own advertised services.
   if (_advertisers.containsKey(key)) {
@@ -85,27 +81,17 @@
       new model.PresentationAdvertisement(
           key, deck, syncgroupName, thumbnailSyncgroupName);
 
-  sink.add(presentation);
-});
-
-// Transforms a stream of instanceIds to presentationIds.
-StreamTransformer toPresentationId = new StreamTransformer.fromHandlers(
-    handleData: (String instanceId, EventSink<String> sink) {
-  String presentationId = instanceIdToPresentationIdMap[instanceId];
-  sink.add(presentationId);
+  sink.add(new PresentationUpdate._internal(presentation, u.updateType));
 });
 
 Future<PresentationScanner> scan() async {
-  if (_scanner != null) {
-    return _scanner;
-  }
   var query = 'v.InterfaceName = "$_presentationInterfaceName"';
   _scanner = await _discoveryClient.scan(query);
 
   log.info('Scan started.');
+
   return new PresentationScanner._internal(
-      _scanner.onFound.transform(toPresentation),
-      _scanner.onLost.transform(toPresentationId));
+      _scanner.onUpdate.transform(toPresentationUpdate));
 }
 
 Future stopScan() async {
@@ -117,8 +103,13 @@
   _scanner = null;
 }
 
+class PresentationUpdate {
+  model.PresentationAdvertisement presentation;
+  discovery.UpdateType updateType;
+  PresentationUpdate._internal(this.presentation, this.updateType);
+}
+
 class PresentationScanner {
-  Stream<model.PresentationAdvertisement> onFound;
-  Stream<String> onLost;
-  PresentationScanner._internal(this.onFound, this.onLost);
+  Stream<PresentationUpdate> onUpdate;
+  PresentationScanner._internal(this.onUpdate);
 }
diff --git a/dart/lib/stores/syncbase/store.dart b/dart/lib/stores/syncbase/store.dart
index 567bac5..7825e5b 100644
--- a/dart/lib/stores/syncbase/store.dart
+++ b/dart/lib/stores/syncbase/store.dart
@@ -78,26 +78,28 @@
   Future _startScanningForPresentations() async {
     discovery.PresentationScanner scanner = await discovery.scan();
 
-    scanner.onFound.listen((model.PresentationAdvertisement newP) {
-      _state._presentationsAdvertisements[newP.key] = newP;
-      _triggerStateChange();
+    scanner.onUpdate.listen((discovery.PresentationUpdate update) {
+      if (update.updateType == discovery.UpdateType.found) {
+        _state._presentationsAdvertisements[update.presentation.key] =
+            update.presentation;
+        _triggerStateChange();
 
-      // TODO(aghassemi): Use a simple RPC instead of a syncgroup to get the thumbnail.
-      // See https://github.com/vanadium/syncslides/issues/17
-      // Join the thumbnail syncgroup to get the thumbnail blob.
-      String sgName = newP.thumbnailSyncgroupName;
-      sb.joinSyncgroup(sgName);
-    });
-
-    scanner.onLost.listen((String presentationId) {
-      _state._presentationsAdvertisements.remove(presentationId);
-      _state._decks.values.forEach((_DeckState deck) {
-        if (deck.presentation != null &&
-            deck.presentation.key == presentationId) {
-          deck._isPresenting = false;
-        }
-      });
-      _triggerStateChange();
+        // TODO(aghassemi): Use a simple RPC instead of a syncgroup to get the thumbnail.
+        // See https://github.com/vanadium/syncslides/issues/17
+        // Join the thumbnail syncgroup to get the thumbnail blob.
+        String sgName = update.presentation.thumbnailSyncgroupName;
+        sb.joinSyncgroup(sgName);
+      } else if (update.updateType == discovery.UpdateType.lost) {
+        String presentationId = update.presentation.key;
+        _state._presentationsAdvertisements.remove(presentationId);
+        _state._decks.values.forEach((_DeckState deck) {
+          if (deck.presentation != null &&
+              deck.presentation.key == presentationId) {
+            deck._isPresenting = false;
+          }
+        });
+        _triggerStateChange();
+      }
     });
   }
 
diff --git a/dart/pubspec.lock b/dart/pubspec.lock
index 347d63f..5d48c44 100644
--- a/dart/pubspec.lock
+++ b/dart/pubspec.lock
@@ -258,7 +258,7 @@
   v23discovery:
     description: v23discovery
     source: hosted
-    version: "0.0.10"
+    version: "0.0.11"
   vector_math:
     description: vector_math
     source: hosted
diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml
index 9e9b207..e718cfd 100644
--- a/dart/pubspec.yaml
+++ b/dart/pubspec.yaml
@@ -6,7 +6,7 @@
   logging: ">=0.11.2 <0.12.0"
   mojo_services: ">=0.4.5 <0.5.0"
   syncbase: ">=0.0.27 <0.1.0"
-  v23discovery: ">=0.0.10 < 0.1.0"
+  v23discovery: ">=0.0.11 < 0.1.0"
   uuid: ">=0.5.0 <0.6.0"
 dev_dependencies:
   flutter_tools: