package com.ttstd.dialer.livedata;

import android.util.Log;

import androidx.annotation.MainThread;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 解决一次性事件的数据倒灌问题，仅通知一次观察者
 */
public class SingleLiveEvent<T> extends MutableLiveData<T> {
    private static final String TAG = "SingleLiveEvent";
    private final AtomicBoolean mPending = new AtomicBoolean(false); // 标记事件是否待处理

    @MainThread
    @Override
    public void observe(androidx.lifecycle.LifecycleOwner owner, final Observer<? super T> observer) {
        // 警告：多个观察者同时注册时，只有一个会收到通知
        if (hasActiveObservers()) {
            Log.w(TAG, "多个观察者注册，但仅第一个会收到事件");
        }

        // 包装观察者，仅在事件未处理时触发
        super.observe(owner, t -> {
            if (mPending.compareAndSet(true, false)) { // 原子操作：如果是true则改为false，并返回true
                observer.onChanged(t); // 触发观察者回调
            }
        });
    }

    @MainThread
    @Override
    public void setValue(T value) {
        mPending.set(true); // 标记事件待处理
        super.setValue(value);
    }

    /**
     * 简化Void类型事件的调用（如无参数的事件）
     */
    @MainThread
    public void call() {
        setValue(null);
    }
}
