// Signature format: 2.0
package com.android.xml.permission {

  public class AllowAssociation {
    ctor public AllowAssociation();
    method public String getAllowed();
    method public String getTarget();
    method public void setAllowed(String);
    method public void setTarget(String);
  }

  public class AllowIgnoreLocationSettings {
    ctor public AllowIgnoreLocationSettings();
    method public String get_package();
    method public void set_package(String);
  }

  public class AllowImplicitBroadcast {
    ctor public AllowImplicitBroadcast();
    method public String getAction();
    method public void setAction(String);
  }

  public class AllowInDataUsageSave {
    ctor public AllowInDataUsageSave();
    method public String get_package();
    method public void set_package(String);
  }

  public class AllowInPowerSave {
    ctor public AllowInPowerSave();
    method public String get_package();
    method public void set_package(String);
  }

  public class AllowInPowerSaveExceptIdle {
    ctor public AllowInPowerSaveExceptIdle();
    method public String get_package();
    method public void set_package(String);
  }

  public class AllowUnthrottledLocation {
    ctor public AllowUnthrottledLocation();
    method public String get_package();
    method public void set_package(String);
  }

  public class AppLink {
    ctor public AppLink();
    method public String get_package();
    method public void set_package(String);
  }

  public class AssignPermission {
    ctor public AssignPermission();
    method public String getName();
    method public int getUid();
    method public void setName(String);
    method public void setUid(int);
  }

  public class BackupTransportWhitelistedService {
    ctor public BackupTransportWhitelistedService();
    method public String getService();
    method public void setService(String);
  }

  public class BugreportWhitelisted {
    ctor public BugreportWhitelisted();
    method public String get_package();
    method public void set_package(String);
  }

  public class DefaultEnabledVrApp {
    ctor public DefaultEnabledVrApp();
    method public String get_class();
    method public String get_package();
    method public void set_class(String);
    method public void set_package(String);
  }

  public class DisabledUntilUsedPreinstalledCarrierApp {
    ctor public DisabledUntilUsedPreinstalledCarrierApp();
    method public String get_package();
    method public void set_package(String);
  }

  public class DisabledUntilUsedPreinstalledCarrierAssociatedApp {
    ctor public DisabledUntilUsedPreinstalledCarrierAssociatedApp();
    method public String getCarrierAppPackage();
    method public String get_package();
    method public void setCarrierAppPackage(String);
    method public void set_package(String);
  }

  public class Feature {
    ctor public Feature();
    method public String getName();
    method public String getNotLowRam();
    method public void setName(String);
    method public void setNotLowRam(String);
  }

  public class Group {
    ctor public Group();
    method public int getGid();
    method public void setGid(int);
  }

  public class HiddenApiWhitelistedApp {
    ctor public HiddenApiWhitelistedApp();
    method public String get_package();
    method public void set_package(String);
  }

  public class Library {
    ctor public Library();
    method public String getDependency();
    method public String getFile();
    method public String getName();
    method public void setDependency(String);
    method public void setFile(String);
    method public void setName(String);
  }

  public class OemPermissions {
    ctor public OemPermissions();
    method public java.util.List<com.android.xml.permission.OemPermissions.DenyPermission> getDenyPermission();
    method public java.util.List<com.android.xml.permission.OemPermissions.Permission> getPermission();
    method public String get_package();
    method public void set_package(String);
  }

  public static class OemPermissions.DenyPermission {
    ctor public OemPermissions.DenyPermission();
    method public String getName();
    method public void setName(String);
  }

  public static class OemPermissions.Permission {
    ctor public OemPermissions.Permission();
    method public String getName();
    method public void setName(String);
  }

  public class Permission {
    ctor public Permission();
    method public String getName();
    method public void setName(String);
  }

  public class Permissions {
    ctor public Permissions();
    method public java.util.List<com.android.xml.permission.AllowAssociation> getAllowAssociation();
    method public java.util.List<com.android.xml.permission.AllowIgnoreLocationSettings> getAllowIgnoreLocationSettings();
    method public java.util.List<com.android.xml.permission.AllowImplicitBroadcast> getAllowImplicitBroadcast();
    method public java.util.List<com.android.xml.permission.AllowInDataUsageSave> getAllowInDataUsageSave();
    method public java.util.List<com.android.xml.permission.AllowInPowerSave> getAllowInPowerSave();
    method public java.util.List<com.android.xml.permission.AllowInPowerSaveExceptIdle> getAllowInPowerSaveExceptIdle();
    method public java.util.List<com.android.xml.permission.AllowUnthrottledLocation> getAllowUnthrottledLocation();
    method public java.util.List<com.android.xml.permission.AppLink> getAppLink();
    method public java.util.List<com.android.xml.permission.AssignPermission> getAssignPermission();
    method public java.util.List<com.android.xml.permission.BackupTransportWhitelistedService> getBackupTransportWhitelistedService();
    method public java.util.List<com.android.xml.permission.BugreportWhitelisted> getBugreportWhitelisted();
    method public java.util.List<com.android.xml.permission.DefaultEnabledVrApp> getDefaultEnabledVrApp();
    method public java.util.List<com.android.xml.permission.DisabledUntilUsedPreinstalledCarrierApp> getDisabledUntilUsedPreinstalledCarrierApp();
    method public java.util.List<com.android.xml.permission.DisabledUntilUsedPreinstalledCarrierAssociatedApp> getDisabledUntilUsedPreinstalledCarrierAssociatedApp();
    method public java.util.List<com.android.xml.permission.Feature> getFeature();
    method public java.util.List<com.android.xml.permission.Group> getGroup();
    method public java.util.List<com.android.xml.permission.HiddenApiWhitelistedApp> getHiddenApiWhitelistedApp();
    method public java.util.List<com.android.xml.permission.Library> getLibrary();
    method public java.util.List<com.android.xml.permission.OemPermissions> getOemPermissions();
    method public java.util.List<com.android.xml.permission.Permission> getPermission();
    method public java.util.List<com.android.xml.permission.PrivappPermissions> getPrivappPermissions();
    method public java.util.List<com.android.xml.permission.SplitPermission> getSplitPermission();
    method public java.util.List<com.android.xml.permission.SystemUserBlacklistedApp> getSystemUserBlacklistedApp();
    method public java.util.List<com.android.xml.permission.SystemUserWhitelistedApp> getSystemUserWhitelistedApp();
    method public java.util.List<com.android.xml.permission.UnavailableFeature> getUnavailableFeature();
  }

  public class PrivappPermissions {
    ctor public PrivappPermissions();
    method public java.util.List<com.android.xml.permission.PrivappPermissions.DenyPermission> getDenyPermission();
    method public java.util.List<com.android.xml.permission.PrivappPermissions.Permission> getPermission();
    method public String get_package();
    method public void set_package(String);
  }

  public static class PrivappPermissions.DenyPermission {
    ctor public PrivappPermissions.DenyPermission();
    method public String getName();
    method public void setName(String);
  }

  public static class PrivappPermissions.Permission {
    ctor public PrivappPermissions.Permission();
    method public String getName();
    method public void setName(String);
  }

  public class SplitPermission {
    ctor public SplitPermission();
    method public java.util.List<com.android.xml.permission.SplitPermission.Library> getLibrary();
    method public String getName();
    method public int getTargetSdk();
    method public void setName(String);
    method public void setTargetSdk(int);
  }

  public static class SplitPermission.Library {
    ctor public SplitPermission.Library();
    method public String getName();
    method public void setName(String);
  }

  public class SystemUserBlacklistedApp {
    ctor public SystemUserBlacklistedApp();
    method public String get_package();
    method public void set_package(String);
  }

  public class SystemUserWhitelistedApp {
    ctor public SystemUserWhitelistedApp();
    method public String get_package();
    method public void set_package(String);
  }

  public class UnavailableFeature {
    ctor public UnavailableFeature();
    method public String getName();
    method public void setName(String);
  }

  public class XmlParser {
    ctor public XmlParser();
    method public static com.android.xml.permission.Permissions read(java.io.InputStream) throws javax.xml.datatype.DatatypeConfigurationException, java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static String readText(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static void skip(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
  }

}

