// Signature format: 4.0
package androidx.activity {

  public final class ActivityViewModelLazyKt {
    method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.viewmodel.CreationExtras>? extrasProducer, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
    method @Deprecated @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
  }

  public final class BackEventCompat {
    ctor @RequiresApi(34) public BackEventCompat(android.window.BackEvent backEvent);
    ctor @VisibleForTesting public BackEventCompat(float touchX, float touchY, @FloatRange(from=0.0, to=1.0) float progress, int swipeEdge);
    method public float getProgress();
    method public int getSwipeEdge();
    method public float getTouchX();
    method public float getTouchY();
    method @RequiresApi(34) public android.window.BackEvent toBackEvent();
    property public final float progress;
    property public final int swipeEdge;
    property public final float touchX;
    property public final float touchY;
    field public static final androidx.activity.BackEventCompat.Companion Companion;
    field public static final int EDGE_LEFT = 0; // 0x0
    field public static final int EDGE_RIGHT = 1; // 0x1
  }

  public static final class BackEventCompat.Companion {
  }

  public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.activity.FullyDrawnReporterOwner androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.core.content.OnConfigurationChangedProvider androidx.core.app.OnMultiWindowModeChangedProvider androidx.core.app.OnNewIntentProvider androidx.core.app.OnPictureInPictureModeChangedProvider androidx.core.content.OnTrimMemoryProvider androidx.core.app.OnUserLeaveHintProvider androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
    ctor public ComponentActivity();
    ctor @ContentView public ComponentActivity(@LayoutRes int contentLayoutId);
    method public void addMenuProvider(androidx.core.view.MenuProvider provider);
    method public void addMenuProvider(androidx.core.view.MenuProvider provider, androidx.lifecycle.LifecycleOwner owner);
    method public void addMenuProvider(androidx.core.view.MenuProvider provider, androidx.lifecycle.LifecycleOwner owner, androidx.lifecycle.Lifecycle.State state);
    method public final void addOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration> listener);
    method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
    method public final void addOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo> listener);
    method public final void addOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent> listener);
    method public final void addOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo> listener);
    method public final void addOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer> listener);
    method public final void addOnUserLeaveHintListener(Runnable listener);
    method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
    method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
    method @Deprecated public Object? getLastCustomNonConfigurationInstance();
    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
    method public final androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
    method public androidx.lifecycle.ViewModelStore getViewModelStore();
    method @CallSuper public void initializeViewTreeOwners();
    method public void invalidateMenu();
    method @Deprecated @CallSuper protected void onActivityResult(int requestCode, int resultCode, android.content.Intent? data);
    method @Deprecated @CallSuper public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);
    method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
    method public final Object? onRetainNonConfigurationInstance();
    method public android.content.Context? peekAvailableContext();
    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, androidx.activity.result.ActivityResultCallback<O> callback);
    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, androidx.activity.result.ActivityResultRegistry registry, androidx.activity.result.ActivityResultCallback<O> callback);
    method public void removeMenuProvider(androidx.core.view.MenuProvider provider);
    method public final void removeOnConfigurationChangedListener(androidx.core.util.Consumer<android.content.res.Configuration> listener);
    method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
    method public final void removeOnMultiWindowModeChangedListener(androidx.core.util.Consumer<androidx.core.app.MultiWindowModeChangedInfo> listener);
    method public final void removeOnNewIntentListener(androidx.core.util.Consumer<android.content.Intent> listener);
    method public final void removeOnPictureInPictureModeChangedListener(androidx.core.util.Consumer<androidx.core.app.PictureInPictureModeChangedInfo> listener);
    method public final void removeOnTrimMemoryListener(androidx.core.util.Consumer<java.lang.Integer> listener);
    method public final void removeOnUserLeaveHintListener(Runnable listener);
    method @Deprecated public void startActivityForResult(android.content.Intent intent, int requestCode);
    method @Deprecated public void startActivityForResult(android.content.Intent intent, int requestCode, android.os.Bundle? options);
    method @Deprecated @kotlin.jvm.Throws(exceptionClasses=SendIntentException::class) public void startIntentSenderForResult(android.content.IntentSender intent, int requestCode, android.content.Intent? fillInIntent, int flagsMask, int flagsValues, int extraFlags) throws android.content.IntentSender.SendIntentException;
    method @Deprecated @kotlin.jvm.Throws(exceptionClasses=SendIntentException::class) public void startIntentSenderForResult(android.content.IntentSender intent, int requestCode, android.content.Intent? fillInIntent, int flagsMask, int flagsValues, int extraFlags, android.os.Bundle? options) throws android.content.IntentSender.SendIntentException;
    property public final androidx.activity.result.ActivityResultRegistry activityResultRegistry;
    property @CallSuper public androidx.lifecycle.viewmodel.CreationExtras defaultViewModelCreationExtras;
    property public androidx.lifecycle.ViewModelProvider.Factory defaultViewModelProviderFactory;
    property public androidx.activity.FullyDrawnReporter fullyDrawnReporter;
    property @Deprecated public Object? lastCustomNonConfigurationInstance;
    property public androidx.lifecycle.Lifecycle lifecycle;
    property public final androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
    property public final androidx.savedstate.SavedStateRegistry savedStateRegistry;
    property public androidx.lifecycle.ViewModelStore viewModelStore;
  }

  public class ComponentDialog extends android.app.Dialog implements androidx.lifecycle.LifecycleOwner androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner {
    ctor public ComponentDialog(android.content.Context context);
    ctor public ComponentDialog(android.content.Context context, optional @StyleRes int themeResId);
    method public androidx.lifecycle.Lifecycle getLifecycle();
    method public final androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
    method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
    method @CallSuper public void initializeViewTreeOwners();
    method @CallSuper public void onBackPressed();
    property public androidx.lifecycle.Lifecycle lifecycle;
    property public final androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
    property public androidx.savedstate.SavedStateRegistry savedStateRegistry;
  }

  public final class EdgeToEdge {
    method public static void enable(androidx.activity.ComponentActivity);
    method public static void enable(androidx.activity.ComponentActivity, optional androidx.activity.SystemBarStyle statusBarStyle);
    method public static void enable(androidx.activity.ComponentActivity, optional androidx.activity.SystemBarStyle statusBarStyle, optional androidx.activity.SystemBarStyle navigationBarStyle);
  }

  public final class FullyDrawnReporter {
    ctor public FullyDrawnReporter(java.util.concurrent.Executor executor, kotlin.jvm.functions.Function0<kotlin.Unit> reportFullyDrawn);
    method public void addOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
    method public void addReporter();
    method public boolean isFullyDrawnReported();
    method public void removeOnReportDrawnListener(kotlin.jvm.functions.Function0<kotlin.Unit> callback);
    method public void removeReporter();
    property public final boolean isFullyDrawnReported;
  }

  public final class FullyDrawnReporterKt {
    method public static suspend inline Object? reportWhenComplete(androidx.activity.FullyDrawnReporter, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super kotlin.Unit>,?> reporter, kotlin.coroutines.Continuation<? super kotlin.Unit>);
  }

  public interface FullyDrawnReporterOwner {
    method public androidx.activity.FullyDrawnReporter getFullyDrawnReporter();
    property public abstract androidx.activity.FullyDrawnReporter fullyDrawnReporter;
  }

  public abstract class OnBackPressedCallback {
    ctor public OnBackPressedCallback(boolean enabled);
    method @MainThread public void handleOnBackCancelled();
    method @MainThread public abstract void handleOnBackPressed();
    method @MainThread public void handleOnBackProgressed(androidx.activity.BackEventCompat backEvent);
    method @MainThread public void handleOnBackStarted(androidx.activity.BackEventCompat backEvent);
    method @MainThread public final boolean isEnabled();
    method @MainThread public final void remove();
    method @MainThread public final void setEnabled(boolean);
    property @MainThread public final boolean isEnabled;
  }

  public final class OnBackPressedDispatcher {
    ctor public OnBackPressedDispatcher();
    ctor public OnBackPressedDispatcher(optional Runnable? fallbackOnBackPressed);
    ctor public OnBackPressedDispatcher(Runnable? fallbackOnBackPressed, androidx.core.util.Consumer<java.lang.Boolean>? onHasEnabledCallbacksChanged);
    method @MainThread public void addCallback(androidx.activity.OnBackPressedCallback onBackPressedCallback);
    method @MainThread public void addCallback(androidx.lifecycle.LifecycleOwner owner, androidx.activity.OnBackPressedCallback onBackPressedCallback);
    method @MainThread @VisibleForTesting public void dispatchOnBackCancelled();
    method @MainThread @VisibleForTesting public void dispatchOnBackProgressed(androidx.activity.BackEventCompat backEvent);
    method @MainThread @VisibleForTesting public void dispatchOnBackStarted(androidx.activity.BackEventCompat backEvent);
    method @MainThread public boolean hasEnabledCallbacks();
    method @MainThread public void onBackPressed();
    method @RequiresApi(android.os.Build.VERSION_CODES.TIRAMISU) public void setOnBackInvokedDispatcher(android.window.OnBackInvokedDispatcher invoker);
  }

  public final class OnBackPressedDispatcherKt {
    method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, optional androidx.lifecycle.LifecycleOwner? owner, optional boolean enabled, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
  }

  public interface OnBackPressedDispatcherOwner extends androidx.lifecycle.LifecycleOwner {
    method public androidx.activity.OnBackPressedDispatcher getOnBackPressedDispatcher();
    property public abstract androidx.activity.OnBackPressedDispatcher onBackPressedDispatcher;
  }

  public final class PipHintTrackerKt {
    method @RequiresApi(android.os.Build.VERSION_CODES.O) public static suspend Object? trackPipAnimationHintView(android.app.Activity, android.view.View view, kotlin.coroutines.Continuation<? super kotlin.Unit>);
  }

  public final class SystemBarStyle {
    method public static androidx.activity.SystemBarStyle auto(@ColorInt int lightScrim, @ColorInt int darkScrim);
    method public static androidx.activity.SystemBarStyle auto(@ColorInt int lightScrim, @ColorInt int darkScrim, optional kotlin.jvm.functions.Function1<? super android.content.res.Resources,java.lang.Boolean> detectDarkMode);
    method public static androidx.activity.SystemBarStyle dark(@ColorInt int scrim);
    method public static androidx.activity.SystemBarStyle light(@ColorInt int scrim, @ColorInt int darkScrim);
    field public static final androidx.activity.SystemBarStyle.Companion Companion;
  }

  public static final class SystemBarStyle.Companion {
    method public androidx.activity.SystemBarStyle auto(@ColorInt int lightScrim, @ColorInt int darkScrim);
    method public androidx.activity.SystemBarStyle auto(@ColorInt int lightScrim, @ColorInt int darkScrim, optional kotlin.jvm.functions.Function1<? super android.content.res.Resources,java.lang.Boolean> detectDarkMode);
    method public androidx.activity.SystemBarStyle dark(@ColorInt int scrim);
    method public androidx.activity.SystemBarStyle light(@ColorInt int scrim, @ColorInt int darkScrim);
  }

  public final class ViewTreeFullyDrawnReporterOwner {
    method public static androidx.activity.FullyDrawnReporterOwner? get(android.view.View);
    method public static void set(android.view.View, androidx.activity.FullyDrawnReporterOwner fullyDrawnReporterOwner);
  }

  public final class ViewTreeOnBackPressedDispatcherOwner {
    method public static androidx.activity.OnBackPressedDispatcherOwner? get(android.view.View);
    method public static void set(android.view.View, androidx.activity.OnBackPressedDispatcherOwner onBackPressedDispatcherOwner);
  }

}

package androidx.activity.contextaware {

  public interface ContextAware {
    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
    method public android.content.Context? peekAvailableContext();
    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
  }

  public final class ContextAwareHelper {
    ctor public ContextAwareHelper();
    method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
    method public void clearAvailableContext();
    method public void dispatchOnContextAvailable(android.content.Context context);
    method public android.content.Context? peekAvailableContext();
    method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener listener);
  }

  public final class ContextAwareKt {
    method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<android.content.Context,R> onContextAvailable, kotlin.coroutines.Continuation<R>);
  }

  public fun interface OnContextAvailableListener {
    method public void onContextAvailable(android.content.Context context);
  }

}

package androidx.activity.result {

  public final class ActivityResult implements android.os.Parcelable {
    ctor public ActivityResult(int resultCode, android.content.Intent? data);
    method public int describeContents();
    method public android.content.Intent? getData();
    method public int getResultCode();
    method public static String resultCodeToString(int resultCode);
    method public void writeToParcel(android.os.Parcel dest, int flags);
    property public final android.content.Intent? data;
    property public final int resultCode;
    field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult> CREATOR;
    field public static final androidx.activity.result.ActivityResult.Companion Companion;
  }

  public static final class ActivityResult.Companion {
    method public String resultCodeToString(int resultCode);
  }

  public fun interface ActivityResultCallback<O> {
    method public void onActivityResult(O result);
  }

  public interface ActivityResultCaller {
    method public <I, O> androidx.activity.result.ActivityResultLauncher<I> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, androidx.activity.result.ActivityResultCallback<O> callback);
    method public <I, O> androidx.activity.result.ActivityResultLauncher<I> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, androidx.activity.result.ActivityResultRegistry registry, androidx.activity.result.ActivityResultCallback<O> callback);
  }

  public final class ActivityResultCallerKt {
    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<O,kotlin.Unit> callback);
    method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I input, kotlin.jvm.functions.Function1<O,kotlin.Unit> callback);
  }

  public final class ActivityResultKt {
    method public static operator int component1(androidx.activity.result.ActivityResult);
    method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
  }

  public abstract class ActivityResultLauncher<I> {
    ctor public ActivityResultLauncher();
    method public abstract androidx.activity.result.contract.ActivityResultContract<I,?> getContract();
    method public void launch(I input);
    method public abstract void launch(I input, androidx.core.app.ActivityOptionsCompat? options);
    method @MainThread public abstract void unregister();
    property public abstract androidx.activity.result.contract.ActivityResultContract<I,?> contract;
  }

  public final class ActivityResultLauncherKt {
    method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void?>, optional androidx.core.app.ActivityOptionsCompat? options);
    method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
  }

  public abstract class ActivityResultRegistry {
    ctor public ActivityResultRegistry();
    method @MainThread public final boolean dispatchResult(int requestCode, int resultCode, android.content.Intent? data);
    method @MainThread public final <O> boolean dispatchResult(int requestCode, O result);
    method @MainThread public abstract <I, O> void onLaunch(int requestCode, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I input, androidx.core.app.ActivityOptionsCompat? options);
    method public final void onRestoreInstanceState(android.os.Bundle? savedInstanceState);
    method public final void onSaveInstanceState(android.os.Bundle outState);
    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I> register(String key, androidx.activity.result.contract.ActivityResultContract<I,O> contract, androidx.activity.result.ActivityResultCallback<O> callback);
    method public final <I, O> androidx.activity.result.ActivityResultLauncher<I> register(String key, androidx.lifecycle.LifecycleOwner lifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I,O> contract, androidx.activity.result.ActivityResultCallback<O> callback);
  }

  public interface ActivityResultRegistryOwner {
    method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
    property public abstract androidx.activity.result.ActivityResultRegistry activityResultRegistry;
  }

  public final class IntentSenderRequest implements android.os.Parcelable {
    method public int describeContents();
    method public android.content.Intent? getFillInIntent();
    method public int getFlagsMask();
    method public int getFlagsValues();
    method public android.content.IntentSender getIntentSender();
    method public void writeToParcel(android.os.Parcel dest, int flags);
    property public final android.content.Intent? fillInIntent;
    property public final int flagsMask;
    property public final int flagsValues;
    property public final android.content.IntentSender intentSender;
    field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest> CREATOR;
    field public static final androidx.activity.result.IntentSenderRequest.Companion Companion;
  }

  public static final class IntentSenderRequest.Builder {
    ctor public IntentSenderRequest.Builder(android.app.PendingIntent pendingIntent);
    ctor public IntentSenderRequest.Builder(android.content.IntentSender intentSender);
    method public androidx.activity.result.IntentSenderRequest build();
    method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent? fillInIntent);
    method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int values, int mask);
  }

  public static final class IntentSenderRequest.Companion {
  }

  public final class PickVisualMediaRequest {
    method public androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType getMediaType();
    property public final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType;
  }

  public static final class PickVisualMediaRequest.Builder {
    ctor public PickVisualMediaRequest.Builder();
    method public androidx.activity.result.PickVisualMediaRequest build();
    method public androidx.activity.result.PickVisualMediaRequest.Builder setMediaType(androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
  }

  public final class PickVisualMediaRequestKt {
    method public static androidx.activity.result.PickVisualMediaRequest PickVisualMediaRequest(optional androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType mediaType);
  }

}

package androidx.activity.result.contract {

  public abstract class ActivityResultContract<I, O> {
    ctor public ActivityResultContract();
    method public abstract android.content.Intent createIntent(android.content.Context context, I input);
    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I input);
    method public abstract O parseResult(int resultCode, android.content.Intent? intent);
  }

  public static final class ActivityResultContract.SynchronousResult<T> {
    ctor public ActivityResultContract.SynchronousResult(T value);
    method public T getValue();
    property public final T value;
  }

  public final class ActivityResultContracts {
  }

  public static class ActivityResultContracts.CaptureVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
    ctor public ActivityResultContracts.CaptureVideo();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
  }

  public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
    ctor @Deprecated public ActivityResultContracts.CreateDocument();
    ctor public ActivityResultContracts.CreateDocument(String mimeType);
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri?>? getSynchronousResult(android.content.Context context, String input);
    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
  }

  public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
    ctor public ActivityResultContracts.GetContent();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri?>? getSynchronousResult(android.content.Context context, String input);
    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
  }

  public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
    ctor public ActivityResultContracts.GetMultipleContents();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
  }

  public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
    ctor public ActivityResultContracts.OpenDocument();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String[] input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri?>? getSynchronousResult(android.content.Context context, String[] input);
    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
  }

  @RequiresApi(21) public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
    ctor public ActivityResultContracts.OpenDocumentTree();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri? input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri?>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
  }

  public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
    ctor public ActivityResultContracts.OpenMultipleDocuments();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, String[] input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String[] input);
    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
  }

  public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
    ctor public ActivityResultContracts.PickContact();
    method public android.content.Intent createIntent(android.content.Context context, Void? input);
    method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
  }

  public static class ActivityResultContracts.PickMultipleVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,java.util.List<android.net.Uri>> {
    ctor public ActivityResultContracts.PickMultipleVisualMedia(optional int maxItems);
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
    method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
  }

  public static class ActivityResultContracts.PickVisualMedia extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.PickVisualMediaRequest,android.net.Uri> {
    ctor public ActivityResultContracts.PickVisualMedia();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri?>? getSynchronousResult(android.content.Context context, androidx.activity.result.PickVisualMediaRequest input);
    method @Deprecated public static final boolean isPhotoPickerAvailable();
    method public static final boolean isPhotoPickerAvailable(android.content.Context context);
    method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
    field public static final String ACTION_SYSTEM_FALLBACK_PICK_IMAGES = "androidx.activity.result.contract.action.PICK_IMAGES";
    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.Companion Companion;
    field public static final String EXTRA_SYSTEM_FALLBACK_PICK_IMAGES_MAX = "androidx.activity.result.contract.extra.PICK_IMAGES_MAX";
  }

  public static final class ActivityResultContracts.PickVisualMedia.Companion {
    method @Deprecated public boolean isPhotoPickerAvailable();
    method public boolean isPhotoPickerAvailable(android.content.Context context);
  }

  public static final class ActivityResultContracts.PickVisualMedia.ImageAndVideo implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageAndVideo INSTANCE;
  }

  public static final class ActivityResultContracts.PickVisualMedia.ImageOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly INSTANCE;
  }

  public static final class ActivityResultContracts.PickVisualMedia.SingleMimeType implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
    ctor public ActivityResultContracts.PickVisualMedia.SingleMimeType(String mimeType);
    method public String getMimeType();
    property public final String mimeType;
  }

  public static final class ActivityResultContracts.PickVisualMedia.VideoOnly implements androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType {
    field public static final androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VideoOnly INSTANCE;
  }

  public static sealed interface ActivityResultContracts.PickVisualMedia.VisualMediaType {
  }

  public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
    ctor public ActivityResultContracts.RequestMultiplePermissions();
    method public android.content.Intent createIntent(android.content.Context context, String[] input);
    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String[] input);
    method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
    field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
    field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
    field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
    field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
  }

  public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
  }

  public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
    ctor public ActivityResultContracts.RequestPermission();
    method public android.content.Intent createIntent(android.content.Context context, String input);
    method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
    method public Boolean parseResult(int resultCode, android.content.Intent? intent);
  }

  public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
    ctor public ActivityResultContracts.StartActivityForResult();
    method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
    field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
    field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
  }

  public static final class ActivityResultContracts.StartActivityForResult.Companion {
  }

  public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
    ctor public ActivityResultContracts.StartIntentSenderForResult();
    method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
    method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
    field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
    field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
    field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
    field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
  }

  public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
  }

  public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
    ctor public ActivityResultContracts.TakePicture();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
    method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
  }

  public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
    ctor public ActivityResultContracts.TakePicturePreview();
    method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
    method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap?>? getSynchronousResult(android.content.Context context, Void? input);
    method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
  }

  @Deprecated public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
    ctor @Deprecated public ActivityResultContracts.TakeVideo();
    method @Deprecated @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
    method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap?>? getSynchronousResult(android.content.Context context, android.net.Uri input);
    method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
  }

}

