[SetUi] Add Accessibility Settings App

Tests: Manual
Change-Id: Ib1eaf54367599f2f063018ee72093b16b41ef736
diff --git a/bin/accessibility_settings/BUILD.gn b/bin/accessibility_settings/BUILD.gn
new file mode 100644
index 0000000..e526334
--- /dev/null
+++ b/bin/accessibility_settings/BUILD.gn
@@ -0,0 +1,30 @@
+# 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("//topaz/runtime/flutter_runner/flutter_app.gni")
+
+flutter_app("accessibility_settings") {
+  main_dart = "lib/main.dart"
+
+  manifest = "pubspec.yaml"
+
+  sources = [
+    "src/accessibility_settings.dart",
+    "src/accessibility_settings_model.dart",
+  ]
+
+  meta = [
+    {
+      path = rebase_path("meta/accessibility_settings.cmx")
+      dest = "accessibility_settings.cmx"
+    },
+  ]
+
+  deps = [
+    "//third_party/dart-pkg/git/flutter/packages/flutter",
+    "//topaz/lib/settings:lib.settings",
+    "//topaz/public/dart/widgets:lib.widgets",
+    "//topaz/public/lib/app/dart",
+  ]
+}
diff --git a/bin/accessibility_settings/analysis_options.yaml b/bin/accessibility_settings/analysis_options.yaml
new file mode 100644
index 0000000..5ad6dd5
--- /dev/null
+++ b/bin/accessibility_settings/analysis_options.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+include: ../analysis_options.yaml
diff --git a/bin/accessibility_settings/lib/main.dart b/bin/accessibility_settings/lib/main.dart
new file mode 100644
index 0000000..be935d2
--- /dev/null
+++ b/bin/accessibility_settings/lib/main.dart
@@ -0,0 +1,20 @@
+// 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 'package:flutter/material.dart';
+import 'package:lib.widgets/model.dart';
+
+import 'src/accessibility_settings.dart';
+import 'src/accessibility_settings_model.dart';
+
+void main() {
+  final AccessibilitySettingsModel model = AccessibilitySettingsModel();
+  final Providers providers = Providers()..provideValue(model);
+  final Widget app = ProviderNode(
+    providers: providers,
+    child: MaterialApp(home: AccessibilitySettings()),
+  );
+
+  runApp(app);
+}
diff --git a/bin/accessibility_settings/lib/src/accessibility_settings.dart b/bin/accessibility_settings/lib/src/accessibility_settings.dart
new file mode 100644
index 0000000..9aefc57
--- /dev/null
+++ b/bin/accessibility_settings/lib/src/accessibility_settings.dart
@@ -0,0 +1,69 @@
+// 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 'package:flutter/widgets.dart';
+import 'package:flutter/material.dart';
+import 'package:lib.settings/widgets.dart';
+import 'package:lib.widgets/model.dart';
+
+import 'accessibility_settings_model.dart';
+
+class AccessibilitySettings extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) => Provide<AccessibilitySettingsModel>(
+          builder: (
+        BuildContext context,
+        Widget child,
+        AccessibilitySettingsModel model,
+      ) =>
+              LayoutBuilder(
+                  builder: (BuildContext context, BoxConstraints constraints) =>
+                      Material(
+                          child: _buildAccessibilitySettingPage(
+                              // TODO: Replace the scale value with a proper solution.
+                              constraints.maxHeight > 360.0 ? 1.0 : 0.5,
+                              model))));
+
+  SettingsPage _buildAccessibilitySettingPage(
+      double scale, AccessibilitySettingsModel model) {
+    final screenReaderSetting = SettingsSwitchTile(
+      scale: scale,
+      state: model.screenReaderEnabled.value,
+      text: 'Screen Reader',
+      onSwitch: (value) => model.screenReaderEnabled.value = value,
+    );
+
+    final colorInversionSetting = SettingsSwitchTile(
+      scale: scale,
+      state: model.colorInversionEnabled.value,
+      text: 'Color Inversion',
+      onSwitch: (value) => model.colorInversionEnabled.value = value,
+    );
+
+    final magnificationSetting = SettingsSwitchTile(
+      scale: scale,
+      state: model.magnificationEnabled.value,
+      text: 'Magnification',
+      onSwitch: (value) => model.magnificationEnabled.value = value,
+    );
+
+    final magnificationZoomSetting = SettingsText(
+        scale: scale,
+        text: 'Magnification zoom: ${model.magnificationZoom.value}%');
+
+    return SettingsPage(scale: scale, sections: [
+      SettingsSection(
+          title: 'Accessibility Settings',
+          scale: scale,
+          child: SettingsItemList(
+            items: [
+              screenReaderSetting,
+              colorInversionSetting,
+              magnificationSetting,
+              magnificationZoomSetting
+            ],
+          ))
+    ]);
+  }
+}
diff --git a/bin/accessibility_settings/lib/src/accessibility_settings_model.dart b/bin/accessibility_settings/lib/src/accessibility_settings_model.dart
new file mode 100644
index 0000000..0a78670
--- /dev/null
+++ b/bin/accessibility_settings/lib/src/accessibility_settings_model.dart
@@ -0,0 +1,23 @@
+// 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 'package:flutter/foundation.dart';
+import 'package:lib.widgets/model.dart';
+
+class AccessibilitySettingsModel extends Model {
+  final ValueNotifier<bool> screenReaderEnabled = ValueNotifier<bool>(false);
+
+  final ValueNotifier<bool> colorInversionEnabled = ValueNotifier<bool>(false);
+
+  final ValueNotifier<bool> magnificationEnabled = ValueNotifier<bool>(false);
+
+  final ValueNotifier<int> magnificationZoom = ValueNotifier<int>(100);
+
+  AccessibilitySettingsModel() {
+    screenReaderEnabled.addListener(notifyListeners);
+    colorInversionEnabled.addListener(notifyListeners);
+    magnificationEnabled.addListener(notifyListeners);
+    magnificationZoom.addListener(notifyListeners);
+  }
+}
diff --git a/bin/accessibility_settings/meta/accessibility_settings.cmx b/bin/accessibility_settings/meta/accessibility_settings.cmx
new file mode 100644
index 0000000..8198d4a
--- /dev/null
+++ b/bin/accessibility_settings/meta/accessibility_settings.cmx
@@ -0,0 +1,15 @@
+{
+    "program": {
+        "data": "data/accessibility_settings"
+    },
+    "sandbox": {
+        "services": [
+            "fuchsia.fonts.Provider",
+            "fuchsia.modular.Clipboard",
+            "fuchsia.modular.ContextWriter",
+            "fuchsia.sys.Environment",
+            "fuchsia.ui.scenic.Scenic",
+            "fuchsia.ui.viewsv1.ViewManager"
+        ]
+    }
+}
diff --git a/bin/accessibility_settings/pubspec.yaml b/bin/accessibility_settings/pubspec.yaml
new file mode 100644
index 0000000..e14b110
--- /dev/null
+++ b/bin/accessibility_settings/pubspec.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+name: accessibility_settings
\ No newline at end of file
diff --git a/packages/prod/accessibility_settings b/packages/prod/accessibility_settings
new file mode 100644
index 0000000..c129d43
--- /dev/null
+++ b/packages/prod/accessibility_settings
@@ -0,0 +1,5 @@
+{
+    "packages": [
+        "//topaz/bin/accessibility_settings"
+    ]
+}
diff --git a/packages/prod/all b/packages/prod/all
index a0edd90..085daa6 100644
--- a/packages/prod/all
+++ b/packages/prod/all
@@ -1,5 +1,6 @@
 {
     "imports": [
+        "topaz/packages/prod/accessibility_settings",
         "topaz/packages/prod/bluetooth_settings",
         "topaz/packages/prod/chromium",
         "topaz/packages/prod/device_settings",