// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This example makes use of mojo:camera which is available only when
// running on Android. It repeatedly captures camera video frame images
// and displays it in a mojo view.
//
// Example usage:
//   pub get
//   pub run flutter build
//   pub run flutter run_mojo --mojo-path=../../.. --android

import 'dart:math' as math;
import 'dart:typed_data';
import 'dart:ui' as ui;

import 'package:flutter/painting.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:mojo_services/mojo/camera.mojom.dart';

ui.Image image = null;
final CameraServiceProxy camera = new CameraServiceProxy.unbound();

ui.Picture paint(ui.Rect paintBounds) {
  ui.PictureRecorder recorder = new ui.PictureRecorder();
  if (image != null) {
    ui.Canvas canvas = new ui.Canvas(recorder, paintBounds);
    canvas.translate(paintBounds.width / 2.0, paintBounds.height / 2.0);
    ui.Paint paint = new Paint()..color = const Color.fromARGB(255, 0, 255, 0);
    // TODO(alhaad): Use orientation information from Flutter.
    if (ui.view.width < ui.view.height)
      canvas.rotate(math.PI / 2);
    canvas.drawImage(
        image, new Point(-image.width / 2.0, -image.height / 2.0), paint);
  }
  return recorder.endRecording();
}

ui.Scene composite(ui.Picture picture, ui.Rect paintBounds) {
  final double devicePixelRatio = ui.view.devicePixelRatio;
  ui.Rect sceneBounds = new ui.Rect.fromLTWH(0.0, 0.0,
      ui.view.width * devicePixelRatio, ui.view.height * devicePixelRatio);
  Float64List deviceTransform = new Float64List(16)
    ..[0] = devicePixelRatio
    ..[5] = devicePixelRatio
    ..[10] = 1.0
    ..[15] = 1.0;
  ui.SceneBuilder sceneBuilder = new ui.SceneBuilder(sceneBounds)
    ..pushTransform(deviceTransform)
    ..addPicture(ui.Offset.zero, picture, paintBounds)
    ..pop();
  return sceneBuilder.build();
}

void beginFrame(double timeStamp) {
  Rect paintBounds = new Rect.fromLTWH(0.0, 0.0, ui.view.width, ui.view.height);
  Picture picture = paint(paintBounds);
  ui.Scene scene = composite(picture, paintBounds);
  ui.view.scene = scene;
}

void drawNextPhoto() {
  var future = camera.ptr.getLatestFrame();
  future.then((response) {
    if (response.content == null) {
      drawNextPhoto();
      return;
    }

    final imageFrame = decodeImageFromDataPipe(response.content);
    imageFrame.then((frame) {
      if (frame != null) {
        image = frame;
        ui.view.scheduleFrame();
        drawNextPhoto();
      }
    });
  });
}

void main() {
  embedder.connectToService("mojo:camera", camera);
  drawNextPhoto();
  ui.view.setFrameCallback(beginFrame);
}
