blob: 72890ac13c1a8cf196e3135cc7df75bb8005b8d7 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:math' show Random;
import 'dart:convert' show UTF8;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show embedder;
import 'package:syncbase/syncbase_client.dart' as sb;
// TODO(aghassemi) Temporary main.
void main() {
runApp(new MaterialApp(
title: "Flutter & Syncbase Demo",
routes: {'/': (RouteArguments args) => new FlutterSyncbaseDemo()}));
}
class FlutterSyncbaseDemoState extends State<FlutterSyncbaseDemo> {
List<String> activityLog = [];
void addActivityLogItem(String item) {
setState(() {
activityLog.add(item);
});
}
Widget build(BuildContext context) {
return new Scaffold(
toolBar: new ToolBar(center: new Text("Flutter & Syncbase Demo")),
body: new Material(child: new Text(activityLog.join("\n"))));
}
}
class FlutterSyncbaseDemo extends StatefulComponent {
FlutterSyncbaseDemoState _state = new FlutterSyncbaseDemoState();
FlutterSyncbaseDemo() {
initSyncbase(_state);
}
FlutterSyncbaseDemoState createState() {
return _state;
}
}
bool initialized = false;
initSyncbase(FlutterSyncbaseDemoState state) async {
if (initialized) {
return;
}
initialized = true;
sb.SyncbaseClient c = new sb.SyncbaseClient(embedder.connectToService,
'https://syncslides.mojo.v.io/packages/syncbase/mojo_services/android/syncbase_server.mojo');
sb.SyncbaseApp sbApp = await createApp(c, 'testapp');
sb.SyncbaseNoSqlDatabase sbDb = await createDb(sbApp, 'testdb');
sb.SyncbaseTable sbTable = await createTable(sbDb, 'testtable');
startWatch(sbDb, sbTable, state);
startPuts(sbTable, state);
// Wait forever.
await new Completer().future;
// Looks like forever came and went. Might as well clean up after
// ourselves...
await c.close();
}
startWatch(db, table, state) async {
var s = db.watch(table.name, '', await db.getResumeMarker());
await for (var change in s) {
var activity =
'GOT CHANGE: ${change.rowKey} - ${UTF8.decode(change.valueBytes)}';
state.addActivityLogItem(activity);
print(activity);
}
}
var r = new Random();
startPuts(table, state) async {
var key = r.nextInt(100000000);
var val = r.nextInt(100000000);
var row = table.row('k-$key');
var activity = 'PUTTING k-$key';
state.addActivityLogItem(activity);
print(activity);
await row.put(UTF8.encode('v-$val'));
await new Future.delayed(new Duration(seconds: 2));
startPuts(table, state);
}
String openPermsJson =
'{"Admin":{"In":["..."]},"Write":{"In":["..."]},"Read":{"In":["..."]},"Resolve":{"In":["..."]},"Debug":{"In":["..."]}}';
sb.Perms openPerms = sb.SyncbaseClient.perms(openPermsJson);
Future<sb.SyncbaseApp> createApp(sb.SyncbaseClient c, String name) async {
var app = c.app(name);
var exists = await app.exists();
if (exists) {
print('app exists, rolling with it');
return app;
}
print('app does not exist, creating it');
await app.create(openPerms);
return app;
}
Future<sb.SyncbaseNoSqlDatabase> createDb(
sb.SyncbaseApp app, String name) async {
var db = app.noSqlDatabase(name);
var exists = await db.exists();
if (exists) {
print('db exists, rolling with it');
return db;
}
print('db does not exist, creating it');
await db.create(openPerms);
return db;
}
Future<sb.SyncbaseTable> createTable(
sb.SyncbaseNoSqlDatabase db, String name) async {
var table = db.table(name);
var exists = await table.exists();
if (exists) {
print('table exists, rolling with it');
return table;
}
print('table does not exist, creating it');
await table.create(openPerms);
return table;
}