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

  public class RebootStats {
    ctor public RebootStats();
    method public long getReadyTimeMs();
    method public long getStartTimeMs();
    method public int getTimesBlockedByAppActivity();
    method public int getTimesBlockedByInteractivity();
    method public int getTimesBlockedBySubsystems();
    method public void setReadyTimeMs(long);
    method public void setStartTimeMs(long);
    method public void setTimesBlockedByAppActivity(int);
    method public void setTimesBlockedByInteractivity(int);
    method public void setTimesBlockedBySubsystems(int);
  }

  public class XmlParser {
    ctor public XmlParser();
    method public static com.android.server.scheduling.RebootStats 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;
  }

  public class XmlWriter implements java.io.Closeable {
    ctor public XmlWriter(java.io.PrintWriter);
    method public void close();
    method public static void write(com.android.server.scheduling.XmlWriter, com.android.server.scheduling.RebootStats) throws java.io.IOException;
  }

}

