/*
 * Copyright (C) 2017 Oasis Feng. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * 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.oasisfeng.condom;

import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ChangedPackages;
import android.content.pm.FeatureInfo;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.InstrumentationInfo;
import android.content.pm.KeySet;
import android.content.pm.ModuleInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.VersionedPackage;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import java.util.List;
import java.util.Set;

import static android.os.Build.VERSION_CODES.HONEYCOMB;
import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
import static android.os.Build.VERSION_CODES.KITKAT;
import static android.os.Build.VERSION_CODES.KITKAT_WATCH;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.N;
import static android.os.Build.VERSION_CODES.O;
import static android.os.Build.VERSION_CODES.O_MR1;
import static android.os.Build.VERSION_CODES.P;
import static android.os.Build.VERSION_CODES.Q;

/**
 * Delegation wrapper of {@link PackageManager}
 *
 * Created by Oasis on 2017/3/27.
 */
@Keep
public class PackageManagerWrapper extends PackageManager {

	public PackageManagerWrapper(PackageManager base) { mBase = base; }

	@Override public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException {
		return mBase.getPackageInfo(packageName, flags);
	}

	@RequiresApi(O) @Override public PackageInfo getPackageInfo(VersionedPackage versionedPackage, int flags) throws NameNotFoundException {
		return mBase.getPackageInfo(versionedPackage, flags);
	}

	/** @hide */
	@Override public PackageInfo getPackageInfoAsUser(String packageName, int flags, int userId) throws NameNotFoundException {
		return mBase.getPackageInfoAsUser(packageName, flags, userId);
	}

	@Override public String[] currentToCanonicalPackageNames(String[] names) {
		return mBase.currentToCanonicalPackageNames(names);
	}

	@Override public String[] canonicalToCurrentPackageNames(String[] names) {
		return mBase.canonicalToCurrentPackageNames(names);
	}

	@Override public Intent getLaunchIntentForPackage(String packageName) {
		return mBase.getLaunchIntentForPackage(packageName);
	}

	@RequiresApi(LOLLIPOP) @Override public Intent getLeanbackLaunchIntentForPackage(String packageName) {
		return mBase.getLeanbackLaunchIntentForPackage(packageName);
	}

	@Override public int[] getPackageGids(String packageName) throws NameNotFoundException {
		return mBase.getPackageGids(packageName);
	}

	@RequiresApi(N) @Override public int[] getPackageGids(String packageName, int flags) throws NameNotFoundException {
		return mBase.getPackageGids(packageName, flags);
	}

	@RequiresApi(N) @Override public int getPackageUid(String packageName, int flags) throws NameNotFoundException {
		return mBase.getPackageUid(packageName, flags);
	}

	/** @hide */
	@Override public int getPackageUidAsUser(String packageName, int userId) throws NameNotFoundException {
		return mBase.getPackageUidAsUser(packageName, userId);
	}

	/** @hide */
	@Override public int getPackageUidAsUser(String packageName, int flags, int userId) throws NameNotFoundException {
		return mBase.getPackageUidAsUser(packageName, flags, userId);
	}

	@Override public PermissionInfo getPermissionInfo(String name, int flags) throws NameNotFoundException {
		return mBase.getPermissionInfo(name, flags);
	}

	@Override public List<PermissionInfo> queryPermissionsByGroup(String group, int flags) throws NameNotFoundException {
		return mBase.queryPermissionsByGroup(group, flags);
	}

	@Override public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) throws NameNotFoundException {
		return mBase.getPermissionGroupInfo(name, flags);
	}

	@Override public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
		return mBase.getAllPermissionGroups(flags);
	}

	@Override public ApplicationInfo getApplicationInfo(String packageName, int flags) throws NameNotFoundException {
		return mBase.getApplicationInfo(packageName, flags);
	}

	/** @hide */
	@Override public ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId) throws NameNotFoundException {
		return mBase.getApplicationInfoAsUser(packageName, flags, userId);
	}

	@Override public ActivityInfo getActivityInfo(ComponentName component, int flags) throws NameNotFoundException {
		return mBase.getActivityInfo(component, flags);
	}

	@Override public ActivityInfo getReceiverInfo(ComponentName component, int flags) throws NameNotFoundException {
		return mBase.getReceiverInfo(component, flags);
	}

	@Override public ServiceInfo getServiceInfo(ComponentName component, int flags) throws NameNotFoundException {
		return mBase.getServiceInfo(component, flags);
	}

	@Override public ProviderInfo getProviderInfo(ComponentName component, int flags) throws NameNotFoundException {
		return mBase.getProviderInfo(component, flags);
	}

	@Override public List<PackageInfo> getInstalledPackages(int flags) {
		return mBase.getInstalledPackages(flags);
	}

	@RequiresApi(JELLY_BEAN_MR2) @Override public List<PackageInfo> getPackagesHoldingPermissions(String[] permissions, int flags) {
		return mBase.getPackagesHoldingPermissions(permissions, flags);
	}

	/** @hide */ //@SystemApi
	@Override public List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) {
		return mBase.getInstalledPackagesAsUser(flags, userId);
	}

	@Override public int checkPermission(String permName, String pkgName) {
		return mBase.checkPermission(permName, pkgName);
	}

	@RequiresApi(M) @Override public boolean isPermissionRevokedByPolicy(@NonNull String permName, @NonNull String pkgName) {
		return mBase.isPermissionRevokedByPolicy(permName, pkgName);
	}

	/** @hide */
	@Override public String getPermissionControllerPackageName() {
		return mBase.getPermissionControllerPackageName();
	}

	@Override public boolean addPermission(PermissionInfo info) {
		return mBase.addPermission(info);
	}

	@Override public boolean addPermissionAsync(PermissionInfo info) {
		return mBase.addPermissionAsync(info);
	}

	@Override public void removePermission(String name) {
		mBase.removePermission(name);
	}

	/** @hide */
	@Override public boolean shouldShowRequestPermissionRationale(String permission) {
		return mBase.shouldShowRequestPermissionRationale(permission);
	}

	/** @hide */
	@Override public Intent buildRequestPermissionsIntent(String[] permissions) {
		return mBase.buildRequestPermissionsIntent(permissions);
	}

	@Override public int checkSignatures(String pkg1, String pkg2) {
		return mBase.checkSignatures(pkg1, pkg2);
	}

	@Override public int checkSignatures(int uid1, int uid2) {
		return mBase.checkSignatures(uid1, uid2);
	}

	@Override @Nullable public String[] getPackagesForUid(int uid) {
		return mBase.getPackagesForUid(uid);
	}

	@Override @Nullable public String getNameForUid(int uid) {
		return mBase.getNameForUid(uid);
	}

	/** @hide */
	@RequiresApi(O_MR1) @Override @Nullable public String[] getNamesForUids(int[] uids) {
		return mBase.getNamesForUids(uids);
	}

	/** @hide */
	@Override public int getUidForSharedUser(String sharedUserName) throws NameNotFoundException {
		return mBase.getUidForSharedUser(sharedUserName);
	}

	@Override public List<ApplicationInfo> getInstalledApplications(int flags) {
		return mBase.getInstalledApplications(flags);
	}

	@RequiresApi(O) @Override public boolean isInstantApp() {
		return mBase.isInstantApp();
	}

	@RequiresApi(O) @Override public boolean isInstantApp(String packageName) {
		return mBase.isInstantApp(packageName);
	}

	@RequiresApi(O) @Override public int getInstantAppCookieMaxBytes() {
		return mBase.getInstantAppCookieMaxBytes();
	}

	@RequiresApi(O) @Override public byte[] getInstantAppCookie() {
		return mBase.getInstantAppCookie();
	}

	@RequiresApi(O) @Override public void clearInstantAppCookie() {
		mBase.clearInstantAppCookie();
	}

	@RequiresApi(O) @Override public void updateInstantAppCookie(byte[] cookie) {
		mBase.updateInstantAppCookie(cookie);
	}

	@Override public String[] getSystemSharedLibraryNames() {
		return mBase.getSystemSharedLibraryNames();
	}

	@RequiresApi(O) @Override public List<SharedLibraryInfo> getSharedLibraries(int flags) {
		return mBase.getSharedLibraries(flags);
	}

	@RequiresApi(O) @Override public ChangedPackages getChangedPackages(int sequenceNumber) {
		return mBase.getChangedPackages(sequenceNumber);
	}

	/** @hide */
	@Override public String getServicesSystemSharedLibraryPackageName() {
		return mBase.getServicesSystemSharedLibraryPackageName();
	}

	/** @hide */
	@Override public String getSharedSystemSharedLibraryPackageName() {
		return mBase.getSharedSystemSharedLibraryPackageName();
	}

	@Override public FeatureInfo[] getSystemAvailableFeatures() {
		return mBase.getSystemAvailableFeatures();
	}

	@Override public boolean hasSystemFeature(String name) {
		return mBase.hasSystemFeature(name);
	}

	@RequiresApi(N) @Override public boolean hasSystemFeature(String name, int version) {
		return mBase.hasSystemFeature(name, version);
	}

	@Override public ResolveInfo resolveActivity(Intent intent, int flags) {
		return mBase.resolveActivity(intent, flags);
	}

	/** @hide */
	@Override public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) {
		return mBase.resolveActivityAsUser(intent, flags, userId);
	}

	@Override public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) {
		return mBase.queryIntentActivities(intent, flags);
	}

	/** @hide */
	@Override public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
		return mBase.queryIntentActivitiesAsUser(intent, flags, userId);
	}

	@Override public List<ResolveInfo> queryIntentActivityOptions(ComponentName caller, Intent[] specifics, Intent intent, int flags) {
		return mBase.queryIntentActivityOptions(caller, specifics, intent, flags);
	}

	@Override public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
		return mBase.queryBroadcastReceivers(intent, flags);
	}

	/** @hide */ //@SystemApi
	 public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, UserHandle userHandle) {
		return mBase.queryBroadcastReceiversAsUser(intent, flags, userHandle);
	}

	/** @hide */
	@Override public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, int userId) {
		return mBase.queryBroadcastReceiversAsUser(intent, flags, userId);
	}

	/** @hide */
	@Deprecated public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags, int userId) {
		return mBase.queryBroadcastReceivers(intent, flags, userId);
	}

	@Override public ResolveInfo resolveService(Intent intent, int flags) {
		return mBase.resolveService(intent, flags);
	}

	/** @hide */
	@Override public ResolveInfo resolveServiceAsUser(Intent intent, int flags, int userId) {
		return mBase.resolveServiceAsUser(intent, flags, userId);
	}

	@Override public List<ResolveInfo> queryIntentServices(Intent intent, int flags) {
		return mBase.queryIntentServices(intent, flags);
	}

	/** @hide */
	@Override public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
		return mBase.queryIntentServicesAsUser(intent, flags, userId);
	}

	/** @hide */
	@Override public List<ResolveInfo> queryIntentContentProvidersAsUser(Intent intent, int flags, int userId) {
		return mBase.queryIntentContentProvidersAsUser(intent, flags, userId);
	}

	@RequiresApi(KITKAT) @Override public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) {
		return mBase.queryIntentContentProviders(intent, flags);
	}

	@Override public ProviderInfo resolveContentProvider(String name, int flags) {
		return mBase.resolveContentProvider(name, flags);
	}

	/** @hide */
	@Override public ProviderInfo resolveContentProviderAsUser(String name, int flags, int userId) {
		return mBase.resolveContentProviderAsUser(name, flags, userId);
	}

	@Override public List<ProviderInfo> queryContentProviders(String processName, int uid, int flags) {
		return mBase.queryContentProviders(processName, uid, flags);
	}

	@Override public InstrumentationInfo getInstrumentationInfo(ComponentName className, int flags) throws NameNotFoundException {
		return mBase.getInstrumentationInfo(className, flags);
	}

	@Override public List<InstrumentationInfo> queryInstrumentation(String targetPackage, int flags) {
		return mBase.queryInstrumentation(targetPackage, flags);
	}

	@Override public Drawable getDrawable(String packageName, int resid, ApplicationInfo appInfo) {
		return mBase.getDrawable(packageName, resid, appInfo);
	}

	@Override public Drawable getActivityIcon(ComponentName activityName) throws NameNotFoundException {
		return mBase.getActivityIcon(activityName);
	}

	@Override public Drawable getActivityIcon(Intent intent) throws NameNotFoundException {
		return mBase.getActivityIcon(intent);
	}

	@RequiresApi(KITKAT_WATCH) @Override public Drawable getActivityBanner(ComponentName activityName) throws NameNotFoundException {
		return mBase.getActivityBanner(activityName);
	}

	@RequiresApi(KITKAT_WATCH) @Override public Drawable getActivityBanner(Intent intent) throws NameNotFoundException {
		return mBase.getActivityBanner(intent);
	}

	@Override public Drawable getDefaultActivityIcon() {
		return mBase.getDefaultActivityIcon();
	}

	@Override public Drawable getApplicationIcon(ApplicationInfo info) {
		return mBase.getApplicationIcon(info);
	}

	@Override public Drawable getApplicationIcon(String packageName) throws NameNotFoundException {
		return mBase.getApplicationIcon(packageName);
	}

	@RequiresApi(KITKAT_WATCH) @Override public Drawable getApplicationBanner(ApplicationInfo info) {
		return mBase.getApplicationBanner(info);
	}

	@RequiresApi(KITKAT_WATCH) @Override public Drawable getApplicationBanner(String packageName) throws NameNotFoundException {
		return mBase.getApplicationBanner(packageName);
	}

	@Override public Drawable getActivityLogo(ComponentName activityName) throws NameNotFoundException {
		return mBase.getActivityLogo(activityName);
	}

	@Override public Drawable getActivityLogo(Intent intent) throws NameNotFoundException {
		return mBase.getActivityLogo(intent);
	}

	@Override public Drawable getApplicationLogo(ApplicationInfo info) {
		return mBase.getApplicationLogo(info);
	}

	@Override public Drawable getApplicationLogo(String packageName) throws NameNotFoundException {
		return mBase.getApplicationLogo(packageName);
	}

	/** @hide */
	@Override public Drawable getManagedUserBadgedDrawable(Drawable drawable, Rect badgeLocation, int badgeDensity) {
		return mBase.getManagedUserBadgedDrawable(drawable, badgeLocation, badgeDensity);
	}

	@RequiresApi(api = LOLLIPOP) @Override public Drawable getUserBadgedIcon(Drawable icon, UserHandle user) {
		return mBase.getUserBadgedIcon(icon, user);
	}

	@RequiresApi(api = LOLLIPOP) @Override public Drawable getUserBadgedDrawableForDensity(Drawable drawable, UserHandle user, Rect badgeLocation, int badgeDensity) {
		return mBase.getUserBadgedDrawableForDensity(drawable, user, badgeLocation, badgeDensity);
	}

	/** @hide */
	@Override public Drawable getUserBadgeForDensity(UserHandle user, int density) {
		return mBase.getUserBadgeForDensity(user, density);
	}

	/** @hide */
	@Override public Drawable getUserBadgeForDensityNoBackground(UserHandle user, int density) {
		return mBase.getUserBadgeForDensityNoBackground(user, density);
	}

	@RequiresApi(api = LOLLIPOP) @Override public CharSequence getUserBadgedLabel(CharSequence label, UserHandle user) {
		return mBase.getUserBadgedLabel(label, user);
	}

	@Override public CharSequence getText(String packageName, int resid, ApplicationInfo appInfo) {
		return mBase.getText(packageName, resid, appInfo);
	}

	@Override public XmlResourceParser getXml(String packageName, int resid, ApplicationInfo appInfo) {
		return mBase.getXml(packageName, resid, appInfo);
	}

	@Override public CharSequence getApplicationLabel(ApplicationInfo info) {
		return mBase.getApplicationLabel(info);
	}

	@Override public Resources getResourcesForActivity(ComponentName activityName) throws NameNotFoundException {
		return mBase.getResourcesForActivity(activityName);
	}

	@Override public Resources getResourcesForApplication(ApplicationInfo app) throws NameNotFoundException {
		return mBase.getResourcesForApplication(app);
	}

	@Override public Resources getResourcesForApplication(String appPackageName) throws NameNotFoundException {
		return mBase.getResourcesForApplication(appPackageName);
	}

	@Override public Resources getResourcesForApplicationAsUser(String appPackageName, int userId) throws NameNotFoundException {
		return mBase.getResourcesForApplicationAsUser(appPackageName, userId);
	}

	@Override public PackageInfo getPackageArchiveInfo(String archiveFilePath, int flags) {
		return mBase.getPackageArchiveInfo(archiveFilePath, flags);
	}

	@RequiresApi(ICE_CREAM_SANDWICH) @Override public void verifyPendingInstall(int id, int verificationCode) {
		mBase.verifyPendingInstall(id, verificationCode);
	}

	@RequiresApi(JELLY_BEAN_MR1) @Override public void extendVerificationTimeout(int id, int verificationCodeAtTimeout, long millisecondsToDelay) {
		mBase.extendVerificationTimeout(id, verificationCodeAtTimeout, millisecondsToDelay);
	}

	/** @hide */
	@Override public List<IntentFilter> getAllIntentFilters(String packageName) {
		return mBase.getAllIntentFilters(packageName);
	}

	@RequiresApi(HONEYCOMB) @Override public void setInstallerPackageName(String targetPackage, String installerPackageName) {
		mBase.setInstallerPackageName(targetPackage, installerPackageName);
	}

	@Override public String getInstallerPackageName(String packageName) {
		return mBase.getInstallerPackageName(packageName);
	}

	/** @hide */
	@Override public void getPackageSizeInfoAsUser(String packageName, int userId, IPackageStatsObserver observer) {
		mBase.getPackageSizeInfoAsUser(packageName, userId, observer);
	}

	/** @hide */
	@Override public void getPackageSizeInfo(String packageName, IPackageStatsObserver observer) {
		mBase.getPackageSizeInfo(packageName, observer);
	}

	@Override public void addPackageToPreferred(String packageName) {
		mBase.addPackageToPreferred(packageName);
	}

	@Override public void removePackageFromPreferred(String packageName) {
		mBase.removePackageFromPreferred(packageName);
	}

	@Override public List<PackageInfo> getPreferredPackages(int flags) {
		return mBase.getPreferredPackages(flags);
	}

	@Override public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) {
		mBase.addPreferredActivity(filter, match, set, activity);
	}

	@Override public void clearPackagePreferredActivities(String packageName) {
		mBase.clearPackagePreferredActivities(packageName);
	}

	@Override public int getPreferredActivities(@NonNull List<IntentFilter> outFilters, @NonNull List<ComponentName> outActivities, String packageName) {
		return mBase.getPreferredActivities(outFilters, outActivities, packageName);
	}

	/** @hide */
	@Override public ComponentName getHomeActivities(List<ResolveInfo> outActivities) {
		return mBase.getHomeActivities(outActivities);
	}

	@Override public void setComponentEnabledSetting(ComponentName componentName, int newState, int flags) {
		mBase.setComponentEnabledSetting(componentName, newState, flags);
	}

	@Override public int getComponentEnabledSetting(ComponentName componentName) {
		return mBase.getComponentEnabledSetting(componentName);
	}

	@Override public void setApplicationEnabledSetting(String packageName, int newState, int flags) {
		mBase.setApplicationEnabledSetting(packageName, newState, flags);
	}

	@Override public int getApplicationEnabledSetting(String packageName) {
		return mBase.getApplicationEnabledSetting(packageName);
	}

	/** @hide */
	@Override public void flushPackageRestrictionsAsUser(int userId) {
		mBase.flushPackageRestrictionsAsUser(userId);
	}

	@Override public boolean isSafeMode() {
		return mBase.isSafeMode();
	}

	@RequiresApi(O) @Override public void setApplicationCategoryHint(String packageName, int categoryHint) {
		mBase.setApplicationCategoryHint(packageName, categoryHint);
	}

	@RequiresApi(LOLLIPOP) @Override @NonNull public PackageInstaller getPackageInstaller() {
		return mBase.getPackageInstaller();
	}

	@RequiresApi(O) @Override public boolean canRequestPackageInstalls() {
		return mBase.canRequestPackageInstalls();
	}

	/** @hide */
	@Override public KeySet getKeySetByAlias(String packageName, String alias) {
		return mBase.getKeySetByAlias(packageName, alias);
	}

	/** @hide */
	@Override public KeySet getSigningKeySet(String packageName) {
		return mBase.getSigningKeySet(packageName);
	}

	/** @hide */
	@Override public boolean isSignedBy(String packageName, KeySet ks) {
		return mBase.isSignedBy(packageName, ks);
	}

	/** @hide */
	@Override public boolean isSignedByExactly(String packageName, KeySet ks) {
		return mBase.isSignedByExactly(packageName, ks);
	}

	@RequiresApi(P) @Override public boolean isPackageSuspended() {
		return mBase.isPackageSuspended();
	}

	@RequiresApi(P) @Override public Bundle getSuspendedPackageAppExtras() {
		return mBase.getSuspendedPackageAppExtras();
	}

	/** @hide */
	@Override public boolean isPackageSuspendedForUser(String packageName, int userId) {
		return mBase.isPackageSuspendedForUser(packageName, userId);
	}

	/** @hide */
	@Override public boolean isUpgrade() {
		return mBase.isUpgrade();
	}

	/** @hide */
	@Override public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) {
		return mBase.loadItemIcon(itemInfo, appInfo);
	}

	/** @hide */
	@Override public Drawable loadUnbadgedItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) {
		return mBase.loadUnbadgedItemIcon(itemInfo, appInfo);
	}

	/** @hide */
	@Override public boolean isPackageAvailable(String packageName) {
		return mBase.isPackageAvailable(packageName);
	}

	@RequiresApi(P) @Override public boolean hasSigningCertificate(String packageName, byte[] certificate, int type) {
		return mBase.hasSigningCertificate(packageName, certificate, type);
	}

	/** @hide */
	@RequiresApi(P) public String getSystemTextClassifierPackageName() { return mBase.getSystemTextClassifierPackageName(); }

	/** @hide */
	@RequiresApi(P) public boolean isPackageStateProtected(String packageName, int userId) { return mBase.isPackageStateProtected(packageName, userId); }

	@RequiresApi(Q) public boolean addWhitelistedRestrictedPermission(String packageName, String permission, int whitelistFlags) {
		return mBase.addWhitelistedRestrictedPermission(packageName, permission, whitelistFlags);
	}
	@RequiresApi(Q) public Set<String> getWhitelistedRestrictedPermissions(String packageName, int whitelistFlag) {
		return mBase.getWhitelistedRestrictedPermissions(packageName, whitelistFlag);
	}
	@RequiresApi(Q) public boolean removeWhitelistedRestrictedPermission(String packageName, String permission, int whitelistFlags) {
		return mBase.removeWhitelistedRestrictedPermission(packageName, permission, whitelistFlags);
	}
	@RequiresApi(Q) public List<ModuleInfo> getInstalledModules(int flags) { return mBase.getInstalledModules(flags); }
	@RequiresApi(Q) public ModuleInfo getModuleInfo(String packageName, int flags) throws NameNotFoundException {
		return mBase.getModuleInfo(packageName, flags);
	}
	@RequiresApi(Q) public boolean getSyntheticAppDetailsActivityEnabled(String packageName) {
		return mBase.getSyntheticAppDetailsActivityEnabled(packageName);
	}
	@RequiresApi(Q) public boolean isPackageSuspended(String packageName) throws NameNotFoundException {
		return mBase.isPackageSuspended(packageName);
	}
	@RequiresApi(Q) public boolean isDeviceUpgrading() { return mBase.isDeviceUpgrading(); }

	final private PackageManager mBase;
}