| // 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<Version> getTalkbackVersion() async { | |
| final io.ProcessResult result = await io.Process.run(adbPath(), const <String>[ | |
| '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<String> 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'(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)(\.(?<build>\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<void> enableTalkBack() async { | |
| final io.Process run = await io.Process.start(adbPath(), const <String>[ | |
| '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<void> disableTalkBack() async { | |
| final io.Process run = await io.Process.start(adbPath(), const <String>[ | |
| 'shell', | |
| 'settings', | |
| 'put', | |
| 'secure', | |
| 'enabled_accessibility_services', | |
| 'null', | |
| ]); | |
| await run.exitCode; | |
| } |