// Signature format: 4.0
package androidx.window {

  public final class WindowProperties {
    field public static final androidx.window.WindowProperties INSTANCE;
    field public static final String PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE = "android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE";
  }

}

package androidx.window.embedding {

  public final class ActivityEmbeddingController {
    method public static androidx.window.embedding.ActivityEmbeddingController getInstance(android.content.Context context);
    method public boolean isActivityEmbedded(android.app.Activity activity);
    field public static final androidx.window.embedding.ActivityEmbeddingController.Companion Companion;
  }

  public static final class ActivityEmbeddingController.Companion {
    method public androidx.window.embedding.ActivityEmbeddingController getInstance(android.content.Context context);
  }

  public final class ActivityFilter {
    ctor public ActivityFilter(android.content.ComponentName componentName, String? intentAction);
    method public android.content.ComponentName getComponentName();
    method public String? getIntentAction();
    method public boolean matchesActivity(android.app.Activity activity);
    method public boolean matchesIntent(android.content.Intent intent);
    property public final android.content.ComponentName componentName;
    property public final String? intentAction;
  }

  public final class ActivityRule extends androidx.window.embedding.EmbeddingRule {
    method public boolean getAlwaysExpand();
    method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
    property public final boolean alwaysExpand;
    property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
  }

  public static final class ActivityRule.Builder {
    ctor public ActivityRule.Builder(java.util.Set<androidx.window.embedding.ActivityFilter> filters);
    method public androidx.window.embedding.ActivityRule build();
    method public androidx.window.embedding.ActivityRule.Builder setAlwaysExpand(boolean alwaysExpand);
  }

  public final class ActivityStack {
    method public operator boolean contains(android.app.Activity activity);
    method public boolean isEmpty();
    property public final boolean isEmpty;
  }

  public final class EmbeddingAspectRatio {
    method public static androidx.window.embedding.EmbeddingAspectRatio ratio(@FloatRange(from=1.0, fromInclusive=false) float ratio);
    field public static final androidx.window.embedding.EmbeddingAspectRatio ALWAYS_ALLOW;
    field public static final androidx.window.embedding.EmbeddingAspectRatio ALWAYS_DISALLOW;
    field public static final androidx.window.embedding.EmbeddingAspectRatio.Companion Companion;
  }

  public static final class EmbeddingAspectRatio.Companion {
    method public androidx.window.embedding.EmbeddingAspectRatio ratio(@FloatRange(from=1.0, fromInclusive=false) float ratio);
  }

  public abstract class EmbeddingRule {
  }

  public final class RuleController {
    method public void addRule(androidx.window.embedding.EmbeddingRule rule);
    method public void clearRules();
    method public static androidx.window.embedding.RuleController getInstance(android.content.Context context);
    method public java.util.Set<androidx.window.embedding.EmbeddingRule> getRules();
    method public static java.util.Set<androidx.window.embedding.EmbeddingRule> parseRules(android.content.Context context, @XmlRes int staticRuleResourceId);
    method public void removeRule(androidx.window.embedding.EmbeddingRule rule);
    method public void setRules(java.util.Set<? extends androidx.window.embedding.EmbeddingRule> rules);
    field public static final androidx.window.embedding.RuleController.Companion Companion;
  }

  public static final class RuleController.Companion {
    method public androidx.window.embedding.RuleController getInstance(android.content.Context context);
    method public java.util.Set<androidx.window.embedding.EmbeddingRule> parseRules(android.content.Context context, @XmlRes int staticRuleResourceId);
  }

  public final class SplitController {
    method public void addSplitListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
    method public static androidx.window.embedding.SplitController getInstance(android.content.Context context);
    method public boolean isSplitSupported();
    method public void removeSplitListener(androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
    field public static final androidx.window.embedding.SplitController.Companion Companion;
  }

  public static final class SplitController.Companion {
    method public androidx.window.embedding.SplitController getInstance(android.content.Context context);
  }

  public final class SplitInfo {
    method public operator boolean contains(android.app.Activity activity);
    method public androidx.window.embedding.ActivityStack getPrimaryActivityStack();
    method public androidx.window.embedding.ActivityStack getSecondaryActivityStack();
    method public float getSplitRatio();
    property public final androidx.window.embedding.ActivityStack primaryActivityStack;
    property public final androidx.window.embedding.ActivityStack secondaryActivityStack;
    property public final float splitRatio;
  }

  public final class SplitPairFilter {
    ctor public SplitPairFilter(android.content.ComponentName primaryActivityName, android.content.ComponentName secondaryActivityName, String? secondaryActivityIntentAction);
    method public android.content.ComponentName getPrimaryActivityName();
    method public String? getSecondaryActivityIntentAction();
    method public android.content.ComponentName getSecondaryActivityName();
    method public boolean matchesActivityIntentPair(android.app.Activity primaryActivity, android.content.Intent secondaryActivityIntent);
    method public boolean matchesActivityPair(android.app.Activity primaryActivity, android.app.Activity secondaryActivity);
    property public final android.content.ComponentName primaryActivityName;
    property public final String? secondaryActivityIntentAction;
    property public final android.content.ComponentName secondaryActivityName;
  }

  public final class SplitPairRule extends androidx.window.embedding.SplitRule {
    method public boolean getClearTop();
    method public java.util.Set<androidx.window.embedding.SplitPairFilter> getFilters();
    method public int getFinishPrimaryWithSecondary();
    method public int getFinishSecondaryWithPrimary();
    property public final boolean clearTop;
    property public final java.util.Set<androidx.window.embedding.SplitPairFilter> filters;
    property public final int finishPrimaryWithSecondary;
    property public final int finishSecondaryWithPrimary;
  }

  public static final class SplitPairRule.Builder {
    ctor public SplitPairRule.Builder(java.util.Set<androidx.window.embedding.SplitPairFilter> filters);
    method public androidx.window.embedding.SplitPairRule build();
    method public androidx.window.embedding.SplitPairRule.Builder setClearTop(boolean clearTop);
    method public androidx.window.embedding.SplitPairRule.Builder setFinishPrimaryWithSecondary(int finishPrimaryWithSecondary);
    method public androidx.window.embedding.SplitPairRule.Builder setFinishSecondaryWithPrimary(int finishSecondaryWithPrimary);
    method public androidx.window.embedding.SplitPairRule.Builder setLayoutDirection(int layoutDirection);
    method public androidx.window.embedding.SplitPairRule.Builder setMaxAspectRatioInLandscape(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
    method public androidx.window.embedding.SplitPairRule.Builder setMaxAspectRatioInPortrait(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
    method public androidx.window.embedding.SplitPairRule.Builder setMinSmallestWidthDp(@IntRange(from=0L) int minSmallestWidthDp);
    method public androidx.window.embedding.SplitPairRule.Builder setMinWidthDp(@IntRange(from=0L) int minWidthDp);
    method public androidx.window.embedding.SplitPairRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float splitRatio);
  }

  public final class SplitPlaceholderRule extends androidx.window.embedding.SplitRule {
    method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
    method public int getFinishPrimaryWithPlaceholder();
    method public android.content.Intent getPlaceholderIntent();
    method public boolean isSticky();
    property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
    property public final int finishPrimaryWithPlaceholder;
    property public final boolean isSticky;
    property public final android.content.Intent placeholderIntent;
  }

  public static final class SplitPlaceholderRule.Builder {
    ctor public SplitPlaceholderRule.Builder(java.util.Set<androidx.window.embedding.ActivityFilter> filters, android.content.Intent placeholderIntent);
    method public androidx.window.embedding.SplitPlaceholderRule build();
    method public androidx.window.embedding.SplitPlaceholderRule.Builder setFinishPrimaryWithPlaceholder(int finishPrimaryWithPlaceholder);
    method public androidx.window.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int layoutDirection);
    method public androidx.window.embedding.SplitPlaceholderRule.Builder setMaxAspectRatioInLandscape(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
    method public androidx.window.embedding.SplitPlaceholderRule.Builder setMaxAspectRatioInPortrait(androidx.window.embedding.EmbeddingAspectRatio aspectRatio);
    method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinSmallestWidthDp(@IntRange(from=0L) int minSmallestWidthDp);
    method public androidx.window.embedding.SplitPlaceholderRule.Builder setMinWidthDp(@IntRange(from=0L) int minWidthDp);
    method public androidx.window.embedding.SplitPlaceholderRule.Builder setSplitRatio(@FloatRange(from=0.0, to=1.0) float splitRatio);
    method public androidx.window.embedding.SplitPlaceholderRule.Builder setSticky(boolean isSticky);
  }

  public class SplitRule extends androidx.window.embedding.EmbeddingRule {
    method public final int getLayoutDirection();
    method public final androidx.window.embedding.EmbeddingAspectRatio getMaxAspectRatioInLandscape();
    method public final androidx.window.embedding.EmbeddingAspectRatio getMaxAspectRatioInPortrait();
    method public final int getMinSmallestWidthDp();
    method public final int getMinWidthDp();
    method public final float getSplitRatio();
    property public final int layoutDirection;
    property public final androidx.window.embedding.EmbeddingAspectRatio maxAspectRatioInLandscape;
    property public final androidx.window.embedding.EmbeddingAspectRatio maxAspectRatioInPortrait;
    property public final int minSmallestWidthDp;
    property public final int minWidthDp;
    property public final float splitRatio;
    field public static final androidx.window.embedding.SplitRule.Companion Companion;
    field public static final int FINISH_ADJACENT = 2; // 0x2
    field public static final int FINISH_ALWAYS = 1; // 0x1
    field public static final int FINISH_NEVER = 0; // 0x0
    field public static final androidx.window.embedding.EmbeddingAspectRatio SPLIT_MAX_ASPECT_RATIO_LANDSCAPE_DEFAULT;
    field public static final androidx.window.embedding.EmbeddingAspectRatio SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT;
    field public static final int SPLIT_MIN_DIMENSION_ALWAYS_ALLOW = 0; // 0x0
    field public static final int SPLIT_MIN_DIMENSION_DP_DEFAULT = 600; // 0x258
  }

  public static final class SplitRule.Companion {
  }

}

package androidx.window.layout {

  public interface DisplayFeature {
    method public android.graphics.Rect getBounds();
    property public abstract android.graphics.Rect bounds;
  }

  public interface FoldingFeature extends androidx.window.layout.DisplayFeature {
    method public androidx.window.layout.FoldingFeature.OcclusionType getOcclusionType();
    method public androidx.window.layout.FoldingFeature.Orientation getOrientation();
    method public androidx.window.layout.FoldingFeature.State getState();
    method public boolean isSeparating();
    property public abstract boolean isSeparating;
    property public abstract androidx.window.layout.FoldingFeature.OcclusionType occlusionType;
    property public abstract androidx.window.layout.FoldingFeature.Orientation orientation;
    property public abstract androidx.window.layout.FoldingFeature.State state;
  }

  public static final class FoldingFeature.OcclusionType {
    field public static final androidx.window.layout.FoldingFeature.OcclusionType.Companion Companion;
    field public static final androidx.window.layout.FoldingFeature.OcclusionType FULL;
    field public static final androidx.window.layout.FoldingFeature.OcclusionType NONE;
  }

  public static final class FoldingFeature.OcclusionType.Companion {
  }

  public static final class FoldingFeature.Orientation {
    field public static final androidx.window.layout.FoldingFeature.Orientation.Companion Companion;
    field public static final androidx.window.layout.FoldingFeature.Orientation HORIZONTAL;
    field public static final androidx.window.layout.FoldingFeature.Orientation VERTICAL;
  }

  public static final class FoldingFeature.Orientation.Companion {
  }

  public static final class FoldingFeature.State {
    field public static final androidx.window.layout.FoldingFeature.State.Companion Companion;
    field public static final androidx.window.layout.FoldingFeature.State FLAT;
    field public static final androidx.window.layout.FoldingFeature.State HALF_OPENED;
  }

  public static final class FoldingFeature.State.Companion {
  }

  public interface WindowInfoTracker {
    method public default static androidx.window.layout.WindowInfoTracker getOrCreate(android.content.Context context);
    method public kotlinx.coroutines.flow.Flow<androidx.window.layout.WindowLayoutInfo> windowLayoutInfo(android.app.Activity activity);
    field public static final androidx.window.layout.WindowInfoTracker.Companion Companion;
  }

  public static final class WindowInfoTracker.Companion {
    method public androidx.window.layout.WindowInfoTracker getOrCreate(android.content.Context context);
  }

  public final class WindowLayoutInfo {
    method public java.util.List<androidx.window.layout.DisplayFeature> getDisplayFeatures();
    property public final java.util.List<androidx.window.layout.DisplayFeature> displayFeatures;
  }

  public final class WindowMetrics {
    method public android.graphics.Rect getBounds();
    property public final android.graphics.Rect bounds;
  }

  public interface WindowMetricsCalculator {
    method public androidx.window.layout.WindowMetrics computeCurrentWindowMetrics(android.app.Activity activity);
    method public androidx.window.layout.WindowMetrics computeMaximumWindowMetrics(android.app.Activity activity);
    method public default static androidx.window.layout.WindowMetricsCalculator getOrCreate();
    field public static final androidx.window.layout.WindowMetricsCalculator.Companion Companion;
  }

  public static final class WindowMetricsCalculator.Companion {
    method public androidx.window.layout.WindowMetricsCalculator getOrCreate();
  }

}

