/*
 * Copyright (C) 2017 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 android.content.pm;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.PackageManagerInternal.PackageListObserver;

import com.android.server.LocalServices;

import java.util.List;

/**
 * All of the package name installed on the system.
 * <p>A self observable list that automatically removes the listener when it goes out of scope.
 *
 * @hide Only for use within the system server.
 */
public class PackageList implements PackageListObserver, AutoCloseable {
    private final PackageListObserver mWrappedObserver;
    private final List<String> mPackageNames;

    /**
     * Create a new object.
     * <p>Ownership of the given {@link List} transfers to this object and should not
     * be modified by the caller.
     */
    public PackageList(@NonNull List<String> packageNames, @Nullable PackageListObserver observer) {
        mPackageNames = packageNames;
        mWrappedObserver = observer;
    }

    @Override
    public void onPackageAdded(String packageName) {
        if (mWrappedObserver != null) {
            mWrappedObserver.onPackageAdded(packageName);
        }
    }

    @Override
    public void onPackageRemoved(String packageName) {
        if (mWrappedObserver != null) {
            mWrappedObserver.onPackageRemoved(packageName);
        }
    }

    @Override
    public void close() throws Exception {
        LocalServices.getService(PackageManagerInternal.class).removePackageListObserver(this);
    }

    /**
     * Returns the names of packages installed on the system.
     * <p>The list is a copy-in-time and the actual set of installed packages may differ. Real
     * time updates to the package list are sent via the {@link PackageListObserver} callback.
     */
    public @NonNull List<String> getPackageNames() {
        return mPackageNames;
    }
}
