chromium/base/android/java/src/org/chromium/base/RequiredCallback.java

// Copyright 2023 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.base;

import androidx.annotation.NonNull;

/**
 * A simple single-argument callback to handle the result of a computation that must be called
 * exactly once.
 *
 * @param <T> The type of the computation's result.
 */
public class RequiredCallback<T> implements Callback<T> {
    // Enforces (under test) that this callback is invoked before it is GC'd.
    private final LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this);
    private Callback<T> mCallback;

    public RequiredCallback(@NonNull Callback<T> callback) {
        mCallback = callback;
    }

    @Override
    public void onResult(T result) {
        assert mCallback != null : "Callback was already called.";
        mCallback.onResult(result);
        LifetimeAssert.setSafeToGc(mLifetimeAssert, true);
        mCallback = null;
    }
}