blob: 8db8b1cf26b4e1b5db304122a5480ac079e52627 [file] [log] [blame]
// Copyright 2017 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 'package:fidl_fuchsia_netstack/fidl_async.dart';
import 'package:flutter/material.dart';
import 'package:fuchsia_logger/logger.dart';
import 'package:fuchsia_services/services.dart';
import 'package:lib.base_shell/base_shell_widget.dart';
import 'package:lib.base_shell/netstack_model.dart';
import 'package:lib.widgets/application.dart';
import 'package:lib.widgets/model.dart';
import 'package:meta/meta.dart';
import 'package:fidl_fuchsia_sys/fidl_async.dart';
import 'authentication_overlay.dart';
import 'authentication_overlay_model.dart';
import 'authentication_ui_context_impl.dart';
import 'user_picker_base_shell_model.dart';
import 'user_picker_base_shell_screen.dart';
const double _kMousePointerElevation = 800.0;
const double _kIndicatorElevation = _kMousePointerElevation - 1.0;
/// The main base shell widget.
BaseShellWidget<UserPickerBaseShellModel> _baseShellWidget;
void main() {
setupLogger(name: 'userpicker_base_shell');
StartupContext startupContext = StartupContext.fromStartupInfo();
final launcherProxy = LauncherProxy();
startupContext.incoming.connectToService(launcherProxy);
NetstackProxy netstackProxy = NetstackProxy();
startupContext.incoming.connectToService(netstackProxy);
NetstackModel netstackModel = NetstackModel(netstack: netstackProxy)..start();
_OverlayModel wifiInfoOverlayModel = _OverlayModel();
final AuthenticationOverlayModel authModel = AuthenticationOverlayModel();
UserPickerBaseShellModel userPickerBaseShellModel = UserPickerBaseShellModel(
onBaseShellStopped: () {
netstackProxy.ctrl.close();
netstackModel.dispose();
},
onLogin: () {
wifiInfoOverlayModel.showing = false;
},
onWifiTapped: () {
wifiInfoOverlayModel.showing = !wifiInfoOverlayModel.showing;
},
);
Widget mainWidget = Stack(
fit: StackFit.passthrough,
children: <Widget>[
UserPickerBaseShellScreen(
launcher: launcherProxy,
),
ScopedModel<AuthenticationOverlayModel>(
model: authModel,
child: AuthenticationOverlay(),
),
],
);
Widget app = mainWidget;
List<OverlayEntry> overlays = <OverlayEntry>[
OverlayEntry(
builder: (BuildContext context) => MediaQuery(
data: MediaQueryData(),
child: FocusScope(
node: FocusScopeNode(),
autofocus: true,
child: app,
),
),
),
OverlayEntry(
builder: (BuildContext context) => ScopedModel<_OverlayModel>(
model: wifiInfoOverlayModel,
child: _WifiInfo(
wifiWidget: ApplicationWidget(
url:
'fuchsia-pkg://fuchsia.com/wifi_settings#meta/wifi_settings.cmx',
launcher: launcherProxy,
),
),
),
),
];
_baseShellWidget = BaseShellWidget<UserPickerBaseShellModel>(
startupContext: startupContext,
baseShellModel: userPickerBaseShellModel,
authenticationUiContext: AuthenticationUiContextImpl(
onStartOverlay: authModel.onStartOverlay,
onStopOverlay: authModel.onStopOverlay),
child: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) =>
(constraints.biggest == Size.zero)
? const Offstage()
: ScopedModel<NetstackModel>(
model: netstackModel,
child: Overlay(initialEntries: overlays),
),
),
);
runApp(_baseShellWidget);
_baseShellWidget.advertise();
}
class _WifiInfo extends StatelessWidget {
final Widget wifiWidget;
const _WifiInfo({@required this.wifiWidget}) : assert(wifiWidget != null);
@override
Widget build(BuildContext context) => ScopedModelDescendant<_OverlayModel>(
builder: (
BuildContext context,
Widget child,
_OverlayModel model,
) =>
Offstage(
offstage: !model.showing,
child: Stack(
children: <Widget>[
Listener(
behavior: HitTestBehavior.opaque,
onPointerDown: (PointerDownEvent event) {
model.showing = false;
},
),
Center(
child: FractionallySizedBox(
widthFactor: 0.75,
heightFactor: 0.75,
child: Container(
margin: EdgeInsets.all(8.0),
child: PhysicalModel(
color: Colors.grey[900],
elevation: _kIndicatorElevation,
borderRadius: BorderRadius.circular(8.0),
child: wifiWidget,
),
),
),
),
],
),
),
);
}
class _OverlayModel extends Model {
bool _showing = false;
set showing(bool showing) {
if (_showing != showing) {
_showing = showing;
notifyListeners();
}
}
bool get showing => _showing;
}