blob: a9ad7605dfe4a9faa27128208f419b4c4289835a [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 'package:fidl_fuchsia_tictactoe/fidl_async.dart';
import 'package:flutter/material.dart';
import 'package:lib.app.dart/app.dart';
import 'package:lib.app.dart/logging.dart';
import 'package:lib.app_driver.dart/module_driver.dart';
import 'package:lib.proposal.dart/proposal.dart';
import 'package:lib.widgets/modular.dart';
import 'package:tictactoe_common/common.dart';
import 'src/model/tictactoe_model.dart';
import 'src/widget/tictactoe_board.dart';
const String gameTrackerAgentUrl = 'game_tracker_agent';
const String scoreBoardModUrl = 'tictactoe_scoreboard_mod';
const int suggestionColor = 0xFFA5A700;
void main() {
setupLogger(name: 'tictactoe game board');
// The ModuleDriver is a dart-idomatic interface 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));
Future<GameTracker> gameTracker = _createGameTracker(moduleDriver);
TicTacToeModel model = new TicTacToeModel(
winListener: (gameState) async =>
_recordWinner(await gameTracker, gameState),
);
_proposeScore(StartupContext.fromStartupInfo(), moduleDriver);
runApp(
MaterialApp(
home: Material(
child: ScopedModel<TicTacToeModel>(
model: model,
child: new TicTacToeBoard(),
),
),
),
);
}
// 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),
);
}
void _recordWinner(
GameTracker gameTracker,
GameState gameState,
) async {
try {
if (gameState == GameState.xWin) {
await gameTracker.recordWin(Player.x);
} else if (gameState == GameState.oWin) {
await gameTracker.recordWin(Player.o);
}
// ignore: avoid_catches_without_on_clauses
} catch (error, stackTrace) {
log.severe('Error recording win', error, stackTrace);
}
}
Future<void> _proposeScore(
StartupContext startupContext, ModuleDriver moduleDriver) async { // ignore: deprecated_member_use
final storyId = await moduleDriver.getStoryId();
final Intent intent = Intent(handler: scoreBoardModUrl);
final AddMod addMod = AddMod(
modName: ['ScoreBoard'],
surfaceRelation: const SurfaceRelation(
arrangement: SurfaceArrangement.copresent,
dependency: SurfaceDependency.dependent,
emphasis: 0.3,
),
intent: intent,
// This parameter is the parent module. In our case, it would be
// game board mod. We would use 'root' to denote that.
surfaceParentModName: ['root'],
);
final proposalBuilder =
ProposalBuilder(id: 'showScore', headline: 'Show Score')
..storyName = storyId
..color = suggestionColor
..addStoryAffinity(storyId)
..addStoryCommand(StoryCommand.withAddMod(addMod));
final IntelligenceServicesProxy intelligenceServices =
new IntelligenceServicesProxy();
connectToService(
startupContext.environmentServices, intelligenceServices.ctrl);
final ProposalPublisherProxy proposalPublisher = ProposalPublisherProxy();
intelligenceServices.getProposalPublisher(proposalPublisher.ctrl.request());
proposalPublisher.propose(await proposalBuilder.build());
}