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

package dev.flutter.scenarios;

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import java.util.concurrent.atomic.AtomicBoolean;

public abstract class TestableFlutterActivity extends FlutterActivity {
  private Object flutterUiRenderedLock = new Object();
  private AtomicBoolean isScenarioReady = new AtomicBoolean(false);

  @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    // Do not call super. We have no plugins to register, and the automatic
    // registration will fail and print a scary exception in the logs.
    flutterEngine
        .getDartExecutor()
        .setMessageHandler(
            "take_screenshot", (byteBuffer, binaryReply) -> notifyFlutterRendered(), null);
  }

  protected void notifyFlutterRendered() {
    synchronized (flutterUiRenderedLock) {
      isScenarioReady.set(true);
      flutterUiRenderedLock.notifyAll();
    }
  }

  public void waitUntilFlutterRendered() {
    try {
      if (isScenarioReady.get()) {
        return;
      }
      synchronized (flutterUiRenderedLock) {
        flutterUiRenderedLock.wait();
      }
      // Reset the lock.
      flutterUiRenderedLock = new Object();
    } catch (InterruptedException e) {
      throw new RuntimeException(e);
    }
  }
}
