blob: 7bc065062d98e7f601f2581e09f5dd84aeb74daa [file] [log] [blame]
import 'dart:async';
import 'dart:convert' show utf8;
import 'dart:typed_data';
import 'package:fidl_fuchsia_tictactoe/fidl_async.dart';
import 'package:flutter/material.dart';
import 'package:lib.app.dart/logging.dart';
import 'package:lib.app_driver.dart/module_driver.dart';
import 'package:lib.widgets/modular.dart';
import 'package:tictactoe_common/common.dart';
import 'src/model/scoreboard_model.dart';
import 'src/widget/scoreboard_widget.dart';
const String scoreQueueName = 'score_name';
const String gameTrackerAgentUrl = 'game_tracker_agent';
void main() {
setupLogger(name: 'score card mod');
// The ModuleDriver is a dart-idomatic interfacer to the Fuchsia system.
//
// TODO: Refactor this class to use the new SDK instead of deprecated API
// ignore: deprecated_member_use
ModuleDriver moduleDriver = new ModuleDriver()
..start().then((_) => trace('module is ready')).catchError(
(error, stackTrace) =>
log.severe('Error starting module driver.', error, stackTrace));
ScoreBoardModel model = ScoreBoardModel();
ScoreCodec scoreCodec = ScoreCodec();
Future<GameTracker> futureGameTracker = _createGameTracker(moduleDriver);
// Set up message queue to get score updates from.
Future<String> messageQueueToken = moduleDriver
.createMessageQueue(
name: scoreQueueName,
onMessage: (Uint8List data, void ack()) {
Score score = scoreCodec.decode(utf8.decode(data));
if (score != null) {
model.setScore(score.xScore, score.oScore);
}
ack();
},
onConnectionError: (code, errMsg) {
log.severe('Message Queue down: $errMsg');
},
)
.catchError(
(error, stackTrace) =>
log.severe('Error creating message queue', error, stackTrace),
);
// Subcribe to score updates.
futureGameTracker.then(
(gameTracker) async {
return gameTracker.subscribeToScore(await messageQueueToken);
},
).catchError((error, stackTrace) =>
log.severe('Error subscribing to score', error, stackTrace));
// Terminate connection to tracker service when the mod terminates.
moduleDriver.addOnTerminateHandler(
() => futureGameTracker.then((gameTracker) async {
await gameTracker
.unsubscribeFromScore(await messageQueueToken)
.catchError((error, stackTrace) => log.severe(
'Error unsubscribing from score', error, stackTrace));
}),
);
runApp(
MaterialApp(
home: Material(
child: ScopedModel<ScoreBoardModel>(
model: model,
child: ScoreBoardWidget(),
),
),
),
);
}
// TODO: Refactor this class to use the new SDK instead of deprecated API
// ignore: deprecated_member_use
Future<GameTracker> _createGameTracker(ModuleDriver moduleDriver) async {
GameTrackerProxy gameTrackerProxy = new GameTrackerProxy();
return moduleDriver
.connectToAgentServiceWithAsyncProxy(
gameTrackerAgentUrl,
gameTrackerProxy,
)
.then((_) => gameTrackerProxy)
.catchError(
(error, stackTrace) =>
log.severe('Error constructing GameTracker.', error, stackTrace),
);
}