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

/// Measure application memory usage after pausing and resuming the app
/// with the Android back button.

import 'dart:async';

import 'package:flutter_devicelab/framework/adb.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/utils.dart';
import 'package:flutter_devicelab/tasks/perf_tests.dart';

const String packageName = 'io.flutter.demo.gallery';
const String activityName = 'io.flutter.demo.gallery.MainActivity';

class BackButtonMemoryTest extends MemoryTest {
  BackButtonMemoryTest() : super('${flutterDirectory.path}/examples/flutter_gallery', 'test_memory/back_button.dart', packageName);

  @override
  AndroidDevice get device => super.device;

  @override
  int get iterationCount => 5;

  /// Perform a series of back button suspend and resume cycles.
  @override
  Future<void> useMemory() async {
    await launchApp();
    await recordStart();
    for (int iteration = 0; iteration < 8; iteration += 1) {
      print('back/forward iteration $iteration');

      // Push back button, wait for it to be seen by the Flutter app.
      prepareForNextMessage('AppLifecycleState.paused');
      await device.shellExec('input', <String>['keyevent', 'KEYCODE_BACK']);
      await receivedNextMessage;

      // Give Android time to settle (e.g. run GCs) after closing the app.
      await Future<void>.delayed(const Duration(milliseconds: 100));

      // Relaunch the app, wait for it to launch.
      prepareForNextMessage('READY');
      final String output = await device.shellEval('am', <String>['start', '-n', '$packageName/$activityName']);
      print('adb shell am start: $output');
      if (output.contains('Error'))
        fail('unable to launch activity');
      await receivedNextMessage;

      // Wait for the Flutter app to settle (e.g. run GCs).
      await Future<void>.delayed(const Duration(milliseconds: 100));
    }
    await recordEnd();
  }
}

Future<void> main() async {
  deviceOperatingSystem = DeviceOperatingSystem.android;
  await task(BackButtonMemoryTest().run);
}
