blob: 2a8413db1931b650de8110d2950da749fa2eb722 [file] [log] [blame]
// 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.
/// @docImport 'dart:ui';
///
/// @docImport 'package:flutter/widgets.dart';
///
/// @docImport 'text_input.dart';
library;
import 'package:flutter/foundation.dart';
import 'message_codec.dart';
import 'system_channels.dart';
/// An interface into Android's stylus handwriting text input.
///
/// Allows handwriting directly on top of a text input using a stylus.
///
/// See also:
///
/// * [EditableText.stylusHandwritingEnabled], which controls whether Flutter's
/// built-in text fields support handwriting input.
/// * [SystemChannels.scribe], which is the [MethodChannel] used by this
/// class, and which has a list of the methods that this class handles.
/// * <https://developer.android.com/develop/ui/views/touch-and-input/stylus-input/stylus-input-in-text-fields>,
/// which is the Android documentation explaining the Scribe feature.
abstract final class Scribe {
static const MethodChannel _channel = SystemChannels.scribe;
/// A convenience method to check if the device currently supports Scribe
/// stylus handwriting input.
///
/// Call this each time before calling [startStylusHandwriting] to make sure
/// it's available.
///
/// {@tool snippet}
/// This example shows using [isFeatureAvailable] to confirm that
/// [startStylusHandwriting] can be called.
///
/// ```dart
/// if (!await Scribe.isFeatureAvailable()) {
/// // The device doesn't support stylus input right now, or maybe at all.
/// return;
/// }
///
/// // Scribe is supported, so start it.
/// Scribe.startStylusHandwriting();
/// ```
/// {@end-tool}
///
/// See also:
///
/// * [isStylusHandwritingAvailable], which is similar, but throws an error
/// when called by an unsupported API level. It directly corresponds to the
/// underlying Android API
/// <https://developer.android.com/reference/android/view/inputmethod/InputMethodManager#isStylusHandwritingAvailable()>.
/// * [EditableText.stylusHandwritingEnabled], which controls whether
/// Flutter's built-in text fields support handwriting input.
static Future<bool> isFeatureAvailable() async {
final bool? result = await _channel.invokeMethod<bool?>('Scribe.isFeatureAvailable');
if (result == null) {
throw FlutterError('MethodChannel.invokeMethod unexpectedly returned null.');
}
return result;
}
/// Returns true if the InputMethodManager supports Scribe stylus handwriting
/// input, false otherwise.
///
/// Call this each time before calling [startStylusHandwriting] to make sure
/// it's available.
///
/// Supported on Android API 34 and above. If called by an unsupported API
/// level, a [PlatformException] will be thrown. To avoid error handling, use
/// the convenience method [isFeatureAvailable] instead.
///
/// {@tool snippet}
/// This example shows using [isStylusHandwritingAvailable] to confirm that
/// [startStylusHandwriting] can be called.
///
/// ```dart
/// try {
/// if (!await Scribe.isStylusHandwritingAvailable()) {
/// // If isStylusHandwritingAvailable returns false then the device's API level
/// // supports Scribe, but for some other reason it's not able to accept stylus
/// // input right now.
/// return;
/// }
/// } on PlatformException catch (exception) {
/// if (exception.message == 'Requires API level 34 or higher.') {
/// // The device's API level is too low to support Scribe.
/// return;
/// }
/// // Any other exception is unexpected and should not be caught here.
/// rethrow;
/// }
///
/// // Scribe is supported, so start it.
/// Scribe.startStylusHandwriting();
/// ```
/// {@end-tool}
///
/// See also:
///
/// * <https://developer.android.com/reference/android/view/inputmethod/InputMethodManager#isStylusHandwritingAvailable()>,
/// which is the corresponding API on Android that this method attempts to
/// mirror.
static Future<bool> isStylusHandwritingAvailable() async {
final bool? result = await _channel.invokeMethod<bool?>('Scribe.isStylusHandwritingAvailable');
if (result == null) {
throw FlutterError('MethodChannel.invokeMethod unexpectedly returned null.');
}
return result;
}
/// Tell Android to begin receiving stylus handwriting input.
///
/// This is typically called after detecting a [PointerDownEvent] from a
/// [PointerDeviceKind.stylus] on an active text field, indicating the start
/// of stylus handwriting input. If there is no active [TextInputConnection],
/// the call will be ignored.
///
/// Call [isFeatureAvailable] each time before calling this to make sure that
/// stylus handwriting input is supported and available.
///
/// Supported on Android API 33 and above.
///
/// See also:
///
/// * <https://developer.android.com/reference/android/view/inputmethod/InputMethodManager#startStylusHandwriting(android.view.View)>,
/// which is the corresponding API on Android that this method attempts to
/// mirror.
/// * [EditableText.stylusHandwritingEnabled], which controls whether
/// Flutter's built-in text fields support handwriting input.
static Future<void> startStylusHandwriting() {
return _channel.invokeMethod<void>('Scribe.startStylusHandwriting');
}
}