// Signature format: 4.0
package androidx.core.accessibilityservice {

  public final class AccessibilityServiceInfoCompat {
    method public static String capabilityToString(int);
    method public static String feedbackTypeToString(int);
    method public static String? flagToString(int);
    method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
    method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
    field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
    field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
    field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
    field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
    field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
    field public static final int FEEDBACK_BRAILLE = 32; // 0x20
    field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
    field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
    field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
    field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
    field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
  }

}

package androidx.core.app {

  public class ActivityCompat extends androidx.core.content.ContextCompat {
    ctor protected ActivityCompat();
    method public static void finishAffinity(android.app.Activity);
    method public static void finishAfterTransition(android.app.Activity);
    method public static android.net.Uri? getReferrer(android.app.Activity);
    method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
    method public static boolean isLaunchedFromBubble(android.app.Activity);
    method public static void postponeEnterTransition(android.app.Activity);
    method public static void recreate(android.app.Activity);
    method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
    method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
    method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
    method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
    method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
    method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
    method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
    method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
    method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
    method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
    method public static void startPostponedEnterTransition(android.app.Activity);
  }

  public static interface ActivityCompat.OnRequestPermissionsResultCallback {
    method public void onRequestPermissionsResult(int, String![], int[]);
  }

  public static interface ActivityCompat.PermissionCompatDelegate {
    method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
    method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
  }

  public final class ActivityManagerCompat {
    method public static boolean isLowRamDevice(android.app.ActivityManager);
  }

  public class ActivityOptionsCompat {
    ctor protected ActivityOptionsCompat();
    method public android.graphics.Rect? getLaunchBounds();
    method public static androidx.core.app.ActivityOptionsCompat makeBasic();
    method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
    method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
    method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
    method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
    method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
    method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
    method public void requestUsageTimeReport(android.app.PendingIntent);
    method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
    method public android.os.Bundle? toBundle();
    method public void update(androidx.core.app.ActivityOptionsCompat);
    field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
    field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
  }

  public final class AlarmManagerCompat {
    method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
    method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
    method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
    method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
  }

  @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
    ctor public AppComponentFactory();
    method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
    method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
  }

  public class AppLaunchChecker {
    ctor @Deprecated public AppLaunchChecker();
    method public static boolean hasStartedFromLauncher(android.content.Context);
    method public static void onActivityCreate(android.app.Activity);
  }

  public final class AppOpsManagerCompat {
    method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
    method public static int noteOp(android.content.Context, String, int, String);
    method public static int noteOpNoThrow(android.content.Context, String, int, String);
    method public static int noteProxyOp(android.content.Context, String, String);
    method public static int noteProxyOpNoThrow(android.content.Context, String, String);
    method public static String? permissionToOp(String);
    field public static final int MODE_ALLOWED = 0; // 0x0
    field public static final int MODE_DEFAULT = 3; // 0x3
    field public static final int MODE_ERRORED = 2; // 0x2
    field public static final int MODE_IGNORED = 1; // 0x1
  }

  public final class BundleCompat {
    method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
    method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
  }

  public class DialogCompat {
    method public static android.view.View requireViewById(android.app.Dialog, int);
  }

  public class FrameMetricsAggregator {
    ctor public FrameMetricsAggregator();
    ctor public FrameMetricsAggregator(int);
    method public void add(android.app.Activity);
    method public android.util.SparseIntArray![]? getMetrics();
    method public android.util.SparseIntArray![]? remove(android.app.Activity);
    method public android.util.SparseIntArray![]? reset();
    method public android.util.SparseIntArray![]? stop();
    field public static final int ANIMATION_DURATION = 256; // 0x100
    field public static final int ANIMATION_INDEX = 8; // 0x8
    field public static final int COMMAND_DURATION = 32; // 0x20
    field public static final int COMMAND_INDEX = 5; // 0x5
    field public static final int DELAY_DURATION = 128; // 0x80
    field public static final int DELAY_INDEX = 7; // 0x7
    field public static final int DRAW_DURATION = 8; // 0x8
    field public static final int DRAW_INDEX = 3; // 0x3
    field public static final int EVERY_DURATION = 511; // 0x1ff
    field public static final int INPUT_DURATION = 2; // 0x2
    field public static final int INPUT_INDEX = 1; // 0x1
    field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
    field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
    field public static final int SWAP_DURATION = 64; // 0x40
    field public static final int SWAP_INDEX = 6; // 0x6
    field public static final int SYNC_DURATION = 16; // 0x10
    field public static final int SYNC_INDEX = 4; // 0x4
    field public static final int TOTAL_DURATION = 1; // 0x1
    field public static final int TOTAL_INDEX = 0; // 0x0
  }

  @Deprecated public abstract class JobIntentService extends android.app.Service {
    ctor @Deprecated public JobIntentService();
    method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
    method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
    method @Deprecated public boolean isStopped();
    method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
    method @Deprecated protected abstract void onHandleWork(android.content.Intent);
    method @Deprecated public boolean onStopCurrentWork();
    method @Deprecated public void setInterruptIfStopped(boolean);
  }

  public final class NavUtils {
    method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
    method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
    method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
    method public static String? getParentActivityName(android.app.Activity);
    method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
    method public static void navigateUpFromSameTask(android.app.Activity);
    method public static void navigateUpTo(android.app.Activity, android.content.Intent);
    method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
    field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
  }

  public class NotificationChannelCompat {
    method public boolean canBubble();
    method public boolean canBypassDnd();
    method public boolean canShowBadge();
    method public android.media.AudioAttributes? getAudioAttributes();
    method public String? getConversationId();
    method public String? getDescription();
    method public String? getGroup();
    method public String getId();
    method public int getImportance();
    method public int getLightColor();
    method public int getLockscreenVisibility();
    method public CharSequence? getName();
    method public String? getParentChannelId();
    method public android.net.Uri? getSound();
    method public long[]? getVibrationPattern();
    method public boolean isImportantConversation();
    method public boolean shouldShowLights();
    method public boolean shouldVibrate();
    method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
    field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
  }

  public static class NotificationChannelCompat.Builder {
    ctor public NotificationChannelCompat.Builder(String, int);
    method public androidx.core.app.NotificationChannelCompat build();
    method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
    method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
    method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
    method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
    method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
    method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
    method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
    method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
    method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
    method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
  }

  public class NotificationChannelGroupCompat {
    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
    method public String? getDescription();
    method public String getId();
    method public CharSequence? getName();
    method public boolean isBlocked();
    method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
  }

  public static class NotificationChannelGroupCompat.Builder {
    ctor public NotificationChannelGroupCompat.Builder(String);
    method public androidx.core.app.NotificationChannelGroupCompat build();
    method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
    method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
  }

  public class NotificationCompat {
    ctor @Deprecated public NotificationCompat();
    method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
    method public static int getActionCount(android.app.Notification);
    method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
    method public static boolean getAutoCancel(android.app.Notification);
    method public static int getBadgeIconType(android.app.Notification);
    method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
    method public static String? getCategory(android.app.Notification);
    method public static String? getChannelId(android.app.Notification);
    method public static int getColor(android.app.Notification);
    method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
    method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
    method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
    method public static android.os.Bundle? getExtras(android.app.Notification);
    method public static String? getGroup(android.app.Notification);
    method public static int getGroupAlertBehavior(android.app.Notification);
    method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
    method public static boolean getLocalOnly(android.app.Notification);
    method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
    method public static boolean getOngoing(android.app.Notification);
    method public static boolean getOnlyAlertOnce(android.app.Notification);
    method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
    method public static android.app.Notification? getPublicVersion(android.app.Notification);
    method public static CharSequence? getSettingsText(android.app.Notification);
    method public static String? getShortcutId(android.app.Notification);
    method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
    method public static String? getSortKey(android.app.Notification);
    method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
    method public static long getTimeoutAfter(android.app.Notification);
    method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
    method public static int getVisibility(android.app.Notification);
    method public static boolean isGroupSummary(android.app.Notification);
    field public static final int BADGE_ICON_LARGE = 2; // 0x2
    field public static final int BADGE_ICON_NONE = 0; // 0x0
    field public static final int BADGE_ICON_SMALL = 1; // 0x1
    field public static final String CATEGORY_ALARM = "alarm";
    field public static final String CATEGORY_CALL = "call";
    field public static final String CATEGORY_EMAIL = "email";
    field public static final String CATEGORY_ERROR = "err";
    field public static final String CATEGORY_EVENT = "event";
    field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
    field public static final String CATEGORY_MESSAGE = "msg";
    field public static final String CATEGORY_MISSED_CALL = "missed_call";
    field public static final String CATEGORY_NAVIGATION = "navigation";
    field public static final String CATEGORY_PROGRESS = "progress";
    field public static final String CATEGORY_PROMO = "promo";
    field public static final String CATEGORY_RECOMMENDATION = "recommendation";
    field public static final String CATEGORY_REMINDER = "reminder";
    field public static final String CATEGORY_SERVICE = "service";
    field public static final String CATEGORY_SOCIAL = "social";
    field public static final String CATEGORY_STATUS = "status";
    field public static final String CATEGORY_STOPWATCH = "stopwatch";
    field public static final String CATEGORY_SYSTEM = "sys";
    field public static final String CATEGORY_TRANSPORT = "transport";
    field public static final String CATEGORY_WORKOUT = "workout";
    field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
    field public static final int DEFAULT_ALL = -1; // 0xffffffff
    field public static final int DEFAULT_LIGHTS = 4; // 0x4
    field public static final int DEFAULT_SOUND = 1; // 0x1
    field public static final int DEFAULT_VIBRATE = 2; // 0x2
    field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
    field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
    field public static final String EXTRA_BIG_TEXT = "android.bigText";
    field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
    field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
    field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
    field public static final String EXTRA_COLORIZED = "android.colorized";
    field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
    field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
    field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
    field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
    field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
    field public static final String EXTRA_INFO_TEXT = "android.infoText";
    field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
    field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
    field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
    field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
    field public static final String EXTRA_MESSAGES = "android.messages";
    field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
    field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
    field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
    field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
    field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
    field public static final String EXTRA_PICTURE = "android.picture";
    field public static final String EXTRA_PICTURE_CONTENT_DESCRIPTION = "android.pictureContentDescription";
    field public static final String EXTRA_PROGRESS = "android.progress";
    field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
    field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
    field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
    field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
    field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
    field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
    field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
    field public static final String EXTRA_SMALL_ICON = "android.icon";
    field public static final String EXTRA_SUB_TEXT = "android.subText";
    field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
    field public static final String EXTRA_TEMPLATE = "android.template";
    field public static final String EXTRA_TEXT = "android.text";
    field public static final String EXTRA_TEXT_LINES = "android.textLines";
    field public static final String EXTRA_TITLE = "android.title";
    field public static final String EXTRA_TITLE_BIG = "android.title.big";
    field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
    field public static final int FLAG_BUBBLE = 4096; // 0x1000
    field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
    field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
    field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
    field public static final int FLAG_INSISTENT = 4; // 0x4
    field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
    field public static final int FLAG_NO_CLEAR = 32; // 0x20
    field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
    field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
    field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
    field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
    field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
    field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
    field public static final int GROUP_ALERT_ALL = 0; // 0x0
    field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
    field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
    field public static final String GROUP_KEY_SILENT = "silent";
    field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
    field public static final int PRIORITY_DEFAULT = 0; // 0x0
    field public static final int PRIORITY_HIGH = 1; // 0x1
    field public static final int PRIORITY_LOW = -1; // 0xffffffff
    field public static final int PRIORITY_MAX = 2; // 0x2
    field public static final int PRIORITY_MIN = -2; // 0xfffffffe
    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
    field public static final int VISIBILITY_PRIVATE = 0; // 0x0
    field public static final int VISIBILITY_PUBLIC = 1; // 0x1
    field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
  }

  public static class NotificationCompat.Action {
    ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
    ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
    method public android.app.PendingIntent? getActionIntent();
    method public boolean getAllowGeneratedReplies();
    method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
    method public android.os.Bundle getExtras();
    method @Deprecated public int getIcon();
    method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
    method public androidx.core.app.RemoteInput![]? getRemoteInputs();
    method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
    method public boolean getShowsUserInterface();
    method public CharSequence? getTitle();
    method public boolean isAuthenticationRequired();
    method public boolean isContextual();
    field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
    field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
    field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
    field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
    field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
    field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
    field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
    field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
    field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
    field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
    field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
    field public android.app.PendingIntent! actionIntent;
    field @Deprecated public int icon;
    field public CharSequence! title;
  }

  public static final class NotificationCompat.Action.Builder {
    ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
    ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
    ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
    method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
    method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
    method public androidx.core.app.NotificationCompat.Action build();
    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
    method public android.os.Bundle getExtras();
    method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
    method public androidx.core.app.NotificationCompat.Action.Builder setAuthenticationRequired(boolean);
    method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
    method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
    method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
  }

  public static interface NotificationCompat.Action.Extender {
    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
  }

  @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
  }

  public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
    ctor public NotificationCompat.Action.WearableExtender();
    ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
    method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
    method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
    method @Deprecated public CharSequence? getCancelLabel();
    method @Deprecated public CharSequence? getConfirmLabel();
    method public boolean getHintDisplayActionInline();
    method public boolean getHintLaunchesActivity();
    method @Deprecated public CharSequence? getInProgressLabel();
    method public boolean isAvailableOffline();
    method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
    method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
    method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
  }

  public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
    ctor public NotificationCompat.BigPictureStyle();
    ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
    method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
    method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
    method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle setContentDescription(CharSequence?);
    method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
    method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
  }

  public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
    ctor public NotificationCompat.BigTextStyle();
    ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
    method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
    method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
    method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
  }

  public static final class NotificationCompat.BubbleMetadata {
    method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
    method public boolean getAutoExpandBubble();
    method public android.app.PendingIntent? getDeleteIntent();
    method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
    method @DimenRes public int getDesiredHeightResId();
    method public androidx.core.graphics.drawable.IconCompat? getIcon();
    method public android.app.PendingIntent? getIntent();
    method public String? getShortcutId();
    method public boolean isNotificationSuppressed();
    method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
  }

  public static final class NotificationCompat.BubbleMetadata.Builder {
    ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
    ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
    ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
    method public androidx.core.app.NotificationCompat.BubbleMetadata build();
    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
    method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
  }

  public static class NotificationCompat.Builder {
    ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
    ctor public NotificationCompat.Builder(android.content.Context, String);
    ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
    method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
    method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
    method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
    method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
    method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
    method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
    method public android.app.Notification build();
    method public androidx.core.app.NotificationCompat.Builder clearActions();
    method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
    method public androidx.core.app.NotificationCompat.Builder clearPeople();
    method public android.widget.RemoteViews? createBigContentView();
    method public android.widget.RemoteViews? createContentView();
    method public android.widget.RemoteViews? createHeadsUpContentView();
    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
    method public android.os.Bundle getExtras();
    method @Deprecated public android.app.Notification getNotification();
    method protected static CharSequence? limitCharSequenceLength(CharSequence?);
    method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
    method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
    method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
    method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
    method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
    method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
    method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
    method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
    method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
    method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
    method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
    method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
    method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
    method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
    method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
    method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
    method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
    method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
    method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
    method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
    method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
    method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
    method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
    method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
    method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
    method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
    method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
    method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
    method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
    method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
    method public androidx.core.app.NotificationCompat.Builder setNumber(int);
    method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
    method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
    method public androidx.core.app.NotificationCompat.Builder setPriority(int);
    method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
    method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
    method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
    method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
    method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
    method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
    method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
    method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
    method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
    method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
    method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
    method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
    method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
    method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
    method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
    method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
    method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
    method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
    method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
    method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
    method public androidx.core.app.NotificationCompat.Builder setWhen(long);
    field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
  }

  public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
    ctor public NotificationCompat.CarExtender();
    ctor public NotificationCompat.CarExtender(android.app.Notification);
    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
    method @ColorInt public int getColor();
    method public android.graphics.Bitmap? getLargeIcon();
    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
    method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
    method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
  }

  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
    method @Deprecated public long getLatestTimestamp();
    method @Deprecated public String![]? getMessages();
    method @Deprecated public String? getParticipant();
    method @Deprecated public String![]? getParticipants();
    method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
    method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
    method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
  }

  @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
    ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
    method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
  }

  public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
    ctor public NotificationCompat.DecoratedCustomViewStyle();
  }

  public static interface NotificationCompat.Extender {
    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
  }

  public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
    ctor public NotificationCompat.InboxStyle();
    ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
    method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
    method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
    method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
  }

  public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
    ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
    ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
    method public void addCompatExtras(android.os.Bundle);
    method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
    method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
    method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
    method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
    method public CharSequence? getConversationTitle();
    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
    method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
    method public androidx.core.app.Person getUser();
    method @Deprecated public CharSequence? getUserDisplayName();
    method public boolean isGroupConversation();
    method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
    method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
    field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
  }

  public static final class NotificationCompat.MessagingStyle.Message {
    ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
    ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
    method public String? getDataMimeType();
    method public android.net.Uri? getDataUri();
    method public android.os.Bundle getExtras();
    method public androidx.core.app.Person? getPerson();
    method @Deprecated public CharSequence? getSender();
    method public CharSequence? getText();
    method public long getTimestamp();
    method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
  }

  public abstract static class NotificationCompat.Style {
    ctor public NotificationCompat.Style();
    method public android.app.Notification? build();
    method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
  }

  public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
    ctor public NotificationCompat.WearableExtender();
    ctor public NotificationCompat.WearableExtender(android.app.Notification);
    method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
    method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
    method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
    method public androidx.core.app.NotificationCompat.WearableExtender clone();
    method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
    method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
    method @Deprecated public android.graphics.Bitmap? getBackground();
    method public String? getBridgeTag();
    method public int getContentAction();
    method @Deprecated public int getContentIcon();
    method @Deprecated public int getContentIconGravity();
    method public boolean getContentIntentAvailableOffline();
    method @Deprecated public int getCustomContentHeight();
    method @Deprecated public int getCustomSizePreset();
    method public String? getDismissalId();
    method @Deprecated public android.app.PendingIntent? getDisplayIntent();
    method @Deprecated public int getGravity();
    method @Deprecated public boolean getHintAmbientBigPicture();
    method @Deprecated public boolean getHintAvoidBackgroundClipping();
    method public boolean getHintContentIntentLaunchesActivity();
    method @Deprecated public boolean getHintHideIcon();
    method @Deprecated public int getHintScreenTimeout();
    method @Deprecated public boolean getHintShowBackgroundOnly();
    method @Deprecated public java.util.List<android.app.Notification!> getPages();
    method public boolean getStartScrollBottom();
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
    method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
    method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
    method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
    method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
    method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
    method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
    method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
    field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
    field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
    field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
    field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
    field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
    field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
    field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
    field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
    field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
  }

  public final class NotificationCompatExtras {
    field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
    field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
    field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
    field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
    field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
    field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
  }

  public abstract class NotificationCompatSideChannelService extends android.app.Service {
    ctor public NotificationCompatSideChannelService();
    method public abstract void cancel(String!, int, String!);
    method public abstract void cancelAll(String!);
    method public abstract void notify(String!, int, String!, android.app.Notification!);
    method public android.os.IBinder! onBind(android.content.Intent!);
  }

  public final class NotificationManagerCompat {
    method public boolean areNotificationsEnabled();
    method public void cancel(int);
    method public void cancel(String?, int);
    method public void cancelAll();
    method public void createNotificationChannel(android.app.NotificationChannel);
    method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
    method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
    method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
    method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
    method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
    method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
    method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
    method public void deleteNotificationChannel(String);
    method public void deleteNotificationChannelGroup(String);
    method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
    method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
    method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
    method public int getImportance();
    method public android.app.NotificationChannel? getNotificationChannel(String);
    method public android.app.NotificationChannel? getNotificationChannel(String, String);
    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
    method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
    method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
    method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
    method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
    method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
    method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
    method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
    method public void notify(int, android.app.Notification);
    method public void notify(String?, int, android.app.Notification);
    field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
    field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
    field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
    field public static final int IMPORTANCE_HIGH = 4; // 0x4
    field public static final int IMPORTANCE_LOW = 2; // 0x2
    field public static final int IMPORTANCE_MAX = 5; // 0x5
    field public static final int IMPORTANCE_MIN = 1; // 0x1
    field public static final int IMPORTANCE_NONE = 0; // 0x0
    field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
  }

  public interface OnNewIntentProvider {
    method public void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
    method public void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent!>);
  }

  public class Person {
    method public static androidx.core.app.Person fromBundle(android.os.Bundle);
    method public androidx.core.graphics.drawable.IconCompat? getIcon();
    method public String? getKey();
    method public CharSequence? getName();
    method public String? getUri();
    method public boolean isBot();
    method public boolean isImportant();
    method public androidx.core.app.Person.Builder toBuilder();
    method public android.os.Bundle toBundle();
  }

  public static class Person.Builder {
    ctor public Person.Builder();
    method public androidx.core.app.Person build();
    method public androidx.core.app.Person.Builder setBot(boolean);
    method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
    method public androidx.core.app.Person.Builder setImportant(boolean);
    method public androidx.core.app.Person.Builder setKey(String?);
    method public androidx.core.app.Person.Builder setName(CharSequence?);
    method public androidx.core.app.Person.Builder setUri(String?);
  }

  public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
    ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
    ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
    method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
    method public android.app.PendingIntent getActionIntent();
    method public CharSequence getContentDescription();
    method public androidx.core.graphics.drawable.IconCompat getIcon();
    method public CharSequence getTitle();
    method public boolean isEnabled();
    method public void setEnabled(boolean);
    method public void setShouldShowIcon(boolean);
    method public boolean shouldShowIcon();
    method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
  }

  public final class RemoteInput {
    method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
    method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
    method public boolean getAllowFreeFormInput();
    method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
    method public CharSequence![]! getChoices();
    method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
    method public int getEditChoicesBeforeSending();
    method public android.os.Bundle! getExtras();
    method public CharSequence! getLabel();
    method public String! getResultKey();
    method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
    method public static int getResultsSource(android.content.Intent);
    method public boolean isDataOnly();
    method public static void setResultsSource(android.content.Intent, int);
    field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
    field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
    field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
    field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
    field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
    field public static final int SOURCE_CHOICE = 1; // 0x1
    field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
  }

  public static final class RemoteInput.Builder {
    ctor public RemoteInput.Builder(String);
    method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
    method public androidx.core.app.RemoteInput build();
    method public android.os.Bundle getExtras();
    method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
    method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
    method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
    method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
    method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
  }

  public final class ServiceCompat {
    method public static void stopForeground(android.app.Service, int);
    field public static final int START_STICKY = 1; // 0x1
    field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
    field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
  }

  public final class ShareCompat {
    method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
    method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
    method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
    method public static String? getCallingPackage(android.app.Activity);
    field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
    field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
    field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
    field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
  }

  public static class ShareCompat.IntentBuilder {
    ctor public ShareCompat.IntentBuilder(android.content.Context);
    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
    method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
    method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
    method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
    method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
    method public android.content.Intent createChooserIntent();
    method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
    method public android.content.Intent getIntent();
    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
    method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
    method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
    method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
    method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
    method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
    method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
    method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
    method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
    method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
    method public void startChooser();
  }

  public static class ShareCompat.IntentReader {
    ctor public ShareCompat.IntentReader(android.app.Activity);
    ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
    method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
    method public android.content.ComponentName? getCallingActivity();
    method public android.graphics.drawable.Drawable? getCallingActivityIcon();
    method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
    method public CharSequence? getCallingApplicationLabel();
    method public String? getCallingPackage();
    method public String![]? getEmailBcc();
    method public String![]? getEmailCc();
    method public String![]? getEmailTo();
    method public String? getHtmlText();
    method public android.net.Uri? getStream();
    method public android.net.Uri? getStream(int);
    method public int getStreamCount();
    method public String? getSubject();
    method public CharSequence? getText();
    method public String? getType();
    method public boolean isMultipleShare();
    method public boolean isShareIntent();
    method public boolean isSingleShare();
  }

  public abstract class SharedElementCallback {
    ctor public SharedElementCallback();
    method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
    method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
    method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
    method public void onRejectSharedElements(java.util.List<android.view.View!>!);
    method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
    method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
    method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
  }

  public static interface SharedElementCallback.OnSharedElementsReadyListener {
    method public void onSharedElementsReady();
  }

  public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
    method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
    method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
    method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
    method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
    method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
    method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
    method public android.content.Intent? editIntentAt(int);
    method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
    method @Deprecated public android.content.Intent! getIntent(int);
    method public int getIntentCount();
    method public android.content.Intent![] getIntents();
    method public android.app.PendingIntent? getPendingIntent(int, int);
    method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
    method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
    method public void startActivities();
    method public void startActivities(android.os.Bundle?);
  }

  public static interface TaskStackBuilder.SupportParentable {
    method public android.content.Intent? getSupportParentActivityIntent();
  }

}

package androidx.core.content {

  public final class ContentProviderCompat {
    method public static android.content.Context requireContext(android.content.ContentProvider);
  }

  public final class ContentResolverCompat {
    method public static android.database.Cursor? query(android.content.ContentResolver, android.net.Uri, String![]?, String?, String![]?, String?, androidx.core.os.CancellationSignal?);
  }

  public class ContextCompat {
    ctor protected ContextCompat();
    method public static int checkSelfPermission(android.content.Context, String);
    method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
    method public static String? getAttributionTag(android.content.Context);
    method public static java.io.File getCodeCacheDir(android.content.Context);
    method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
    method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
    method public static java.io.File? getDataDir(android.content.Context);
    method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
    method public static java.io.File![] getExternalCacheDirs(android.content.Context);
    method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
    method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
    method public static java.io.File? getNoBackupFilesDir(android.content.Context);
    method public static java.io.File![] getObbDirs(android.content.Context);
    method public static <T> T? getSystemService(android.content.Context, Class<T!>);
    method public static String? getSystemServiceName(android.content.Context, Class<?>);
    method public static boolean isDeviceProtectedStorage(android.content.Context);
    method public static boolean startActivities(android.content.Context, android.content.Intent![]);
    method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
    method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
    method public static void startForegroundService(android.content.Context, android.content.Intent);
  }

  public class FileProvider extends android.content.ContentProvider {
    ctor public FileProvider();
    method public int delete(android.net.Uri, String?, String![]?);
    method public String? getType(android.net.Uri);
    method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
    method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
    method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues);
    method public boolean onCreate();
    method public android.database.Cursor query(android.net.Uri, String![]?, String?, String![]?, String?);
    method public int update(android.net.Uri, android.content.ContentValues, String?, String![]?);
  }

  public final class IntentCompat {
    method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
    method public static android.content.Intent makeMainSelectorActivity(String, String);
    field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
    field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
    field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
    field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
    field public static final String EXTRA_TIME = "android.intent.extra.TIME";
  }

  public final class LocusIdCompat {
    ctor public LocusIdCompat(String);
    method public String getId();
    method @RequiresApi(29) public android.content.LocusId toLocusId();
    method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
  }

  public final class MimeTypeFilter {
    method public static boolean matches(String?, String);
    method public static String? matches(String?, String![]);
    method public static String? matches(String![]?, String);
    method public static String![] matchesMany(String![]?, String);
  }

  public interface OnConfigurationChangedProvider {
    method public void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
    method public void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration!>);
  }

  public interface OnTrimMemoryProvider {
    method public void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
    method public void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer!>);
  }

  public final class PackageManagerCompat {
    method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
    field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
  }

  public final class PermissionChecker {
    method public static int checkCallingOrSelfPermission(android.content.Context, String);
    method public static int checkCallingPermission(android.content.Context, String, String?);
    method public static int checkPermission(android.content.Context, String, int, int, String?);
    method public static int checkSelfPermission(android.content.Context, String);
    field public static final int PERMISSION_DENIED = -1; // 0xffffffff
    field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
    field public static final int PERMISSION_GRANTED = 0; // 0x0
  }

  @Deprecated public final class SharedPreferencesCompat {
  }

  @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
    method @Deprecated public void apply(android.content.SharedPreferences.Editor);
    method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
  }

  public class UnusedAppRestrictionsBackportCallback {
    method public void onResult(boolean, boolean) throws android.os.RemoteException;
  }

  public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
    ctor public UnusedAppRestrictionsBackportService();
    method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
    method public android.os.IBinder? onBind(android.content.Intent?);
    field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
  }

  public final class UnusedAppRestrictionsConstants {
    field public static final int API_30 = 4; // 0x4
    field public static final int API_30_BACKPORT = 3; // 0x3
    field public static final int API_31 = 5; // 0x5
    field public static final int DISABLED = 2; // 0x2
    field public static final int ERROR = 0; // 0x0
    field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
  }

}

package androidx.core.content.pm {

  @Deprecated public final class ActivityInfoCompat {
    field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
  }

  public final class PackageInfoCompat {
    method public static long getLongVersionCode(android.content.pm.PackageInfo);
    method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
    method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
  }

  public final class PermissionInfoCompat {
    method public static int getProtection(android.content.pm.PermissionInfo);
    method public static int getProtectionFlags(android.content.pm.PermissionInfo);
  }

  public class ShortcutInfoCompat {
    method public android.content.ComponentName? getActivity();
    method public java.util.Set<java.lang.String!>? getCategories();
    method public CharSequence? getDisabledMessage();
    method public int getDisabledReason();
    method public android.os.PersistableBundle? getExtras();
    method public String getId();
    method public android.content.Intent getIntent();
    method public android.content.Intent![] getIntents();
    method public long getLastChangedTimestamp();
    method public androidx.core.content.LocusIdCompat? getLocusId();
    method public CharSequence? getLongLabel();
    method public String getPackage();
    method public int getRank();
    method public CharSequence getShortLabel();
    method public android.os.UserHandle? getUserHandle();
    method public boolean hasKeyFieldsOnly();
    method public boolean isCached();
    method public boolean isDeclaredInManifest();
    method public boolean isDynamic();
    method public boolean isEnabled();
    method public boolean isImmutable();
    method public boolean isIncludedIn(int);
    method public boolean isPinned();
    method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
    field public static final int SURFACE_LAUNCHER = 1; // 0x1
  }

  public static class ShortcutInfoCompat.Builder {
    ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
    method public androidx.core.content.pm.ShortcutInfoCompat build();
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExcludedSurfaces(int);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
    method @Deprecated public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived();
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLived(boolean);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPerson(androidx.core.app.Person);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setPersons(androidx.core.app.Person![]);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setRank(int);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setShortLabel(CharSequence);
    method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
  }

  public class ShortcutManagerCompat {
    method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
    method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
    method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
    method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
    method public static int getIconMaxHeight(android.content.Context);
    method public static int getIconMaxWidth(android.content.Context);
    method public static int getMaxShortcutCountPerActivity(android.content.Context);
    method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
    method public static boolean isRateLimitingActive(android.content.Context);
    method public static boolean isRequestPinShortcutSupported(android.content.Context);
    method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
    method public static void removeAllDynamicShortcuts(android.content.Context);
    method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
    method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
    method public static void reportShortcutUsed(android.content.Context, String);
    method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
    method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
    method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
    field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
    field public static final int FLAG_MATCH_CACHED = 8; // 0x8
    field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
    field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
    field public static final int FLAG_MATCH_PINNED = 4; // 0x4
  }

}

package androidx.core.content.res {

  public final class ConfigurationHelper {
    method public static int getDensityDpi(android.content.res.Resources);
  }

  public final class ResourcesCompat {
    method public static void clearCachesForTheme(android.content.res.Resources.Theme);
    method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
    method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
    method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
    method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
    method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
    method public static float getFloat(android.content.res.Resources, @DimenRes int);
    method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
    method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
    field @AnyRes public static final int ID_NULL = 0; // 0x0
  }

  public abstract static class ResourcesCompat.FontCallback {
    ctor public ResourcesCompat.FontCallback();
    method public abstract void onFontRetrievalFailed(int);
    method public abstract void onFontRetrieved(android.graphics.Typeface);
  }

  public static final class ResourcesCompat.ThemeCompat {
    method public static void rebase(android.content.res.Resources.Theme);
  }

}

package androidx.core.database {

  public final class CursorWindowCompat {
    method public static android.database.CursorWindow create(String?, long);
  }

  @Deprecated public final class DatabaseUtilsCompat {
    method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
    method @Deprecated public static String! concatenateWhere(String!, String!);
  }

}

package androidx.core.database.sqlite {

  public final class SQLiteCursorCompat {
    method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
  }

}

package androidx.core.graphics {

  public final class BitmapCompat {
    method public static int getAllocationByteCount(android.graphics.Bitmap);
    method public static boolean hasMipMap(android.graphics.Bitmap);
    method public static void setHasMipMap(android.graphics.Bitmap, boolean);
  }

  public class BlendModeColorFilterCompat {
    method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
  }

  public enum BlendModeCompat {
    enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
    enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
    enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
    enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
    enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
    enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
    enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
    enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
    enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
    enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
    enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
    enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
  }

  public final class ColorUtils {
    method @ColorInt public static int HSLToColor(float[]);
    method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
    method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
    method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
    method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
    method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
    method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
    method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
    method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
    method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
    method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
    method public static double calculateContrast(@ColorInt int, @ColorInt int);
    method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
    method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
    method public static void colorToHSL(@ColorInt int, float[]);
    method public static void colorToLAB(@ColorInt int, double[]);
    method public static void colorToXYZ(@ColorInt int, double[]);
    method public static int compositeColors(@ColorInt int, @ColorInt int);
    method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
    method public static double distanceEuclidean(double[], double[]);
    method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
  }

  public final class Insets {
    method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
    method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
    method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
    method public static androidx.core.graphics.Insets of(int, int, int, int);
    method public static androidx.core.graphics.Insets of(android.graphics.Rect);
    method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
    method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
    method @RequiresApi(29) public android.graphics.Insets toPlatformInsets();
    field public static final androidx.core.graphics.Insets NONE;
    field public final int bottom;
    field public final int left;
    field public final int right;
    field public final int top;
  }

  public final class PaintCompat {
    method public static boolean hasGlyph(android.graphics.Paint, String);
    method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
  }

  public final class PathSegment {
    ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
    method public android.graphics.PointF getEnd();
    method public float getEndFraction();
    method public android.graphics.PointF getStart();
    method public float getStartFraction();
  }

  public final class PathUtils {
    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
    method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
  }

  public class TypefaceCompat {
    method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
  }

}

package androidx.core.graphics.drawable {

  public final class DrawableCompat {
    method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
    method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
    method public static void clearColorFilter(android.graphics.drawable.Drawable);
    method public static int getAlpha(android.graphics.drawable.Drawable);
    method public static android.graphics.ColorFilter? getColorFilter(android.graphics.drawable.Drawable);
    method public static int getLayoutDirection(android.graphics.drawable.Drawable);
    method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
    method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
    method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
    method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
    method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
    method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
    method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
    method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
    method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
    method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
    method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
    method public static android.graphics.drawable.Drawable wrap(android.graphics.drawable.Drawable);
  }

  public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
    method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
    method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmap(android.graphics.Bitmap);
    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
    method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
    method public static androidx.core.graphics.drawable.IconCompat createWithBitmap(android.graphics.Bitmap);
    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(String);
    method public static androidx.core.graphics.drawable.IconCompat createWithContentUri(android.net.Uri);
    method public static androidx.core.graphics.drawable.IconCompat createWithData(byte[], int, int);
    method public static androidx.core.graphics.drawable.IconCompat createWithResource(android.content.Context, @DrawableRes int);
    method @IdRes public int getResId();
    method public String getResPackage();
    method public int getType();
    method public android.net.Uri getUri();
    method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
    method public void onPostParceling();
    method public void onPreParceling(boolean);
    method public androidx.core.graphics.drawable.IconCompat setTint(@ColorInt int);
    method public androidx.core.graphics.drawable.IconCompat setTintList(android.content.res.ColorStateList?);
    method public androidx.core.graphics.drawable.IconCompat setTintMode(android.graphics.PorterDuff.Mode?);
    method public android.os.Bundle toBundle();
    method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
    method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
    field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
    field public static final int TYPE_BITMAP = 1; // 0x1
    field public static final int TYPE_DATA = 3; // 0x3
    field public static final int TYPE_RESOURCE = 2; // 0x2
    field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
    field public static final int TYPE_URI = 4; // 0x4
    field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
  }

  public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
    method public void draw(android.graphics.Canvas);
    method public final android.graphics.Bitmap? getBitmap();
    method public float getCornerRadius();
    method public int getGravity();
    method public int getOpacity();
    method public final android.graphics.Paint getPaint();
    method public boolean hasAntiAlias();
    method public boolean hasMipMap();
    method public boolean isCircular();
    method public void setAlpha(int);
    method public void setAntiAlias(boolean);
    method public void setCircular(boolean);
    method public void setColorFilter(android.graphics.ColorFilter!);
    method public void setCornerRadius(float);
    method public void setDither(boolean);
    method public void setGravity(int);
    method public void setMipMap(boolean);
    method public void setTargetDensity(android.graphics.Canvas);
    method public void setTargetDensity(android.util.DisplayMetrics);
    method public void setTargetDensity(int);
  }

  public final class RoundedBitmapDrawableFactory {
    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
    method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
  }

}

package androidx.core.hardware.display {

  public final class DisplayManagerCompat {
    method public android.view.Display? getDisplay(int);
    method public android.view.Display![] getDisplays();
    method public android.view.Display![] getDisplays(String?);
    method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
    field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
  }

}

package androidx.core.hardware.fingerprint {

  @Deprecated public class FingerprintManagerCompat {
    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
    method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
    method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
  }

  @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
    ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
    method @Deprecated public void onAuthenticationError(int, CharSequence!);
    method @Deprecated public void onAuthenticationFailed();
    method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
    method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
  }

  @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
    ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
    method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
  }

  @Deprecated public static class FingerprintManagerCompat.CryptoObject {
    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
    ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
    method @Deprecated public javax.crypto.Cipher? getCipher();
    method @Deprecated public javax.crypto.Mac? getMac();
    method @Deprecated public java.security.Signature? getSignature();
  }

}

package androidx.core.location {

  public abstract class GnssStatusCompat {
    method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
    method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
    method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
    method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
    method public abstract int getConstellationType(@IntRange(from=0) int);
    method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
    method @IntRange(from=0) public abstract int getSatelliteCount();
    method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
    method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
    method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
    method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
    method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
    method public abstract boolean usedInFix(@IntRange(from=0) int);
    method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
    method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
    field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
    field public static final int CONSTELLATION_GALILEO = 6; // 0x6
    field public static final int CONSTELLATION_GLONASS = 3; // 0x3
    field public static final int CONSTELLATION_GPS = 1; // 0x1
    field public static final int CONSTELLATION_IRNSS = 7; // 0x7
    field public static final int CONSTELLATION_QZSS = 4; // 0x4
    field public static final int CONSTELLATION_SBAS = 2; // 0x2
    field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
  }

  public abstract static class GnssStatusCompat.Callback {
    ctor public GnssStatusCompat.Callback();
    method public void onFirstFix(@IntRange(from=0) int);
    method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
    method public void onStarted();
    method public void onStopped();
  }

  public final class LocationCompat {
    method public static float getBearingAccuracyDegrees(android.location.Location);
    method public static long getElapsedRealtimeMillis(android.location.Location);
    method public static long getElapsedRealtimeNanos(android.location.Location);
    method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
    method public static float getVerticalAccuracyMeters(android.location.Location);
    method public static boolean hasBearingAccuracy(android.location.Location);
    method public static boolean hasSpeedAccuracy(android.location.Location);
    method public static boolean hasVerticalAccuracy(android.location.Location);
    method public static boolean isMock(android.location.Location);
    method public static void setBearingAccuracyDegrees(android.location.Location, float);
    method public static void setMock(android.location.Location, boolean);
    method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
    method public static void setVerticalAccuracyMeters(android.location.Location, float);
    field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
    field public static final String EXTRA_IS_MOCK = "mockLocation";
    field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
    field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
  }

  public interface LocationListenerCompat extends android.location.LocationListener {
    method public default void onStatusChanged(String, int, android.os.Bundle?);
  }

  public final class LocationManagerCompat {
    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
    method public static String? getGnssHardwareModelName(android.location.LocationManager);
    method public static int getGnssYearOfHardware(android.location.LocationManager);
    method public static boolean hasProvider(android.location.LocationManager, String);
    method public static boolean isLocationEnabled(android.location.LocationManager);
    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
    method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
  }

  public final class LocationRequestCompat {
    method @IntRange(from=1) public long getDurationMillis();
    method @IntRange(from=0) public long getIntervalMillis();
    method @IntRange(from=0) public long getMaxUpdateDelayMillis();
    method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
    method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
    method @IntRange(from=0) public long getMinUpdateIntervalMillis();
    method public int getQuality();
    method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
    method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
    field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
    field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
    field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
    field public static final int QUALITY_LOW_POWER = 104; // 0x68
  }

  public static final class LocationRequestCompat.Builder {
    ctor public LocationRequestCompat.Builder(long);
    ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
    method public androidx.core.location.LocationRequestCompat build();
    method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
    method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
    method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
    method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
    method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
    method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
  }

}

package androidx.core.math {

  public class MathUtils {
    method public static int addExact(int, int);
    method public static long addExact(long, long);
    method public static float clamp(float, float, float);
    method public static double clamp(double, double, double);
    method public static int clamp(int, int, int);
    method public static long clamp(long, long, long);
    method public static int decrementExact(int);
    method public static long decrementExact(long);
    method public static int incrementExact(int);
    method public static long incrementExact(long);
    method public static int multiplyExact(int, int);
    method public static long multiplyExact(long, long);
    method public static int negateExact(int);
    method public static long negateExact(long);
    method public static int subtractExact(int, int);
    method public static long subtractExact(long, long);
    method public static int toIntExact(long);
  }

}

package androidx.core.net {

  public final class ConnectivityManagerCompat {
    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
    method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
    method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
    field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
    field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
    field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
  }

  public final class MailTo {
    method public String? getBcc();
    method public String? getBody();
    method public String? getCc();
    method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
    method public String? getSubject();
    method public String? getTo();
    method public static boolean isMailTo(String?);
    method public static boolean isMailTo(android.net.Uri?);
    method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
    method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
    field public static final String MAILTO_SCHEME = "mailto:";
  }

  public class ParseException extends java.lang.RuntimeException {
    field public final String response;
  }

  public final class TrafficStatsCompat {
    method @Deprecated public static void clearThreadStatsTag();
    method @Deprecated public static int getThreadStatsTag();
    method @Deprecated public static void incrementOperationCount(int);
    method @Deprecated public static void incrementOperationCount(int, int);
    method @Deprecated public static void setThreadStatsTag(int);
    method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
    method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
    method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
    method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
  }

  public final class UriCompat {
    method public static String toSafeString(android.net.Uri);
  }

}

package androidx.core.os {

  public class BuildCompat {
    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
    method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
    method @Deprecated @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
    method @ChecksSdkIntAtLeast(api=32, codename="Sv2") @androidx.core.os.BuildCompat.PrereleaseSdkCheck public static boolean isAtLeastSv2();
    method @ChecksSdkIntAtLeast(codename="Tiramisu") @androidx.core.os.BuildCompat.PrereleaseSdkCheck public static boolean isAtLeastT();
  }

  @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface BuildCompat.PrereleaseSdkCheck {
  }

  public final class CancellationSignal {
    ctor public CancellationSignal();
    method public void cancel();
    method public Object? getCancellationSignalObject();
    method public boolean isCanceled();
    method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
    method public void throwIfCanceled();
  }

  public static interface CancellationSignal.OnCancelListener {
    method public void onCancel();
  }

  public final class ConfigurationCompat {
    method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
  }

  public final class EnvironmentCompat {
    method public static String getStorageState(java.io.File);
    field public static final String MEDIA_UNKNOWN = "unknown";
  }

  public final class ExecutorCompat {
    method public static java.util.concurrent.Executor create(android.os.Handler);
  }

  public final class HandlerCompat {
    method public static android.os.Handler createAsync(android.os.Looper);
    method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
    method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
    method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
  }

  public final class LocaleListCompat {
    method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
    method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
    method public java.util.Locale! get(int);
    method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
    method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
    method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
    method public java.util.Locale? getFirstMatch(String![]);
    method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
    method public boolean isEmpty();
    method @IntRange(from=0) public int size();
    method public String toLanguageTags();
    method public Object? unwrap();
    method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
    method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
  }

  public final class MessageCompat {
    method public static boolean isAsynchronous(android.os.Message);
    method public static void setAsynchronous(android.os.Message, boolean);
  }

  public class OperationCanceledException extends java.lang.RuntimeException {
    ctor public OperationCanceledException();
    ctor public OperationCanceledException(String?);
  }

  public final class ParcelCompat {
    method public static boolean readBoolean(android.os.Parcel);
    method public static void writeBoolean(android.os.Parcel, boolean);
  }

  @Deprecated public final class ParcelableCompat {
    method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
  }

  @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
    method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
    method @Deprecated public T![]! newArray(int);
  }

  public final class ProcessCompat {
    method public static boolean isApplicationUid(int);
  }

  @Deprecated public final class TraceCompat {
    method @Deprecated public static void beginAsyncSection(String, int);
    method @Deprecated public static void beginSection(String);
    method @Deprecated public static void endAsyncSection(String, int);
    method @Deprecated public static void endSection();
    method @Deprecated public static boolean isEnabled();
    method @Deprecated public static void setCounter(String, int);
  }

  @RequiresApi(17) public class UserHandleCompat {
    method public static android.os.UserHandle getUserHandleForUid(int);
  }

  public class UserManagerCompat {
    method public static boolean isUserUnlocked(android.content.Context);
  }

}

package androidx.core.provider {

  public final class DocumentsContractCompat {
    method public static android.net.Uri? buildChildDocumentsUri(String, String?);
    method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
    method public static android.net.Uri? buildDocumentUri(String, String);
    method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
    method public static android.net.Uri? buildTreeDocumentUri(String, String);
    method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
    method public static String? getDocumentId(android.net.Uri);
    method public static String? getTreeDocumentId(android.net.Uri);
    method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
    method public static boolean isTreeUri(android.net.Uri);
    method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
    method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
  }

  public static final class DocumentsContractCompat.DocumentCompat {
    field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
  }

  public final class FontRequest {
    ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
    ctor public FontRequest(String, String, String, @ArrayRes int);
    method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
    method @ArrayRes public int getCertificatesArrayResId();
    method public String getProviderAuthority();
    method public String getProviderPackage();
    method public String getQuery();
  }

  public class FontsContractCompat {
    method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
    method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
    method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
  }

  public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
    ctor public FontsContractCompat.Columns();
    field public static final String FILE_ID = "file_id";
    field public static final String ITALIC = "font_italic";
    field public static final String RESULT_CODE = "result_code";
    field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
    field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
    field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
    field public static final int RESULT_CODE_OK = 0; // 0x0
    field public static final String TTC_INDEX = "font_ttc_index";
    field public static final String VARIATION_SETTINGS = "font_variation_settings";
    field public static final String WEIGHT = "font_weight";
  }

  public static class FontsContractCompat.FontFamilyResult {
    method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
    method public int getStatusCode();
    field public static final int STATUS_OK = 0; // 0x0
    field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
    field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
  }

  public static class FontsContractCompat.FontInfo {
    method public int getResultCode();
    method @IntRange(from=0) public int getTtcIndex();
    method public android.net.Uri getUri();
    method @IntRange(from=1, to=1000) public int getWeight();
    method public boolean isItalic();
  }

  public static class FontsContractCompat.FontRequestCallback {
    ctor public FontsContractCompat.FontRequestCallback();
    method public void onTypefaceRequestFailed(int);
    method public void onTypefaceRetrieved(android.graphics.Typeface!);
    field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
    field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
    field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
    field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
    field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
    field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
    field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
  }

}

package androidx.core.telephony {

  @RequiresApi(22) public class SubscriptionManagerCompat {
    method public static int getSlotIndex(int);
  }

  public class TelephonyManagerCompat {
    method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
    method public static int getSubscriptionId(android.telephony.TelephonyManager);
  }

}

package androidx.core.telephony.mbms {

  public final class MbmsHelper {
    method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
  }

}

package androidx.core.text {

  public final class BidiFormatter {
    method public static androidx.core.text.BidiFormatter! getInstance();
    method public static androidx.core.text.BidiFormatter! getInstance(boolean);
    method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
    method public boolean getStereoReset();
    method public boolean isRtl(String!);
    method public boolean isRtl(CharSequence!);
    method public boolean isRtlContext();
    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
    method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
    method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
    method public String! unicodeWrap(String!, boolean);
    method public CharSequence! unicodeWrap(CharSequence!, boolean);
    method public String! unicodeWrap(String!);
    method public CharSequence! unicodeWrap(CharSequence!);
  }

  public static final class BidiFormatter.Builder {
    ctor public BidiFormatter.Builder();
    ctor public BidiFormatter.Builder(boolean);
    ctor public BidiFormatter.Builder(java.util.Locale!);
    method public androidx.core.text.BidiFormatter! build();
    method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
    method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
  }

  public final class HtmlCompat {
    method public static android.text.Spanned fromHtml(String, int);
    method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
    method public static String toHtml(android.text.Spanned, int);
    field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
    field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
    field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
    field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
    field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
    field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
  }

  public final class ICUCompat {
    method public static String? maximizeAndGetScript(java.util.Locale!);
  }

  public class PrecomputedTextCompat implements android.text.Spannable {
    method public char charAt(int);
    method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
    method @IntRange(from=0) public int getParagraphCount();
    method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
    method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
    method public androidx.core.text.PrecomputedTextCompat.Params getParams();
    method public int getSpanEnd(Object!);
    method public int getSpanFlags(Object!);
    method public int getSpanStart(Object!);
    method public <T> T![]! getSpans(int, int, Class<T!>!);
    method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
    method public int length();
    method public int nextSpanTransition(int, int, Class!);
    method public void removeSpan(Object!);
    method public void setSpan(Object!, int, int, int);
    method public CharSequence! subSequence(int, int);
  }

  public static final class PrecomputedTextCompat.Params {
    ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
    method @RequiresApi(23) public int getBreakStrategy();
    method @RequiresApi(23) public int getHyphenationFrequency();
    method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
    method public android.text.TextPaint getTextPaint();
  }

  public static class PrecomputedTextCompat.Params.Builder {
    ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
    method public androidx.core.text.PrecomputedTextCompat.Params build();
    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
    method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
    method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
  }

  public interface TextDirectionHeuristicCompat {
    method public boolean isRtl(char[]!, int, int);
    method public boolean isRtl(CharSequence!, int, int);
  }

  public final class TextDirectionHeuristicsCompat {
    field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
    field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
    field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
    field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
    field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
  }

  public final class TextUtilsCompat {
    method public static int getLayoutDirectionFromLocale(java.util.Locale?);
    method public static String htmlEncode(String);
  }

}

package androidx.core.text.util {

  public final class LinkifyCompat {
    method public static boolean addLinks(android.text.Spannable, int);
    method public static boolean addLinks(android.widget.TextView, int);
    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
    method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
    method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
  }

}

package androidx.core.util {

  public class AtomicFile {
    ctor public AtomicFile(java.io.File);
    method public void delete();
    method public void failWrite(java.io.FileOutputStream?);
    method public void finishWrite(java.io.FileOutputStream?);
    method public java.io.File getBaseFile();
    method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
    method public byte[] readFully() throws java.io.IOException;
    method public java.io.FileOutputStream startWrite() throws java.io.IOException;
  }

  public interface Consumer<T> {
    method public void accept(T!);
  }

  public class ObjectsCompat {
    method public static boolean equals(Object?, Object?);
    method public static int hash(java.lang.Object!...);
    method public static int hashCode(Object?);
    method public static <T> T requireNonNull(T?);
    method public static <T> T requireNonNull(T?, String);
    method public static String? toString(Object?, String?);
  }

  public class Pair<F, S> {
    ctor public Pair(F!, S!);
    method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
    field public final F! first;
    field public final S! second;
  }

  public final class PatternsCompat {
    field public static final java.util.regex.Pattern DOMAIN_NAME;
    field public static final java.util.regex.Pattern EMAIL_ADDRESS;
    field public static final java.util.regex.Pattern IP_ADDRESS;
    field public static final java.util.regex.Pattern WEB_URL;
  }

  public final class Pools {
  }

  public static interface Pools.Pool<T> {
    method public T? acquire();
    method public boolean release(T);
  }

  public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
    ctor public Pools.SimplePool(int);
    method public T! acquire();
    method public boolean release(T);
  }

  public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
    ctor public Pools.SynchronizedPool(int);
  }

  public interface Predicate<T> {
    method public boolean test(T!);
  }

  public final class SizeFCompat {
    ctor public SizeFCompat(float, float);
    method public float getHeight();
    method public float getWidth();
    method @RequiresApi(21) public android.util.SizeF toSizeF();
    method @RequiresApi(21) public static androidx.core.util.SizeFCompat toSizeFCompat(android.util.SizeF);
  }

  public interface Supplier<T> {
    method public T! get();
  }

}

package androidx.core.view {

  public class AccessibilityDelegateCompat {
    ctor public AccessibilityDelegateCompat();
    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    method public void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
    method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
    method public void sendAccessibilityEvent(android.view.View, int);
    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
  }

  public abstract class ActionProvider {
    ctor public ActionProvider(android.content.Context);
    method public android.content.Context getContext();
    method public boolean hasSubMenu();
    method public boolean isVisible();
    method public abstract android.view.View onCreateActionView();
    method public android.view.View onCreateActionView(android.view.MenuItem);
    method public boolean onPerformDefaultAction();
    method public void onPrepareSubMenu(android.view.SubMenu);
    method public boolean overridesItemVisibility();
    method public void refreshVisibility();
    method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener?);
  }

  public static interface ActionProvider.VisibilityListener {
    method public void onActionProviderVisibilityChanged(boolean);
  }

  public final class ContentInfoCompat {
    method public android.content.ClipData getClip();
    method public android.os.Bundle? getExtras();
    method public int getFlags();
    method public android.net.Uri? getLinkUri();
    method public int getSource();
    method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
    method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
    method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
    method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
    field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
    field public static final int SOURCE_APP = 0; // 0x0
    field public static final int SOURCE_AUTOFILL = 4; // 0x4
    field public static final int SOURCE_CLIPBOARD = 1; // 0x1
    field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
    field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
    field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
  }

  public static final class ContentInfoCompat.Builder {
    ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
    ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
    method public androidx.core.view.ContentInfoCompat build();
    method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
    method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
    method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
    method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
    method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
  }

  public final class DisplayCompat {
    method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
    method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
  }

  public static final class DisplayCompat.ModeCompat {
    method public int getPhysicalHeight();
    method public int getPhysicalWidth();
    method @Deprecated public boolean isNative();
    method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
  }

  public final class DisplayCutoutCompat {
    ctor public DisplayCutoutCompat(android.graphics.Rect?, java.util.List<android.graphics.Rect!>?);
    ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
    method public java.util.List<android.graphics.Rect!> getBoundingRects();
    method public int getSafeInsetBottom();
    method public int getSafeInsetLeft();
    method public int getSafeInsetRight();
    method public int getSafeInsetTop();
    method public androidx.core.graphics.Insets getWaterfallInsets();
  }

  public final class DragAndDropPermissionsCompat {
    method public void release();
  }

  public class DragStartHelper {
    ctor public DragStartHelper(android.view.View, androidx.core.view.DragStartHelper.OnDragStartListener);
    method public void attach();
    method public void detach();
    method public void getTouchPosition(android.graphics.Point);
    method public boolean onLongClick(android.view.View);
    method public boolean onTouch(android.view.View, android.view.MotionEvent);
  }

  public static interface DragStartHelper.OnDragStartListener {
    method public boolean onDragStart(android.view.View, androidx.core.view.DragStartHelper);
  }

  public final class GestureDetectorCompat {
    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener);
    ctor public GestureDetectorCompat(android.content.Context, android.view.GestureDetector.OnGestureListener, android.os.Handler?);
    method public boolean isLongpressEnabled();
    method public boolean onTouchEvent(android.view.MotionEvent);
    method public void setIsLongpressEnabled(boolean);
    method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener?);
  }

  public final class GravityCompat {
    method public static void apply(int, int, int, android.graphics.Rect, android.graphics.Rect, int);
    method public static void apply(int, int, int, android.graphics.Rect, int, int, android.graphics.Rect, int);
    method public static void applyDisplay(int, android.graphics.Rect, android.graphics.Rect, int);
    method public static int getAbsoluteGravity(int, int);
    field public static final int END = 8388613; // 0x800005
    field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
    field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
    field public static final int START = 8388611; // 0x800003
  }

  public final class InputDeviceCompat {
    field public static final int SOURCE_ANY = -256; // 0xffffff00
    field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
    field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
    field public static final int SOURCE_CLASS_MASK = 255; // 0xff
    field public static final int SOURCE_CLASS_NONE = 0; // 0x0
    field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
    field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
    field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
    field public static final int SOURCE_DPAD = 513; // 0x201
    field public static final int SOURCE_GAMEPAD = 1025; // 0x401
    field public static final int SOURCE_HDMI = 33554433; // 0x2000001
    field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
    field public static final int SOURCE_KEYBOARD = 257; // 0x101
    field public static final int SOURCE_MOUSE = 8194; // 0x2002
    field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
    field public static final int SOURCE_STYLUS = 16386; // 0x4002
    field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
    field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
    field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
    field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
    field public static final int SOURCE_UNKNOWN = 0; // 0x0
  }

  public final class LayoutInflaterCompat {
    method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
    method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
    method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
  }

  @Deprecated public interface LayoutInflaterFactory {
    method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
  }

  public final class MarginLayoutParamsCompat {
    method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams);
    method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams);
    method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams);
    method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams);
    method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
    method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams, int);
    method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams, int);
    method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams, int);
  }

  public final class MenuCompat {
    method public static void setGroupDividerEnabled(android.view.Menu, boolean);
    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
  }

  public interface MenuHost {
    method public void addMenuProvider(androidx.core.view.MenuProvider);
    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
    method public void invalidateMenu();
    method public void removeMenuProvider(androidx.core.view.MenuProvider);
  }

  public class MenuHostHelper {
    ctor public MenuHostHelper(Runnable);
    method public void addMenuProvider(androidx.core.view.MenuProvider);
    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
    method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
    method public boolean onMenuItemSelected(android.view.MenuItem);
    method public void removeMenuProvider(androidx.core.view.MenuProvider);
  }

  public final class MenuItemCompat {
    method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
    method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
    method public static androidx.core.view.ActionProvider? getActionProvider(android.view.MenuItem);
    method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
    method public static int getAlphabeticModifiers(android.view.MenuItem);
    method public static CharSequence? getContentDescription(android.view.MenuItem);
    method public static android.content.res.ColorStateList? getIconTintList(android.view.MenuItem);
    method public static android.graphics.PorterDuff.Mode? getIconTintMode(android.view.MenuItem);
    method public static int getNumericModifiers(android.view.MenuItem);
    method public static CharSequence? getTooltipText(android.view.MenuItem);
    method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
    method public static android.view.MenuItem? setActionProvider(android.view.MenuItem, androidx.core.view.ActionProvider?);
    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
    method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
    method public static void setAlphabeticShortcut(android.view.MenuItem, char, int);
    method public static void setContentDescription(android.view.MenuItem, CharSequence?);
    method public static void setIconTintList(android.view.MenuItem, android.content.res.ColorStateList?);
    method public static void setIconTintMode(android.view.MenuItem, android.graphics.PorterDuff.Mode?);
    method public static void setNumericShortcut(android.view.MenuItem, char, int);
    method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
    method public static void setShortcut(android.view.MenuItem, char, char, int, int);
    method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
    method public static void setTooltipText(android.view.MenuItem, CharSequence?);
    field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
    field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
    field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
    field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
    field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
  }

  @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
    method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
    method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
  }

  public interface MenuProvider {
    method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
    method public boolean onMenuItemSelected(android.view.MenuItem);
  }

  public final class MotionEventCompat {
    method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
    method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
    method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
    method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
    method @Deprecated public static int getButtonState(android.view.MotionEvent!);
    method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
    method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
    method @Deprecated public static int getSource(android.view.MotionEvent!);
    method @Deprecated public static float getX(android.view.MotionEvent!, int);
    method @Deprecated public static float getY(android.view.MotionEvent!, int);
    method public static boolean isFromSource(android.view.MotionEvent, int);
    field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
    field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
    field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
    field @Deprecated public static final int ACTION_MASK = 255; // 0xff
    field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
    field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
    field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
    field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
    field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
    field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
    field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
    field @Deprecated public static final int AXIS_GAS = 22; // 0x16
    field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
    field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
    field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
    field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
    field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
    field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
    field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
    field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
    field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
    field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
    field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
    field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
    field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
    field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
    field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
    field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
    field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
    field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
    field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
    field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
    field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
    field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
    field public static final int AXIS_RELATIVE_X = 27; // 0x1b
    field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
    field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
    field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
    field @Deprecated public static final int AXIS_RX = 12; // 0xc
    field @Deprecated public static final int AXIS_RY = 13; // 0xd
    field @Deprecated public static final int AXIS_RZ = 14; // 0xe
    field public static final int AXIS_SCROLL = 26; // 0x1a
    field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
    field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
    field @Deprecated public static final int AXIS_TILT = 25; // 0x19
    field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
    field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
    field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
    field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
    field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
    field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
    field @Deprecated public static final int AXIS_X = 0; // 0x0
    field @Deprecated public static final int AXIS_Y = 1; // 0x1
    field @Deprecated public static final int AXIS_Z = 11; // 0xb
    field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
  }

  public interface NestedScrollingChild {
    method public boolean dispatchNestedFling(float, float, boolean);
    method public boolean dispatchNestedPreFling(float, float);
    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
    method public boolean hasNestedScrollingParent();
    method public boolean isNestedScrollingEnabled();
    method public void setNestedScrollingEnabled(boolean);
    method public boolean startNestedScroll(int);
    method public void stopNestedScroll();
  }

  public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
    method public boolean hasNestedScrollingParent(int);
    method public boolean startNestedScroll(int, int);
    method public void stopNestedScroll(int);
  }

  public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
  }

  public class NestedScrollingChildHelper {
    ctor public NestedScrollingChildHelper(android.view.View);
    method public boolean dispatchNestedFling(float, float, boolean);
    method public boolean dispatchNestedPreFling(float, float);
    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
    method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
    method public boolean hasNestedScrollingParent();
    method public boolean hasNestedScrollingParent(int);
    method public boolean isNestedScrollingEnabled();
    method public void onDetachedFromWindow();
    method public void onStopNestedScroll(android.view.View);
    method public void setNestedScrollingEnabled(boolean);
    method public boolean startNestedScroll(int);
    method public boolean startNestedScroll(int, int);
    method public void stopNestedScroll();
    method public void stopNestedScroll(int);
  }

  public interface NestedScrollingParent {
    method public int getNestedScrollAxes();
    method public boolean onNestedFling(android.view.View, float, float, boolean);
    method public boolean onNestedPreFling(android.view.View, float, float);
    method public void onNestedPreScroll(android.view.View, int, int, int[]);
    method public void onNestedScroll(android.view.View, int, int, int, int);
    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
    method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
    method public void onStopNestedScroll(android.view.View);
  }

  public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
    method public void onNestedScroll(android.view.View, int, int, int, int, int);
    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
    method public void onStopNestedScroll(android.view.View, int);
  }

  public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
  }

  public class NestedScrollingParentHelper {
    ctor public NestedScrollingParentHelper(android.view.ViewGroup);
    method public int getNestedScrollAxes();
    method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
    method public void onStopNestedScroll(android.view.View);
    method public void onStopNestedScroll(android.view.View, int);
  }

  public interface OnApplyWindowInsetsListener {
    method public androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
  }

  public interface OnReceiveContentListener {
    method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
  }

  public interface OnReceiveContentViewBehavior {
    method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
  }

  public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
    method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
    method public boolean onPreDraw();
    method public void onViewAttachedToWindow(android.view.View);
    method public void onViewDetachedFromWindow(android.view.View);
    method public void removeListener();
  }

  public final class PointerIconCompat {
    method public static androidx.core.view.PointerIconCompat create(android.graphics.Bitmap, float, float);
    method public static androidx.core.view.PointerIconCompat getSystemIcon(android.content.Context, int);
    method public static androidx.core.view.PointerIconCompat load(android.content.res.Resources, int);
    field public static final int TYPE_ALIAS = 1010; // 0x3f2
    field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
    field public static final int TYPE_ARROW = 1000; // 0x3e8
    field public static final int TYPE_CELL = 1006; // 0x3ee
    field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
    field public static final int TYPE_COPY = 1011; // 0x3f3
    field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
    field public static final int TYPE_DEFAULT = 1000; // 0x3e8
    field public static final int TYPE_GRAB = 1020; // 0x3fc
    field public static final int TYPE_GRABBING = 1021; // 0x3fd
    field public static final int TYPE_HAND = 1002; // 0x3ea
    field public static final int TYPE_HELP = 1003; // 0x3eb
    field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
    field public static final int TYPE_NO_DROP = 1012; // 0x3f4
    field public static final int TYPE_NULL = 0; // 0x0
    field public static final int TYPE_TEXT = 1008; // 0x3f0
    field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
    field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
    field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
    field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
    field public static final int TYPE_WAIT = 1004; // 0x3ec
    field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
    field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
  }

  public final class ScaleGestureDetectorCompat {
    method @Deprecated public static boolean isQuickScaleEnabled(Object!);
    method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector);
    method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
    method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector, boolean);
  }

  public interface ScrollingView {
    method public int computeHorizontalScrollExtent();
    method public int computeHorizontalScrollOffset();
    method public int computeHorizontalScrollRange();
    method public int computeVerticalScrollExtent();
    method public int computeVerticalScrollOffset();
    method public int computeVerticalScrollRange();
  }

  public interface TintableBackgroundView {
    method public android.content.res.ColorStateList? getSupportBackgroundTintList();
    method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
    method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
    method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
  }

  @Deprecated public final class VelocityTrackerCompat {
    method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
    method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
  }

  public class ViewCompat {
    ctor @Deprecated protected ViewCompat();
    method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
    method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
    method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
    method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
    method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
    method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
    method public static void cancelDragAndDrop(android.view.View);
    method @Deprecated public static int combineMeasuredStates(int, int);
    method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
    method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
    method public static void dispatchFinishTemporaryDetach(android.view.View);
    method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
    method public static boolean dispatchNestedPreFling(android.view.View, float, float);
    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
    method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
    method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
    method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
    method public static void dispatchStartTemporaryDetach(android.view.View);
    method public static void enableAccessibleClickableSpanSupport(android.view.View);
    method public static int generateViewId();
    method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
    method public static int getAccessibilityLiveRegion(android.view.View);
    method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
    method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
    method @Deprecated public static float getAlpha(android.view.View!);
    method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
    method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
    method public static android.graphics.Rect? getClipBounds(android.view.View);
    method public static android.view.Display? getDisplay(android.view.View);
    method public static float getElevation(android.view.View);
    method public static boolean getFitsSystemWindows(android.view.View);
    method public static int getImportantForAccessibility(android.view.View);
    method public static int getImportantForAutofill(android.view.View);
    method public static int getLabelFor(android.view.View);
    method @Deprecated public static int getLayerType(android.view.View!);
    method public static int getLayoutDirection(android.view.View);
    method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
    method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
    method @Deprecated public static int getMeasuredState(android.view.View!);
    method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
    method public static int getMinimumHeight(android.view.View);
    method public static int getMinimumWidth(android.view.View);
    method public static int getNextClusterForwardId(android.view.View);
    method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
    method @Deprecated public static int getOverScrollMode(android.view.View!);
    method @Px public static int getPaddingEnd(android.view.View);
    method @Px public static int getPaddingStart(android.view.View);
    method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
    method @Deprecated public static float getPivotX(android.view.View!);
    method @Deprecated public static float getPivotY(android.view.View!);
    method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
    method @Deprecated public static float getRotation(android.view.View!);
    method @Deprecated public static float getRotationX(android.view.View!);
    method @Deprecated public static float getRotationY(android.view.View!);
    method @Deprecated public static float getScaleX(android.view.View!);
    method @Deprecated public static float getScaleY(android.view.View!);
    method public static int getScrollIndicators(android.view.View);
    method @UiThread public static CharSequence? getStateDescription(android.view.View);
    method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
    method public static String? getTransitionName(android.view.View);
    method @Deprecated public static float getTranslationX(android.view.View!);
    method @Deprecated public static float getTranslationY(android.view.View!);
    method public static float getTranslationZ(android.view.View);
    method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
    method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
    method @Deprecated public static float getX(android.view.View!);
    method @Deprecated public static float getY(android.view.View!);
    method public static float getZ(android.view.View);
    method public static boolean hasAccessibilityDelegate(android.view.View);
    method public static boolean hasExplicitFocusable(android.view.View);
    method public static boolean hasNestedScrollingParent(android.view.View);
    method public static boolean hasNestedScrollingParent(android.view.View, int);
    method public static boolean hasOnClickListeners(android.view.View);
    method public static boolean hasOverlappingRendering(android.view.View);
    method public static boolean hasTransientState(android.view.View);
    method @UiThread public static boolean isAccessibilityHeading(android.view.View);
    method public static boolean isAttachedToWindow(android.view.View);
    method public static boolean isFocusedByDefault(android.view.View);
    method public static boolean isImportantForAccessibility(android.view.View);
    method public static boolean isImportantForAutofill(android.view.View);
    method public static boolean isInLayout(android.view.View);
    method public static boolean isKeyboardNavigationCluster(android.view.View);
    method public static boolean isLaidOut(android.view.View);
    method public static boolean isLayoutDirectionResolved(android.view.View);
    method public static boolean isNestedScrollingEnabled(android.view.View);
    method @Deprecated public static boolean isOpaque(android.view.View!);
    method public static boolean isPaddingRelative(android.view.View);
    method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
    method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
    method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
    method public static void offsetLeftAndRight(android.view.View, int);
    method public static void offsetTopAndBottom(android.view.View, int);
    method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
    method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
    method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
    method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
    method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
    method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
    method public static void postInvalidateOnAnimation(android.view.View);
    method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
    method public static void postOnAnimation(android.view.View, Runnable);
    method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
    method public static void removeAccessibilityAction(android.view.View, int);
    method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
    method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
    method public static void requestApplyInsets(android.view.View);
    method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
    method @Deprecated public static int resolveSizeAndState(int, int, int);
    method public static boolean restoreDefaultFocus(android.view.View);
    method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
    method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
    method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
    method public static void setAccessibilityLiveRegion(android.view.View, int);
    method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
    method @Deprecated public static void setActivated(android.view.View!, boolean);
    method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
    method public static void setAutofillHints(android.view.View, java.lang.String!...);
    method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
    method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
    method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
    method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
    method public static void setClipBounds(android.view.View, android.graphics.Rect?);
    method public static void setElevation(android.view.View, float);
    method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
    method public static void setFocusedByDefault(android.view.View, boolean);
    method public static void setHasTransientState(android.view.View, boolean);
    method @UiThread public static void setImportantForAccessibility(android.view.View, int);
    method public static void setImportantForAutofill(android.view.View, int);
    method public static void setKeyboardNavigationCluster(android.view.View, boolean);
    method public static void setLabelFor(android.view.View, @IdRes int);
    method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
    method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
    method public static void setLayoutDirection(android.view.View, int);
    method public static void setNestedScrollingEnabled(android.view.View, boolean);
    method public static void setNextClusterForwardId(android.view.View, int);
    method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
    method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
    method @Deprecated public static void setOverScrollMode(android.view.View!, int);
    method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
    method @Deprecated public static void setPivotX(android.view.View!, float);
    method @Deprecated public static void setPivotY(android.view.View!, float);
    method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
    method @Deprecated public static void setRotation(android.view.View!, float);
    method @Deprecated public static void setRotationX(android.view.View!, float);
    method @Deprecated public static void setRotationY(android.view.View!, float);
    method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
    method @Deprecated public static void setScaleX(android.view.View!, float);
    method @Deprecated public static void setScaleY(android.view.View!, float);
    method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
    method public static void setScrollIndicators(android.view.View, int);
    method public static void setScrollIndicators(android.view.View, int, int);
    method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
    method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
    method public static void setTooltipText(android.view.View, CharSequence?);
    method public static void setTransitionName(android.view.View, String?);
    method @Deprecated public static void setTranslationX(android.view.View!, float);
    method @Deprecated public static void setTranslationY(android.view.View!, float);
    method public static void setTranslationZ(android.view.View, float);
    method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
    method @Deprecated public static void setX(android.view.View!, float);
    method @Deprecated public static void setY(android.view.View!, float);
    method public static void setZ(android.view.View, float);
    method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
    method public static boolean startNestedScroll(android.view.View, int);
    method public static boolean startNestedScroll(android.view.View, int, int);
    method public static void stopNestedScroll(android.view.View);
    method public static void stopNestedScroll(android.view.View, int);
    method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
    field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
    field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
    field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
    field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
    field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
    field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
    field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
    field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
    field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
    field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
    field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
    field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
    field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
    field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
    field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
    field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
    field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
    field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
    field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
    field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
    field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
    field public static final int SCROLL_AXIS_NONE = 0; // 0x0
    field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
    field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
    field public static final int SCROLL_INDICATOR_END = 32; // 0x20
    field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
    field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
    field public static final int SCROLL_INDICATOR_START = 16; // 0x10
    field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
    field public static final int TYPE_NON_TOUCH = 1; // 0x1
    field public static final int TYPE_TOUCH = 0; // 0x0
  }

  public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
    method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
  }

  public final class ViewConfigurationCompat {
    method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
    method public static int getScaledHoverSlop(android.view.ViewConfiguration);
    method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
    method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
    method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
    method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration, android.content.Context);
  }

  public final class ViewGroupCompat {
    method public static int getLayoutMode(android.view.ViewGroup);
    method public static int getNestedScrollAxes(android.view.ViewGroup);
    method public static boolean isTransitionGroup(android.view.ViewGroup);
    method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
    method public static void setLayoutMode(android.view.ViewGroup, int);
    method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
    method public static void setTransitionGroup(android.view.ViewGroup, boolean);
    field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
    field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
  }

  public final class ViewParentCompat {
    method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent, android.view.View, android.view.View, int);
    method public static boolean onNestedFling(android.view.ViewParent, android.view.View, float, float, boolean);
    method public static boolean onNestedPreFling(android.view.ViewParent, android.view.View, float, float);
    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[]);
    method public static void onNestedPreScroll(android.view.ViewParent, android.view.View, int, int, int[], int);
    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int);
    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int);
    method public static void onNestedScroll(android.view.ViewParent, android.view.View, int, int, int, int, int, int[]);
    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int);
    method public static void onNestedScrollAccepted(android.view.ViewParent, android.view.View, android.view.View, int, int);
    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int);
    method public static boolean onStartNestedScroll(android.view.ViewParent, android.view.View, android.view.View, int, int);
    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View);
    method public static void onStopNestedScroll(android.view.ViewParent, android.view.View, int);
    method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
  }

  public final class ViewPropertyAnimatorCompat {
    method public androidx.core.view.ViewPropertyAnimatorCompat alpha(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat alphaBy(float);
    method public void cancel();
    method public long getDuration();
    method public android.view.animation.Interpolator? getInterpolator();
    method public long getStartDelay();
    method public androidx.core.view.ViewPropertyAnimatorCompat rotation(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat rotationBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat rotationX(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat rotationXBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat rotationY(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat rotationYBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat scaleX(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat scaleXBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat scaleY(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat scaleYBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat setDuration(long);
    method public androidx.core.view.ViewPropertyAnimatorCompat setInterpolator(android.view.animation.Interpolator?);
    method public androidx.core.view.ViewPropertyAnimatorCompat setListener(androidx.core.view.ViewPropertyAnimatorListener?);
    method public androidx.core.view.ViewPropertyAnimatorCompat setStartDelay(long);
    method public androidx.core.view.ViewPropertyAnimatorCompat setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener?);
    method public void start();
    method public androidx.core.view.ViewPropertyAnimatorCompat translationX(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat translationXBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat translationY(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat translationYBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat translationZ(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat translationZBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat withEndAction(Runnable);
    method public androidx.core.view.ViewPropertyAnimatorCompat withLayer();
    method public androidx.core.view.ViewPropertyAnimatorCompat withStartAction(Runnable);
    method public androidx.core.view.ViewPropertyAnimatorCompat x(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat xBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat y(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat yBy(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat z(float);
    method public androidx.core.view.ViewPropertyAnimatorCompat zBy(float);
  }

  public interface ViewPropertyAnimatorListener {
    method public void onAnimationCancel(android.view.View);
    method public void onAnimationEnd(android.view.View);
    method public void onAnimationStart(android.view.View);
  }

  public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
    ctor public ViewPropertyAnimatorListenerAdapter();
    method public void onAnimationCancel(android.view.View);
    method public void onAnimationEnd(android.view.View);
    method public void onAnimationStart(android.view.View);
  }

  public interface ViewPropertyAnimatorUpdateListener {
    method public void onAnimationUpdate(android.view.View);
  }

  public final class WindowCompat {
    method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
    method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
    method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
    field public static final int FEATURE_ACTION_BAR = 8; // 0x8
    field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
    field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
  }

  public final class WindowInsetsAnimationCompat {
    ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
    method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
    method public long getDurationMillis();
    method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
    method public float getInterpolatedFraction();
    method public android.view.animation.Interpolator? getInterpolator();
    method public int getTypeMask();
    method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
    method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
  }

  public static final class WindowInsetsAnimationCompat.BoundsCompat {
    ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
    method public androidx.core.graphics.Insets getLowerBound();
    method public androidx.core.graphics.Insets getUpperBound();
    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
    method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
    method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
  }

  public abstract static class WindowInsetsAnimationCompat.Callback {
    ctor public WindowInsetsAnimationCompat.Callback(int);
    method public final int getDispatchMode();
    method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
    method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
    method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
    method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
    field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
    field public static final int DISPATCH_MODE_STOP = 0; // 0x0
  }

  public interface WindowInsetsAnimationControlListenerCompat {
    method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
    method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
    method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
  }

  public final class WindowInsetsAnimationControllerCompat {
    method public void finish(boolean);
    method public float getCurrentAlpha();
    method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
    method public androidx.core.graphics.Insets getCurrentInsets();
    method public androidx.core.graphics.Insets getHiddenStateInsets();
    method public androidx.core.graphics.Insets getShownStateInsets();
    method public int getTypes();
    method public boolean isCancelled();
    method public boolean isFinished();
    method public boolean isReady();
    method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
  }

  public class WindowInsetsCompat {
    ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
    method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
    method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
    method public androidx.core.graphics.Insets getInsets(int);
    method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
    method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
    method @Deprecated public int getStableInsetBottom();
    method @Deprecated public int getStableInsetLeft();
    method @Deprecated public int getStableInsetRight();
    method @Deprecated public int getStableInsetTop();
    method @Deprecated public androidx.core.graphics.Insets getStableInsets();
    method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
    method @Deprecated public int getSystemWindowInsetBottom();
    method @Deprecated public int getSystemWindowInsetLeft();
    method @Deprecated public int getSystemWindowInsetRight();
    method @Deprecated public int getSystemWindowInsetTop();
    method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
    method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
    method public boolean hasInsets();
    method @Deprecated public boolean hasStableInsets();
    method @Deprecated public boolean hasSystemWindowInsets();
    method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
    method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
    method public boolean isConsumed();
    method public boolean isRound();
    method public boolean isVisible(int);
    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
    method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
    method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
    method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
    field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
  }

  public static final class WindowInsetsCompat.Builder {
    ctor public WindowInsetsCompat.Builder();
    ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
    method public androidx.core.view.WindowInsetsCompat build();
    method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
    method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
    method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
    method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
    method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
  }

  public static final class WindowInsetsCompat.Type {
    method public static int captionBar();
    method public static int displayCutout();
    method public static int ime();
    method public static int mandatorySystemGestures();
    method public static int navigationBars();
    method public static int statusBars();
    method public static int systemBars();
    method public static int systemGestures();
    method public static int tappableElement();
  }

  public final class WindowInsetsControllerCompat {
    ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
    method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
    method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
    method public int getSystemBarsBehavior();
    method public void hide(int);
    method public boolean isAppearanceLightNavigationBars();
    method public boolean isAppearanceLightStatusBars();
    method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
    method public void setAppearanceLightNavigationBars(boolean);
    method public void setAppearanceLightStatusBars(boolean);
    method public void setSystemBarsBehavior(int);
    method public void show(int);
    method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
    field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
    field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
    field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
  }

  public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
    method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
  }

}

package androidx.core.view.accessibility {

  public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
    method public void onClick(android.view.View);
  }

  public final class AccessibilityEventCompat {
    method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
    method public static int getAction(android.view.accessibility.AccessibilityEvent);
    method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent);
    method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent);
    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
    method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
    method public static void setAction(android.view.accessibility.AccessibilityEvent, int);
    method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent, int);
    method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent, int);
    field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
    field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
    field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
    field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
    field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
    field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
    field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
    field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
    field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
    field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
    field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
    field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
    field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
    field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
    field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
    field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
    field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
    field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
    field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
    field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
    field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
    field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
    field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
    field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
    field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
  }

  public final class AccessibilityManagerCompat {
    method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
    method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
    method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
    method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
    method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
    method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener);
  }

  @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
    method @Deprecated public void onAccessibilityStateChanged(boolean);
  }

  @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
    ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
  }

  public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
    method public void onTouchExplorationStateChanged(boolean);
  }

  public class AccessibilityNodeInfoCompat {
    ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
    method public void addAction(int);
    method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
    method public void addChild(android.view.View!);
    method public void addChild(android.view.View!, int);
    method public boolean canOpenPopup();
    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
    method public int getActions();
    method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
    method public void getBoundsInScreen(android.graphics.Rect!);
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
    method public int getChildCount();
    method public CharSequence! getClassName();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
    method public CharSequence! getContentDescription();
    method public int getDrawingOrder();
    method public CharSequence! getError();
    method public android.os.Bundle! getExtras();
    method public CharSequence? getHintText();
    method @Deprecated public Object! getInfo();
    method public int getInputType();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
    method public int getLiveRegion();
    method public int getMaxTextLength();
    method public int getMovementGranularities();
    method public CharSequence! getPackageName();
    method public CharSequence? getPaneTitle();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
    method public CharSequence? getRoleDescription();
    method public CharSequence? getStateDescription();
    method public CharSequence! getText();
    method public int getTextSelectionEnd();
    method public int getTextSelectionStart();
    method public CharSequence? getTooltipText();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
    method public String! getViewIdResourceName();
    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
    method public int getWindowId();
    method public boolean isAccessibilityFocused();
    method public boolean isCheckable();
    method public boolean isChecked();
    method public boolean isClickable();
    method public boolean isContentInvalid();
    method public boolean isContextClickable();
    method public boolean isDismissable();
    method public boolean isEditable();
    method public boolean isEnabled();
    method public boolean isFocusable();
    method public boolean isFocused();
    method public boolean isHeading();
    method public boolean isImportantForAccessibility();
    method public boolean isLongClickable();
    method public boolean isMultiLine();
    method public boolean isPassword();
    method public boolean isScreenReaderFocusable();
    method public boolean isScrollable();
    method public boolean isSelected();
    method public boolean isShowingHintText();
    method public boolean isTextEntryKey();
    method public boolean isVisibleToUser();
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
    method public boolean performAction(int);
    method public boolean performAction(int, android.os.Bundle!);
    method public void recycle();
    method public boolean refresh();
    method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
    method public boolean removeChild(android.view.View!);
    method public boolean removeChild(android.view.View!, int);
    method public void setAccessibilityFocused(boolean);
    method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
    method public void setBoundsInScreen(android.graphics.Rect!);
    method public void setCanOpenPopup(boolean);
    method public void setCheckable(boolean);
    method public void setChecked(boolean);
    method public void setClassName(CharSequence!);
    method public void setClickable(boolean);
    method public void setCollectionInfo(Object!);
    method public void setCollectionItemInfo(Object!);
    method public void setContentDescription(CharSequence!);
    method public void setContentInvalid(boolean);
    method public void setContextClickable(boolean);
    method public void setDismissable(boolean);
    method public void setDrawingOrder(int);
    method public void setEditable(boolean);
    method public void setEnabled(boolean);
    method public void setError(CharSequence!);
    method public void setFocusable(boolean);
    method public void setFocused(boolean);
    method public void setHeading(boolean);
    method public void setHintText(CharSequence?);
    method public void setImportantForAccessibility(boolean);
    method public void setInputType(int);
    method public void setLabelFor(android.view.View!);
    method public void setLabelFor(android.view.View!, int);
    method public void setLabeledBy(android.view.View!);
    method public void setLabeledBy(android.view.View!, int);
    method public void setLiveRegion(int);
    method public void setLongClickable(boolean);
    method public void setMaxTextLength(int);
    method public void setMovementGranularities(int);
    method public void setMultiLine(boolean);
    method public void setPackageName(CharSequence!);
    method public void setPaneTitle(CharSequence?);
    method public void setParent(android.view.View!);
    method public void setParent(android.view.View!, int);
    method public void setPassword(boolean);
    method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
    method public void setRoleDescription(CharSequence?);
    method public void setScreenReaderFocusable(boolean);
    method public void setScrollable(boolean);
    method public void setSelected(boolean);
    method public void setShowingHintText(boolean);
    method public void setSource(android.view.View!);
    method public void setSource(android.view.View!, int);
    method public void setStateDescription(CharSequence?);
    method public void setText(CharSequence!);
    method public void setTextEntryKey(boolean);
    method public void setTextSelection(int, int);
    method public void setTooltipText(CharSequence?);
    method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
    method public void setTraversalAfter(android.view.View!);
    method public void setTraversalAfter(android.view.View!, int);
    method public void setTraversalBefore(android.view.View!);
    method public void setTraversalBefore(android.view.View!, int);
    method public void setViewIdResourceName(String!);
    method public void setVisibleToUser(boolean);
    method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
    field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
    field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
    field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
    field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
    field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
    field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
    field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
    field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
    field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
    field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
    field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
    field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
    field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
    field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
    field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
    field public static final int ACTION_CLICK = 16; // 0x10
    field public static final int ACTION_COLLAPSE = 524288; // 0x80000
    field public static final int ACTION_COPY = 16384; // 0x4000
    field public static final int ACTION_CUT = 65536; // 0x10000
    field public static final int ACTION_DISMISS = 1048576; // 0x100000
    field public static final int ACTION_EXPAND = 262144; // 0x40000
    field public static final int ACTION_FOCUS = 1; // 0x1
    field public static final int ACTION_LONG_CLICK = 32; // 0x20
    field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
    field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
    field public static final int ACTION_PASTE = 32768; // 0x8000
    field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
    field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
    field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
    field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
    field public static final int ACTION_SELECT = 4; // 0x4
    field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
    field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
    field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
    field public static final int FOCUS_INPUT = 1; // 0x1
    field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
    field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
    field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
    field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
    field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
  }

  public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
    ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
    method public int getId();
    method public CharSequence! getLabel();
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
    field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
  }

  public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
    method public int getColumnCount();
    method public int getRowCount();
    method public int getSelectionMode();
    method public boolean isHierarchical();
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
    field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
    field public static final int SELECTION_MODE_NONE = 0; // 0x0
    field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
  }

  public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
    method public int getColumnIndex();
    method public int getColumnSpan();
    method public int getRowIndex();
    method public int getRowSpan();
    method @Deprecated public boolean isHeading();
    method public boolean isSelected();
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
  }

  public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
    method public float getCurrent();
    method public float getMax();
    method public float getMin();
    method public int getType();
    method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
    field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
    field public static final int RANGE_TYPE_INT = 0; // 0x0
    field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
  }

  public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
    ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
    method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
    method @IntRange(from=0) public int getRegionCount();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
  }

  public class AccessibilityNodeProviderCompat {
    ctor public AccessibilityNodeProviderCompat();
    ctor public AccessibilityNodeProviderCompat(Object?);
    method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
    method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String, int);
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
    method public Object? getProvider();
    method public boolean performAction(int, int, android.os.Bundle?);
    field public static final int HOST_VIEW_ID = -1; // 0xffffffff
  }

  public class AccessibilityRecordCompat {
    ctor @Deprecated public AccessibilityRecordCompat(Object!);
    method @Deprecated public boolean equals(Object?);
    method @Deprecated public int getAddedCount();
    method @Deprecated public CharSequence! getBeforeText();
    method @Deprecated public CharSequence! getClassName();
    method @Deprecated public CharSequence! getContentDescription();
    method @Deprecated public int getCurrentItemIndex();
    method @Deprecated public int getFromIndex();
    method @Deprecated public Object! getImpl();
    method @Deprecated public int getItemCount();
    method @Deprecated public int getMaxScrollX();
    method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord);
    method @Deprecated public int getMaxScrollY();
    method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord);
    method @Deprecated public android.os.Parcelable! getParcelableData();
    method @Deprecated public int getRemovedCount();
    method @Deprecated public int getScrollX();
    method @Deprecated public int getScrollY();
    method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
    method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
    method @Deprecated public int getToIndex();
    method @Deprecated public int getWindowId();
    method @Deprecated public int hashCode();
    method @Deprecated public boolean isChecked();
    method @Deprecated public boolean isEnabled();
    method @Deprecated public boolean isFullScreen();
    method @Deprecated public boolean isPassword();
    method @Deprecated public boolean isScrollable();
    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
    method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
    method @Deprecated public void recycle();
    method @Deprecated public void setAddedCount(int);
    method @Deprecated public void setBeforeText(CharSequence!);
    method @Deprecated public void setChecked(boolean);
    method @Deprecated public void setClassName(CharSequence!);
    method @Deprecated public void setContentDescription(CharSequence!);
    method @Deprecated public void setCurrentItemIndex(int);
    method @Deprecated public void setEnabled(boolean);
    method @Deprecated public void setFromIndex(int);
    method @Deprecated public void setFullScreen(boolean);
    method @Deprecated public void setItemCount(int);
    method @Deprecated public void setMaxScrollX(int);
    method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord, int);
    method @Deprecated public void setMaxScrollY(int);
    method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord, int);
    method @Deprecated public void setParcelableData(android.os.Parcelable!);
    method @Deprecated public void setPassword(boolean);
    method @Deprecated public void setRemovedCount(int);
    method @Deprecated public void setScrollX(int);
    method @Deprecated public void setScrollY(int);
    method @Deprecated public void setScrollable(boolean);
    method @Deprecated public void setSource(android.view.View!);
    method @Deprecated public void setSource(android.view.View!, int);
    method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View?, int);
    method @Deprecated public void setToIndex(int);
  }

  public interface AccessibilityViewCommand {
    method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
  }

  public abstract static class AccessibilityViewCommand.CommandArguments {
    ctor public AccessibilityViewCommand.CommandArguments();
  }

  public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
    ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
    method public boolean getExtendSelection();
    method public int getGranularity();
  }

  public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
    ctor public AccessibilityViewCommand.MoveHtmlArguments();
    method public String? getHTMLElement();
  }

  public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
    ctor public AccessibilityViewCommand.MoveWindowArguments();
    method public int getX();
    method public int getY();
  }

  public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
    ctor public AccessibilityViewCommand.ScrollToPositionArguments();
    method public int getColumn();
    method public int getRow();
  }

  public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
    ctor public AccessibilityViewCommand.SetProgressArguments();
    method public float getProgress();
  }

  public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
    ctor public AccessibilityViewCommand.SetSelectionArguments();
    method public int getEnd();
    method public int getStart();
  }

  public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
    ctor public AccessibilityViewCommand.SetTextArguments();
    method public CharSequence? getText();
  }

  public class AccessibilityWindowInfoCompat {
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getAnchor();
    method public void getBoundsInScreen(android.graphics.Rect);
    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat? getChild(int);
    method public int getChildCount();
    method public int getId();
    method public int getLayer();
    method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat? getParent();
    method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getRoot();
    method public CharSequence? getTitle();
    method public int getType();
    method public boolean isAccessibilityFocused();
    method public boolean isActive();
    method public boolean isFocused();
    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat? obtain();
    method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat? obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat?);
    method public void recycle();
    field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
    field public static final int TYPE_APPLICATION = 1; // 0x1
    field public static final int TYPE_INPUT_METHOD = 2; // 0x2
    field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
    field public static final int TYPE_SYSTEM = 3; // 0x3
  }

}

package androidx.core.view.animation {

  public final class PathInterpolatorCompat {
    method public static android.view.animation.Interpolator create(android.graphics.Path);
    method public static android.view.animation.Interpolator create(float, float);
    method public static android.view.animation.Interpolator create(float, float, float, float);
  }

}

package androidx.core.view.inputmethod {

  public final class EditorInfoCompat {
    ctor @Deprecated public EditorInfoCompat();
    method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
    method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
    method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
    method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
    method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
    method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
    method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
    field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
    field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
  }

  public final class InputConnectionCompat {
    ctor @Deprecated public InputConnectionCompat();
    method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
    method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
    method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
    field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
  }

  public static interface InputConnectionCompat.OnCommitContentListener {
    method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
  }

  public final class InputContentInfoCompat {
    ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
    method public android.net.Uri getContentUri();
    method public android.content.ClipDescription getDescription();
    method public android.net.Uri? getLinkUri();
    method public void releasePermission();
    method public void requestPermission();
    method public Object? unwrap();
    method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
  }

}

package androidx.core.widget {

  public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
    ctor public AutoScrollHelper(android.view.View);
    method public abstract boolean canTargetScrollHorizontally(int);
    method public abstract boolean canTargetScrollVertically(int);
    method public boolean isEnabled();
    method public boolean isExclusive();
    method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
    method public abstract void scrollTargetBy(int, int);
    method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
    method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
    method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
    method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
    method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
    method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
    method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
    method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
    method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
    method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
    method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
    field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
    field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
    field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
    field public static final float NO_MAX = 3.4028235E38f;
    field public static final float NO_MIN = 0.0f;
    field public static final float RELATIVE_UNSPECIFIED = 0.0f;
  }

  public final class CheckedTextViewCompat {
    method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
    method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
    method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
    method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
    method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
  }

  public final class CompoundButtonCompat {
    method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
    method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
    method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
    method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
    method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
  }

  public class ContentLoadingProgressBar extends android.widget.ProgressBar {
    ctor public ContentLoadingProgressBar(android.content.Context);
    ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
    method public void hide();
    method public void onAttachedToWindow();
    method public void onDetachedFromWindow();
    method public void show();
  }

  public final class EdgeEffectCompat {
    ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
    method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
    method @Deprecated public boolean draw(android.graphics.Canvas!);
    method @Deprecated public void finish();
    method public static float getDistance(android.widget.EdgeEffect);
    method @Deprecated public boolean isFinished();
    method @Deprecated public boolean onAbsorb(int);
    method @Deprecated public boolean onPull(float);
    method @Deprecated public boolean onPull(float, float);
    method public static void onPull(android.widget.EdgeEffect, float, float);
    method public static float onPullDistance(android.widget.EdgeEffect, float, float);
    method @Deprecated public boolean onRelease();
    method @Deprecated public void setSize(int, int);
  }

  public class ImageViewCompat {
    method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
    method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
    method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
    method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
  }

  public final class ListPopupWindowCompat {
    method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
    method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
  }

  public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
    ctor public ListViewAutoScrollHelper(android.widget.ListView);
    method public boolean canTargetScrollHorizontally(int);
    method public boolean canTargetScrollVertically(int);
    method public void scrollTargetBy(int, int);
  }

  public final class ListViewCompat {
    method public static boolean canScrollList(android.widget.ListView, int);
    method public static void scrollListBy(android.widget.ListView, int);
  }

  public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
    ctor public NestedScrollView(android.content.Context);
    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
    ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
    method public boolean arrowScroll(int);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
    method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
    method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
    method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
    method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
    method public boolean executeKeyEvent(android.view.KeyEvent);
    method public void fling(int);
    method public boolean fullScroll(int);
    method public int getMaxScrollAmount();
    method public boolean hasNestedScrollingParent(int);
    method public boolean isFillViewport();
    method public boolean isSmoothScrollingEnabled();
    method public void onAttachedToWindow();
    method public void onNestedPreScroll(android.view.View, int, int, int[], int);
    method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
    method public void onNestedScroll(android.view.View, int, int, int, int, int);
    method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
    method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
    method public void onStopNestedScroll(android.view.View, int);
    method public boolean pageScroll(int);
    method public void setFillViewport(boolean);
    method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
    method public void setSmoothScrollingEnabled(boolean);
    method public final void smoothScrollBy(int, int);
    method public final void smoothScrollBy(int, int, int);
    method public final void smoothScrollTo(int, int);
    method public final void smoothScrollTo(int, int, int);
    method public boolean startNestedScroll(int, int);
    method public void stopNestedScroll(int);
  }

  public static interface NestedScrollView.OnScrollChangeListener {
    method public void onScrollChange(androidx.core.widget.NestedScrollView, int, int, int, int);
  }

  public final class PopupMenuCompat {
    method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
  }

  public final class PopupWindowCompat {
    method public static boolean getOverlapAnchor(android.widget.PopupWindow);
    method public static int getWindowLayoutType(android.widget.PopupWindow);
    method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
    method public static void setWindowLayoutType(android.widget.PopupWindow, int);
    method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
  }

  @Deprecated public final class ScrollerCompat {
    method @Deprecated public void abortAnimation();
    method @Deprecated public boolean computeScrollOffset();
    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
    method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
    method @Deprecated public void fling(int, int, int, int, int, int, int, int);
    method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
    method @Deprecated public float getCurrVelocity();
    method @Deprecated public int getCurrX();
    method @Deprecated public int getCurrY();
    method @Deprecated public int getFinalX();
    method @Deprecated public int getFinalY();
    method @Deprecated public boolean isFinished();
    method @Deprecated public boolean isOverScrolled();
    method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
    method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
    method @Deprecated public boolean springBack(int, int, int, int, int, int);
    method @Deprecated public void startScroll(int, int, int, int);
    method @Deprecated public void startScroll(int, int, int, int, int);
  }

  public final class TextViewCompat {
    method public static int getAutoSizeMaxTextSize(android.widget.TextView);
    method public static int getAutoSizeMinTextSize(android.widget.TextView);
    method public static int getAutoSizeStepGranularity(android.widget.TextView);
    method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
    method public static int getAutoSizeTextType(android.widget.TextView);
    method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
    method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
    method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
    method public static int getFirstBaselineToTopHeight(android.widget.TextView);
    method public static int getLastBaselineToBottomHeight(android.widget.TextView);
    method public static int getMaxLines(android.widget.TextView);
    method public static int getMinLines(android.widget.TextView);
    method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
    method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
    method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
    method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
    method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
    method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
    method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
    method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
    method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
    method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
    method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
    method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
    method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
    method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
    method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
    field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
    field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
  }

  public interface TintableCompoundButton {
    method public android.content.res.ColorStateList? getSupportButtonTintList();
    method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
    method public void setSupportButtonTintList(android.content.res.ColorStateList?);
    method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
  }

  public interface TintableCompoundDrawablesView {
    method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
    method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
    method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
    method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
  }

}

