# 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.

# For details regarding the *Flutter Fix* feature, see
# https://flutter.dev/docs/development/tools/flutter-fix

# Please add new fixes to the top of the file, separated by one blank line
# from other fixes. In a comment, include a link to the PR where the change
# requiring the fix was made.

# Every fix must be tested. See the flutter/packages/flutter/test_fixes/README.md
# file for instructions on testing these data driven fixes.

# For documentation about this file format, see
# https://dart.dev/go/data-driven-fixes.

# * Fixes in this file are for AppBarTheme from the Material library. *
#   For fixes to
#     * AppBar: fix_app_bar.yaml
#     * ColorScheme: fix_color_scheme.yaml
#     * Material (general): fix_material.yaml
#     * SliverAppBar: fix_sliver_app_bar.yaml
#     * TextTheme: fix_text_theme.yaml
#     * ThemeData: fix_theme_data.yaml
version: 1
transforms:
  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Migrate to 'systemOverlayStyle'"
    date: 2021-07-12
    element:
      uris: [ 'material.dart' ]
      method: 'copyWith'
      inClass: 'AppBarTheme'
    oneOf:
    - if: "brightness == 'Brightness.dark'"
      changes:
        - kind: 'addParameter'
          index: 14
          name: 'systemOverlayStyle'
          style: optional_named
          argumentValue:
            expression: '{% SystemUiOverlayStyle %}.light'
            requiredIf: "brightness == 'Brightness.dark'"
            variables:
              SystemUiOverlayStyle:
                kind: 'import'
                uris: [ 'services.dart' ]
                name: 'SystemUiOverlayStyle'
        - kind: 'removeParameter'
          name: 'brightness'
    - if: "brightness == 'Brightness.light'"
      changes:
        - kind: 'addParameter'
          index: 14
          name: 'systemOverlayStyle'
          style: optional_named
          argumentValue:
            expression: '{% SystemUiOverlayStyle %}.dark'
            requiredIf: "brightness == 'Brightness.light'"
            variables:
              SystemUiOverlayStyle:
                kind: 'import'
                uris: [ 'services.dart' ]
                name: 'SystemUiOverlayStyle'
        - kind: 'removeParameter'
          name: 'brightness'
    variables:
      brightness:
        kind: 'fragment'
        value: 'arguments[brightness]'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Migrate to 'systemOverlayStyle'"
    date: 2020-07-12
    element:
      uris: [ 'material.dart' ]
      constructor: ''
      inClass: 'AppBarTheme'
    oneOf:
    - if: "brightness == 'Brightness.dark'"
      changes:
        - kind: 'addParameter'
          index: 14
          name: 'systemOverlayStyle'
          style: optional_named
          argumentValue:
            expression: '{% SystemUiOverlayStyle %}.light'
            requiredIf: "brightness == 'Brightness.dark'"
            variables:
              SystemUiOverlayStyle:
                kind: 'import'
                uris: [ 'services.dart' ]
                name: 'SystemUiOverlayStyle'
        - kind: 'removeParameter'
          name: 'brightness'
    - if: "brightness == 'Brightness.light'"
      changes:
        - kind: 'addParameter'
          index: 14
          name: 'systemOverlayStyle'
          style: optional_named
          argumentValue:
            expression: '{% SystemUiOverlayStyle %}.dark'
            requiredIf: "brightness == 'Brightness.light'"
            variables:
              SystemUiOverlayStyle:
                kind: 'import'
                uris: [ 'services.dart' ]
                name: 'SystemUiOverlayStyle'
        - kind: 'removeParameter'
          name: 'brightness'
    variables:
      brightness:
        kind: 'fragment'
        value: 'arguments[brightness]'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Migrate to 'systemOverlayStyle'"
    date: 2021-07-12
    element:
      uris: [ 'material.dart' ]
      field: 'brightness'
      inClass: 'AppBarTheme'
    changes:
      - kind: 'rename'
        newName: 'systemOverlayStyle'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Migrate to 'toolbarTextStyle'"
    date: 2021-07-12
    # TODO(Piinks): Add tests when `bulkApply:false` testing is supported, https://github.com/dart-lang/sdk/issues/44639
    bulkApply: false
    element:
      uris: [ 'material.dart' ]
      field: 'textTheme'
      inClass: 'AppBarTheme'
    changes:
      - kind: 'rename'
        newName: 'toolbarTextStyle'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Migrate to 'titleTextStyle'"
    date: 2021-07-12
    # TODO(Piinks): Add tests when `bulkApply:false` testing is supported, https://github.com/dart-lang/sdk/issues/44639
    bulkApply: false
    element:
      uris: [ 'material.dart' ]
      field: 'textTheme'
      inClass: 'AppBarTheme'
    changes:
      - kind: 'rename'
        newName: 'titleTextStyle'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Migrate to 'toolbarTextStyle' & 'titleTextStyle'"
    date: 2021-07-12
    element:
      uris: [ 'material.dart' ]
      method: 'copyWith'
      inClass: 'AppBarTheme'
    changes:
    - kind: 'addParameter'
      index: 12
      name: 'toolbarTextStyle'
      style: optional_named
      argumentValue:
        expression: '{% textTheme %}.bodyText2'
        requiredIf: "textTheme != ''"
    - kind: 'addParameter'
      index: 13
      name: 'titleTextStyle'
      style: optional_named
      argumentValue:
        expression: '{% textTheme %}.headline6'
        requiredIf: "textTheme != ''"
    - kind: 'removeParameter'
      name: 'textTheme'
    variables:
      textTheme:
        kind: 'fragment'
        value: 'arguments[textTheme]'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Migrate to 'toolbarTextStyle' & 'titleTextStyle'"
    date: 2020-07-12
    element:
      uris: [ 'material.dart' ]
      constructor: ''
      inClass: 'AppBarTheme'
    changes:
    - kind: 'addParameter'
      index: 13
      name: 'toolbarTextStyle'
      style: optional_named
      argumentValue:
        expression: '{% textTheme %}.bodyText2'
        requiredIf: "textTheme != ''"
    - kind: 'addParameter'
      index: 14
      name: 'titleTextStyle'
      style: optional_named
      argumentValue:
        expression: '{% textTheme %}.headline6'
        requiredIf: "textTheme != ''"
    - kind: 'removeParameter'
      name: 'textTheme'
    variables:
      textTheme:
        kind: 'fragment'
        value: 'arguments[textTheme]'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Migrate to 'backgroundColor'"
    date: 2021-07-12
    element:
      uris: [ 'material.dart' ]
      getter: color
      inClass: 'AppBarTheme'
    changes:
      - kind: 'rename'
        newName: 'backgroundColor'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Remove 'backwardsCompatibility'"
    date: 2021-07-12
    element:
      uris: [ 'material.dart' ]
      method: 'copyWith'
      inClass: 'AppBarTheme'
    changes:
    - kind: 'removeParameter'
      name: 'backwardsCompatibility'

  # Changes made in https://github.com/flutter/flutter/pull/86198
  - title: "Remove 'backwardsCompatibility'"
    date: 2020-07-12
    element:
      uris: [ 'material.dart' ]
      constructor: ''
      inClass: 'AppBarTheme'
    changes:
    - kind: 'removeParameter'
      name: 'backwardsCompatibility'

# Before adding a new fix: read instructions at the top of this file.
