// 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 'package:file/file.dart';
import 'package:flutter_tools/src/base/io.dart';

import '../src/common.dart';
import 'test_utils.dart';

void main() {
  late Directory tempDir;

  setUp(() async {
    tempDir = createResolvedTempDirectorySync('run_test.');
  });

  tearDown(() async {
    tryToDelete(tempDir);
  });

  testWithoutContext('build succeeds with api 33 features', () async {
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
    ProcessResult result = await processManager.run(<String>[
      flutterBin,
      'create',
      tempDir.path,
      '--project-name=testapp',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);

    final File api33File = tempDir
       .childDirectory('android')
       .childDirectory('app')
       .childDirectory('src')
       .childDirectory('main')
       .childDirectory('java')
       .childFile('Android33Api.java');

    api33File.createSync(recursive: true);
    // AccessibilityManager.isAudioDescriptionRequested() is an API 33 feature
    api33File.writeAsStringSync('''
import android.app.Activity;
import android.view.accessibility.AccessibilityManager;
import androidx.annotation.Keep;
import io.flutter.Log;

@Keep
public final class Android33Api extends Activity {
  private AccessibilityManager accessibilityManager;

  public Android33Api() {
    accessibilityManager = getSystemService(AccessibilityManager.class);
  }

  public void doSomething() {
    if (accessibilityManager.isAudioDescriptionRequested()) {
      Log.e("flutter", "User has requested to enable audio descriptions");
    }
  }
}

''');

    result = await processManager.run(<String>[
      flutterBin,
      ...getLocalEngineArguments(),
      'build',
      'apk',
    ], workingDirectory: tempDir.path);
    expect(result.exitCode, 0);
    expect(result.stdout.toString(), contains('app-release.apk'));
  });
}
