// Signature format: 4.0
package androidx.health.services.client {

  public interface ExerciseClient {
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> addGoalToActiveExerciseAsync(androidx.health.services.client.data.ExerciseGoal<?> exerciseGoal);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> clearUpdateCallbackAsync(androidx.health.services.client.ExerciseUpdateCallback callback);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> endExerciseAsync();
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> flushAsync();
    method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.ExerciseCapabilities> getCapabilitiesAsync();
    method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.ExerciseInfo> getCurrentExerciseInfoAsync();
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> markLapAsync();
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> overrideAutoPauseAndResumeForActiveExerciseAsync(boolean enabled);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> pauseExerciseAsync();
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> prepareExerciseAsync(androidx.health.services.client.data.WarmUpConfig configuration);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> removeGoalFromActiveExerciseAsync(androidx.health.services.client.data.ExerciseGoal<?> exerciseGoal);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> resumeExerciseAsync();
    method public void setUpdateCallback(androidx.health.services.client.ExerciseUpdateCallback callback);
    method public void setUpdateCallback(java.util.concurrent.Executor executor, androidx.health.services.client.ExerciseUpdateCallback callback);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> startExerciseAsync(androidx.health.services.client.data.ExerciseConfig configuration);
  }

  public interface ExerciseUpdateCallback {
    method public void onAvailabilityChanged(androidx.health.services.client.data.DataType<?,?> dataType, androidx.health.services.client.data.Availability availability);
    method public void onExerciseUpdateReceived(androidx.health.services.client.data.ExerciseUpdate update);
    method public void onLapSummaryReceived(androidx.health.services.client.data.ExerciseLapSummary lapSummary);
    method public void onRegistered();
    method public void onRegistrationFailed(Throwable throwable);
  }

  public final class HealthServices {
    method public static androidx.health.services.client.HealthServicesClient getClient(android.content.Context context);
    field public static final androidx.health.services.client.HealthServices INSTANCE;
  }

  public interface HealthServicesClient {
    method public androidx.health.services.client.ExerciseClient getExerciseClient();
    method public androidx.health.services.client.MeasureClient getMeasureClient();
    method public androidx.health.services.client.PassiveMonitoringClient getPassiveMonitoringClient();
    property public abstract androidx.health.services.client.ExerciseClient exerciseClient;
    property public abstract androidx.health.services.client.MeasureClient measureClient;
    property public abstract androidx.health.services.client.PassiveMonitoringClient passiveMonitoringClient;
  }

  public interface MeasureCallback {
    method public void onAvailabilityChanged(androidx.health.services.client.data.DeltaDataType<?,?> dataType, androidx.health.services.client.data.Availability availability);
    method public void onDataReceived(androidx.health.services.client.data.DataPointContainer data);
    method public default void onRegistered();
    method public default void onRegistrationFailed(Throwable throwable);
  }

  public interface MeasureClient {
    method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.MeasureCapabilities> getCapabilitiesAsync();
    method public void registerMeasureCallback(androidx.health.services.client.data.DeltaDataType<?,?> dataType, androidx.health.services.client.MeasureCallback callback);
    method public void registerMeasureCallback(androidx.health.services.client.data.DeltaDataType<?,?> dataType, java.util.concurrent.Executor executor, androidx.health.services.client.MeasureCallback callback);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> unregisterMeasureCallbackAsync(androidx.health.services.client.data.DeltaDataType<?,?> dataType, androidx.health.services.client.MeasureCallback callback);
  }

  public interface PassiveListenerCallback {
    method public default void onGoalCompleted(androidx.health.services.client.data.PassiveGoal goal);
    method public default void onHealthEventReceived(androidx.health.services.client.data.HealthEvent event);
    method public default void onNewDataPointsReceived(androidx.health.services.client.data.DataPointContainer dataPoints);
    method public default void onPermissionLost();
    method public default void onRegistered();
    method public default void onRegistrationFailed(Throwable throwable);
    method public default void onUserActivityInfoReceived(androidx.health.services.client.data.UserActivityInfo info);
  }

  public abstract class PassiveListenerService extends android.app.Service {
    ctor public PassiveListenerService();
    method public final android.os.IBinder? onBind(android.content.Intent intent);
    method public void onGoalCompleted(androidx.health.services.client.data.PassiveGoal goal);
    method public void onHealthEventReceived(androidx.health.services.client.data.HealthEvent event);
    method public void onNewDataPointsReceived(androidx.health.services.client.data.DataPointContainer dataPoints);
    method public void onPermissionLost();
    method public void onUserActivityInfoReceived(androidx.health.services.client.data.UserActivityInfo info);
  }

  public interface PassiveMonitoringClient {
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> clearPassiveListenerCallbackAsync();
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> clearPassiveListenerServiceAsync();
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> flushAsync();
    method public com.google.common.util.concurrent.ListenableFuture<androidx.health.services.client.data.PassiveMonitoringCapabilities> getCapabilitiesAsync();
    method public void setPassiveListenerCallback(androidx.health.services.client.data.PassiveListenerConfig config, androidx.health.services.client.PassiveListenerCallback callback);
    method public void setPassiveListenerCallback(androidx.health.services.client.data.PassiveListenerConfig config, java.util.concurrent.Executor executor, androidx.health.services.client.PassiveListenerCallback callback);
    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> setPassiveListenerServiceAsync(Class<? extends androidx.health.services.client.PassiveListenerService> service, androidx.health.services.client.data.PassiveListenerConfig config);
  }

  public final class VersionApiService extends android.app.Service {
    ctor public VersionApiService();
    method public android.os.IBinder? onBind(android.content.Intent? intent);
  }

}

package androidx.health.services.client.data {

  public final class AggregateDataType<T extends java.lang.Number, D extends androidx.health.services.client.data.DataPoint<T>> extends androidx.health.services.client.data.DataType<T,D> {
    ctor public AggregateDataType(String name, androidx.health.services.client.data.DataType.TimeType timeType, Class<T> valueClass);
  }

  public interface Availability {
    method public int getId();
    property public abstract int id;
    field public static final androidx.health.services.client.data.Availability.Companion Companion;
  }

  public static final class Availability.Companion {
  }

  public final class ComparisonType {
    method public int getId();
    method public String getName();
    property public final int id;
    property public final String name;
    field public static final androidx.health.services.client.data.ComparisonType.Companion Companion;
    field public static final androidx.health.services.client.data.ComparisonType GREATER_THAN;
    field public static final androidx.health.services.client.data.ComparisonType GREATER_THAN_OR_EQUAL;
    field public static final androidx.health.services.client.data.ComparisonType LESS_THAN;
    field public static final androidx.health.services.client.data.ComparisonType LESS_THAN_OR_EQUAL;
    field public static final androidx.health.services.client.data.ComparisonType UNKNOWN;
  }

  public static final class ComparisonType.Companion {
  }

  public final class CumulativeDataPoint<T extends java.lang.Number> extends androidx.health.services.client.data.DataPoint<T> {
    ctor public CumulativeDataPoint(androidx.health.services.client.data.AggregateDataType<T,androidx.health.services.client.data.CumulativeDataPoint<T>> dataType, T total, java.time.Instant start, java.time.Instant end);
    method public java.time.Instant getEnd();
    method public java.time.Instant getStart();
    method public T getTotal();
    property public final java.time.Instant end;
    property public final java.time.Instant start;
    property public final T total;
  }

  public abstract class DataPoint<T> {
    method public androidx.health.services.client.data.DataType<T,? extends androidx.health.services.client.data.DataPoint<T>> getDataType();
    property public androidx.health.services.client.data.DataType<T,? extends androidx.health.services.client.data.DataPoint<T>> dataType;
  }

  public abstract class DataPointAccuracy {
    ctor public DataPointAccuracy();
  }

  public final class DataPointContainer {
    ctor public DataPointContainer(java.util.Map<androidx.health.services.client.data.DataType<?,?>,? extends java.util.List<? extends androidx.health.services.client.data.DataPoint<?>>> dataPoints);
    ctor public DataPointContainer(java.util.List<? extends androidx.health.services.client.data.DataPoint<?>> dataPointList);
    method public java.util.List<androidx.health.services.client.data.CumulativeDataPoint<?>> getCumulativeDataPoints();
    method public <T, D extends androidx.health.services.client.data.DataPoint<T>> java.util.List<D> getData(androidx.health.services.client.data.DeltaDataType<T,D> type);
    method public <T extends java.lang.Number, D extends androidx.health.services.client.data.DataPoint<T>> D? getData(androidx.health.services.client.data.AggregateDataType<T,D> type);
    method public java.util.Set<androidx.health.services.client.data.DataType<?,?>> getDataTypes();
    method public java.util.List<androidx.health.services.client.data.IntervalDataPoint<?>> getIntervalDataPoints();
    method public java.util.List<androidx.health.services.client.data.SampleDataPoint<?>> getSampleDataPoints();
    method public java.util.List<androidx.health.services.client.data.StatisticalDataPoint<?>> getStatisticalDataPoints();
    property public final java.util.List<androidx.health.services.client.data.CumulativeDataPoint<?>> cumulativeDataPoints;
    property public final java.util.Set<androidx.health.services.client.data.DataType<?,?>> dataTypes;
    property public final java.util.List<androidx.health.services.client.data.IntervalDataPoint<?>> intervalDataPoints;
    property public final java.util.List<androidx.health.services.client.data.SampleDataPoint<?>> sampleDataPoints;
    property public final java.util.List<androidx.health.services.client.data.StatisticalDataPoint<?>> statisticalDataPoints;
  }

  public abstract class DataType<T, D extends androidx.health.services.client.data.DataPoint<T>> {
    ctor public DataType(String name, androidx.health.services.client.data.DataType.TimeType timeType, Class<T> valueClass, boolean isAggregate);
    method public final String getName();
    method public final Class<T> getValueClass();
    property public final String name;
    property public final Class<T> valueClass;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.SampleDataPoint<java.lang.Double>> ABSOLUTE_ELEVATION;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.StatisticalDataPoint<java.lang.Double>> ABSOLUTE_ELEVATION_STATS;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> ACTIVE_EXERCISE_DURATION_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> CALORIES;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> CALORIES_DAILY;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Double>> CALORIES_TOTAL;
    field public static final androidx.health.services.client.data.DataType.Companion Companion;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> DECLINE_DISTANCE;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Double>> DECLINE_DISTANCE_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> DECLINE_DURATION;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> DECLINE_DURATION_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> DISTANCE;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> DISTANCE_DAILY;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Double>> DISTANCE_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> ELEVATION_GAIN;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Double>> ELEVATION_GAIN_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> ELEVATION_LOSS;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Double>> ELEVATION_LOSS_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> FLAT_GROUND_DISTANCE;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Double>> FLAT_GROUND_DISTANCE_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> FLAT_GROUND_DURATION;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> FLAT_GROUND_DURATION_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> FLOORS;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> FLOORS_DAILY;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Double>> FLOORS_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> GOLF_SHOT_COUNT;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> GOLF_SHOT_COUNT_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.SampleDataPoint<java.lang.Double>> HEART_RATE_BPM;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.StatisticalDataPoint<java.lang.Double>> HEART_RATE_BPM_STATS;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.IntervalDataPoint<java.lang.Double>> INCLINE_DISTANCE;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Double>> INCLINE_DISTANCE_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> INCLINE_DURATION;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> INCLINE_DURATION_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<androidx.health.services.client.data.LocationData,androidx.health.services.client.data.SampleDataPoint<androidx.health.services.client.data.LocationData>> LOCATION;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.SampleDataPoint<java.lang.Double>> PACE;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.StatisticalDataPoint<java.lang.Double>> PACE_STATS;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> REP_COUNT;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> REP_COUNT_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> RESTING_EXERCISE_DURATION;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> RESTING_EXERCISE_DURATION_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> RUNNING_STEPS;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> RUNNING_STEPS_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.SampleDataPoint<java.lang.Double>> SPEED;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.StatisticalDataPoint<java.lang.Double>> SPEED_STATS;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> STEPS;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> STEPS_DAILY;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.SampleDataPoint<java.lang.Long>> STEPS_PER_MINUTE;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.StatisticalDataPoint<java.lang.Long>> STEPS_PER_MINUTE_STATS;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> STEPS_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> SWIMMING_LAP_COUNT;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> SWIMMING_STROKES;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> SWIMMING_STROKES_TOTAL;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Double,androidx.health.services.client.data.SampleDataPoint<java.lang.Double>> VO2_MAX;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Double,androidx.health.services.client.data.StatisticalDataPoint<java.lang.Double>> VO2_MAX_STATS;
    field public static final androidx.health.services.client.data.DeltaDataType<java.lang.Long,androidx.health.services.client.data.IntervalDataPoint<java.lang.Long>> WALKING_STEPS;
    field public static final androidx.health.services.client.data.AggregateDataType<java.lang.Long,androidx.health.services.client.data.CumulativeDataPoint<java.lang.Long>> WALKING_STEPS_TOTAL;
  }

  public static final class DataType.Companion {
  }

  public static final class DataType.TimeType {
    method public int getId();
    method public String getName();
    property public final int id;
    property public final String name;
    field public static final androidx.health.services.client.data.DataType.TimeType.Companion Companion;
    field public static final androidx.health.services.client.data.DataType.TimeType INTERVAL;
    field public static final androidx.health.services.client.data.DataType.TimeType SAMPLE;
    field public static final androidx.health.services.client.data.DataType.TimeType UNKNOWN;
  }

  public static final class DataType.TimeType.Companion {
  }

  public final class DataTypeAvailability implements androidx.health.services.client.data.Availability {
    method public static androidx.health.services.client.data.DataTypeAvailability? fromId(int id);
    method public int getId();
    method public String getName();
    property public int id;
    property public final String name;
    field public static final androidx.health.services.client.data.DataTypeAvailability ACQUIRING;
    field public static final androidx.health.services.client.data.DataTypeAvailability AVAILABLE;
    field public static final androidx.health.services.client.data.DataTypeAvailability.Companion Companion;
    field public static final androidx.health.services.client.data.DataTypeAvailability UNAVAILABLE;
    field public static final androidx.health.services.client.data.DataTypeAvailability UNAVAILABLE_DEVICE_OFF_BODY;
    field public static final androidx.health.services.client.data.DataTypeAvailability UNKNOWN;
  }

  public static final class DataTypeAvailability.Companion {
    method public androidx.health.services.client.data.DataTypeAvailability? fromId(int id);
  }

  public final class DataTypeCondition<T extends java.lang.Number, D extends androidx.health.services.client.data.DataType<T, ? extends androidx.health.services.client.data.DataPoint<T>>> {
    ctor public DataTypeCondition(D dataType, T threshold, androidx.health.services.client.data.ComparisonType comparisonType);
    method public androidx.health.services.client.data.ComparisonType getComparisonType();
    method public D getDataType();
    method public T getThreshold();
    property public final androidx.health.services.client.data.ComparisonType comparisonType;
    property public final D dataType;
    property public final T threshold;
  }

  public final class DeltaDataType<T, D extends androidx.health.services.client.data.DataPoint<T>> extends androidx.health.services.client.data.DataType<T,D> {
    ctor public DeltaDataType(String name, androidx.health.services.client.data.DataType.TimeType timeType, Class<T> valueClass);
  }

  public final class ExerciseCapabilities {
    ctor public ExerciseCapabilities(java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities);
    method public java.util.Set<androidx.health.services.client.data.ExerciseType> getAutoPauseAndResumeEnabledExercises();
    method public androidx.health.services.client.data.ExerciseTypeCapabilities getExerciseTypeCapabilities(androidx.health.services.client.data.ExerciseType exercise);
    method public java.util.Set<androidx.health.services.client.data.ExerciseType> getSupportedExerciseTypes();
    method public java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> getTypeToCapabilities();
    property public final java.util.Set<androidx.health.services.client.data.ExerciseType> autoPauseAndResumeEnabledExercises;
    property public final java.util.Set<androidx.health.services.client.data.ExerciseType> supportedExerciseTypes;
    property public final java.util.Map<androidx.health.services.client.data.ExerciseType,androidx.health.services.client.data.ExerciseTypeCapabilities> typeToCapabilities;
  }

  public final class ExerciseConfig {
    ctor public ExerciseConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<? extends androidx.health.services.client.data.DataType<?,?>> dataTypes, boolean isAutoPauseAndResumeEnabled, boolean isGpsEnabled, optional java.util.List<? extends androidx.health.services.client.data.ExerciseGoal<?>> exerciseGoals, optional android.os.Bundle exerciseParams, optional @FloatRange(from=0.0) float swimmingPoolLengthMeters);
    method public static androidx.health.services.client.data.ExerciseConfig.Builder builder(androidx.health.services.client.data.ExerciseType exerciseType);
    method public java.util.Set<androidx.health.services.client.data.DataType<?,?>> getDataTypes();
    method public java.util.List<androidx.health.services.client.data.ExerciseGoal<?>> getExerciseGoals();
    method public android.os.Bundle getExerciseParams();
    method public androidx.health.services.client.data.ExerciseType getExerciseType();
    method public float getSwimmingPoolLengthMeters();
    method public boolean isAutoPauseAndResumeEnabled();
    method public boolean isGpsEnabled();
    property public final java.util.Set<androidx.health.services.client.data.DataType<?,?>> dataTypes;
    property public final java.util.List<androidx.health.services.client.data.ExerciseGoal<?>> exerciseGoals;
    property public final android.os.Bundle exerciseParams;
    property public final androidx.health.services.client.data.ExerciseType exerciseType;
    property public final boolean isAutoPauseAndResumeEnabled;
    property public final boolean isGpsEnabled;
    property public final float swimmingPoolLengthMeters;
    field public static final androidx.health.services.client.data.ExerciseConfig.Companion Companion;
    field public static final float SWIMMING_POOL_LENGTH_UNSPECIFIED = 0.0f;
  }

  public static final class ExerciseConfig.Builder {
    ctor public ExerciseConfig.Builder(androidx.health.services.client.data.ExerciseType exerciseType);
    method public androidx.health.services.client.data.ExerciseConfig build();
    method public androidx.health.services.client.data.ExerciseConfig.Builder setDataTypes(java.util.Set<? extends androidx.health.services.client.data.DataType<?,?>> dataTypes);
    method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseGoals(java.util.List<? extends androidx.health.services.client.data.ExerciseGoal<?>> exerciseGoals);
    method public androidx.health.services.client.data.ExerciseConfig.Builder setExerciseParams(android.os.Bundle exerciseParams);
    method public androidx.health.services.client.data.ExerciseConfig.Builder setIsAutoPauseAndResumeEnabled(boolean isAutoPauseAndResumeEnabled);
    method public androidx.health.services.client.data.ExerciseConfig.Builder setIsGpsEnabled(boolean isGpsEnabled);
    method public androidx.health.services.client.data.ExerciseConfig.Builder setSwimmingPoolLengthMeters(float swimmingPoolLength);
  }

  public static final class ExerciseConfig.Companion {
    method public androidx.health.services.client.data.ExerciseConfig.Builder builder(androidx.health.services.client.data.ExerciseType exerciseType);
  }

  public final class ExerciseGoal<T extends java.lang.Number> implements android.os.Parcelable {
    method public static <T extends java.lang.Number> androidx.health.services.client.data.ExerciseGoal<T> createMilestone(androidx.health.services.client.data.DataTypeCondition<T,androidx.health.services.client.data.AggregateDataType<T,?>> condition, T period);
    method public static <T extends java.lang.Number> androidx.health.services.client.data.ExerciseGoal<T> createMilestoneGoalWithUpdatedThreshold(androidx.health.services.client.data.ExerciseGoal<T> goal, T newThreshold);
    method public static <T extends java.lang.Number> androidx.health.services.client.data.ExerciseGoal<T> createOneTimeGoal(androidx.health.services.client.data.DataTypeCondition<T,androidx.health.services.client.data.AggregateDataType<T,?>> condition);
    method public int describeContents();
    method public androidx.health.services.client.data.DataTypeCondition<T,androidx.health.services.client.data.AggregateDataType<T,?>> getDataTypeCondition();
    method public androidx.health.services.client.data.ExerciseGoalType getExerciseGoalType();
    method public T? getPeriod();
    method public void writeToParcel(android.os.Parcel dest, int flags);
    property public final androidx.health.services.client.data.DataTypeCondition<T,androidx.health.services.client.data.AggregateDataType<T,?>> dataTypeCondition;
    property public final androidx.health.services.client.data.ExerciseGoalType exerciseGoalType;
    property public final T? period;
    field public static final android.os.Parcelable.Creator<androidx.health.services.client.data.ExerciseGoal<?>> CREATOR;
    field public static final androidx.health.services.client.data.ExerciseGoal.Companion Companion;
  }

  public static final class ExerciseGoal.Companion {
    method public <T extends java.lang.Number> androidx.health.services.client.data.ExerciseGoal<T> createMilestone(androidx.health.services.client.data.DataTypeCondition<T,androidx.health.services.client.data.AggregateDataType<T,?>> condition, T period);
    method public <T extends java.lang.Number> androidx.health.services.client.data.ExerciseGoal<T> createMilestoneGoalWithUpdatedThreshold(androidx.health.services.client.data.ExerciseGoal<T> goal, T newThreshold);
    method public <T extends java.lang.Number> androidx.health.services.client.data.ExerciseGoal<T> createOneTimeGoal(androidx.health.services.client.data.DataTypeCondition<T,androidx.health.services.client.data.AggregateDataType<T,?>> condition);
  }

  public final class ExerciseGoalType {
    method public static androidx.health.services.client.data.ExerciseGoalType? fromId(int id);
    method public int getId();
    method public String getName();
    property public final int id;
    property public final String name;
    field public static final androidx.health.services.client.data.ExerciseGoalType.Companion Companion;
    field public static final androidx.health.services.client.data.ExerciseGoalType MILESTONE;
    field public static final androidx.health.services.client.data.ExerciseGoalType ONE_TIME_GOAL;
  }

  public static final class ExerciseGoalType.Companion {
    method public androidx.health.services.client.data.ExerciseGoalType? fromId(int id);
  }

  public final class ExerciseInfo {
    ctor public ExerciseInfo(int exerciseTrackedStatus, androidx.health.services.client.data.ExerciseType exerciseType);
    method public int getExerciseTrackedStatus();
    method public androidx.health.services.client.data.ExerciseType getExerciseType();
    property public final int exerciseTrackedStatus;
    property public final androidx.health.services.client.data.ExerciseType exerciseType;
  }

  public final class ExerciseLapSummary {
    ctor public ExerciseLapSummary(int lapCount, java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.DataPointContainer lapMetrics);
    method public java.time.Duration getActiveDuration();
    method public java.time.Instant getEndTime();
    method public int getLapCount();
    method public androidx.health.services.client.data.DataPointContainer getLapMetrics();
    method public java.time.Instant getStartTime();
    property public final java.time.Duration activeDuration;
    property public final java.time.Instant endTime;
    property public final int lapCount;
    property public final androidx.health.services.client.data.DataPointContainer lapMetrics;
    property public final java.time.Instant startTime;
  }

  public final class ExerciseState {
    method public static androidx.health.services.client.data.ExerciseState? fromId(int id);
    method public int getId();
    method public String getName();
    method public boolean isEnded();
    method public boolean isEnding();
    method public boolean isPaused();
    method public boolean isResuming();
    property public final int id;
    property public final boolean isEnded;
    property public final boolean isEnding;
    property public final boolean isPaused;
    property public final boolean isResuming;
    property public final String name;
    field public static final androidx.health.services.client.data.ExerciseState ACTIVE;
    field public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSED;
    field public static final androidx.health.services.client.data.ExerciseState AUTO_PAUSING;
    field public static final androidx.health.services.client.data.ExerciseState AUTO_RESUMING;
    field public static final androidx.health.services.client.data.ExerciseState.Companion Companion;
    field public static final androidx.health.services.client.data.ExerciseState ENDED;
    field public static final androidx.health.services.client.data.ExerciseState ENDING;
    field public static final androidx.health.services.client.data.ExerciseState PREPARING;
    field public static final androidx.health.services.client.data.ExerciseState USER_PAUSED;
    field public static final androidx.health.services.client.data.ExerciseState USER_PAUSING;
    field public static final androidx.health.services.client.data.ExerciseState USER_RESUMING;
    field public static final androidx.health.services.client.data.ExerciseState USER_STARTING;
  }

  public static final class ExerciseState.Companion {
    method public androidx.health.services.client.data.ExerciseState? fromId(int id);
  }

  public final class ExerciseStateInfo {
    ctor public ExerciseStateInfo(androidx.health.services.client.data.ExerciseState exerciseState, int exerciseEndReason);
    method public int getEndReason();
    method public androidx.health.services.client.data.ExerciseState getState();
    property public final int endReason;
    property public final androidx.health.services.client.data.ExerciseState state;
    field public static final androidx.health.services.client.data.ExerciseStateInfo.Companion Companion;
  }

  public static final class ExerciseStateInfo.Companion {
  }

  public final class ExerciseType {
    method public static androidx.health.services.client.data.ExerciseType fromId(int id);
    method public int getId();
    method public String getName();
    property public final int id;
    property public final String name;
    field public static final androidx.health.services.client.data.ExerciseType ALPINE_SKIING;
    field public static final androidx.health.services.client.data.ExerciseType BACKPACKING;
    field public static final androidx.health.services.client.data.ExerciseType BACK_EXTENSION;
    field public static final androidx.health.services.client.data.ExerciseType BADMINTON;
    field public static final androidx.health.services.client.data.ExerciseType BARBELL_SHOULDER_PRESS;
    field public static final androidx.health.services.client.data.ExerciseType BASEBALL;
    field public static final androidx.health.services.client.data.ExerciseType BASKETBALL;
    field public static final androidx.health.services.client.data.ExerciseType BENCH_PRESS;
    field public static final androidx.health.services.client.data.ExerciseType BIKING;
    field public static final androidx.health.services.client.data.ExerciseType BIKING_STATIONARY;
    field public static final androidx.health.services.client.data.ExerciseType BOOT_CAMP;
    field public static final androidx.health.services.client.data.ExerciseType BOXING;
    field public static final androidx.health.services.client.data.ExerciseType BURPEE;
    field public static final androidx.health.services.client.data.ExerciseType CALISTHENICS;
    field public static final androidx.health.services.client.data.ExerciseType CRICKET;
    field public static final androidx.health.services.client.data.ExerciseType CROSS_COUNTRY_SKIING;
    field public static final androidx.health.services.client.data.ExerciseType CRUNCH;
    field public static final androidx.health.services.client.data.ExerciseType.Companion Companion;
    field public static final androidx.health.services.client.data.ExerciseType DANCING;
    field public static final androidx.health.services.client.data.ExerciseType DEADLIFT;
    field public static final androidx.health.services.client.data.ExerciseType ELLIPTICAL;
    field public static final androidx.health.services.client.data.ExerciseType EXERCISE_CLASS;
    field public static final androidx.health.services.client.data.ExerciseType FENCING;
    field public static final androidx.health.services.client.data.ExerciseType FOOTBALL_AMERICAN;
    field public static final androidx.health.services.client.data.ExerciseType FOOTBALL_AUSTRALIAN;
    field public static final androidx.health.services.client.data.ExerciseType FORWARD_TWIST;
    field public static final androidx.health.services.client.data.ExerciseType FRISBEE_DISC;
    field public static final androidx.health.services.client.data.ExerciseType GOLF;
    field public static final androidx.health.services.client.data.ExerciseType GUIDED_BREATHING;
    field public static final androidx.health.services.client.data.ExerciseType GYMNASTICS;
    field public static final androidx.health.services.client.data.ExerciseType HANDBALL;
    field public static final androidx.health.services.client.data.ExerciseType HIGH_INTENSITY_INTERVAL_TRAINING;
    field public static final androidx.health.services.client.data.ExerciseType HIKING;
    field public static final androidx.health.services.client.data.ExerciseType HORSE_RIDING;
    field public static final androidx.health.services.client.data.ExerciseType ICE_HOCKEY;
    field public static final androidx.health.services.client.data.ExerciseType ICE_SKATING;
    field public static final androidx.health.services.client.data.ExerciseType INLINE_SKATING;
    field public static final androidx.health.services.client.data.ExerciseType JUMPING_JACK;
    field public static final androidx.health.services.client.data.ExerciseType JUMP_ROPE;
    field public static final androidx.health.services.client.data.ExerciseType LAT_PULL_DOWN;
    field public static final androidx.health.services.client.data.ExerciseType LUNGE;
    field public static final androidx.health.services.client.data.ExerciseType MARTIAL_ARTS;
    field public static final androidx.health.services.client.data.ExerciseType MEDITATION;
    field public static final androidx.health.services.client.data.ExerciseType MOUNTAIN_BIKING;
    field public static final androidx.health.services.client.data.ExerciseType ORIENTEERING;
    field public static final androidx.health.services.client.data.ExerciseType PADDLING;
    field public static final androidx.health.services.client.data.ExerciseType PARA_GLIDING;
    field public static final androidx.health.services.client.data.ExerciseType PILATES;
    field public static final androidx.health.services.client.data.ExerciseType PLANK;
    field public static final androidx.health.services.client.data.ExerciseType RACQUETBALL;
    field public static final androidx.health.services.client.data.ExerciseType ROCK_CLIMBING;
    field public static final androidx.health.services.client.data.ExerciseType ROLLER_HOCKEY;
    field public static final androidx.health.services.client.data.ExerciseType ROLLER_SKATING;
    field public static final androidx.health.services.client.data.ExerciseType ROWING;
    field public static final androidx.health.services.client.data.ExerciseType ROWING_MACHINE;
    field public static final androidx.health.services.client.data.ExerciseType RUGBY;
    field public static final androidx.health.services.client.data.ExerciseType RUNNING;
    field public static final androidx.health.services.client.data.ExerciseType RUNNING_TREADMILL;
    field public static final androidx.health.services.client.data.ExerciseType SAILING;
    field public static final androidx.health.services.client.data.ExerciseType SCUBA_DIVING;
    field public static final androidx.health.services.client.data.ExerciseType SKATING;
    field public static final androidx.health.services.client.data.ExerciseType SKIING;
    field public static final androidx.health.services.client.data.ExerciseType SNOWBOARDING;
    field public static final androidx.health.services.client.data.ExerciseType SNOWSHOEING;
    field public static final androidx.health.services.client.data.ExerciseType SOCCER;
    field public static final androidx.health.services.client.data.ExerciseType SOFTBALL;
    field public static final androidx.health.services.client.data.ExerciseType SQUASH;
    field public static final androidx.health.services.client.data.ExerciseType SQUAT;
    field public static final androidx.health.services.client.data.ExerciseType STAIR_CLIMBING;
    field public static final androidx.health.services.client.data.ExerciseType STAIR_CLIMBING_MACHINE;
    field public static final androidx.health.services.client.data.ExerciseType STRENGTH_TRAINING;
    field public static final androidx.health.services.client.data.ExerciseType STRETCHING;
    field public static final androidx.health.services.client.data.ExerciseType SURFING;
    field public static final androidx.health.services.client.data.ExerciseType SWIMMING_OPEN_WATER;
    field public static final androidx.health.services.client.data.ExerciseType SWIMMING_POOL;
    field public static final androidx.health.services.client.data.ExerciseType TABLE_TENNIS;
    field public static final androidx.health.services.client.data.ExerciseType TENNIS;
    field public static final androidx.health.services.client.data.ExerciseType UNKNOWN;
    field public static final androidx.health.services.client.data.ExerciseType UPPER_TWIST;
    field public static final androidx.health.services.client.data.ExerciseType VOLLEYBALL;
    field public static final androidx.health.services.client.data.ExerciseType WALKING;
    field public static final androidx.health.services.client.data.ExerciseType WATER_POLO;
    field public static final androidx.health.services.client.data.ExerciseType WEIGHTLIFTING;
    field public static final androidx.health.services.client.data.ExerciseType WORKOUT;
    field public static final androidx.health.services.client.data.ExerciseType YACHTING;
    field public static final androidx.health.services.client.data.ExerciseType YOGA;
  }

  public static final class ExerciseType.Companion {
    method public androidx.health.services.client.data.ExerciseType fromId(int id);
  }

  public final class ExerciseTypeCapabilities {
    ctor public ExerciseTypeCapabilities(java.util.Set<? extends androidx.health.services.client.data.DataType<?,?>> supportedDataTypes, java.util.Map<androidx.health.services.client.data.AggregateDataType<?,?>,? extends java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedGoals, java.util.Map<androidx.health.services.client.data.AggregateDataType<?,?>,? extends java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedMilestones, boolean supportsAutoPauseAndResume);
    method public java.util.Set<androidx.health.services.client.data.DataType<?,?>> getSupportedDataTypes();
    method public java.util.Map<androidx.health.services.client.data.AggregateDataType<?,?>,java.util.Set<androidx.health.services.client.data.ComparisonType>> getSupportedGoals();
    method public java.util.Map<androidx.health.services.client.data.AggregateDataType<?,?>,java.util.Set<androidx.health.services.client.data.ComparisonType>> getSupportedMilestones();
    method public boolean getSupportsAutoPauseAndResume();
    property public final java.util.Set<androidx.health.services.client.data.DataType<?,?>> supportedDataTypes;
    property public final java.util.Map<androidx.health.services.client.data.AggregateDataType<?,?>,java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedGoals;
    property public final java.util.Map<androidx.health.services.client.data.AggregateDataType<?,?>,java.util.Set<androidx.health.services.client.data.ComparisonType>> supportedMilestones;
    property public final boolean supportsAutoPauseAndResume;
  }

  public final class ExerciseUpdate {
    method public java.time.Duration getActiveDurationAtDataPoint(androidx.health.services.client.data.IntervalDataPoint<?> dataPoint);
    method public java.time.Duration getActiveDurationAtDataPoint(androidx.health.services.client.data.SampleDataPoint<?> dataPoint);
    method public androidx.health.services.client.data.ExerciseUpdate.ActiveDurationCheckpoint? getActiveDurationCheckpoint();
    method public androidx.health.services.client.data.ExerciseConfig? getExerciseConfig();
    method public androidx.health.services.client.data.ExerciseStateInfo getExerciseStateInfo();
    method public java.util.Set<androidx.health.services.client.data.ExerciseGoal<? extends java.lang.Number>> getLatestAchievedGoals();
    method public androidx.health.services.client.data.DataPointContainer getLatestMetrics();
    method public java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> getLatestMilestoneMarkerSummaries();
    method public java.time.Instant? getStartTime();
    method public java.time.Duration getUpdateDurationFromBoot();
    property public final androidx.health.services.client.data.ExerciseUpdate.ActiveDurationCheckpoint? activeDurationCheckpoint;
    property public final androidx.health.services.client.data.ExerciseConfig? exerciseConfig;
    property public final androidx.health.services.client.data.ExerciseStateInfo exerciseStateInfo;
    property public final java.util.Set<androidx.health.services.client.data.ExerciseGoal<? extends java.lang.Number>> latestAchievedGoals;
    property public final androidx.health.services.client.data.DataPointContainer latestMetrics;
    property public final java.util.Set<androidx.health.services.client.data.MilestoneMarkerSummary> latestMilestoneMarkerSummaries;
    property public final java.time.Instant? startTime;
    field public static final androidx.health.services.client.data.ExerciseUpdate.Companion Companion;
  }

  public static final class ExerciseUpdate.ActiveDurationCheckpoint {
    ctor public ExerciseUpdate.ActiveDurationCheckpoint(java.time.Instant time, java.time.Duration activeDuration);
    method public java.time.Duration getActiveDuration();
    method public java.time.Instant getTime();
    property public final java.time.Duration activeDuration;
    property public final java.time.Instant time;
  }

  public static final class ExerciseUpdate.Companion {
  }

  public final class HealthEvent {
    ctor public HealthEvent(androidx.health.services.client.data.HealthEvent.Type type, java.time.Instant eventTime, androidx.health.services.client.data.DataPointContainer metrics);
    method public java.time.Instant getEventTime();
    method public androidx.health.services.client.data.DataPointContainer getMetrics();
    method public androidx.health.services.client.data.HealthEvent.Type getType();
    property public final java.time.Instant eventTime;
    property public final androidx.health.services.client.data.DataPointContainer metrics;
    property public final androidx.health.services.client.data.HealthEvent.Type type;
  }

  public static final class HealthEvent.Type {
    method public int getId();
    method public String getName();
    property public final int id;
    property public final String name;
    field public static final androidx.health.services.client.data.HealthEvent.Type.Companion Companion;
    field public static final androidx.health.services.client.data.HealthEvent.Type FALL_DETECTED;
    field public static final androidx.health.services.client.data.HealthEvent.Type UNKNOWN;
  }

  public static final class HealthEvent.Type.Companion {
  }

  public final class HeartRateAccuracy extends androidx.health.services.client.data.DataPointAccuracy {
    ctor public HeartRateAccuracy(androidx.health.services.client.data.HeartRateAccuracy.SensorStatus sensorStatus);
    method public androidx.health.services.client.data.HeartRateAccuracy.SensorStatus getSensorStatus();
    property public final androidx.health.services.client.data.HeartRateAccuracy.SensorStatus sensorStatus;
  }

  public static final class HeartRateAccuracy.SensorStatus {
    method public int getId();
    method public String getName();
    property public final int id;
    property public final String name;
    field public static final androidx.health.services.client.data.HeartRateAccuracy.SensorStatus ACCURACY_HIGH;
    field public static final androidx.health.services.client.data.HeartRateAccuracy.SensorStatus ACCURACY_LOW;
    field public static final androidx.health.services.client.data.HeartRateAccuracy.SensorStatus ACCURACY_MEDIUM;
    field public static final androidx.health.services.client.data.HeartRateAccuracy.SensorStatus.Companion Companion;
    field public static final androidx.health.services.client.data.HeartRateAccuracy.SensorStatus NO_CONTACT;
    field public static final androidx.health.services.client.data.HeartRateAccuracy.SensorStatus UNKNOWN;
    field public static final androidx.health.services.client.data.HeartRateAccuracy.SensorStatus UNRELIABLE;
  }

  public static final class HeartRateAccuracy.SensorStatus.Companion {
  }

  public final class IntervalDataPoint<T> extends androidx.health.services.client.data.DataPoint<T> {
    ctor public IntervalDataPoint(androidx.health.services.client.data.DataType<T,? extends androidx.health.services.client.data.IntervalDataPoint<T>> dataType, T value, java.time.Duration startDurationFromBoot, java.time.Duration endDurationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
    method public androidx.health.services.client.data.DataPointAccuracy? getAccuracy();
    method public androidx.health.services.client.data.DataType<T,? extends androidx.health.services.client.data.IntervalDataPoint<T>> getDataType();
    method public java.time.Duration getEndDurationFromBoot();
    method public java.time.Instant getEndInstant(java.time.Instant bootInstant);
    method public android.os.Bundle getMetadata();
    method public java.time.Duration getStartDurationFromBoot();
    method public java.time.Instant getStartInstant(java.time.Instant bootInstant);
    method public T getValue();
    property public final androidx.health.services.client.data.DataPointAccuracy? accuracy;
    property public androidx.health.services.client.data.DataType<T,? extends androidx.health.services.client.data.IntervalDataPoint<T>> dataType;
    property public final java.time.Duration endDurationFromBoot;
    property public final android.os.Bundle metadata;
    property public final java.time.Duration startDurationFromBoot;
    property public final T value;
  }

  public final class LocationAccuracy extends androidx.health.services.client.data.DataPointAccuracy {
    ctor public LocationAccuracy(@FloatRange(from=0.0) double horizontalPositionErrorMeters, optional @FloatRange(from=0.0) double verticalPositionErrorMeters);
    method public double getHorizontalPositionErrorMeters();
    method public double getVerticalPositionErrorMeters();
    property public final double horizontalPositionErrorMeters;
    property public final double verticalPositionErrorMeters;
    field public static final androidx.health.services.client.data.LocationAccuracy.Companion Companion;
  }

  public static final class LocationAccuracy.Companion {
  }

  public final class LocationAvailability implements androidx.health.services.client.data.Availability {
    method public static androidx.health.services.client.data.LocationAvailability? fromId(int id);
    method public int getId();
    method public String getName();
    property public int id;
    property public final String name;
    field public static final androidx.health.services.client.data.LocationAvailability ACQUIRED_TETHERED;
    field public static final androidx.health.services.client.data.LocationAvailability ACQUIRED_UNTETHERED;
    field public static final androidx.health.services.client.data.LocationAvailability ACQUIRING;
    field public static final androidx.health.services.client.data.LocationAvailability.Companion Companion;
    field public static final androidx.health.services.client.data.LocationAvailability NO_GNSS;
    field public static final androidx.health.services.client.data.LocationAvailability UNAVAILABLE;
    field public static final androidx.health.services.client.data.LocationAvailability UNKNOWN;
  }

  public static final class LocationAvailability.Companion {
    method public androidx.health.services.client.data.LocationAvailability? fromId(int id);
  }

  public final class LocationData {
    ctor public LocationData(@FloatRange(from=-90.0, to=90.0) double latitude, @FloatRange(from=-180.0, to=180.0) double longitude, optional @FloatRange double altitude, optional @FloatRange(from=-1.0, to=360.0, toInclusive=false) double bearing);
    method public double getAltitude();
    method public double getBearing();
    method public double getLatitude();
    method public double getLongitude();
    property public final double altitude;
    property public final double bearing;
    property public final double latitude;
    property public final double longitude;
    field public static final double ALTITUDE_UNAVAILABLE = 1.7976931348623157E308;
    field public static final double BEARING_UNAVAILABLE = -1.0;
  }

  public final class MeasureCapabilities {
    ctor public MeasureCapabilities(java.util.Set<? extends androidx.health.services.client.data.DeltaDataType<?,?>> supportedDataTypesMeasure);
    method public java.util.Set<androidx.health.services.client.data.DeltaDataType<?,?>> getSupportedDataTypesMeasure();
    property public final java.util.Set<androidx.health.services.client.data.DeltaDataType<?,?>> supportedDataTypesMeasure;
  }

  public final class MilestoneMarkerSummary {
    ctor public MilestoneMarkerSummary(java.time.Instant startTime, java.time.Instant endTime, java.time.Duration activeDuration, androidx.health.services.client.data.ExerciseGoal<? extends java.lang.Number> achievedGoal, androidx.health.services.client.data.DataPointContainer summaryMetrics);
    method public androidx.health.services.client.data.ExerciseGoal<? extends java.lang.Number> getAchievedGoal();
    method public java.time.Duration getActiveDuration();
    method public java.time.Instant getEndTime();
    method public java.time.Instant getStartTime();
    method public androidx.health.services.client.data.DataPointContainer getSummaryMetrics();
    property public final androidx.health.services.client.data.ExerciseGoal<? extends java.lang.Number> achievedGoal;
    property public final java.time.Duration activeDuration;
    property public final java.time.Instant endTime;
    property public final java.time.Instant startTime;
    property public final androidx.health.services.client.data.DataPointContainer summaryMetrics;
  }

  public final class PassiveGoal {
    ctor public PassiveGoal(androidx.health.services.client.data.DataTypeCondition<? extends java.lang.Number,? extends androidx.health.services.client.data.DeltaDataType<? extends java.lang.Number,?>> dataTypeCondition);
    method public androidx.health.services.client.data.DataTypeCondition<? extends java.lang.Number,? extends androidx.health.services.client.data.DeltaDataType<? extends java.lang.Number,?>> getDataTypeCondition();
    property public final androidx.health.services.client.data.DataTypeCondition<? extends java.lang.Number,? extends androidx.health.services.client.data.DeltaDataType<? extends java.lang.Number,?>> dataTypeCondition;
  }

  public final class PassiveListenerConfig {
    ctor public PassiveListenerConfig(java.util.Set<? extends androidx.health.services.client.data.DataType<? extends java.lang.Object,? extends androidx.health.services.client.data.DataPoint<?>>> dataTypes, boolean shouldUserActivityInfoBeRequested, java.util.Set<androidx.health.services.client.data.PassiveGoal> dailyGoals, java.util.Set<androidx.health.services.client.data.HealthEvent.Type> healthEventTypes);
    method public static androidx.health.services.client.data.PassiveListenerConfig.Builder builder();
    method public java.util.Set<androidx.health.services.client.data.PassiveGoal> getDailyGoals();
    method public java.util.Set<androidx.health.services.client.data.DataType<? extends java.lang.Object,? extends androidx.health.services.client.data.DataPoint<?>>> getDataTypes();
    method public java.util.Set<androidx.health.services.client.data.HealthEvent.Type> getHealthEventTypes();
    method public boolean getShouldUserActivityInfoBeRequested();
    property public final java.util.Set<androidx.health.services.client.data.PassiveGoal> dailyGoals;
    property public final java.util.Set<androidx.health.services.client.data.DataType<? extends java.lang.Object,? extends androidx.health.services.client.data.DataPoint<?>>> dataTypes;
    property public final java.util.Set<androidx.health.services.client.data.HealthEvent.Type> healthEventTypes;
    property public final boolean shouldUserActivityInfoBeRequested;
    field public static final androidx.health.services.client.data.PassiveListenerConfig.Companion Companion;
  }

  public static final class PassiveListenerConfig.Builder {
    ctor public PassiveListenerConfig.Builder();
    method public androidx.health.services.client.data.PassiveListenerConfig build();
    method public androidx.health.services.client.data.PassiveListenerConfig.Builder setDailyGoals(java.util.Set<androidx.health.services.client.data.PassiveGoal> dailyGoals);
    method public androidx.health.services.client.data.PassiveListenerConfig.Builder setDataTypes(java.util.Set<? extends androidx.health.services.client.data.DataType<?,?>> dataTypes);
    method public androidx.health.services.client.data.PassiveListenerConfig.Builder setHealthEventTypes(java.util.Set<androidx.health.services.client.data.HealthEvent.Type> healthEventTypes);
    method public androidx.health.services.client.data.PassiveListenerConfig.Builder setShouldUserActivityInfoBeRequested(boolean shouldUserActivityInfoBeRequested);
  }

  public static final class PassiveListenerConfig.Companion {
    method public androidx.health.services.client.data.PassiveListenerConfig.Builder builder();
  }

  public final class PassiveMonitoringCapabilities {
    ctor public PassiveMonitoringCapabilities(java.util.Set<? extends androidx.health.services.client.data.DataType<?,?>> supportedDataTypesPassiveMonitoring, java.util.Set<? extends androidx.health.services.client.data.DataType<?,?>> supportedDataTypesPassiveGoals, java.util.Set<androidx.health.services.client.data.HealthEvent.Type> supportedHealthEventTypes, java.util.Set<androidx.health.services.client.data.UserActivityState> supportedUserActivityStates);
    method public java.util.Set<androidx.health.services.client.data.DataType<?,?>> getSupportedDataTypesPassiveGoals();
    method public java.util.Set<androidx.health.services.client.data.DataType<?,?>> getSupportedDataTypesPassiveMonitoring();
    method public java.util.Set<androidx.health.services.client.data.HealthEvent.Type> getSupportedHealthEventTypes();
    method public java.util.Set<androidx.health.services.client.data.UserActivityState> getSupportedUserActivityStates();
    property public final java.util.Set<androidx.health.services.client.data.DataType<?,?>> supportedDataTypesPassiveGoals;
    property public final java.util.Set<androidx.health.services.client.data.DataType<?,?>> supportedDataTypesPassiveMonitoring;
    property public final java.util.Set<androidx.health.services.client.data.HealthEvent.Type> supportedHealthEventTypes;
    property public final java.util.Set<androidx.health.services.client.data.UserActivityState> supportedUserActivityStates;
  }

  public final class PassiveMonitoringUpdate {
    ctor public PassiveMonitoringUpdate(androidx.health.services.client.data.DataPointContainer dataPoints, java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates);
    method public androidx.health.services.client.data.DataPointContainer getDataPoints();
    method public java.util.List<androidx.health.services.client.data.UserActivityInfo> getUserActivityInfoUpdates();
    property public final androidx.health.services.client.data.DataPointContainer dataPoints;
    property public final java.util.List<androidx.health.services.client.data.UserActivityInfo> userActivityInfoUpdates;
  }

  public final class SampleDataPoint<T> extends androidx.health.services.client.data.DataPoint<T> {
    ctor public SampleDataPoint(androidx.health.services.client.data.DataType<T,androidx.health.services.client.data.SampleDataPoint<T>> dataType, T value, java.time.Duration timeDurationFromBoot, optional android.os.Bundle metadata, optional androidx.health.services.client.data.DataPointAccuracy? accuracy);
    method public androidx.health.services.client.data.DataPointAccuracy? getAccuracy();
    method public androidx.health.services.client.data.DataType<T,androidx.health.services.client.data.SampleDataPoint<T>> getDataType();
    method public android.os.Bundle getMetadata();
    method public java.time.Duration getTimeDurationFromBoot();
    method public java.time.Instant getTimeInstant(java.time.Instant bootInstant);
    method public T getValue();
    property public final androidx.health.services.client.data.DataPointAccuracy? accuracy;
    property public androidx.health.services.client.data.DataType<T,androidx.health.services.client.data.SampleDataPoint<T>> dataType;
    property public final android.os.Bundle metadata;
    property public final java.time.Duration timeDurationFromBoot;
    property public final T value;
  }

  public final class StatisticalDataPoint<T extends java.lang.Number> extends androidx.health.services.client.data.DataPoint<T> {
    ctor public StatisticalDataPoint(androidx.health.services.client.data.AggregateDataType<T,androidx.health.services.client.data.StatisticalDataPoint<T>> dataType, T min, T max, T average, java.time.Instant start, java.time.Instant end);
    method public T getAverage();
    method public java.time.Instant getEnd();
    method public T getMax();
    method public T getMin();
    method public java.time.Instant getStart();
    property public final T average;
    property public final java.time.Instant end;
    property public final T max;
    property public final T min;
    property public final java.time.Instant start;
    field public static final androidx.health.services.client.data.StatisticalDataPoint.Companion Companion;
  }

  public static final class StatisticalDataPoint.Companion {
  }

  public final class UserActivityInfo {
    ctor public UserActivityInfo(androidx.health.services.client.data.UserActivityState userActivityState, androidx.health.services.client.data.ExerciseInfo? exerciseInfo, java.time.Instant stateChangeTime);
    method public static androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseInfo exerciseInfo, java.time.Instant stateChangeTime);
    method public static androidx.health.services.client.data.UserActivityInfo createAsleepState(java.time.Instant stateChangeTime);
    method public static androidx.health.services.client.data.UserActivityInfo createPassiveActivityState(java.time.Instant stateChangeTime);
    method public static androidx.health.services.client.data.UserActivityInfo createUnknownTypeState(java.time.Instant stateChangeTime);
    method public androidx.health.services.client.data.ExerciseInfo? getExerciseInfo();
    method public java.time.Instant getStateChangeTime();
    method public androidx.health.services.client.data.UserActivityState getUserActivityState();
    property public final androidx.health.services.client.data.ExerciseInfo? exerciseInfo;
    property public final java.time.Instant stateChangeTime;
    property public final androidx.health.services.client.data.UserActivityState userActivityState;
    field public static final androidx.health.services.client.data.UserActivityInfo.Companion Companion;
  }

  public static final class UserActivityInfo.Companion {
    method public androidx.health.services.client.data.UserActivityInfo createActiveExerciseState(androidx.health.services.client.data.ExerciseInfo exerciseInfo, java.time.Instant stateChangeTime);
    method public androidx.health.services.client.data.UserActivityInfo createAsleepState(java.time.Instant stateChangeTime);
    method public androidx.health.services.client.data.UserActivityInfo createPassiveActivityState(java.time.Instant stateChangeTime);
    method public androidx.health.services.client.data.UserActivityInfo createUnknownTypeState(java.time.Instant stateChangeTime);
  }

  public final class UserActivityState {
    ctor public UserActivityState(int id, String name);
    method public int getId();
    method public String getName();
    property public final int id;
    property public final String name;
    field public static final androidx.health.services.client.data.UserActivityState.Companion Companion;
    field public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_ASLEEP;
    field public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_EXERCISE;
    field public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_PASSIVE;
    field public static final androidx.health.services.client.data.UserActivityState USER_ACTIVITY_UNKNOWN;
  }

  public static final class UserActivityState.Companion {
  }

  public final class WarmUpConfig {
    ctor public WarmUpConfig(androidx.health.services.client.data.ExerciseType exerciseType, java.util.Set<? extends androidx.health.services.client.data.DeltaDataType<?,?>> dataTypes);
    method public java.util.Set<androidx.health.services.client.data.DeltaDataType<?,?>> getDataTypes();
    method public androidx.health.services.client.data.ExerciseType getExerciseType();
    property public final java.util.Set<androidx.health.services.client.data.DeltaDataType<?,?>> dataTypes;
    property public final androidx.health.services.client.data.ExerciseType exerciseType;
  }

}

