// Signature format: 2.0
package com.android.server {

  public final class LocalManagerRegistry {
    method public static <T> void addManager(@NonNull Class<T>, @NonNull T);
    method @Nullable public static <T> T getManager(@NonNull Class<T>);
  }

  public abstract class SystemService {
    ctor public SystemService(@NonNull android.content.Context);
    method @NonNull public final android.content.Context getContext();
    method public boolean isUserSupported(@NonNull com.android.server.SystemService.TargetUser);
    method public void onBootPhase(int);
    method public abstract void onStart();
    method public void onUserStarting(@NonNull com.android.server.SystemService.TargetUser);
    method public void onUserStopped(@NonNull com.android.server.SystemService.TargetUser);
    method public void onUserStopping(@NonNull com.android.server.SystemService.TargetUser);
    method public void onUserSwitching(@Nullable com.android.server.SystemService.TargetUser, @NonNull com.android.server.SystemService.TargetUser);
    method public void onUserUnlocked(@NonNull com.android.server.SystemService.TargetUser);
    method public void onUserUnlocking(@NonNull com.android.server.SystemService.TargetUser);
    method protected final void publishBinderService(@NonNull String, @NonNull android.os.IBinder);
    method protected final void publishBinderService(@NonNull String, @NonNull android.os.IBinder, boolean);
    field public static final int PHASE_ACTIVITY_MANAGER_READY = 550; // 0x226
    field public static final int PHASE_BOOT_COMPLETED = 1000; // 0x3e8
    field public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520; // 0x208
    field public static final int PHASE_LOCK_SETTINGS_READY = 480; // 0x1e0
    field public static final int PHASE_SYSTEM_SERVICES_READY = 500; // 0x1f4
    field public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600; // 0x258
    field public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; // 0x64
  }

  public static final class SystemService.TargetUser {
    method @NonNull public android.os.UserHandle getUserHandle();
  }

}

package com.android.server.am {

  public interface ActivityManagerLocal {
    method public boolean bindSdkSandboxService(@NonNull android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull String, @NonNull String, int) throws android.os.RemoteException;
    method public boolean canStartForegroundService(int, int, @NonNull String);
    method public void killSdkSandboxClientAppProcess(@NonNull android.os.IBinder);
  }

}

package com.android.server.pm {

  public interface PackageManagerLocal {
    method public void reconcileSdkData(@Nullable String, @NonNull String, @NonNull java.util.List<java.lang.String>, int, int, int, @NonNull String, int) throws java.io.IOException;
    method @NonNull public com.android.server.pm.PackageManagerLocal.FilteredSnapshot withFilteredSnapshot();
    method @NonNull public com.android.server.pm.PackageManagerLocal.FilteredSnapshot withFilteredSnapshot(int, @NonNull android.os.UserHandle);
    method @NonNull public com.android.server.pm.PackageManagerLocal.UnfilteredSnapshot withUnfilteredSnapshot();
    field public static final int FLAG_STORAGE_CE = 2; // 0x2
    field public static final int FLAG_STORAGE_DE = 1; // 0x1
  }

  public static interface PackageManagerLocal.FilteredSnapshot extends java.lang.AutoCloseable {
    method public void close();
    method @Nullable public com.android.server.pm.pkg.PackageState getPackageState(@NonNull String);
    method @NonNull public java.util.Map<java.lang.String,com.android.server.pm.pkg.PackageState> getPackageStates();
  }

  public static interface PackageManagerLocal.UnfilteredSnapshot extends java.lang.AutoCloseable {
    method public void close();
    method @NonNull public com.android.server.pm.PackageManagerLocal.FilteredSnapshot filtered(int, @NonNull android.os.UserHandle);
    method @NonNull public java.util.Map<java.lang.String,com.android.server.pm.pkg.PackageState> getPackageStates();
  }

}

package com.android.server.pm.pkg {

  public interface AndroidPackage {
    method @Nullable public String getAppComponentFactory();
    method @Nullable public String getApplicationClassName();
    method @Nullable public String getBackupAgentName();
    method @DrawableRes public int getBannerRes();
    method public int getBaseRevisionCode();
    method public int getCategory();
    method @Nullable public String getClassLoaderName();
    method @Dimension(unit=android.annotation.Dimension.DP) public int getCompatibleWidthLimitDp();
    method @XmlRes public int getDataExtractionRulesRes();
    method @StringRes public int getDescriptionRes();
    method @XmlRes public int getFullBackupContentRes();
    method public int getGwpAsanMode();
    method @DrawableRes public int getIconRes();
    method @StringRes public int getLabelRes();
    method @Dimension(unit=android.annotation.Dimension.DP) public int getLargestWidthLimitDp();
    method @NonNull public java.util.List<java.lang.String> getLibraryNames();
    method @XmlRes public int getLocaleConfigRes();
    method @DrawableRes public int getLogoRes();
    method public long getLongVersionCode();
    method public float getMaxAspectRatio();
    method public float getMinAspectRatio();
    method public int getNativeHeapZeroInitialized();
    method @XmlRes public int getNetworkSecurityConfigRes();
    method @Nullable public String getRequiredAccountType();
    method @Dimension(unit=android.annotation.Dimension.DP) public int getRequiresSmallestWidthDp();
    method @Nullable public String getRestrictedAccountType();
    method @DrawableRes public int getRoundIconRes();
    method @Nullable public String getSdkLibraryName();
    method @Nullable public String getSharedUserId();
    method @StringRes public int getSharedUserLabelRes();
    method @NonNull public java.util.List<com.android.server.pm.pkg.AndroidPackageSplit> getSplits();
    method @Nullable public String getStaticSharedLibraryName();
    method @NonNull public java.util.UUID getStorageUuid();
    method public int getTargetSdkVersion();
    method @StyleRes public int getThemeRes();
    method public int getUiOptions();
    method @Nullable public String getVersionName();
    method @Nullable public String getZygotePreloadName();
    method public boolean isAllowAudioPlaybackCapture();
    method public boolean isAllowBackup();
    method public boolean isAllowClearUserData();
    method public boolean isAllowClearUserDataOnFailedRestore();
    method public boolean isAllowNativeHeapPointerTagging();
    method public boolean isAllowTaskReparenting();
    method public boolean isAnyDensity();
    method public boolean isAttributionsUserVisible();
    method public boolean isBackupInForeground();
    method public boolean isCantSaveState();
    method public boolean isCoreApp();
    method public boolean isCrossProfile();
    method public boolean isDebuggable();
    method public boolean isDefaultToDeviceProtectedStorage();
    method public boolean isDirectBootAware();
    method public boolean isExtractNativeLibs();
    method public boolean isFactoryTest();
    method public boolean isForceQueryable();
    method public boolean isFullBackupOnly();
    method public boolean isHardwareAccelerated();
    method public boolean isHasCode();
    method public boolean isHasFragileUserData();
    method public boolean isIsolatedSplitLoading();
    method public boolean isKillAfterRestore();
    method public boolean isLargeHeap();
    method public boolean isLeavingSharedUser();
    method public boolean isMultiArch();
    method public boolean isNativeLibraryRootRequiresIsa();
    method public boolean isOnBackInvokedCallbackEnabled();
    method public boolean isPersistent();
    method public boolean isProfileable();
    method public boolean isProfileableByShell();
    method public boolean isRequestLegacyExternalStorage();
    method public boolean isRequiredForAllUsers();
    method public boolean isResetEnabledSettingsOnAppDataCleared();
    method public boolean isResourceOverlay();
    method public boolean isRestoreAnyVersion();
    method public boolean isSignedWithPlatformKey();
    method public boolean isSupportsExtraLargeScreens();
    method public boolean isSupportsLargeScreens();
    method public boolean isSupportsNormalScreens();
    method public boolean isSupportsRtl();
    method public boolean isSupportsSmallScreens();
    method public boolean isTestOnly();
    method public boolean isUse32BitAbi();
    method public boolean isUseEmbeddedDex();
    method public boolean isUsesCleartextTraffic();
    method public boolean isUsesNonSdkApi();
    method public boolean isVmSafeMode();
  }

  public interface AndroidPackageSplit {
    method @Nullable public String getClassLoaderName();
    method @NonNull public java.util.List<com.android.server.pm.pkg.AndroidPackageSplit> getDependencies();
    method @Nullable public String getName();
    method @NonNull public String getPath();
    method public int getRevisionCode();
    method public boolean isHasCode();
  }

  public interface PackageState {
    method @Nullable public com.android.server.pm.pkg.AndroidPackage getAndroidPackage();
    method public int getAppId();
    method public int getHiddenApiEnforcementPolicy();
    method @NonNull public String getPackageName();
    method @Nullable public String getPrimaryCpuAbi();
    method @Nullable public String getSeInfo();
    method @Nullable public String getSecondaryCpuAbi();
    method @NonNull public com.android.server.pm.pkg.PackageUserState getStateForUser(@NonNull android.os.UserHandle);
    method @NonNull public java.util.List<com.android.server.pm.pkg.SharedLibrary> getUsesLibraries();
    method public boolean isApex();
    method public boolean isPrivileged();
    method public boolean isSystem();
    method public boolean isUpdatedSystemApp();
  }

  public interface PackageUserState {
    method public long getFirstInstallTimeMillis();
    method public boolean isInstalled();
  }

  public interface SharedLibrary {
    method @NonNull public java.util.List<java.lang.String> getAllCodePaths();
    method @NonNull public android.content.pm.VersionedPackage getDeclaringPackage();
    method @NonNull public java.util.List<com.android.server.pm.pkg.SharedLibrary> getDependencies();
    method @NonNull public java.util.List<android.content.pm.VersionedPackage> getDependentPackages();
    method @Nullable public String getName();
    method @Nullable public String getPackageName();
    method @Nullable public String getPath();
    method public int getType();
    method public long getVersion();
    method public boolean isNative();
  }

}

package com.android.server.role {

  public interface RoleServicePlatformHelper {
    method @NonNull public String computePackageStateHash(int);
    method @NonNull public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getLegacyRoleState(int);
  }

}

package com.android.server.security {

  public class FileIntegrityService extends com.android.server.SystemService {
    method public void onStart();
    method public static void setUpFsVerity(@NonNull String) throws java.io.IOException;
  }

  public class KeyChainSystemService extends com.android.server.SystemService {
    method public void onStart();
  }

}

package com.android.server.stats {

  public final class StatsHelper {
    method public static void sendStatsdReadyBroadcast(@NonNull android.content.Context);
  }

}

package com.android.server.usage {

  public interface StorageStatsManagerLocal {
    method public void registerStorageStatsAugmenter(@NonNull com.android.server.usage.StorageStatsManagerLocal.StorageStatsAugmenter, @NonNull String);
  }

  public static interface StorageStatsManagerLocal.StorageStatsAugmenter {
    method public void augmentStatsForPackageForUser(@NonNull android.content.pm.PackageStats, @NonNull String, @NonNull android.os.UserHandle, boolean);
    method public void augmentStatsForUid(@NonNull android.content.pm.PackageStats, int, boolean);
    method public void augmentStatsForUser(@NonNull android.content.pm.PackageStats, @NonNull android.os.UserHandle);
  }

}

package com.android.server.wifi {

  public class SupplicantManager {
    method public static void start();
    method public static void stop();
  }

}

package com.android.server.wm {

  public interface ActivityInterceptorCallback {
    method public default void onActivityLaunched(@NonNull android.app.TaskInfo, @NonNull android.content.pm.ActivityInfo, @NonNull com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptorInfo);
    method @Nullable public com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptResult onInterceptActivityLaunch(@NonNull com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptorInfo);
    field public static final int MAINLINE_SDK_SANDBOX_ORDER_ID = 1001; // 0x3e9
  }

  public static final class ActivityInterceptorCallback.ActivityInterceptResult {
    ctor public ActivityInterceptorCallback.ActivityInterceptResult(@NonNull android.content.Intent, @NonNull android.app.ActivityOptions, boolean);
    method @NonNull public android.app.ActivityOptions getActivityOptions();
    method @NonNull public android.content.Intent getIntent();
    method public boolean isActivityResolved();
  }

  public static final class ActivityInterceptorCallback.ActivityInterceptorInfo {
    method @NonNull public android.content.pm.ActivityInfo getActivityInfo();
    method @Nullable public String getCallingFeatureId();
    method @Nullable public String getCallingPackage();
    method public int getCallingPid();
    method public int getCallingUid();
    method @Nullable public android.app.ActivityOptions getCheckedOptions();
    method @Nullable public Runnable getClearOptionsAnimationRunnable();
    method @NonNull public android.content.Intent getIntent();
    method public int getRealCallingPid();
    method public int getRealCallingUid();
    method @NonNull public android.content.pm.ResolveInfo getResolveInfo();
    method @Nullable public String getResolvedType();
    method public int getUserId();
  }

  public static final class ActivityInterceptorCallback.ActivityInterceptorInfo.Builder {
    ctor public ActivityInterceptorCallback.ActivityInterceptorInfo.Builder(int, int, int, int, int, @NonNull android.content.Intent, @NonNull android.content.pm.ResolveInfo, @NonNull android.content.pm.ActivityInfo);
    method @NonNull public com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptorInfo build();
    method @NonNull public com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptorInfo.Builder setCallingFeatureId(@NonNull String);
    method @NonNull public com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptorInfo.Builder setCallingPackage(@NonNull String);
    method @NonNull public com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptorInfo.Builder setCheckedOptions(@NonNull android.app.ActivityOptions);
    method @NonNull public com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptorInfo.Builder setClearOptionsAnimationRunnable(@NonNull Runnable);
    method @NonNull public com.android.server.wm.ActivityInterceptorCallback.ActivityInterceptorInfo.Builder setResolvedType(@NonNull String);
  }

  public class ActivityInterceptorCallbackRegistry {
    method @NonNull public static com.android.server.wm.ActivityInterceptorCallbackRegistry getInstance();
    method public void registerActivityInterceptorCallback(int, @NonNull com.android.server.wm.ActivityInterceptorCallback);
    method public void unregisterActivityInterceptorCallback(int);
  }

}

