/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.wallpaper.testing;


import com.android.wallpaper.module.NetworkStatusNotifier;

import java.util.ArrayList;
import java.util.List;

/**
 * Test implementation of {@link NetworkStatusNotifier} which enables clients to manually notify
 * listeners of a network status change.
 */
public class TestNetworkStatusNotifier implements NetworkStatusNotifier {

    private List<Listener> mListeners;
    @NetworkStatus
    private int mNetworkStatus;

    public TestNetworkStatusNotifier() {
        mListeners = new ArrayList<>();
        mNetworkStatus = NETWORK_CONNECTED;
    }

    @Override
    public int getNetworkStatus() {
        return mNetworkStatus;
    }

    @Override
    public void registerListener(Listener listener) {
        mListeners.add(listener);
        listener.onNetworkChanged(mNetworkStatus);
    }

    @Override
    public void unregisterListener(Listener listener) {
        mListeners.remove(listener);
    }

    public void setAndNotifyNetworkStatus(@NetworkStatus int networkStatus) {
        mNetworkStatus = networkStatus;
        for (Listener listener : mListeners) {
            listener.onNetworkChanged(mNetworkStatus);
        }
    }
}
