/*
 * 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 com.android.server.timezone;

import android.content.Intent;
import android.content.pm.PackageManager;

/**
 * An easy-to-mock facade around PackageManager for use by {@link PackageTracker}; it is not
 * possible to test various cases with the real one because of the need to simulate package versions
 * and manifest configurations.
 */
interface PackageManagerHelper {

    long getInstalledPackageVersion(String packageName)
            throws PackageManager.NameNotFoundException;

    boolean isPrivilegedApp(String packageName) throws PackageManager.NameNotFoundException;

    boolean usesPermission(String packageName, String requiredPermissionName)
                    throws PackageManager.NameNotFoundException;

    boolean contentProviderRegistered(String authority, String requiredPackageName);

    boolean receiverRegistered(Intent intent, String requiredPermissionName)
                            throws PackageManager.NameNotFoundException;
}
