// Signature format: 3.0
package androidx.wear.activity {

  public class ConfirmationActivity extends android.app.Activity {
    ctor public ConfirmationActivity();
    method protected void onAnimationFinished();
    method public void onCreate(android.os.Bundle!);
    field public static final String EXTRA_ANIMATION_DURATION_MILLIS = "androidx.wear.activity.extra.ANIMATION_DURATION_MILLIS";
    field public static final String EXTRA_ANIMATION_TYPE = "androidx.wear.activity.extra.ANIMATION_TYPE";
    field public static final String EXTRA_MESSAGE = "androidx.wear.activity.extra.MESSAGE";
    field public static final int FAILURE_ANIMATION = 3; // 0x3
    field public static final int OPEN_ON_PHONE_ANIMATION = 2; // 0x2
    field public static final int SUCCESS_ANIMATION = 1; // 0x1
  }

}

package androidx.wear.ambient {

  @Deprecated public final class AmbientMode extends android.app.Fragment {
    ctor @Deprecated public AmbientMode();
    method @Deprecated public static <T extends android.app.Activity> androidx.wear.ambient.AmbientMode.AmbientController! attachAmbientSupport(T!);
    method @Deprecated public void dump(String!, java.io.FileDescriptor!, java.io.PrintWriter!, String![]!);
    method @Deprecated @CallSuper public void onAttach(android.content.Context!);
    method @Deprecated @CallSuper public void onCreate(android.os.Bundle!);
    method @Deprecated @CallSuper public void onDestroy();
    method @Deprecated @CallSuper public void onDetach();
    method @Deprecated @CallSuper public void onPause();
    method @Deprecated @CallSuper public void onResume();
    method @Deprecated @CallSuper public void onStop();
    field @Deprecated public static final String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
    field @Deprecated public static final String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
    field @Deprecated public static final String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
  }

  @Deprecated public abstract static class AmbientMode.AmbientCallback {
    ctor @Deprecated public AmbientMode.AmbientCallback();
    method @Deprecated public void onAmbientOffloadInvalidated();
    method @Deprecated public void onEnterAmbient(android.os.Bundle!);
    method @Deprecated public void onExitAmbient();
    method @Deprecated public void onUpdateAmbient();
  }

  @Deprecated public static interface AmbientMode.AmbientCallbackProvider {
    method @Deprecated public androidx.wear.ambient.AmbientMode.AmbientCallback! getAmbientCallback();
  }

  @Deprecated public final class AmbientMode.AmbientController {
    method @Deprecated public boolean isAmbient();
    method @Deprecated public void setAmbientOffloadEnabled(boolean);
  }

  public final class AmbientModeSupport extends androidx.fragment.app.Fragment {
    ctor public AmbientModeSupport();
    method public static <T extends androidx.fragment.app.FragmentActivity> androidx.wear.ambient.AmbientModeSupport.AmbientController! attach(T!);
    field public static final String EXTRA_BURN_IN_PROTECTION = "com.google.android.wearable.compat.extra.BURN_IN_PROTECTION";
    field public static final String EXTRA_LOWBIT_AMBIENT = "com.google.android.wearable.compat.extra.LOWBIT_AMBIENT";
    field public static final String FRAGMENT_TAG = "android.support.wearable.ambient.AmbientMode";
  }

  public abstract static class AmbientModeSupport.AmbientCallback {
    ctor public AmbientModeSupport.AmbientCallback();
    method public void onAmbientOffloadInvalidated();
    method public void onEnterAmbient(android.os.Bundle!);
    method public void onExitAmbient();
    method public void onUpdateAmbient();
  }

  public static interface AmbientModeSupport.AmbientCallbackProvider {
    method public androidx.wear.ambient.AmbientModeSupport.AmbientCallback! getAmbientCallback();
  }

  public final class AmbientModeSupport.AmbientController {
    method public boolean isAmbient();
    method public void setAmbientOffloadEnabled(boolean);
  }

}

package androidx.wear.utils {

  public class MetadataConstants {
    method public static int getPreviewDrawableResourceId(android.content.Context!, boolean);
    method public static boolean isNotificationBridgingEnabled(android.content.Context!);
    method public static boolean isStandalone(android.content.Context!);
    field public static final String NOTIFICATION_BRIDGE_MODE_BRIDGING = "BRIDGING";
    field public static final String NOTIFICATION_BRIDGE_MODE_METADATA_NAME = "com.google.android.wearable.notificationBridgeMode";
    field public static final String NOTIFICATION_BRIDGE_MODE_NO_BRIDGING = "NO_BRIDGING";
    field public static final String STANDALONE_METADATA_NAME = "com.google.android.wearable.standalone";
    field public static final String WATCH_FACE_PREVIEW_CIRCULAR_METADATA_NAME = "com.google.android.wearable.watchface.preview_circular";
    field public static final String WATCH_FACE_PREVIEW_METADATA_NAME = "com.google.android.wearable.watchface.preview";
  }

}

package androidx.wear.widget {

  @UiThread public class BoxInsetLayout extends android.view.ViewGroup {
    ctor public BoxInsetLayout(android.content.Context);
    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet?);
    ctor public BoxInsetLayout(android.content.Context, android.util.AttributeSet?, @StyleRes int);
    method public androidx.wear.widget.BoxInsetLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
  }

  public static class BoxInsetLayout.LayoutParams extends android.widget.FrameLayout.LayoutParams {
    ctor public BoxInsetLayout.LayoutParams(android.content.Context, android.util.AttributeSet?);
    ctor public BoxInsetLayout.LayoutParams(int, int);
    ctor public BoxInsetLayout.LayoutParams(int, int, int);
    ctor public BoxInsetLayout.LayoutParams(int, int, int, int);
    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.LayoutParams);
    ctor public BoxInsetLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams);
    ctor public BoxInsetLayout.LayoutParams(android.widget.FrameLayout.LayoutParams);
    ctor public BoxInsetLayout.LayoutParams(androidx.wear.widget.BoxInsetLayout.LayoutParams);
    field public static final int BOX_ALL = 15; // 0xf
    field public static final int BOX_BOTTOM = 8; // 0x8
    field public static final int BOX_LEFT = 1; // 0x1
    field public static final int BOX_NONE = 0; // 0x0
    field public static final int BOX_RIGHT = 4; // 0x4
    field public static final int BOX_TOP = 2; // 0x2
    field public int boxedEdges;
  }

  public class CircularProgressLayout extends android.widget.FrameLayout {
    ctor public CircularProgressLayout(android.content.Context!);
    ctor public CircularProgressLayout(android.content.Context!, android.util.AttributeSet!);
    ctor public CircularProgressLayout(android.content.Context!, android.util.AttributeSet!, int);
    ctor public CircularProgressLayout(android.content.Context!, android.util.AttributeSet!, int, int);
    method @ColorInt public int getBackgroundColor();
    method public int[]! getColorSchemeColors();
    method public androidx.wear.widget.CircularProgressLayout.OnTimerFinishedListener? getOnTimerFinishedListener();
    method public androidx.swiperefreshlayout.widget.CircularProgressDrawable getProgressDrawable();
    method public float getStartingRotation();
    method public float getStrokeWidth();
    method public long getTotalTime();
    method public boolean isIndeterminate();
    method public boolean isTimerRunning();
    method public void setColorSchemeColors(int...);
    method public void setIndeterminate(boolean);
    method public void setOnTimerFinishedListener(androidx.wear.widget.CircularProgressLayout.OnTimerFinishedListener?);
    method public void setStartingRotation(float);
    method public void setStrokeWidth(float);
    method public void setTotalTime(long);
    method public void startTimer();
    method public void stopTimer();
  }

  public static interface CircularProgressLayout.OnTimerFinishedListener {
    method public void onTimerFinished(androidx.wear.widget.CircularProgressLayout!);
  }

  public class ConfirmationOverlay {
    ctor public ConfirmationOverlay();
    method public androidx.wear.widget.ConfirmationOverlay setDuration(int);
    method @Deprecated public androidx.wear.widget.ConfirmationOverlay setFinishedAnimationListener(androidx.wear.widget.ConfirmationOverlay.OnAnimationFinishedListener?);
    method @Deprecated public androidx.wear.widget.ConfirmationOverlay setMessage(String);
    method public androidx.wear.widget.ConfirmationOverlay setMessage(CharSequence);
    method public androidx.wear.widget.ConfirmationOverlay setOnAnimationFinishedListener(androidx.wear.widget.ConfirmationOverlay.OnAnimationFinishedListener?);
    method public androidx.wear.widget.ConfirmationOverlay setType(@androidx.wear.widget.ConfirmationOverlay.OverlayType int);
    method @MainThread public void showAbove(android.view.View);
    method @MainThread public void showOn(android.app.Activity);
    field public static final int DEFAULT_ANIMATION_DURATION_MS = 1000; // 0x3e8
    field public static final int FAILURE_ANIMATION = 1; // 0x1
    field public static final int OPEN_ON_PHONE_ANIMATION = 2; // 0x2
    field public static final int SUCCESS_ANIMATION = 0; // 0x0
  }

  public static interface ConfirmationOverlay.OnAnimationFinishedListener {
    method public void onAnimationFinished();
  }

  @IntDef({androidx.wear.widget.ConfirmationOverlay.SUCCESS_ANIMATION, androidx.wear.widget.ConfirmationOverlay.FAILURE_ANIMATION, androidx.wear.widget.ConfirmationOverlay.OPEN_ON_PHONE_ANIMATION}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConfirmationOverlay.OverlayType {
  }

  public class CurvingLayoutCallback extends androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback {
    ctor public CurvingLayoutCallback(android.content.Context!);
    method public void adjustAnchorOffsetXY(android.view.View!, float[]!);
    method public void onLayoutFinished(android.view.View!, androidx.recyclerview.widget.RecyclerView!);
  }

  public class RoundedDrawable extends android.graphics.drawable.Drawable {
    ctor public RoundedDrawable();
    method public void draw(android.graphics.Canvas);
    method @ColorInt public int getBackgroundColor();
    method public android.graphics.drawable.Drawable? getDrawable();
    method public int getOpacity();
    method public int getRadius();
    method public boolean isClipEnabled();
    method public void setAlpha(int);
    method public void setBackgroundColor(@ColorInt int);
    method public void setClipEnabled(boolean);
    method public void setColorFilter(android.graphics.ColorFilter!);
    method public void setDrawable(android.graphics.drawable.Drawable?);
    method public void setRadius(int);
  }

  @UiThread public class SwipeDismissFrameLayout extends android.widget.FrameLayout {
    ctor public SwipeDismissFrameLayout(android.content.Context!);
    ctor public SwipeDismissFrameLayout(android.content.Context!, android.util.AttributeSet!);
    ctor public SwipeDismissFrameLayout(android.content.Context!, android.util.AttributeSet!, int);
    ctor public SwipeDismissFrameLayout(android.content.Context!, android.util.AttributeSet!, int, int);
    method public void addCallback(androidx.wear.widget.SwipeDismissFrameLayout.Callback!);
    method public float getDismissMinDragWidthRatio();
    method public boolean isSwipeable();
    method public void removeCallback(androidx.wear.widget.SwipeDismissFrameLayout.Callback!);
    method public void setDismissMinDragWidthRatio(float);
    method public void setSwipeable(boolean);
    field public static final float DEFAULT_DISMISS_DRAG_WIDTH_RATIO = 0.33f;
  }

  @UiThread public abstract static class SwipeDismissFrameLayout.Callback {
    ctor public SwipeDismissFrameLayout.Callback();
    method public void onDismissed(androidx.wear.widget.SwipeDismissFrameLayout!);
    method public void onSwipeCanceled(androidx.wear.widget.SwipeDismissFrameLayout!);
    method public void onSwipeStarted(androidx.wear.widget.SwipeDismissFrameLayout!);
  }

  public class WearableLinearLayoutManager extends androidx.recyclerview.widget.LinearLayoutManager {
    ctor public WearableLinearLayoutManager(android.content.Context!, androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback!);
    ctor public WearableLinearLayoutManager(android.content.Context!);
    method public androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback? getLayoutCallback();
    method public void setLayoutCallback(androidx.wear.widget.WearableLinearLayoutManager.LayoutCallback?);
  }

  public abstract static class WearableLinearLayoutManager.LayoutCallback {
    ctor public WearableLinearLayoutManager.LayoutCallback();
    method public abstract void onLayoutFinished(android.view.View!, androidx.recyclerview.widget.RecyclerView!);
  }

  public class WearableRecyclerView extends androidx.recyclerview.widget.RecyclerView {
    ctor public WearableRecyclerView(android.content.Context!);
    ctor public WearableRecyclerView(android.content.Context!, android.util.AttributeSet?);
    ctor public WearableRecyclerView(android.content.Context!, android.util.AttributeSet?, int);
    ctor public WearableRecyclerView(android.content.Context!, android.util.AttributeSet?, int, int);
    method public float getBezelFraction();
    method public float getScrollDegreesPerScreen();
    method public boolean isCircularScrollingGestureEnabled();
    method public boolean isEdgeItemsCenteringEnabled();
    method public void setBezelFraction(float);
    method public void setCircularScrollingGestureEnabled(boolean);
    method public void setEdgeItemsCenteringEnabled(boolean);
    method public void setScrollDegreesPerScreen(float);
  }

}

package androidx.wear.widget.drawer {

  public class WearableActionDrawerView extends androidx.wear.widget.drawer.WearableDrawerView {
    ctor public WearableActionDrawerView(android.content.Context!);
    ctor public WearableActionDrawerView(android.content.Context!, android.util.AttributeSet!);
    ctor public WearableActionDrawerView(android.content.Context!, android.util.AttributeSet!, int);
    ctor public WearableActionDrawerView(android.content.Context!, android.util.AttributeSet!, int, int);
    method public android.view.Menu! getMenu();
    method public void setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
    method public void setTitle(CharSequence?);
  }

  public class WearableDrawerController {
    method public void closeDrawer();
    method public void openDrawer();
    method public void peekDrawer();
  }

  public class WearableDrawerLayout extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingParent android.view.View.OnLayoutChangeListener {
    ctor public WearableDrawerLayout(android.content.Context!);
    ctor public WearableDrawerLayout(android.content.Context!, android.util.AttributeSet!);
    ctor public WearableDrawerLayout(android.content.Context!, android.util.AttributeSet!, int);
    ctor public WearableDrawerLayout(android.content.Context!, android.util.AttributeSet!, int, int);
    method public void onFlingComplete(android.view.View!);
    method public void onLayoutChange(android.view.View!, int, int, int, int, int, int, int, int);
    method public void setDrawerStateCallback(androidx.wear.widget.drawer.WearableDrawerLayout.DrawerStateCallback!);
  }

  public static class WearableDrawerLayout.DrawerStateCallback {
    ctor public WearableDrawerLayout.DrawerStateCallback();
    method public void onDrawerClosed(androidx.wear.widget.drawer.WearableDrawerLayout!, androidx.wear.widget.drawer.WearableDrawerView!);
    method public void onDrawerOpened(androidx.wear.widget.drawer.WearableDrawerLayout!, androidx.wear.widget.drawer.WearableDrawerView!);
    method public void onDrawerStateChanged(androidx.wear.widget.drawer.WearableDrawerLayout!, int);
  }

  public class WearableDrawerView extends android.widget.FrameLayout {
    ctor public WearableDrawerView(android.content.Context!);
    ctor public WearableDrawerView(android.content.Context!, android.util.AttributeSet!);
    ctor public WearableDrawerView(android.content.Context!, android.util.AttributeSet!, int);
    ctor public WearableDrawerView(android.content.Context!, android.util.AttributeSet!, int, int);
    method public androidx.wear.widget.drawer.WearableDrawerController! getController();
    method public android.view.View? getDrawerContent();
    method public int getDrawerState();
    method public boolean isAutoPeekEnabled();
    method public boolean isClosed();
    method public boolean isLocked();
    method public boolean isLockedWhenClosed();
    method public boolean isOpenOnlyAtTopEnabled();
    method public boolean isOpened();
    method public boolean isPeekOnScrollDownEnabled();
    method public boolean isPeeking();
    method public void onDrawerClosed();
    method public void onDrawerOpened();
    method public void onDrawerStateChanged(int);
    method public void onPeekContainerClicked(android.view.View!);
    method public void setDrawerContent(android.view.View?);
    method public void setIsAutoPeekEnabled(boolean);
    method public void setIsLocked(boolean);
    method public void setLockedWhenClosed(boolean);
    method public void setOpenOnlyAtTopEnabled(boolean);
    method public void setPeekContent(android.view.View!);
    method public void setPeekOnScrollDownEnabled(boolean);
    field public static final int STATE_DRAGGING = 1; // 0x1
    field public static final int STATE_IDLE = 0; // 0x0
    field public static final int STATE_SETTLING = 2; // 0x2
  }

  public class WearableNavigationDrawerView extends androidx.wear.widget.drawer.WearableDrawerView {
    ctor public WearableNavigationDrawerView(android.content.Context!);
    ctor public WearableNavigationDrawerView(android.content.Context!, android.util.AttributeSet!);
    ctor public WearableNavigationDrawerView(android.content.Context!, android.util.AttributeSet!, int);
    ctor public WearableNavigationDrawerView(android.content.Context!, android.util.AttributeSet!, int, int);
    method public void addOnItemSelectedListener(androidx.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener!);
    method public int getNavigationStyle();
    method public void removeOnItemSelectedListener(androidx.wear.widget.drawer.WearableNavigationDrawerView.OnItemSelectedListener!);
    method public void setAdapter(androidx.wear.widget.drawer.WearableNavigationDrawerView.WearableNavigationDrawerAdapter!);
    method public void setCurrentItem(int, boolean);
    field public static final int MULTI_PAGE = 1; // 0x1
    field public static final int SINGLE_PAGE = 0; // 0x0
  }

  public static interface WearableNavigationDrawerView.OnItemSelectedListener {
    method public void onItemSelected(int);
  }

  public abstract static class WearableNavigationDrawerView.WearableNavigationDrawerAdapter {
    ctor public WearableNavigationDrawerView.WearableNavigationDrawerAdapter();
    method public abstract int getCount();
    method public abstract android.graphics.drawable.Drawable! getItemDrawable(int);
    method public abstract CharSequence! getItemText(int);
    method public void notifyDataSetChanged();
  }

}

