// 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:io' as io; import 'package:path/path.dart' as path; import 'package:pub_semver/pub_semver.dart'; String adbPath() { final String? androidHome = io.Platform.environment['ANDROID_HOME'] ?? io.Platform.environment['ANDROID_SDK_ROOT']; if (androidHome == null) { return 'adb'; } else { return path.join(androidHome, 'platform-tools', 'adb'); } } Future getTalkbackVersion() async { final io.ProcessResult result = await io.Process.run(adbPath(), const [ 'shell', 'dumpsys', 'package', 'com.google.android.marvin.talkback', ]); if (result.exitCode != 0) { throw Exception('Failed to get TalkBack version: ${result.stdout as String}\n${result.stderr as String}'); } final List lines = (result.stdout as String).split('\n'); String? version; for (final String line in lines) { if (line.contains('versionName')) { version = line.replaceAll(RegExp(r'\s*versionName='), ''); break; } } if (version == null) { throw Exception('Unable to determine TalkBack version.'); } // Android doesn't quite use semver, so convert the version string to semver form. final RegExp startVersion = RegExp(r'(?\d+)\.(?\d+)\.(?\d+)(\.(?\d+))?'); final RegExpMatch? match = startVersion.firstMatch(version); if (match == null) { return Version(0, 0, 0); } return Version( int.parse(match.namedGroup('major')!), int.parse(match.namedGroup('minor')!), int.parse(match.namedGroup('patch')!), build: match.namedGroup('build'), ); } Future enableTalkBack() async { final io.Process run = await io.Process.start(adbPath(), const [ 'shell', 'settings', 'put', 'secure', 'enabled_accessibility_services', 'com.google.android.marvin.talkback/com.google.android.marvin.talkback.TalkBackService', ]); await run.exitCode; print('TalkBack version is ${await getTalkbackVersion()}'); } Future disableTalkBack() async { final io.Process run = await io.Process.start(adbPath(), const [ 'shell', 'settings', 'put', 'secure', 'enabled_accessibility_services', 'null', ]); await run.exitCode; }