package android.car.content.pm {

  public final class CarPackageManager {
    method public void setEnableActivityBlocking(boolean);
  }

}

package android.car.drivingstate {

  public final class CarUxRestrictionsManager {
    method public synchronized android.car.drivingstate.CarUxRestrictionsConfiguration getConfig() throws android.car.CarNotConnectedException;
    method public synchronized android.car.drivingstate.CarUxRestrictionsConfiguration getStagedConfig() throws android.car.CarNotConnectedException;
  }

}

package android.car.media {

  public final class CarAudioManager {
    method public boolean isDynamicRoutingEnabled() throws android.car.CarNotConnectedException;
  }

}

