// Copyright 2014 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.

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

import 'binary_messenger.dart';
import 'platform_channel.dart';

/// Sends binary messages to and receives binary messages from platform plugins.
///
/// This class has been deprecated in favor of [defaultBinaryMessenger]. New
/// code should not use [BinaryMessages].
///
/// See also:
///
///  * [BinaryMessenger], the interface which has replaced this class.
///  * [BasicMessageChannel], which provides basic messaging services similar to
///    `BinaryMessages`, but with pluggable message codecs in support of sending
///    strings or semi-structured messages.
///  * [MethodChannel], which provides platform communication using asynchronous
///    method calls.
///  * [EventChannel], which provides platform communication using event streams.
///  * <https://flutter.dev/platform-channels/>
@Deprecated(
  'This class, which was just a collection of static methods, has been '
  'deprecated in favor of BinaryMessenger, and its default implementation, '
  'defaultBinaryMessenger. '
  'This feature was deprecated after v1.6.5.'
)
class BinaryMessages {
  // This class is not meant to be instatiated or extended; this constructor
  // prevents instantiation and extension.
  // ignore: unused_element
  BinaryMessages._();

  /// The messenger which sends the platform messages, not null.
  static final BinaryMessenger _binaryMessenger = defaultBinaryMessenger;

  /// Calls the handler registered for the given channel.
  ///
  /// Typically called by [ServicesBinding] to handle platform messages received
  /// from [Window.onPlatformMessage].
  ///
  /// To register a handler for a given message channel, see [setMessageHandler].
  @Deprecated(
    'Use defaultBinaryMessenger.handlePlatformMessage instead. '
    'This feature was deprecated after v1.6.5.'
  )
  static Future<void> handlePlatformMessage(
    String channel,
    ByteData data,
    ui.PlatformMessageResponseCallback callback,
  ) {
    return _binaryMessenger.handlePlatformMessage(channel, data, callback);
  }

  /// Send a binary message to the platform plugins on the given channel.
  ///
  /// Returns a [Future] which completes to the received response, undecoded, in
  /// binary form.
  @Deprecated(
    'Use defaultBinaryMessenger.send instead. '
    'This feature was deprecated after v1.6.5.'
  )
  static Future<ByteData> send(String channel, ByteData message) {
    return _binaryMessenger.send(channel, message);
  }

  /// Set a callback for receiving messages from the platform plugins on the
  /// given channel, without decoding them.
  ///
  /// The given callback will replace the currently registered callback for that
  /// channel, if any. To remove the handler, pass null as the `handler`
  /// argument.
  ///
  /// The handler's return value, if non-null, is sent as a response, unencoded.
  @Deprecated(
    'Use defaultBinaryMessenger.setMessageHandler instead. '
    'This feature was deprecated after v1.6.5.'
  )
  static void setMessageHandler(String channel, Future<ByteData> handler(ByteData message)) {
    _binaryMessenger.setMessageHandler(channel, handler);
  }

  /// Set a mock callback for intercepting messages from the `send*` methods on
  /// this class, on the given channel, without decoding them.
  ///
  /// The given callback will replace the currently registered mock callback for
  /// that channel, if any. To remove the mock handler, pass null as the
  /// `handler` argument.
  ///
  /// The handler's return value, if non-null, is used as a response, unencoded.
  ///
  /// This is intended for testing. Messages intercepted in this manner are not
  /// sent to platform plugins.
  @Deprecated(
    'Use defaultBinaryMessenger.setMockMessageHandler instead. '
    'This feature was deprecated after v1.6.5.'
  )
  static void setMockMessageHandler(String channel, Future<ByteData> handler(ByteData message)) {
    _binaryMessenger.setMockMessageHandler(channel, handler);
  }
}
