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

#ifndef FLUTTER_LIB_UI_SEMANTICS_SEMANTICS_UPDATE_H_
#define FLUTTER_LIB_UI_SEMANTICS_SEMANTICS_UPDATE_H_

#include "flutter/lib/ui/dart_wrapper.h"
#include "flutter/lib/ui/semantics/custom_accessibility_action.h"
#include "flutter/lib/ui/semantics/semantics_node.h"

namespace tonic {
class DartLibraryNatives;
}  // namespace tonic

namespace flutter {

class SemanticsUpdate : public RefCountedDartWrappable<SemanticsUpdate> {
  DEFINE_WRAPPERTYPEINFO();
  FML_FRIEND_MAKE_REF_COUNTED(SemanticsUpdate);

 public:
  ~SemanticsUpdate() override;
  static void create(Dart_Handle semantics_update_handle,
                     SemanticsNodeUpdates nodes,
                     CustomAccessibilityActionUpdates actions);

  SemanticsNodeUpdates takeNodes();

  CustomAccessibilityActionUpdates takeActions();

  void dispose();

  static void RegisterNatives(tonic::DartLibraryNatives* natives);

 private:
  explicit SemanticsUpdate(SemanticsNodeUpdates nodes,
                           CustomAccessibilityActionUpdates updates);

  SemanticsNodeUpdates nodes_;
  CustomAccessibilityActionUpdates actions_;
};

}  // namespace flutter

#endif  // FLUTTER_LIB_UI_SEMANTICS_SEMANTICS_UPDATE_H_
