chromium/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/LaunchTrigger.java

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.webapk.shell_apk.h2o;

/**
 * Controls when to launch the WebAPK for {@link SplashActivity}.
 *
 * <p>Executes the provided Runnable when all of {@link #onSplashScreenReady}, {@link #onWillLaunch}
 * and {@link #onHostBrowserSelected} have been called. The provided Runnable is only called once,
 * but this can be reset by calling {@link #reset}.
 */
public class LaunchTrigger {
    private final Runnable mCallback;

    // Variables that determine whether we are ready to encode the splash screen.
    private boolean mSplashScreenReady;
    private boolean mWillLaunch;
    private boolean mHostBrowserSelected;
    private boolean mLaunchingOrLaunched;

    public LaunchTrigger(Runnable callback) {
        mCallback = callback;
    }

    // Methods that could trigger the splash screen encoding.
    public void onSplashScreenReady() {
        mSplashScreenReady = true;
        maybeTrigger();
    }

    public void onWillLaunch() {
        mWillLaunch = true;
        maybeTrigger();
    }

    public void onHostBrowserSelected() {
        mHostBrowserSelected = true;
        maybeTrigger();
    }

    public void reset() {
        mLaunchingOrLaunched = false;
        mHostBrowserSelected = false;
        mWillLaunch = false;
    }

    private void maybeTrigger() {
        if (!mHostBrowserSelected || !mSplashScreenReady || !mWillLaunch || mLaunchingOrLaunched) {
            return;
        }
        mLaunchingOrLaunched = true;

        mCallback.run();
    }
}