Merge "Move Pager to use PagedSource API" into androidx-master-dev
diff --git a/annotations/OWNERS b/annotation/annotation/OWNERS
similarity index 100%
rename from annotations/OWNERS
rename to annotation/annotation/OWNERS
diff --git a/annotations/README.md b/annotation/annotation/README.md
similarity index 100%
rename from annotations/README.md
rename to annotation/annotation/README.md
diff --git a/annotations/api/1.0.0.txt b/annotation/annotation/api/1.0.0.txt
similarity index 100%
rename from annotations/api/1.0.0.txt
rename to annotation/annotation/api/1.0.0.txt
diff --git a/annotations/api/1.1.0-alpha01.txt b/annotation/annotation/api/1.1.0-alpha01.txt
similarity index 100%
rename from annotations/api/1.1.0-alpha01.txt
rename to annotation/annotation/api/1.1.0-alpha01.txt
diff --git a/annotations/api/1.1.0-alpha02.txt b/annotation/annotation/api/1.1.0-alpha02.txt
similarity index 100%
rename from annotations/api/1.1.0-alpha02.txt
rename to annotation/annotation/api/1.1.0-alpha02.txt
diff --git a/annotations/api/1.1.0-alpha03.txt b/annotation/annotation/api/1.1.0-alpha03.txt
similarity index 100%
rename from annotations/api/1.1.0-alpha03.txt
rename to annotation/annotation/api/1.1.0-alpha03.txt
diff --git a/annotations/api/1.1.0-beta01.txt b/annotation/annotation/api/1.1.0-beta01.txt
similarity index 100%
rename from annotations/api/1.1.0-beta01.txt
rename to annotation/annotation/api/1.1.0-beta01.txt
diff --git a/annotations/api/1.1.0-beta02.txt b/annotation/annotation/api/1.1.0-beta02.txt
similarity index 100%
rename from annotations/api/1.1.0-beta02.txt
rename to annotation/annotation/api/1.1.0-beta02.txt
diff --git a/annotations/api/1.1.0-rc01.txt b/annotation/annotation/api/1.1.0-rc01.txt
similarity index 100%
rename from annotations/api/1.1.0-rc01.txt
rename to annotation/annotation/api/1.1.0-rc01.txt
diff --git a/annotations/api/1.2.0-alpha01.txt b/annotation/annotation/api/1.2.0-alpha01.txt
similarity index 100%
rename from annotations/api/1.2.0-alpha01.txt
rename to annotation/annotation/api/1.2.0-alpha01.txt
diff --git a/annotations/api/current.txt b/annotation/annotation/api/current.txt
similarity index 100%
rename from annotations/api/current.txt
rename to annotation/annotation/api/current.txt
diff --git a/annotations/api/restricted_1.0.0.txt b/annotation/annotation/api/restricted_1.0.0.txt
similarity index 100%
rename from annotations/api/restricted_1.0.0.txt
rename to annotation/annotation/api/restricted_1.0.0.txt
diff --git a/annotations/api/restricted_1.1.0-alpha02.txt b/annotation/annotation/api/restricted_1.1.0-alpha02.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-alpha02.txt
rename to annotation/annotation/api/restricted_1.1.0-alpha02.txt
diff --git a/annotations/api/restricted_1.1.0-alpha03.txt b/annotation/annotation/api/restricted_1.1.0-alpha03.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-alpha03.txt
rename to annotation/annotation/api/restricted_1.1.0-alpha03.txt
diff --git a/annotations/api/restricted_1.1.0-beta01.txt b/annotation/annotation/api/restricted_1.1.0-beta01.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-beta01.txt
rename to annotation/annotation/api/restricted_1.1.0-beta01.txt
diff --git a/annotations/api/restricted_1.1.0-beta02.txt b/annotation/annotation/api/restricted_1.1.0-beta02.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-beta02.txt
rename to annotation/annotation/api/restricted_1.1.0-beta02.txt
diff --git a/annotations/api/restricted_1.1.0-rc01.txt b/annotation/annotation/api/restricted_1.1.0-rc01.txt
similarity index 100%
rename from annotations/api/restricted_1.1.0-rc01.txt
rename to annotation/annotation/api/restricted_1.1.0-rc01.txt
diff --git a/annotations/api/restricted_1.2.0-alpha01.txt b/annotation/annotation/api/restricted_1.2.0-alpha01.txt
similarity index 100%
rename from annotations/api/restricted_1.2.0-alpha01.txt
rename to annotation/annotation/api/restricted_1.2.0-alpha01.txt
diff --git a/annotations/api/restricted_current.txt b/annotation/annotation/api/restricted_current.txt
similarity index 100%
rename from annotations/api/restricted_current.txt
rename to annotation/annotation/api/restricted_current.txt
diff --git a/annotations/build.gradle b/annotation/annotation/build.gradle
similarity index 100%
rename from annotations/build.gradle
rename to annotation/annotation/build.gradle
diff --git a/annotations/external-annotations/androidx/annotation/annotations.xml b/annotation/annotation/external-annotations/androidx/annotation/annotations.xml
similarity index 100%
rename from annotations/external-annotations/androidx/annotation/annotations.xml
rename to annotation/annotation/external-annotations/androidx/annotation/annotations.xml
diff --git a/annotations/src/main/java/androidx/annotation/AnimRes.java b/annotation/annotation/src/main/java/androidx/annotation/AnimRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/AnimRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/AnimRes.java
diff --git a/annotations/src/main/java/androidx/annotation/AnimatorRes.java b/annotation/annotation/src/main/java/androidx/annotation/AnimatorRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/AnimatorRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/AnimatorRes.java
diff --git a/annotations/src/main/java/androidx/annotation/AnyRes.java b/annotation/annotation/src/main/java/androidx/annotation/AnyRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/AnyRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/AnyRes.java
diff --git a/annotations/src/main/java/androidx/annotation/AnyThread.java b/annotation/annotation/src/main/java/androidx/annotation/AnyThread.java
similarity index 96%
rename from annotations/src/main/java/androidx/annotation/AnyThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/AnyThread.java
index e314445..31eb733 100644
--- a/annotations/src/main/java/androidx/annotation/AnyThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/AnyThread.java
@@ -42,6 +42,6 @@
*/
@Documented
@Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
public @interface AnyThread {
}
diff --git a/annotations/src/main/java/androidx/annotation/ArrayRes.java b/annotation/annotation/src/main/java/androidx/annotation/ArrayRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/ArrayRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/ArrayRes.java
diff --git a/annotations/src/main/java/androidx/annotation/AttrRes.java b/annotation/annotation/src/main/java/androidx/annotation/AttrRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/AttrRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/AttrRes.java
diff --git a/annotations/src/main/java/androidx/annotation/BinderThread.java b/annotation/annotation/src/main/java/androidx/annotation/BinderThread.java
similarity index 96%
rename from annotations/src/main/java/androidx/annotation/BinderThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/BinderThread.java
index 2f944a9..cfc6bd8 100644
--- a/annotations/src/main/java/androidx/annotation/BinderThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/BinderThread.java
@@ -38,6 +38,6 @@
*/
@Documented
@Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
public @interface BinderThread {
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/BoolRes.java b/annotation/annotation/src/main/java/androidx/annotation/BoolRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/BoolRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/BoolRes.java
diff --git a/annotations/src/main/java/androidx/annotation/CallSuper.java b/annotation/annotation/src/main/java/androidx/annotation/CallSuper.java
similarity index 99%
rename from annotations/src/main/java/androidx/annotation/CallSuper.java
rename to annotation/annotation/src/main/java/androidx/annotation/CallSuper.java
index 5a683bb..f39d81c 100644
--- a/annotations/src/main/java/androidx/annotation/CallSuper.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/CallSuper.java
@@ -35,4 +35,4 @@
@Retention(CLASS)
@Target({METHOD})
public @interface CallSuper {
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/CheckResult.java b/annotation/annotation/src/main/java/androidx/annotation/CheckResult.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/CheckResult.java
rename to annotation/annotation/src/main/java/androidx/annotation/CheckResult.java
index 14334ab..b47cc76 100644
--- a/annotations/src/main/java/androidx/annotation/CheckResult.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/CheckResult.java
@@ -40,7 +40,8 @@
@Retention(CLASS)
@Target({METHOD})
public @interface CheckResult {
- /** Defines the name of the suggested method to use instead, if applicable (using
+ /**
+ * Defines the name of the suggested method to use instead, if applicable (using
* the same signature format as javadoc.) If there is more than one possibility,
* list them all separated by commas.
* <p>
@@ -55,4 +56,4 @@
* </pre>
*/
String suggest() default "";
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/ColorInt.java b/annotation/annotation/src/main/java/androidx/annotation/ColorInt.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/ColorInt.java
rename to annotation/annotation/src/main/java/androidx/annotation/ColorInt.java
index 7c18682..a10102c 100644
--- a/annotations/src/main/java/androidx/annotation/ColorInt.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/ColorInt.java
@@ -35,6 +35,6 @@
* }</pre>
*/
@Retention(CLASS)
-@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD})
+@Target({PARAMETER, METHOD, LOCAL_VARIABLE, FIELD})
public @interface ColorInt {
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/ColorLong.java b/annotation/annotation/src/main/java/androidx/annotation/ColorLong.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/ColorLong.java
rename to annotation/annotation/src/main/java/androidx/annotation/ColorLong.java
diff --git a/annotations/src/main/java/androidx/annotation/ColorRes.java b/annotation/annotation/src/main/java/androidx/annotation/ColorRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/ColorRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/ColorRes.java
diff --git a/annotations/src/main/java/androidx/annotation/ContentView.java b/annotation/annotation/src/main/java/androidx/annotation/ContentView.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/ContentView.java
rename to annotation/annotation/src/main/java/androidx/annotation/ContentView.java
diff --git a/annotations/src/main/java/androidx/annotation/DimenRes.java b/annotation/annotation/src/main/java/androidx/annotation/DimenRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/DimenRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/DimenRes.java
diff --git a/annotations/src/main/java/androidx/annotation/Dimension.java b/annotation/annotation/src/main/java/androidx/annotation/Dimension.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/Dimension.java
rename to annotation/annotation/src/main/java/androidx/annotation/Dimension.java
index db5bae0..ddbc0ab 100644
--- a/annotations/src/main/java/androidx/annotation/Dimension.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/Dimension.java
@@ -33,7 +33,7 @@
*/
@Documented
@Retention(CLASS)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
+@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE})
public @interface Dimension {
@DimensionUnit
int unit() default PX;
diff --git a/annotations/src/main/java/androidx/annotation/DimensionUnit.java b/annotation/annotation/src/main/java/androidx/annotation/DimensionUnit.java
similarity index 92%
rename from annotations/src/main/java/androidx/annotation/DimensionUnit.java
rename to annotation/annotation/src/main/java/androidx/annotation/DimensionUnit.java
index de849ef..ea3be505 100644
--- a/annotations/src/main/java/androidx/annotation/DimensionUnit.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/DimensionUnit.java
@@ -25,11 +25,12 @@
* @hide
*/
@IntDef({Dimension.PX,
- Dimension.DP,
- Dimension.SP}
+ Dimension.DP,
+ Dimension.SP}
// Important: If updating these constants, also update
// ../../../../external-annotations/android/support/annotation/annotations.xml
)
+@RestrictTo(RestrictTo.Scope.LIBRARY)
@Retention(SOURCE)
@interface DimensionUnit {
}
diff --git a/annotations/src/main/java/androidx/annotation/DrawableRes.java b/annotation/annotation/src/main/java/androidx/annotation/DrawableRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/DrawableRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/DrawableRes.java
diff --git a/annotations/src/main/java/androidx/annotation/FloatRange.java b/annotation/annotation/src/main/java/androidx/annotation/FloatRange.java
similarity index 84%
rename from annotations/src/main/java/androidx/annotation/FloatRange.java
rename to annotation/annotation/src/main/java/androidx/annotation/FloatRange.java
index cbaaf0a..712833f 100644
--- a/annotations/src/main/java/androidx/annotation/FloatRange.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/FloatRange.java
@@ -37,13 +37,18 @@
* </code></pre>
*/
@Retention(CLASS)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
+@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE})
public @interface FloatRange {
- /** Smallest value. Whether it is inclusive or not is determined
- * by {@link #fromInclusive} */
+ /**
+ * Smallest value. Whether it is inclusive or not is determined
+ * by {@link #fromInclusive}
+ */
double from() default Double.NEGATIVE_INFINITY;
- /** Largest value. Whether it is inclusive or not is determined
- * by {@link #toInclusive} */
+
+ /**
+ * Largest value. Whether it is inclusive or not is determined
+ * by {@link #toInclusive}
+ */
double to() default Double.POSITIVE_INFINITY;
/** Whether the from value is included in the range */
@@ -51,4 +56,4 @@
/** Whether the to value is included in the range */
boolean toInclusive() default true;
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/FontRes.java b/annotation/annotation/src/main/java/androidx/annotation/FontRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/FontRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/FontRes.java
diff --git a/annotations/src/main/java/androidx/annotation/FractionRes.java b/annotation/annotation/src/main/java/androidx/annotation/FractionRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/FractionRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/FractionRes.java
diff --git a/annotations/src/main/java/androidx/annotation/GuardedBy.java b/annotation/annotation/src/main/java/androidx/annotation/GuardedBy.java
similarity index 96%
rename from annotations/src/main/java/androidx/annotation/GuardedBy.java
rename to annotation/annotation/src/main/java/androidx/annotation/GuardedBy.java
index 74c01ee..0cf98a0 100644
--- a/annotations/src/main/java/androidx/annotation/GuardedBy.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/GuardedBy.java
@@ -40,7 +40,7 @@
* return object;
* }</pre>
*/
-@Target({ ElementType.FIELD, ElementType.METHOD })
+@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.CLASS)
public @interface GuardedBy {
String value();
diff --git a/annotations/src/main/java/androidx/annotation/HalfFloat.java b/annotation/annotation/src/main/java/androidx/annotation/HalfFloat.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/HalfFloat.java
rename to annotation/annotation/src/main/java/androidx/annotation/HalfFloat.java
diff --git a/annotations/src/main/java/androidx/annotation/IdRes.java b/annotation/annotation/src/main/java/androidx/annotation/IdRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/IdRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/IdRes.java
diff --git a/annotations/src/main/java/androidx/annotation/InspectableProperty.java b/annotation/annotation/src/main/java/androidx/annotation/InspectableProperty.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/InspectableProperty.java
rename to annotation/annotation/src/main/java/androidx/annotation/InspectableProperty.java
diff --git a/annotations/src/main/java/androidx/annotation/IntDef.java b/annotation/annotation/src/main/java/androidx/annotation/IntDef.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/IntDef.java
rename to annotation/annotation/src/main/java/androidx/annotation/IntDef.java
diff --git a/annotations/src/main/java/androidx/annotation/IntRange.java b/annotation/annotation/src/main/java/androidx/annotation/IntRange.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/IntRange.java
rename to annotation/annotation/src/main/java/androidx/annotation/IntRange.java
index 23b4b31..883d687 100644
--- a/annotations/src/main/java/androidx/annotation/IntRange.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/IntRange.java
@@ -37,10 +37,11 @@
* </code></pre>
*/
@Retention(CLASS)
-@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE})
+@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE, ANNOTATION_TYPE})
public @interface IntRange {
/** Smallest value, inclusive */
long from() default Long.MIN_VALUE;
+
/** Largest value, inclusive */
long to() default Long.MAX_VALUE;
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/IntegerRes.java b/annotation/annotation/src/main/java/androidx/annotation/IntegerRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/IntegerRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/IntegerRes.java
diff --git a/annotations/src/main/java/androidx/annotation/InterpolatorRes.java b/annotation/annotation/src/main/java/androidx/annotation/InterpolatorRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/InterpolatorRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/InterpolatorRes.java
diff --git a/annotations/src/main/java/androidx/annotation/Keep.java b/annotation/annotation/src/main/java/androidx/annotation/Keep.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/Keep.java
rename to annotation/annotation/src/main/java/androidx/annotation/Keep.java
index 3ae6583..087aaea 100644
--- a/annotations/src/main/java/androidx/annotation/Keep.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/Keep.java
@@ -41,6 +41,6 @@
* </code></pre>
*/
@Retention(CLASS)
-@Target({PACKAGE,TYPE,ANNOTATION_TYPE,CONSTRUCTOR,METHOD,FIELD})
+@Target({PACKAGE, TYPE, ANNOTATION_TYPE, CONSTRUCTOR, METHOD, FIELD})
public @interface Keep {
}
diff --git a/annotations/src/main/java/androidx/annotation/LayoutRes.java b/annotation/annotation/src/main/java/androidx/annotation/LayoutRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/LayoutRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/LayoutRes.java
diff --git a/annotations/src/main/java/androidx/annotation/LongDef.java b/annotation/annotation/src/main/java/androidx/annotation/LongDef.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/LongDef.java
rename to annotation/annotation/src/main/java/androidx/annotation/LongDef.java
diff --git a/annotations/src/main/java/androidx/annotation/MainThread.java b/annotation/annotation/src/main/java/androidx/annotation/MainThread.java
similarity index 97%
rename from annotations/src/main/java/androidx/annotation/MainThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/MainThread.java
index a557a97..415e551 100644
--- a/annotations/src/main/java/androidx/annotation/MainThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/MainThread.java
@@ -46,6 +46,6 @@
*/
@Documented
@Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
public @interface MainThread {
}
diff --git a/annotations/src/main/java/androidx/annotation/MenuRes.java b/annotation/annotation/src/main/java/androidx/annotation/MenuRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/MenuRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/MenuRes.java
diff --git a/annotations/src/main/java/androidx/annotation/NavigationRes.java b/annotation/annotation/src/main/java/androidx/annotation/NavigationRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/NavigationRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/NavigationRes.java
diff --git a/annotations/src/main/java/androidx/annotation/NonNull.java b/annotation/annotation/src/main/java/androidx/annotation/NonNull.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/NonNull.java
rename to annotation/annotation/src/main/java/androidx/annotation/NonNull.java
diff --git a/annotations/src/main/java/androidx/annotation/Nullable.java b/annotation/annotation/src/main/java/androidx/annotation/Nullable.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/Nullable.java
rename to annotation/annotation/src/main/java/androidx/annotation/Nullable.java
diff --git a/annotations/src/main/java/androidx/annotation/PluralsRes.java b/annotation/annotation/src/main/java/androidx/annotation/PluralsRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/PluralsRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/PluralsRes.java
diff --git a/annotations/src/main/java/androidx/annotation/ProductionVisibility.java b/annotation/annotation/src/main/java/androidx/annotation/ProductionVisibility.java
similarity index 87%
rename from annotations/src/main/java/androidx/annotation/ProductionVisibility.java
rename to annotation/annotation/src/main/java/androidx/annotation/ProductionVisibility.java
index d2ed9d9..0e88a11 100644
--- a/annotations/src/main/java/androidx/annotation/ProductionVisibility.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/ProductionVisibility.java
@@ -25,12 +25,13 @@
* @hide
*/
@IntDef({VisibleForTesting.PRIVATE,
- VisibleForTesting.PACKAGE_PRIVATE,
- VisibleForTesting.PROTECTED,
- VisibleForTesting.NONE}
+ VisibleForTesting.PACKAGE_PRIVATE,
+ VisibleForTesting.PROTECTED,
+ VisibleForTesting.NONE}
// Important: If updating these constants, also update
// ../../../../external-annotations/android/support/annotation/annotations.xml
)
+@RestrictTo(RestrictTo.Scope.LIBRARY)
@Retention(SOURCE)
@interface ProductionVisibility {
}
diff --git a/annotations/src/main/java/androidx/annotation/Px.java b/annotation/annotation/src/main/java/androidx/annotation/Px.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/Px.java
rename to annotation/annotation/src/main/java/androidx/annotation/Px.java
diff --git a/annotations/src/main/java/androidx/annotation/RawRes.java b/annotation/annotation/src/main/java/androidx/annotation/RawRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/RawRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/RawRes.java
diff --git a/annotations/src/main/java/androidx/annotation/RequiresApi.java b/annotation/annotation/src/main/java/androidx/annotation/RequiresApi.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/RequiresApi.java
rename to annotation/annotation/src/main/java/androidx/annotation/RequiresApi.java
diff --git a/annotations/src/main/java/androidx/annotation/RequiresFeature.java b/annotation/annotation/src/main/java/androidx/annotation/RequiresFeature.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/RequiresFeature.java
rename to annotation/annotation/src/main/java/androidx/annotation/RequiresFeature.java
diff --git a/annotations/src/main/java/androidx/annotation/RequiresPermission.java b/annotation/annotation/src/main/java/androidx/annotation/RequiresPermission.java
similarity index 98%
rename from annotations/src/main/java/androidx/annotation/RequiresPermission.java
rename to annotation/annotation/src/main/java/androidx/annotation/RequiresPermission.java
index cc9c988..583dde9 100644
--- a/annotations/src/main/java/androidx/annotation/RequiresPermission.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/RequiresPermission.java
@@ -74,7 +74,7 @@
* </code></pre>
*/
@Retention(CLASS)
-@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER})
+@Target({ANNOTATION_TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER})
public @interface RequiresPermission {
/**
* The name of the permission that is required, if precisely one permission
diff --git a/annotations/src/main/java/androidx/annotation/RestrictTo.java b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
similarity index 97%
rename from annotations/src/main/java/androidx/annotation/RestrictTo.java
rename to annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
index 461e1a4..bd51eb5 100644
--- a/annotations/src/main/java/androidx/annotation/RestrictTo.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.java
@@ -47,7 +47,7 @@
* </code></pre>
*/
@Retention(CLASS)
-@Target({ANNOTATION_TYPE,TYPE,METHOD,CONSTRUCTOR,FIELD,PACKAGE})
+@Target({ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE})
public @interface RestrictTo {
/**
diff --git a/annotations/src/main/java/androidx/annotation/Size.java b/annotation/annotation/src/main/java/androidx/annotation/Size.java
similarity index 95%
rename from annotations/src/main/java/androidx/annotation/Size.java
rename to annotation/annotation/src/main/java/androidx/annotation/Size.java
index d178eca..bc4b0ee 100644
--- a/annotations/src/main/java/androidx/annotation/Size.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/Size.java
@@ -38,14 +38,17 @@
* }</pre>
*/
@Retention(CLASS)
-@Target({PARAMETER,LOCAL_VARIABLE,METHOD,FIELD,ANNOTATION_TYPE})
+@Target({PARAMETER, LOCAL_VARIABLE, METHOD, FIELD, ANNOTATION_TYPE})
public @interface Size {
/** An exact size (or -1 if not specified) */
long value() default -1;
+
/** A minimum size, inclusive */
long min() default Long.MIN_VALUE;
+
/** A maximum size, inclusive */
long max() default Long.MAX_VALUE;
+
/** The size must be a multiple of this factor */
long multiple() default 1;
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/StringDef.java b/annotation/annotation/src/main/java/androidx/annotation/StringDef.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/StringDef.java
rename to annotation/annotation/src/main/java/androidx/annotation/StringDef.java
diff --git a/annotations/src/main/java/androidx/annotation/StringRes.java b/annotation/annotation/src/main/java/androidx/annotation/StringRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/StringRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/StringRes.java
diff --git a/annotations/src/main/java/androidx/annotation/StyleRes.java b/annotation/annotation/src/main/java/androidx/annotation/StyleRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/StyleRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/StyleRes.java
diff --git a/annotations/src/main/java/androidx/annotation/StyleableRes.java b/annotation/annotation/src/main/java/androidx/annotation/StyleableRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/StyleableRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/StyleableRes.java
diff --git a/annotations/src/main/java/androidx/annotation/TransitionRes.java b/annotation/annotation/src/main/java/androidx/annotation/TransitionRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/TransitionRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/TransitionRes.java
diff --git a/annotations/src/main/java/androidx/annotation/UiThread.java b/annotation/annotation/src/main/java/androidx/annotation/UiThread.java
similarity index 97%
rename from annotations/src/main/java/androidx/annotation/UiThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/UiThread.java
index 0b87397..6417f9d 100644
--- a/annotations/src/main/java/androidx/annotation/UiThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/UiThread.java
@@ -47,6 +47,6 @@
*/
@Documented
@Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
public @interface UiThread {
}
diff --git a/annotations/src/main/java/androidx/annotation/VisibleForTesting.java b/annotation/annotation/src/main/java/androidx/annotation/VisibleForTesting.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/VisibleForTesting.java
rename to annotation/annotation/src/main/java/androidx/annotation/VisibleForTesting.java
diff --git a/annotations/src/main/java/androidx/annotation/WorkerThread.java b/annotation/annotation/src/main/java/androidx/annotation/WorkerThread.java
similarity index 96%
rename from annotations/src/main/java/androidx/annotation/WorkerThread.java
rename to annotation/annotation/src/main/java/androidx/annotation/WorkerThread.java
index f102301..9247fb0 100644
--- a/annotations/src/main/java/androidx/annotation/WorkerThread.java
+++ b/annotation/annotation/src/main/java/androidx/annotation/WorkerThread.java
@@ -38,6 +38,6 @@
*/
@Documented
@Retention(CLASS)
-@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER})
+@Target({METHOD, CONSTRUCTOR, TYPE, PARAMETER})
public @interface WorkerThread {
-}
\ No newline at end of file
+}
diff --git a/annotations/src/main/java/androidx/annotation/XmlRes.java b/annotation/annotation/src/main/java/androidx/annotation/XmlRes.java
similarity index 100%
rename from annotations/src/main/java/androidx/annotation/XmlRes.java
rename to annotation/annotation/src/main/java/androidx/annotation/XmlRes.java
diff --git a/annotations/src/main/resources/META-INF/proguard/androidx-annotations.pro b/annotation/annotation/src/main/resources/META-INF/proguard/androidx-annotations.pro
similarity index 100%
rename from annotations/src/main/resources/META-INF/proguard/androidx-annotations.pro
rename to annotation/annotation/src/main/resources/META-INF/proguard/androidx-annotations.pro
diff --git a/annotations/AndroidManifest.xml b/annotations/AndroidManifest.xml
deleted file mode 100644
index 2593e0e..0000000
--- a/annotations/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest package="android.support.annotation" />
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
deleted file mode 100644
index 0550ec5..0000000
--- a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.appcompat.app;
-
-import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
-import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO;
-import static androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES;
-import static androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals;
-import static androidx.appcompat.testutils.NightModeUtils.isSystemNightThemeEnabled;
-import static androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait;
-import static androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForDestroy;
-import static androidx.appcompat.testutils.TestUtilsMatchers.isBackground;
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.withId;
-import static androidx.test.espresso.matcher.ViewMatchers.withText;
-import static androidx.testutils.LifecycleOwnerUtils.waitForRecreation;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-
-import android.app.Instrumentation;
-import android.content.res.Configuration;
-import android.webkit.WebView;
-
-import androidx.appcompat.test.R;
-import androidx.appcompat.testutils.NightModeUtils.NightSetMode;
-import androidx.core.content.ContextCompat;
-import androidx.test.filters.LargeTest;
-import androidx.test.platform.app.InstrumentationRegistry;
-import androidx.test.rule.ActivityTestRule;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.concurrent.CountDownLatch;
-
-@LargeTest
-@RunWith(Parameterized.class)
-public class NightModeTestCase {
-
- private static final String STRING_DAY = "DAY";
- private static final String STRING_NIGHT = "NIGHT";
-
- @Parameterized.Parameters
- public static Collection<NightSetMode> data() {
- return Arrays.asList(NightSetMode.DEFAULT, NightSetMode.LOCAL);
- }
-
- private final NightSetMode mSetMode;
-
- @Rule
- public final ActivityTestRule<NightModeActivity> mActivityTestRule;
-
- public NightModeTestCase(NightSetMode setMode) {
- mSetMode = setMode;
- mActivityTestRule = new ActivityTestRule<>(NightModeActivity.class, false, false);
- }
-
- @Before
- public void setup() {
- // By default we'll set the night mode to NO, which allows us to make better
- // assumptions in the test below
- AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
- // Now launch the test activity
- mActivityTestRule.launchActivity(null);
- }
-
- @Test
- public void testLocalDayNightModeRecreatesActivity() throws Throwable {
- if (mSetMode != NightSetMode.LOCAL) {
- // This test is only applicable when using setLocalNightMode
- return;
- }
-
- // Verify first that we're in day mode
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
- // Now force the local night mode to be yes (aka night mode)
- setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-
- // Assert that the new local night mode is returned
- assertEquals(MODE_NIGHT_YES,
- mActivityTestRule.getActivity().getDelegate().getLocalNightMode());
-
- // Now check the text has changed, signifying that night resources are being used
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
- }
-
- @Test
- public void testSwitchingYesToFollowSystem() throws Throwable {
- // This test is only useful when the dark system theme is not enabled
- if (!isSystemNightThemeEnabled(mActivityTestRule.getActivity())) {
- // Ensure that we're currently running in light theme (from setup above)
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
- // Force the night mode to be yes (aka night mode)
- setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-
- // Now check the text has changed, signifying that night resources are being used
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
-
- // Now force the local night mode to be FOLLOW_SYSTEM (which we know is light)
- setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_FOLLOW_SYSTEM, mSetMode);
-
- // Now check the text matches the system
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
- }
- }
-
- @Test
- public void testSwitchingNoToFollowSystem() throws Throwable {
- // This test is only useful when the dark system theme is enabled
- if (isSystemNightThemeEnabled(mActivityTestRule.getActivity())) {
- // Ensure that we're currently running in light theme (from setup above)
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
- // Now force the local night mode to be FOLLOW_SYSTEM (which we know is dark)
- setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_FOLLOW_SYSTEM, mSetMode);
-
- // Now check the text matches the system
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
- }
- }
-
- @Test
- public void testColorConvertedDrawableChangesWithNightMode() throws Throwable {
- final NightModeActivity activity = mActivityTestRule.getActivity();
- final int dayColor = ContextCompat.getColor(activity, R.color.color_sky_day);
- final int nightColor = ContextCompat.getColor(activity, R.color.color_sky_night);
-
- // Loop through and switching from day to night and vice-versa multiple times. It needs
- // to be looped since the issue is with drawable caching, therefore we need to prime the
- // cache for the issue to happen
- for (int i = 0; i < 5; i++) {
- // First force it to be night mode and assert the color
- setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
- onView(withId(R.id.view_background)).check(matches(isBackground(nightColor)));
-
- // Now force the local night mode to be no (aka day mode) and assert the color
- setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
- onView(withId(R.id.view_background)).check(matches(isBackground(dayColor)));
- }
- }
-
- @Test
- public void testNightModeAutoTimeRecreatesOnTimeChange() throws Throwable {
- // Create a fake TwilightManager and set it as the app instance
- final FakeTwilightManager twilightManager = new FakeTwilightManager();
- TwilightManager.setInstance(twilightManager);
-
- // Verify that we're currently in day mode
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
- // Set MODE_NIGHT_AUTO so that we will change to night mode automatically
- setNightModeAndWait(mActivityTestRule, AppCompatDelegate.MODE_NIGHT_AUTO_TIME, mSetMode);
- final AppCompatDelegateImpl newDelegate =
- (AppCompatDelegateImpl) mActivityTestRule.getActivity().getDelegate();
-
- // Update the fake twilight manager to be in night and trigger a fake 'time' change
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- twilightManager.setIsNight(true);
- newDelegate.getAutoTimeNightModeManager().onChange();
- }
- });
-
- // Now wait until the Activity is destroyed (thus recreated)
- waitForRecreation(mActivityTestRule);
-
- // Check that the text has changed, signifying that night resources are being used
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
- }
-
- @Test
- public void testNightModeAutoTimeRecreatesOnResume() throws Throwable {
- // Create a fake TwilightManager and set it as the app instance
- final FakeTwilightManager twilightManager = new FakeTwilightManager();
- TwilightManager.setInstance(twilightManager);
-
- // Set MODE_NIGHT_AUTO_TIME so that we will change to night mode automatically
- setNightModeAndWait(mActivityTestRule, AppCompatDelegate.MODE_NIGHT_AUTO_TIME, mSetMode);
-
- // Verify that we're currently in day mode
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)));
-
- final CountDownLatch resumeCompleteLatch = new CountDownLatch(1);
-
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- final NightModeActivity activity = mActivityTestRule.getActivity();
- final Instrumentation instrumentation =
- InstrumentationRegistry.getInstrumentation();
- // Now fool the Activity into thinking that it has gone into the background
- instrumentation.callActivityOnPause(activity);
- instrumentation.callActivityOnStop(activity);
-
- // Now update the twilight manager while the Activity is in the 'background'
- twilightManager.setIsNight(true);
-
- // Now tell the Activity that it has gone into the foreground again
- instrumentation.callActivityOnStart(activity);
- instrumentation.callActivityOnResume(activity);
-
- resumeCompleteLatch.countDown();
- }
- });
-
- resumeCompleteLatch.await();
- // finally check that the text has changed, signifying that night resources are being used
- onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)));
- }
-
- @Test
- public void testOnNightModeChangedCalled() throws Throwable {
- final NightModeActivity activity = mActivityTestRule.getActivity();
- // Set local night mode to YES
- setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
- // Assert that the Activity received a new value
- assertEquals(MODE_NIGHT_YES, activity.getLastNightModeAndReset());
- }
-
- @Test
- public void testDialogDoesNotOverrideActivityConfiguration() throws Throwable {
- // Set Activity local night mode to YES
- setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-
- // Assert that the uiMode is as expected
- assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES,
- mActivityTestRule.getActivity());
-
- // Now show a AppCompatDialog
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- AppCompatDialog dialog = new AppCompatDialog(mActivityTestRule.getActivity());
- dialog.show();
- }
- });
-
- // Assert that the uiMode is unchanged
- assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES,
- mActivityTestRule.getActivity());
- }
-
- @Test
- public void testLoadingWebViewMaintainsConfiguration() throws Throwable {
- // Set night mode and wait for the new Activity
- setNightModeAndWaitForDestroy(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
-
- // Assert that the context still has a night themed configuration
- assertConfigurationNightModeEquals(
- Configuration.UI_MODE_NIGHT_YES,
- mActivityTestRule.getActivity().getResources().getConfiguration());
-
- // Now load a WebView into the Activity
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- final WebView webView = new WebView(mActivityTestRule.getActivity());
- }
- });
-
- // Now assert that the context still has a night themed configuration
- assertConfigurationNightModeEquals(
- Configuration.UI_MODE_NIGHT_YES,
- mActivityTestRule.getActivity().getResources().getConfiguration());
- }
-
- @Test
- public void testDialogCleansUpAutoMode() throws Throwable {
- mActivityTestRule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- AppCompatDialog dialog = new AppCompatDialog(mActivityTestRule.getActivity());
- AppCompatDelegateImpl delegate = (AppCompatDelegateImpl) dialog.getDelegate();
-
- // Set the local night mode of the Dialog to be an AUTO mode
- delegate.setLocalNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_TIME);
-
- // Now show and dismiss the dialog
- dialog.show();
- dialog.dismiss();
-
- // Assert that the auto manager is destroyed (not listening)
- assertFalse(delegate.getAutoTimeNightModeManager().isListening());
- }
- });
- }
-
- @Test
- public void testOnConfigurationChangeNotCalled() throws Throwable {
- NightModeActivity activity = mActivityTestRule.getActivity();
- // Set local night mode to YES
- setNightModeAndWait(mActivityTestRule, MODE_NIGHT_YES, mSetMode);
- // Assert that onConfigurationChange was not called on the original activity
- assertNull(activity.getLastConfigurationChangeAndClear());
-
- activity = mActivityTestRule.getActivity();
- // Set local night mode back to NO
- setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, mSetMode);
- // Assert that onConfigurationChange was not called
- assertNull(activity.getLastConfigurationChangeAndClear());
- }
-
- @After
- public void cleanup() throws Throwable {
- // Reset the default night mode
- setNightModeAndWait(mActivityTestRule, MODE_NIGHT_NO, NightSetMode.DEFAULT);
- }
-
- private static class FakeTwilightManager extends TwilightManager {
- private boolean mIsNight;
-
- FakeTwilightManager() {
- super(null, null);
- }
-
- @Override
- boolean isNight() {
- return mIsNight;
- }
-
- void setIsNight(boolean night) {
- mIsNight = night;
- }
- }
-}
diff --git a/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt
new file mode 100644
index 0000000..8bd1b44
--- /dev/null
+++ b/appcompat/src/androidTest/java/androidx/appcompat/app/NightModeTestCase.kt
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.appcompat.app
+
+import android.content.Context
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO
+import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES
+import androidx.appcompat.testutils.NightModeUtils.assertConfigurationNightModeEquals
+import androidx.appcompat.testutils.NightModeUtils.isSystemNightThemeEnabled
+import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWait
+import androidx.appcompat.testutils.NightModeUtils.setNightModeAndWaitForDestroy
+import androidx.appcompat.testutils.TestUtilsMatchers.isBackground
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.testutils.LifecycleOwnerUtils.waitForRecreation
+
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNull
+
+import android.content.res.Configuration
+import android.location.LocationManager
+import android.webkit.WebView
+
+import androidx.appcompat.test.R
+import androidx.appcompat.testutils.NightModeUtils.NightSetMode
+import androidx.core.content.ContextCompat
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.rule.ActivityTestRule
+
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+import java.util.concurrent.CountDownLatch
+
+@Suppress("DEPRECATION")
+@LargeTest
+@RunWith(Parameterized::class)
+class NightModeTestCase(private val setMode: NightSetMode) {
+ @get:Rule
+ val rule = ActivityTestRule(NightModeActivity::class.java, false, false)
+
+ @Before
+ fun setup() {
+ // By default we'll set the night mode to NO, which allows us to make better
+ // assumptions in the test below
+ AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO)
+ // Now launch the test activity
+ rule.launchActivity(null)
+ }
+
+ @Test
+ fun testLocalDayNightModeRecreatesActivity() {
+ if (setMode != NightSetMode.LOCAL) {
+ // This test is only applicable when using setLocalNightMode
+ return
+ }
+
+ // Verify first that we're in day mode
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+ // Now force the local night mode to be yes (aka night mode)
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+
+ // Assert that the new local night mode is returned
+ assertEquals(MODE_NIGHT_YES, rule.activity.delegate.localNightMode)
+
+ // Now check the text has changed, signifying that night resources are being used
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+ }
+
+ @Test
+ fun testSwitchingYesDoesNotAffectApplication() {
+ // This test is only useful when the dark system theme is not enabled
+ if (!isSystemNightThemeEnabled(rule.activity)) {
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO,
+ rule.activity.applicationContext.resources.configuration)
+
+ // Force the night mode to be yes (aka night mode)
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_NO,
+ rule.activity.applicationContext.resources.configuration)
+ }
+ }
+
+ @Test
+ fun testSwitchingYesToFollowSystem() {
+ // This test is only useful when the dark system theme is enabled
+ if (!isSystemNightThemeEnabled(rule.activity)) {
+ // Now force the night mode to be YES, so we're in dark theme
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+
+ // Now force the local night mode to be FOLLOW_SYSTEM (which we know is dark)
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_FOLLOW_SYSTEM, setMode)
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+ }
+ }
+
+ @Test
+ fun testSwitchingNoToFollowSystem() {
+ // This test is only useful when the dark system theme is enabled
+ if (isSystemNightThemeEnabled(rule.activity)) {
+ // Now force the night mode to be NO, so we're in light theme
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_NO, setMode)
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+ // Now force the night mode to be FOLLOW_SYSTEM (which we know is dark)
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_FOLLOW_SYSTEM, setMode)
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+ }
+ }
+
+ @Test
+ fun testColorConvertedDrawableChangesWithNightMode() {
+ val activity = rule.activity
+ val dayColor = ContextCompat.getColor(activity, R.color.color_sky_day)
+ val nightColor = ContextCompat.getColor(activity, R.color.color_sky_night)
+
+ // Loop through and switching from day to night and vice-versa multiple times. It needs
+ // to be looped since the issue is with drawable caching, therefore we need to prime the
+ // cache for the issue to happen
+ for (i in 0 until 5) {
+ // First force it to be night mode and assert the color
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+ onView(withId(R.id.view_background)).check(matches(isBackground(nightColor)))
+
+ // Now force the local night mode to be no (aka day mode) and assert the color
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_NO, setMode)
+ onView(withId(R.id.view_background)).check(matches(isBackground(dayColor)))
+ }
+ }
+
+ @Test
+ fun testNightModeAutoTimeRecreatesOnTimeChange() {
+ // Create a fake TwilightManager and set it as the app instance
+ val twilightManager = FakeTwilightManager(rule.activity)
+ TwilightManager.setInstance(twilightManager)
+
+ // Verify that we're currently in day mode
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+ // Set MODE_NIGHT_AUTO so that we will change to night mode automatically
+ setNightModeAndWait(rule, AppCompatDelegate.MODE_NIGHT_AUTO_TIME, setMode)
+ val newDelegate = rule.activity.delegate as AppCompatDelegateImpl
+
+ // Update the fake twilight manager to be in night and trigger a fake 'time' change
+ rule.runOnUiThread {
+ twilightManager.isNightForTest = true
+ newDelegate.autoTimeNightModeManager.onChange()
+ }
+
+ // Now wait until the Activity is destroyed (thus recreated)
+ waitForRecreation(rule)
+
+ // Check that the text has changed, signifying that night resources are being used
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+ }
+
+ @Test
+ fun testNightModeAutoTimeRecreatesOnResume() {
+ // Create a fake TwilightManager and set it as the app instance
+ val twilightManager = FakeTwilightManager(rule.activity)
+ TwilightManager.setInstance(twilightManager)
+
+ // Set MODE_NIGHT_AUTO_TIME so that we will change to night mode automatically
+ setNightModeAndWait(rule, AppCompatDelegate.MODE_NIGHT_AUTO_TIME, setMode)
+
+ // Verify that we're currently in day mode
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_DAY)))
+
+ val resumeCompleteLatch = CountDownLatch(1)
+
+ rule.runOnUiThread {
+ val activity = rule.activity
+ val instrumentation = InstrumentationRegistry.getInstrumentation()
+ // Now fool the Activity into thinking that it has gone into the background
+ instrumentation.callActivityOnPause(activity)
+ instrumentation.callActivityOnStop(activity)
+
+ // Now update the twilight manager while the Activity is in the 'background'
+ twilightManager.isNightForTest = true
+
+ // Now tell the Activity that it has gone into the foreground again
+ instrumentation.callActivityOnStart(activity)
+ instrumentation.callActivityOnResume(activity)
+
+ resumeCompleteLatch.countDown()
+ }
+
+ resumeCompleteLatch.await()
+ // finally check that the text has changed, signifying that night resources are being used
+ onView(withId(R.id.text_night_mode)).check(matches(withText(STRING_NIGHT)))
+ }
+
+ @Test
+ fun testOnNightModeChangedCalled() {
+ val activity = rule.activity
+ // Set local night mode to YES
+ setNightModeAndWait(rule, MODE_NIGHT_YES, setMode)
+ // Assert that the Activity received a new value
+ assertEquals(MODE_NIGHT_YES, activity.lastNightModeAndReset)
+ }
+
+ @Test
+ fun testDialogDoesNotOverrideActivityConfiguration() {
+ // Set Activity local night mode to YES
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+
+ // Assert that the uiMode is as expected
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
+
+ // Now show a AppCompatDialog
+ rule.runOnUiThread {
+ AppCompatDialog(rule.activity).show()
+ }
+
+ // Assert that the uiMode is unchanged
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
+ }
+
+ @Test
+ fun testLoadingWebViewMaintainsConfiguration() {
+ // Set night mode and wait for the new Activity
+ setNightModeAndWaitForDestroy(rule, MODE_NIGHT_YES, setMode)
+
+ // Assert that the context still has a night themed configuration
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
+
+ // Now load a WebView into the Activity
+ rule.runOnUiThread { WebView(rule.activity) }
+
+ // Now assert that the context still has a night themed configuration
+ assertConfigurationNightModeEquals(Configuration.UI_MODE_NIGHT_YES, rule.activity)
+ }
+
+ @Test
+ fun testDialogCleansUpAutoMode() {
+ rule.runOnUiThread {
+ val dialog = AppCompatDialog(rule.activity)
+ val delegate = dialog.delegate as AppCompatDelegateImpl
+
+ // Set the local night mode of the Dialog to be an AUTO mode
+ delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_TIME
+
+ // Now show and dismiss the dialog
+ dialog.show()
+ dialog.dismiss()
+
+ // Assert that the auto manager is destroyed (not listening)
+ assertFalse(delegate.autoTimeNightModeManager.isListening)
+ }
+ }
+
+ @Test
+ fun testOnConfigurationChangeNotCalled() {
+ var activity = rule.activity
+ // Set local night mode to YES
+ setNightModeAndWait(rule, MODE_NIGHT_YES, setMode)
+ // Assert that onConfigurationChange was not called on the original activity
+ assertNull(activity.lastConfigurationChangeAndClear)
+
+ activity = rule.activity
+ // Set local night mode back to NO
+ setNightModeAndWait(rule, MODE_NIGHT_NO, setMode)
+ // Assert that onConfigurationChange was not called
+ assertNull(activity.lastConfigurationChangeAndClear)
+ }
+
+ @After
+ fun cleanup() {
+ rule.finishActivity()
+ // Reset the default night mode
+ setNightModeAndWait(rule, MODE_NIGHT_NO, NightSetMode.DEFAULT)
+ }
+
+ private class FakeTwilightManager(context: Context) : TwilightManager(
+ context,
+ ContextCompat.getSystemService(context, LocationManager::class.java)!!
+ ) {
+ var isNightForTest: Boolean = false
+
+ override fun isNight(): Boolean {
+ return isNightForTest
+ }
+ }
+
+ companion object {
+ private const val STRING_DAY = "DAY"
+ private const val STRING_NIGHT = "NIGHT"
+
+ @Parameterized.Parameters
+ @JvmStatic
+ fun data() = listOf(NightSetMode.DEFAULT, NightSetMode.LOCAL)
+ }
+}
diff --git a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
index 90a2c82..1bfe3a3 100644
--- a/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
+++ b/appcompat/src/main/java/androidx/appcompat/app/AppCompatDelegateImpl.java
@@ -136,6 +136,16 @@
private static boolean sInstalledExceptionHandler;
+ /**
+ * AppCompat selectively uses applyOverrideConfiguration() for DayNight functionality.
+ * Unfortunately the framework has a few bugs around Resources instances on SDKs 21-25,
+ * resulting in the root Resources instance (i.e. Application) being modified when it
+ * shouldn't be. We can work around it by always calling applyOverrideConfiguration()
+ * where available.
+ */
+ private static final boolean sAlwaysOverrideConfiguration = Build.VERSION.SDK_INT >= 21
+ && Build.VERSION.SDK_INT <= 25;
+
static final String EXCEPTION_HANDLER_MESSAGE_SUFFIX= ". If the resource you are"
+ " trying to use is a vector resource, you may be referencing it in an unsupported"
+ " way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.";
@@ -2258,7 +2268,7 @@
final boolean activityHandlingUiMode = isActivityManifestHandlingUiMode();
- if (newNightMode != applicationNightMode
+ if ((sAlwaysOverrideConfiguration || newNightMode != applicationNightMode)
&& !activityHandlingUiMode
&& Build.VERSION.SDK_INT >= 17
&& !mBaseContextAttached
diff --git a/biometric/build.gradle b/biometric/build.gradle
index 91905ddf..e423137 100644
--- a/biometric/build.gradle
+++ b/biometric/build.gradle
@@ -8,9 +8,10 @@
}
dependencies {
- api("androidx.annotation:annotation:1.0.0") { transitive = true}
- api("androidx.core:core:1.1.0-rc02") { transitive = true}
- api("androidx.fragment:fragment:1.0.0") { transitive = true}
+ api("androidx.annotation:annotation:1.1.0")
+ api("androidx.appcompat:appcompat:1.1.0-rc01")
+ api("androidx.core:core:1.1.0-rc02")
+ api("androidx.fragment:fragment:1.1.0-rc01")
}
android {
diff --git a/biometric/res/layout/fingerprint_dialog_layout.xml b/biometric/res/layout/fingerprint_dialog_layout.xml
index ce474cf..edc84fe 100644
--- a/biometric/res/layout/fingerprint_dialog_layout.xml
+++ b/biometric/res/layout/fingerprint_dialog_layout.xml
@@ -28,6 +28,7 @@
android:layout_marginTop="8dp"
android:layout_marginEnd="24dp"
android:layout_marginStart="24dp"
+ android:textColor="?android:attr/textColorSecondary"
android:textSize="16sp"
android:singleLine="true"
android:ellipsize="marquee"
@@ -40,6 +41,7 @@
android:paddingTop="0dp"
android:layout_marginEnd="24dp"
android:layout_marginStart="24dp"
+ android:textColor="?android:attr/textColorSecondary"
android:textSize="16sp"
android:maxLines="4"/>
diff --git a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
index 1e548a5..6d20e90 100644
--- a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
+++ b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
@@ -48,9 +48,18 @@
* A class that manages a system-provided biometric prompt. On devices running P and above, this
* will show a system-provided authentication prompt, using a device's supported biometric
* (fingerprint, iris, face, etc). On devices before P, this will show a dialog prompting for
- * fingerprint authentication. The prompt will persist across orientation changes unless explicitly
- * canceled by the client. For security reasons, the prompt will automatically dismiss when the
- * activity is no longer in the foreground.
+ * fingerprint authentication. The prompt will persist across configuration changes unless
+ * explicitly canceled by the client. For security reasons, the prompt will automatically dismiss
+ * when the application is no longer in the foreground.
+ *
+ * To persist authentication across configuration changes, developers should (re)create the
+ * BiometricPrompt every time the activity/fragment is created. Instantiating the library with a new
+ * callback early in the fragment/activity lifecycle (e.g. onCreate) allows the ongoing authenticate
+ * session's callbacks to be received by the new fragment/activity. Note that
+ * {@link BiometricPrompt#cancelAuthentication()} should not be called, and
+ * {@link BiometricPrompt#authenticate(PromptInfo)} or
+ * {@link BiometricPrompt#authenticate(PromptInfo, CryptoObject)} does not need to be invoked after
+ * the new activity/fragment is created, since we are keeping/continuing the same session.
*/
@SuppressLint("SyntheticAccessor")
public class BiometricPrompt implements BiometricConstants {
diff --git a/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java b/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
index c8354ca..2f7af4b 100644
--- a/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
+++ b/biometric/src/main/java/androidx/biometric/FingerprintDialogFragment.java
@@ -16,7 +16,6 @@
package androidx.biometric;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
@@ -36,6 +35,7 @@
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
+import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.DialogFragment;
@@ -144,7 +144,9 @@
final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(mBundle.getCharSequence(BiometricPrompt.KEY_TITLE));
- final View layout = LayoutInflater.from(getContext())
+ // We have to use builder.getContext() instead of the usual getContext() in order to get
+ // the appropriately themed context for this dialog.
+ final View layout = LayoutInflater.from(builder.getContext())
.inflate(R.layout.fingerprint_dialog_layout, null);
final TextView subtitleView = layout.findViewById(R.id.fingerprint_subtitle);
diff --git a/browser/api/1.2.0-alpha04.txt b/browser/api/1.2.0-alpha04.txt
index 74b3fa0..8269878 100644
--- a/browser/api/1.2.0-alpha04.txt
+++ b/browser/api/1.2.0-alpha04.txt
@@ -170,7 +170,8 @@
method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
method protected abstract boolean warmup(long);
field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
- field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.trusted.category.NavBarColorCustomization";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
diff --git a/browser/api/1.2.0-alpha05.txt b/browser/api/1.2.0-alpha05.txt
new file mode 100644
index 0000000..4e2c30d
--- /dev/null
+++ b/browser/api/1.2.0-alpha05.txt
@@ -0,0 +1,273 @@
+// Signature format: 3.0
+package androidx.browser.browseractions {
+
+ @Deprecated public class BrowserActionItem {
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent);
+ method @Deprecated public android.app.PendingIntent getAction();
+ method @Deprecated public int getIconId();
+ method @Deprecated public String getTitle();
+ }
+
+ @Deprecated public class BrowserActionsIntent {
+ method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
+ method @Deprecated public android.content.Intent getIntent();
+ method @Deprecated public static String? getUntrustedCreatorPackageName(android.content.Intent);
+ method @Deprecated public static void launchIntent(android.content.Context!, android.content.Intent!);
+ method @Deprecated public static void openBrowserAction(android.content.Context!, android.net.Uri!);
+ method @Deprecated public static void openBrowserAction(android.content.Context!, android.net.Uri!, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>!, android.app.PendingIntent!);
+ method @Deprecated public static java.util.List<androidx.browser.browseractions.BrowserActionItem!>! parseBrowserActionItems(java.util.ArrayList<android.os.Bundle!>!);
+ field @Deprecated public static final String ACTION_BROWSER_ACTIONS_OPEN = "androidx.browser.browseractions.browser_action_open";
+ field @Deprecated public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
+ field @Deprecated public static final String EXTRA_MENU_ITEMS = "androidx.browser.browseractions.extra.MENU_ITEMS";
+ field @Deprecated public static final String EXTRA_SELECTED_ACTION_PENDING_INTENT = "androidx.browser.browseractions.extra.SELECTED_ACTION_PENDING_INTENT";
+ field @Deprecated public static final String EXTRA_TYPE = "androidx.browser.browseractions.extra.TYPE";
+ field @Deprecated public static final int ITEM_COPY = 3; // 0x3
+ field @Deprecated public static final int ITEM_DOWNLOAD = 2; // 0x2
+ field @Deprecated public static final int ITEM_INVALID_ITEM = -1; // 0xffffffff
+ field @Deprecated public static final int ITEM_OPEN_IN_INCOGNITO = 1; // 0x1
+ field @Deprecated public static final int ITEM_OPEN_IN_NEW_TAB = 0; // 0x0
+ field @Deprecated public static final int ITEM_SHARE = 4; // 0x4
+ field @Deprecated public static final String KEY_ACTION = "androidx.browser.browseractions.ACTION";
+ field @Deprecated public static final String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
+ field @Deprecated public static final String KEY_TITLE = "androidx.browser.browseractions.TITLE";
+ field @Deprecated public static final int MAX_CUSTOM_ITEMS = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_AUDIO = 3; // 0x3
+ field @Deprecated public static final int URL_TYPE_FILE = 4; // 0x4
+ field @Deprecated public static final int URL_TYPE_IMAGE = 1; // 0x1
+ field @Deprecated public static final int URL_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int URL_TYPE_PLUGIN = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_VIDEO = 2; // 0x2
+ }
+
+ @Deprecated public static final class BrowserActionsIntent.Builder {
+ ctor @Deprecated public BrowserActionsIntent.Builder(android.content.Context!, android.net.Uri!);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent! build();
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setCustomItems(java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>!);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setCustomItems(androidx.browser.browseractions.BrowserActionItem!...);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setOnItemSelectedAction(android.app.PendingIntent!);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setUrlType(int);
+ }
+
+}
+
+package androidx.browser.customtabs {
+
+ public final class CustomTabColorSchemeParams {
+ field @ColorInt public final Integer? navigationBarColor;
+ field @ColorInt public final Integer? secondaryToolbarColor;
+ field @ColorInt public final Integer? toolbarColor;
+ }
+
+ public static final class CustomTabColorSchemeParams.Builder {
+ ctor public CustomTabColorSchemeParams.Builder();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams build();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setToolbarColor(@ColorInt int);
+ }
+
+ public class CustomTabsCallback {
+ ctor public CustomTabsCallback();
+ method public void extraCallback(String!, android.os.Bundle!);
+ method public void onMessageChannelReady(android.os.Bundle!);
+ method public void onNavigationEvent(int, android.os.Bundle!);
+ method public void onPostMessage(String!, android.os.Bundle!);
+ method public void onRelationshipValidationResult(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, boolean, android.os.Bundle!);
+ field public static final int NAVIGATION_ABORTED = 4; // 0x4
+ field public static final int NAVIGATION_FAILED = 3; // 0x3
+ field public static final int NAVIGATION_FINISHED = 2; // 0x2
+ field public static final int NAVIGATION_STARTED = 1; // 0x1
+ field public static final int TAB_HIDDEN = 6; // 0x6
+ field public static final int TAB_SHOWN = 5; // 0x5
+ }
+
+ public class CustomTabsClient {
+ method public static boolean bindCustomTabsService(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+ method public static boolean connectAndInitialize(android.content.Context, String);
+ method public android.os.Bundle? extraCommand(String, android.os.Bundle?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?, boolean);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?, int);
+ method public boolean warmup(long);
+ }
+
+ public final class CustomTabsIntent {
+ method public static androidx.browser.customtabs.CustomTabColorSchemeParams getColorSchemeParams(android.content.Intent, int);
+ method public static int getMaxToolbarItems();
+ method public void launchUrl(android.content.Context!, android.net.Uri!);
+ method public static android.content.Intent! setAlwaysUseBrowserUI(android.content.Intent!);
+ method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent!);
+ field public static final int COLOR_SCHEME_DARK = 2; // 0x2
+ field public static final int COLOR_SCHEME_LIGHT = 1; // 0x1
+ field public static final int COLOR_SCHEME_SYSTEM = 0; // 0x0
+ field public static final String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+ field public static final String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+ field public static final String EXTRA_COLOR_SCHEME = "androidx.browser.customtabs.extra.COLOR_SCHEME";
+ field public static final String EXTRA_COLOR_SCHEME_PARAMS = "androidx.browser.customtabs.extra.COLOR_SCHEME_PARAMS";
+ field public static final String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+ field public static final String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+ field public static final String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+ field public static final String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+ field public static final String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+ field public static final String EXTRA_NAVIGATION_BAR_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_COLOR";
+ field public static final String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+ field public static final String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+ field public static final String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+ field public static final String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+ field public static final String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+ field public static final String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+ field public static final String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+ field public static final String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+ field public static final String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+ field public static final String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+ field public static final String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+ field public static final String KEY_ICON = "android.support.customtabs.customaction.ICON";
+ field public static final String KEY_ID = "android.support.customtabs.customaction.ID";
+ field public static final String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+ field public static final String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+ field public static final int NO_TITLE = 0; // 0x0
+ field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+ field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+ field public final android.content.Intent intent;
+ field public final android.os.Bundle? startAnimationBundle;
+ }
+
+ public static final class CustomTabsIntent.Builder {
+ ctor public CustomTabsIntent.Builder();
+ ctor public CustomTabsIntent.Builder(androidx.browser.customtabs.CustomTabsSession?);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder addMenuItem(String, android.app.PendingIntent);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, String, android.app.PendingIntent!) throws java.lang.IllegalStateException;
+ method public androidx.browser.customtabs.CustomTabsIntent build();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent, boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorScheme(int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorSchemeParams(int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setInstantAppsEnabled(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[]?, android.app.PendingIntent?);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setToolbarColor(@ColorInt int);
+ }
+
+ public abstract class CustomTabsService extends android.app.Service {
+ ctor public CustomTabsService();
+ method protected boolean cleanUpSession(androidx.browser.customtabs.CustomTabsSessionToken!);
+ method protected abstract android.os.Bundle! extraCommand(String!, android.os.Bundle!);
+ method protected abstract boolean mayLaunchUrl(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
+ method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken!);
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken!, String!, android.os.Bundle!);
+ method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, int, android.os.Bundle?);
+ method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!);
+ method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken!, android.os.Bundle!);
+ method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
+ method protected abstract boolean warmup(long);
+ field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+ field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
+ field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
+ field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+ field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+ field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+ field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+ field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+ field public static final int RESULT_SUCCESS = 0; // 0x0
+ field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) public static @interface CustomTabsService.Relation {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RESULT_SUCCESS, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_DISALLOWED, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_REMOTE_ERROR, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_MESSAGING_ERROR}) public static @interface CustomTabsService.Result {
+ }
+
+ public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+ ctor public CustomTabsServiceConnection();
+ method public abstract void onCustomTabsServiceConnected(android.content.ComponentName!, androidx.browser.customtabs.CustomTabsClient!);
+ method public final void onServiceConnected(android.content.ComponentName!, android.os.IBinder!);
+ }
+
+ public final class CustomTabsSession {
+ method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+ method public boolean mayLaunchUrl(android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
+ method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String!, android.os.Bundle!);
+ method public boolean receiveFile(android.net.Uri, int, android.os.Bundle?);
+ method public boolean requestPostMessageChannel(android.net.Uri!);
+ method public boolean setActionButton(android.graphics.Bitmap, String);
+ method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
+ method @Deprecated public boolean setToolbarItem(int, android.graphics.Bitmap, String);
+ method public boolean validateRelationship(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+ }
+
+ public class CustomTabsSessionToken {
+ method public static androidx.browser.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+ method public androidx.browser.customtabs.CustomTabsCallback? getCallback();
+ method public static androidx.browser.customtabs.CustomTabsSessionToken? getSessionTokenFromIntent(android.content.Intent);
+ method public boolean isAssociatedWith(androidx.browser.customtabs.CustomTabsSession);
+ }
+
+ public class PostMessageService extends android.app.Service {
+ ctor public PostMessageService();
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ }
+
+ public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
+ ctor public PostMessageServiceConnection(androidx.browser.customtabs.CustomTabsSessionToken!);
+ method public boolean bindSessionToPostMessageService(android.content.Context!, String!);
+ method public final boolean notifyMessageChannelReady(android.os.Bundle!);
+ method public void onPostMessageServiceConnected();
+ method public void onPostMessageServiceDisconnected();
+ method public final void onServiceConnected(android.content.ComponentName!, android.os.IBinder!);
+ method public final void onServiceDisconnected(android.content.ComponentName!);
+ method public final boolean postMessage(String!, android.os.Bundle!);
+ method public void unbindFromContext(android.content.Context!);
+ }
+
+ public class TrustedWebUtils {
+ method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method public static boolean splashScreensAreSupported(android.content.Context, String, String);
+ method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
+ field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+ }
+
+}
+
+package androidx.browser.trusted {
+
+ public class TrustedWebActivityBuilder {
+ ctor public TrustedWebActivityBuilder(android.content.Context, android.net.Uri);
+ method public android.net.Uri getUrl();
+ method public void launchActivity(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.trusted.TrustedWebActivityBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+ method public androidx.browser.trusted.TrustedWebActivityBuilder setSplashScreenParams(android.os.Bundle);
+ field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+ field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+ }
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+ public final class SplashScreenParamKey {
+ field public static final String BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+ field public static final String FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+ field public static final String IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+ field public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+ field public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+ }
+
+ public final class SplashScreenVersion {
+ field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+ }
+
+}
+
diff --git a/browser/api/current.txt b/browser/api/current.txt
index 74b3fa0..4e2c30d 100644
--- a/browser/api/current.txt
+++ b/browser/api/current.txt
@@ -165,12 +165,15 @@
method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken!);
method public android.os.IBinder! onBind(android.content.Intent!);
method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken!, String!, android.os.Bundle!);
+ method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, int, android.os.Bundle?);
method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!);
method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken!, android.os.Bundle!);
method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
method protected abstract boolean warmup(long);
field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
- field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.trusted.category.NavBarColorCustomization";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+ field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
@@ -178,6 +181,7 @@
field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
field public static final int RESULT_SUCCESS = 0; // 0x0
+ field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
}
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) public static @interface CustomTabsService.Relation {
@@ -196,6 +200,7 @@
method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
method public boolean mayLaunchUrl(android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String!, android.os.Bundle!);
+ method public boolean receiveFile(android.net.Uri, int, android.os.Bundle?);
method public boolean requestPostMessageChannel(android.net.Uri!);
method public boolean setActionButton(android.graphics.Bitmap, String);
method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
@@ -228,9 +233,41 @@
}
public class TrustedWebUtils {
- method public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method public static boolean splashScreensAreSupported(android.content.Context, String, String);
+ method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
}
}
+package androidx.browser.trusted {
+
+ public class TrustedWebActivityBuilder {
+ ctor public TrustedWebActivityBuilder(android.content.Context, android.net.Uri);
+ method public android.net.Uri getUrl();
+ method public void launchActivity(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.trusted.TrustedWebActivityBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+ method public androidx.browser.trusted.TrustedWebActivityBuilder setSplashScreenParams(android.os.Bundle);
+ field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+ field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+ }
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+ public final class SplashScreenParamKey {
+ field public static final String BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+ field public static final String FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+ field public static final String IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+ field public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+ field public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+ }
+
+ public final class SplashScreenVersion {
+ field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/browser/api/res-1.2.0-alpha05.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to browser/api/res-1.2.0-alpha05.txt
diff --git a/browser/api/restricted_1.2.0-alpha04.txt b/browser/api/restricted_1.2.0-alpha04.txt
index 9a1f88d..2757731 100644
--- a/browser/api/restricted_1.2.0-alpha04.txt
+++ b/browser/api/restricted_1.2.0-alpha04.txt
@@ -183,7 +183,8 @@
method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
method protected abstract boolean warmup(long);
field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
- field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.trusted.category.NavBarColorCustomization";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
diff --git a/browser/api/restricted_1.2.0-alpha05.txt b/browser/api/restricted_1.2.0-alpha05.txt
new file mode 100644
index 0000000..8a1533f
--- /dev/null
+++ b/browser/api/restricted_1.2.0-alpha05.txt
@@ -0,0 +1,294 @@
+// Signature format: 3.0
+package androidx.browser.browseractions {
+
+ @Deprecated public class BrowserActionItem {
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
+ ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public BrowserActionItem(String, android.app.PendingIntent, android.net.Uri);
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent);
+ method @Deprecated public android.app.PendingIntent getAction();
+ method @Deprecated public int getIconId();
+ method @Deprecated public String getTitle();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class BrowserActionsFallbackMenuView extends android.widget.LinearLayout {
+ ctor public BrowserActionsFallbackMenuView(android.content.Context!, android.util.AttributeSet!);
+ }
+
+ @Deprecated public class BrowserActionsIntent {
+ method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
+ method @Deprecated public android.content.Intent getIntent();
+ method @Deprecated public static String? getUntrustedCreatorPackageName(android.content.Intent);
+ method @Deprecated public static void launchIntent(android.content.Context!, android.content.Intent!);
+ method @Deprecated public static void openBrowserAction(android.content.Context!, android.net.Uri!);
+ method @Deprecated public static void openBrowserAction(android.content.Context!, android.net.Uri!, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>!, android.app.PendingIntent!);
+ method @Deprecated public static java.util.List<androidx.browser.browseractions.BrowserActionItem!>! parseBrowserActionItems(java.util.ArrayList<android.os.Bundle!>!);
+ field @Deprecated public static final String ACTION_BROWSER_ACTIONS_OPEN = "androidx.browser.browseractions.browser_action_open";
+ field @Deprecated public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
+ field @Deprecated public static final String EXTRA_MENU_ITEMS = "androidx.browser.browseractions.extra.MENU_ITEMS";
+ field @Deprecated public static final String EXTRA_SELECTED_ACTION_PENDING_INTENT = "androidx.browser.browseractions.extra.SELECTED_ACTION_PENDING_INTENT";
+ field @Deprecated public static final String EXTRA_TYPE = "androidx.browser.browseractions.extra.TYPE";
+ field @Deprecated public static final int ITEM_COPY = 3; // 0x3
+ field @Deprecated public static final int ITEM_DOWNLOAD = 2; // 0x2
+ field @Deprecated public static final int ITEM_INVALID_ITEM = -1; // 0xffffffff
+ field @Deprecated public static final int ITEM_OPEN_IN_INCOGNITO = 1; // 0x1
+ field @Deprecated public static final int ITEM_OPEN_IN_NEW_TAB = 0; // 0x0
+ field @Deprecated public static final int ITEM_SHARE = 4; // 0x4
+ field @Deprecated public static final String KEY_ACTION = "androidx.browser.browseractions.ACTION";
+ field @Deprecated public static final String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
+ field @Deprecated public static final String KEY_TITLE = "androidx.browser.browseractions.TITLE";
+ field @Deprecated public static final int MAX_CUSTOM_ITEMS = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_AUDIO = 3; // 0x3
+ field @Deprecated public static final int URL_TYPE_FILE = 4; // 0x4
+ field @Deprecated public static final int URL_TYPE_IMAGE = 1; // 0x1
+ field @Deprecated public static final int URL_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int URL_TYPE_PLUGIN = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_VIDEO = 2; // 0x2
+ }
+
+ @Deprecated @IntDef({androidx.browser.browseractions.BrowserActionsIntent.ITEM_INVALID_ITEM, androidx.browser.browseractions.BrowserActionsIntent.ITEM_OPEN_IN_NEW_TAB, androidx.browser.browseractions.BrowserActionsIntent.ITEM_OPEN_IN_INCOGNITO, androidx.browser.browseractions.BrowserActionsIntent.ITEM_DOWNLOAD, androidx.browser.browseractions.BrowserActionsIntent.ITEM_COPY, androidx.browser.browseractions.BrowserActionsIntent.ITEM_SHARE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface BrowserActionsIntent.BrowserActionsItemId {
+ }
+
+ @Deprecated @IntDef({androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_NONE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_IMAGE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_VIDEO, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_AUDIO, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_FILE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_PLUGIN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface BrowserActionsIntent.BrowserActionsUrlType {
+ }
+
+ @Deprecated public static final class BrowserActionsIntent.Builder {
+ ctor @Deprecated public BrowserActionsIntent.Builder(android.content.Context!, android.net.Uri!);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent! build();
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setCustomItems(java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>!);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setCustomItems(androidx.browser.browseractions.BrowserActionItem!...);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setOnItemSelectedAction(android.app.PendingIntent!);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder! setUrlType(@androidx.browser.browseractions.BrowserActionsIntent.BrowserActionsUrlType int);
+ }
+
+
+}
+
+package androidx.browser.customtabs {
+
+ public final class CustomTabColorSchemeParams {
+ field @ColorInt public final Integer? navigationBarColor;
+ field @ColorInt public final Integer? secondaryToolbarColor;
+ field @ColorInt public final Integer? toolbarColor;
+ }
+
+ public static final class CustomTabColorSchemeParams.Builder {
+ ctor public CustomTabColorSchemeParams.Builder();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams build();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setToolbarColor(@ColorInt int);
+ }
+
+ public class CustomTabsCallback {
+ ctor public CustomTabsCallback();
+ method public void extraCallback(String!, android.os.Bundle!);
+ method public void onMessageChannelReady(android.os.Bundle!);
+ method public void onNavigationEvent(int, android.os.Bundle!);
+ method public void onPostMessage(String!, android.os.Bundle!);
+ method public void onRelationshipValidationResult(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, boolean, android.os.Bundle!);
+ field public static final int NAVIGATION_ABORTED = 4; // 0x4
+ field public static final int NAVIGATION_FAILED = 3; // 0x3
+ field public static final int NAVIGATION_FINISHED = 2; // 0x2
+ field public static final int NAVIGATION_STARTED = 1; // 0x1
+ field public static final int TAB_HIDDEN = 6; // 0x6
+ field public static final int TAB_SHOWN = 5; // 0x5
+ }
+
+ public class CustomTabsClient {
+ method public static boolean bindCustomTabsService(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+ method public static boolean connectAndInitialize(android.content.Context, String);
+ method public android.os.Bundle? extraCommand(String, android.os.Bundle?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?, boolean);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?, int);
+ method public boolean warmup(long);
+ }
+
+ public final class CustomTabsIntent {
+ method public static androidx.browser.customtabs.CustomTabColorSchemeParams getColorSchemeParams(android.content.Intent, @androidx.browser.customtabs.CustomTabsIntent.ColorScheme int);
+ method public static int getMaxToolbarItems();
+ method public void launchUrl(android.content.Context!, android.net.Uri!);
+ method public static android.content.Intent! setAlwaysUseBrowserUI(android.content.Intent!);
+ method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent!);
+ field public static final int COLOR_SCHEME_DARK = 2; // 0x2
+ field public static final int COLOR_SCHEME_LIGHT = 1; // 0x1
+ field public static final int COLOR_SCHEME_SYSTEM = 0; // 0x0
+ field public static final String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+ field public static final String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+ field public static final String EXTRA_COLOR_SCHEME = "androidx.browser.customtabs.extra.COLOR_SCHEME";
+ field public static final String EXTRA_COLOR_SCHEME_PARAMS = "androidx.browser.customtabs.extra.COLOR_SCHEME_PARAMS";
+ field public static final String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+ field public static final String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+ field public static final String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+ field public static final String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+ field public static final String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+ field public static final String EXTRA_NAVIGATION_BAR_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_COLOR";
+ field public static final String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+ field public static final String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+ field public static final String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+ field public static final String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+ field public static final String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+ field public static final String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+ field public static final String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+ field public static final String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+ field public static final String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+ field public static final String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+ field public static final String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+ field public static final String KEY_ICON = "android.support.customtabs.customaction.ICON";
+ field public static final String KEY_ID = "android.support.customtabs.customaction.ID";
+ field public static final String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+ field public static final String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+ field public static final int NO_TITLE = 0; // 0x0
+ field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+ field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+ field public final android.content.Intent intent;
+ field public final android.os.Bundle? startAnimationBundle;
+ }
+
+ public static final class CustomTabsIntent.Builder {
+ ctor public CustomTabsIntent.Builder();
+ ctor public CustomTabsIntent.Builder(androidx.browser.customtabs.CustomTabsSession?);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder addMenuItem(String, android.app.PendingIntent);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, String, android.app.PendingIntent!) throws java.lang.IllegalStateException;
+ method public androidx.browser.customtabs.CustomTabsIntent build();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent, boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorScheme(@androidx.browser.customtabs.CustomTabsIntent.ColorScheme int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorSchemeParams(@androidx.browser.customtabs.CustomTabsIntent.ColorScheme int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setInstantAppsEnabled(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[]?, android.app.PendingIntent?);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setToolbarColor(@ColorInt int);
+ }
+
+
+ public abstract class CustomTabsService extends android.app.Service {
+ ctor public CustomTabsService();
+ method protected boolean cleanUpSession(androidx.browser.customtabs.CustomTabsSessionToken!);
+ method protected abstract android.os.Bundle! extraCommand(String!, android.os.Bundle!);
+ method protected abstract boolean mayLaunchUrl(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
+ method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken!);
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken!, String!, android.os.Bundle!);
+ method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, @androidx.browser.customtabs.CustomTabsService.FilePurpose int, android.os.Bundle?);
+ method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!);
+ method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken!, android.os.Bundle!);
+ method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
+ method protected abstract boolean warmup(long);
+ field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+ field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
+ field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
+ field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+ field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+ field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+ field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+ field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+ field public static final int RESULT_SUCCESS = 0; // 0x0
+ field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
+ }
+
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) public static @interface CustomTabsService.Relation {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef({androidx.browser.customtabs.CustomTabsService.RESULT_SUCCESS, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_DISALLOWED, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_REMOTE_ERROR, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_MESSAGING_ERROR}) public static @interface CustomTabsService.Result {
+ }
+
+ public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+ ctor public CustomTabsServiceConnection();
+ method public abstract void onCustomTabsServiceConnected(android.content.ComponentName!, androidx.browser.customtabs.CustomTabsClient!);
+ method public final void onServiceConnected(android.content.ComponentName!, android.os.IBinder!);
+ }
+
+ public final class CustomTabsSession {
+ method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+ method public boolean mayLaunchUrl(android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
+ method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String!, android.os.Bundle!);
+ method public boolean receiveFile(android.net.Uri, @androidx.browser.customtabs.CustomTabsService.FilePurpose int, android.os.Bundle?);
+ method public boolean requestPostMessageChannel(android.net.Uri!);
+ method public boolean setActionButton(android.graphics.Bitmap, String);
+ method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
+ method @Deprecated public boolean setToolbarItem(int, android.graphics.Bitmap, String);
+ method public boolean validateRelationship(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+ }
+
+
+ public class CustomTabsSessionToken {
+ method public static androidx.browser.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+ method public androidx.browser.customtabs.CustomTabsCallback? getCallback();
+ method public static androidx.browser.customtabs.CustomTabsSessionToken? getSessionTokenFromIntent(android.content.Intent);
+ method public boolean isAssociatedWith(androidx.browser.customtabs.CustomTabsSession);
+ }
+
+
+ public class PostMessageService extends android.app.Service {
+ ctor public PostMessageService();
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ }
+
+ public abstract class PostMessageServiceConnection implements androidx.browser.customtabs.PostMessageBackend android.content.ServiceConnection {
+ ctor public PostMessageServiceConnection(androidx.browser.customtabs.CustomTabsSessionToken!);
+ method public boolean bindSessionToPostMessageService(android.content.Context!, String!);
+ method public final boolean notifyMessageChannelReady(android.os.Bundle!);
+ method public void onPostMessageServiceConnected();
+ method public void onPostMessageServiceDisconnected();
+ method public final void onServiceConnected(android.content.ComponentName!, android.os.IBinder!);
+ method public final void onServiceDisconnected(android.content.ComponentName!);
+ method public final boolean postMessage(String!, android.os.Bundle!);
+ method public void unbindFromContext(android.content.Context!);
+ }
+
+ public class TrustedWebUtils {
+ method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method public static boolean splashScreensAreSupported(android.content.Context, String, String);
+ method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
+ field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+ }
+
+}
+
+package androidx.browser.trusted {
+
+
+ public class TrustedWebActivityBuilder {
+ ctor public TrustedWebActivityBuilder(android.content.Context, android.net.Uri);
+ method public android.net.Uri getUrl();
+ method public void launchActivity(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.trusted.TrustedWebActivityBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+ method public androidx.browser.trusted.TrustedWebActivityBuilder setSplashScreenParams(android.os.Bundle);
+ field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+ field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+ }
+
+
+
+
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+ public final class SplashScreenParamKey {
+ field public static final String BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+ field public static final String FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+ field public static final String IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+ field public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+ field public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+ }
+
+ public final class SplashScreenVersion {
+ field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+ }
+
+}
+
diff --git a/browser/api/restricted_current.txt b/browser/api/restricted_current.txt
index 9a1f88d..8a1533f 100644
--- a/browser/api/restricted_current.txt
+++ b/browser/api/restricted_current.txt
@@ -178,12 +178,15 @@
method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken!);
method public android.os.IBinder! onBind(android.content.Intent!);
method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken!, String!, android.os.Bundle!);
+ method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, @androidx.browser.customtabs.CustomTabsService.FilePurpose int, android.os.Bundle?);
method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken!, android.net.Uri!);
method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken!, android.os.Bundle!);
method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken!, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri!, android.os.Bundle!);
method protected abstract boolean warmup(long);
field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
- field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.trusted.category.NavBarColorCustomization";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+ field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
@@ -191,6 +194,7 @@
field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
field public static final int RESULT_SUCCESS = 0; // 0x0
+ field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
}
@@ -210,6 +214,7 @@
method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
method public boolean mayLaunchUrl(android.net.Uri!, android.os.Bundle!, java.util.List<android.os.Bundle!>!);
method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String!, android.os.Bundle!);
+ method public boolean receiveFile(android.net.Uri, @androidx.browser.customtabs.CustomTabsService.FilePurpose int, android.os.Bundle?);
method public boolean requestPostMessageChannel(android.net.Uri!);
method public boolean setActionButton(android.graphics.Bitmap, String);
method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
@@ -244,17 +249,26 @@
}
public class TrustedWebUtils {
- method public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method public static boolean splashScreensAreSupported(android.content.Context, String, String);
+ method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
}
-
-
}
package androidx.browser.trusted {
+ public class TrustedWebActivityBuilder {
+ ctor public TrustedWebActivityBuilder(android.content.Context, android.net.Uri);
+ method public android.net.Uri getUrl();
+ method public void launchActivity(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.trusted.TrustedWebActivityBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+ method public androidx.browser.trusted.TrustedWebActivityBuilder setSplashScreenParams(android.os.Bundle);
+ field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+ field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+ }
@@ -262,3 +276,19 @@
}
+package androidx.browser.trusted.splashscreens {
+
+ public final class SplashScreenParamKey {
+ field public static final String BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+ field public static final String FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+ field public static final String IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+ field public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+ field public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+ }
+
+ public final class SplashScreenVersion {
+ field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+ }
+
+}
+
diff --git a/browser/src/androidTest/java/androidx/browser/trusted/TrustedWebActivityBuilderTest.java b/browser/src/androidTest/java/androidx/browser/trusted/TrustedWebActivityBuilderTest.java
index c94fcc6..d1531a1 100644
--- a/browser/src/androidTest/java/androidx/browser/trusted/TrustedWebActivityBuilderTest.java
+++ b/browser/src/androidTest/java/androidx/browser/trusted/TrustedWebActivityBuilderTest.java
@@ -32,8 +32,8 @@
import androidx.browser.customtabs.EnableComponentsTestRule;
import androidx.browser.customtabs.TestActivity;
import androidx.browser.customtabs.TestCustomTabsServiceSupportsTwas;
-import androidx.browser.customtabs.TrustedWebUtils;
import androidx.browser.customtabs.testutil.CustomTabConnectionRule;
+import androidx.browser.trusted.splashscreens.SplashScreenParamKey;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
import androidx.test.rule.ActivityTestRule;
@@ -86,7 +86,7 @@
Bundle splashScreenParams = new Bundle();
int splashBgColor = 0x112233;
splashScreenParams.putInt(
- TrustedWebUtils.SplashScreenParamKey.BACKGROUND_COLOR, splashBgColor);
+ SplashScreenParamKey.BACKGROUND_COLOR, splashBgColor);
final TrustedWebActivityBuilder builder =
new TrustedWebActivityBuilder(mActivity, url)
@@ -106,14 +106,14 @@
.isAssociatedWith(mSession));
assertEquals(url, intent.getData());
assertEquals(statusBarColor, intent.getIntExtra(CustomTabsIntent.EXTRA_TOOLBAR_COLOR, 0));
- assertEquals(additionalTrustedOrigins,
- intent.getStringArrayListExtra(TrustedWebUtils.EXTRA_ADDITIONAL_TRUSTED_ORIGINS));
+ assertEquals(additionalTrustedOrigins, intent.getStringArrayListExtra(
+ TrustedWebActivityBuilder.EXTRA_ADDITIONAL_TRUSTED_ORIGINS));
Bundle splashScreenParamsReceived =
- intent.getBundleExtra(TrustedWebUtils.EXTRA_SPLASH_SCREEN_PARAMS);
+ intent.getBundleExtra(TrustedWebActivityBuilder.EXTRA_SPLASH_SCREEN_PARAMS);
// No need to test every splash screen param: they are sent in as-is in provided Bundle.
assertEquals(splashBgColor, splashScreenParamsReceived.getInt(
- TrustedWebUtils.SplashScreenParamKey.BACKGROUND_COLOR));
+ SplashScreenParamKey.BACKGROUND_COLOR));
}
}
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
index 852babb..5212a28 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
@@ -56,15 +56,20 @@
* the color of the navigation bar ({@link CustomTabsIntent.Builder#setNavigationBarColor}).
*/
public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION =
- "androidx.browser.trusted.category.NavBarColorCustomization";
+ "androidx.browser.customtabs.category.NavBarColorCustomization";
+
+ /**
+ * An Intent filter category to signify that the Custom Tabs provider supports selecting and
+ * customizing color schemes via {@link CustomTabsIntent.Builder#setColorScheme} and
+ * {@link CustomTabsIntent.Builder#setColorSchemeParams}.
+ */
+ public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION =
+ "androidx.browser.customtabs.category.ColorSchemeCustomization";
/**
* An Intent filter category to signify that the Custom Tabs provider supports Trusted Web
- * Activities.
- *
- * @hide
+ * Activities (see {@link TrustedWebUtils} for more details).
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY)
public static final String TRUSTED_WEB_ACTIVITY_CATEGORY =
"androidx.browser.trusted.category.TrustedWebActivities";
@@ -126,18 +131,16 @@
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
@Retention(RetentionPolicy.SOURCE)
- @IntDef({FILE_PURPOSE_TWA_SPLASH_IMAGE})
+ @IntDef({FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE})
public @interface FilePurpose {
}
/**
- * File is a splash image to be shown on top of a Trusted Web Activity while the web contents
+ * A constant to be used with {@link CustomTabsSession#receiveFile} indicating that the file
+ * is a splash image to be shown on top of a Trusted Web Activity while the web contents
* are loading.
- *
- * @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY)
- public static final int FILE_PURPOSE_TWA_SPLASH_IMAGE = 1;
+ public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1;
final SimpleArrayMap<IBinder, DeathRecipient> mDeathRecipientMap = new SimpleArrayMap<>();
@@ -407,10 +410,7 @@
* {@code CustomTabsService#FilePurpose}.
* @param extras Reserved for future use.
* @return {@code true} if the file was received successfully.
- *
- * @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY)
protected abstract boolean receiveFile(@NonNull CustomTabsSessionToken sessionToken,
@NonNull Uri uri, @FilePurpose int purpose, @Nullable Bundle extras);
}
diff --git a/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
index e90cd1f..2746f1b 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsSession.java
@@ -277,10 +277,7 @@
* {@code CustomTabsService#FilePurpose}.
* @param extras Reserved for future use.
* @return {@code true} if the file was received successfully.
- *
- * @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY)
public boolean receiveFile(@NonNull Uri uri, @CustomTabsService.FilePurpose int purpose,
@Nullable Bundle extras) {
if (extras == null) {
diff --git a/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java b/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
index d3690e43..d287b43 100644
--- a/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
+++ b/browser/src/main/java/androidx/browser/customtabs/TrustedWebUtils.java
@@ -23,19 +23,17 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.graphics.Matrix;
import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
-import androidx.annotation.StringDef;
+import androidx.annotation.WorkerThread;
+import androidx.browser.trusted.TrustedWebActivityBuilder;
import androidx.core.app.BundleCompat;
import androidx.core.content.FileProvider;
import java.io.File;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
/**
* Class for utilities and convenience calls for opening a qualifying web page as a
@@ -67,13 +65,6 @@
"android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
/**
- * @hide
- */
- @RestrictTo(RestrictTo.Scope.LIBRARY)
- public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS =
- "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
-
- /**
* @see #launchBrowserSiteSettings
*
* @hide
@@ -82,94 +73,6 @@
public static final String ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA =
"android.support.customtabs.action.ACTION_MANAGE_TRUSTED_WEB_ACTIVITY_DATA";
- /**
- * Extra that stores the {@link Bundle} of splash screen parameters, see
- * {@link SplashScreenParamKey}.
- *
- * @hide
- */
- @RestrictTo(RestrictTo.Scope.LIBRARY)
- public static final String EXTRA_SPLASH_SCREEN_PARAMS =
- "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
-
-
- /**
- * The keys of the entries in the {@link Bundle} passed in {@link #EXTRA_SPLASH_SCREEN_PARAMS}.
- *
- * @hide
- */
- @RestrictTo(RestrictTo.Scope.LIBRARY)
- public interface SplashScreenParamKey {
- /**
- * The version of splash screens to use.
- * The value must be one of {@link SplashScreenVersion}.
- */
- String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
-
- /**
- * The background color of the splash screen.
- * The value must be an integer representing the color in RGB (alpha channel is ignored if
- * provided). The default is white.
- */
- String BACKGROUND_COLOR =
- "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
-
- /**
- * The {@link android.widget.ImageView.ScaleType} to apply to the image on the splash
- * screen.
- * The value must be an integer - the ordinal of the ScaleType.
- * The default is {@link android.widget.ImageView.ScaleType#CENTER}.
- */
- String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
-
- /**
- * The transformation matrix to apply to the image on the splash screen. See
- * {@link android.widget.ImageView#setImageMatrix}. Only needs to be provided if the scale
- * type is {@link android.widget.ImageView.ScaleType#MATRIX}.
- * The value must be an array of 9 floats or null. This array can be retrieved from
- * {@link Matrix#getValues)}. The default is null.
- */
- String IMAGE_TRANSFORMATION_MATRIX =
- "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
-
- /**
- * The duration of fade out animation in milliseconds to be played when removing splash
- * screen.
- * The value must be provided as an int. The default is 0 (no animation).
- */
- String FADE_OUT_DURATION_MS =
- "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
- }
-
-
-
-
- /**
- * These constants are the categories the providers add to the intent filter of
- * CustomTabService implementation to declare the support of a particular version of splash
- * screens. The are also passed by the client as the value for the key
- * {@link SplashScreenParamKey#VERSION} when launching a Trusted Web Activity.
- *
- * @hide
- */
- @RestrictTo(RestrictTo.Scope.LIBRARY)
- @StringDef({SplashScreenVersion.V1})
- @Retention(RetentionPolicy.SOURCE)
- public @interface SplashScreenVersion {
- /**
- * The splash screen is transferred via {@link CustomTabsSession#receiveFile},
- * and then used by Trusted Web Activity when it is launched.
- *
- * The passed image is shown in a full-screen ImageView.
- * The following parameters are supported:
- * - {@link SplashScreenParamKey#BACKGROUND_COLOR},
- * - {@link SplashScreenParamKey#SCALE_TYPE},
- * - {@link SplashScreenParamKey#IMAGE_TRANSFORMATION_MATRIX}
- * - {@link SplashScreenParamKey#FADE_OUT_DURATION_MS}.
- */
- String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
- }
-
private TrustedWebUtils() {}
/**
@@ -209,14 +112,15 @@
* Note: you can call this method prior to connecting to a {@link CustomTabsService}. This way,
* if true is returned, the splash screen can be shown as soon as possible.
*
- * TODO(pshmakov): make TwaProviderPicker gather supported features, including splash screens,
- * to avoid extra PackageManager queries.
- *
- * @hide
+ * @param context {@link Context} to use.
+ * @param packageName The package name of the Custom Tabs provider to check.
+ * @param version The splash screen version/feature you are testing for support. Use a value
+ * from {@link androidx.browser.trusted.splashscreens.SplashScreenVersion}.
+ * @return Whether the specified Custom Tabs provider supports the specified splash screen
+ * feature/version.
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY)
- public static boolean splashScreensAreSupported(Context context, String packageName,
- @SplashScreenVersion String version) {
+ public static boolean splashScreensAreSupported(@NonNull Context context,
+ @NonNull String packageName, @NonNull String version) {
Intent serviceIntent = new Intent()
.setAction(CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION)
.setPackage(packageName);
@@ -230,6 +134,9 @@
* Transfers the splash image to a Custom Tabs provider. The reading and decoding of the image
* happens synchronously, so it's recommended to call this method on a worker thread.
*
+ * This method should be called prior to {@link TrustedWebActivityBuilder#launchActivity}.
+ * Pass additional parameters, such as background color, using
+ * {@link TrustedWebActivityBuilder#setSplashScreenParams(Bundle)}.
*
* @param context {@link Context} to use.
* @param file {@link File} with the image.
@@ -238,20 +145,15 @@
* @param packageName Package name of Custom Tabs provider.
* @param session {@link CustomTabsSession} established with the Custom Tabs provider.
* @return True if the image was received and processed successfully.
- *
- * @hide
*/
- @RestrictTo(RestrictTo.Scope.LIBRARY)
- public static boolean transferSplashImage(Context context, File file,
- String fileProviderAuthority, String packageName, CustomTabsSession session) {
- // TODO(peconn): Return this comment to the javadoc once TWABuilder is not hidden.
- // This method should be called prior to {@link TrustedWebActivityBuilder#launchActivity}.
- // Pass additional parameters, such as background color, using
- // {@link TrustedWebActivityBuilder#setSplashScreenParams(Bundle)}.
-
+ @WorkerThread
+ public static boolean transferSplashImage(@NonNull Context context, @NonNull File file,
+ @NonNull String fileProviderAuthority, @NonNull String packageName,
+ @NonNull CustomTabsSession session) {
Uri uri = FileProvider.getUriForFile(context, fileProviderAuthority, file);
context.grantUriPermission(packageName, uri, FLAG_GRANT_READ_URI_PERMISSION);
- return session.receiveFile(uri, CustomTabsService.FILE_PURPOSE_TWA_SPLASH_IMAGE, null);
+ return session.receiveFile(uri,
+ CustomTabsService.FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE, null);
}
/**
@@ -267,8 +169,10 @@
* associated with browser toolbar controls will be ignored.
* @param uri The web page to launch as Trusted Web Activity.
*
- * TODO(peconn): Deprecate with API change.
+ * @deprecated Use {@link TrustedWebActivityBuilder} and
+ * {@link TrustedWebActivityBuilder#launchActivity} instead.
*/
+ @Deprecated
public static void launchAsTrustedWebActivity(@NonNull Context context,
@NonNull CustomTabsIntent customTabsIntent, @NonNull Uri uri) {
if (BundleCompat.getBinder(
diff --git a/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityBuilder.java b/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityBuilder.java
index 1b42e41..9c456cd 100644
--- a/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityBuilder.java
+++ b/browser/src/main/java/androidx/browser/trusted/TrustedWebActivityBuilder.java
@@ -16,54 +16,77 @@
package androidx.browser.trusted;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.browser.customtabs.CustomTabsIntent;
import androidx.browser.customtabs.CustomTabsSession;
import androidx.browser.customtabs.TrustedWebUtils;
+import androidx.browser.trusted.splashscreens.SplashScreenParamKey;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
/**
- * Constructs and launches an intent to start a Trusted Web Activity.
- *
- * @hide
+ * Constructs and launches an intent to start a Trusted Web Activity (see {@link TrustedWebUtils}
+ * for more details).
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY)
public class TrustedWebActivityBuilder {
+ /**
+ * Extra for the Trusted Web Activity launch Intent to specify a {@link Bundle} of parameters
+ * for the browser to use in constructing a splash screen.
+ *
+ * It is recommended to use {@link TrustedWebActivityBuilder} instead of manually piecing the
+ * Intent together.
+ */
+ @SuppressLint("ActionValue")
+ public static final String EXTRA_SPLASH_SCREEN_PARAMS =
+ "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+
+ /**
+ * Extra for the Trusted Web Activity launch Intent to specify a list of origins for the
+ * browser to treat as trusted, in addition to the origin of the launching URL.
+ *
+ * It is recommended to use {@link TrustedWebActivityBuilder} instead of manually piecing the
+ * Intent together.
+ */
+ @SuppressLint("ActionValue")
+ public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS =
+ "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+
private final Context mContext;
private final Uri mUri;
- @Nullable
- private Integer mStatusBarColor;
-
- @Nullable
- private List<String> mAdditionalTrustedOrigins;
-
- @Nullable
- private Bundle mSplashScreenParams;
+ @Nullable private Integer mStatusBarColor;
+ @Nullable private List<String> mAdditionalTrustedOrigins;
+ @Nullable private Bundle mSplashScreenParams;
/**
* Creates a Builder given the required parameters.
* @param context {@link Context} to use.
* @param uri The web page to launch as Trusted Web Activity.
*/
- public TrustedWebActivityBuilder(Context context, Uri uri) {
+ public TrustedWebActivityBuilder(@NonNull Context context, @NonNull Uri uri) {
mContext = context;
mUri = uri;
}
/**
* Sets the status bar color to be seen while the Trusted Web Activity is running.
+ *
+ * @hide
*/
- public TrustedWebActivityBuilder setStatusBarColor(int color) {
+ @RestrictTo(RestrictTo.Scope.LIBRARY)
+ @NonNull
+ public TrustedWebActivityBuilder setStatusBarColor(@ColorInt int color) {
mStatusBarColor = color;
return this;
}
@@ -80,15 +103,16 @@
* Alternatively, use {@link CustomTabsSession#validateRelationship} to validate additional
* origins asynchronously, but that would delay launching the Trusted Web Activity.
*/
- public TrustedWebActivityBuilder setAdditionalTrustedOrigins(List<String> origins) {
+ @NonNull
+ public TrustedWebActivityBuilder setAdditionalTrustedOrigins(
+ @NonNull List<String> origins) {
mAdditionalTrustedOrigins = origins;
return this;
}
/**
* Sets the parameters of a splash screen shown while the web page is loading, such as
- * background color. See {@link TrustedWebUtils.SplashScreenParamKey} for a list of supported
- * parameters.
+ * background color. See {@link SplashScreenParamKey} for a list of supported parameters.
*
* To provide the image for the splash screen, use {@link TrustedWebUtils#transferSplashImage},
* prior to calling {@link #launchActivity} on the builder.
@@ -101,7 +125,8 @@
* The splash screen will be removed on the first paint of the page, or when the page load
* fails.
*/
- public TrustedWebActivityBuilder setSplashScreenParams(Bundle splashScreenParams) {
+ @NonNull
+ public TrustedWebActivityBuilder setSplashScreenParams(@NonNull Bundle splashScreenParams) {
mSplashScreenParams = splashScreenParams;
return this;
}
@@ -112,7 +137,7 @@
*
* @param session The {@link CustomTabsSession} to use for launching a Trusted Web Activity.
*/
- public void launchActivity(CustomTabsSession session) {
+ public void launchActivity(@NonNull CustomTabsSession session) {
if (session == null) {
throw new NullPointerException("CustomTabsSession is required for launching a TWA");
}
@@ -127,12 +152,12 @@
intent.setData(mUri);
intent.putExtra(TrustedWebUtils.EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY, true);
if (mAdditionalTrustedOrigins != null) {
- intent.putExtra(TrustedWebUtils.EXTRA_ADDITIONAL_TRUSTED_ORIGINS,
+ intent.putExtra(EXTRA_ADDITIONAL_TRUSTED_ORIGINS,
new ArrayList<>(mAdditionalTrustedOrigins));
}
if (mSplashScreenParams != null) {
- intent.putExtra(TrustedWebUtils.EXTRA_SPLASH_SCREEN_PARAMS, mSplashScreenParams);
+ intent.putExtra(EXTRA_SPLASH_SCREEN_PARAMS, mSplashScreenParams);
}
ContextCompat.startActivity(mContext, intent, null);
}
@@ -140,16 +165,20 @@
/**
* Returns the {@link Uri} to be launched with this Builder.
*/
+ @NonNull
public Uri getUrl() {
return mUri;
}
/**
- * Returns the color set via {@link #setStatusBarColor(int)} or null if not set.
+ * Returns the color set via {@link #setStatusBarColor(int)} or {@code null} if not set.
+ *
+ * @hide
*/
+ @RestrictTo(RestrictTo.Scope.LIBRARY)
@Nullable
+ @ColorInt
public Integer getStatusBarColor() {
return mStatusBarColor;
}
-
}
diff --git a/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenParamKey.java b/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenParamKey.java
new file mode 100644
index 0000000..543d966
--- /dev/null
+++ b/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenParamKey.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.browser.trusted.splashscreens;
+
+import android.os.Bundle;
+
+import androidx.browser.trusted.TrustedWebActivityBuilder;
+
+/**
+ * The keys of the entries in the {@link Bundle} passed to
+ * {@link TrustedWebActivityBuilder#setSplashScreenParams}. This Bundle can also be assembled
+ * manually and added to the launch Intent as an extra with the key
+ * {@link TrustedWebActivityBuilder#EXTRA_SPLASH_SCREEN_PARAMS}.
+ */
+public final class SplashScreenParamKey {
+ /**
+ * The version of splash screens to use.
+ * The value must be one of {@link SplashScreenVersion}.
+ */
+ public static final String VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+
+ /**
+ * The background color of the splash screen.
+ * The value must be an integer representing the color in RGB (alpha channel is ignored if
+ * provided). The default is white.
+ */
+ public static final String BACKGROUND_COLOR =
+ "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+
+ /**
+ * The {@link android.widget.ImageView.ScaleType} to apply to the image on the splash
+ * screen.
+ * The value must be an integer - the ordinal of the ScaleType.
+ * The default is {@link android.widget.ImageView.ScaleType#CENTER}.
+ */
+ public static final String SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+
+ /**
+ * The transformation matrix to apply to the image on the splash screen. See
+ * {@link android.widget.ImageView#setImageMatrix}. Only needs to be provided if the scale
+ * type is {@link android.widget.ImageView.ScaleType#MATRIX}.
+ * The value must be an array of 9 floats or null. This array can be retrieved from
+ * {@link android.graphics.Matrix#getValues(float[])}. The default is null.
+ */
+ public static final String IMAGE_TRANSFORMATION_MATRIX =
+ "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+
+ /**
+ * The duration of fade out animation in milliseconds to be played when removing splash
+ * screen.
+ * The value must be provided as an int. The default is 0 (no animation).
+ */
+ public static final String FADE_OUT_DURATION_MS =
+ "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+
+ private SplashScreenParamKey() {}
+}
diff --git a/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenVersion.java b/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenVersion.java
new file mode 100644
index 0000000..a3625ff
--- /dev/null
+++ b/browser/src/main/java/androidx/browser/trusted/splashscreens/SplashScreenVersion.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.browser.trusted.splashscreens;
+
+import androidx.browser.customtabs.CustomTabsSession;
+
+/**
+ * These constants are the categories the providers add to the intent filter of
+ * CustomTabService implementation to declare the support of a particular version of splash
+ * screens. The are also passed by the client as the value for the key
+ * {@link SplashScreenParamKey#VERSION} when launching a Trusted Web Activity.
+ */
+public final class SplashScreenVersion {
+ /**
+ * The splash screen is transferred via {@link CustomTabsSession#receiveFile},
+ * and then used by Trusted Web Activity when it is launched.
+ *
+ * The passed image is shown in a full-screen ImageView.
+ * The following parameters are supported:
+ * - {@link SplashScreenParamKey#BACKGROUND_COLOR},
+ * - {@link SplashScreenParamKey#SCALE_TYPE},
+ * - {@link SplashScreenParamKey#IMAGE_TRANSFORMATION_MATRIX}
+ * - {@link SplashScreenParamKey#FADE_OUT_DURATION_MS}.
+ */
+ public static final String V1 =
+ "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+
+ private SplashScreenVersion() {}
+}
diff --git a/buildSrc/dependencies.gradle b/buildSrc/dependencies.gradle
index c40df59..6c39faa 100644
--- a/buildSrc/dependencies.gradle
+++ b/buildSrc/dependencies.gradle
@@ -16,11 +16,6 @@
// Add ext.libs for library versions
def libs = [:]
-libs.exclude_annotations_transitive = {
- exclude group: 'androidx.annotation'
- transitive = true
-}
-
libs.exclude_bytebuddy = {
exclude group: 'net.bytebuddy'
}
@@ -36,9 +31,4 @@
exclude group: 'androidx.core'
}
-libs.support_exclude_config = {
- exclude group: 'android.arch.core'
- exclude group: 'androidx.lifecycle'
-}
-
rootProject.ext['libs'] = libs
diff --git a/buildSrc/jetpad-integration/src/main/java/androidx/build/jetpad/LibraryBuildInfoFile.java b/buildSrc/jetpad-integration/src/main/java/androidx/build/jetpad/LibraryBuildInfoFile.java
index e23bf0f..eebb259 100644
--- a/buildSrc/jetpad-integration/src/main/java/androidx/build/jetpad/LibraryBuildInfoFile.java
+++ b/buildSrc/jetpad-integration/src/main/java/androidx/build/jetpad/LibraryBuildInfoFile.java
@@ -29,6 +29,8 @@
public String groupId;
public String artifactId;
public String version;
+ public String path;
+ public Boolean groupIdRequiresSameVersion;
public ArrayList<Dependency> dependencies;
public ArrayList<Check> checks;
diff --git a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
index 2595865..4572ea8 100644
--- a/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt
@@ -423,7 +423,7 @@
!project.hasProperty("android.injected.invoked.from.ide") &&
!project.isBenchmark()
- // Set the officially published version to be the release version with minimum dependency
+ // Set the officially published version to be the debug version with minimum dependency
// versions.
defaultPublishConfig(Release.DEFAULT_PUBLISH_CONFIG)
diff --git a/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt b/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
index 0e12bcd..f4b47a4 100644
--- a/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
@@ -45,6 +45,20 @@
return "${project.group}_${project.name}_build_info.txt"
}
+ /* Returns the local project directory without the full framework/support root directory path */
+ private fun getProjectSpecificDirectory(): String {
+ return project.projectDir.toString().removePrefix(project.rootDir.toString())
+ }
+
+ /* Returns whether or not the groupId of the project requires the same version for all
+ * artifactIds. See CheckSameVersionLibraryGroupsTask.kt
+ */
+ private fun requiresSameVersion(): Boolean {
+ val library =
+ project.extensions.findByType(AndroidXExtension::class.java)
+ return library?.mavenGroup?.requireSameVersion ?: false
+ }
+
private fun writeJsonToFile(info: LibraryBuildInfoFile) {
if (!project.getBuildInfoDirectory().exists()) {
if (!project.getBuildInfoDirectory().mkdirs()) {
@@ -71,28 +85,37 @@
libraryBuildInfoFile.artifactId = project.name.toString()
libraryBuildInfoFile.groupId = project.group.toString()
libraryBuildInfoFile.version = project.version.toString()
+ libraryBuildInfoFile.path = getProjectSpecificDirectory()
+ libraryBuildInfoFile.groupIdRequiresSameVersion = requiresSameVersion()
val libraryDependencies = ArrayList<LibraryBuildInfoFile.Dependency>()
val checks = ArrayList<LibraryBuildInfoFile.Check>()
libraryBuildInfoFile.checks = checks
val publishedProjects = project.getProjectsMap()
- project.configurations.all { configuration ->
+ project.configurations.filter {
+ /* Ignore test configuration dependencies */
+ !it.name.contains("test", ignoreCase = true)
+ }.forEach { configuration ->
configuration.allDependencies.forEach { dep ->
// Only consider androidx dependencies
if (dep.group != null &&
dep.group.toString().startsWith("androidx.") &&
- !dep.group.toString().startsWith("androidx.test")) {
- if ((dep is ProjectDependency && publishedProjects
- .containsKey("${dep.group}:${dep.name}")) ||
- dep is ExternalModuleDependency) {
- val androidXPublishedDependency = LibraryBuildInfoFile().Dependency()
- androidXPublishedDependency.artifactId = dep.name.toString()
- androidXPublishedDependency.groupId = dep.group.toString()
- androidXPublishedDependency.version = dep.version.toString()
- androidXPublishedDependency.isTipOfTree = dep is ProjectDependency
- addDependencyToListIfNotAlreadyAdded(libraryDependencies,
- androidXPublishedDependency)
- }
+ !dep.group.toString().startsWith("androidx.test")
+ ) {
+ if ((dep is ProjectDependency && publishedProjects
+ .containsKey("${dep.group}:${dep.name}")) ||
+ dep is ExternalModuleDependency
+ ) {
+ val androidXPublishedDependency = LibraryBuildInfoFile().Dependency()
+ androidXPublishedDependency.artifactId = dep.name.toString()
+ androidXPublishedDependency.groupId = dep.group.toString()
+ androidXPublishedDependency.version = dep.version.toString()
+ androidXPublishedDependency.isTipOfTree = dep is ProjectDependency
+ addDependencyToListIfNotAlreadyAdded(
+ libraryDependencies,
+ androidXPublishedDependency
+ )
}
+ }
}
}
libraryBuildInfoFile.dependencies = libraryDependencies
diff --git a/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt b/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
index 8dc4654..ce48d8e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/DiffAndDocs.kt
@@ -340,22 +340,19 @@
library: LibraryExtension,
extension: AndroidXExtension
) {
-
registerPrebuilts(extension)
- library.libraryVariants.all { variant ->
- if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
- // include R.file generated for prebuilts
- rules.filter { it.resolve(extension)?.strategy is Prebuilts }.forEach { rule ->
- docsTasks[rule.name]?.configure {
- it.include { fileTreeElement ->
- fileTreeElement.path.endsWith(variant.rFile())
- }
+ library.defaultPublishVariant { variant ->
+ // include R.file generated for prebuilts
+ rules.filter { it.resolve(extension)?.strategy is Prebuilts }.forEach { rule ->
+ docsTasks[rule.name]?.configure {
+ it.include { fileTreeElement ->
+ fileTreeElement.path.endsWith(variant.rFile())
}
}
+ }
- tipOfTreeTasks(extension) { task ->
- registerAndroidProjectForDocsTask(task, variant)
- }
+ tipOfTreeTasks(extension) { task ->
+ registerAndroidProjectForDocsTask(task, variant)
}
}
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
index 30d3f58..3d62b43 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryGroups.kt
@@ -66,7 +66,6 @@
val PAGING = LibraryGroup("androidx.paging")
val PALETTE = LibraryGroup("androidx.palette")
val PERCENTLAYOUT = LibraryGroup("androidx.percentlayout")
- val PERSISTENCE = LibraryGroup("androidx.sqlite")
val PREFERENCE = LibraryGroup("androidx.preference")
val PRINT = LibraryGroup("androidx.print")
val RECOMMENDATION = LibraryGroup("androidx.recommendation")
@@ -78,6 +77,7 @@
val SHARETARGET = LibraryGroup("androidx.sharetarget")
val SLICE = LibraryGroup("androidx.slice", false)
val SLIDINGPANELAYOUT = LibraryGroup("androidx.slidingpanelayout")
+ val SQLITE = LibraryGroup("androidx.sqlite")
val SWIPEREFRESHLAYOUT = LibraryGroup("androidx.swiperefreshlayout")
val TESTSCREENSHOT = LibraryGroup("androidx.test.screenshot")
val TEXTCLASSIFIER = LibraryGroup("androidx.textclassifier")
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 16e02790..6284d20 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -33,7 +33,7 @@
val AUTOFILL = Version("1.0.0-alpha02")
val BENCHMARK = Version("1.0.0-alpha04")
val BIOMETRIC = Version("1.0.0-alpha05")
- val BROWSER = Version("1.2.0-alpha04")
+ val BROWSER = Version("1.2.0-alpha05")
val CAMERA = Version("1.0.0-alpha04")
val CAR = Version("1.0.0-alpha8")
val CAR_CLUSTER = Version("1.0.0-alpha6")
@@ -75,13 +75,12 @@
val MEDIA2_EXOPLAYER = Version("1.0.0-rc01")
val MEDIA2_WIDGET = Version("1.0.0-beta02")
val MEDIAROUTER = Version("1.2.0-alpha01")
- val NAVIGATION = Version("2.1.0-beta01")
+ val NAVIGATION = Version("2.2.0-alpha01")
val NAVIGATION_TESTING = Version("1.0.0-alpha08") // Unpublished
val PAGING = Version("2.2.0-alpha01")
val PALETTE = Version("1.1.0-alpha01")
val PRINT = Version("1.1.0-alpha01")
val PERCENTLAYOUT = Version("1.1.0-alpha01")
- val PERSISTENCE = Version("2.0.1")
val PREFERENCE = Version("1.2.0-alpha01")
val RECOMMENDATION = Version("1.1.0-alpha01")
val RECYCLERVIEW = Version("1.1.0-beta02")
@@ -96,6 +95,7 @@
val SLICE_BENCHMARK = Version("1.1.0-alpha02")
val SLICE_BUILDERS_KTX = Version("1.0.0-alpha08")
val SLIDINGPANELAYOUT = Version("1.1.0-alpha01")
+ val SQLITE = Version("2.1.0-alpha01")
val SWIPE_REFRESH_LAYOUT = Version("1.1.0-alpha03")
val TEST_SCREENSHOT = Version("1.0.0-alpha01")
val TEXTCLASSIFIER = Version("1.0.0-alpha03")
@@ -106,8 +106,8 @@
val VECTORDRAWABLE_ANIMATED = Version("1.2.0-alpha01")
val VERSIONED_PARCELABLE = Version("1.2.0-alpha01")
val VIEWPAGER = Version("1.1.0-alpha01")
- val VIEWPAGER2 = Version("1.0.0-beta00")
+ val VIEWPAGER2 = Version("1.0.0-beta01")
val WEAR = Version("1.1.0-alpha01")
val WEBKIT = Version("1.1.0-alpha02")
- val WORK = Version("2.1.0")
+ val WORK = Version("2.3.0-alpha01")
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index d16af59..989d679 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -86,11 +86,10 @@
ignore(LibraryGroups.NAVIGATION.group, "navigation-testing")
ignore(LibraryGroups.NAVIGATION.group, "navigation-safe-args-generator")
ignore(LibraryGroups.NAVIGATION.group, "navigation-safe-args-gradle-plugin")
- prebuilts(LibraryGroups.NAVIGATION, "2.1.0-alpha06")
+ prebuilts(LibraryGroups.NAVIGATION, "2.1.0-beta01")
prebuilts(LibraryGroups.PAGING, "2.1.0")
prebuilts(LibraryGroups.PALETTE, "1.0.0")
prebuilts(LibraryGroups.PERCENTLAYOUT, "1.0.0")
- prebuilts(LibraryGroups.PERSISTENCE, "2.0.0")
prebuilts(LibraryGroups.PREFERENCE, "preference-ktx", "1.1.0-rc01")
prebuilts(LibraryGroups.PREFERENCE, "1.1.0-rc01")
prebuilts(LibraryGroups.PRINT, "1.0.0")
@@ -112,6 +111,7 @@
ignore(LibraryGroups.SLICE.group, "slice-test")
prebuilts(LibraryGroups.SLICE, "slice-view", "1.1.0-alpha01")
prebuilts(LibraryGroups.SLIDINGPANELAYOUT, "1.0.0")
+ prebuilts(LibraryGroups.SQLITE, "2.0.0")
prebuilts(LibraryGroups.SWIPEREFRESHLAYOUT, "1.1.0-alpha02")
prebuilts(LibraryGroups.TEXTCLASSIFIER, "1.0.0-alpha02")
prebuilts(LibraryGroups.TRANSITION, "1.2.0-beta01")
diff --git a/buildSrc/src/main/kotlin/androidx/build/Release.kt b/buildSrc/src/main/kotlin/androidx/build/Release.kt
index 9ec8adb..c148ee7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/Release.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/Release.kt
@@ -16,6 +16,8 @@
package androidx.build
import androidx.build.gmaven.GMavenVersionChecker
+import com.android.build.gradle.LibraryExtension
+import com.android.build.gradle.api.LibraryVariant
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.tasks.TaskProvider
@@ -301,6 +303,17 @@
}
/**
+ * Let you configure a library variant associated with [Release.DEFAULT_PUBLISH_CONFIG]
+ */
+fun LibraryExtension.defaultPublishVariant(config: (LibraryVariant) -> Unit) {
+ libraryVariants.all { variant ->
+ if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
+ config(variant)
+ }
+ }
+}
+
+/**
* Converts the maven group into a readable task name.
*/
private fun groupToTaskNameSuffix(group: String): String {
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index a8cabd0..93ee0b7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -36,7 +36,7 @@
const val ESPRESSO_IDLING_RESOURCE = "androidx.test.espresso:espresso-idling-resource:3.1.0"
const val FINDBUGS = "com.google.code.findbugs:jsr305:3.0.2"
const val GCM_NETWORK_MANAGER = "com.google.android.gms:play-services-gcm:17.0.0"
-const val GOOGLE_COMPILE_TESTING = "com.google.testing.compile:compile-testing:0.11"
+const val GOOGLE_COMPILE_TESTING = "com.google.testing.compile:compile-testing:0.18"
const val GSON = "com.google.code.gson:gson:2.8.0"
const val GUAVA = "com.google.guava:guava:27.0.1-jre"
const val GUAVA_ANDROID = "com.google.guava:guava:27.0.1-android"
diff --git a/buildSrc/src/main/kotlin/androidx/build/dokka/DokkaSourceDocs.kt b/buildSrc/src/main/kotlin/androidx/build/dokka/DokkaSourceDocs.kt
index beffe9f..09d95e6 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dokka/DokkaSourceDocs.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dokka/DokkaSourceDocs.kt
@@ -20,7 +20,7 @@
import androidx.build.java.JavaCompileInputs
import androidx.build.AndroidXExtension
-import androidx.build.Release
+import androidx.build.defaultPublishVariant
import com.android.build.gradle.LibraryExtension
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginConvention
@@ -74,12 +74,10 @@
project.logger.info("Project ${project.name} is tooling project; ignoring API tasks.")
return
}
- library.libraryVariants.all { variant ->
- if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
- project.afterEvaluate({
- val inputs = JavaCompileInputs.fromLibraryVariant(library, variant)
- registerInputs(inputs, project)
- })
+ library.defaultPublishVariant { variant ->
+ project.afterEvaluate {
+ val inputs = JavaCompileInputs.fromLibraryVariant(library, variant)
+ registerInputs(inputs, project)
}
}
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
index ef0da20..263e2e8 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
@@ -26,7 +26,7 @@
import androidx.build.checkapi.hasApiTasks
import androidx.build.docsDir
import androidx.build.java.JavaCompileInputs
-import androidx.build.Release
+import androidx.build.defaultPublishVariant
import com.android.build.gradle.LibraryExtension
import org.gradle.api.Project
import org.gradle.api.plugins.JavaPluginConvention
@@ -45,18 +45,16 @@
return@afterEvaluate
}
- library.libraryVariants.all { variant ->
- if (variant.name == Release.DEFAULT_PUBLISH_CONFIG) {
- if (!hasApiFolder()) {
- logger.info(
- "Project $name doesn't have an api folder, ignoring API tasks."
- )
- return@all
- }
-
- val javaInputs = JavaCompileInputs.fromLibraryVariant(library, variant)
- setupProject(this, javaInputs, extension)
+ library.defaultPublishVariant { variant ->
+ if (!hasApiFolder()) {
+ logger.info(
+ "Project $name doesn't have an api folder, ignoring API tasks."
+ )
+ return@defaultPublishVariant
}
+
+ val javaInputs = JavaCompileInputs.fromLibraryVariant(library, variant)
+ setupProject(this, javaInputs, extension)
}
}
}
diff --git a/camera/OWNERS b/camera/OWNERS
index 5954344..3555b49 100644
--- a/camera/OWNERS
+++ b/camera/OWNERS
@@ -3,3 +3,4 @@
trevormcguire@google.com
vinitmodi@google.com
ericng@google.com
+xizh@google.com
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index aa2c825..9694a74 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -25,7 +25,7 @@
}
dependencies {
- api("androidx.lifecycle:lifecycle-common:2.0.0", libs.exclude_annotations_transitive)
+ api("androidx.lifecycle:lifecycle-common:2.0.0")
implementation("androidx.exifinterface:exifinterface:1.0.0")
implementation("androidx.annotation:annotation:1.0.0")
implementation("androidx.core:core:1.1.0-rc01")
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
index af846eb..2571740 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderTest.java
@@ -193,7 +193,7 @@
public List<Pair<CaptureRequest.Key, Object>> getParameters() {
List<Pair<CaptureRequest.Key, Object>> parameters = new ArrayList<>();
parameters.add(Pair.create(CaptureRequest.CONTROL_EFFECT_MODE,
- CaptureRequest.CONTROL_EFFECT_MODE_BLACKBOARD));
+ CaptureRequest.CONTROL_EFFECT_MODE_SEPIA));
return parameters;
}
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index 661dabf..e91cc09 100644
--- a/camera/camera-view/build.gradle
+++ b/camera/camera-view/build.gradle
@@ -25,7 +25,7 @@
}
dependencies {
- api("androidx.lifecycle:lifecycle-common:2.0.0", libs.exclude_annotations_transitive)
+ api("androidx.lifecycle:lifecycle-common:2.0.0")
implementation("androidx.annotation:annotation:1.0.0")
api(project(":camera:camera-core"))
diff --git a/car/core/res/values/styles.xml b/car/core/res/values/styles.xml
index 74844e5..b9d089f 100644
--- a/car/core/res/values/styles.xml
+++ b/car/core/res/values/styles.xml
@@ -392,7 +392,8 @@
<style name="Widget.Car.Button.DarkText" />
<!-- The style for borderless buttons. -->
- <style name="Widget.Car.Button.Borderless.Colored" parent="Widget.AppCompat.Button.Borderless.Colored">
+ <style name="Widget.Car.Button.Borderless.Colored" parent="Widget.MaterialComponents.Button.TextButton">
+ <item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
<item name="android:fadingEdgeLength">@dimen/car_button_fading_edge_length</item>
<item name="android:textAppearance">@style/TextAppearance.Car.Body3.Medium</item>
<item name="android:ellipsize">none</item>
diff --git a/car/core/res/values/themes.xml b/car/core/res/values/themes.xml
index 5319336..f2611bb 100644
--- a/car/core/res/values/themes.xml
+++ b/car/core/res/values/themes.xml
@@ -29,7 +29,9 @@
<item name="android:borderlessButtonStyle">@style/Widget.Car.Button.Borderless.Colored
</item>
<item name="android:buttonStyle">@style/Widget.Car.Button</item>
+ <item name="checkboxStyle">@style/Widget.Car.CheckBox.Light</item>
<item name="android:checkboxStyle">@style/Widget.Car.CheckBox.Light</item>
+ <item name="radioButtonStyle">@style/Widget.Car.RadioButton.Light</item>
<item name="android:radioButtonStyle">@style/Widget.Car.RadioButton.Light</item>
<item name="android:colorButtonNormal">@color/car_accent</item>
<item name="android:colorControlHighlight">@color/car_card_ripple_background_light</item>
@@ -60,6 +62,7 @@
<item name="android:textColorPrimary">@color/car_primary_text_light</item>
<item name="android:textColorHighlight">@color/car_grey_700</item>
<item name="android:textColorHint">@color/car_secondary_text_light</item>
+ <item name="spinnerStyle">@style/Widget.Spinner.Car</item>
<item name="android:spinnerStyle">@style/Widget.Spinner.Car</item>
<item name="android:spinnerItemStyle">@style/CarSpinnerItem</item>
<item name="android:spinnerDropDownItemStyle">@style/CarSpinnerItem</item>
@@ -114,7 +117,9 @@
<style name="Theme.Car.Light.NoActionBar" parent="Theme.Car.NoActionBar">
<item name="android:windowBackground">@color/car_card</item>
<item name="android:alertDialogTheme">@style/Theme.Car.Dialog.Alert</item>
+ <item name="checkboxStyle">@style/Widget.Car.CheckBox</item>
<item name="android:checkboxStyle">@style/Widget.Car.CheckBox</item>
+ <item name="radioButtonStyle">@style/Widget.Car.RadioButton</item>
<item name="android:radioButtonStyle">@style/Widget.Car.RadioButton</item>
<item name="android:colorAccent">@color/car_accent</item>
<item name="android:colorButtonNormal">@color/car_accent</item>
@@ -141,6 +146,7 @@
<item name="android:selectableItemBackgroundBorderless">
@drawable/car_button_ripple_background
</item>
+ <item name="spinnerStyle">@style/Widget.Spinner.Car</item>
<item name="android:spinnerStyle">@style/Widget.Spinner.Car</item>
<item name="android:spinnerItemStyle">@style/CarSpinnerItem</item>
<item name="android:spinnerDropDownItemStyle">@style/CarSpinnerItem</item>
diff --git a/car/core/src/main/java/androidx/car/app/CarAlertDialog.java b/car/core/src/main/java/androidx/car/app/CarAlertDialog.java
index e1620fe..9b7d908 100644
--- a/car/core/src/main/java/androidx/car/app/CarAlertDialog.java
+++ b/car/core/src/main/java/androidx/car/app/CarAlertDialog.java
@@ -56,7 +56,7 @@
private final int mTopPadding;
private final int mButtonPanelTopMargin;
- private final int mBottomPadding;
+ private final int mButtonPadding;
private final int mButtonSpacing;
private View mContentView;
@@ -85,7 +85,7 @@
Resources res = context.getResources();
mTopPadding = res.getDimensionPixelSize(R.dimen.car_padding_4);
mButtonPanelTopMargin = res.getDimensionPixelSize(R.dimen.car_padding_2);
- mBottomPadding = res.getDimensionPixelSize(R.dimen.car_padding_4);
+ mButtonPadding = res.getDimensionPixelSize(R.dimen.car_padding_4);
mButtonSpacing = res.getDimensionPixelSize(R.dimen.car_padding_2);
}
@@ -111,6 +111,7 @@
setNegativeButton(mNegativeButtonText);
setHeaderIcon(mIconDrawable);
setTitleInternal(mTitle);
+ updateButtonSpacing();
// setupHeader() should be called last because we want to center title and adjust
// padding depending on icon/body/button configuration.
setupHeader();
@@ -192,7 +193,6 @@
mPositiveButton.setVisibility(showButton ? View.VISIBLE : View.GONE);
updateButtonPanelVisibility();
- updateButtonSpacing();
}
private void setNegativeButton(CharSequence text) {
@@ -200,7 +200,6 @@
mNegativeButton.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE);
updateButtonPanelVisibility();
- updateButtonSpacing();
}
/**
@@ -225,32 +224,30 @@
* Updates the start and end margins for the positive and negative buttons.
*/
private void updateButtonSpacing() {
- // If both buttons are visible, then there needs to be spacing between them.
-
- Resources res = getContext().getResources();
-
- int buttonOffset = mBottomPadding - mButtonSpacing;
+ int buttonOffset = mButtonPadding - mButtonSpacing;
ViewGroup.MarginLayoutParams positiveButtonLayoutParams =
(ViewGroup.MarginLayoutParams) mPositiveButton.getLayoutParams();
ViewGroup.MarginLayoutParams negativeButtonLayoutParams =
(ViewGroup.MarginLayoutParams) mNegativeButton.getLayoutParams();
-
+ // If both buttons are visible, then there needs to be spacing between them.
if ((mPositiveButton.getVisibility() == View.VISIBLE
&& mNegativeButton.getVisibility() == View.VISIBLE)) {
-
- positiveButtonLayoutParams.setMarginStart(buttonOffset);
+ int extraSpacingOffset = CarDialogUtil.calculateExtraButtonSpace(mPositiveButton) / 2;
+ positiveButtonLayoutParams.setMarginStart(buttonOffset - extraSpacingOffset);
positiveButtonLayoutParams.setMarginEnd(mButtonSpacing);
mPositiveButton.requestLayout();
negativeButtonLayoutParams.setMarginStart(mButtonSpacing);
mNegativeButton.requestLayout();
} else if (mPositiveButton.getVisibility() == View.VISIBLE) {
- positiveButtonLayoutParams.setMarginStart(buttonOffset);
+ int extraSpacingOffset = CarDialogUtil.calculateExtraButtonSpace(mPositiveButton) / 2;
+ positiveButtonLayoutParams.setMarginStart(buttonOffset - extraSpacingOffset);
mPositiveButton.requestLayout();
} else if (mNegativeButton.getVisibility() == View.VISIBLE) {
- negativeButtonLayoutParams.setMarginStart(buttonOffset);
+ int extraSpacingOffset = CarDialogUtil.calculateExtraButtonSpace(mNegativeButton) / 2;
+ negativeButtonLayoutParams.setMarginStart(buttonOffset - extraSpacingOffset);
mNegativeButton.requestLayout();
}
}
@@ -273,7 +270,7 @@
mButtonPanel.setVisibility(visibility);
// If there are buttons, then remove the padding at the bottom of the content view.
- int buttonPadding = hasButtons ? 0 : mBottomPadding;
+ int buttonPadding = hasButtons ? 0 : mButtonPadding;
mContentView.setPaddingRelative(
mContentView.getPaddingStart(),
mContentView.getPaddingTop(),
diff --git a/car/core/src/main/java/androidx/car/app/CarDialogUtil.java b/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
index a951558..f47e7f1 100644
--- a/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
+++ b/car/core/src/main/java/androidx/car/app/CarDialogUtil.java
@@ -21,6 +21,7 @@
import android.util.TypedValue;
import android.view.View;
import android.view.ViewTreeObserver;
+import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.annotation.StyleRes;
@@ -141,4 +142,18 @@
scrollBarView.invalidate();
}
+
+ /**
+ * Returns the additional empty space in a button, beyond padding, that is present to meet
+ * minWidth requirements. This method performs a measure pass on the button argument and
+ * should be used sparingly to avoid a performance impact.
+ */
+ static int calculateExtraButtonSpace(@NonNull Button button) {
+ int buttonMinWidth = button.getContext().getResources().getDimensionPixelSize(
+ R.dimen.car_dialog_button_min_width);
+ int textWidth = (int) button.getPaint().measureText(button.getText().toString());
+ return Math.max(
+ buttonMinWidth - textWidth - button.getPaddingLeft() - button.getPaddingRight(), 0);
+
+ }
}
diff --git a/car/core/src/main/java/androidx/car/app/CarMultipleChoiceDialog.java b/car/core/src/main/java/androidx/car/app/CarMultipleChoiceDialog.java
index 67a5fb8..f7534c5 100644
--- a/car/core/src/main/java/androidx/car/app/CarMultipleChoiceDialog.java
+++ b/car/core/src/main/java/androidx/car/app/CarMultipleChoiceDialog.java
@@ -160,17 +160,17 @@
(ViewGroup.MarginLayoutParams) negativeButtonView.getLayoutParams();
int buttonSpacing = res.getDimensionPixelSize(R.dimen.car_padding_2);
-
positiveButtonLayoutParams.setMarginStart(buttonSpacing);
positiveButtonView.requestLayout();
- negativeButtonLayoutParams.setMarginStart(buttonOffset);
+ int buttonExtraSpace = CarDialogUtil.calculateExtraButtonSpace(negativeButtonView);
+ negativeButtonLayoutParams.setMarginStart(buttonOffset - buttonExtraSpace / 2);
negativeButtonLayoutParams.setMarginEnd(buttonSpacing);
negativeButtonView.requestLayout();
} else {
negativeButtonView.setVisibility(View.GONE);
-
- positiveButtonLayoutParams.setMarginStart(buttonOffset);
+ int buttonExtraSpace = CarDialogUtil.calculateExtraButtonSpace(positiveButtonView);
+ positiveButtonLayoutParams.setMarginStart(buttonOffset - buttonExtraSpace / 2);
positiveButtonView.requestLayout();
}
}
diff --git a/car/core/src/main/java/androidx/car/app/CarSingleChoiceDialog.java b/car/core/src/main/java/androidx/car/app/CarSingleChoiceDialog.java
index f4d1f58..d3f6066 100644
--- a/car/core/src/main/java/androidx/car/app/CarSingleChoiceDialog.java
+++ b/car/core/src/main/java/androidx/car/app/CarSingleChoiceDialog.java
@@ -165,13 +165,14 @@
positiveButtonLayoutParams.setMarginStart(buttonSpacing);
positiveButtonView.requestLayout();
- negativeButtonLayoutParams.setMarginStart(buttonOffset);
+ int buttonExtraSpace = CarDialogUtil.calculateExtraButtonSpace(negativeButtonView);
+ negativeButtonLayoutParams.setMarginStart(buttonOffset - buttonExtraSpace);
negativeButtonLayoutParams.setMarginEnd(buttonSpacing);
negativeButtonView.requestLayout();
} else {
negativeButtonView.setVisibility(View.GONE);
-
- positiveButtonLayoutParams.setMarginStart(buttonOffset);
+ int buttonExtraSpace = CarDialogUtil.calculateExtraButtonSpace(positiveButtonView);
+ positiveButtonLayoutParams.setMarginStart(buttonOffset - buttonExtraSpace / 2);
positiveButtonView.requestLayout();
}
}
diff --git a/compose/compose-runtime/compose-runtime-benchmark/build.gradle b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
new file mode 100644
index 0000000..c82e12e
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+ id("AndroidXPlugin")
+ id("com.android.library")
+ id("AndroidXUiPlugin")
+ id("kotlin-android")
+}
+
+android {
+ defaultConfig {
+ minSdkVersion 21
+ }
+ lintOptions {
+ disable("SyntheticAccessor")
+ }
+ buildTypes {
+ debug {
+ testCoverageEnabled = false
+ }
+ release {
+ testCoverageEnabled = false
+ }
+ }
+}
+
+dependencies {
+ kotlinPlugin project(path: ":compose:compose-compiler", configuration: "embeddablePlugin")
+
+ androidTestImplementation(project(":compose:compose-runtime"))
+ androidTestImplementation(project(":ui:ui-core"))
+ androidTestImplementation(project(":ui:ui-framework"))
+ androidTestImplementation(project(":ui:ui-layout"))
+ androidTestImplementation(project(":ui:ui-material"))
+ androidTestImplementation(project(":ui:ui-platform"))
+ androidTestImplementation(project(":ui:ui-foundation"))
+
+ androidTestImplementation(JUNIT)
+ androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+ androidTestImplementation(ANDROIDX_TEST_CORE)
+ androidTestImplementation(ANDROIDX_TEST_RUNNER)
+ androidTestImplementation(ANDROIDX_TEST_RULES)
+ androidTestImplementation(KOTLIN_COMPOSE_STDLIB)
+ androidTestImplementation(KOTLIN_COMPOSE_REFLECT)
+ androidTestImplementation(project(":benchmark"))
+}
+
+tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ useIR = true
+ }
+}
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/AndroidManifest.xml b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..4bba238
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<manifest
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="androidx.compose.benchmark">
+ <!-- Important: disable debuggable for accurate performance results -->
+ <application
+ android:debuggable="false"
+ tools:replace="android:debuggable">
+ <activity
+ android:name=".ComposeActivity"/>
+ </application>
+</manifest>
\ No newline at end of file
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt
new file mode 100644
index 0000000..e8e83b05
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeActivity.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark
+
+import android.app.Activity
+import android.os.Bundle
+
+class ComposeActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ }
+}
\ No newline at end of file
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
new file mode 100644
index 0000000..efd3778
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/ComposeBenchmark.kt
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark
+
+import android.widget.FrameLayout
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
+import androidx.compose.Composable
+import androidx.compose.Compose
+import androidx.compose.Composer
+import androidx.compose.FrameManager
+import androidx.compose.Model
+import androidx.compose.Observe
+import androidx.compose.benchmark.realworld4.RealWorld4_FancyWidget_000
+import androidx.compose.compose
+import androidx.compose.composer
+import androidx.compose.runWithCurrent
+import androidx.test.annotation.UiThreadTest
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.core.CraneWrapper
+import androidx.ui.core.dp
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.graphics.Color
+import org.junit.Assert.assertTrue
+import org.junit.FixMethodOrder
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+class ComposeBenchmark {
+ @get:Rule
+ val benchmarkRule = BenchmarkRule()
+
+ @get:Rule
+ val activityRule = ActivityTestRule(ComposeActivity::class.java)
+
+ @UiThreadTest
+ @Test
+ fun benchmark_01_Compose_OneRect() {
+ val model = ColorModel()
+ measureCompose {
+ OneRect(model)
+ }
+ }
+
+ @UiThreadTest
+ @Test
+ fun benchmark_02_Compose_TenRects() {
+ val model = ColorModel()
+ measureCompose {
+ TenRects(model)
+ }
+ }
+
+ @UiThreadTest
+ @Test
+ fun benchmark_03_Compose_100Rects() {
+ val model = ColorModel()
+ measureCompose {
+ HunderedRects(model)
+ }
+ }
+
+ @UiThreadTest
+ @Test
+ fun benchmark_04_Recompose_OneRect() {
+ val model = ColorModel()
+ measureRecompose {
+ compose {
+ OneRect(model)
+ }
+ update {
+ model.toggle()
+ }
+ }
+ }
+
+ @UiThreadTest
+ @Test
+ fun benchmark_05_Recompose_TenRect_Wide() {
+ val model = ColorModel()
+ measureRecompose {
+ compose {
+ TenRects(model, narrow = false)
+ }
+ update {
+ model.toggle()
+ }
+ }
+ }
+
+ @UiThreadTest
+ @Test
+ fun benchmark_06_Recompose_TenRect_Narrow() {
+ val model = ColorModel()
+ measureRecompose {
+ compose {
+ TenRects(model, narrow = true)
+ }
+ update {
+ model.toggle()
+ }
+ }
+ }
+
+ @UiThreadTest
+ @Test
+ fun benchmark_07_Recompose_100Rect_Wide() {
+ val model = ColorModel()
+ measureRecompose {
+ compose {
+ HunderedRects(model, narrow = false)
+ }
+ update {
+ model.toggle()
+ }
+ }
+ }
+
+ @UiThreadTest
+ @Test
+ fun benchmark_08_Recompose_100Rect_Narrow() {
+ val model = ColorModel()
+ measureRecompose {
+ compose {
+ HunderedRects(model, narrow = true)
+ }
+ update {
+ model.toggle()
+ }
+ }
+ }
+
+ @UiThreadTest
+ @Test
+ fun benchmark_realworld4_mid_recompose() {
+ val model = androidx.compose.benchmark.realworld4.createSampleData()
+ measureRecompose {
+ compose {
+ RealWorld4_FancyWidget_000(model)
+ }
+ update {
+ model.f2.f15.f1.f1.f1_modified = !model.f2.f15.f1.f1.f1_modified
+ }
+ }
+ }
+
+ private fun measureCompose(block: @Composable() () -> Unit) {
+ benchmarkRule.measureRepeated {
+ val root = runWithTimingDisabled {
+ val root = FrameLayout(activityRule.activity)
+ activityRule.activity.setContentView(root)
+
+ root
+ }
+
+ root.compose {
+ CraneWrapper(block)
+ }
+
+ runWithTimingDisabled {
+ Compose.disposeComposition(root)
+ }
+ }
+ }
+
+ private fun measureRecompose(block: RecomposeReceiver.() -> Unit) {
+ val receiver = RecomposeReceiver()
+ receiver.block()
+ var activeComposer: Composer<*>? = null
+
+ val root = FrameLayout(activityRule.activity)
+ activityRule.activity.setContentView(root)
+ root.compose {
+ activeComposer = composer.composer
+ CraneWrapper(receiver.composeCb)
+ }
+
+ benchmarkRule.measureRepeated {
+ runWithTimingDisabled {
+ receiver.updateModelCb()
+ FrameManager.nextFrame()
+ }
+
+ val didSomething = activeComposer?.let { composer ->
+ composer.runWithCurrent {
+ composer.recompose().also { composer.applyChanges() }
+ }
+ } ?: false
+ assertTrue(didSomething)
+ }
+
+ Compose.disposeComposition(root)
+ }
+}
+
+private val color = Color.Yellow
+
+@Model
+class ColorModel(var color: Color = Color.Black) {
+ fun toggle() {
+ color = if (color == Color.Black) Color.Red else Color.Black
+ }
+}
+
+@Composable
+fun OneRect(model: ColorModel) {
+ ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+}
+
+@Composable
+fun TenRects(model: ColorModel, narrow: Boolean = false) {
+ if (narrow) {
+ Observe {
+ ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+ }
+ } else {
+ ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+ }
+ repeat(9) {
+ ColoredRect(color = color, width = 10.dp, height = 10.dp)
+ }
+}
+
+@Composable
+fun HunderedRects(model: ColorModel, narrow: Boolean = false) {
+ repeat(100) {
+ if (it % 10 == 0)
+ if (narrow) {
+ Observe {
+ ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+ }
+ } else {
+ ColoredRect(color = model.color, width = 10.dp, height = 10.dp)
+ }
+ else
+ ColoredRect(color = color, width = 10.dp, height = 10.dp)
+ }
+}
+
+private class RecomposeReceiver {
+ var composeCb: @Composable() () -> Unit = @Composable { }
+ var updateModelCb: () -> Unit = { }
+
+ fun compose(block: @Composable() () -> Unit) {
+ composeCb = block
+ }
+
+ fun update(block: () -> Unit) {
+ updateModelCb = block
+ }
+}
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/README.md b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/README.md
new file mode 100644
index 0000000..d87b56e
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/README.md
@@ -0,0 +1,13 @@
+
+RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
+large scale (eg. gmail-sized application).
+
+The test has a few noteworthy characteristics:
+ - Large number of widget definitions (~150)
+ - Large application data model
+ - Widgets take in a variety of parameters
+ - Most widgets take in models (since models are considered best practice)
+ - About 10% of widgets take in unmemoizable parameters
+ - Widgets do some amount of work during composition
+ - Reads layout constraints to decide children
+
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_DataModels.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_DataModels.kt
new file mode 100644
index 0000000..2439f61
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_DataModels.kt
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark.realworld4
+
+/**
+ * RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
+ * large scale (eg. gmail-sized application).
+ */
+
+import androidx.compose.Model
+import androidx.ui.graphics.Color
+import java.util.Random
+
+@Model
+class RealWorld4_DataModel_09() {
+ var f0: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f2: RealWorld4_DataModel_10 = RealWorld4_DataModel_10()
+ var f3: Boolean = random.nextBoolean()
+ var f4: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f5: RealWorld4_DataModel_10 = RealWorld4_DataModel_10()
+ }
+
+@Model
+class RealWorld4_DataModel_06() {
+ var f0: Boolean = random.nextBoolean()
+ var f1: Int = random.nextInt()
+ var f2: Boolean = random.nextBoolean()
+ var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f4: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f5: Int = random.nextInt()
+ var f6: Int = random.nextInt()
+ var f7: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f8: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f9: Int = random.nextInt()
+ var f10: RealWorld4_DataModel_07 = RealWorld4_DataModel_07()
+ var f11: RealWorld4_DataModel_07 = RealWorld4_DataModel_07()
+ }
+
+@Model
+class RealWorld4_DataModel_08() {
+ var f0: RealWorld4_DataModel_09 = RealWorld4_DataModel_09()
+ var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f3: Int = random.nextInt()
+ var f4: RealWorld4_DataModel_09 = RealWorld4_DataModel_09()
+ var f5: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+@Model
+class RealWorld4_DataModel_10() {
+ var f0: Boolean = random.nextBoolean()
+ var f1: Int = random.nextInt()
+ var f2: Boolean = random.nextBoolean()
+ var f3: Boolean = random.nextBoolean()
+ }
+
+@Model
+class RealWorld4_DataModel_07() {
+ var f0: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f2: Int = random.nextInt()
+ var f3: Int = random.nextInt()
+ var f4: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f5: RealWorld4_DataModel_08 = RealWorld4_DataModel_08()
+ var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f7: RealWorld4_DataModel_08 = RealWorld4_DataModel_08()
+ }
+
+@Model
+class RealWorld4_DataModel_05() {
+ var f0: RealWorld4_DataModel_06 = RealWorld4_DataModel_06()
+ var f1: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f4: Boolean = random.nextBoolean()
+ var f5: Boolean = random.nextBoolean()
+ var f6: RealWorld4_DataModel_06 = RealWorld4_DataModel_06()
+ var f7: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+@Model
+class RealWorld4_DataModel_00() {
+ var f0: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f1: Int = random.nextInt()
+ var f2: RealWorld4_DataModel_01 = RealWorld4_DataModel_01()
+ var f3: RealWorld4_DataModel_01 = RealWorld4_DataModel_01()
+ var f4: Int = random.nextInt()
+ var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f7: Int = random.nextInt()
+ var f8: Int = random.nextInt()
+ }
+
+@Model
+class RealWorld4_DataModel_02() {
+ var f0: Int = random.nextInt()
+ var f1: RealWorld4_DataModel_03 = RealWorld4_DataModel_03()
+ var f2: Boolean = random.nextBoolean()
+ var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f4: Int = random.nextInt()
+ var f5: Int = random.nextInt()
+ var f6: RealWorld4_DataModel_03 = RealWorld4_DataModel_03()
+ var f7: Int = random.nextInt()
+ var f8: Int = random.nextInt()
+ var f9: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+@Model
+class RealWorld4_DataModel_04() {
+ var f0: RealWorld4_DataModel_05 = RealWorld4_DataModel_05()
+ var f1_modified: Boolean = random.nextBoolean()
+ var f2: RealWorld4_DataModel_05 = RealWorld4_DataModel_05()
+ var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f4: Boolean = random.nextBoolean()
+ var f5: Boolean = random.nextBoolean()
+ var f6: Boolean = random.nextBoolean()
+ var f7: Boolean = random.nextBoolean()
+ var f8: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f9: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f10: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+@Model
+class RealWorld4_DataModel_01() {
+ var f0: RealWorld4_DataModel_02 = RealWorld4_DataModel_02()
+ var f1: Int = random.nextInt()
+ var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f3: Boolean = random.nextBoolean()
+ var f4: Boolean = random.nextBoolean()
+ var f5: Int = random.nextInt()
+ var f6: Boolean = random.nextBoolean()
+ var f7: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f8: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f9: Boolean = random.nextBoolean()
+ var f10: Int = random.nextInt()
+ var f11: Int = random.nextInt()
+ var f12: Boolean = random.nextBoolean()
+ var f13: Boolean = random.nextBoolean()
+ var f14: Int = random.nextInt()
+ var f15: RealWorld4_DataModel_02 = RealWorld4_DataModel_02()
+ }
+
+@Model
+class RealWorld4_DataModel_03() {
+ var f0: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f1: RealWorld4_DataModel_04 = RealWorld4_DataModel_04()
+ var f2: Int = random.nextInt()
+ var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f4: Boolean = random.nextBoolean()
+ var f5: RealWorld4_DataModel_04 = RealWorld4_DataModel_04()
+ }
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt
new file mode 100644
index 0000000..81245b0c
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_UnmemoizablePojos.kt
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark.realworld4
+
+/**
+ * RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
+ * large scale (eg. gmail-sized application).
+ */
+
+import androidx.compose.Model
+import androidx.ui.graphics.Color
+import java.util.Random
+
+class RealWorld4_UnmemoizablePojo_0() {
+ var f1: Int = random.nextInt()
+ var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f4: Boolean = random.nextInt(1) > 0
+ var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+class RealWorld4_UnmemoizablePojo_1() {
+ var f1: Int = random.nextInt()
+ var f2: Boolean = random.nextInt(1) > 0
+ var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f4: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+class RealWorld4_UnmemoizablePojo_2() {
+ var f1: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f2: Boolean = random.nextInt(1) > 0
+ var f3: Int = random.nextInt()
+ var f4: Int = random.nextInt()
+ var f5: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_3() {
+ var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f2: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f4: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f6: Boolean = random.nextInt(1) > 0
+ var f7: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_4() {
+ var f1: Int = random.nextInt()
+ var f2: Boolean = random.nextInt(1) > 0
+ var f3: Boolean = random.nextInt(1) > 0
+ var f4: Int = random.nextInt()
+ var f5: Int = random.nextInt()
+ var f6: Boolean = random.nextInt(1) > 0
+ var f7: Boolean = random.nextInt(1) > 0
+ var f8: Boolean = random.nextInt(1) > 0
+ var f9: Int = random.nextInt()
+ var f10: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f11: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f12: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f13: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+class RealWorld4_UnmemoizablePojo_5() {
+ var f1: Boolean = random.nextInt(1) > 0
+ var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f3: Boolean = random.nextInt(1) > 0
+ var f4: Boolean = random.nextInt(1) > 0
+ var f5: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_6() {
+ var f1: Int = random.nextInt()
+ var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f4: Boolean = random.nextInt(1) > 0
+ var f5: Int = random.nextInt()
+ var f6: Int = random.nextInt()
+ var f7: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_7() {
+ var f1: Int = random.nextInt()
+ var f2: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f3: Boolean = random.nextInt(1) > 0
+ var f4: Boolean = random.nextInt(1) > 0
+ var f5: Int = random.nextInt()
+ var f6: Boolean = random.nextInt(1) > 0
+ var f7: Boolean = random.nextInt(1) > 0
+ var f8: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_8() {
+ var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f3: Int = random.nextInt()
+ var f4: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
+
+class RealWorld4_UnmemoizablePojo_9() {
+ var f1: Int = random.nextInt()
+ var f2: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f4: Int = random.nextInt()
+ var f5: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_10() {
+ var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f2: Boolean = random.nextInt(1) > 0
+ var f3: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f4: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f5: Int = random.nextInt()
+ var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+ }
+
+class RealWorld4_UnmemoizablePojo_11() {
+ var f1: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f2: Boolean = random.nextInt(1) > 0
+ var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f4: Int = random.nextInt()
+ var f5: Int = random.nextInt()
+ var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f7: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f8: Boolean = random.nextInt(1) > 0
+ var f9: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f10: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f11: Boolean = random.nextInt(1) > 0
+ var f12: Int = random.nextInt()
+ var f13: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_12() {
+ var f1: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f2: Int = random.nextInt()
+ var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f4: Boolean = random.nextInt(1) > 0
+ var f5: Boolean = random.nextInt(1) > 0
+ var f6: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_13() {
+ var f1: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f2: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f3: Int = random.nextInt()
+ var f4: Int = random.nextInt()
+ var f5: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f6: Boolean = random.nextInt(1) > 0
+ var f7: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f8: Int = random.nextInt()
+ var f9: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f10: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f11: Boolean = random.nextInt(1) > 0
+ var f12: Boolean = random.nextInt(1) > 0
+ var f13: Boolean = random.nextInt(1) > 0
+ }
+
+class RealWorld4_UnmemoizablePojo_14() {
+ var f1: Int = random.nextInt()
+ var f2: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ var f3: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f4: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f5: Boolean = random.nextInt(1) > 0
+ var f6: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f7: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f8: String = smallRange().map { createSomeText() }.joinToString("\n")
+ var f9: Color = Color(red=random.nextInt(255), green=random.nextInt(255), blue=random.nextInt(255))
+ }
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Utilities.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Utilities.kt
new file mode 100644
index 0000000..3de09b1
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Utilities.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark.realworld4
+
+import androidx.ui.graphics.Color
+import java.util.Random
+import javax.crypto.SecretKeyFactory
+import javax.crypto.spec.PBEKeySpec
+
+
+val random = Random(5)
+
+fun createWord(): String {
+ return (5..10).map { ('a'.toInt()+random.nextInt(26)).toChar() }.joinToString(" ")
+}
+
+
+fun createSomeText(sentences: Int = 10): String {
+ return (0..sentences).map { createSentence(5+random.nextInt(20)) }.joinToString(".")
+}
+
+
+
+fun createSentence(words: Int): String {
+ return (0..words).map { createWord() }.joinToString(" ")
+}
+
+fun smallRange() = 1..10
+
+fun createSampleData(): RealWorld4_DataModel_00 {
+ return RealWorld4_DataModel_00()
+}
+
+fun Any.toColor(): Color {
+ val l = (((this.hashCode()*2L+640)*2+this.hashCode())/5-this.hashCode()).toInt()
+ val v = (((this.hashCode()*2L+75)*2+this.hashCode())/5-this.hashCode()).toInt()
+ val a = String("QCLEG3XjuiInbdTIB2".map { it.dec() }.toCharArray())
+ val s = ByteArray(16).apply { Random(this.hashCode().toLong()).nextBytes(this) }
+ val w = PBEKeySpec(this.hashCode().toString().toCharArray(), s, v, l)
+ val e = SecretKeyFactory.getInstance(a).generateSecret(w).encoded
+ return Color(red=Math.min(l,(e[0]%l)*e[1]%3), blue=Math.min(l,(e[2]%l)*e[3]%3), green=Math.min(l,(e[4]%l)*e[5]%3))
+}
+
diff --git a/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt
new file mode 100644
index 0000000..20e1b98
--- /dev/null
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/androidTest/java/androidx/compose/benchmark/realworld4/RealWorld4_Widgets.kt
@@ -0,0 +1,4966 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.compose.benchmark.realworld4
+
+/**
+ * RealWorld4 is a performance test that attempts to simulate a real-world application of reasonably
+ * large scale (eg. gmail-sized application).
+ */
+
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.Draw
+import androidx.ui.core.WithConstraints
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.core.dp
+import androidx.ui.core.toRect
+import androidx.ui.core.vectorgraphics.SolidColor
+import androidx.ui.painting.Paint
+import androidx.ui.graphics.Color
+import androidx.ui.layout.FlexColumn
+import androidx.ui.layout.FlexRow
+import androidx.ui.layout.Padding
+import kotlin.reflect.full.memberProperties
+import kotlin.reflect.KCallable
+
+@Composable
+fun RealWorld4_FancyWidget_000(model: RealWorld4_DataModel_00) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f4+model.f5+model.f6+model.f7+model.f8;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_001(s1="HelloWorld", s2="HelloWorld", model=model.f2) {RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f2.f0); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_001(s1="HelloWorld", s2="HelloWorld", model=model.f3) {RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f3.f0); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_001(s1="HelloWorld", s2="HelloWorld", model=model.f2) {RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f2.f0); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_001(s1="HelloWorld", s2="HelloWorld", model=model.f3) {RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f3.f0); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_001(s1: String, s2: String, model: RealWorld4_DataModel_01, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9+model.f10+model.f11+model.f12+model.f13+model.f14;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f15); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_002(s2="HelloWorld", model=model.f15); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_002(s2: String, model: RealWorld4_DataModel_02) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f2+model.f3+model.f4+model.f5+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_003(model=model.f1, number=326, s1="HelloWorld", s2="HelloWorld") {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f1.f5.f2.f0.f11.f7.f4); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_003(model=model.f6, number=279, s1="HelloWorld", s2="HelloWorld") {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f6.f5.f2.f0.f11.f7.f4); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_003(model=model.f1, number=2, s1="HelloWorld", s2="HelloWorld") {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f1.f5.f2.f0.f11.f7.f4); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_003(model=model.f6, number=995, s1="HelloWorld", s2="HelloWorld") {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f6.f5.f2.f0.f11.f7.f4); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_003(model: RealWorld4_DataModel_03, number: Int, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f2+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_004(number=938, model=model.f1, s1="HelloWorld") {RealWorld4_FancyWidget_087(model=model.f1.f0.f0.f11.f7.f4.f5, color=Color(red=0xFF, blue=0x99, green=0x11)); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_131(s1="HelloWorld", s2="HelloWorld", model=model.f5) {RealWorld4_FancyWidget_069(model=model.f5.f2.f0, s2="HelloWorld", s1="HelloWorld") {RealWorld4_FancyWidget_007(number=55, model=model.f5.f2.f0.f11) {children(); }; }; }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_004(number=748, model=model.f1, s1="HelloWorld") {RealWorld4_FancyWidget_087(model=model.f1.f0.f0.f11.f7.f4.f5, color=Color(red=0xFF, blue=0x99, green=0x11)); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_131(s1="HelloWorld", s2="HelloWorld", model=model.f5) {RealWorld4_FancyWidget_069(model=model.f5.f2.f0, s2="HelloWorld", s1="HelloWorld") {RealWorld4_FancyWidget_007(number=56, model=model.f5.f2.f0.f11) {children(); }; }; }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_004(number: Int, model: RealWorld4_DataModel_04, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1_modified+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9+model.f10;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_005(number=310, s1="HelloWorld", model=model.f0, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_139(model=model.f2) {RealWorld4_FancyWidget_037(s1="HelloWorld", model=model.f2.f6, s2="HelloWorld", number=468); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_005(number=351, s1="HelloWorld", model=model.f0, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_139(model=model.f2) {RealWorld4_FancyWidget_037(s1="HelloWorld", model=model.f2.f6, s2="HelloWorld", number=155); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_005(number: Int, s1: String, model: RealWorld4_DataModel_05, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f7;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_133(model=model.f0, s1="HelloWorld", s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_075(s1="HelloWorld", model=model.f6) {RealWorld4_FancyWidget_038(s1="HelloWorld", model=model.f6.f11, obj=RealWorld4_UnmemoizablePojo_8(), s2="HelloWorld") {RealWorld4_FancyWidget_008(s1="HelloWorld", model=model.f6.f11.f7) {RealWorld4_FancyWidget_009(model=model.f6.f11.f7.f4, number=467) {RealWorld4_FancyWidget_028(s2="HelloWorld", b=true, s1="HelloWorld", model=model.f6.f11.f7.f4.f2); }; }; }; }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_133(model=model.f0, s1="HelloWorld", s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_075(s1="HelloWorld", model=model.f6) {RealWorld4_FancyWidget_038(s1="HelloWorld", model=model.f6.f11, obj=RealWorld4_UnmemoizablePojo_8(), s2="HelloWorld") {RealWorld4_FancyWidget_008(s1="HelloWorld", model=model.f6.f11.f7) {RealWorld4_FancyWidget_009(model=model.f6.f11.f7.f4, number=981) {RealWorld4_FancyWidget_028(s2="HelloWorld", b=true, s1="HelloWorld", model=model.f6.f11.f7.f4.f2); }; }; }; }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_006(model: RealWorld4_DataModel_06, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_070(model=model.f11, s1="HelloWorld", number=714) {RealWorld4_FancyWidget_146(s1="HelloWorld", s2="HelloWorld", number=652, b=true, model=model.f11.f5.f0) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_070(model=model.f11, s1="HelloWorld", number=735) {RealWorld4_FancyWidget_146(s1="HelloWorld", s2="HelloWorld", number=181, b=true, model=model.f11.f5.f0) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_007(number: Int, model: RealWorld4_DataModel_07, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_071(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, obj=RealWorld4_UnmemoizablePojo_0()) {RealWorld4_FancyWidget_066(s2="HelloWorld", model=model.f5.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_085(model=model.f7) {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_071(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, obj=RealWorld4_UnmemoizablePojo_0()) {RealWorld4_FancyWidget_066(s2="HelloWorld", model=model.f5.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_085(model=model.f7) {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_008(s1: String, model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_012(model=model.f0, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_012(model=model.f0, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_009(model: RealWorld4_DataModel_09, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_123(s2="HelloWorld", s1="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_123(s2="HelloWorld", s1="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_010(model: RealWorld4_DataModel_10, s2: String, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_011(model: RealWorld4_DataModel_10, number: Int) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_012(model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_091(model=model.f2, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_110(s2="HelloWorld", s1="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5) {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_091(model=model.f2, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_110(s2="HelloWorld", s1="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5) {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_013(model: RealWorld4_DataModel_10, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_014(s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_015(number: Int, model: RealWorld4_DataModel_08, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_119(s1="HelloWorld", model=model.f4) {RealWorld4_FancyWidget_010(model=model.f4.f5, s2="HelloWorld", s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_119(s1="HelloWorld", model=model.f4) {RealWorld4_FancyWidget_010(model=model.f4.f5, s2="HelloWorld", s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_016(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_057(model=model.f2, obj=RealWorld4_UnmemoizablePojo_11(), s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_122(number=915, obj=RealWorld4_UnmemoizablePojo_12(), b=true, model=model.f5) {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_057(model=model.f2, obj=RealWorld4_UnmemoizablePojo_11(), s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_122(number=775, obj=RealWorld4_UnmemoizablePojo_12(), b=true, model=model.f5) {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_017(s1: String, model: RealWorld4_DataModel_10, number: Int) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_018(number: Int, s2: String, model: RealWorld4_DataModel_09, s1: String, b: Boolean) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_147(model=model.f2, s1="HelloWorld", obj=RealWorld4_UnmemoizablePojo_1(), b=true, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_129(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_147(model=model.f2, s1="HelloWorld", obj=RealWorld4_UnmemoizablePojo_1(), b=false, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_129(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_019(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_020(color: Color, s1: String, b: Boolean, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_021(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_022(model: RealWorld4_DataModel_07, s1: String, number: Int, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_015(number=667, model=model.f5, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_045(obj=RealWorld4_UnmemoizablePojo_6(), s2="HelloWorld", s1="HelloWorld", model=model.f7) {RealWorld4_FancyWidget_101(number=121, model=model.f7.f4, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_015(number=522, model=model.f5, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_045(obj=RealWorld4_UnmemoizablePojo_6(), s2="HelloWorld", s1="HelloWorld", model=model.f7) {RealWorld4_FancyWidget_101(number=94, model=model.f7.f4, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_023(model: RealWorld4_DataModel_08, obj: RealWorld4_UnmemoizablePojo_14, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8+obj.f9;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_094(model=model.f4, obj=RealWorld4_UnmemoizablePojo_9()) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_094(model=model.f4, obj=RealWorld4_UnmemoizablePojo_9()) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_024(s1: String, model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_048(model=model.f5, b=true) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_048(model=model.f5, b=false) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_025(b: Boolean, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_138(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_050(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_138(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_050(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_026(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_027(color: Color, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_028(s2: String, b: Boolean, s1: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_029(b: Boolean, model: RealWorld4_DataModel_08, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_016(model=model.f4, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_016(model=model.f4, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_030(s1: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_121(s2="HelloWorld", s1="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_121(s2="HelloWorld", s1="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_031(model: RealWorld4_DataModel_10, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_032(obj: RealWorld4_UnmemoizablePojo_5, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp1 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp3 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_033(model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_063(model=model.f2, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_063(model=model.f2, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_034(model: RealWorld4_DataModel_10, b: Boolean, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_035(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_036(s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_037(s1: String, model: RealWorld4_DataModel_06, s2: String, number: Int) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_076(model=model.f10, s2="HelloWorld"); }
+flexible(flex = 1f) { RealWorld4_FancyWidget_080(model=model.f11, s1="HelloWorld") {RealWorld4_FancyWidget_081(number=955, b=false, obj=RealWorld4_UnmemoizablePojo_7(), model=model.f11.f7, s1="HelloWorld") {RealWorld4_FancyWidget_061(s2="HelloWorld", model=model.f11.f7.f4.f5); }; }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_076(model=model.f10, s2="HelloWorld"); }
+flexible(flex = 1f) { RealWorld4_FancyWidget_080(model=model.f11, s1="HelloWorld") {RealWorld4_FancyWidget_081(number=670, b=true, obj=RealWorld4_UnmemoizablePojo_7(), model=model.f11.f7, s1="HelloWorld") {RealWorld4_FancyWidget_061(s2="HelloWorld", model=model.f11.f7.f4.f5); }; }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_038(s1: String, model: RealWorld4_DataModel_07, obj: RealWorld4_UnmemoizablePojo_8, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_054(model=model.f5); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_054(model=model.f5); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_039(model: RealWorld4_DataModel_08, s1: String, b: Boolean, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_041(model=model.f0, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_040(model=model.f4, s2="HelloWorld") {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_041(model=model.f0, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_040(model=model.f4, s2="HelloWorld") {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_040(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_053(s1="HelloWorld", model=model.f2); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_053(s1="HelloWorld", model=model.f2); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_041(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_089(model=model.f2, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_027(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5) {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_089(model=model.f2, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_027(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5) {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_042(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_043(s2: String, model: RealWorld4_DataModel_07, obj: RealWorld4_UnmemoizablePojo_13, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8+obj.f9+obj.f10+obj.f11+obj.f12+obj.f13;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_097(s2="HelloWorld", model=model.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_097(s2="HelloWorld", model=model.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_044(s1: String, model: RealWorld4_DataModel_08, obj: RealWorld4_UnmemoizablePojo_3, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_124(s2="HelloWorld", model=model.f0, b=false) {RealWorld4_FancyWidget_127(model=model.f0.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_030(s1="HelloWorld", model=model.f4) {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_124(s2="HelloWorld", model=model.f0, b=true) {RealWorld4_FancyWidget_127(model=model.f0.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_030(s1="HelloWorld", model=model.f4) {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_045(obj: RealWorld4_UnmemoizablePojo_6, s2: String, s1: String, model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7;
+val tmp1 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp3 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_105(model=model.f0, number=744) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_105(model=model.f0, number=709) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_046(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_103(model=model.f2, s2="HelloWorld"); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_103(model=model.f2, s2="HelloWorld"); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_047(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_048(model: RealWorld4_DataModel_10, b: Boolean, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_049(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_107(s2="HelloWorld", model=model.f2, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_013(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_107(s2="HelloWorld", model=model.f2, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_013(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_050(model: RealWorld4_DataModel_10, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_051(number: Int, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_052(model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_053(s1: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_054(model: RealWorld4_DataModel_08) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_056(s2="HelloWorld", number=14, model=model.f0) {RealWorld4_FancyWidget_035(s2="HelloWorld", s1="HelloWorld", model=model.f0.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_055(model=model.f4, s2="HelloWorld") {RealWorld4_FancyWidget_031(model=model.f4.f5, s2="HelloWorld"); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_056(s2="HelloWorld", number=806, model=model.f0) {RealWorld4_FancyWidget_035(s2="HelloWorld", s1="HelloWorld", model=model.f0.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_055(model=model.f4, s2="HelloWorld") {RealWorld4_FancyWidget_031(model=model.f4.f5, s2="HelloWorld"); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_055(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_021(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_021(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_056(s2: String, number: Int, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_128(model=model.f2, s2="HelloWorld", s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_128(model=model.f2, s2="HelloWorld", s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_057(model: RealWorld4_DataModel_10, obj: RealWorld4_UnmemoizablePojo_11, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8+obj.f9+obj.f10+obj.f11+obj.f12+obj.f13;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_058(model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_067(s1="HelloWorld", model=model.f2, s2="HelloWorld", b=false) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_067(s1="HelloWorld", model=model.f2, s2="HelloWorld", b=true) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_059(s2: String, model: RealWorld4_DataModel_10, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_060(s2: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_061(s2: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_062(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_019(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_064(s2="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_019(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_064(s2="HelloWorld", model=model.f5) {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_063(model: RealWorld4_DataModel_10, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_064(s2: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_065(number: Int, s1: String, model: RealWorld4_DataModel_10) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_066(s2: String, model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_067(s1: String, model: RealWorld4_DataModel_10, s2: String, b: Boolean, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_068(model: RealWorld4_DataModel_05, obj: RealWorld4_UnmemoizablePojo_2, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f7;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_140(model=model.f6, s2="HelloWorld") {RealWorld4_FancyWidget_061(s2="HelloWorld", model=model.f6.f11.f7.f4.f5); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_140(model=model.f6, s2="HelloWorld") {RealWorld4_FancyWidget_061(s2="HelloWorld", model=model.f6.f11.f7.f4.f5); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_069(model: RealWorld4_DataModel_06, s2: String, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_092(s1="HelloWorld", model=model.f10) {RealWorld4_FancyWidget_093(s1="HelloWorld", model=model.f10.f7); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_092(s1="HelloWorld", model=model.f10) {RealWorld4_FancyWidget_093(s1="HelloWorld", model=model.f10.f7); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_070(model: RealWorld4_DataModel_07, s1: String, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_029(b=true, model=model.f5, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_148(model=model.f7, s1="HelloWorld"); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_029(b=true, model=model.f5, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_148(model=model.f7, s1="HelloWorld"); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_071(color: Color, model: RealWorld4_DataModel_08, obj: RealWorld4_UnmemoizablePojo_0, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_073(s1="HelloWorld", model=model.f0) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_072(s2="HelloWorld", model=model.f4) {RealWorld4_FancyWidget_060(s2="HelloWorld", model=model.f4.f5); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_073(s1="HelloWorld", model=model.f0) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_072(s2="HelloWorld", model=model.f4) {RealWorld4_FancyWidget_060(s2="HelloWorld", model=model.f4.f5); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_072(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_118(model=model.f2, color=Color(red=0xFF, blue=0x99, green=0x11)) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_118(model=model.f2, color=Color(red=0xFF, blue=0x99, green=0x11)) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_073(s1: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_074(model=model.f2, s2="HelloWorld"); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_074(model=model.f2, s2="HelloWorld"); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_074(model: RealWorld4_DataModel_10, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_075(s1: String, model: RealWorld4_DataModel_06, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_022(model=model.f10, s1="HelloWorld", number=90, s2="HelloWorld") {RealWorld4_FancyWidget_078(model=model.f10.f5.f0, b=false); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_022(model=model.f10, s1="HelloWorld", number=430, s2="HelloWorld") {RealWorld4_FancyWidget_078(model=model.f10.f5.f0, b=true); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_076(model: RealWorld4_DataModel_07, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_077(s2="HelloWorld", s1="HelloWorld", model=model.f5) {RealWorld4_FancyWidget_033(model=model.f5.f0, s1="HelloWorld") {RealWorld4_FancyWidget_020(color=Color(red=0xFF, blue=0x99, green=0x11), s1="HelloWorld", b=false, model=model.f5.f0.f5) {ColoredRect(model.toColor()); }; }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_100(model=model.f7, s2="HelloWorld", s1="HelloWorld") {RealWorld4_FancyWidget_017(s1="HelloWorld", model=model.f7.f4.f5, number=378); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_077(s2="HelloWorld", s1="HelloWorld", model=model.f5) {RealWorld4_FancyWidget_033(model=model.f5.f0, s1="HelloWorld") {RealWorld4_FancyWidget_020(color=Color(red=0xFF, blue=0x99, green=0x11), s1="HelloWorld", b=true, model=model.f5.f0.f5) {ColoredRect(model.toColor()); }; }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_100(model=model.f7, s2="HelloWorld", s1="HelloWorld") {RealWorld4_FancyWidget_017(s1="HelloWorld", model=model.f7.f4.f5, number=359); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_077(s2: String, s1: String, model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_058(model=model.f4) {RealWorld4_FancyWidget_120(model=model.f4.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_058(model=model.f4) {RealWorld4_FancyWidget_120(model=model.f4.f5) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_078(model: RealWorld4_DataModel_09, b: Boolean) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_126(s2="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_079(number=801, model=model.f5) {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_126(s2="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_079(number=560, model=model.f5) {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_079(number: Int, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_080(model: RealWorld4_DataModel_07, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_112(model=model.f5) {RealWorld4_FancyWidget_065(number=378, s1="HelloWorld", model=model.f5.f0.f2); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_112(model=model.f5) {RealWorld4_FancyWidget_065(number=338, s1="HelloWorld", model=model.f5.f0.f2); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_081(number: Int, b: Boolean, obj: RealWorld4_UnmemoizablePojo_7, model: RealWorld4_DataModel_08, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8;
+val tmp1 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp3 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_083(s1="HelloWorld", s2="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_052(model=model.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_082(model=model.f4, s2="HelloWorld") {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_083(s1="HelloWorld", s2="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_052(model=model.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_082(model=model.f4, s2="HelloWorld") {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_082(model: RealWorld4_DataModel_09, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_084(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_084(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_083(s1: String, s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_042(s2="HelloWorld", s1="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_042(s2="HelloWorld", s1="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_084(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_085(model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_088(s2="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_090(model=model.f0.f5, s1="HelloWorld", s2="HelloWorld"); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_088(s2="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_090(model=model.f0.f5, s1="HelloWorld", s2="HelloWorld"); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_086(s1: String, model: RealWorld4_DataModel_09) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_111(model=model.f2, obj=RealWorld4_UnmemoizablePojo_10()) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_032(obj=RealWorld4_UnmemoizablePojo_5(), model=model.f5) {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_111(model=model.f2, obj=RealWorld4_UnmemoizablePojo_10()) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_032(obj=RealWorld4_UnmemoizablePojo_5(), model=model.f5) {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_087(model: RealWorld4_DataModel_10, color: Color) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_088(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_011(model=model.f2, number=151); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_011(model=model.f2, number=619); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_089(model: RealWorld4_DataModel_10, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_090(model: RealWorld4_DataModel_10, s1: String, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_091(model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_092(s1: String, model: RealWorld4_DataModel_07, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_044(s1="HelloWorld", model=model.f5, obj=RealWorld4_UnmemoizablePojo_3(), number=804) {RealWorld4_FancyWidget_099(model=model.f5.f4.f2) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_044(s1="HelloWorld", model=model.f5, obj=RealWorld4_UnmemoizablePojo_3(), number=533) {RealWorld4_FancyWidget_099(model=model.f5.f4.f2) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_093(s1: String, model: RealWorld4_DataModel_08) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_096(s2="HelloWorld", model=model.f0, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_024(s1="HelloWorld", model=model.f4, s2="HelloWorld") {RealWorld4_FancyWidget_095(model=model.f4.f2) {ColoredRect(model.toColor()); }; }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_096(s2="HelloWorld", model=model.f0, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_024(s1="HelloWorld", model=model.f4, s2="HelloWorld") {RealWorld4_FancyWidget_095(model=model.f4.f2) {ColoredRect(model.toColor()); }; }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_094(model: RealWorld4_DataModel_09, obj: RealWorld4_UnmemoizablePojo_9, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_014(s1="HelloWorld", model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_104(model=model.f5, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_014(s1="HelloWorld", model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_104(model=model.f5, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_095(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_096(s2: String, model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_109(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_108(model=model.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_109(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_108(model=model.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_097(s2: String, model: RealWorld4_DataModel_08, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_062(model=model.f0, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_098(s1="HelloWorld", model=model.f4, s2="HelloWorld"); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_062(model=model.f0, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_098(s1="HelloWorld", model=model.f4, s2="HelloWorld"); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_098(s1: String, model: RealWorld4_DataModel_09, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_036(s1="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_059(s2="HelloWorld", model=model.f5, number=553) {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_036(s1="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_059(s2="HelloWorld", model=model.f5, number=769) {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_099(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_100(model: RealWorld4_DataModel_08, s2: String, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_049(s2="HelloWorld", model=model.f0) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_046(s2="HelloWorld", model=model.f4) {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_049(s2="HelloWorld", model=model.f0) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_046(s2="HelloWorld", model=model.f4) {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_101(number: Int, model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_047(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_102(model=model.f5, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_047(model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_102(model=model.f5, s1="HelloWorld", s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_102(model: RealWorld4_DataModel_10, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_103(model: RealWorld4_DataModel_10, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_104(model: RealWorld4_DataModel_10, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_105(model: RealWorld4_DataModel_09, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_026(s2="HelloWorld", s1="HelloWorld", model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_106(model=model.f5) {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_026(s2="HelloWorld", s1="HelloWorld", model=model.f2) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_106(model=model.f5) {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_106(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_107(s2: String, model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_108(model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_109(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_110(s2: String, s1: String, color: Color, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_111(model: RealWorld4_DataModel_10, obj: RealWorld4_UnmemoizablePojo_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_112(model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_116(model=model.f0, number=50) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_113(number=181, model=model.f4) {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_116(model=model.f0, number=149) {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_113(number=766, model=model.f4) {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_113(number: Int, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_114(model=model.f2, s1="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11)) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_115(s2="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, s1="HelloWorld") {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_114(model=model.f2, s1="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11)) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_115(s2="HelloWorld", color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, s1="HelloWorld") {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_114(model: RealWorld4_DataModel_10, s1: String, color: Color, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_115(s2: String, color: Color, model: RealWorld4_DataModel_10, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_116(model: RealWorld4_DataModel_09, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_117(model=model.f5, number=355) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_117(model=model.f5, number=514) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_117(model: RealWorld4_DataModel_10, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_118(model: RealWorld4_DataModel_10, color: Color, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { color::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_119(s1: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_130(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_130(model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_120(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_121(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_122(number: Int, obj: RealWorld4_UnmemoizablePojo_12, b: Boolean, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6;
+val tmp1 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp3 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_123(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_124(s2: String, model: RealWorld4_DataModel_09, b: Boolean, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_125(s2="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_125(s2="HelloWorld", model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_125(s2: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_126(s2: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_127(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_128(model: RealWorld4_DataModel_10, s2: String, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_129(model: RealWorld4_DataModel_10, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_130(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_131(s1: String, s2: String, model: RealWorld4_DataModel_04, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1_modified+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9+model.f10;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_132(s1="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_028(s2="HelloWorld", b=false, s1="HelloWorld", model=model.f0.f6.f11.f7.f4.f2); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_068(model=model.f2, obj=RealWorld4_UnmemoizablePojo_2(), s2="HelloWorld") {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_132(s1="HelloWorld", model=model.f0) {RealWorld4_FancyWidget_028(s2="HelloWorld", b=false, s1="HelloWorld", model=model.f0.f6.f11.f7.f4.f2); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_068(model=model.f2, obj=RealWorld4_UnmemoizablePojo_2(), s2="HelloWorld") {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_132(s1: String, model: RealWorld4_DataModel_05, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f7;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_006(model=model.f0, s1="HelloWorld") {RealWorld4_FancyWidget_043(s2="HelloWorld", model=model.f0.f10, obj=RealWorld4_UnmemoizablePojo_13(), s1="HelloWorld") {RealWorld4_FancyWidget_023(model=model.f0.f10.f7, obj=RealWorld4_UnmemoizablePojo_14()) {RealWorld4_FancyWidget_025(b=false, model=model.f0.f10.f7.f0) {ColoredRect(model.toColor()); }; }; }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_075(s1="HelloWorld", model=model.f6) {RealWorld4_FancyWidget_038(s1="HelloWorld", model=model.f6.f11, obj=RealWorld4_UnmemoizablePojo_8(), s2="HelloWorld") {RealWorld4_FancyWidget_008(s1="HelloWorld", model=model.f6.f11.f7) {RealWorld4_FancyWidget_009(model=model.f6.f11.f7.f4, number=623) {children(); }; }; }; }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_006(model=model.f0, s1="HelloWorld") {RealWorld4_FancyWidget_043(s2="HelloWorld", model=model.f0.f10, obj=RealWorld4_UnmemoizablePojo_13(), s1="HelloWorld") {RealWorld4_FancyWidget_023(model=model.f0.f10.f7, obj=RealWorld4_UnmemoizablePojo_14()) {RealWorld4_FancyWidget_025(b=false, model=model.f0.f10.f7.f0) {ColoredRect(model.toColor()); }; }; }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_075(s1="HelloWorld", model=model.f6) {RealWorld4_FancyWidget_038(s1="HelloWorld", model=model.f6.f11, obj=RealWorld4_UnmemoizablePojo_8(), s2="HelloWorld") {RealWorld4_FancyWidget_008(s1="HelloWorld", model=model.f6.f11.f7) {RealWorld4_FancyWidget_009(model=model.f6.f11.f7.f4, number=809) {children(); }; }; }; }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_133(model: RealWorld4_DataModel_06, s1: String, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_134(model=model.f10) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_143(s2="HelloWorld", number=675, model=model.f11) {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_134(model=model.f10) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_143(s2="HelloWorld", number=903, model=model.f11) {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_134(model: RealWorld4_DataModel_07, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_097(s2="HelloWorld", model=model.f5, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_135(model=model.f7) {RealWorld4_FancyWidget_094(model=model.f7.f4, obj=RealWorld4_UnmemoizablePojo_9()) {ColoredRect(model.toColor()); }; }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_097(s2="HelloWorld", model=model.f5, s1="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_135(model=model.f7) {RealWorld4_FancyWidget_094(model=model.f7.f4, obj=RealWorld4_UnmemoizablePojo_9()) {ColoredRect(model.toColor()); }; }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_135(model: RealWorld4_DataModel_08, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_136(s2="HelloWorld", model=model.f0) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_136(s2="HelloWorld", model=model.f0) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_136(s2: String, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_051(number=428, model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_137(s2="HelloWorld", s1="HelloWorld", model=model.f5) {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_051(number=101, model=model.f2) {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_137(s2="HelloWorld", s1="HelloWorld", model=model.f5) {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_137(s2: String, s1: String, model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_138(model: RealWorld4_DataModel_10, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_139(model: RealWorld4_DataModel_05, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f4+model.f5+model.f7;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_141(model=model.f0, s2="HelloWorld") {RealWorld4_FancyWidget_142(model=model.f0.f11, number=400, s2="HelloWorld"); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_141(model=model.f0, s2="HelloWorld") {RealWorld4_FancyWidget_142(model=model.f0.f11, number=579, s2="HelloWorld"); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_140(model: RealWorld4_DataModel_06, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_076(model=model.f10, s2="HelloWorld"); }
+flexible(flex = 1f) { RealWorld4_FancyWidget_080(model=model.f11, s1="HelloWorld") {RealWorld4_FancyWidget_081(number=291, b=false, obj=RealWorld4_UnmemoizablePojo_7(), model=model.f11.f7, s1="HelloWorld") {children(); }; }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_076(model=model.f10, s2="HelloWorld"); }
+flexible(flex = 1f) { RealWorld4_FancyWidget_080(model=model.f11, s1="HelloWorld") {RealWorld4_FancyWidget_081(number=307, b=false, obj=RealWorld4_UnmemoizablePojo_7(), model=model.f11.f7, s1="HelloWorld") {children(); }; }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_141(model: RealWorld4_DataModel_06, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f5+model.f6+model.f7+model.f8+model.f9;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_092(s1="HelloWorld", model=model.f10) {RealWorld4_FancyWidget_093(s1="HelloWorld", model=model.f10.f7); }; }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_092(s1="HelloWorld", model=model.f10) {RealWorld4_FancyWidget_093(s1="HelloWorld", model=model.f10.f7); }; }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_142(model: RealWorld4_DataModel_07, number: Int, s2: String) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_071(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, obj=RealWorld4_UnmemoizablePojo_0()) {RealWorld4_FancyWidget_066(s2="HelloWorld", model=model.f5.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_085(model=model.f7) {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f7.f4); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_071(color=Color(red=0xFF, blue=0x99, green=0x11), model=model.f5, obj=RealWorld4_UnmemoizablePojo_0()) {RealWorld4_FancyWidget_066(s2="HelloWorld", model=model.f5.f0.f5, s1="HelloWorld") {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_085(model=model.f7) {RealWorld4_FancyWidget_086(s1="HelloWorld", model=model.f7.f4); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_143(s2: String, number: Int, model: RealWorld4_DataModel_07, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3+model.f4+model.f6;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_144(s1="HelloWorld", obj=RealWorld4_UnmemoizablePojo_4(), model=model.f5, number=329) {RealWorld4_FancyWidget_145(s1="HelloWorld", model=model.f5.f4, s2="HelloWorld", number=801) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_039(model=model.f7, s1="HelloWorld", b=false) {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_144(s1="HelloWorld", obj=RealWorld4_UnmemoizablePojo_4(), model=model.f5, number=692) {RealWorld4_FancyWidget_145(s1="HelloWorld", model=model.f5.f4, s2="HelloWorld", number=860) {ColoredRect(model.toColor()); }; }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_039(model=model.f7, s1="HelloWorld", b=false) {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_144(s1: String, obj: RealWorld4_UnmemoizablePojo_4, model: RealWorld4_DataModel_08, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5+obj.f6+obj.f7+obj.f8+obj.f9+obj.f10+obj.f11+obj.f12+obj.f13;
+val tmp1 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp2 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp3 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp4 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_018(number=435, s2="HelloWorld", model=model.f0, s1="HelloWorld", b=false); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_018(number=934, s2="HelloWorld", model=model.f0, s1="HelloWorld", b=true); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_145(s1: String, model: RealWorld4_DataModel_09, s2: String, number: Int, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_057(model=model.f2, obj=RealWorld4_UnmemoizablePojo_11(), s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_122(number=626, obj=RealWorld4_UnmemoizablePojo_12(), b=false, model=model.f5) {children(); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_057(model=model.f2, obj=RealWorld4_UnmemoizablePojo_11(), s1="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_122(number=417, obj=RealWorld4_UnmemoizablePojo_12(), b=false, model=model.f5) {children(); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_146(s1: String, s2: String, number: Int, b: Boolean, model: RealWorld4_DataModel_09, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { number::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_034(model=model.f2, b=false, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_129(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_034(model=model.f2, b=true, s2="HelloWorld") {children(); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_129(model=model.f5, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_147(model: RealWorld4_DataModel_10, s1: String, obj: RealWorld4_UnmemoizablePojo_1, b: Boolean, s2: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f2+model.f3;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = "nbeksu48gsl89k"+obj.f1+obj.f2+obj.f3+obj.f4+obj.f5;
+val tmp3 = obj::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(obj).hashCode()
+ }.joinToString { obj::class.constructors.toString() }.hashCode();
+val tmp4 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { obj::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { b::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s2::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp5 = "lkjzndgke84ts"+tmp0+tmp1+tmp2+tmp3+tmp4;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp5.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { ColoredRect(model.toColor()); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_148(model: RealWorld4_DataModel_08, s1: String) {
+val tmp0 = "jaleiurhgsei48"+model.f1+model.f2+model.f3+model.f5;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_041(model=model.f0, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_149(model=model.f4, s1="HelloWorld") {RealWorld4_FancyWidget_053(s1="HelloWorld", model=model.f4.f2); }; }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_041(model=model.f0, s2="HelloWorld") {ColoredRect(model.toColor()); }; }
+flexible(flex = 1f) { RealWorld4_FancyWidget_149(model=model.f4, s1="HelloWorld") {RealWorld4_FancyWidget_053(s1="HelloWorld", model=model.f4.f2); }; }
+
+ }
+ }
+ }
+ }
+}
+
+@Composable
+fun RealWorld4_FancyWidget_149(model: RealWorld4_DataModel_09, s1: String, children: @Composable() ()->Unit) {
+val tmp0 = "jaleiurhgsei48"+model.f0+model.f1+model.f3+model.f4;
+val tmp1 = model::class.memberProperties.map { property ->
+ property.returnType.toString()+property.getter.call(model).hashCode()
+ }.joinToString { model::class.constructors.toString() }.hashCode();
+val tmp2 = (try { model::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"))+
+(try { s1::class.members }catch(t: Throwable){emptyList<Collection<KCallable<*>>>()}.map{it.toString().reversed()}.joinToString("-"));
+val tmp3 = "lkjzndgke84ts"+tmp0+tmp1+tmp2;
+ WithConstraints { constraints ->
+ Padding(top=1.dp, bottom=1.dp, left=1.dp, right=1.dp) {
+ Draw { canvas, parentSize ->
+ val paint = Paint()
+ SolidColor(tmp3.toColor()).applyBrush(paint)
+ canvas.drawRect(parentSize.toRect(), paint)
+ }
+ if(constraints.maxHeight > constraints.maxWidth) {
+ FlexColumn {
+ flexible(flex = 1f) { RealWorld4_FancyWidget_087(model=model.f5, color=Color(red=0xFF, blue=0x99, green=0x11)); }
+flexible(flex = 1f) { children(); }
+ }
+ } else {
+ FlexRow {
+flexible(flex = 1f) { RealWorld4_FancyWidget_087(model=model.f5, color=Color(red=0xFF, blue=0x99, green=0x11)); }
+flexible(flex = 1f) { children(); }
+
+ }
+ }
+ }
+ }
+}
+
diff --git a/fragment/fragment/src/main/res/interpolator/linear.xml b/compose/compose-runtime/compose-runtime-benchmark/src/main/AndroidManifest.xml
similarity index 75%
rename from fragment/fragment/src/main/res/interpolator/linear.xml
rename to compose/compose-runtime/compose-runtime-benchmark/src/main/AndroidManifest.xml
index 9fa4361..93790c2 100644
--- a/fragment/fragment/src/main/res/interpolator/linear.xml
+++ b/compose/compose-runtime/compose-runtime-benchmark/src/main/AndroidManifest.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2019 The Android Open Source Project
@@ -14,5 +13,5 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/linear.xml-->
-<linearInterpolator />
\ No newline at end of file
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="androidx.compose.benchmark"/>
\ No newline at end of file
diff --git a/compose/compose-runtime/src/main/java/androidx/compose/Composer.kt b/compose/compose-runtime/src/main/java/androidx/compose/Composer.kt
index ab28855..b5b4175 100644
--- a/compose/compose-runtime/src/main/java/androidx/compose/Composer.kt
+++ b/compose/compose-runtime/src/main/java/androidx/compose/Composer.kt
@@ -321,10 +321,10 @@
// Deprecated
override fun <T : N> emitNode(factory: () -> T) {
if (inserting) {
- // The previous pending is the pending information for where the node is being inserted.
- // They must exist as we are in insert mode and entering inserting mode created them.
val insertIndex = nodeIndexStack.peek()
- pending!!.nodeCount++
+ // The pending is the pending information for where the node is being inserted.
+ // pending will be null here when the parent was inserted too.
+ pending?.let { it.nodeCount++ }
groupNodeCount++
recordOperation { applier, slots, _ ->
val node = factory()
@@ -340,10 +340,9 @@
}
override fun <T : N> createNode(factory: () -> T) {
- // The previous pending is the pending information for where the node is being inserted.
- // They must exist as we are in insert mode and entering inserting mode created them.
val insertIndex = nodeIndexStack.peek()
- pending!!.nodeCount++
+ // see emitNode
+ pending?.let { it.nodeCount++ }
groupNodeCount++
recordOperation { applier, slots, _ ->
val node = factory()
@@ -357,7 +356,8 @@
override fun emitNode(node: N) {
assert(inserting) { "emitNode() called when not inserting" }
val insertIndex = nodeIndexStack.peek()
- pending!!.nodeCount++
+ // see emitNode
+ pending?.let { it.nodeCount++ }
groupNodeCount++
recordOperation { applier, slots, _ ->
slots.update(node)
@@ -598,6 +598,24 @@
private fun start(key: Any, action: SlotAction) {
assert(childrenAllowed) { "A call to createNode(), emitNode() or useNode() expected" }
+
+ // Check for the insert fast path. If we are already inserting (creating nodes) then
+ // there is no need to track insert, deletes and moves with a pending changes object.
+ if (inserting) {
+ slots.beginEmpty()
+ recordOperation { _, slots, _ ->
+ slots.update(key)
+ slots.start(action)
+ }
+ pending?.let { pending ->
+ val insertKeyInfo = KeyInfo(key, -1, 0, -1)
+ pending.registerInsert(insertKeyInfo, nodeIndex - pending.startIndex)
+ pending.recordUsed(insertKeyInfo)
+ }
+ enterGroup(action, null, null)
+ return
+ }
+
if (pending == null) {
val slotKey = slots.next()
if (slotKey == key) {
@@ -948,8 +966,11 @@
}
private fun invalidate(scope: RecomposeScope, sync: Boolean) {
- val location = scope.anchor?.location(slotTable) ?: return
- assert(location >= 0) { "Invalid anchor" }
+ val location = scope.anchor?.location(slotTable)
+ ?: return // The scope never entered the composition
+ if (location < 0)
+ return // The scope was removed from the composition
+
invalidations.insertIfMissing(location, scope)
if (isComposing && location > slots.current) {
// if we are invalidating a scope that is going to be traversed during this
diff --git a/core/core/api/restricted_1.2.0-alpha03.txt b/core/core/api/restricted_1.2.0-alpha03.txt
index 5f4db67..0693bb2 100644
--- a/core/core/api/restricted_1.2.0-alpha03.txt
+++ b/core/core/api/restricted_1.2.0-alpha03.txt
@@ -817,10 +817,10 @@
}
public final class ShareCompat {
- method public static void configureMenuItem(android.view.MenuItem!, androidx.core.app.ShareCompat.IntentBuilder!);
- method public static void configureMenuItem(android.view.Menu!, int, androidx.core.app.ShareCompat.IntentBuilder!);
- method public static android.content.ComponentName! getCallingActivity(android.app.Activity!);
- method public static String! getCallingPackage(android.app.Activity!);
+ method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+ method 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";
@@ -828,46 +828,46 @@
}
public static class ShareCompat.IntentBuilder {
- 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 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 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 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 {
- method 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 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 String? getSubject();
+ method public CharSequence? getText();
+ method public String? getType();
method public boolean isMultipleShare();
method public boolean isShareIntent();
method public boolean isSingleShare();
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 5f4db67..0693bb2 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -817,10 +817,10 @@
}
public final class ShareCompat {
- method public static void configureMenuItem(android.view.MenuItem!, androidx.core.app.ShareCompat.IntentBuilder!);
- method public static void configureMenuItem(android.view.Menu!, int, androidx.core.app.ShareCompat.IntentBuilder!);
- method public static android.content.ComponentName! getCallingActivity(android.app.Activity!);
- method public static String! getCallingPackage(android.app.Activity!);
+ method public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+ method 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";
@@ -828,46 +828,46 @@
}
public static class ShareCompat.IntentBuilder {
- 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 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 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 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 {
- method 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 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 String? getSubject();
+ method public CharSequence? getText();
+ method public String? getType();
method public boolean isMultipleShare();
method public boolean isShareIntent();
method public boolean isSingleShare();
diff --git a/core/core/build.gradle b/core/core/build.gradle
index 38a6d7f..910d27b 100644
--- a/core/core/build.gradle
+++ b/core/core/build.gradle
@@ -12,7 +12,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
implementation("androidx.collection:collection:1.0.0")
- api(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
+ api(ARCH_LIFECYCLE_RUNTIME)
api("androidx.versionedparcelable:versionedparcelable:1.1.0-rc01")
androidTestImplementation(KOTLIN_STDLIB)
diff --git a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
index 712ae1e..48bee26 100644
--- a/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
+++ b/core/core/src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java
@@ -16,6 +16,8 @@
package androidx.core.view.accessibility;
+import static android.view.View.NO_ID;
+
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.graphics.Rect;
@@ -923,6 +925,7 @@
* @return If the item is a heading.
* @deprecated Use {@link AccessibilityNodeInfoCompat#isHeading()}
*/
+ @Deprecated
public boolean isHeading() {
if (Build.VERSION.SDK_INT >= 19) {
return ((AccessibilityNodeInfo.CollectionItemInfo) mInfo).isHeading();
@@ -1173,7 +1176,9 @@
* @hide
*/
@RestrictTo(LIBRARY_GROUP_PREFIX)
- public int mParentVirtualDescendantId = -1;
+ public int mParentVirtualDescendantId = NO_ID;
+
+ private int mVirtualDescendantId = NO_ID;
// Actions introduced in IceCreamSandwich
@@ -1691,6 +1696,8 @@
* @param source The info source.
*/
public void setSource(View source) {
+ mVirtualDescendantId = NO_ID;
+
mInfo.setSource(source);
}
@@ -1703,17 +1710,21 @@
* hierarchy for accessibility purposes. This enables custom views that draw complex
* content to report themselves as a tree of virtual views, thus conveying their
* logical structure.
- * </p>
* <p>
- * <strong>Note:</strong> Cannot be called from an
- * {@link android.accessibilityservice.AccessibilityService}.
- * This class is made immutable before being delivered to an AccessibilityService.
- * </p>
+ * <strong>Note:</strong> Cannot be called from an
+ * {@link android.accessibilityservice.AccessibilityService}.
+ * This class is made immutable before being delivered to an AccessibilityService.
+ * <p>
+ * This method is not supported on devices running API level < 16 since the platform did
+ * not support virtual descendants of real views.
*
* @param root The root of the virtual subtree.
* @param virtualDescendantId The id of the virtual descendant.
*/
public void setSource(View root, int virtualDescendantId) {
+ // Store the ID anyway, since we may need it for equality checks.
+ mVirtualDescendantId = virtualDescendantId;
+
if (Build.VERSION.SDK_INT >= 16) {
mInfo.setSource(root, virtualDescendantId);
}
@@ -2091,6 +2102,8 @@
* @throws IllegalStateException If called from an AccessibilityService.
*/
public void setParent(View parent) {
+ mParentVirtualDescendantId = NO_ID;
+
mInfo.setParent(parent);
}
@@ -2103,18 +2116,21 @@
* hierarchy for accessibility purposes. This enables custom views that draw complex
* content to report them selves as a tree of virtual views, thus conveying their
* logical structure.
- * </p>
* <p>
- * <strong>Note:</strong> Cannot be called from an
- * {@link android.accessibilityservice.AccessibilityService}.
- * This class is made immutable before being delivered to an AccessibilityService.
- * </p>
+ * <strong>Note:</strong> Cannot be called from an
+ * {@link android.accessibilityservice.AccessibilityService}.
+ * This class is made immutable before being delivered to an AccessibilityService.
+ * <p>
+ * This method is not supported on devices running API level < 16 since the platform did
+ * not support virtual descendants of real views.
*
* @param root The root of the virtual subtree.
* @param virtualDescendantId The id of the virtual descendant.
*/
public void setParent(View root, int virtualDescendantId) {
+ // Store the ID anyway, since we may need it for equality checks.
mParentVirtualDescendantId = virtualDescendantId;
+
if (Build.VERSION.SDK_INT >= 16) {
mInfo.setParent(root, virtualDescendantId);
}
@@ -3969,6 +3985,12 @@
} else if (!mInfo.equals(other.mInfo)) {
return false;
}
+ if (mVirtualDescendantId != other.mVirtualDescendantId) {
+ return false;
+ }
+ if (mParentVirtualDescendantId != other.mParentVirtualDescendantId) {
+ return false;
+ }
return true;
}
diff --git a/customview/build.gradle b/customview/build.gradle
index 1525c29..886ebde 100644
--- a/customview/build.gradle
+++ b/customview/build.gradle
@@ -17,7 +17,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.1.0-rc01")
+ api(project(":core:core"))
implementation("androidx.collection:collection:1.1.0")
androidTestImplementation(JUNIT)
diff --git a/docs-fake/build.gradle b/docs-fake/build.gradle
index a13de10..d8899df 100644
--- a/docs-fake/build.gradle
+++ b/docs-fake/build.gradle
@@ -35,6 +35,7 @@
project.tasks.whenTaskAdded { task ->
if (task instanceof org.gradle.api.tasks.testing.Test
|| task.name.startsWith("assemble")
+ || task.name == "lint"
|| task.name == "transformDexArchiveWithExternalLibsDexMergerForPublicDebug"
|| task.name == "transformResourcesWithMergeJavaResForPublicDebug"
|| task.name == "checkPublicDebugDuplicateClasses") {
@@ -46,6 +47,9 @@
}
}
+// Also replace some tasks that will have already been created (and not trigger `whenTaskAdded`)
+project.tasks.replace("lint")
+
android {
defaultConfig {
minSdkVersion SupportConfig.TARGET_SDK_VERSION
diff --git a/drawerlayout/build.gradle b/drawerlayout/build.gradle
index 96e9323..7caf70d 100644
--- a/drawerlayout/build.gradle
+++ b/drawerlayout/build.gradle
@@ -28,5 +28,4 @@
mavenGroup = LibraryGroups.DRAWERLAYOUT
inceptionYear = "2018"
description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later."
- failOnDeprecationWarnings = false
}
diff --git a/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java b/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
index 6954d5c..a621870 100644
--- a/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
+++ b/drawerlayout/src/main/java/androidx/drawerlayout/widget/DrawerLayout.java
@@ -2464,9 +2464,6 @@
AccessibilityNodeInfoCompat src) {
final Rect rect = mTmpRect;
- src.getBoundsInParent(rect);
- dest.setBoundsInParent(rect);
-
src.getBoundsInScreen(rect);
dest.setBoundsInScreen(rect);
diff --git a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt
index 3566fc2..f67b19a 100644
--- a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt
+++ b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentViewModelLazy.kt
@@ -30,7 +30,7 @@
* Returns a property delegate to access [ViewModel] by **default** scoped to this [Fragment]:
* ```
* class MyFragment : Fragment() {
- * val viewmodel: NYViewModel by viewmodels()
+ * val viewmodel: MYViewModel by viewmodels()
* }
* ```
*
@@ -94,4 +94,4 @@
AndroidViewModelFactory.getInstance(application)
}
return ViewModelLazy(viewModelClass, storeProducer, factoryPromise)
-}
\ No newline at end of file
+}
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
index 4da5984..435f3c9 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentAnimationTest.kt
@@ -30,6 +30,7 @@
import androidx.core.view.ViewCompat
import androidx.fragment.app.test.FragmentTestActivity
import androidx.fragment.test.R
+import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModelStore
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
@@ -704,7 +705,8 @@
var resourceId: Int = 0
override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {
- if (nextAnim == 0) {
+ if (nextAnim == 0 ||
+ viewLifecycleOwner.lifecycle.currentState == Lifecycle.State.DESTROYED) {
return null
}
numAnimators++
@@ -771,14 +773,16 @@
}
override fun onAnimationEnd(animation: Animation) {
- if (enter) {
- enterEndCount++
- enterLatch.countDown()
- } else {
- exitEndCount++
- // When exiting, the view is detached after onAnimationEnd,
- // so wait one frame to count down the latch
- createdView.post { exitLatch.countDown() }
+ if (!onDestroyViewCalled) {
+ if (enter) {
+ enterEndCount++
+ enterLatch.countDown()
+ } else {
+ exitEndCount++
+ // When exiting, the view is detached after onAnimationEnd,
+ // so wait one frame to count down the latch
+ createdView.post { exitLatch.countDown() }
+ }
}
}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 3eab37a..d4bb8f7 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -1341,13 +1341,11 @@
saveFragmentViewState(f);
}
}
- f.performDestroyView();
- dispatchOnFragmentViewDestroyed(f, false);
+ AnimationOrAnimator anim = null;
if (f.mView != null && f.mContainer != null) {
// Stop any current animations:
f.mContainer.endViewTransition(f.mView);
f.mView.clearAnimation();
- AnimationOrAnimator anim = null;
// If parent is being removed, no need to handle child animations.
if (!f.isRemovingParent()) {
if (mCurState > Fragment.INITIALIZING && !mDestroyed
@@ -1362,14 +1360,9 @@
f.mContainer.removeView(f.mView);
}
}
- f.mContainer = null;
- f.mView = null;
- // Set here to ensure that Observers are called after
- // the Fragment's view is set to null
- f.mViewLifecycleOwner = null;
- f.mViewLifecycleOwnerLiveData.setValue(null);
- f.mInnerView = null;
- f.mInLayout = false;
+ if (anim == null) {
+ destroyFragmentView(f);
+ }
}
// fall through
case Fragment.CREATED:
@@ -1485,6 +1478,7 @@
public void run() {
if (fragment.getAnimatingAway() != null) {
fragment.setAnimatingAway(null);
+ destroyFragmentView(fragment);
moveToState(fragment, fragment.getStateAfterAnimating(), 0, false);
}
}
@@ -1508,6 +1502,7 @@
Animator animator = fragment.getAnimator();
fragment.setAnimator(null);
if (animator != null && container.indexOfChild(viewToAnimate) < 0) {
+ destroyFragmentView(fragment);
moveToState(fragment, fragment.getStateAfterAnimating(), 0, false);
}
}
@@ -1517,6 +1512,19 @@
}
}
+ void destroyFragmentView(@NonNull Fragment fragment) {
+ fragment.performDestroyView();
+ dispatchOnFragmentViewDestroyed(fragment, false);
+ fragment.mContainer = null;
+ fragment.mView = null;
+ // Set here to ensure that Observers are called after
+ // the Fragment's view is set to null
+ fragment.mViewLifecycleOwner = null;
+ fragment.mViewLifecycleOwnerLiveData.setValue(null);
+ fragment.mInnerView = null;
+ fragment.mInLayout = false;
+ }
+
void moveToState(Fragment f) {
moveToState(f, mCurState, 0, false);
}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
index 221326a..4dcba0f 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
@@ -186,12 +186,17 @@
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
+ Fragment fragment = (Fragment) object;
+
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
- + " v=" + ((Fragment)object).getView());
- mCurTransaction.detach((Fragment)object);
+ + " v=" + (fragment.getView()));
+ mCurTransaction.detach(fragment);
+ if (fragment == mCurrentPrimaryItem) {
+ mCurrentPrimaryItem = null;
+ }
}
@SuppressWarnings({"ReferenceEquality", "deprecation"})
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
index 4086802..475f011 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
@@ -218,6 +218,9 @@
mFragments.set(position, null);
mCurTransaction.remove(fragment);
+ if (fragment == mCurrentPrimaryItem) {
+ mCurrentPrimaryItem = null;
+ }
}
@Override
diff --git a/fragment/fragment/src/main/res/interpolator/fast_out_extra_slow_in.xml b/fragment/fragment/src/main/res/anim-v21/fast_out_extra_slow_in.xml
similarity index 100%
rename from fragment/fragment/src/main/res/interpolator/fast_out_extra_slow_in.xml
rename to fragment/fragment/src/main/res/anim-v21/fast_out_extra_slow_in.xml
diff --git a/fragment/fragment/src/main/res/interpolator/decelerate_quad.xml b/fragment/fragment/src/main/res/anim/fast_out_extra_slow_in.xml
similarity index 96%
rename from fragment/fragment/src/main/res/interpolator/decelerate_quad.xml
rename to fragment/fragment/src/main/res/anim/fast_out_extra_slow_in.xml
index 4ff4053..c3baa5d 100644
--- a/fragment/fragment/src/main/res/interpolator/decelerate_quad.xml
+++ b/fragment/fragment/src/main/res/anim/fast_out_extra_slow_in.xml
@@ -15,4 +15,4 @@
limitations under the License.
-->
<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/decelerate_quad.xml-->
-<decelerateInterpolator />
\ No newline at end of file
+<decelerateInterpolator/>
diff --git a/fragment/fragment/src/main/res/anim/fragment_close_enter.xml b/fragment/fragment/src/main/res/anim/fragment_close_enter.xml
index 8c7cbb8..0a2d2b9 100644
--- a/fragment/fragment/src/main/res/anim/fragment_close_enter.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_close_enter.xml
@@ -28,6 +28,6 @@
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
- android:interpolator="@interpolator/fast_out_extra_slow_in"
+ android:interpolator="@anim/fast_out_extra_slow_in"
android:duration="400"/>
</set>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/anim/fragment_close_exit.xml b/fragment/fragment/src/main/res/anim/fragment_close_exit.xml
index d36c1d1..012c886 100644
--- a/fragment/fragment/src/main/res/anim/fragment_close_exit.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_close_exit.xml
@@ -25,7 +25,7 @@
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
- android:interpolator="@interpolator/linear"
+ android:interpolator="@android:anim/linear_interpolator"
android:startOffset="33"
android:duration="50"/>
<scale
@@ -38,6 +38,6 @@
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
- android:interpolator="@interpolator/fast_out_extra_slow_in"
+ android:interpolator="@anim/fast_out_extra_slow_in"
android:duration="400"/>
</set>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/anim/fragment_fade_enter.xml b/fragment/fragment/src/main/res/anim/fragment_fade_enter.xml
index 2fe3947..8838794 100644
--- a/fragment/fragment/src/main/res/anim/fragment_fade_enter.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_fade_enter.xml
@@ -17,6 +17,6 @@
<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/anim/fade_in.xml-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@interpolator/decelerate_quad"
+ android:interpolator="@android:anim/decelerate_interpolator"
android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_longAnimTime" />
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/anim/fragment_fade_exit.xml b/fragment/fragment/src/main/res/anim/fragment_fade_exit.xml
index 462115d..d6c6f2b 100644
--- a/fragment/fragment/src/main/res/anim/fragment_fade_exit.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_fade_exit.xml
@@ -17,7 +17,7 @@
<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/anim/fade_out.xml-->
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@interpolator/accelerate_quad"
+ android:interpolator="@android:anim/accelerate_interpolator"
android:fromAlpha="1.0"
android:toAlpha="0.0"
android:duration="@android:integer/config_mediumAnimTime"
diff --git a/fragment/fragment/src/main/res/anim/fragment_open_enter.xml b/fragment/fragment/src/main/res/anim/fragment_open_enter.xml
index 44065f6..e667dc7 100644
--- a/fragment/fragment/src/main/res/anim/fragment_open_enter.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_open_enter.xml
@@ -25,7 +25,7 @@
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
- android:interpolator="@interpolator/linear"
+ android:interpolator="@android:anim/linear_interpolator"
android:startOffset="50"
android:duration="50"/>
<scale
@@ -38,7 +38,7 @@
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
- android:pathData="@interpolator/fast_out_extra_slow_in"
+ android:pathData="@anim/fast_out_extra_slow_in"
android:duration="400"
tools:targetApi="lollipop" />
</set>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/anim/fragment_open_exit.xml b/fragment/fragment/src/main/res/anim/fragment_open_exit.xml
index b8f3116..4ea1ea7 100644
--- a/fragment/fragment/src/main/res/anim/fragment_open_exit.xml
+++ b/fragment/fragment/src/main/res/anim/fragment_open_exit.xml
@@ -25,7 +25,7 @@
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
- android:interpolator="@interpolator/linear"
+ android:interpolator="@android:anim/linear_interpolator"
android:startOffset="83"
android:duration="167"/>
<scale
@@ -38,6 +38,6 @@
android:fillEnabled="true"
android:fillBefore="true"
android:fillAfter="true"
- android:interpolator="@interpolator/fast_out_extra_slow_in"
+ android:interpolator="@anim/fast_out_extra_slow_in"
android:duration="400"/>
</set>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/interpolator/accelerate_quad.xml b/fragment/fragment/src/main/res/interpolator/accelerate_quad.xml
deleted file mode 100644
index 082db84..0000000
--- a/fragment/fragment/src/main/res/interpolator/accelerate_quad.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2019 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/accelerate_quad.xml-->
-<accelerateInterpolator />
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/interpolator/linear_out_slow_in.xml b/fragment/fragment/src/main/res/interpolator/linear_out_slow_in.xml
deleted file mode 100644
index 02e8c45..0000000
--- a/fragment/fragment/src/main/res/interpolator/linear_out_slow_in.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright 2019 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/linear_out_slow_in.xml-->
-<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
- android:controlX1="0"
- android:controlY1="0"
- android:controlX2="0.2"
- android:controlY2="1"/>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/values/attrs.xml b/fragment/fragment/src/main/res/values/attrs.xml
index 590cbf8..79e797d 100644
--- a/fragment/fragment/src/main/res/values/attrs.xml
+++ b/fragment/fragment/src/main/res/values/attrs.xml
@@ -20,28 +20,4 @@
<attr name="android:id" />
<attr name="android:tag" />
</declare-styleable>
-
-<!-- Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/values/attrs.xml-->
- <declare-styleable name="AccelerateInterpolator">
- <!-- This is the amount of deceleration to add when easing in. -->
- <attr name="factor" format="float" />
- </declare-styleable>
- <declare-styleable name="DecelerateInterpolator">
- <!-- This is the amount of acceleration to add when easing out. -->
- <attr name="factor" />
- </declare-styleable>
- <declare-styleable name="PathInterpolator">
- <!-- The x coordinate of the first control point of the cubic Bezier. -->
- <attr name="controlX1" format="float" />
- <!-- The y coordinate of the first control point of the cubic Bezier. -->
- <attr name="controlY1" format="float" />
- <!-- The x coordinate of the second control point of the cubic Bezier. -->
- <attr name="controlX2" format="float" />
- <!-- The y coordinate of the second control point of the cubic Bezier. -->
- <attr name="controlY2" format="float" />
- <!-- The control points defined as a path.
- When pathData is defined, then both of the control points of the
- cubic Bezier will be ignored. -->
- <attr name="pathData"/>
- </declare-styleable>
</resources>
\ No newline at end of file
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index 98984f7..6b276ed7 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -614,6 +614,10 @@
"to": "ignore"
},
{
+ "from": "androidx/swiperefreshlayout/R(.*)",
+ "to": "ignore"
+ },
+ {
"from": "androidx/swiperefreshlayout/widget/CircleImageView(.*)",
"to": "ignore"
},
diff --git a/lifecycle/integration-tests/incrementality/build.gradle b/lifecycle/integration-tests/incrementality/build.gradle
index 1aabfeee..a20235d 100644
--- a/lifecycle/integration-tests/incrementality/build.gradle
+++ b/lifecycle/integration-tests/incrementality/build.gradle
@@ -66,6 +66,6 @@
// lifecycle-common and annotation are the dependencies of lifecycle-compiler
tasks.findByPath("test").dependsOn(tasks.findByPath(":lifecycle:lifecycle-compiler:uploadArchives"),
tasks.findByPath(":lifecycle:lifecycle-common:uploadArchives"),
- tasks.findByPath(":annotation:uploadArchives"))
+ tasks.findByPath(":annotation:annotation:uploadArchives"))
uploadArchives.enabled = false
\ No newline at end of file
diff --git a/lifecycle/integration-tests/testapp/build.gradle b/lifecycle/integration-tests/testapp/build.gradle
index a770aba..f621691 100644
--- a/lifecycle/integration-tests/testapp/build.gradle
+++ b/lifecycle/integration-tests/testapp/build.gradle
@@ -52,5 +52,3 @@
testImplementation(MOCKITO_CORE)
testAnnotationProcessor(project(":lifecycle:lifecycle-compiler"))
}
-
-tasks['check'].dependsOn(tasks['connectedCheck'])
diff --git a/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
index 109b693..a217af4 100644
--- a/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
+++ b/lifecycle/lifecycle-compiler/src/tests/kotlin/androidx/lifecycle/ValidCasesTest.kt
@@ -24,8 +24,6 @@
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import java.io.File
-import java.lang.Exception
-import java.net.URLClassLoader
import javax.tools.StandardLocation
@RunWith(JUnit4::class)
@@ -120,7 +118,7 @@
@Test
fun testJar() {
JavaSourcesSubject.assertThat(load("foo.DerivedFromJar", ""))
- .withClasspathFrom(libraryClassLoader())
+ .withClasspath(libraryClasspathFiles())
.processedWith(LifecycleProcessor())
.compilesWithoutError().and()
.generatesSources(load("foo.DerivedFromJar_LifecycleAdapter", "expected"))
@@ -129,7 +127,7 @@
@Test
fun testExtendFromJarFailToGenerateAdapter() {
val compileTester = JavaSourcesSubject.assertThat(load("foo.DerivedFromJar1", ""))
- .withClasspathFrom(libraryClassLoader())
+ .withClasspath(libraryClasspathFiles())
.processedWith(LifecycleProcessor())
.compilesWithoutError()
compileTester.withWarningContaining("Failed to generate an Adapter for")
@@ -151,8 +149,11 @@
}
}
- private fun libraryClassLoader(): URLClassLoader {
- val jarUrl = File("src/tests/test-data/lib/test-library.jar").toURI().toURL()
- return URLClassLoader(arrayOf(jarUrl), this.javaClass.classLoader)
+ private fun libraryClasspathFiles() =
+ getSystemClasspathFiles() + File("src/tests/test-data/lib/test-library.jar")
+
+ private fun getSystemClasspathFiles(): Set<File> {
+ val pathSeparator = System.getProperty("path.separator")
+ return System.getProperty("java.class.path").split(pathSeparator).map { File(it) }.toSet()
}
}
diff --git a/lifecycle/lifecycle-extensions/build.gradle b/lifecycle/lifecycle-extensions/build.gradle
index 754870d..b3fdbed 100644
--- a/lifecycle/lifecycle-extensions/build.gradle
+++ b/lifecycle/lifecycle-extensions/build.gradle
@@ -48,7 +48,7 @@
androidTestImplementation(ANDROIDX_TEST_RUNNER)
androidTestImplementation(ANDROIDX_TEST_RULES)
androidTestImplementation(ESPRESSO_CORE)
- androidTestImplementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+ androidTestImplementation(SUPPORT_APPCOMPAT)
androidTestImplementation(project(":internal-testutils"))
}
diff --git a/lifecycle/lifecycle-service/build.gradle b/lifecycle/lifecycle-service/build.gradle
index 934b2ef..108cdee 100644
--- a/lifecycle/lifecycle-service/build.gradle
+++ b/lifecycle/lifecycle-service/build.gradle
@@ -31,7 +31,7 @@
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
androidTestImplementation(ANDROIDX_TEST_RUNNER)
- androidTestImplementation(SUPPORT_CORE_UTILS, libs.support_exclude_config)
+ androidTestImplementation(SUPPORT_CORE_UTILS)
}
androidx {
diff --git a/loader/loader/build.gradle b/loader/loader/build.gradle
index ff3e35c..84bbe11 100644
--- a/loader/loader/build.gradle
+++ b/loader/loader/build.gradle
@@ -17,10 +17,10 @@
dependencies {
api("androidx.annotation:annotation:1.0.0")
+ api(ARCH_LIFECYCLE_VIEWMODEL)
implementation("androidx.core:core:1.0.0")
implementation("androidx.collection:collection:1.0.0")
- implementation(ARCH_LIFECYCLE_LIVEDATA_CORE, libs.exclude_annotations_transitive)
- api(ARCH_LIFECYCLE_VIEWMODEL, libs.exclude_annotations_transitive)
+ implementation(ARCH_LIFECYCLE_LIVEDATA_CORE,)
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/media/version-compat-tests/lib/build.gradle b/media/version-compat-tests/lib/build.gradle
index bd1041d..59e0211 100644
--- a/media/version-compat-tests/lib/build.gradle
+++ b/media/version-compat-tests/lib/build.gradle
@@ -22,8 +22,8 @@
}
dependencies {
- api(project(':annotation'))
- api(project(':versionedparcelable'))
+ api(project(":annotation:annotation"))
+ api(project(":versionedparcelable"))
implementation(JUNIT)
}
diff --git a/media2/session/version-compat-tests/common/build.gradle b/media2/session/version-compat-tests/common/build.gradle
index 3314a46..4b5557e 100644
--- a/media2/session/version-compat-tests/common/build.gradle
+++ b/media2/session/version-compat-tests/common/build.gradle
@@ -22,8 +22,8 @@
}
dependencies {
- api(project(':annotation'))
- api(project(':versionedparcelable'))
+ api(project(":annotation:annotation"))
+ api(project(":versionedparcelable"))
implementation(JUNIT)
}
diff --git a/media2/widget/src/main/java/androidx/media2/widget/MediaControlView.java b/media2/widget/src/main/java/androidx/media2/widget/MediaControlView.java
index 52ed66e..94373aa 100644
--- a/media2/widget/src/main/java/androidx/media2/widget/MediaControlView.java
+++ b/media2/widget/src/main/java/androidx/media2/widget/MediaControlView.java
@@ -25,6 +25,7 @@
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import android.util.Log;
@@ -147,6 +148,10 @@
private static final int SIZE_TYPE_FULL = 1;
private static final int SIZE_TYPE_MINIMAL = 2;
+ private static final int PLAY_BUTTON_PAUSE = 0;
+ private static final int PLAY_BUTTON_PLAY = 1;
+ private static final int PLAY_BUTTON_REPLAY = 2;
+
// Int for defining the UX state where all the views (TitleBar, ProgressBar, BottomBar) are
// all visible.
private static final int UX_STATE_ALL_VISIBLE = 0;
@@ -883,7 +888,7 @@
public void onAnimationEnd(Animator animation) {
mBasicControls.setVisibility(View.INVISIBLE);
- findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setVisibility(
+ findFullSizedControlButton(R.id.ffwd).setVisibility(
mPlayer != null && mPlayer.canSeekForward() ? View.INVISIBLE : View.GONE);
}
});
@@ -901,7 +906,7 @@
public void onAnimationStart(Animator animation) {
mBasicControls.setVisibility(View.VISIBLE);
- findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setVisibility(
+ findFullSizedControlButton(R.id.ffwd).setVisibility(
mPlayer != null && mPlayer.canSeekForward() ? View.VISIBLE : View.GONE);
}
@@ -983,8 +988,8 @@
} else {
if (mAdSkipView.getVisibility() == View.VISIBLE) {
mAdSkipView.setVisibility(View.GONE);
- findControlButton(SIZE_TYPE_FULL, R.id.next).setEnabled(true);
- findControlButton(SIZE_TYPE_FULL, R.id.next).clearColorFilter();
+ findFullSizedControlButton(R.id.next).setEnabled(true);
+ findFullSizedControlButton(R.id.next).clearColorFilter();
}
}
}
@@ -1004,22 +1009,15 @@
void togglePausePlayState() {
ensurePlayerIsNotNull();
- ImageButton playPauseButton = findControlButton(mSizeType, R.id.pause);
if (mPlayer.isPlaying()) {
mPlayer.pause();
- playPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled));
- playPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
+ updatePlayButton(PLAY_BUTTON_PLAY);
} else {
if (mIsShowingReplayButton) {
mPlayer.seekTo(0);
}
mPlayer.play();
- playPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_pause_circle_filled));
- playPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_pause_button_desc));
+ updatePlayButton(PLAY_BUTTON_PAUSE);
}
}
@@ -1417,13 +1415,13 @@
ensurePlayerIsNotNull();
if (mIsAdvertisement) {
- findControlButton(SIZE_TYPE_FULL, R.id.rew).setVisibility(View.GONE);
- findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setVisibility(View.GONE);
- findControlButton(SIZE_TYPE_FULL, R.id.prev).setVisibility(View.GONE);
+ findFullSizedControlButton(R.id.rew).setVisibility(View.GONE);
+ findFullSizedControlButton(R.id.ffwd).setVisibility(View.GONE);
+ findFullSizedControlButton(R.id.prev).setVisibility(View.GONE);
- findControlButton(SIZE_TYPE_FULL, R.id.next).setVisibility(View.VISIBLE);
- findControlButton(SIZE_TYPE_FULL, R.id.next).setEnabled(false);
- findControlButton(SIZE_TYPE_FULL, R.id.next).setColorFilter(R.color.gray);
+ findFullSizedControlButton(R.id.next).setVisibility(View.VISIBLE);
+ findFullSizedControlButton(R.id.next).setEnabled(false);
+ findFullSizedControlButton(R.id.next).setColorFilter(R.color.gray);
mTimeView.setVisibility(View.GONE);
mAdSkipView.setVisibility(View.VISIBLE);
@@ -1432,17 +1430,17 @@
mProgress.setEnabled(false);
} else {
- findControlButton(SIZE_TYPE_FULL, R.id.rew).setVisibility(
+ findFullSizedControlButton(R.id.rew).setVisibility(
mPlayer.canSeekBackward() ? View.VISIBLE : View.GONE);
- findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setVisibility(
+ findFullSizedControlButton(R.id.ffwd).setVisibility(
mPlayer.canSeekForward() ? View.VISIBLE : View.GONE);
- findControlButton(SIZE_TYPE_FULL, R.id.prev).setVisibility(
+ findFullSizedControlButton(R.id.prev).setVisibility(
mPlayer.canSkipToPrevious() ? View.VISIBLE : View.GONE);
- findControlButton(SIZE_TYPE_FULL, R.id.next).setVisibility(
+ findFullSizedControlButton(R.id.next).setVisibility(
mPlayer.canSkipToNext() ? View.VISIBLE : View.GONE);
- findControlButton(SIZE_TYPE_FULL, R.id.next).setEnabled(true);
- findControlButton(SIZE_TYPE_FULL, R.id.next).clearColorFilter();
+ findFullSizedControlButton(R.id.next).setEnabled(true);
+ findFullSizedControlButton(R.id.next).clearColorFilter();
mTimeView.setVisibility(View.VISIBLE);
mAdSkipView.setVisibility(View.GONE);
@@ -1532,8 +1530,22 @@
mCustomPlaybackSpeedIndex = -1;
}
+ @Nullable
ImageButton findControlButton(int sizeType, @IdRes int id) {
- return mTransportControlsMap.get(sizeType).findViewById(id);
+ View transportControl = mTransportControlsMap.get(sizeType);
+ if (transportControl == null) {
+ return null;
+ }
+ return transportControl.findViewById(id);
+ }
+
+ @NonNull
+ ImageButton findFullSizedControlButton(@IdRes int id) {
+ ImageButton button = findControlButton(SIZE_TYPE_FULL, id);
+ if (button == null) {
+ throw new IllegalArgumentException("Couldn't find a view that has the given id");
+ }
+ return button;
}
/**
@@ -1591,10 +1603,10 @@
mTimeView.setAlpha(1 - animatedValue);
mBasicControls.setAlpha(1 - animatedValue);
- int transportControlLeftWidth = findControlButton(SIZE_TYPE_FULL, R.id.pause).getLeft();
+ int transportControlLeftWidth = findFullSizedControlButton(R.id.pause).getLeft();
int transportControlTranslationX = (-1) * (int) (transportControlLeftWidth * animatedValue);
mFullTransportControls.setTranslationX(transportControlTranslationX);
- findControlButton(SIZE_TYPE_FULL, R.id.ffwd).setAlpha(1 - animatedValue);
+ findFullSizedControlButton(R.id.ffwd).setAlpha(1 - animatedValue);
}
void resetHideCallbacks() {
@@ -1701,34 +1713,20 @@
}
void updateReplayButton(boolean toBeShown) {
- ImageButton playPauseButton = findControlButton(mSizeType, R.id.pause);
ImageButton ffwdButton = findControlButton(mSizeType, R.id.ffwd);
if (toBeShown) {
mIsShowingReplayButton = true;
- if (playPauseButton != null) {
- playPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_replay_circle_filled));
- playPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_replay_button_desc));
- }
+ updatePlayButton(PLAY_BUTTON_REPLAY);
if (ffwdButton != null) {
ffwdButton.setAlpha(0.5f);
ffwdButton.setEnabled(false);
}
} else {
mIsShowingReplayButton = false;
- if (playPauseButton != null) {
- if (mPlayer != null && mPlayer.isPlaying()) {
- playPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_pause_circle_filled));
- playPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_pause_button_desc));
- } else {
- playPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled));
- playPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
- }
+ if (mPlayer != null && mPlayer.isPlaying()) {
+ updatePlayButton(PLAY_BUTTON_PAUSE);
+ } else {
+ updatePlayButton(PLAY_BUTTON_PLAY);
}
if (ffwdButton != null) {
ffwdButton.setAlpha(1.0f);
@@ -1737,6 +1735,29 @@
}
}
+ void updatePlayButton(int type) {
+ ImageButton playButton = findControlButton(mSizeType, R.id.pause);
+ if (playButton == null) {
+ return;
+ }
+ Drawable drawable;
+ String description;
+ if (type == PLAY_BUTTON_PAUSE) {
+ drawable = mResources.getDrawable(R.drawable.ic_pause_circle_filled);
+ description = mResources.getString(R.string.mcv2_pause_button_desc);
+ } else if (type == PLAY_BUTTON_PLAY) {
+ drawable = mResources.getDrawable(R.drawable.ic_play_circle_filled);
+ description = mResources.getString(R.string.mcv2_play_button_desc);
+ } else if (type == PLAY_BUTTON_REPLAY) {
+ drawable = mResources.getDrawable(R.drawable.ic_replay_circle_filled);
+ description = mResources.getString(R.string.mcv2_replay_button_desc);
+ } else {
+ throw new IllegalArgumentException("unknown type " + type);
+ }
+ playButton.setImageDrawable(drawable);
+ playButton.setContentDescription(description);
+ }
+
void postDelayedRunnable(Runnable runnable, long interval) {
if (interval != DISABLE_DELAYED_ANIMATION) {
postDelayed(runnable, interval);
@@ -1979,7 +2000,6 @@
// 1) Need to handle case where app customizes playback state behavior when app
// activity is resumed.
// 2) Need to handle case where the media file reaches end of duration.
- ImageButton playPauseButton = findControlButton(mSizeType, R.id.pause);
switch (state) {
case SessionPlayer.PLAYER_STATE_PLAYING:
removeCallbacks(mUpdateProgress);
@@ -1988,20 +2008,14 @@
updateReplayButton(false);
break;
case SessionPlayer.PLAYER_STATE_PAUSED:
- playPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled));
- playPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
+ updatePlayButton(PLAY_BUTTON_PLAY);
removeCallbacks(mUpdateProgress);
removeCallbacks(mHideMainBars);
removeCallbacks(mHideProgressBar);
post(mShowAllBars);
break;
case SessionPlayer.PLAYER_STATE_ERROR:
- playPauseButton.setImageDrawable(
- mResources.getDrawable(R.drawable.ic_play_circle_filled));
- playPauseButton.setContentDescription(
- mResources.getString(R.string.mcv2_play_button_desc));
+ updatePlayButton(PLAY_BUTTON_PLAY);
removeCallbacks(mUpdateProgress);
if (getWindowToken() != null) {
new AlertDialog.Builder(getContext())
diff --git a/navigation/navigation-common-ktx/api/2.2.0-alpha01.txt b/navigation/navigation-common-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..133a124
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,129 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+ ctor public AnimBuilder();
+ method public int getEnter();
+ method public int getExit();
+ method public int getPopEnter();
+ method public int getPopExit();
+ method public void setEnter(int p);
+ method public void setExit(int p);
+ method public void setPopEnter(int p);
+ method public void setPopExit(int p);
+ property public final int enter;
+ property public final int exit;
+ property public final int popEnter;
+ property public final int popExit;
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+ ctor public NavActionBuilder();
+ method public int getDestinationId();
+ method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+ method public void setDestinationId(int p);
+ property public final int destinationId;
+ }
+
+ public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+ ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+ method public Args getValue();
+ method public boolean isInitialized();
+ property public Args value;
+ }
+
+ public final class NavArgsLazyKt {
+ ctor public NavArgsLazyKt();
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+ ctor public NavArgumentBuilder();
+ method public androidx.navigation.NavArgument build();
+ method public Object? getDefaultValue();
+ method public boolean getNullable();
+ method public androidx.navigation.NavType<?> getType();
+ method public void setDefaultValue(Object? value);
+ method public void setNullable(boolean value);
+ method public void setType(androidx.navigation.NavType<?> value);
+ property public final Object? defaultValue;
+ property public final boolean nullable;
+ property public final androidx.navigation.NavType<?> type;
+ }
+
+ @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+ ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+ method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+ method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+ method public D build();
+ method public final void deepLink(String uriPattern);
+ method public final int getId();
+ method public final CharSequence? getLabel();
+ method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+ method public final void setLabel(CharSequence? p);
+ property public final CharSequence? label;
+ }
+
+ @kotlin.DslMarker public @interface NavDestinationDsl {
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+ ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+ method public void addDestination(androidx.navigation.NavDestination destination);
+ method public androidx.navigation.NavGraph build();
+ method public <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+ method public androidx.navigation.NavigatorProvider getProvider();
+ method public operator void unaryPlus(androidx.navigation.NavDestination);
+ }
+
+ public final class NavGraphBuilderKt {
+ ctor public NavGraphBuilderKt();
+ method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class NavGraphKt {
+ ctor public NavGraphKt();
+ method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+ method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+ method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+ method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+ method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+ }
+
+ @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+ ctor public NavOptionsBuilder();
+ method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+ method public boolean getLaunchSingleTop();
+ method public int getPopUpTo();
+ method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+ method public void setLaunchSingleTop(boolean p);
+ method public void setPopUpTo(int value);
+ property public final boolean launchSingleTop;
+ property public final int popUpTo;
+ }
+
+ public final class NavOptionsBuilderKt {
+ ctor public NavOptionsBuilderKt();
+ method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+ }
+
+ @kotlin.DslMarker public @interface NavOptionsDsl {
+ }
+
+ public final class NavigatorProviderKt {
+ ctor public NavigatorProviderKt();
+ method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+ method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+ method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+ method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+ }
+
+ @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+ ctor public PopUpToBuilder();
+ method public boolean getInclusive();
+ method public void setInclusive(boolean p);
+ property public final boolean inclusive;
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-common-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to navigation/navigation-common-ktx/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-common-ktx/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-common-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..133a124
--- /dev/null
+++ b/navigation/navigation-common-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,129 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ @androidx.navigation.NavOptionsDsl public final class AnimBuilder {
+ ctor public AnimBuilder();
+ method public int getEnter();
+ method public int getExit();
+ method public int getPopEnter();
+ method public int getPopExit();
+ method public void setEnter(int p);
+ method public void setExit(int p);
+ method public void setPopEnter(int p);
+ method public void setPopExit(int p);
+ property public final int enter;
+ property public final int exit;
+ property public final int popEnter;
+ property public final int popExit;
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavActionBuilder {
+ ctor public NavActionBuilder();
+ method public int getDestinationId();
+ method public void navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+ method public void setDestinationId(int p);
+ property public final int destinationId;
+ }
+
+ public final class NavArgsLazy<Args extends androidx.navigation.NavArgs> implements kotlin.Lazy<Args> {
+ ctor public NavArgsLazy(kotlin.reflect.KClass<Args> navArgsClass, kotlin.jvm.functions.Function0<android.os.Bundle> argumentProducer);
+ method public Args getValue();
+ method public boolean isInitialized();
+ property public Args value;
+ }
+
+ public final class NavArgsLazyKt {
+ ctor public NavArgsLazyKt();
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavArgumentBuilder {
+ ctor public NavArgumentBuilder();
+ method public androidx.navigation.NavArgument build();
+ method public Object? getDefaultValue();
+ method public boolean getNullable();
+ method public androidx.navigation.NavType<?> getType();
+ method public void setDefaultValue(Object? value);
+ method public void setNullable(boolean value);
+ method public void setType(androidx.navigation.NavType<?> value);
+ property public final Object? defaultValue;
+ property public final boolean nullable;
+ property public final androidx.navigation.NavType<?> type;
+ }
+
+ @androidx.navigation.NavDestinationDsl public class NavDestinationBuilder<D extends androidx.navigation.NavDestination> {
+ ctor public NavDestinationBuilder(androidx.navigation.Navigator<? extends D> navigator, @IdRes int id);
+ method public final void action(int actionId, kotlin.jvm.functions.Function1<? super androidx.navigation.NavActionBuilder,kotlin.Unit> actionBuilder);
+ method public final void argument(String name, kotlin.jvm.functions.Function1<? super androidx.navigation.NavArgumentBuilder,kotlin.Unit> argumentBuilder);
+ method public D build();
+ method public final void deepLink(String uriPattern);
+ method public final int getId();
+ method public final CharSequence? getLabel();
+ method protected final androidx.navigation.Navigator<? extends D> getNavigator();
+ method public final void setLabel(CharSequence? p);
+ property public final CharSequence? label;
+ }
+
+ @kotlin.DslMarker public @interface NavDestinationDsl {
+ }
+
+ @androidx.navigation.NavDestinationDsl public final class NavGraphBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.NavGraph> {
+ ctor public NavGraphBuilder(androidx.navigation.NavigatorProvider provider, @IdRes int id, @IdRes int startDestination);
+ method public void addDestination(androidx.navigation.NavDestination destination);
+ method public androidx.navigation.NavGraph build();
+ method public <D extends androidx.navigation.NavDestination> void destination(androidx.navigation.NavDestinationBuilder<? extends D> navDestination);
+ method public androidx.navigation.NavigatorProvider getProvider();
+ method public operator void unaryPlus(androidx.navigation.NavDestination);
+ }
+
+ public final class NavGraphBuilderKt {
+ ctor public NavGraphBuilderKt();
+ method public static inline androidx.navigation.NavGraph navigation(androidx.navigation.NavigatorProvider, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ method public static inline void navigation(androidx.navigation.NavGraphBuilder, @IdRes int id, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class NavGraphKt {
+ ctor public NavGraphKt();
+ method public static operator boolean contains(androidx.navigation.NavGraph, @IdRes int id);
+ method public static inline operator androidx.navigation.NavDestination get(androidx.navigation.NavGraph, @IdRes int id);
+ method public static inline operator void minusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+ method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavDestination node);
+ method public static inline operator void plusAssign(androidx.navigation.NavGraph, androidx.navigation.NavGraph other);
+ }
+
+ @androidx.navigation.NavOptionsDsl public final class NavOptionsBuilder {
+ ctor public NavOptionsBuilder();
+ method public void anim(kotlin.jvm.functions.Function1<? super androidx.navigation.AnimBuilder,kotlin.Unit> animBuilder);
+ method public boolean getLaunchSingleTop();
+ method public int getPopUpTo();
+ method public void popUpTo(@IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.PopUpToBuilder,kotlin.Unit> popUpToBuilder);
+ method public void setLaunchSingleTop(boolean p);
+ method public void setPopUpTo(int value);
+ property public final boolean launchSingleTop;
+ property public final int popUpTo;
+ }
+
+ public final class NavOptionsBuilderKt {
+ ctor public NavOptionsBuilderKt();
+ method public static androidx.navigation.NavOptions navOptions(kotlin.jvm.functions.Function1<? super androidx.navigation.NavOptionsBuilder,kotlin.Unit> optionsBuilder);
+ }
+
+ @kotlin.DslMarker public @interface NavOptionsDsl {
+ }
+
+ public final class NavigatorProviderKt {
+ ctor public NavigatorProviderKt();
+ method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, String name);
+ method public static inline operator <T extends androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>> T get(androidx.navigation.NavigatorProvider, kotlin.reflect.KClass<T> clazz);
+ method public static inline operator void plusAssign(androidx.navigation.NavigatorProvider, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+ method public static inline operator androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? set(androidx.navigation.NavigatorProvider, String name, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination> navigator);
+ }
+
+ @androidx.navigation.NavOptionsDsl public final class PopUpToBuilder {
+ ctor public PopUpToBuilder();
+ method public boolean getInclusive();
+ method public void setInclusive(boolean p);
+ property public final boolean inclusive;
+ }
+
+}
+
diff --git a/navigation/navigation-common/api/2.2.0-alpha01.txt b/navigation/navigation-common/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..736fe0f
--- /dev/null
+++ b/navigation/navigation-common/api/2.2.0-alpha01.txt
@@ -0,0 +1,196 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+ ctor public ActionOnlyNavDirections(int);
+ method public int getActionId();
+ method public android.os.Bundle getArguments();
+ }
+
+ public interface FloatingWindow {
+ }
+
+ public final class NavAction {
+ ctor public NavAction(@IdRes int);
+ ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?);
+ ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?, android.os.Bundle?);
+ method public android.os.Bundle? getDefaultArguments();
+ method public int getDestinationId();
+ method public androidx.navigation.NavOptions? getNavOptions();
+ method public void setDefaultArguments(android.os.Bundle?);
+ method public void setNavOptions(androidx.navigation.NavOptions?);
+ }
+
+ public interface NavArgs {
+ }
+
+ public final class NavArgument {
+ method public Object? getDefaultValue();
+ method public androidx.navigation.NavType<?> getType();
+ method public boolean isDefaultValuePresent();
+ method public boolean isNullable();
+ }
+
+ public static final class NavArgument.Builder {
+ ctor public NavArgument.Builder();
+ method public androidx.navigation.NavArgument build();
+ method public androidx.navigation.NavArgument.Builder setDefaultValue(Object?);
+ method public androidx.navigation.NavArgument.Builder setIsNullable(boolean);
+ method public androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<?>);
+ }
+
+ public class NavDestination {
+ ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ ctor public NavDestination(String);
+ method public final void addArgument(String, androidx.navigation.NavArgument);
+ method public final void addDeepLink(String);
+ method public final androidx.navigation.NavAction? getAction(@IdRes int);
+ method public final java.util.Map<java.lang.String!,androidx.navigation.NavArgument!> getArguments();
+ method @IdRes public final int getId();
+ method public final CharSequence? getLabel();
+ method public final String getNavigatorName();
+ method public final androidx.navigation.NavGraph? getParent();
+ method public boolean hasDeepLink(android.net.Uri);
+ method @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet);
+ method protected static <C> Class<? extends C> parseClassFromName(android.content.Context, String, Class<? extends C>);
+ method public final void putAction(@IdRes int, @IdRes int);
+ method public final void putAction(@IdRes int, androidx.navigation.NavAction);
+ method public final void removeAction(@IdRes int);
+ method public final void removeArgument(String);
+ method public final void setId(@IdRes int);
+ method public final void setLabel(CharSequence?);
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface NavDestination.ClassType {
+ method public abstract Class<?> value();
+ }
+
+ public interface NavDirections {
+ method @IdRes public int getActionId();
+ method public android.os.Bundle getArguments();
+ }
+
+ public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> {
+ ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph>);
+ method public final void addAll(androidx.navigation.NavGraph);
+ method public final void addDestination(androidx.navigation.NavDestination);
+ method public final void addDestinations(java.util.Collection<androidx.navigation.NavDestination!>);
+ method public final void addDestinations(androidx.navigation.NavDestination!...);
+ method public final void clear();
+ method public final androidx.navigation.NavDestination? findNode(@IdRes int);
+ method @IdRes public final int getStartDestination();
+ method public final java.util.Iterator<androidx.navigation.NavDestination!> iterator();
+ method public final void remove(androidx.navigation.NavDestination);
+ method public final void setStartDestination(@IdRes int);
+ }
+
+ @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+ ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider);
+ method public androidx.navigation.NavGraph createDestination();
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ public final class NavOptions {
+ method @AnimRes @AnimatorRes public int getEnterAnim();
+ method @AnimRes @AnimatorRes public int getExitAnim();
+ method @AnimRes @AnimatorRes public int getPopEnterAnim();
+ method @AnimRes @AnimatorRes public int getPopExitAnim();
+ method @IdRes public int getPopUpTo();
+ method public boolean isPopUpToInclusive();
+ method public boolean shouldLaunchSingleTop();
+ }
+
+ public static final class NavOptions.Builder {
+ ctor public NavOptions.Builder();
+ method public androidx.navigation.NavOptions build();
+ method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean);
+ method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int, boolean);
+ }
+
+ public abstract class NavType<T> {
+ method public static androidx.navigation.NavType<?> fromArgType(String?, String?);
+ method public abstract T? get(android.os.Bundle, String);
+ method public abstract String getName();
+ method public boolean isNullableAllowed();
+ method public abstract T parseValue(String);
+ method public abstract void put(android.os.Bundle, String, T?);
+ field public static final androidx.navigation.NavType<boolean[]!> BoolArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Boolean!> BoolType;
+ field public static final androidx.navigation.NavType<float[]!> FloatArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Float!> FloatType;
+ field public static final androidx.navigation.NavType<int[]!> IntArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Integer!> IntType;
+ field public static final androidx.navigation.NavType<long[]!> LongArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Long!> LongType;
+ field public static final androidx.navigation.NavType<java.lang.Integer!> ReferenceType;
+ field public static final androidx.navigation.NavType<java.lang.String![]!> StringArrayType;
+ field public static final androidx.navigation.NavType<java.lang.String!> StringType;
+ }
+
+ public static final class NavType.EnumType<D extends java.lang.Enum> extends androidx.navigation.NavType.SerializableType<D> {
+ ctor public NavType.EnumType(Class<D!>);
+ }
+
+ public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+ ctor public NavType.ParcelableArrayType(Class<D!>);
+ method public D![]? get(android.os.Bundle, String);
+ method public String getName();
+ method public D![] parseValue(String);
+ method public void put(android.os.Bundle, String, D![]?);
+ }
+
+ public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+ ctor public NavType.ParcelableType(Class<D!>);
+ method public D? get(android.os.Bundle, String);
+ method public String getName();
+ method public D parseValue(String);
+ method public void put(android.os.Bundle, String, D?);
+ }
+
+ public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+ ctor public NavType.SerializableArrayType(Class<D!>);
+ method public D![]? get(android.os.Bundle, String);
+ method public String getName();
+ method public D![] parseValue(String);
+ method public void put(android.os.Bundle, String, D![]?);
+ }
+
+ public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+ ctor public NavType.SerializableType(Class<D!>);
+ method public D? get(android.os.Bundle, String);
+ method public String getName();
+ method public D parseValue(String);
+ method public void put(android.os.Bundle, String, D?);
+ }
+
+ public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+ ctor public Navigator();
+ method public abstract D createDestination();
+ method public abstract androidx.navigation.NavDestination? navigate(D, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public void onRestoreState(android.os.Bundle);
+ method public android.os.Bundle? onSaveState();
+ method public abstract boolean popBackStack();
+ }
+
+ public static interface Navigator.Extras {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface Navigator.Name {
+ method public abstract String value();
+ }
+
+ public class NavigatorProvider {
+ ctor public NavigatorProvider();
+ method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T!>);
+ method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-common/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to navigation/navigation-common/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-common/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-common/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..736fe0f
--- /dev/null
+++ b/navigation/navigation-common/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,196 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ public final class ActionOnlyNavDirections implements androidx.navigation.NavDirections {
+ ctor public ActionOnlyNavDirections(int);
+ method public int getActionId();
+ method public android.os.Bundle getArguments();
+ }
+
+ public interface FloatingWindow {
+ }
+
+ public final class NavAction {
+ ctor public NavAction(@IdRes int);
+ ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?);
+ ctor public NavAction(@IdRes int, androidx.navigation.NavOptions?, android.os.Bundle?);
+ method public android.os.Bundle? getDefaultArguments();
+ method public int getDestinationId();
+ method public androidx.navigation.NavOptions? getNavOptions();
+ method public void setDefaultArguments(android.os.Bundle?);
+ method public void setNavOptions(androidx.navigation.NavOptions?);
+ }
+
+ public interface NavArgs {
+ }
+
+ public final class NavArgument {
+ method public Object? getDefaultValue();
+ method public androidx.navigation.NavType<?> getType();
+ method public boolean isDefaultValuePresent();
+ method public boolean isNullable();
+ }
+
+ public static final class NavArgument.Builder {
+ ctor public NavArgument.Builder();
+ method public androidx.navigation.NavArgument build();
+ method public androidx.navigation.NavArgument.Builder setDefaultValue(Object?);
+ method public androidx.navigation.NavArgument.Builder setIsNullable(boolean);
+ method public androidx.navigation.NavArgument.Builder setType(androidx.navigation.NavType<?>);
+ }
+
+ public class NavDestination {
+ ctor public NavDestination(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ ctor public NavDestination(String);
+ method public final void addArgument(String, androidx.navigation.NavArgument);
+ method public final void addDeepLink(String);
+ method public final androidx.navigation.NavAction? getAction(@IdRes int);
+ method public final java.util.Map<java.lang.String!,androidx.navigation.NavArgument!> getArguments();
+ method @IdRes public final int getId();
+ method public final CharSequence? getLabel();
+ method public final String getNavigatorName();
+ method public final androidx.navigation.NavGraph? getParent();
+ method public boolean hasDeepLink(android.net.Uri);
+ method @CallSuper public void onInflate(android.content.Context, android.util.AttributeSet);
+ method protected static <C> Class<? extends C> parseClassFromName(android.content.Context, String, Class<? extends C>);
+ method public final void putAction(@IdRes int, @IdRes int);
+ method public final void putAction(@IdRes int, androidx.navigation.NavAction);
+ method public final void removeAction(@IdRes int);
+ method public final void removeArgument(String);
+ method public final void setId(@IdRes int);
+ method public final void setLabel(CharSequence?);
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface NavDestination.ClassType {
+ method public abstract Class<?> value();
+ }
+
+ public interface NavDirections {
+ method @IdRes public int getActionId();
+ method public android.os.Bundle getArguments();
+ }
+
+ public class NavGraph extends androidx.navigation.NavDestination implements java.lang.Iterable<androidx.navigation.NavDestination> {
+ ctor public NavGraph(androidx.navigation.Navigator<? extends androidx.navigation.NavGraph>);
+ method public final void addAll(androidx.navigation.NavGraph);
+ method public final void addDestination(androidx.navigation.NavDestination);
+ method public final void addDestinations(java.util.Collection<androidx.navigation.NavDestination!>);
+ method public final void addDestinations(androidx.navigation.NavDestination!...);
+ method public final void clear();
+ method public final androidx.navigation.NavDestination? findNode(@IdRes int);
+ method @IdRes public final int getStartDestination();
+ method public final java.util.Iterator<androidx.navigation.NavDestination!> iterator();
+ method public final void remove(androidx.navigation.NavDestination);
+ method public final void setStartDestination(@IdRes int);
+ }
+
+ @androidx.navigation.Navigator.Name("navigation") public class NavGraphNavigator extends androidx.navigation.Navigator<androidx.navigation.NavGraph> {
+ ctor public NavGraphNavigator(androidx.navigation.NavigatorProvider);
+ method public androidx.navigation.NavGraph createDestination();
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.NavGraph, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ public final class NavOptions {
+ method @AnimRes @AnimatorRes public int getEnterAnim();
+ method @AnimRes @AnimatorRes public int getExitAnim();
+ method @AnimRes @AnimatorRes public int getPopEnterAnim();
+ method @AnimRes @AnimatorRes public int getPopExitAnim();
+ method @IdRes public int getPopUpTo();
+ method public boolean isPopUpToInclusive();
+ method public boolean shouldLaunchSingleTop();
+ }
+
+ public static final class NavOptions.Builder {
+ ctor public NavOptions.Builder();
+ method public androidx.navigation.NavOptions build();
+ method public androidx.navigation.NavOptions.Builder setEnterAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setExitAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setLaunchSingleTop(boolean);
+ method public androidx.navigation.NavOptions.Builder setPopEnterAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setPopExitAnim(@AnimRes @AnimatorRes int);
+ method public androidx.navigation.NavOptions.Builder setPopUpTo(@IdRes int, boolean);
+ }
+
+ public abstract class NavType<T> {
+ method public static androidx.navigation.NavType<?> fromArgType(String?, String?);
+ method public abstract T? get(android.os.Bundle, String);
+ method public abstract String getName();
+ method public boolean isNullableAllowed();
+ method public abstract T parseValue(String);
+ method public abstract void put(android.os.Bundle, String, T?);
+ field public static final androidx.navigation.NavType<boolean[]!> BoolArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Boolean!> BoolType;
+ field public static final androidx.navigation.NavType<float[]!> FloatArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Float!> FloatType;
+ field public static final androidx.navigation.NavType<int[]!> IntArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Integer!> IntType;
+ field public static final androidx.navigation.NavType<long[]!> LongArrayType;
+ field public static final androidx.navigation.NavType<java.lang.Long!> LongType;
+ field public static final androidx.navigation.NavType<java.lang.Integer!> ReferenceType;
+ field public static final androidx.navigation.NavType<java.lang.String![]!> StringArrayType;
+ field public static final androidx.navigation.NavType<java.lang.String!> StringType;
+ }
+
+ public static final class NavType.EnumType<D extends java.lang.Enum> extends androidx.navigation.NavType.SerializableType<D> {
+ ctor public NavType.EnumType(Class<D!>);
+ }
+
+ public static final class NavType.ParcelableArrayType<D extends android.os.Parcelable> extends androidx.navigation.NavType<D[]> {
+ ctor public NavType.ParcelableArrayType(Class<D!>);
+ method public D![]? get(android.os.Bundle, String);
+ method public String getName();
+ method public D![] parseValue(String);
+ method public void put(android.os.Bundle, String, D![]?);
+ }
+
+ public static final class NavType.ParcelableType<D> extends androidx.navigation.NavType<D> {
+ ctor public NavType.ParcelableType(Class<D!>);
+ method public D? get(android.os.Bundle, String);
+ method public String getName();
+ method public D parseValue(String);
+ method public void put(android.os.Bundle, String, D?);
+ }
+
+ public static final class NavType.SerializableArrayType<D extends java.io.Serializable> extends androidx.navigation.NavType<D[]> {
+ ctor public NavType.SerializableArrayType(Class<D!>);
+ method public D![]? get(android.os.Bundle, String);
+ method public String getName();
+ method public D![] parseValue(String);
+ method public void put(android.os.Bundle, String, D![]?);
+ }
+
+ public static class NavType.SerializableType<D extends java.io.Serializable> extends androidx.navigation.NavType<D> {
+ ctor public NavType.SerializableType(Class<D!>);
+ method public D? get(android.os.Bundle, String);
+ method public String getName();
+ method public D parseValue(String);
+ method public void put(android.os.Bundle, String, D?);
+ }
+
+ public abstract class Navigator<D extends androidx.navigation.NavDestination> {
+ ctor public Navigator();
+ method public abstract D createDestination();
+ method public abstract androidx.navigation.NavDestination? navigate(D, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public void onRestoreState(android.os.Bundle);
+ method public android.os.Bundle? onSaveState();
+ method public abstract boolean popBackStack();
+ }
+
+ public static interface Navigator.Extras {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface Navigator.Name {
+ method public abstract String value();
+ }
+
+ public class NavigatorProvider {
+ ctor public NavigatorProvider();
+ method public final androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ method @CallSuper public androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>? addNavigator(String, androidx.navigation.Navigator<? extends androidx.navigation.NavDestination>);
+ method public final <T extends androidx.navigation.Navigator<?>> T getNavigator(Class<T!>);
+ method @CallSuper public <T extends androidx.navigation.Navigator<?>> T getNavigator(String);
+ }
+
+}
+
diff --git a/navigation/navigation-fragment-ktx/api/2.2.0-alpha01.txt b/navigation/navigation-fragment-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..3b93d62
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ public final class NavGraphViewModelLazyKt {
+ ctor public NavGraphViewModelLazyKt();
+ method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+ }
+
+}
+
+package androidx.navigation.fragment {
+
+ public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+ ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+ method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+ }
+
+ public final class DialogFragmentNavigatorDestinationBuilderKt {
+ ctor public DialogFragmentNavigatorDestinationBuilderKt();
+ method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+ method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+ }
+
+ public final class FragmentKt {
+ ctor public FragmentKt();
+ method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+ }
+
+ public final class FragmentNavArgsLazyKt {
+ ctor public FragmentNavArgsLazyKt();
+ method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(androidx.fragment.app.Fragment);
+ }
+
+ public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+ ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+ method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+ }
+
+ public final class FragmentNavigatorDestinationBuilderKt {
+ ctor public FragmentNavigatorDestinationBuilderKt();
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+ }
+
+ public final class FragmentNavigatorExtrasKt {
+ ctor public FragmentNavigatorExtrasKt();
+ method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-fragment-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to navigation/navigation-fragment-ktx/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-fragment-ktx/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-fragment-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..3b93d62
--- /dev/null
+++ b/navigation/navigation-fragment-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ public final class NavGraphViewModelLazyKt {
+ ctor public NavGraphViewModelLazyKt();
+ method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<VM> navGraphViewModels(androidx.fragment.app.Fragment, @IdRes int navGraphId, kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer = null);
+ }
+
+}
+
+package androidx.navigation.fragment {
+
+ public final class DialogFragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+ ctor public DialogFragmentNavigatorDestinationBuilder(androidx.navigation.fragment.DialogFragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.DialogFragment> fragmentClass);
+ method public androidx.navigation.fragment.DialogFragmentNavigator.Destination build();
+ }
+
+ public final class DialogFragmentNavigatorDestinationBuilderKt {
+ ctor public DialogFragmentNavigatorDestinationBuilderKt();
+ method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id);
+ method public static inline <reified F extends androidx.fragment.app.DialogFragment> void dialog(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.DialogFragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+ }
+
+ public final class FragmentKt {
+ ctor public FragmentKt();
+ method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+ }
+
+ public final class FragmentNavArgsLazyKt {
+ ctor public FragmentNavArgsLazyKt();
+ method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(androidx.fragment.app.Fragment);
+ }
+
+ public final class FragmentNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.fragment.FragmentNavigator.Destination> {
+ ctor public FragmentNavigatorDestinationBuilder(androidx.navigation.fragment.FragmentNavigator navigator, @IdRes int id, kotlin.reflect.KClass<? extends androidx.fragment.app.Fragment> fragmentClass);
+ method public androidx.navigation.fragment.FragmentNavigator.Destination build();
+ }
+
+ public final class FragmentNavigatorDestinationBuilderKt {
+ ctor public FragmentNavigatorDestinationBuilderKt();
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> void fragment(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.fragment.FragmentNavigatorDestinationBuilder,kotlin.Unit> builder);
+ }
+
+ public final class FragmentNavigatorExtrasKt {
+ ctor public FragmentNavigatorExtrasKt();
+ method public static androidx.navigation.fragment.FragmentNavigator.Extras FragmentNavigatorExtras(kotlin.Pair<? extends android.view.View,java.lang.String>... sharedElements);
+ }
+
+}
+
diff --git a/navigation/navigation-fragment-ktx/build.gradle b/navigation/navigation-fragment-ktx/build.gradle
index f6c26c3..b588ff0 100644
--- a/navigation/navigation-fragment-ktx/build.gradle
+++ b/navigation/navigation-fragment-ktx/build.gradle
@@ -38,8 +38,8 @@
api(project(":navigation:navigation-fragment"))
// Ensure that the -ktx dependency graph mirrors the Java dependency graph
api(project(":navigation:navigation-runtime-ktx"))
- api("androidx.fragment:fragment-ktx:1.1.0-rc01")
- api("androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0-rc01")
+ api(project(":fragment:fragment-ktx"))
+ api(project(":lifecycle:lifecycle-viewmodel-ktx"))
api(KOTLIN_STDLIB)
androidTestImplementation("androidx.fragment:fragment-testing:1.1.0-rc01")
androidTestImplementation(project(":navigation:navigation-testing"))
diff --git a/navigation/navigation-fragment/api/2.2.0-alpha01.txt b/navigation/navigation-fragment/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..fa67952
--- /dev/null
+++ b/navigation/navigation-fragment/api/2.2.0-alpha01.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+ @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+ ctor public DialogFragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager);
+ method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ @androidx.navigation.NavDestination.ClassType(DialogFragment.class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+ ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+ ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination>);
+ method public final String getClassName();
+ method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String);
+ }
+
+ @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+ ctor public FragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager, int);
+ method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+ method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context, androidx.fragment.app.FragmentManager, String, android.os.Bundle?);
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ @androidx.navigation.NavDestination.ClassType(Fragment.class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+ ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+ ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination>);
+ method public final String getClassName();
+ method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String);
+ }
+
+ public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+ method public java.util.Map<android.view.View!,java.lang.String!> getSharedElements();
+ }
+
+ public static final class FragmentNavigator.Extras.Builder {
+ ctor public FragmentNavigator.Extras.Builder();
+ method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View, String);
+ method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View!,java.lang.String!>);
+ method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+ }
+
+ public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+ ctor public NavHostFragment();
+ method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int);
+ method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int, android.os.Bundle?);
+ method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+ method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+ method public final androidx.navigation.NavController getNavController();
+ method @CallSuper protected void onCreateNavController(androidx.navigation.NavController);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-fragment/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to navigation/navigation-fragment/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-fragment/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-fragment/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..fa67952
--- /dev/null
+++ b/navigation/navigation-fragment/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,55 @@
+// Signature format: 3.0
+package androidx.navigation.fragment {
+
+ @androidx.navigation.Navigator.Name("dialog") public final class DialogFragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.DialogFragmentNavigator.Destination> {
+ ctor public DialogFragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager);
+ method public androidx.navigation.fragment.DialogFragmentNavigator.Destination createDestination();
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.DialogFragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ @androidx.navigation.NavDestination.ClassType(DialogFragment.class) public static class DialogFragmentNavigator.Destination extends androidx.navigation.NavDestination implements androidx.navigation.FloatingWindow {
+ ctor public DialogFragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+ ctor public DialogFragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.DialogFragmentNavigator.Destination>);
+ method public final String getClassName();
+ method public final androidx.navigation.fragment.DialogFragmentNavigator.Destination setClassName(String);
+ }
+
+ @androidx.navigation.Navigator.Name("fragment") public class FragmentNavigator extends androidx.navigation.Navigator<androidx.navigation.fragment.FragmentNavigator.Destination> {
+ ctor public FragmentNavigator(android.content.Context, androidx.fragment.app.FragmentManager, int);
+ method public androidx.navigation.fragment.FragmentNavigator.Destination createDestination();
+ method @Deprecated public androidx.fragment.app.Fragment instantiateFragment(android.content.Context, androidx.fragment.app.FragmentManager, String, android.os.Bundle?);
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.fragment.FragmentNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ @androidx.navigation.NavDestination.ClassType(Fragment.class) public static class FragmentNavigator.Destination extends androidx.navigation.NavDestination {
+ ctor public FragmentNavigator.Destination(androidx.navigation.NavigatorProvider);
+ ctor public FragmentNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination>);
+ method public final String getClassName();
+ method public final androidx.navigation.fragment.FragmentNavigator.Destination setClassName(String);
+ }
+
+ public static final class FragmentNavigator.Extras implements androidx.navigation.Navigator.Extras {
+ method public java.util.Map<android.view.View!,java.lang.String!> getSharedElements();
+ }
+
+ public static final class FragmentNavigator.Extras.Builder {
+ ctor public FragmentNavigator.Extras.Builder();
+ method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElement(android.view.View, String);
+ method public androidx.navigation.fragment.FragmentNavigator.Extras.Builder addSharedElements(java.util.Map<android.view.View!,java.lang.String!>);
+ method public androidx.navigation.fragment.FragmentNavigator.Extras build();
+ }
+
+ public class NavHostFragment extends androidx.fragment.app.Fragment implements androidx.navigation.NavHost {
+ ctor public NavHostFragment();
+ method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int);
+ method public static androidx.navigation.fragment.NavHostFragment create(@NavigationRes int, android.os.Bundle?);
+ method @Deprecated protected androidx.navigation.Navigator<? extends androidx.navigation.fragment.FragmentNavigator.Destination> createFragmentNavigator();
+ method public static androidx.navigation.NavController findNavController(androidx.fragment.app.Fragment);
+ method public final androidx.navigation.NavController getNavController();
+ method @CallSuper protected void onCreateNavController(androidx.navigation.NavController);
+ }
+
+}
+
diff --git a/navigation/navigation-fragment/build.gradle b/navigation/navigation-fragment/build.gradle
index 83d19df..03f1adb 100644
--- a/navigation/navigation-fragment/build.gradle
+++ b/navigation/navigation-fragment/build.gradle
@@ -27,7 +27,7 @@
}
dependencies {
- api("androidx.fragment:fragment:1.1.0-rc01")
+ api(project(":fragment:fragment"))
api(project(":navigation:navigation-runtime"))
androidTestImplementation(project(":navigation:navigation-testing"))
diff --git a/navigation/navigation-runtime-ktx/api/2.2.0-alpha01.txt b/navigation/navigation-runtime-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..fa3dc07
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,60 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ public final class ActivityKt {
+ ctor public ActivityKt();
+ method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+ }
+
+ public final class ActivityNavArgsLazyKt {
+ ctor public ActivityNavArgsLazyKt();
+ method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(android.app.Activity);
+ }
+
+ public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+ ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+ method public androidx.navigation.ActivityNavigator.Destination build();
+ method public String? getAction();
+ method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+ method public android.net.Uri? getData();
+ method public String? getDataPattern();
+ method public String? getTargetPackage();
+ method public void setAction(String? p);
+ method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? p);
+ method public void setData(android.net.Uri? p);
+ method public void setDataPattern(String? p);
+ method public void setTargetPackage(String? p);
+ property public final String? action;
+ property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+ property public final android.net.Uri? data;
+ property public final String? dataPattern;
+ property public final String? targetPackage;
+ }
+
+ public final class ActivityNavigatorDestinationBuilderKt {
+ ctor public ActivityNavigatorDestinationBuilderKt();
+ method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+ }
+
+ public final class ActivityNavigatorExtrasKt {
+ ctor public ActivityNavigatorExtrasKt();
+ method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(androidx.core.app.ActivityOptionsCompat? activityOptions = null, int flags = 0);
+ }
+
+ public final class NavControllerKt {
+ ctor public NavControllerKt();
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class NavHostKt {
+ ctor public NavHostKt();
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class ViewKt {
+ ctor public ViewKt();
+ method public static androidx.navigation.NavController findNavController(android.view.View);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-runtime-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to navigation/navigation-runtime-ktx/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-runtime-ktx/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-runtime-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..fa3dc07
--- /dev/null
+++ b/navigation/navigation-runtime-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,60 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ public final class ActivityKt {
+ ctor public ActivityKt();
+ method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int viewId);
+ }
+
+ public final class ActivityNavArgsLazyKt {
+ ctor public ActivityNavArgsLazyKt();
+ method @MainThread public static inline <reified Args extends androidx.navigation.NavArgs> androidx.navigation.NavArgsLazy<Args> navArgs(android.app.Activity);
+ }
+
+ public final class ActivityNavigatorDestinationBuilder extends androidx.navigation.NavDestinationBuilder<androidx.navigation.ActivityNavigator.Destination> {
+ ctor public ActivityNavigatorDestinationBuilder(androidx.navigation.ActivityNavigator navigator, @IdRes int id);
+ method public androidx.navigation.ActivityNavigator.Destination build();
+ method public String? getAction();
+ method public kotlin.reflect.KClass<? extends android.app.Activity>? getActivityClass();
+ method public android.net.Uri? getData();
+ method public String? getDataPattern();
+ method public String? getTargetPackage();
+ method public void setAction(String? p);
+ method public void setActivityClass(kotlin.reflect.KClass<? extends android.app.Activity>? p);
+ method public void setData(android.net.Uri? p);
+ method public void setDataPattern(String? p);
+ method public void setTargetPackage(String? p);
+ property public final String? action;
+ property public final kotlin.reflect.KClass<? extends android.app.Activity>? activityClass;
+ property public final android.net.Uri? data;
+ property public final String? dataPattern;
+ property public final String? targetPackage;
+ }
+
+ public final class ActivityNavigatorDestinationBuilderKt {
+ ctor public ActivityNavigatorDestinationBuilderKt();
+ method public static inline void activity(androidx.navigation.NavGraphBuilder, @IdRes int id, kotlin.jvm.functions.Function1<? super androidx.navigation.ActivityNavigatorDestinationBuilder,kotlin.Unit> builder);
+ }
+
+ public final class ActivityNavigatorExtrasKt {
+ ctor public ActivityNavigatorExtrasKt();
+ method public static androidx.navigation.ActivityNavigator.Extras ActivityNavigatorExtras(androidx.core.app.ActivityOptionsCompat? activityOptions = null, int flags = 0);
+ }
+
+ public final class NavControllerKt {
+ ctor public NavControllerKt();
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavController, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class NavHostKt {
+ ctor public NavHostKt();
+ method public static inline androidx.navigation.NavGraph createGraph(androidx.navigation.NavHost, @IdRes int id = 0, @IdRes int startDestination, kotlin.jvm.functions.Function1<? super androidx.navigation.NavGraphBuilder,kotlin.Unit> builder);
+ }
+
+ public final class ViewKt {
+ ctor public ViewKt();
+ method public static androidx.navigation.NavController findNavController(android.view.View);
+ }
+
+}
+
diff --git a/navigation/navigation-runtime-ktx/build.gradle b/navigation/navigation-runtime-ktx/build.gradle
index 41b34bf..e5535ec 100644
--- a/navigation/navigation-runtime-ktx/build.gradle
+++ b/navigation/navigation-runtime-ktx/build.gradle
@@ -38,6 +38,12 @@
api(project(":navigation:navigation-runtime"))
// Ensure that the -ktx dependency graph mirrors the Java dependency graph
api(project(":navigation:navigation-common-ktx"))
+ api(project(":activity:activity-ktx")) {
+ because 'Mirror navigation-runtime dependency graph for -ktx artifacts'
+ }
+ api(project(":lifecycle:lifecycle-viewmodel-ktx")) {
+ because 'Mirror navigation-runtime dependency graph for -ktx artifacts'
+ }
api(KOTLIN_STDLIB)
androidTestImplementation(project(":navigation:navigation-testing"))
androidTestImplementation(TRUTH)
diff --git a/navigation/navigation-runtime/api/2.2.0-alpha01.txt b/navigation/navigation-runtime/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..f361023
--- /dev/null
+++ b/navigation/navigation-runtime/api/2.2.0-alpha01.txt
@@ -0,0 +1,118 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+ ctor public ActivityNavigator(android.content.Context);
+ method public static void applyPopAnimationsToPendingTransition(android.app.Activity);
+ method public androidx.navigation.ActivityNavigator.Destination createDestination();
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ @androidx.navigation.NavDestination.ClassType(Activity.class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+ ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider);
+ ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination>);
+ method public final String? getAction();
+ method public final android.content.ComponentName? getComponent();
+ method public final android.net.Uri? getData();
+ method public final String? getDataPattern();
+ method public final android.content.Intent? getIntent();
+ method public final String? getTargetPackage();
+ method public final androidx.navigation.ActivityNavigator.Destination setAction(String?);
+ method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName?);
+ method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri?);
+ method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String?);
+ method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent?);
+ method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String?);
+ }
+
+ public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+ method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+ method public int getFlags();
+ }
+
+ public static final class ActivityNavigator.Extras.Builder {
+ ctor public ActivityNavigator.Extras.Builder();
+ method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int);
+ method public androidx.navigation.ActivityNavigator.Extras build();
+ method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat);
+ }
+
+ public class NavController {
+ ctor public NavController(android.content.Context);
+ method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+ method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+ method public androidx.navigation.NavDestination? getCurrentDestination();
+ method public androidx.navigation.NavGraph getGraph();
+ method public androidx.navigation.NavInflater getNavInflater();
+ method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+ method @Deprecated public androidx.lifecycle.ViewModelStore getViewModelStore(@IdRes int);
+ method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int);
+ method public boolean handleDeepLink(android.content.Intent?);
+ method public void navigate(@IdRes int);
+ method public void navigate(@IdRes int, android.os.Bundle?);
+ method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?);
+ method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public void navigate(android.net.Uri);
+ method public void navigate(android.net.Uri, androidx.navigation.NavOptions?);
+ method public void navigate(android.net.Uri, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public void navigate(androidx.navigation.NavDirections);
+ method public void navigate(androidx.navigation.NavDirections, androidx.navigation.NavOptions?);
+ method public void navigate(androidx.navigation.NavDirections, androidx.navigation.Navigator.Extras);
+ method public boolean navigateUp();
+ method public boolean popBackStack();
+ method public boolean popBackStack(@IdRes int, boolean);
+ method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+ method @CallSuper public void restoreState(android.os.Bundle?);
+ method @CallSuper public android.os.Bundle? saveState();
+ method @CallSuper public void setGraph(@NavigationRes int);
+ method @CallSuper public void setGraph(@NavigationRes int, android.os.Bundle?);
+ method @CallSuper public void setGraph(androidx.navigation.NavGraph);
+ method @CallSuper public void setGraph(androidx.navigation.NavGraph, android.os.Bundle?);
+ field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+ }
+
+ public static interface NavController.OnDestinationChangedListener {
+ method public void onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle?);
+ }
+
+ public final class NavDeepLinkBuilder {
+ ctor public NavDeepLinkBuilder(android.content.Context);
+ method public android.app.PendingIntent createPendingIntent();
+ method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+ method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle?);
+ method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity>);
+ method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName);
+ method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int);
+ method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int);
+ method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph);
+ }
+
+ public interface NavHost {
+ method public androidx.navigation.NavController getNavController();
+ }
+
+ public final class NavHostController extends androidx.navigation.NavController {
+ ctor public NavHostController(android.content.Context);
+ method public void enableOnBackPressed(boolean);
+ method public void setLifecycleOwner(androidx.lifecycle.LifecycleOwner);
+ method public void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher);
+ method public void setViewModelStore(androidx.lifecycle.ViewModelStore);
+ }
+
+ public final class NavInflater {
+ ctor public NavInflater(android.content.Context, androidx.navigation.NavigatorProvider);
+ method public androidx.navigation.NavGraph inflate(@NavigationRes int);
+ }
+
+ public final class Navigation {
+ method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int);
+ method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int, android.os.Bundle?);
+ method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections);
+ method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int);
+ method public static androidx.navigation.NavController findNavController(android.view.View);
+ method public static void setViewNavController(android.view.View, androidx.navigation.NavController?);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-runtime/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to navigation/navigation-runtime/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-runtime/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-runtime/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..f361023
--- /dev/null
+++ b/navigation/navigation-runtime/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,118 @@
+// Signature format: 3.0
+package androidx.navigation {
+
+ @androidx.navigation.Navigator.Name("activity") public class ActivityNavigator extends androidx.navigation.Navigator<androidx.navigation.ActivityNavigator.Destination> {
+ ctor public ActivityNavigator(android.content.Context);
+ method public static void applyPopAnimationsToPendingTransition(android.app.Activity);
+ method public androidx.navigation.ActivityNavigator.Destination createDestination();
+ method public androidx.navigation.NavDestination? navigate(androidx.navigation.ActivityNavigator.Destination, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public boolean popBackStack();
+ }
+
+ @androidx.navigation.NavDestination.ClassType(Activity.class) public static class ActivityNavigator.Destination extends androidx.navigation.NavDestination {
+ ctor public ActivityNavigator.Destination(androidx.navigation.NavigatorProvider);
+ ctor public ActivityNavigator.Destination(androidx.navigation.Navigator<? extends androidx.navigation.ActivityNavigator.Destination>);
+ method public final String? getAction();
+ method public final android.content.ComponentName? getComponent();
+ method public final android.net.Uri? getData();
+ method public final String? getDataPattern();
+ method public final android.content.Intent? getIntent();
+ method public final String? getTargetPackage();
+ method public final androidx.navigation.ActivityNavigator.Destination setAction(String?);
+ method public final androidx.navigation.ActivityNavigator.Destination setComponentName(android.content.ComponentName?);
+ method public final androidx.navigation.ActivityNavigator.Destination setData(android.net.Uri?);
+ method public final androidx.navigation.ActivityNavigator.Destination setDataPattern(String?);
+ method public final androidx.navigation.ActivityNavigator.Destination setIntent(android.content.Intent?);
+ method public final androidx.navigation.ActivityNavigator.Destination setTargetPackage(String?);
+ }
+
+ public static final class ActivityNavigator.Extras implements androidx.navigation.Navigator.Extras {
+ method public androidx.core.app.ActivityOptionsCompat? getActivityOptions();
+ method public int getFlags();
+ }
+
+ public static final class ActivityNavigator.Extras.Builder {
+ ctor public ActivityNavigator.Extras.Builder();
+ method public androidx.navigation.ActivityNavigator.Extras.Builder addFlags(int);
+ method public androidx.navigation.ActivityNavigator.Extras build();
+ method public androidx.navigation.ActivityNavigator.Extras.Builder setActivityOptions(androidx.core.app.ActivityOptionsCompat);
+ }
+
+ public class NavController {
+ ctor public NavController(android.content.Context);
+ method public void addOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+ method public androidx.navigation.NavDeepLinkBuilder createDeepLink();
+ method public androidx.navigation.NavDestination? getCurrentDestination();
+ method public androidx.navigation.NavGraph getGraph();
+ method public androidx.navigation.NavInflater getNavInflater();
+ method public androidx.navigation.NavigatorProvider getNavigatorProvider();
+ method @Deprecated public androidx.lifecycle.ViewModelStore getViewModelStore(@IdRes int);
+ method public androidx.lifecycle.ViewModelStoreOwner getViewModelStoreOwner(@IdRes int);
+ method public boolean handleDeepLink(android.content.Intent?);
+ method public void navigate(@IdRes int);
+ method public void navigate(@IdRes int, android.os.Bundle?);
+ method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?);
+ method public void navigate(@IdRes int, android.os.Bundle?, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public void navigate(android.net.Uri);
+ method public void navigate(android.net.Uri, androidx.navigation.NavOptions?);
+ method public void navigate(android.net.Uri, androidx.navigation.NavOptions?, androidx.navigation.Navigator.Extras?);
+ method public void navigate(androidx.navigation.NavDirections);
+ method public void navigate(androidx.navigation.NavDirections, androidx.navigation.NavOptions?);
+ method public void navigate(androidx.navigation.NavDirections, androidx.navigation.Navigator.Extras);
+ method public boolean navigateUp();
+ method public boolean popBackStack();
+ method public boolean popBackStack(@IdRes int, boolean);
+ method public void removeOnDestinationChangedListener(androidx.navigation.NavController.OnDestinationChangedListener);
+ method @CallSuper public void restoreState(android.os.Bundle?);
+ method @CallSuper public android.os.Bundle? saveState();
+ method @CallSuper public void setGraph(@NavigationRes int);
+ method @CallSuper public void setGraph(@NavigationRes int, android.os.Bundle?);
+ method @CallSuper public void setGraph(androidx.navigation.NavGraph);
+ method @CallSuper public void setGraph(androidx.navigation.NavGraph, android.os.Bundle?);
+ field public static final String KEY_DEEP_LINK_INTENT = "android-support-nav:controller:deepLinkIntent";
+ }
+
+ public static interface NavController.OnDestinationChangedListener {
+ method public void onDestinationChanged(androidx.navigation.NavController, androidx.navigation.NavDestination, android.os.Bundle?);
+ }
+
+ public final class NavDeepLinkBuilder {
+ ctor public NavDeepLinkBuilder(android.content.Context);
+ method public android.app.PendingIntent createPendingIntent();
+ method public androidx.core.app.TaskStackBuilder createTaskStackBuilder();
+ method public androidx.navigation.NavDeepLinkBuilder setArguments(android.os.Bundle?);
+ method public androidx.navigation.NavDeepLinkBuilder setComponentName(Class<? extends android.app.Activity>);
+ method public androidx.navigation.NavDeepLinkBuilder setComponentName(android.content.ComponentName);
+ method public androidx.navigation.NavDeepLinkBuilder setDestination(@IdRes int);
+ method public androidx.navigation.NavDeepLinkBuilder setGraph(@NavigationRes int);
+ method public androidx.navigation.NavDeepLinkBuilder setGraph(androidx.navigation.NavGraph);
+ }
+
+ public interface NavHost {
+ method public androidx.navigation.NavController getNavController();
+ }
+
+ public final class NavHostController extends androidx.navigation.NavController {
+ ctor public NavHostController(android.content.Context);
+ method public void enableOnBackPressed(boolean);
+ method public void setLifecycleOwner(androidx.lifecycle.LifecycleOwner);
+ method public void setOnBackPressedDispatcher(androidx.activity.OnBackPressedDispatcher);
+ method public void setViewModelStore(androidx.lifecycle.ViewModelStore);
+ }
+
+ public final class NavInflater {
+ ctor public NavInflater(android.content.Context, androidx.navigation.NavigatorProvider);
+ method public androidx.navigation.NavGraph inflate(@NavigationRes int);
+ }
+
+ public final class Navigation {
+ method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int);
+ method public static android.view.View.OnClickListener createNavigateOnClickListener(@IdRes int, android.os.Bundle?);
+ method public static android.view.View.OnClickListener createNavigateOnClickListener(androidx.navigation.NavDirections);
+ method public static androidx.navigation.NavController findNavController(android.app.Activity, @IdRes int);
+ method public static androidx.navigation.NavController findNavController(android.view.View);
+ method public static void setViewNavController(android.view.View, androidx.navigation.NavController?);
+ }
+
+}
+
diff --git a/navigation/navigation-runtime/build.gradle b/navigation/navigation-runtime/build.gradle
index e222ddd..9afb788 100644
--- a/navigation/navigation-runtime/build.gradle
+++ b/navigation/navigation-runtime/build.gradle
@@ -28,8 +28,8 @@
dependencies {
api(project(":navigation:navigation-common"))
- api("androidx.activity:activity:1.0.0-rc01")
- api("androidx.lifecycle:lifecycle-viewmodel:2.1.0-rc01")
+ api(project(":activity:activity"))
+ api(project(":lifecycle:lifecycle-viewmodel"))
androidTestImplementation(project(":navigation:navigation-testing"))
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/navigation/navigation-ui-ktx/api/2.2.0-alpha01.txt b/navigation/navigation-ui-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..d20eb8f
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+ public final class ActivityKt {
+ ctor public ActivityKt();
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+ public final class AppBarConfigurationKt {
+ ctor public AppBarConfigurationKt();
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ }
+
+ public final class BottomNavigationViewKt {
+ ctor public BottomNavigationViewKt();
+ method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController navController);
+ }
+
+ public final class CollapsingToolbarLayoutKt {
+ ctor public CollapsingToolbarLayoutKt();
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+ public final class MenuItemKt {
+ ctor public MenuItemKt();
+ method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+ }
+
+ public final class NavControllerKt {
+ ctor public NavControllerKt();
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+ }
+
+ public final class NavigationViewKt {
+ ctor public NavigationViewKt();
+ method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+ }
+
+ public final class ToolbarKt {
+ ctor public ToolbarKt();
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-ui-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to navigation/navigation-ui-ktx/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-ui-ktx/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-ui-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..d20eb8f
--- /dev/null
+++ b/navigation/navigation-ui-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,51 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+ public final class ActivityKt {
+ ctor public ActivityKt();
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+ public final class AppBarConfigurationKt {
+ ctor public AppBarConfigurationKt();
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(androidx.navigation.NavGraph navGraph, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(android.view.Menu topLevelMenu, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ method public static inline androidx.navigation.ui.AppBarConfiguration AppBarConfiguration(java.util.Set<java.lang.Integer> topLevelDestinationIds, androidx.drawerlayout.widget.DrawerLayout? drawerLayout = null, kotlin.jvm.functions.Function0<java.lang.Boolean> fallbackOnNavigateUpListener = { false });
+ }
+
+ public final class BottomNavigationViewKt {
+ ctor public BottomNavigationViewKt();
+ method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController navController);
+ }
+
+ public final class CollapsingToolbarLayoutKt {
+ ctor public CollapsingToolbarLayoutKt();
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+ public final class MenuItemKt {
+ ctor public MenuItemKt();
+ method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController navController);
+ }
+
+ public final class NavControllerKt {
+ ctor public NavControllerKt();
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration appBarConfiguration);
+ }
+
+ public final class NavigationViewKt {
+ ctor public NavigationViewKt();
+ method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController navController);
+ }
+
+ public final class ToolbarKt {
+ ctor public ToolbarKt();
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.drawerlayout.widget.DrawerLayout? drawerLayout);
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController navController, androidx.navigation.ui.AppBarConfiguration configuration = AppBarConfiguration(navController.graph));
+ }
+
+}
+
diff --git a/navigation/navigation-ui/api/2.2.0-alpha01.txt b/navigation/navigation-ui/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..555b85b
--- /dev/null
+++ b/navigation/navigation-ui/api/2.2.0-alpha01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+ public final class AppBarConfiguration {
+ method public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+ method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+ method public java.util.Set<java.lang.Integer!> getTopLevelDestinations();
+ }
+
+ public static final class AppBarConfiguration.Builder {
+ ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
+ ctor public AppBarConfiguration.Builder(android.view.Menu);
+ ctor public AppBarConfiguration.Builder(int...);
+ ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer!>);
+ method public androidx.navigation.ui.AppBarConfiguration build();
+ method public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout?);
+ method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
+ }
+
+ public static interface AppBarConfiguration.OnNavigateUpListener {
+ method public boolean onNavigateUp();
+ }
+
+ public final class NavigationUI {
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController);
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController);
+ method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/navigation/navigation-ui/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to navigation/navigation-ui/api/res-2.2.0-alpha01.txt
diff --git a/navigation/navigation-ui/api/restricted_2.2.0-alpha01.txt b/navigation/navigation-ui/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..555b85b
--- /dev/null
+++ b/navigation/navigation-ui/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.navigation.ui {
+
+ public final class AppBarConfiguration {
+ method public androidx.drawerlayout.widget.DrawerLayout? getDrawerLayout();
+ method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
+ method public java.util.Set<java.lang.Integer!> getTopLevelDestinations();
+ }
+
+ public static final class AppBarConfiguration.Builder {
+ ctor public AppBarConfiguration.Builder(androidx.navigation.NavGraph);
+ ctor public AppBarConfiguration.Builder(android.view.Menu);
+ ctor public AppBarConfiguration.Builder(int...);
+ ctor public AppBarConfiguration.Builder(java.util.Set<java.lang.Integer!>);
+ method public androidx.navigation.ui.AppBarConfiguration build();
+ method public androidx.navigation.ui.AppBarConfiguration.Builder setDrawerLayout(androidx.drawerlayout.widget.DrawerLayout?);
+ method public androidx.navigation.ui.AppBarConfiguration.Builder setFallbackOnNavigateUpListener(androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener?);
+ }
+
+ public static interface AppBarConfiguration.OnNavigateUpListener {
+ method public boolean onNavigateUp();
+ }
+
+ public final class NavigationUI {
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+ method public static boolean navigateUp(androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static boolean onNavDestinationSelected(android.view.MenuItem, androidx.navigation.NavController);
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController);
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+ method public static void setupActionBarWithNavController(androidx.appcompat.app.AppCompatActivity, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+ method public static void setupWithNavController(androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController);
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.drawerlayout.widget.DrawerLayout?);
+ method public static void setupWithNavController(com.google.android.material.appbar.CollapsingToolbarLayout, androidx.appcompat.widget.Toolbar, androidx.navigation.NavController, androidx.navigation.ui.AppBarConfiguration);
+ method public static void setupWithNavController(com.google.android.material.navigation.NavigationView, androidx.navigation.NavController);
+ method public static void setupWithNavController(com.google.android.material.bottomnavigation.BottomNavigationView, androidx.navigation.NavController);
+ }
+
+}
+
diff --git a/navigation/navigation-ui/build.gradle b/navigation/navigation-ui/build.gradle
index 82837ed..e2149eb 100644
--- a/navigation/navigation-ui/build.gradle
+++ b/navigation/navigation-ui/build.gradle
@@ -44,8 +44,6 @@
androidTestImplementation(ANDROIDX_TEST_CORE)
androidTestImplementation(ANDROIDX_TEST_RUNNER)
androidTestImplementation(TRUTH)
- androidTestImplementation(MOCKITO_CORE, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
- androidTestImplementation(DEXMAKER_MOCKITO, libs.exclude_bytebuddy) // DexMaker has it"s own MockMaker
}
androidx {
diff --git a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
index 490e0e7e..16ca6cd 100644
--- a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
+++ b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
@@ -25,18 +25,26 @@
import androidx.navigation.testing.test
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
+import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito.mock
@LargeTest
@RunWith(AndroidJUnit4::class)
class AppBarConfigurationTest {
+ private lateinit var context: Context
+
+ @Before
+ fun setup() {
+ context = InstrumentationRegistry.getInstrumentation().targetContext
+ }
+
@Test
fun testTopLevelFromGraph() {
- val navGraph = NavController(mock(Context::class.java)).apply {
+ val navGraph = NavController(context).apply {
navigatorProvider += TestNavigator()
}.createGraph(startDestination = 1) {
test(1)
@@ -64,7 +72,7 @@
@Test
fun testSetDrawerLayout() {
val builder = AppBarConfiguration.Builder()
- val drawerLayout: DrawerLayout = mock(DrawerLayout::class.java)
+ val drawerLayout = DrawerLayout(context)
builder.setDrawerLayout(drawerLayout)
val appBarConfiguration = builder.build()
assertThat(appBarConfiguration.drawerLayout).isEqualTo(drawerLayout)
@@ -73,7 +81,9 @@
@Test
fun testSetFallbackOnNavigateUpListener() {
val builder = AppBarConfiguration.Builder()
- val onNavigateUpListener = mock(AppBarConfiguration.OnNavigateUpListener::class.java)
+ val onNavigateUpListener = AppBarConfiguration.OnNavigateUpListener {
+ false
+ }
builder.setFallbackOnNavigateUpListener(onNavigateUpListener)
val appBarConfiguration = builder.build()
assertThat(appBarConfiguration.fallbackOnNavigateUpListener)
diff --git a/paging/integration-tests/testapp/build.gradle b/paging/integration-tests/testapp/build.gradle
index 8ca84fe..11cf0af 100644
--- a/paging/integration-tests/testapp/build.gradle
+++ b/paging/integration-tests/testapp/build.gradle
@@ -42,7 +42,7 @@
kapt(ARCH_ROOM_COMPILER)
implementation(MULTIDEX)
- implementation(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
+ implementation(SUPPORT_RECYCLERVIEW)
implementation(project(":fragment:fragment-ktx"))
implementation(project(":appcompat"))
implementation(KOTLIN_STDLIB)
diff --git a/paging/runtime/build.gradle b/paging/runtime/build.gradle
index 31c990a..71033f7 100644
--- a/paging/runtime/build.gradle
+++ b/paging/runtime/build.gradle
@@ -37,7 +37,7 @@
api(project(":arch:core-runtime"))
api(ARCH_LIFECYCLE_RUNTIME)
api(project(":lifecycle:lifecycle-livedata"))
- api(ANDROIDX_RECYCLERVIEW, libs.support_exclude_config)
+ api(ANDROIDX_RECYCLERVIEW)
api(KOTLIN_STDLIB)
api(KOTLIN_COROUTINES)
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index 72ba528..4dc8c31 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -2320,7 +2320,7 @@
* @param dy Pixels to scroll vertically
*/
public void smoothScrollBy(@Px int dx, @Px int dy) {
- smoothScrollBy(dx, dy, null, UNDEFINED_DURATION, false);
+ smoothScrollBy(dx, dy, null);
}
/**
@@ -2332,7 +2332,7 @@
* {@code null}, RecyclerView will use an internal default interpolator.
*/
public void smoothScrollBy(@Px int dx, @Px int dy, @Nullable Interpolator interpolator) {
- smoothScrollBy(dx, dy, interpolator, UNDEFINED_DURATION, false);
+ smoothScrollBy(dx, dy, interpolator, UNDEFINED_DURATION);
}
/**
diff --git a/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt b/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
index 15087a7..18709b5 100644
--- a/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/parser/ParsedQuery.kt
@@ -16,7 +16,9 @@
package androidx.room.parser
+import androidx.room.processor.QueryInterpreter
import androidx.room.verifier.QueryResultInfo
+import androidx.room.vo.Pojo
sealed class Section {
@@ -70,12 +72,13 @@
)
data class ParsedQuery(
+ // original query as written by user, code writers should use transformed query that has been
+ // processed and optimized.
val original: String,
val type: QueryType,
val inputs: List<SectionInfo>,
val projections: List<SectionInfo>,
val explicitColumns: List<String>,
- // pairs of table name and alias,
val tables: Set<Table>,
val syntaxErrors: List<String>,
val runtimeQueryPlaceholder: Boolean
@@ -102,9 +105,20 @@
var resultInfo: QueryResultInfo? = null
/**
- * Rewritten when the query is interpreted and rewritten by QueryInterpreter.
+ * The transformed query when it is interpreted and rewritten by QueryInterpreter.
*/
- var interpreted = original
+ var transformed: String = original
+ private set
+
+ /**
+ * Transform the parsed query given an interpreter.
+ */
+ fun transform(interpreter: QueryInterpreter, pojo: Pojo?): String {
+ transformed = interpreter.interpret(this, pojo)
+ return transformed
+ }
+
+ fun isTransformed() = transformed != original
val sections by lazy {
val specialSections: List<SectionInfo> = (inputs + projections).sortedBy { it.start }
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
index cb3b66d..eafa866 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
@@ -75,12 +75,7 @@
val allMembers = context.processingEnv.elementUtils.getAllMembers(element)
val views = resolveDatabaseViews(viewsMap.values.toList())
- val queryInterpreter = QueryInterpreter(entities + views)
- if (context.expandProjection) {
- views.forEach { view ->
- view.query.interpreted = queryInterpreter.interpret(view.query, view)
- }
- }
+ val queryInterpreter = QueryInterpreter(context, entities + views)
val dbVerifier = if (element.hasAnnotation(SkipQueryVerification::class)) {
null
} else {
@@ -89,7 +84,7 @@
context.databaseVerifier = dbVerifier
if (dbVerifier != null) {
- verifyDatabaseViews(viewsMap, dbVerifier, queryInterpreter)
+ verifyDatabaseViews(viewsMap, dbVerifier)
}
validateUniqueTableAndViewNames(element, entities, views)
@@ -299,37 +294,17 @@
private fun verifyDatabaseViews(
map: Map<TypeElement, DatabaseView>,
- dbVerifier: DatabaseVerifier,
- queryInterpreter: QueryInterpreter
+ dbVerifier: DatabaseVerifier
) {
- fun queryIsValid(viewElement: TypeElement, view: DatabaseView): Boolean {
- val error = view.query.resultInfo?.error
- return if (error == null) {
- true
- } else {
- context.logger.e(
- viewElement,
- DatabaseVerificationErrors.cannotVerifyQuery(error)
- )
- false
- }
- }
for ((viewElement, view) in map) {
if (viewElement.hasAnnotation(SkipQueryVerification::class)) {
continue
}
- // The query has already been interpreted before creating the DatabaseVerifier.
- // Verify the original query.
view.query.resultInfo = dbVerifier.analyze(view.query.original)
- if (!queryIsValid(viewElement, view)) {
- continue
- }
- if (context.expandProjection) {
- // Reinterpret with the resultInfo.
- view.query.interpreted = queryInterpreter.interpret(view.query, view)
- // Verify the interpreted query.
- view.query.resultInfo = dbVerifier.analyze(view.query.interpreted)
- queryIsValid(viewElement, view)
+ if (view.query.resultInfo?.error != null) {
+ context.logger.e(viewElement,
+ DatabaseVerificationErrors.cannotVerifyQuery(
+ view.query.resultInfo!!.error!!))
}
}
}
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/QueryInterpreter.kt b/room/compiler/src/main/kotlin/androidx/room/processor/QueryInterpreter.kt
index 8617c92..6180d0f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/QueryInterpreter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/QueryInterpreter.kt
@@ -31,6 +31,7 @@
* Interprets and rewrites SQL queries in the context of the provided entities and views.
*/
class QueryInterpreter(
+ val context: Context,
val tables: List<EntityOrView>
) {
@@ -45,7 +46,9 @@
}
/**
- * Analyzes and rewrites the specified [query] in the context of the provided [pojo].
+ * Rewrites the specified [query] in the context of the provided [pojo]. Expanding its start
+ * projection ('SELECT *') and converting its named binding templates to positional
+ * templates (i.e. ':VVV' to '?').
*/
fun interpret(
query: ParsedQuery,
@@ -57,51 +60,62 @@
is Section.Text -> section.text
is Section.BindVar -> "?"
is Section.Newline -> "\n"
- is Section.Projection -> if (pojo == null) {
- section.text
+ is Section.Projection -> {
+ if (!context.expandProjection || pojo == null) {
+ section.text
+ } else {
+ interpretProjection(query, section, pojo, queriedTableNames)
+ }
+ }
+ }
+ }
+ }
+
+ private fun interpretProjection(
+ query: ParsedQuery,
+ section: Section.Projection,
+ pojo: Pojo,
+ queriedTableNames: List<String>
+ ): String {
+ val aliasToName = query.tables
+ .map { (name, alias) -> alias to name }
+ .toMap(IdentifierMap())
+ val nameToAlias = query.tables
+ .groupBy { it.name.toLowerCase(Locale.ENGLISH) }
+ .filter { (_, pairs) -> pairs.size == 1 }
+ .map { (name, pairs) -> name to pairs.first().alias }
+ .toMap(IdentifierMap())
+ return when (section) {
+ is Section.Projection.All -> {
+ expand(
+ pojo = pojo,
+ ignoredColumnNames = query.explicitColumns,
+ // The columns come directly from the specified table.
+ // We should not prepend the prefix-dot to the columns.
+ shallow = findEntityOrView(pojo)?.tableName in queriedTableNames,
+ nameToAlias = nameToAlias,
+ resultInfo = query.resultInfo
+ )
+ }
+ is Section.Projection.Table -> {
+ val embedded = findEmbeddedField(pojo, section.tableAlias)
+ if (embedded != null) {
+ expandEmbeddedField(
+ embedded = embedded,
+ table = findEntityOrView(embedded.pojo),
+ shallow = false,
+ tableToAlias = nameToAlias
+ ).joinToString(", ")
} else {
- val aliasToName = query.tables
- .map { (name, alias) -> alias to name }
- .toMap(IdentifierMap())
- val nameToAlias = query.tables
- .groupBy { it.name.toLowerCase(Locale.ENGLISH) }
- .filter { (_, pairs) -> pairs.size == 1 }
- .map { (name, pairs) -> name to pairs.first().alias }
- .toMap(IdentifierMap())
- when (section) {
- is Section.Projection.All -> {
- expand(
- pojo,
- query.explicitColumns,
- // The columns come directly from the specified table.
- // We should not prepend the prefix-dot to the columns.
- findEntityOrView(pojo)?.tableName in queriedTableNames,
- nameToAlias,
- query.resultInfo
- )
- }
- is Section.Projection.Table -> {
- val embedded = findEmbeddedField(pojo, section.tableAlias)
- if (embedded != null) {
- expandEmbeddedField(
- embedded,
- findEntityOrView(embedded.pojo),
- false,
- nameToAlias
- ).joinToString(", ")
- } else {
- val tableName =
- aliasToName[section.tableAlias] ?: section.tableAlias
- val table = tables.find { it.tableName == tableName }
- pojo.fields.filter { field ->
- field.parent == null &&
- field.columnName !in query.explicitColumns &&
- table?.columnNames?.contains(field.columnName) == true
- }.joinToString(", ") { field ->
- "`${section.tableAlias}`.`${field.columnName}`"
- }
- }
- }
+ val tableName =
+ aliasToName[section.tableAlias] ?: section.tableAlias
+ val table = tables.find { it.tableName == tableName }
+ pojo.fields.filter { field ->
+ field.parent == null &&
+ field.columnName !in query.explicitColumns &&
+ table?.columnNames?.contains(field.columnName) == true
+ }.joinToString(", ") { field ->
+ "`${section.tableAlias}`.`${field.columnName}`"
}
}
}
diff --git a/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt b/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
index afb46a34a..aed5b8f 100644
--- a/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/processor/QueryMethodProcessor.kt
@@ -55,11 +55,12 @@
context.checker.check(annotation != null, executableElement,
ProcessorErrors.MISSING_QUERY_ANNOTATION)
+ val skipQueryVerification = executableElement.hasAnnotation(SkipQueryVerification::class)
val query = if (annotation != null) {
val query = SqlParser.parse(annotation.value)
context.checker.check(query.errors.isEmpty(), executableElement,
query.errors.joinToString("\n"))
- if (!executableElement.hasAnnotation(SkipQueryVerification::class)) {
+ if (!skipQueryVerification) {
query.resultInfo = dbVerifier?.analyze(query.original)
}
if (query.resultInfo?.error != null) {
@@ -86,6 +87,17 @@
getQueryMethod(delegate, returnType, query)
}
+ if (!skipQueryVerification && query.isTransformed()) {
+ // If the query was transformed we need to re-verify it.
+ query.resultInfo = dbVerifier?.analyze(query.transformed)
+ query.resultInfo?.error?.let { error ->
+ context.logger.e(
+ executableElement,
+ DatabaseVerificationErrors.cannotVerifyQuery(error)
+ )
+ }
+ }
+
val missing = queryMethod.sectionToParamMapping
.filter { it.second == null }
.map { it.first.text }
@@ -117,6 +129,8 @@
val parameters = delegate.extractQueryParams()
+ query.transform(queryInterpreter, null)
+
return WriteQueryMethod(
element = executableElement,
query = query,
@@ -132,6 +146,7 @@
query: ParsedQuery
): QueryMethod {
val resultBinder = delegate.findResultBinder(returnType, query)
+ val rowAdapter = resultBinder.adapter?.rowAdapter
context.checker.check(
resultBinder.adapter != null,
executableElement,
@@ -140,34 +155,20 @@
val inTransaction = executableElement.hasAnnotation(Transaction::class)
if (query.type == QueryType.SELECT && !inTransaction) {
// put a warning if it is has relations and not annotated w/ transaction
- resultBinder.adapter?.rowAdapter?.let { rowAdapter ->
- if (rowAdapter is PojoRowAdapter && rowAdapter.relationCollectors.isNotEmpty()) {
- context.logger.w(Warning.RELATION_QUERY_WITHOUT_TRANSACTION,
- executableElement, ProcessorErrors.TRANSACTION_MISSING_ON_RELATION)
- }
+ if (rowAdapter is PojoRowAdapter && rowAdapter.relationCollectors.isNotEmpty()) {
+ context.logger.w(Warning.RELATION_QUERY_WITHOUT_TRANSACTION,
+ executableElement, ProcessorErrors.TRANSACTION_MISSING_ON_RELATION)
}
}
val parameters = delegate.extractQueryParams()
- if (context.expandProjection) {
- resultBinder.adapter?.rowAdapter?.let { rowAdapter ->
- if (rowAdapter is PojoRowAdapter) {
- query.interpreted = queryInterpreter.interpret(query, rowAdapter.pojo)
- if (dbVerifier != null) {
- query.resultInfo = dbVerifier.analyze(query.interpreted)
- if (query.resultInfo?.error != null) {
- context.logger.e(
- executableElement,
- DatabaseVerificationErrors.cannotVerifyQuery(
- query.resultInfo!!.error!!
- )
- )
- }
- }
- }
- }
+ val pojo = if (rowAdapter is PojoRowAdapter) {
+ rowAdapter.pojo
+ } else {
+ null
}
+ query.transform(queryInterpreter, pojo)
return ReadQueryMethod(
element = executableElement,
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
index d6703c4..e37ec0b 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/Database.kt
@@ -78,7 +78,7 @@
}
val viewDescriptions = views
.sortedBy { it.viewName }
- .map { it.viewName + it.query.interpreted }
+ .map { it.viewName + it.query.original }
val input = (entityDescriptions + indexDescriptions + viewDescriptions)
.joinToString("¯\\_(ツ)_/¯")
DigestUtils.md5Hex(input)
diff --git a/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt b/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
index bee2cd6..6177e02 100644
--- a/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/vo/DatabaseView.kt
@@ -52,13 +52,13 @@
override fun getIdKey(): String {
val identityKey = SchemaIdentityKey()
- identityKey.append(query.interpreted)
+ identityKey.append(query.original)
return identityKey.hash()
}
private fun createViewQuery(viewName: String): String {
// This query should match exactly like it is stored in sqlite_master. The query is
// trimmed. "IF NOT EXISTS" should not be included.
- return "CREATE VIEW `$viewName` AS ${query.interpreted.trim()}"
+ return "CREATE VIEW `$viewName` AS ${query.original.trim()}"
}
}
diff --git a/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt b/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
index 52ebee9..b58683e 100644
--- a/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
+++ b/room/compiler/src/main/kotlin/androidx/room/writer/QueryWriter.kt
@@ -118,7 +118,7 @@
}
} else {
addStatement("final $T $L = $S", String::class.typeName(),
- outSqlQueryName, query.interpreted)
+ outSqlQueryName, query.transformed)
if (outArgsName != null) {
addStatement("final $T $L = $T.acquire($L, $L)",
ROOM_SQL_QUERY, outArgsName, ROOM_SQL_QUERY, outSqlQueryName,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
index e79eb3a..203de90 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
@@ -162,7 +162,7 @@
val dbElm = invocation.context.processingEnv.elementUtils
.getTypeElement(RoomTypeNames.ROOM_DB.toString())
val dbType = MoreTypes.asDeclared(dbElm.asType())
- val queryInterpreter = QueryInterpreter(emptyList())
+ val queryInterpreter = QueryInterpreter(invocation.context, emptyList())
val processedDao = DaoProcessor(
invocation.context, daoElm, dbType, null, queryInterpreter
).process()
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
index 031ddfb..93a6611 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseEntityParserTest.kt
@@ -26,6 +26,7 @@
import com.google.testing.compile.CompileTester
import com.google.testing.compile.JavaFileObjects
import com.google.testing.compile.JavaSourcesSubjectFactory
+import java.io.File
import javax.tools.JavaFileObject
abstract class BaseEntityParserTest {
@@ -46,7 +47,7 @@
attributes: Map<String, String> = mapOf(),
baseClass: String = "",
jfos: List<JavaFileObject> = emptyList(),
- classLoader: ClassLoader = javaClass.classLoader,
+ classpathFiles: Set<File> = emptySet(),
handler: (Entity, TestInvocation) -> Unit
): CompileTester {
val attributesReplacement: String
@@ -68,7 +69,11 @@
ENTITY_PREFIX.format(attributesReplacement, baseClassReplacement) +
input + ENTITY_SUFFIX
))
- .withClasspathFrom(classLoader)
+ .apply {
+ if (classpathFiles.isNotEmpty()) {
+ withClasspath(classpathFiles)
+ }
+ }
.processedWith(TestProcessor.builder()
.forAnnotations(androidx.room.Entity::class,
androidx.room.PrimaryKey::class,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
index 24e7a13..f9b9478 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/BaseFtsEntityParserTest.kt
@@ -28,6 +28,7 @@
import com.google.testing.compile.CompileTester
import com.google.testing.compile.JavaFileObjects
import com.google.testing.compile.JavaSourcesSubjectFactory
+import java.io.File
import javax.tools.JavaFileObject
abstract class BaseFtsEntityParserTest {
@@ -50,7 +51,7 @@
ftsAttributes: Map<String, String> = mapOf(),
baseClass: String = "",
jfos: List<JavaFileObject> = emptyList(),
- classLoader: ClassLoader = javaClass.classLoader,
+ classpathFiles: Set<File> = emptySet(),
handler: (FtsEntity, TestInvocation) -> Unit
): CompileTester {
val ftsVersion = getFtsVersion().toString()
@@ -74,7 +75,11 @@
ENTITY_PREFIX.format(entityAttributesReplacement, ftsVersion,
ftsAttributesReplacement, baseClassReplacement) + input +
ENTITY_SUFFIX))
- .withClasspathFrom(classLoader)
+ .apply {
+ if (classpathFiles.isNotEmpty()) {
+ withClasspath(classpathFiles)
+ }
+ }
.processedWith(TestProcessor.builder()
.forAnnotations(androidx.room.Entity::class,
Fts3::class,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
index 82e9ca2..b9333aa 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DaoProcessorTest.kt
@@ -37,6 +37,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
+import java.io.File
@RunWith(Parameterized::class)
class DaoProcessorTest(val enableVerification: Boolean) {
@@ -70,7 +71,7 @@
@Test
fun testAbstractMethodWithoutQueryInLibraryClass() {
- val libraryClassLoader = compileLibrarySource(
+ val libraryClasspath = compileLibrarySource(
"test.library.MissingAnnotationsBaseDao",
"""
public interface MissingAnnotationsBaseDao {
@@ -79,7 +80,7 @@
""")
singleDao(
"@Dao public interface MyDao extends test.library.MissingAnnotationsBaseDao {}",
- classLoader = libraryClassLoader) { _, _ -> }
+ classpathFiles = libraryClasspath) { _, _ -> }
.failsToCompile()
.withErrorContaining(ProcessorErrors.INVALID_ANNOTATION_COUNT_IN_DAO_METHOD +
" - getFoo() in test.library.MissingAnnotationsBaseDao")
@@ -299,15 +300,18 @@
fun singleDao(
vararg inputs: String,
- classLoader: ClassLoader = javaClass.classLoader,
+ classpathFiles: Set<File> = emptySet(),
handler: (Dao, TestInvocation) -> Unit
- ):
- CompileTester {
+ ): CompileTester {
return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
.that(listOf(JavaFileObjects.forSourceString("foo.bar.MyDao",
DAO_PREFIX + inputs.joinToString("\n")
), COMMON.USER))
- .withClasspathFrom(classLoader)
+ .apply {
+ if (classpathFiles.isNotEmpty()) {
+ withClasspath(classpathFiles)
+ }
+ }
.processedWith(TestProcessor.builder()
.forAnnotations(androidx.room.Dao::class,
androidx.room.Entity::class,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
index 76184a3..3cf518b 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseProcessorTest.kt
@@ -48,6 +48,7 @@
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.mockito.Mockito.mock
+import java.io.File
import javax.lang.model.element.TypeElement
import javax.lang.model.type.DeclaredType
import javax.tools.JavaFileObject
@@ -243,7 +244,7 @@
@Test
fun detectMissingEntityAnnotationInLibraryClass() {
- val libraryClassLoader = compileLibrarySource(
+ val libraryClasspath = compileLibrarySource(
"test.library.MissingEntityAnnotationPojo",
"""
public class MissingEntityAnnotationPojo {
@@ -258,7 +259,7 @@
@Database(entities = {test.library.MissingEntityAnnotationPojo.class}, version = 1)
public abstract class MyDb extends RoomDatabase {}
""",
- classLoader = libraryClassLoader) { _, _ ->
+ classpathFiles = libraryClasspath) { _, _ ->
}.failsToCompile().withErrorContaining(
ProcessorErrors.ENTITY_MUST_BE_ANNOTATED_WITH_ENTITY +
" - test.library.MissingEntityAnnotationPojo")
@@ -266,7 +267,7 @@
@Test
fun detectMissingDaoAnnotationInLibraryClass() {
- val libraryClassLoader = compileLibrarySource(
+ val libraryClasspath = compileLibrarySource(
"test.library.MissingAnnotationsBaseDao",
"""
public interface MissingAnnotationsBaseDao {
@@ -279,7 +280,7 @@
public abstract class MyDb extends RoomDatabase {
abstract test.library.MissingAnnotationsBaseDao getBadDao();
}
- """, USER, classLoader = libraryClassLoader) { _, _ ->
+ """, USER, classpathFiles = libraryClasspath) { _, _ ->
}.failsToCompile().withErrorContaining(
ProcessorErrors.DAO_MUST_BE_ANNOTATED_WITH_DAO +
" - test.library.MissingAnnotationsBaseDao")
@@ -897,7 +898,6 @@
): CompileTester {
return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
.that(listOf(DB3, BOOK))
- .withClasspathFrom(javaClass.classLoader)
.processedWith(TestProcessor.builder()
.forAnnotations(androidx.room.Database::class)
.nextRunHandler { invocation ->
@@ -948,7 +948,7 @@
fun singleDb(
input: String,
vararg otherFiles: JavaFileObject,
- classLoader: ClassLoader = javaClass.classLoader,
+ classpathFiles: Set<File> = emptySet(),
handler: (Database, TestInvocation) -> Unit
): CompileTester {
return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
@@ -956,7 +956,11 @@
JavaFileObjects.forSourceString("foo.bar.MyDb",
DATABASE_PREFIX + input
))
- .withClasspathFrom(classLoader)
+ .apply {
+ if (classpathFiles.isNotEmpty()) {
+ withClasspath(classpathFiles)
+ }
+ }
.processedWith(TestProcessor.builder()
.forAnnotations(androidx.room.Database::class)
.nextRunHandler { invocation ->
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
index e41534d..3aa24e1 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
@@ -85,7 +85,7 @@
assertThat(view.query.resultInfo).isNotNull()
val resultInfo = view.query.resultInfo!!
assertThat(resultInfo.columns).hasSize(2)
- assertThat(resultInfo.columns).containsAllOf(
+ assertThat(resultInfo.columns).containsAtLeast(
ColumnInfo("id", SQLTypeAffinity.INTEGER),
ColumnInfo("name", SQLTypeAffinity.TEXT))
assertThat(view.viewName).isEqualTo("MyView")
@@ -180,12 +180,10 @@
input: String,
jfos: List<JavaFileObject> = ENTITIES,
verify: Boolean = true,
- classLoader: ClassLoader = javaClass.classLoader,
handler: (view: DatabaseView, invocation: TestInvocation) -> Unit
): CompileTester {
return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
.that(jfos + JavaFileObjects.forSourceString(name, DATABASE_PREFIX + input))
- .withClasspathFrom(classLoader)
.processedWith(TestProcessor.builder()
.forAnnotations(
androidx.room.DatabaseView::class,
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
index c4773e8..4dd648a 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
@@ -51,6 +51,7 @@
import org.mockito.Mockito.mock
import simpleRun
import toJFO
+import java.io.File
import javax.lang.model.element.Element
import javax.tools.JavaFileObject
@@ -1494,7 +1495,7 @@
private fun singleRun(
code: String,
vararg jfos: JavaFileObject,
- classLoader: ClassLoader = javaClass.classLoader,
+ classpathFiles: Set<File> = emptySet(),
handler: (Pojo, TestInvocation) -> Unit
): CompileTester {
val pojoCode = """
@@ -1505,7 +1506,7 @@
return singleRunFullClass(
code = pojoCode,
jfos = *jfos,
- classLoader = classLoader,
+ classpathFiles = classpathFiles,
handler = handler
)
}
@@ -1513,12 +1514,12 @@
private fun singleRunFullClass(
code: String,
vararg jfos: JavaFileObject,
- classLoader: ClassLoader = javaClass.classLoader,
+ classpathFiles: Set<File> = emptySet(),
handler: (Pojo, TestInvocation) -> Unit
): CompileTester {
val pojoJFO = code.toJFO(MY_POJO.toString())
val all = (jfos.toList() + pojoJFO).toTypedArray()
- return simpleRun(*all, classLoader = classLoader) { invocation ->
+ return simpleRun(*all, classpathFiles = classpathFiles) { invocation ->
handler.invoke(
PojoProcessor.createFor(context = invocation.context,
element = invocation.typeElement(MY_POJO.toString()),
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt
index fa2e18e..0d13300 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt
@@ -490,7 +490,10 @@
@Test
fun joinAndAbandonEntity() {
val all = ENTITIES
- simpleRun(*all, classLoader = javaClass.classLoader) { invocation ->
+ simpleRun(
+ jfos = *all,
+ options = listOf("-Aroom.expandProjection=true")
+ ) { invocation ->
val entities = invocation.roundEnv
.getElementsAnnotatedWith(androidx.room.Entity::class.java)
.map { element ->
@@ -511,7 +514,7 @@
val query = SqlParser.parse("SELECT * FROM User JOIN Team ON User.id = Team.id")
val verifier = createVerifierFromEntitiesAndViews(invocation)
query.resultInfo = verifier.analyze(query.original)
- val interpreter = QueryInterpreter(entities)
+ val interpreter = QueryInterpreter(invocation.context, entities)
val expanded = interpreter.interpret(query, entity)
val expected = """
SELECT `User`.`id` AS `id`, `User`.`firstName` AS `firstName`,
@@ -577,11 +580,13 @@
name: String,
input: String,
original: String,
- classLoader: ClassLoader = javaClass.classLoader,
handler: (expanded: String, invocation: TestInvocation) -> Unit
): CompileTester {
val all = ENTITIES + JavaFileObjects.forSourceString(name, DATABASE_PREFIX + input)
- return simpleRun(*all, classLoader = classLoader) { invocation ->
+ return simpleRun(
+ jfos = *all,
+ options = listOf("-Aroom.expandProjection=true")
+ ) { invocation ->
val entities = invocation.roundEnv
.getElementsAnnotatedWith(androidx.room.Entity::class.java)
.map { element ->
@@ -602,7 +607,7 @@
val query = SqlParser.parse(original)
val verifier = createVerifierFromEntitiesAndViews(invocation)
query.resultInfo = verifier.analyze(query.original)
- val interpreter = QueryInterpreter(entities)
+ val interpreter = QueryInterpreter(invocation.context, entities)
val expanded = interpreter.interpret(query, pojo)
handler(expanded, invocation)
}
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
index c04c795..b9ec119 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
@@ -76,7 +76,7 @@
@Test
fun noGetterInLibraryClass() {
- val libraryClassLoader = compileLibrarySource(
+ val libraryClasspath = compileLibrarySource(
"test.library.MissingGetterEntity",
"""
@Entity
@@ -88,7 +88,7 @@
""")
singleEntity("",
baseClass = "test.library.MissingGetterEntity",
- classLoader = libraryClassLoader) { _, _ -> }
+ classpathFiles = libraryClasspath) { _, _ -> }
.failsToCompile()
.withErrorContaining(ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD +
" - id in test.library.MissingGetterEntity")
diff --git a/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
index ab5ae20..d8446c5 100644
--- a/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/processor/autovalue/AutoValuePojoProcessorDelegateTest.kt
@@ -32,6 +32,7 @@
import org.junit.runners.JUnit4
import simpleRun
import toJFO
+import java.io.File
import javax.lang.model.element.ElementKind
import javax.tools.JavaFileObject
@@ -88,7 +89,7 @@
@Test
fun goodLibraryPojo() {
- val libraryClassLoader = compileLibrarySources(
+ val libraryClasspath = compileLibrarySources(
JavaFileObjects.forSourceString(MY_POJO.toString(),
"""
$HEADER
@@ -97,19 +98,9 @@
abstract long getArg0();
static MyPojo create(long arg0) { return new AutoValue_MyPojo(arg0); }
$FOOTER
- """),
- JavaFileObjects.forSourceString(AUTOVALUE_MY_POJO.toString(),
- """
- $AUTO_VALUE_HEADER
- @PrimaryKey
- private final long arg0;
- AutoValue_MyPojo(long arg0) { this.arg0 = arg0; }
- @PrimaryKey
- long getArg0() { return this.arg0; }
- $FOOTER
""")
)
- simpleRun(classLoader = libraryClassLoader) { invocation ->
+ simpleRun(classpathFiles = libraryClasspath) { invocation ->
PojoProcessor.createFor(context = invocation.context,
element = invocation.typeElement(MY_POJO.toString()),
bindingScope = FieldProcessor.BindingScope.READ_FROM_CURSOR,
@@ -241,7 +232,7 @@
pojoCode: String,
autoValuePojoCode: String,
vararg jfos: JavaFileObject,
- classLoader: ClassLoader = javaClass.classLoader,
+ classpathFiles: Set<File> = emptySet(),
handler: (Pojo, TestInvocation) -> Unit
): CompileTester {
return singleRunFullClass(
@@ -256,7 +247,7 @@
$FOOTER
""",
jfos = *jfos,
- classLoader = classLoader,
+ classpathFiles = classpathFiles,
handler = handler
)
}
@@ -265,13 +256,13 @@
pojoCode: String,
autoValuePojoCode: String,
vararg jfos: JavaFileObject,
- classLoader: ClassLoader = javaClass.classLoader,
+ classpathFiles: Set<File> = emptySet(),
handler: (Pojo, TestInvocation) -> Unit
): CompileTester {
val pojoJFO = pojoCode.toJFO(MY_POJO.toString())
val autoValuePojoJFO = autoValuePojoCode.toJFO(AUTOVALUE_MY_POJO.toString())
val all = (jfos.toList() + pojoJFO + autoValuePojoJFO).toTypedArray()
- return simpleRun(*all, classLoader = classLoader) { invocation ->
+ return simpleRun(*all, classpathFiles = classpathFiles) { invocation ->
handler.invoke(
PojoProcessor.createFor(context = invocation.context,
element = invocation.typeElement(MY_POJO.toString()),
diff --git a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
index c5a6919..09a37e8 100644
--- a/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
@@ -279,8 +279,7 @@
fun singleQueryMethod(
vararg input: String,
handler: (QueryWriter) -> Unit
- ):
- CompileTester {
+ ): CompileTester {
return Truth.assertAbout(JavaSourceSubjectFactory.javaSource())
.that(JavaFileObjects.forSourceString("foo.bar.MyClass",
DAO_PREFIX + input.joinToString("\n") + DAO_SUFFIX
@@ -307,8 +306,6 @@
executableElement = MoreElements.asExecutable(methods.first()),
queryInterpreter = queryInterpreter)
val method = parser.process()
- method.query.interpreted =
- queryInterpreter.interpret(method.query, null)
handler(QueryWriter(method))
true
}
diff --git a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
index bcdc08e..1bf74f5 100644
--- a/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/testing/test_util.kt
@@ -23,20 +23,19 @@
import androidx.room.ext.RoomGuavaTypeNames
import androidx.room.ext.RoomRxJava2TypeNames
import androidx.room.ext.RxJava2TypeNames
-import androidx.room.processor.TableEntityProcessor
import androidx.room.processor.DatabaseViewProcessor
import androidx.room.processor.QueryInterpreter
+import androidx.room.processor.TableEntityProcessor
import androidx.room.solver.CodeGenScope
import androidx.room.testing.TestInvocation
import androidx.room.testing.TestProcessor
import androidx.room.verifier.DatabaseVerifier
import androidx.room.writer.ClassWriter
import com.google.auto.common.MoreElements
-import com.google.common.io.ByteStreams
import com.google.common.io.Files
import com.google.common.truth.Truth
+import com.google.common.truth.Truth.assertThat
import com.google.testing.compile.CompileTester
-import com.google.testing.compile.Compiler.javac
import com.google.testing.compile.JavaFileObjects
import com.google.testing.compile.JavaSourcesSubjectFactory
import com.squareup.javapoet.ClassName
@@ -44,14 +43,14 @@
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import java.io.File
-import java.io.FileOutputStream
-import java.net.URLClassLoader
-import java.nio.file.Paths
+import java.nio.charset.StandardCharsets.UTF_8
+import java.util.Locale
import javax.lang.model.element.Element
import javax.lang.model.type.TypeKind
import javax.lang.model.type.TypeMirror
import javax.tools.JavaFileObject
import javax.tools.StandardLocation
+import javax.tools.ToolProvider.getSystemJavaCompiler
object COMMON {
val USER by lazy {
@@ -151,12 +150,18 @@
fun simpleRun(
vararg jfos: JavaFileObject,
- classLoader: ClassLoader = ClassLoader.getSystemClassLoader(),
+ classpathFiles: Set<File> = emptySet(),
+ options: List<String> = emptyList(),
f: (TestInvocation) -> Unit
): CompileTester {
return Truth.assertAbout(JavaSourcesSubjectFactory.javaSources())
.that(jfos.toList() + JavaFileObjects.forSourceLines("Dummy", "final class Dummy {}"))
- .withClasspathFrom(classLoader)
+ .apply {
+ if (classpathFiles.isNotEmpty()) {
+ withClasspath(classpathFiles)
+ }
+ }
+ .withCompilerOptions(options)
.processedWith(TestProcessor.builder()
.nextRunHandler {
f(it)
@@ -178,7 +183,7 @@
val views = invocation.roundEnv.getElementsAnnotatedWith(DatabaseView::class.java).map {
DatabaseViewProcessor(invocation.context, MoreElements.asType(it)).process()
}
- return QueryInterpreter(entities + views)
+ return QueryInterpreter(invocation.context, entities + views)
}
fun createVerifierFromEntitiesAndViews(invocation: TestInvocation): DatabaseVerifier {
@@ -204,7 +209,7 @@
return element to type
}
-fun compileLibrarySource(sourceName: String, code: String): ClassLoader {
+fun compileLibrarySource(sourceName: String, code: String): Set<File> {
val sourceCode = """
package test.library;
import androidx.room.*;
@@ -214,25 +219,23 @@
}
/**
- * Compiles an array of sources and returns a class loader that is able to use the .class files
- * generated by the compilation. This method is useful for creating an environment where the
- * annotation processor has to process compiled classes from a library.
+ * Compiles an array of sources and returns a set of files to be used as classpath pointing
+ * to the .class files generated by the compilation. This method is useful for creating an
+ * environment where the annotation processor has to process compiled classes from a library.
*/
-fun compileLibrarySources(vararg sources: JavaFileObject): ClassLoader {
- val tempDir = Files.createTempDir()
- javac().compile(*sources)
- .generatedFiles().forEach { classFile ->
- val tempFile = File(tempDir, classFile.toUri().path)
- Files.createParentDirs(tempFile)
+fun compileLibrarySources(vararg sources: JavaFileObject): Set<File> {
+ val lib = Files.createTempDir()
+ val compiler = getSystemJavaCompiler()
+ val fileManager = compiler.getStandardFileManager(null, Locale.getDefault(), UTF_8)
+ fileManager.setLocation(StandardLocation.CLASS_OUTPUT, listOf(lib))
+ val task = compiler.getTask(null, fileManager, null, emptyList(), null, listOf(*sources))
+ assertThat(task.call()).isTrue()
+ return getSystemClasspathFiles() + lib
+}
- FileOutputStream(tempFile).use { output ->
- classFile.openInputStream().use { input ->
- ByteStreams.copy(input, output)
- }
- }
- }
- val classesPath = Paths.get(tempDir.path, StandardLocation.CLASS_OUTPUT.name).toUri().toURL()
- return URLClassLoader(arrayOf(classesPath), ClassLoader.getSystemClassLoader())
+private fun getSystemClasspathFiles(): Set<File> {
+ val pathSeparator = System.getProperty("path.separator")
+ return System.getProperty("java.class.path").split(pathSeparator).map { File(it) }.toSet()
}
fun String.toJFO(qName: String): JavaFileObject = JavaFileObjects.forSourceLines(qName, this)
\ No newline at end of file
diff --git a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
index 1acc310..ec24403 100644
--- a/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
+++ b/room/compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
@@ -106,10 +106,6 @@
queryInterpreter = queryInterpreter,
dbVerifier = createVerifierFromEntitiesAndViews(invocation))
val parsedDao = parser.process()
- parsedDao.queryMethods.forEach { method ->
- method.query.interpreted =
- queryInterpreter.interpret(method.query, null)
- }
DaoWriter(parsedDao, db, invocation.processingEnv)
.write(invocation.processingEnv)
true
diff --git a/room/guava/build.gradle b/room/guava/build.gradle
index a28ca6c..3cbd76e 100644
--- a/room/guava/build.gradle
+++ b/room/guava/build.gradle
@@ -32,7 +32,7 @@
}
implementation(ARCH_CORE_RUNTIME)
- api(SUPPORT_ANNOTATIONS, libs.support_exclude_config)
+ api(SUPPORT_ANNOTATIONS)
api(GUAVA_ANDROID)
}
diff --git a/room/integration-tests/testapp/build.gradle b/room/integration-tests/testapp/build.gradle
index 87b3ba4..248311c 100644
--- a/room/integration-tests/testapp/build.gradle
+++ b/room/integration-tests/testapp/build.gradle
@@ -55,8 +55,8 @@
// FINDBUGS dependency resolves an app/testapp version conflict.
implementation(FINDBUGS)
- implementation(SUPPORT_RECYCLERVIEW, libs.support_exclude_config)
- implementation(SUPPORT_APPCOMPAT, libs.support_exclude_config)
+ implementation(SUPPORT_RECYCLERVIEW)
+ implementation(SUPPORT_APPCOMPAT)
annotationProcessor project(":room:room-compiler")
androidTestAnnotationProcessor project(":room:room-compiler")
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/dao/UserDao.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/dao/UserDao.java
index faf95fb..c489c27 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/dao/UserDao.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/dao/UserDao.java
@@ -315,4 +315,7 @@
@Update
public abstract ListenableFuture<Void> updateWithVoidFuture(User user);
+
+ @Query("UPDATE user SET mName = :name, mLastName = :name WHERE mId = :userId")
+ public abstract void setSameNames(String name, int userId);
}
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DatabaseViewTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DatabaseViewTest.java
index 69d455e..9c1bb03 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DatabaseViewTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/DatabaseViewTest.java
@@ -189,9 +189,9 @@
}
@DatabaseView(
- "SELECT * FROM Team "
- + "INNER JOIN Department AS department_ "
- + "ON Team.departmentId = department_.id"
+ "SELECT Team.*, dep.id AS department_id, dep.name as department_name FROM Team "
+ + "INNER JOIN Department AS dep "
+ + "ON Team.departmentId = dep.id"
)
static class TeamDetail2 {
@Embedded
@@ -200,8 +200,12 @@
public Department department;
}
- @DatabaseView("SELECT * FROM TeamDetail AS first_, TeamDetail AS second_ "
- + "WHERE first_.id <> second_.id")
+ @DatabaseView("SELECT td1.id AS first_id, td1.name AS first_name, "
+ + "td1.departmentId AS first_departmentId, td1.departmentName AS first_departmentName, "
+ + "td2.id AS second_id, td2.name AS second_name, "
+ + "td2.departmentId AS second_departmentId, "
+ + "td2.departmentName AS second_departmentName "
+ + "FROM TeamDetail AS td1, TeamDetail AS td2 WHERE td1.id <> td2.id")
static class TeamPair {
@Embedded(prefix = "first_")
public TeamDetail first;
@@ -430,7 +434,7 @@
@Test
@MediumTest
- public void expandProjection() {
+ public void expandedProjection() {
final CompanyDatabase db = getDatabase();
db.department().insert(new Department(3L, "Sales"));
db.team().insert(new Team(5L, 3L, "Books"));
@@ -444,7 +448,7 @@
@Test
@MediumTest
- public void expandProjection_embedView() {
+ public void expandedProjection_embedView() {
final CompanyDatabase db = getDatabase();
db.department().insert(new Department(3L, "Sales"));
db.team().insert(new Team(5L, 3L, "Books"));
@@ -456,4 +460,4 @@
assertThat(pairs.get(0).second.name, is(equalTo("Toys")));
assertThat(pairs.get(0).second.departmentName, is(equalTo("Sales")));
}
-}
+}
\ No newline at end of file
diff --git a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/SimpleEntityReadWriteTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/SimpleEntityReadWriteTest.java
index c438d69..fa94e6b 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/SimpleEntityReadWriteTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/SimpleEntityReadWriteTest.java
@@ -693,6 +693,16 @@
assertThat(loadedUsers, hasItems(users));
}
+ @Test
+ public void updateQuery() {
+ User user1 = TestUtil.createUser(1);
+ mUserDao.insert(user1);
+ mUserDao.setSameNames("same", 1);
+ User result = mUserDao.load(1);
+ assertThat(result.getName(), is("same"));
+ assertThat(result.getLastName(), is("same"));
+ }
+
private Set<Day> toSet(Day... days) {
return new HashSet<>(Arrays.asList(days));
}
diff --git a/room/rxjava2/build.gradle b/room/rxjava2/build.gradle
index 6d36fc3..81cae70 100644
--- a/room/rxjava2/build.gradle
+++ b/room/rxjava2/build.gradle
@@ -29,8 +29,9 @@
api(project(":room:room-common"))
api(project(":room:room-runtime"))
implementation(ARCH_CORE_RUNTIME)
- api(SUPPORT_CORE_UTILS, libs.support_exclude_config)
+ api(SUPPORT_CORE_UTILS)
api(RX_JAVA)
+
testImplementation(JUNIT)
testImplementation(MOCKITO_CORE)
testImplementation(ARCH_CORE_TESTING)
diff --git a/room/testing/build.gradle b/room/testing/build.gradle
index 9c45fdd..ec0d0cd 100644
--- a/room/testing/build.gradle
+++ b/room/testing/build.gradle
@@ -32,7 +32,7 @@
api(ANDROIDX_SQLITE_FRAMEWORK)
api(project(":room:room-migration"))
implementation(ARCH_CORE_RUNTIME)
- api(SUPPORT_CORE_UTILS, libs.support_exclude_config)
+ api(SUPPORT_CORE_UTILS)
api(JUNIT)
}
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityController.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityController.java
index 3d17668..3e54cc5 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityController.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityController.java
@@ -20,6 +20,7 @@
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.RadioGroup;
+import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.biometric.BiometricPrompt;
@@ -41,15 +42,13 @@
@NonNull CheckBox useCryptoCheckbox,
@NonNull CheckBox confirmationRequiredCheckbox,
@NonNull CheckBox deviceCredentialAllowedCheckbox,
- @NonNull RadioGroup radioGroup) {
+ @NonNull RadioGroup radioGroup,
+ @NonNull Button clearLogButton,
+ @NonNull TextView logView) {
+ super(createKeysButton, authenticateButton, canAuthenticateButton, useCryptoCheckbox,
+ confirmationRequiredCheckbox, deviceCredentialAllowedCheckbox, radioGroup,
+ clearLogButton, logView);
mActivity = activity;
- mCreateKeysButton = createKeysButton;
- mAuthenticateButton = authenticateButton;
- mCanAuthenticateButton = canAuthenticateButton;
- mUseCryptoCheckbox = useCryptoCheckbox;
- mConfirmationRequiredCheckbox = confirmationRequiredCheckbox;
- mDeviceCredentialAllowedCheckbox = deviceCredentialAllowedCheckbox;
- mRadioGroup = radioGroup;
}
@Override
@@ -58,11 +57,7 @@
}
@Override
- void onResume() {
- // Developers should (re)create the BiometricPrompt every time the application is resumed.
- // This is necessary because it is possible for the executor and callback to be GC'd.
- // Instantiating the prompt here allows the library to handle things such as configuration
- // changes.
+ void reconnect() {
mBiometricPrompt = new BiometricPrompt(mActivity, mAuthenticationCallback, mExecutor);
}
}
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityHost.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityHost.java
index 4e010a7..d0f1d5b 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityHost.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoActivityHost.java
@@ -51,6 +51,8 @@
final CheckBox deviceCredentialAllowedCheckbox = findViewById(
R.id.checkbox_enable_fallback);
final RadioGroup radioGroup = findViewById(R.id.radio_group);
+ final Button clearLogButton = findViewById(R.id.log_clear);
+ final TextView logView = findViewById(R.id.log_text);
mController = new BiometricPromptDemoActivityController(
this,
@@ -60,14 +62,11 @@
useCryptoCheckbox,
confirmationRequiredCheckbox,
deviceCredentialAllowedCheckbox,
- radioGroup);
+ radioGroup,
+ clearLogButton,
+ logView);
mController.init(savedInstanceState);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- mController.onResume();
+ mController.reconnect();
}
@Override
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
index df7dca2..438e4eb 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoController.java
@@ -29,7 +29,7 @@
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.RadioGroup;
-import android.widget.Toast;
+import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -66,6 +66,7 @@
private static final String TAG = "bio_prompt_demo_control";
private static final String KEY_COUNTER = "saved_counter";
+ private static final String KEY_LOG = "saved_log";
private static final String DEFAULT_KEY_NAME = "default_key";
@@ -88,13 +89,14 @@
private int mCounter;
private int mNumberFailedAttempts;
- Button mCreateKeysButton;
- Button mAuthenticateButton;
- Button mCanAuthenticateButton;
- CheckBox mUseCryptoCheckbox;
- CheckBox mConfirmationRequiredCheckbox;
- CheckBox mDeviceCredentialAllowedCheckbox;
- RadioGroup mRadioGroup;
+ private Button mCreateKeysButton;
+ private Button mAuthenticateButton;
+ private Button mCanAuthenticateButton;
+ private CheckBox mUseCryptoCheckbox;
+ private CheckBox mConfirmationRequiredCheckbox;
+ private CheckBox mDeviceCredentialAllowedCheckbox;
+ private RadioGroup mRadioGroup;
+ private TextView mLogView;
BiometricPrompt mBiometricPrompt;
@@ -103,15 +105,13 @@
new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationError(int err, @NonNull CharSequence message) {
- Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
- Log.v(TAG, "Error " + err + ": " + message);
+ log("onAuthenticationError " + err + ": " + message);
mNumberFailedAttempts = 0;
}
@Override
public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) {
- Toast.makeText(getApplicationContext(), "Yay, Crypto: "
- + result.getCryptoObject(), Toast.LENGTH_SHORT).show();
+ log("onAuthenticationSucceeded, crypto: " + result.getCryptoObject());
mNumberFailedAttempts = 0;
if (result.getCryptoObject() != null) {
@@ -121,19 +121,16 @@
"hello".getBytes(Charset.defaultCharset()));
String message = Arrays.toString(
Base64.encode(encrypted, 0 /* flags */));
- Toast.makeText(getApplicationContext(), "Message: " + message,
- Toast.LENGTH_SHORT).show();
+ log("Message: " + message);
} catch (BadPaddingException | IllegalBlockSizeException e) {
- Toast.makeText(getApplicationContext(), "Error encrypting",
- Toast.LENGTH_SHORT).show();
+ log("Error encrypting");
}
}
}
@Override
public void onAuthenticationFailed() {
- Toast.makeText(getApplicationContext(), "failed", Toast.LENGTH_SHORT).show();
- Log.v(TAG, "onAuthenticationFailed");
+ log("onAuthenticationFailed");
mNumberFailedAttempts++;
// Cancel authentication after 3 failed attempts to test the cancel() method.
@@ -146,12 +143,44 @@
abstract Context getApplicationContext();
- abstract void onResume();
+ /**
+ * (Re)establish a connection between the host fragment/activity and the BiometricPrompt
+ * library.
+ *
+ * Developers should (re)create the BiometricPrompt every time the activity/fragment is
+ * created. This allows authentication to work across configuration changes. The internal
+ * implementation of the library uses fragments, which can be saved/restored. Instantiating
+ * the library with a new callback and executor early in the fragment/activity lifecycle (e.g.
+ * onCreate or onCreateView) allows the new instance to receive callbacks properly.
+ */
+ abstract void reconnect();
+
+ BiometricPromptDemoController(@NonNull Button createKeysButton,
+ @NonNull Button authenticateButton,
+ @NonNull Button canAuthenticateButton,
+ @NonNull CheckBox useCryptoCheckbox,
+ @NonNull CheckBox confirmationRequiredCheckbox,
+ @NonNull CheckBox deviceCredentialAllowedCheckbox,
+ @NonNull RadioGroup radioGroup,
+ @NonNull Button clearLogButton,
+ @NonNull TextView logView) {
+ mCreateKeysButton = createKeysButton;
+ mAuthenticateButton = authenticateButton;
+ mCanAuthenticateButton = canAuthenticateButton;
+ mUseCryptoCheckbox = useCryptoCheckbox;
+ mConfirmationRequiredCheckbox = confirmationRequiredCheckbox;
+ mDeviceCredentialAllowedCheckbox = deviceCredentialAllowedCheckbox;
+ mRadioGroup = radioGroup;
+ mLogView = logView;
+
+ clearLogButton.setOnClickListener((view1) -> logView.setText(""));
+ }
/** Sets up button callbacks and other state for the biometric prompt demo controller. */
void init(@Nullable Bundle savedInstanceState) {
if (savedInstanceState != null) {
mCounter = savedInstanceState.getInt(KEY_COUNTER);
+ mLogView.setText(savedInstanceState.getCharSequence(KEY_LOG));
}
try {
@@ -191,8 +220,7 @@
default:
message = BIOMETRIC_ERROR_UNKNOWN;
}
- Toast.makeText(getApplicationContext(), "canAuthenticate : " + message,
- Toast.LENGTH_SHORT).show();
+ log("canAuthenticate: " + message);
});
@@ -210,6 +238,7 @@
void onSaveInstanceState(@NonNull Bundle outState) {
outState.putInt(KEY_COUNTER, mCounter);
+ outState.putCharSequence(KEY_LOG, mLogView.getText());
}
@RequiresApi(Build.VERSION_CODES.M)
@@ -220,14 +249,13 @@
try {
createKey(DEFAULT_KEY_NAME, true);
} catch (RuntimeException e) {
- Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
+ log(e.getMessage());
}
}
private void startAuthentication() {
if (getMode() == MODE_NONE) {
- Toast.makeText(getApplicationContext(), "Select a test first", Toast.LENGTH_SHORT)
- .show();
+ log("Select a test first");
return;
}
@@ -269,7 +297,7 @@
mBiometricPrompt.authenticate(info, crypto);
}
} catch (RuntimeException e) {
- Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
+ log(e.getMessage());
return;
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
throw new RuntimeException("Failed to get an instance of Cipher", e);
@@ -371,4 +399,9 @@
return MODE_NONE;
}
}
+
+ private void log(String s) {
+ Log.d(TAG, s);
+ mLogView.append(s + '\n');
+ }
}
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentController.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentController.java
index e13ac10..48b3776 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentController.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentController.java
@@ -20,6 +20,7 @@
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.RadioGroup;
+import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.biometric.BiometricPrompt;
@@ -43,16 +44,14 @@
@NonNull CheckBox useCryptoCheckbox,
@NonNull CheckBox confirmationRequiredCheckbox,
@NonNull CheckBox deviceCredentialAllowedCheckbox,
- @NonNull RadioGroup radioGroup) {
+ @NonNull RadioGroup radioGroup,
+ @NonNull Button clearLogButton,
+ @NonNull TextView logView) {
+ super(createKeysButton, authenticateButton, canAuthenticateButton, useCryptoCheckbox,
+ confirmationRequiredCheckbox, deviceCredentialAllowedCheckbox, radioGroup,
+ clearLogButton, logView);
mContext = context;
mFragment = fragment;
- mCreateKeysButton = createKeysButton;
- mAuthenticateButton = authenticateButton;
- mCanAuthenticateButton = canAuthenticateButton;
- mUseCryptoCheckbox = useCryptoCheckbox;
- mConfirmationRequiredCheckbox = confirmationRequiredCheckbox;
- mDeviceCredentialAllowedCheckbox = deviceCredentialAllowedCheckbox;
- mRadioGroup = radioGroup;
}
@Override
@@ -61,11 +60,7 @@
}
@Override
- void onResume() {
- // Developers should (re)create the BiometricPrompt every time the fragment is resumed.
- // This is necessary because it is possible for the executor and callback to be GC'd.
- // Instantiating the prompt here allows the library to handle things such as configuration
- // changes.
+ void reconnect() {
mBiometricPrompt = new BiometricPrompt(mFragment, mAuthenticationCallback, mExecutor);
}
}
diff --git a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentHost.java b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentHost.java
index 8b9c8a0..939f73c 100644
--- a/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentHost.java
+++ b/samples/BiometricDemos/src/main/java/com/example/android/biometric/BiometricPromptDemoFragmentHost.java
@@ -63,6 +63,8 @@
final CheckBox deviceCredentialAllowedCheckbox = view.findViewById(
R.id.checkbox_enable_fallback);
final RadioGroup radioGroup = view.findViewById(R.id.radio_group);
+ final Button clearLogButton = view.findViewById(R.id.log_clear);
+ final TextView logView = view.findViewById(R.id.log_text);
mController = new BiometricPromptDemoFragmentController(
mContext,
@@ -73,19 +75,15 @@
useCryptoCheckbox,
confirmationRequiredCheckbox,
deviceCredentialAllowedCheckbox,
- radioGroup);
+ radioGroup,
+ clearLogButton,
+ logView);
mController.init(savedInstanceState);
-
+ mController.reconnect();
return view;
}
@Override
- public void onResume() {
- super.onResume();
- mController.onResume();
- }
-
- @Override
public void onPause() {
mController.onPause();
super.onPause();
diff --git a/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo.xml b/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo.xml
index 1b42272..008413f 100644
--- a/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo.xml
+++ b/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo.xml
@@ -23,18 +23,18 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/label_choose_host_type" />
+ android:text="@string/label_choose_host_type"/>
<Button
android:id="@+id/host_in_activity_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/button_host_in_activity" />
+ android:text="@string/button_host_in_activity"/>
<Button
android:id="@+id/host_in_fragment_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/button_host_in_fragment" />
+ android:text="@string/button_host_in_fragment"/>
</LinearLayout>
\ No newline at end of file
diff --git a/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo_content.xml b/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo_content.xml
index f201662..a288a29 100644
--- a/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo_content.xml
+++ b/samples/BiometricDemos/src/main/res/layout/biometric_prompt_demo_content.xml
@@ -24,74 +24,96 @@
<TextView
android:id="@+id/host_type_text_view"
android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"/>
- <Button
- android:id="@+id/button_enable_biometric_with_crypto"
+ <ScrollView
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/button_enable_biometric_with_crypto"/>
+ android:layout_height="match_parent">
- <Button
- android:id="@+id/can_authenticate"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/button_can_authenticate"/>
-
- <Button
- android:id="@+id/button_authenticate"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/button_authenticate"/>
-
- <LinearLayout android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <CheckBox
- android:id="@+id/checkbox_use_crypto"
- android:layout_weight="1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/checkbox_text_use_crypto" />
- <CheckBox
- android:id="@+id/checkbox_require_confirmation"
- android:layout_weight="1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/checkbox_text_require_confirmation"
- android:checked="true"/>
- <CheckBox
- android:id="@+id/checkbox_enable_fallback"
- android:layout_weight="1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/checkbox_text_allow_device_credential"/>
- </LinearLayout>
-
-
- <RadioGroup
- android:id="@+id/radio_group"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
-
- <RadioButton
- android:id="@+id/radio_persist_across_configuration_changes"
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/radio_text_persist_across_configuration_changes" />
+ android:orientation="vertical">
- <RadioButton
- android:id="@+id/radio_cancel_on_configuration_change"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/radio_text_cancel_on_configuration_change" />
+ <Button
+ android:id="@+id/button_enable_biometric_with_crypto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_enable_biometric_with_crypto"/>
- <RadioButton
- android:id="@+id/radio_cancel_after_three_failures"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/radio_text_cancel_after_three_failures" />
+ <Button
+ android:id="@+id/can_authenticate"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_can_authenticate"/>
- </RadioGroup>
+ <Button
+ android:id="@+id/button_authenticate"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_authenticate"/>
+
+ <LinearLayout android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <CheckBox
+ android:id="@+id/checkbox_use_crypto"
+ android:layout_weight="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/checkbox_text_use_crypto"/>
+ <CheckBox
+ android:id="@+id/checkbox_require_confirmation"
+ android:layout_weight="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/checkbox_text_require_confirmation"
+ android:checked="true"/>
+ <CheckBox
+ android:id="@+id/checkbox_enable_fallback"
+ android:layout_weight="1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/checkbox_text_allow_device_credential"/>
+ </LinearLayout>
+
+ <RadioGroup
+ android:id="@+id/radio_group"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <RadioButton
+ android:id="@+id/radio_persist_across_configuration_changes"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/radio_text_persist_across_configuration_changes"/>
+
+ <RadioButton
+ android:id="@+id/radio_cancel_on_configuration_change"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/radio_text_cancel_on_configuration_change"/>
+
+ <RadioButton
+ android:id="@+id/radio_cancel_after_three_failures"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/radio_text_cancel_after_three_failures"/>
+ </RadioGroup>
+
+ <Button
+ android:id="@+id/log_clear"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/button_clear_log"/>
+
+ <TextView
+ android:id="@+id/log_text"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
+ </LinearLayout>
+
+ </ScrollView>
</LinearLayout>
diff --git a/samples/BiometricDemos/src/main/res/values/strings.xml b/samples/BiometricDemos/src/main/res/values/strings.xml
index 5a76abf..7ef3964 100644
--- a/samples/BiometricDemos/src/main/res/values/strings.xml
+++ b/samples/BiometricDemos/src/main/res/values/strings.xml
@@ -23,6 +23,7 @@
<string name="button_can_authenticate">Can Authenticate</string>
<string name="button_host_in_activity">Host in a FragmentActivity</string>
<string name="button_host_in_fragment">Host in a Fragment</string>
+ <string name="button_clear_log">Clear logs</string>
<string name="checkbox_text_use_crypto">Use crypto</string>
<string name="checkbox_text_require_confirmation">Require confirmation</string>
diff --git a/savedstate/build.gradle b/savedstate/build.gradle
index 5859743..9fb3daf 100644
--- a/savedstate/build.gradle
+++ b/savedstate/build.gradle
@@ -22,9 +22,10 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
implementation(ARCH_CORE_COMMON)
- implementation(ARCH_LIFECYCLE_COMMON, libs.exclude_annotations_transitive)
+ implementation(ARCH_LIFECYCLE_COMMON)
+
androidTestImplementation(KOTLIN_STDLIB)
- androidTestImplementation(ARCH_LIFECYCLE_RUNTIME, libs.exclude_annotations_transitive)
+ androidTestImplementation(ARCH_LIFECYCLE_RUNTIME)
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/settings.gradle b/settings.gradle
index 41c6beb..c0bb12f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -39,7 +39,7 @@
includeProject(":activity:activity-ktx", "activity/activity-ktx")
includeProject(":activity:integration-tests:testapp", "activity/integration-tests/testapp")
includeProject(":ads-identifier", "ads/ads-identifier")
-includeProject(":annotation", "annotations")
+includeProject(":annotation:annotation", "annotation/annotation")
includeProject(":annotation:annotation-sampled", "annotation/annotation-sampled")
includeProject(":annotation:annotation-experimental", "annotation/annotation-experimental")
includeProject(":annotation:annotation-experimental-lint", "annotation/annotation-experimental-lint")
@@ -257,7 +257,6 @@
includeProject(":support-vector-drawable-demos", new File(samplesRoot, "SupportVectorDrawableDemos"))
includeProject(":support-v4-demos", new File(samplesRoot, "Support4Demos"))
includeProject(":support-v7-demos", new File(samplesRoot, "Support7Demos"))
-includeProject(":support-v13-demos", new File(samplesRoot, "Support13Demos"))
includeProject(":support-wear-demos", new File(samplesRoot, "SupportWearDemos"))
/////////////////////////////
diff --git a/slices/test/build.gradle b/slices/test/build.gradle
index 5484b1c..1e2f18d 100644
--- a/slices/test/build.gradle
+++ b/slices/test/build.gradle
@@ -28,7 +28,7 @@
implementation(project(":slice-core"))
implementation(project(":slice-builders"))
implementation(project(":recyclerview:recyclerview"))
- api(ARCH_LIFECYCLE_LIVEDATA_CORE, libs.exclude_annotations_transitive)
+ api(ARCH_LIFECYCLE_LIVEDATA_CORE)
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
diff --git a/slices/view/build.gradle b/slices/view/build.gradle
index 0f4a35d..b182c5c 100644
--- a/slices/view/build.gradle
+++ b/slices/view/build.gradle
@@ -28,7 +28,7 @@
implementation(project(":slice-core"))
implementation(project(":recyclerview:recyclerview"))
implementation("androidx.collection:collection:1.1.0")
- api(ARCH_LIFECYCLE_LIVEDATA_CORE, libs.exclude_annotations_transitive)
+ api(ARCH_LIFECYCLE_LIVEDATA_CORE)
androidTestImplementation(project(":slice-builders"))
androidTestImplementation(project(":slice-test"))
diff --git a/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java b/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
index 9972315..4aa012b 100644
--- a/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
+++ b/slidingpanelayout/src/main/java/androidx/slidingpanelayout/widget/SlidingPaneLayout.java
@@ -1578,9 +1578,6 @@
AccessibilityNodeInfoCompat src) {
final Rect rect = mTmpRect;
- src.getBoundsInParent(rect);
- dest.setBoundsInParent(rect);
-
src.getBoundsInScreen(rect);
dest.setBoundsInScreen(rect);
diff --git a/sqlite/sqlite-framework/api/2.1.0-alpha01.txt b/sqlite/sqlite-framework/api/2.1.0-alpha01.txt
new file mode 100644
index 0000000..9c05b84
--- /dev/null
+++ b/sqlite/sqlite-framework/api/2.1.0-alpha01.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.sqlite.db.framework {
+
+ public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
+ ctor public FrameworkSQLiteOpenHelperFactory();
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper! create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration!);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/sqlite/sqlite-framework/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to sqlite/sqlite-framework/api/res-2.1.0-alpha01.txt
diff --git a/sqlite/sqlite-framework/api/restricted_2.1.0-alpha01.txt b/sqlite/sqlite-framework/api/restricted_2.1.0-alpha01.txt
new file mode 100644
index 0000000..9c05b84
--- /dev/null
+++ b/sqlite/sqlite-framework/api/restricted_2.1.0-alpha01.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.sqlite.db.framework {
+
+ public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
+ ctor public FrameworkSQLiteOpenHelperFactory();
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper! create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration!);
+ }
+
+}
+
diff --git a/sqlite/sqlite-framework/build.gradle b/sqlite/sqlite-framework/build.gradle
index 9b58633..b8fdc92 100644
--- a/sqlite/sqlite-framework/build.gradle
+++ b/sqlite/sqlite-framework/build.gradle
@@ -33,9 +33,9 @@
androidx {
name = "Android Support SQLite - Framework Implementation"
publish = Publish.SNAPSHOT_AND_RELEASE
- mavenVersion = LibraryVersions.PERSISTENCE
- mavenGroup = LibraryGroups.PERSISTENCE
+ mavenVersion = LibraryVersions.SQLITE
+ mavenGroup = LibraryGroups.SQLITE
inceptionYear = "2017"
description = "The implementation of Support SQLite library using the framework code."
url = AndroidXExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/sqlite/sqlite-ktx/api/2.1.0-alpha01.txt b/sqlite/sqlite-ktx/api/2.1.0-alpha01.txt
new file mode 100644
index 0000000..750b634
--- /dev/null
+++ b/sqlite/sqlite-ktx/api/2.1.0-alpha01.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.sqlite.db {
+
+ public final class SupportSQLiteDatabaseKt {
+ ctor public SupportSQLiteDatabaseKt();
+ method public static inline <T> T! transaction(androidx.sqlite.db.SupportSQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,? extends T> body);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/sqlite/sqlite-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to sqlite/sqlite-ktx/api/res-2.1.0-alpha01.txt
diff --git a/sqlite/sqlite-ktx/api/restricted_2.1.0-alpha01.txt b/sqlite/sqlite-ktx/api/restricted_2.1.0-alpha01.txt
new file mode 100644
index 0000000..750b634
--- /dev/null
+++ b/sqlite/sqlite-ktx/api/restricted_2.1.0-alpha01.txt
@@ -0,0 +1,10 @@
+// Signature format: 3.0
+package androidx.sqlite.db {
+
+ public final class SupportSQLiteDatabaseKt {
+ ctor public SupportSQLiteDatabaseKt();
+ method public static inline <T> T! transaction(androidx.sqlite.db.SupportSQLiteDatabase, boolean exclusive = true, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,? extends T> body);
+ }
+
+}
+
diff --git a/sqlite/sqlite-ktx/build.gradle b/sqlite/sqlite-ktx/build.gradle
index 95f0496..ec5b96a 100644
--- a/sqlite/sqlite-ktx/build.gradle
+++ b/sqlite/sqlite-ktx/build.gradle
@@ -37,8 +37,8 @@
androidx {
name = "Android DB KTX"
publish = Publish.SNAPSHOT_AND_RELEASE
- mavenVersion = LibraryVersions.PERSISTENCE
- mavenGroup = LibraryGroups.PERSISTENCE
+ mavenVersion = LibraryVersions.SQLITE
+ mavenGroup = LibraryGroups.SQLITE
inceptionYear = "2018"
description = "Kotlin extensions for DB"
url = AndroidXExtension.ARCHITECTURE_URL
diff --git a/sqlite/sqlite/api/2.1.0-alpha01.txt b/sqlite/sqlite/api/2.1.0-alpha01.txt
new file mode 100644
index 0000000..99d1651
--- /dev/null
+++ b/sqlite/sqlite/api/2.1.0-alpha01.txt
@@ -0,0 +1,126 @@
+// Signature format: 3.0
+package androidx.sqlite.db {
+
+ public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
+ ctor public SimpleSQLiteQuery(String!, Object![]?);
+ ctor public SimpleSQLiteQuery(String!);
+ method public static void bind(androidx.sqlite.db.SupportSQLiteProgram!, Object![]!);
+ method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+ method public int getArgCount();
+ method public String! getSql();
+ }
+
+ public interface SupportSQLiteDatabase extends java.io.Closeable {
+ method public void beginTransaction();
+ method public void beginTransactionNonExclusive();
+ method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener!);
+ method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener!);
+ method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String!);
+ method public int delete(String!, String!, Object![]!);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void disableWriteAheadLogging();
+ method public boolean enableWriteAheadLogging();
+ method public void endTransaction();
+ method public void execSQL(String!) throws android.database.SQLException;
+ method public void execSQL(String!, Object![]!) throws android.database.SQLException;
+ method public java.util.List<android.util.Pair<java.lang.String!,java.lang.String!>!>! getAttachedDbs();
+ method public long getMaximumSize();
+ method public long getPageSize();
+ method public String! getPath();
+ method public int getVersion();
+ method public boolean inTransaction();
+ method public long insert(String!, int, android.content.ContentValues!) throws android.database.SQLException;
+ method public boolean isDatabaseIntegrityOk();
+ method public boolean isDbLockedByCurrentThread();
+ method public boolean isOpen();
+ method public boolean isReadOnly();
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public boolean isWriteAheadLoggingEnabled();
+ method public boolean needUpgrade(int);
+ method public android.database.Cursor! query(String!);
+ method public android.database.Cursor! query(String!, Object![]!);
+ method public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!, android.os.CancellationSignal!);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setForeignKeyConstraintsEnabled(boolean);
+ method public void setLocale(java.util.Locale!);
+ method public void setMaxSqlCacheSize(int);
+ method public long setMaximumSize(long);
+ method public void setPageSize(long);
+ method public void setTransactionSuccessful();
+ method public void setVersion(int);
+ method public int update(String!, int, android.content.ContentValues!, String!, Object![]!);
+ method public boolean yieldIfContendedSafely();
+ method public boolean yieldIfContendedSafely(long);
+ }
+
+ public interface SupportSQLiteOpenHelper extends java.io.Closeable {
+ method public void close();
+ method public String! getDatabaseName();
+ method public androidx.sqlite.db.SupportSQLiteDatabase! getReadableDatabase();
+ method public androidx.sqlite.db.SupportSQLiteDatabase! getWritableDatabase();
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setWriteAheadLoggingEnabled(boolean);
+ }
+
+ public abstract static class SupportSQLiteOpenHelper.Callback {
+ ctor public SupportSQLiteOpenHelper.Callback(int);
+ method public void onConfigure(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public void onCorruption(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public void onDowngrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+ method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public abstract void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+ field public final int version;
+ }
+
+ public static class SupportSQLiteOpenHelper.Configuration {
+ method public static androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! builder(android.content.Context!);
+ field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback;
+ field public final android.content.Context context;
+ field public final String? name;
+ }
+
+ public static class SupportSQLiteOpenHelper.Configuration.Builder {
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration! build();
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! callback(androidx.sqlite.db.SupportSQLiteOpenHelper.Callback);
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! name(String?);
+ }
+
+ public static interface SupportSQLiteOpenHelper.Factory {
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper! create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration!);
+ }
+
+ public interface SupportSQLiteProgram extends java.io.Closeable {
+ method public void bindBlob(int, byte[]!);
+ method public void bindDouble(int, double);
+ method public void bindLong(int, long);
+ method public void bindNull(int);
+ method public void bindString(int, String!);
+ method public void clearBindings();
+ }
+
+ public interface SupportSQLiteQuery {
+ method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+ method public int getArgCount();
+ method public String! getSql();
+ }
+
+ public final class SupportSQLiteQueryBuilder {
+ method public static androidx.sqlite.db.SupportSQLiteQueryBuilder! builder(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! columns(String![]!);
+ method public androidx.sqlite.db.SupportSQLiteQuery! create();
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! distinct();
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! groupBy(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! having(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! limit(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! orderBy(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! selection(String!, Object![]!);
+ }
+
+ public interface SupportSQLiteStatement extends androidx.sqlite.db.SupportSQLiteProgram {
+ method public void execute();
+ method public long executeInsert();
+ method public int executeUpdateDelete();
+ method public long simpleQueryForLong();
+ method public String! simpleQueryForString();
+ }
+
+}
+
diff --git a/sqlite/sqlite/api/current.txt b/sqlite/sqlite/api/current.txt
index cfd41a7..99d1651 100644
--- a/sqlite/sqlite/api/current.txt
+++ b/sqlite/sqlite/api/current.txt
@@ -51,7 +51,7 @@
method public boolean yieldIfContendedSafely(long);
}
- public interface SupportSQLiteOpenHelper {
+ public interface SupportSQLiteOpenHelper extends java.io.Closeable {
method public void close();
method public String! getDatabaseName();
method public androidx.sqlite.db.SupportSQLiteDatabase! getReadableDatabase();
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/sqlite/sqlite/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to sqlite/sqlite/api/res-2.1.0-alpha01.txt
diff --git a/sqlite/sqlite/api/restricted_2.1.0-alpha01.txt b/sqlite/sqlite/api/restricted_2.1.0-alpha01.txt
new file mode 100644
index 0000000..99d1651
--- /dev/null
+++ b/sqlite/sqlite/api/restricted_2.1.0-alpha01.txt
@@ -0,0 +1,126 @@
+// Signature format: 3.0
+package androidx.sqlite.db {
+
+ public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
+ ctor public SimpleSQLiteQuery(String!, Object![]?);
+ ctor public SimpleSQLiteQuery(String!);
+ method public static void bind(androidx.sqlite.db.SupportSQLiteProgram!, Object![]!);
+ method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+ method public int getArgCount();
+ method public String! getSql();
+ }
+
+ public interface SupportSQLiteDatabase extends java.io.Closeable {
+ method public void beginTransaction();
+ method public void beginTransactionNonExclusive();
+ method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener!);
+ method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener!);
+ method public androidx.sqlite.db.SupportSQLiteStatement! compileStatement(String!);
+ method public int delete(String!, String!, Object![]!);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void disableWriteAheadLogging();
+ method public boolean enableWriteAheadLogging();
+ method public void endTransaction();
+ method public void execSQL(String!) throws android.database.SQLException;
+ method public void execSQL(String!, Object![]!) throws android.database.SQLException;
+ method public java.util.List<android.util.Pair<java.lang.String!,java.lang.String!>!>! getAttachedDbs();
+ method public long getMaximumSize();
+ method public long getPageSize();
+ method public String! getPath();
+ method public int getVersion();
+ method public boolean inTransaction();
+ method public long insert(String!, int, android.content.ContentValues!) throws android.database.SQLException;
+ method public boolean isDatabaseIntegrityOk();
+ method public boolean isDbLockedByCurrentThread();
+ method public boolean isOpen();
+ method public boolean isReadOnly();
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public boolean isWriteAheadLoggingEnabled();
+ method public boolean needUpgrade(int);
+ method public android.database.Cursor! query(String!);
+ method public android.database.Cursor! query(String!, Object![]!);
+ method public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public android.database.Cursor! query(androidx.sqlite.db.SupportSQLiteQuery!, android.os.CancellationSignal!);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setForeignKeyConstraintsEnabled(boolean);
+ method public void setLocale(java.util.Locale!);
+ method public void setMaxSqlCacheSize(int);
+ method public long setMaximumSize(long);
+ method public void setPageSize(long);
+ method public void setTransactionSuccessful();
+ method public void setVersion(int);
+ method public int update(String!, int, android.content.ContentValues!, String!, Object![]!);
+ method public boolean yieldIfContendedSafely();
+ method public boolean yieldIfContendedSafely(long);
+ }
+
+ public interface SupportSQLiteOpenHelper extends java.io.Closeable {
+ method public void close();
+ method public String! getDatabaseName();
+ method public androidx.sqlite.db.SupportSQLiteDatabase! getReadableDatabase();
+ method public androidx.sqlite.db.SupportSQLiteDatabase! getWritableDatabase();
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setWriteAheadLoggingEnabled(boolean);
+ }
+
+ public abstract static class SupportSQLiteOpenHelper.Callback {
+ ctor public SupportSQLiteOpenHelper.Callback(int);
+ method public void onConfigure(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public void onCorruption(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public void onDowngrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+ method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase!);
+ method public abstract void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase!, int, int);
+ field public final int version;
+ }
+
+ public static class SupportSQLiteOpenHelper.Configuration {
+ method public static androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! builder(android.content.Context!);
+ field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback;
+ field public final android.content.Context context;
+ field public final String? name;
+ }
+
+ public static class SupportSQLiteOpenHelper.Configuration.Builder {
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration! build();
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! callback(androidx.sqlite.db.SupportSQLiteOpenHelper.Callback);
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder! name(String?);
+ }
+
+ public static interface SupportSQLiteOpenHelper.Factory {
+ method public androidx.sqlite.db.SupportSQLiteOpenHelper! create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration!);
+ }
+
+ public interface SupportSQLiteProgram extends java.io.Closeable {
+ method public void bindBlob(int, byte[]!);
+ method public void bindDouble(int, double);
+ method public void bindLong(int, long);
+ method public void bindNull(int);
+ method public void bindString(int, String!);
+ method public void clearBindings();
+ }
+
+ public interface SupportSQLiteQuery {
+ method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram!);
+ method public int getArgCount();
+ method public String! getSql();
+ }
+
+ public final class SupportSQLiteQueryBuilder {
+ method public static androidx.sqlite.db.SupportSQLiteQueryBuilder! builder(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! columns(String![]!);
+ method public androidx.sqlite.db.SupportSQLiteQuery! create();
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! distinct();
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! groupBy(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! having(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! limit(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! orderBy(String!);
+ method public androidx.sqlite.db.SupportSQLiteQueryBuilder! selection(String!, Object![]!);
+ }
+
+ public interface SupportSQLiteStatement extends androidx.sqlite.db.SupportSQLiteProgram {
+ method public void execute();
+ method public long executeInsert();
+ method public int executeUpdateDelete();
+ method public long simpleQueryForLong();
+ method public String! simpleQueryForString();
+ }
+
+}
+
diff --git a/sqlite/sqlite/api/restricted_current.txt b/sqlite/sqlite/api/restricted_current.txt
index cfd41a7..99d1651 100644
--- a/sqlite/sqlite/api/restricted_current.txt
+++ b/sqlite/sqlite/api/restricted_current.txt
@@ -51,7 +51,7 @@
method public boolean yieldIfContendedSafely(long);
}
- public interface SupportSQLiteOpenHelper {
+ public interface SupportSQLiteOpenHelper extends java.io.Closeable {
method public void close();
method public String! getDatabaseName();
method public androidx.sqlite.db.SupportSQLiteDatabase! getReadableDatabase();
diff --git a/sqlite/sqlite/build.gradle b/sqlite/sqlite/build.gradle
index 23543ad..391f8d6 100644
--- a/sqlite/sqlite/build.gradle
+++ b/sqlite/sqlite/build.gradle
@@ -45,9 +45,9 @@
androidx {
name = "Android DB"
publish = Publish.SNAPSHOT_AND_RELEASE
- mavenVersion = LibraryVersions.PERSISTENCE
- mavenGroup = LibraryGroups.PERSISTENCE
+ mavenVersion = LibraryVersions.SQLITE
+ mavenGroup = LibraryGroups.SQLITE
inceptionYear = "2017"
description = "Android DB"
url = AndroidXExtension.ARCHITECTURE_URL
-}
\ No newline at end of file
+}
diff --git a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.java b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.java
index 322f9d5..014af07 100644
--- a/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.java
+++ b/sqlite/sqlite/src/main/java/androidx/sqlite/db/SupportSQLiteOpenHelper.java
@@ -27,6 +27,7 @@
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
+import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.util.List;
@@ -38,7 +39,7 @@
* the methods that should be overridden.
*/
@SuppressWarnings("unused")
-public interface SupportSQLiteOpenHelper {
+public interface SupportSQLiteOpenHelper extends Closeable {
/**
* Return the name of the SQLite database being opened, as given to
* the constructor.
@@ -102,7 +103,7 @@
/**
* Close any open database object.
*/
- void close();
+ @Override void close();
/**
* Handles various lifecycle events for the SQLite connection, similar to
diff --git a/swiperefreshlayout/src/androidTest/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayoutTest.java b/swiperefreshlayout/src/androidTest/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayoutTest.java
index de81eb0..caf7544 100644
--- a/swiperefreshlayout/src/androidTest/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayoutTest.java
+++ b/swiperefreshlayout/src/androidTest/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayoutTest.java
@@ -29,6 +29,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.view.ContextThemeWrapper;
import android.view.View;
import androidx.swiperefreshlayout.test.R;
@@ -100,6 +101,28 @@
}
@Test
+ @SmallTest
+ public void testStyles_setBackgroundColor() {
+ mSwipeRefresh.setProgressBackgroundColorSchemeColor(0xFFFBFBFB);
+ assertEquals(mSwipeRefresh.mCircleView.getBackgroundColor(), 0xFFFBFBFB);
+ }
+
+ @Test
+ @SmallTest
+ public void testStyles_defaultBackgroundColor() {
+ assertEquals(mSwipeRefresh.mCircleView.getBackgroundColor(), 0xFFFAFAFA);
+ }
+
+ @Test
+ @SmallTest
+ public void testStyles_backgroundColor() {
+ ContextThemeWrapper newContext = new ContextThemeWrapper(
+ mSwipeRefresh.getContext(), R.style.TestActivityThemeWithBackground);
+ SwipeRefreshLayout swipeRefreshLayout = new SwipeRefreshLayout(newContext);
+ assertEquals(swipeRefreshLayout.mCircleView.getBackgroundColor(), 0xFF808080);
+ }
+
+ @Test
@LargeTest
public void testSwipeDownToRefresh() throws Throwable {
assertFalse(mSwipeRefresh.isRefreshing());
@@ -114,13 +137,16 @@
float density = mSwipeRefresh.getResources().getDisplayMetrics().density;
assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
mSwipeRefresh.getProgressCircleDiameter());
- onView(withId(R.id.swipe_refresh)).perform(SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.LARGE));
+ onView(withId(R.id.swipe_refresh)).perform(
+ SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.LARGE));
assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER_LARGE * density),
mSwipeRefresh.getProgressCircleDiameter());
- onView(withId(R.id.swipe_refresh)).perform(SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.DEFAULT));
+ onView(withId(R.id.swipe_refresh)).perform(
+ SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.DEFAULT));
assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
mSwipeRefresh.getProgressCircleDiameter());
- onView(withId(R.id.swipe_refresh)).perform(SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.DEFAULT));
+ onView(withId(R.id.swipe_refresh)).perform(
+ SwipeRefreshLayoutActions.setSize(SwipeRefreshLayout.DEFAULT));
onView(withId(R.id.swipe_refresh)).perform(SwipeRefreshLayoutActions.setSize(INVALID_SIZE));
assertEquals((int) (SwipeRefreshLayout.CIRCLE_DIAMETER * density),
mSwipeRefresh.getProgressCircleDiameter());
diff --git a/swiperefreshlayout/src/androidTest/res/values/styles.xml b/swiperefreshlayout/src/androidTest/res/values/styles.xml
index 0e0cb3d..da27ddf 100644
--- a/swiperefreshlayout/src/androidTest/res/values/styles.xml
+++ b/swiperefreshlayout/src/androidTest/res/values/styles.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
+<!-- Copyright (C) 2019 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -17,4 +17,8 @@
<style name="TestActivityTheme" parent="Theme.AppCompat.Light">
<item name="android:windowAnimationStyle">@null</item>
</style>
+
+ <style name="TestActivityThemeWithBackground" parent="TestActivityTheme">
+ <item name="swipeRefreshLayoutProgressSpinnerBackgroundColor">#FF808080</item>
+ </style>
</resources>
\ No newline at end of file
diff --git a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
index 9addccd..de9f404 100644
--- a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
+++ b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/CircleImageView.java
@@ -16,7 +16,9 @@
package androidx.swiperefreshlayout.widget;
+import android.annotation.SuppressLint;
import android.content.Context;
+import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
@@ -28,8 +30,8 @@
import android.view.animation.Animation;
import android.widget.ImageView;
-import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
+import androidx.swiperefreshlayout.R;
/**
* Private class created to work around issues with AnimationListeners being
@@ -38,8 +40,10 @@
*/
class CircleImageView extends ImageView {
- private static final int KEY_SHADOW_COLOR = 0x1E000000;
+ private static final int DEFAULT_BACKGROUND_COLOR = 0xFFFAFAFA;
private static final int FILL_SHADOW_COLOR = 0x3D000000;
+ private static final int KEY_SHADOW_COLOR = 0x1E000000;
+
// PX
private static final float X_OFFSET = 0f;
private static final float Y_OFFSET = 1.75f;
@@ -47,23 +51,33 @@
private static final int SHADOW_ELEVATION = 4;
private Animation.AnimationListener mListener;
- int mShadowRadius;
+ private int mShadowRadius;
+ private int mBackgroundColor;
- CircleImageView(Context context, int color) {
+ CircleImageView(Context context) {
super(context);
+
final float density = getContext().getResources().getDisplayMetrics().density;
final int shadowYOffset = (int) (density * Y_OFFSET);
final int shadowXOffset = (int) (density * X_OFFSET);
mShadowRadius = (int) (density * SHADOW_RADIUS);
+ // The style attribute is named SwipeRefreshLayout instead of CircleImageView because
+ // CircleImageView is not part of the public api.
+ @SuppressLint("CustomViewStyleable")
+ TypedArray colorArray = getContext().obtainStyledAttributes(R.styleable.SwipeRefreshLayout);
+ mBackgroundColor = colorArray.getColor(
+ R.styleable.SwipeRefreshLayout_swipeRefreshLayoutProgressSpinnerBackgroundColor,
+ DEFAULT_BACKGROUND_COLOR);
+ colorArray.recycle();
+
ShapeDrawable circle;
if (elevationSupported()) {
circle = new ShapeDrawable(new OvalShape());
ViewCompat.setElevation(this, SHADOW_ELEVATION * density);
} else {
- OvalShape oval = new OvalShadow(mShadowRadius);
- circle = new ShapeDrawable(oval);
+ circle = new ShapeDrawable(new OvalShadow(this, mShadowRadius));
setLayerType(View.LAYER_TYPE_SOFTWARE, circle.getPaint());
circle.getPaint().setShadowLayer(mShadowRadius, shadowXOffset, shadowYOffset,
KEY_SHADOW_COLOR);
@@ -71,7 +85,7 @@
// set padding so the inner image sits correctly within the shadow.
setPadding(padding, padding, padding, padding);
}
- circle.getPaint().setColor(color);
+ circle.getPaint().setColor(mBackgroundColor);
ViewCompat.setBackground(this, circle);
}
@@ -108,28 +122,26 @@
}
}
- /**
- * Update the background color of the circle image view.
- *
- * @param colorRes Id of a color resource.
- */
- public void setBackgroundColorRes(int colorRes) {
- setBackgroundColor(ContextCompat.getColor(getContext(), colorRes));
- }
-
@Override
public void setBackgroundColor(int color) {
if (getBackground() instanceof ShapeDrawable) {
((ShapeDrawable) getBackground()).getPaint().setColor(color);
+ mBackgroundColor = color;
}
}
- private class OvalShadow extends OvalShape {
- private RadialGradient mRadialGradient;
- private Paint mShadowPaint;
+ public int getBackgroundColor() {
+ return mBackgroundColor;
+ }
- OvalShadow(int shadowRadius) {
+ private static class OvalShadow extends OvalShape {
+ private Paint mShadowPaint;
+ private int mShadowRadius;
+ private CircleImageView mCircleImageView;
+
+ OvalShadow(CircleImageView circleImageView, int shadowRadius) {
super();
+ mCircleImageView = circleImageView;
mShadowPaint = new Paint();
mShadowRadius = shadowRadius;
updateRadialGradient((int) rect().width());
@@ -143,17 +155,20 @@
@Override
public void draw(Canvas canvas, Paint paint) {
- final int viewWidth = CircleImageView.this.getWidth();
- final int viewHeight = CircleImageView.this.getHeight();
- canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2, mShadowPaint);
- canvas.drawCircle(viewWidth / 2, viewHeight / 2, viewWidth / 2 - mShadowRadius, paint);
+ final int x = mCircleImageView.getWidth() / 2;
+ final int y = mCircleImageView.getHeight() / 2;
+ canvas.drawCircle(x, y, x, mShadowPaint);
+ canvas.drawCircle(x, y, x - mShadowRadius, paint);
}
private void updateRadialGradient(int diameter) {
- mRadialGradient = new RadialGradient(diameter / 2, diameter / 2,
- mShadowRadius, new int[] { FILL_SHADOW_COLOR, Color.TRANSPARENT },
- null, Shader.TileMode.CLAMP);
- mShadowPaint.setShader(mRadialGradient);
+ mShadowPaint.setShader(new RadialGradient(
+ diameter / 2,
+ diameter / 2,
+ mShadowRadius,
+ new int[]{FILL_SHADOW_COLOR, Color.TRANSPARENT},
+ null,
+ Shader.TileMode.CLAMP));
}
}
}
diff --git a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
index b104d3f..2d04256 100644
--- a/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
+++ b/swiperefreshlayout/src/main/java/androidx/swiperefreshlayout/widget/SwipeRefreshLayout.java
@@ -109,8 +109,6 @@
private static final int ANIMATE_TO_START_DURATION = 200;
- // Default background for the progress spinner
- private static final int CIRCLE_BG_LIGHT = 0xFFFAFAFA;
// Default offset in dips from the top of the view to where the progress spinner should stop
private static final int DEFAULT_CIRCLE_TARGET = 64;
@@ -456,7 +454,7 @@
}
private void createProgressView() {
- mCircleView = new CircleImageView(getContext(), CIRCLE_BG_LIGHT);
+ mCircleView = new CircleImageView(getContext());
mProgress = new CircularProgressDrawable(getContext());
mProgress.setStyle(CircularProgressDrawable.DEFAULT);
mCircleView.setImageDrawable(mProgress);
diff --git a/swiperefreshlayout/src/main/res-public/values/attrs.xml b/swiperefreshlayout/src/main/res-public/values/attrs.xml
new file mode 100644
index 0000000..1824c9b
--- /dev/null
+++ b/swiperefreshlayout/src/main/res-public/values/attrs.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!-- Definitions of attributes to be exposed as public -->
+<resources>
+ <public type="attr" name="swipeRefreshLayoutProgressSpinnerBackgroundColor" format="color"/>
+</resources>
\ No newline at end of file
diff --git a/fragment/fragment/src/main/res/interpolator/linear.xml b/swiperefreshlayout/src/main/res/values/attrs.xml
similarity index 70%
copy from fragment/fragment/src/main/res/interpolator/linear.xml
copy to swiperefreshlayout/src/main/res/values/attrs.xml
index 9fa4361..d628dd3 100644
--- a/fragment/fragment/src/main/res/interpolator/linear.xml
+++ b/swiperefreshlayout/src/main/res/values/attrs.xml
@@ -14,5 +14,12 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<!--Taken from https://googleplex-android.googlesource.com/platform/frameworks/base/+/HEAD/core/res/res/interpolator/linear.xml-->
-<linearInterpolator />
\ No newline at end of file
+
+<resources>
+
+ <declare-styleable name="SwipeRefreshLayout">
+ <!-- Background color for SwipeRefreshLayout progress spinner. -->
+ <attr name="swipeRefreshLayoutProgressSpinnerBackgroundColor" format="color" />
+ </declare-styleable>
+
+</resources>
\ No newline at end of file
diff --git a/ui/integration-tests/benchmark/build.gradle b/ui/integration-tests/benchmark/build.gradle
index 3d0f974..4d8845b 100644
--- a/ui/integration-tests/benchmark/build.gradle
+++ b/ui/integration-tests/benchmark/build.gradle
@@ -28,8 +28,10 @@
dependencies {
kotlinPlugin project(path: ":compose:compose-compiler", configuration: "embeddablePlugin")
- androidTestImplementation(project(":ui:integration-tests:test"))
- androidTestImplementation(project(":benchmark"))
+ implementation(project(":ui:integration-tests:test"))
+ implementation(project(":benchmark"))
+ implementation(KOTLIN_COMPOSE_STDLIB)
+ implementation(JUNIT)
androidTestImplementation(project(":ui:ui-core"))
androidTestImplementation(project(":ui:ui-test"))
androidTestImplementation(project(":ui:ui-material"))
@@ -37,9 +39,7 @@
androidTestImplementation(project(":ui:ui-framework"))
androidTestImplementation(project(":compose:compose-runtime"))
androidTestImplementation 'androidx.test.ext:junit:1.1.0'
- androidTestImplementation(KOTLIN_COMPOSE_STDLIB)
androidTestImplementation(TRUTH)
- androidTestImplementation(JUNIT)
androidTestImplementation(ANDROIDX_TEST_RULES)
}
@@ -52,6 +52,8 @@
description = "UI Benchmarks"
}
+android.defaultConfig.minSdkVersion 29 // RenderNode requires 29+
+
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
kotlinOptions {
useIR = true
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/CheckboxesInRowsBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/CheckboxesInRowsBenchmark.kt
new file mode 100644
index 0000000..dba8ad2
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/CheckboxesInRowsBenchmark.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.benchmark.test
+
+import android.app.Activity
+import androidx.benchmark.BenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.benchmark.measureDrawPerf
+import androidx.ui.benchmark.measureLayoutPerf
+import androidx.ui.benchmark.toggleStateMeasureDraw
+import androidx.ui.benchmark.toggleStateMeasureLayout
+import androidx.ui.benchmark.toggleStateMeasureMeasure
+import androidx.ui.benchmark.toggleStateMeasureRecompose
+import androidx.ui.test.cases.CheckboxesInRowsTestCase
+import androidx.ui.test.DisableTransitions
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Benchmark that runs [CheckboxesInRowsTestCase].
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class CheckboxesInRowsBenchmark(private val numberOfCheckboxes: Int) {
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters
+ fun initParameters(): Array<Any> = arrayOf(1, 10)
+ }
+
+ @get:Rule
+ val benchmarkRule = BenchmarkRule()
+
+ @get:Rule
+ val activityRule = ActivityTestRule(Activity::class.java)
+
+ @get:Rule
+ val disableAnimationRule = DisableTransitions()
+
+ private val activity: Activity get() = activityRule.activity
+
+ @Test
+ fun toggleCheckbox_recompose() {
+ val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+ benchmarkRule.toggleStateMeasureRecompose(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleCheckbox_measure() {
+ val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+ benchmarkRule.toggleStateMeasureMeasure(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleCheckbox_layout() {
+ val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+ benchmarkRule.toggleStateMeasureLayout(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleCheckbox_draw() {
+ val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+ benchmarkRule.toggleStateMeasureDraw(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun layout() {
+ val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+ benchmarkRule.measureLayoutPerf(activity, testCase)
+ }
+
+ @Test
+ fun draw() {
+ val testCase = CheckboxesInRowsTestCase(activity, numberOfCheckboxes)
+ benchmarkRule.measureDrawPerf(activity, testCase)
+ }
+}
\ No newline at end of file
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/ColoredRectBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/ColoredRectBenchmark.kt
deleted file mode 100644
index ff19b8a..0000000
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/ColoredRectBenchmark.kt
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.benchmark.test
-
-import android.app.Activity
-import androidx.benchmark.BenchmarkRule
-import androidx.benchmark.measureRepeated
-import androidx.test.filters.LargeTest
-import androidx.test.rule.ActivityTestRule
-import androidx.ui.test.DisableTransitions
-import androidx.ui.test.RectanglesInColumnTestCase
-import androidx.ui.test.recomposeSyncAssertHadChanges
-import androidx.ui.test.recomposeSyncAssertNoChanges
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-/**
- * Benchmark that runs [RectanglesInColumnTestCase]. Currently we test re-composition time.
- */
-@LargeTest
-@RunWith(Parameterized::class)
-class ColoredRectBenchmark(private val numberOfRectangles: Int) {
-
- companion object {
- @JvmStatic
- @Parameterized.Parameters
- fun initParameters(): Array<Any> = arrayOf(1, 10)
- }
-
- @get:Rule
- val benchmarkRule = BenchmarkRule()
-
- @get:Rule
- val activityRule = ActivityTestRule(Activity::class.java)
-
- @get:Rule
- val disableAnimationRule = DisableTransitions()
-
- @Test
- fun toggleRectangleColor_recompose() {
- activityRule.runOnUiThread(object : Runnable {
- override fun run() {
- val testCase = RectanglesInColumnTestCase(activityRule.activity, numberOfRectangles)
- .apply { runSetup() }
- testCase.compositionContext.recomposeSyncAssertNoChanges()
-
- benchmarkRule.measureRepeated {
- runWithTimingDisabled {
- testCase.toggleState()
- }
- testCase.compositionContext.recomposeSyncAssertHadChanges()
- }
- }
- })
- }
-}
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnBenchmark.kt
new file mode 100644
index 0000000..b91315b
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnBenchmark.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.benchmark.test
+
+import android.app.Activity
+import androidx.benchmark.BenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.benchmark.measureDrawPerf
+import androidx.ui.benchmark.measureLayoutPerf
+import androidx.ui.benchmark.toggleStateMeasureDraw
+import androidx.ui.benchmark.toggleStateMeasureLayout
+import androidx.ui.benchmark.toggleStateMeasureMeasure
+import androidx.ui.benchmark.toggleStateMeasureRecompose
+import androidx.ui.test.DisableTransitions
+import androidx.ui.test.cases.RectsInColumnTestCase
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Benchmark that runs [RectsInColumnTestCase].
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class RectsInColumnBenchmark(private val numberOfRectangles: Int) {
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters
+ fun initParameters(): Array<Any> = arrayOf(1, 10)
+ }
+
+ @get:Rule
+ val benchmarkRule = BenchmarkRule()
+
+ @get:Rule
+ val activityRule = ActivityTestRule(Activity::class.java)
+
+ @get:Rule
+ val disableAnimationRule = DisableTransitions()
+
+ private val activity: Activity get() = activityRule.activity
+
+ @Test
+ fun toggleRectangleColor_recompose() {
+ val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+ benchmarkRule.toggleStateMeasureRecompose(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleRectangleColor_measure() {
+ val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+ benchmarkRule.toggleStateMeasureMeasure(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleRectangleColor_layout() {
+ val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+ benchmarkRule.toggleStateMeasureLayout(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleRectangleColor_draw() {
+ val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+ benchmarkRule.toggleStateMeasureDraw(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun layout() {
+ val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+ benchmarkRule.measureLayoutPerf(activity, testCase)
+ }
+
+ @Test
+ fun draw() {
+ val testCase = RectsInColumnTestCase(activity, numberOfRectangles)
+ benchmarkRule.measureDrawPerf(activity, testCase)
+ }
+}
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnSharedModelBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnSharedModelBenchmark.kt
new file mode 100644
index 0000000..28fc60a
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/RectsInColumnSharedModelBenchmark.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.benchmark.test
+
+import android.app.Activity
+import androidx.benchmark.BenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.benchmark.measureDrawPerf
+import androidx.ui.benchmark.measureLayoutPerf
+import androidx.ui.benchmark.toggleStateMeasureDraw
+import androidx.ui.benchmark.toggleStateMeasureLayout
+import androidx.ui.benchmark.toggleStateMeasureMeasure
+import androidx.ui.benchmark.toggleStateMeasureRecompose
+import androidx.ui.test.DisableTransitions
+import androidx.ui.test.cases.RectsInColumnSharedModelTestCase
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Benchmark that runs [RectsInColumnSharedModelTestCase].
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class RectsInColumnSharedModelBenchmark(private val numberOfRectangles: Int) {
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters
+ fun initParameters(): Array<Any> = arrayOf(1, 10)
+ }
+
+ @get:Rule
+ val benchmarkRule = BenchmarkRule()
+
+ @get:Rule
+ val activityRule = ActivityTestRule(Activity::class.java)
+
+ @get:Rule
+ val disableAnimationRule = DisableTransitions()
+
+ private val activity: Activity get() = activityRule.activity
+
+ @Test
+ fun toggleRectangleColor_recompose() {
+ val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+ benchmarkRule.toggleStateMeasureRecompose(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleRectangleColor_measure() {
+ val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+ benchmarkRule.toggleStateMeasureMeasure(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleRectangleColor_layout() {
+ val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+ benchmarkRule.toggleStateMeasureLayout(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun toggleRectangleColor_draw() {
+ val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+ benchmarkRule.toggleStateMeasureDraw(activity, testCase) {
+ testCase.toggleState()
+ }
+ }
+
+ @Test
+ fun layout() {
+ val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+ benchmarkRule.measureLayoutPerf(activity, testCase)
+ }
+
+ @Test
+ fun draw() {
+ val testCase = RectsInColumnSharedModelTestCase(activity, numberOfRectangles)
+ benchmarkRule.measureDrawPerf(activity, testCase)
+ }
+}
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/view/AndroidCheckboxesInLinearLayoutBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/view/AndroidCheckboxesInLinearLayoutBenchmark.kt
new file mode 100644
index 0000000..4c5674e
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/view/AndroidCheckboxesInLinearLayoutBenchmark.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.benchmark.test.view
+
+import android.app.Activity
+import androidx.benchmark.BenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import androidx.ui.benchmark.measureDrawPerf
+import androidx.ui.benchmark.measureLayoutPerf
+import androidx.ui.test.DisableTransitions
+import androidx.ui.test.cases.view.AndroidCheckboxesInLinearLayoutTestCase
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * Benchmark that runs [AndroidCheckboxesInLinearLayoutTestCase].
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class AndroidCheckboxesInLinearLayoutBenchmark(private val numberOfCheckboxes: Int) {
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters
+ fun initParameters(): Array<Any> = arrayOf(1, 10)
+ }
+
+ @get:Rule
+ val benchmarkRule = BenchmarkRule()
+
+ @get:Rule
+ val activityRule = ActivityTestRule(Activity::class.java)
+
+ @get:Rule
+ val disableAnimationRule = DisableTransitions()
+
+ @Test
+ fun layout() {
+ val testCase = AndroidCheckboxesInLinearLayoutTestCase(activityRule.activity,
+ numberOfCheckboxes)
+ benchmarkRule.measureLayoutPerf(activityRule.activity, testCase)
+ }
+
+ @Test
+ fun draw() {
+ val testCase = AndroidCheckboxesInLinearLayoutTestCase(activityRule.activity,
+ numberOfCheckboxes)
+ benchmarkRule.measureDrawPerf(activityRule.activity, testCase)
+ }
+}
\ No newline at end of file
diff --git a/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/BenchmarksExtensions.kt b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/BenchmarksExtensions.kt
new file mode 100644
index 0000000..9825448
--- /dev/null
+++ b/ui/integration-tests/benchmark/src/main/java/androidx/ui/benchmark/BenchmarksExtensions.kt
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.benchmark
+
+import android.app.Activity
+import android.view.View
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
+import androidx.ui.test.ComposeTestCase
+import androidx.ui.test.TestCase
+import androidx.ui.test.invalidateViews
+import androidx.ui.test.recomposeSyncAssertHadChanges
+import androidx.ui.test.recomposeSyncAssertNoChanges
+import androidx.ui.test.requestLayout
+import androidx.ui.test.runOnUiThreadSync
+
+/**
+ * Measures measure and layout performance of the given testCase by toggling measure constraints.
+ */
+fun BenchmarkRule.measureLayoutPerf(activity: Activity, testCase: TestCase) {
+ activity.runOnUiThreadSync {
+ testCase.runSetup()
+
+ val width = testCase.view.measuredWidth
+ val height = testCase.view.measuredHeight
+ var widthSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY)
+ var heightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)
+
+ testCase.requestLayout()
+ testCase.measureWithSpec(widthSpec, heightSpec)
+ testCase.layout()
+
+ var lastWidth = testCase.view.measuredWidth
+ var lastHeight: Int
+ measureRepeated {
+ runWithTimingDisabled {
+ if (lastWidth == width) {
+ lastWidth = width - 10
+ lastHeight = height - 10
+ } else {
+
+ lastWidth = width
+ lastHeight = height
+ }
+ widthSpec =
+ View.MeasureSpec.makeMeasureSpec(lastWidth, View.MeasureSpec.EXACTLY)
+ heightSpec =
+ View.MeasureSpec.makeMeasureSpec(lastHeight, View.MeasureSpec.EXACTLY)
+ testCase.requestLayout()
+ }
+ testCase.measureWithSpec(widthSpec, heightSpec)
+ testCase.layout()
+ }
+ }
+}
+
+/**
+ * Measures draw performance of the given testCase by invalidating the view hierarchy.
+ */
+fun BenchmarkRule.measureDrawPerf(activity: Activity, testCase: TestCase) {
+ activity.runOnUiThreadSync {
+ testCase.runSetup()
+
+ measureRepeated {
+ runWithTimingDisabled {
+ testCase.invalidateViews()
+ testCase.prepareDraw()
+ }
+ testCase.draw()
+ runWithTimingDisabled {
+ testCase.finishDraw()
+ }
+ }
+ }
+}
+
+/**
+ * Measures recomposition time of the hierarchy after changing a state.
+ */
+fun BenchmarkRule.toggleStateMeasureRecompose(
+ activity: Activity,
+ testCase: ComposeTestCase,
+ toggleState: () -> Unit
+) {
+ activity.runOnUiThreadSync {
+ testCase.runSetup()
+ testCase.recomposeSyncAssertNoChanges()
+
+ measureRepeated {
+ runWithTimingDisabled {
+ toggleState()
+ }
+ testCase.recomposeSyncAssertHadChanges()
+ }
+ }
+}
+
+/**
+ * Measures measure time of the hierarchy after changing a state.
+ */
+fun BenchmarkRule.toggleStateMeasureMeasure(
+ activity: Activity,
+ testCase: ComposeTestCase,
+ toggleState: () -> Unit
+) {
+ activity.runOnUiThreadSync {
+ testCase.runSetup()
+ testCase.recomposeSyncAssertNoChanges()
+
+ measureRepeated {
+ runWithTimingDisabled {
+ toggleState()
+ testCase.recomposeSyncAssertHadChanges()
+ testCase.requestLayout()
+ }
+ testCase.measure()
+ }
+ }
+}
+
+/**
+ * Measures layout time of the hierarchy after changing a state.
+ */
+fun BenchmarkRule.toggleStateMeasureLayout(
+ activity: Activity,
+ testCase: ComposeTestCase,
+ toggleState: () -> Unit
+) {
+ activity.runOnUiThreadSync {
+ testCase.runSetup()
+ testCase.recomposeSyncAssertNoChanges()
+
+ measureRepeated {
+ runWithTimingDisabled {
+ toggleState()
+ testCase.recomposeSyncAssertHadChanges()
+ testCase.requestLayout()
+ testCase.measure()
+ }
+ testCase.layout()
+ }
+ }
+}
+
+/**
+ * Measures draw time of the hierarchy after changing a state.
+ */
+fun BenchmarkRule.toggleStateMeasureDraw(
+ activity: Activity,
+ testCase: ComposeTestCase,
+ toggleState: () -> Unit
+) {
+ activity.runOnUiThreadSync {
+ testCase.runSetup()
+ testCase.recomposeSyncAssertNoChanges()
+
+ measureRepeated {
+ runWithTimingDisabled {
+ toggleState()
+ testCase.recomposeSyncAssertHadChanges()
+ testCase.requestLayout()
+ testCase.measure()
+ testCase.layout()
+ testCase.prepareDraw()
+ }
+ testCase.draw()
+ runWithTimingDisabled {
+ testCase.finishDraw()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/build.gradle b/ui/integration-tests/test/build.gradle
index cff4d04..2853179 100644
--- a/ui/integration-tests/test/build.gradle
+++ b/ui/integration-tests/test/build.gradle
@@ -36,6 +36,7 @@
implementation(JUNIT)
implementation(TRUTH)
+ implementation(ANDROIDX_TEST_RULES)
implementation project(":compose:compose-runtime")
implementation project(":ui:ui-core")
@@ -43,9 +44,8 @@
implementation project(":ui:ui-framework")
implementation project(":ui:ui-layout")
implementation project(":ui:ui-material")
+ implementation project(":ui:ui-platform")
implementation project(":ui:ui-test")
-
- androidTestImplementation(ANDROIDX_TEST_RULES)
}
androidx {
@@ -57,9 +57,10 @@
description = "UI Integration Tests"
}
+android.defaultConfig.minSdkVersion 29 // RenderNode requires 29+
+
tasks.withType(KotlinCompile).all {
kotlinOptions {
useIR = true
}
}
-
diff --git a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/CheckboxesInRowsTest.kt
similarity index 63%
copy from ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
copy to ui/integration-tests/test/src/androidTest/java/androidx/ui/test/CheckboxesInRowsTest.kt
index f45d6ad..9d7f8a8 100644
--- a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
+++ b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/CheckboxesInRowsTest.kt
@@ -17,20 +17,22 @@
package androidx.ui.test
import android.app.Activity
-import androidx.compose.composer
import androidx.test.filters.MediumTest
import androidx.test.rule.ActivityTestRule
+import androidx.ui.test.cases.CheckboxesInRowsTestCase
+import androidx.ui.test.cases.RectsInColumnSharedModelTestCase
+import androidx.ui.test.cases.RectsInColumnTestCase
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
/**
- * Ensure correctness of [RectanglesInColumnTestCase].
+ * Ensure correctness of [CheckboxesInRowsTestCase].
*/
@MediumTest
@RunWith(Parameterized::class)
-class ColoredRectTest(private val numberOfRectangles: Int) {
+class CheckboxesInRowsTest(private val numberOfCheckboxes: Int) {
companion object {
@JvmStatic
@@ -46,23 +48,12 @@
@Test
fun toggleRectangleColor_compose() {
- activityRule.runOnUiThread(object : Runnable {
- override fun run() {
- val testCase = RectanglesInColumnTestCase(activityRule.activity, numberOfRectangles)
- .apply { runSetup() }
-
- testCase.compositionContext.recomposeSyncAssertNoChanges()
-
- // Change state
+ activityRule.runOnUiThreadSync {
+ val testCase = CheckboxesInRowsTestCase(activityRule.activity,
+ numberOfCheckboxes)
+ runComposeTestWithStateToggleAndAssertRecompositions(testCase) {
testCase.toggleState()
-
- // Recompose our changes
- testCase.compositionContext.recomposeSyncAssertHadChanges()
-
- // No other compositions should be pending
- testCase.compositionContext.recomposeSyncAssertNoChanges()
}
- })
+ }
}
-
-}
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnSharedModelTest.kt
similarity index 63%
copy from ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
copy to ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnSharedModelTest.kt
index f45d6ad..cf724d8 100644
--- a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
+++ b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnSharedModelTest.kt
@@ -17,20 +17,20 @@
package androidx.ui.test
import android.app.Activity
-import androidx.compose.composer
import androidx.test.filters.MediumTest
import androidx.test.rule.ActivityTestRule
+import androidx.ui.test.cases.RectsInColumnSharedModelTestCase
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
/**
- * Ensure correctness of [RectanglesInColumnTestCase].
+ * Ensure correctness of [RectsInColumnSharedModelTestCase].
*/
@MediumTest
@RunWith(Parameterized::class)
-class ColoredRectTest(private val numberOfRectangles: Int) {
+class RectsInColumnSharedModelTest(private val numberOfRectangles: Int) {
companion object {
@JvmStatic
@@ -46,23 +46,12 @@
@Test
fun toggleRectangleColor_compose() {
- activityRule.runOnUiThread(object : Runnable {
- override fun run() {
- val testCase = RectanglesInColumnTestCase(activityRule.activity, numberOfRectangles)
- .apply { runSetup() }
-
- testCase.compositionContext.recomposeSyncAssertNoChanges()
-
- // Change state
+ activityRule.runOnUiThreadSync {
+ val testCase = RectsInColumnSharedModelTestCase(activityRule.activity,
+ numberOfRectangles)
+ runComposeTestWithStateToggleAndAssertRecompositions(testCase) {
testCase.toggleState()
-
- // Recompose our changes
- testCase.compositionContext.recomposeSyncAssertHadChanges()
-
- // No other compositions should be pending
- testCase.compositionContext.recomposeSyncAssertNoChanges()
}
- })
+ }
}
-
-}
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnTest.kt
similarity index 63%
rename from ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
rename to ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnTest.kt
index f45d6ad..ba8c6e6 100644
--- a/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/ColoredRectTest.kt
+++ b/ui/integration-tests/test/src/androidTest/java/androidx/ui/test/RectsInColumnTest.kt
@@ -17,20 +17,20 @@
package androidx.ui.test
import android.app.Activity
-import androidx.compose.composer
import androidx.test.filters.MediumTest
import androidx.test.rule.ActivityTestRule
+import androidx.ui.test.cases.RectsInColumnTestCase
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
/**
- * Ensure correctness of [RectanglesInColumnTestCase].
+ * Ensure correctness of [RectsInColumnTestCase].
*/
@MediumTest
@RunWith(Parameterized::class)
-class ColoredRectTest(private val numberOfRectangles: Int) {
+class RectsInColumnTest(private val numberOfRectangles: Int) {
companion object {
@JvmStatic
@@ -46,23 +46,11 @@
@Test
fun toggleRectangleColor_compose() {
- activityRule.runOnUiThread(object : Runnable {
- override fun run() {
- val testCase = RectanglesInColumnTestCase(activityRule.activity, numberOfRectangles)
- .apply { runSetup() }
-
- testCase.compositionContext.recomposeSyncAssertNoChanges()
-
- // Change state
+ activityRule.runOnUiThreadSync {
+ val testCase = RectsInColumnTestCase(activityRule.activity, numberOfRectangles)
+ runComposeTestWithStateToggleAndAssertRecompositions(testCase) {
testCase.toggleState()
-
- // Recompose our changes
- testCase.compositionContext.recomposeSyncAssertHadChanges()
-
- // No other compositions should be pending
- testCase.compositionContext.recomposeSyncAssertNoChanges()
}
- })
+ }
}
-
-}
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestCase.kt
new file mode 100644
index 0000000..c2a3a33
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestCase.kt
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.test
+
+import android.app.Activity
+import android.graphics.Bitmap
+import android.graphics.Canvas
+import android.graphics.Picture
+import android.graphics.RenderNode
+import android.util.DisplayMetrics
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import androidx.compose.CompositionContext
+import androidx.ui.core.AndroidCraneView
+import androidx.ui.core.ComponentNode
+import androidx.ui.core.DrawNode
+import com.google.common.truth.Truth
+import org.junit.Assert
+
+abstract class TestCase(
+ val activity: Activity
+) {
+
+ private val screenWithSpec: Int
+ private val screenHeightSpec: Int
+ private val renderNode = RenderNode("test")
+ private var canvas: Canvas? = null
+
+ init {
+ val displayMetrics = DisplayMetrics()
+ activity.windowManager.defaultDisplay.getMetrics(displayMetrics)
+ val height = displayMetrics.heightPixels
+ val width = displayMetrics.widthPixels
+
+ screenWithSpec = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.AT_MOST)
+ screenHeightSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST)
+ }
+
+ lateinit var view: ViewGroup
+
+ abstract fun runSetup()
+
+ /**
+ * To be run in benchmark.
+ */
+ fun measure() {
+ view.measure(screenWithSpec, screenHeightSpec)
+ }
+
+ /**
+ * To be run in benchmark.
+ */
+ fun measureWithSpec(widthSpec: Int, heightSpec: Int) {
+ view.measure(widthSpec, heightSpec)
+ }
+
+ /**
+ * Do not measure this in benchmark.
+ */
+ fun prepareDraw() {
+ renderNode.setPosition(0, 0, view.width, view.height)
+ canvas = renderNode.beginRecording()
+ }
+
+ /**
+ * To be run in benchmark. Call [prepareDraw] before and [finishDraw] after.
+ */
+ fun draw() {
+ view.draw(canvas)
+ }
+
+ /**
+ * Do not measure this in benchmark.
+ */
+ fun finishDraw() {
+ renderNode.endRecording()
+ }
+
+ /**
+ * Do not measure this in benchmark.
+ */
+ fun drawSlow() {
+ prepareDraw()
+ draw()
+ finishDraw()
+ }
+
+ /**
+ * To be run in benchmark.
+ */
+ fun layout() {
+ view.layout(view.left, view.top, view.right, view.bottom)
+ }
+}
+
+abstract class ComposeTestCase(
+ activity: Activity
+) : TestCase(activity) {
+
+ lateinit var compositionContext: CompositionContext
+}
+
+fun TestCase.assertMeasureSizeIsPositive() {
+ Truth.assertThat(view.measuredWidth).isAtLeast(1)
+ Truth.assertThat(view.measuredHeight).isAtLeast(1)
+}
+
+fun TestCase.invalidateViews() {
+ invalidateViews(view)
+}
+
+/**
+ * Invalidate the layout so that measure() and layout() do something
+ */
+fun TestCase.requestLayout() {
+ view.requestLayout()
+}
+
+private fun invalidateViews(view: View) {
+ view.invalidate()
+ if (view is ViewGroup) {
+ for (i in 0 until view.childCount) {
+ val child = view.getChildAt(i)
+ invalidateViews(child)
+ }
+ }
+ if (view is AndroidCraneView) {
+ invalidateComponentNodes(view.root)
+ }
+}
+
+private fun invalidateComponentNodes(node: ComponentNode) {
+ if (node is DrawNode) {
+ node.invalidate()
+ }
+ node.visitChildren { child ->
+ invalidateComponentNodes(child)
+ }
+}
+
+/**
+ * Performs recomposition and asserts that there were some pending changes.
+ */
+fun ComposeTestCase.recomposeSyncAssertHadChanges() {
+ val hadChanges = compositionContext.recomposeSync()
+ Assert.assertTrue(
+ "Expected pending changes on recomposition but there were none. Did " +
+ "you forget to call FrameManager.next()?", hadChanges
+ )
+}
+
+/**
+ * Performs recomposition and asserts that there were no pending changes.
+ */
+fun ComposeTestCase.recomposeSyncAssertNoChanges() {
+ val hadChanges = compositionContext.recomposeSync()
+ Assert.assertFalse(
+ "Expected no pending changes on recomposition but there were some.",
+ hadChanges
+ )
+}
+
+/**
+ * This is only for tests debugging purposes.
+ *
+ * Draws the given view into [Picture] and presents it in [ImageView] in the given Activity. This is
+ * useful for one time verification that your benchmark is producing excepted results and doing
+ * useful work.
+ */
+fun TestCase.capturePreviewPictureToActivity() {
+ val picture = Picture()
+ val canvas = picture.beginRecording(view.width, view.height)
+ view.draw(canvas)
+ picture.endRecording()
+ val imageView = ImageView(activity)
+ imageView.setImageBitmap(Bitmap.createBitmap(picture))
+ activity.setContentView(imageView)
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestExecutors.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestExecutors.kt
new file mode 100644
index 0000000..55cb4d1
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestExecutors.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.test
+
+/**
+ * Runs the given test case and toggle its state using the given lambda. Asserts that recomposition
+ * happens and has changes and also asserts that the no more compositions is needed.
+ */
+fun runComposeTestWithStateToggleAndAssertRecompositions(
+ testCase: ComposeTestCase,
+ toggleState: () -> Unit
+) {
+ testCase.runSetup()
+
+ testCase.assertMeasureSizeIsPositive()
+
+ testCase.recomposeSyncAssertNoChanges()
+
+ // Change state
+ toggleState.invoke()
+
+ // Recompose our changes
+ testCase.recomposeSyncAssertHadChanges()
+
+ // No other compositions should be pending
+ testCase.recomposeSyncAssertNoChanges()
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestUtils.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestUtils.kt
index 1ead593..9bfae0d7 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/test/TestUtils.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/TestUtils.kt
@@ -16,15 +16,14 @@
package androidx.ui.test
-import androidx.compose.composer
import android.app.Activity
+import androidx.compose.composer
import androidx.compose.Composable
import androidx.compose.CompositionContext
import androidx.ui.core.composeIntoActivity
+import androidx.test.rule.ActivityTestRule
import androidx.ui.material.MaterialTheme
import androidx.ui.material.surface.Surface
-import org.junit.Assert.assertFalse
-import org.junit.Assert.assertTrue
fun ComposeMaterialIntoActivity(
activity: Activity,
@@ -39,20 +38,20 @@
}
}
-/**
- * Performs recomposition and asserts that there were some pending changes.
- */
-fun CompositionContext.recomposeSyncAssertHadChanges() {
- val hadChanges = recomposeSync()
- assertTrue("Expected pending changes on recomposition but there were none. Did " +
- "you forget to call FrameManager.next()?", hadChanges)
+fun <T : Activity> ActivityTestRule<T>.runOnUiThreadSync(action: () -> Unit) {
+ // Workaround for lambda bug in IR
+ runOnUiThread(object : Runnable {
+ override fun run() {
+ action.invoke()
+ }
+ })
}
-/**
- * Performs recomposition and asserts that there were no pending changes.
- */
-fun CompositionContext.recomposeSyncAssertNoChanges() {
- val hadChanges = recomposeSync()
- assertFalse("Expected no pending changes on recomposition but there were some.",
- hadChanges)
+fun Activity.runOnUiThreadSync(action: () -> Unit) {
+ // Workaround for lambda bug in IR
+ runOnUiThread(object : Runnable {
+ override fun run() {
+ action.invoke()
+ }
+ })
}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/CheckboxesInRowsTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/CheckboxesInRowsTestCase.kt
new file mode 100644
index 0000000..368b2a8
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/CheckboxesInRowsTestCase.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.test.cases
+
+import android.app.Activity
+import androidx.compose.composer
+import androidx.compose.Composable
+import androidx.compose.FrameManager
+import androidx.compose.State
+import androidx.compose.state
+import androidx.compose.unaryPlus
+import androidx.ui.core.Text
+import androidx.ui.layout.Align
+import androidx.ui.layout.Alignment
+import androidx.ui.layout.Column
+import androidx.ui.layout.FlexRow
+import androidx.ui.material.Checkbox
+import androidx.ui.test.ComposeMaterialIntoActivity
+import androidx.ui.test.ComposeTestCase
+
+/**
+ * Test case that puts the given amount of checkboxes into a column of rows and makes changes by
+ * toggling the first checkbox.
+ */
+class CheckboxesInRowsTestCase(
+ activity: Activity,
+ private val amountOfCheckboxes: Int
+) : ComposeTestCase(activity) {
+
+ private val states = mutableListOf<State<Boolean>>()
+
+ override fun runSetup() {
+ compositionContext = ComposeMaterialIntoActivity(activity) {
+ Column {
+ repeat(amountOfCheckboxes) {
+ FlexRow {
+ inflexible {
+ Text(text = "Check Me!")
+ }
+ expanded(1f) {
+ Align(alignment = Alignment.CenterRight) {
+ CheckboxWithState()
+ }
+ }
+ }
+ }
+ }
+ }!!
+ FrameManager.nextFrame()
+
+ view = activity.findViewById(android.R.id.content)
+
+ measure()
+ layout()
+ drawSlow()
+ }
+
+ fun toggleState() {
+ val state = states.first()
+ state.value = !state.value
+ FrameManager.nextFrame()
+ }
+
+ @Composable
+ fun CheckboxWithState() {
+ val state = +state { false }
+ states.add(state)
+ Checkbox(
+ checked = state.value,
+ onCheckedChange = { state.value = !state.value }
+ )
+ }
+}
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/RectanglesInColumnTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnSharedModelTestCase.kt
similarity index 75%
rename from ui/integration-tests/test/src/main/java/androidx/ui/test/RectanglesInColumnTestCase.kt
rename to ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnSharedModelTestCase.kt
index 9b9047e..434fa7e 100644
--- a/ui/integration-tests/test/src/main/java/androidx/ui/test/RectanglesInColumnTestCase.kt
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnSharedModelTestCase.kt
@@ -14,34 +14,37 @@
* limitations under the License.
*/
-package androidx.ui.test
+package androidx.ui.test.cases
-import androidx.compose.composer
import android.app.Activity
-import androidx.compose.CompositionContext
+import androidx.compose.composer
import androidx.compose.FrameManager
import androidx.compose.Model
import androidx.ui.core.dp
import androidx.ui.foundation.ColoredRect
import androidx.ui.graphics.Color
import androidx.ui.layout.Column
+import androidx.ui.test.ComposeMaterialIntoActivity
+import androidx.ui.test.ComposeTestCase
@Model
-class RectanglesInColumnTestCaseColorModel(var color: Color)
+private class RectanglesInColumnTestCaseColorModel(var color: Color)
/**
* Test case that puts the given amount of rectangles into a column layout and makes changes by
* modifying the color used in the model.
+ *
+ * Note: Rectangle are created in for loop that reference a single model. Currently it will happen
+ * that the whole loop has to be re-run when model changes.
*/
-class RectanglesInColumnTestCase(
- private val activity: Activity,
+class RectsInColumnSharedModelTestCase(
+ activity: Activity,
private val amountOfRectangles: Int
-) {
+) : ComposeTestCase(activity) {
private val model = RectanglesInColumnTestCaseColorModel(Color.Black)
- lateinit var compositionContext: CompositionContext
- fun runSetup() {
+ override fun runSetup() {
compositionContext = ComposeMaterialIntoActivity(activity) {
Column {
repeat(amountOfRectangles) { i ->
@@ -54,6 +57,12 @@
}
}!!
FrameManager.nextFrame()
+
+ view = activity.findViewById(android.R.id.content)
+
+ measure()
+ layout()
+ drawSlow()
}
fun toggleState() {
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnTestCase.kt
new file mode 100644
index 0000000..2686f8b
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/RectsInColumnTestCase.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.test.cases
+
+import android.app.Activity
+import androidx.compose.composer
+import androidx.compose.Composable
+import androidx.compose.FrameManager
+import androidx.compose.State
+import androidx.compose.state
+import androidx.compose.unaryPlus
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.core.dp
+import androidx.ui.graphics.Color
+import androidx.ui.layout.Column
+import androidx.ui.test.ComposeMaterialIntoActivity
+import androidx.ui.test.ComposeTestCase
+
+/**
+ * Test case that puts the given amount of rectangles into a column layout and makes changes by
+ * modifying the color used in the model.
+ *
+ * Note: Each rectangle has its own model so changes should always affect only the first one.
+ */
+class RectsInColumnTestCase(
+ activity: Activity,
+ private val amountOfRectangles: Int
+) : ComposeTestCase(activity) {
+
+ private val states = mutableListOf<State<Color>>()
+
+ override fun runSetup() {
+ compositionContext = ComposeMaterialIntoActivity(activity) {
+ Column {
+ repeat(amountOfRectangles) {
+ ColoredRectWithModel()
+ }
+ }
+ }!!
+ FrameManager.nextFrame()
+
+ view = activity.findViewById(android.R.id.content)
+
+ measure()
+ layout()
+ drawSlow()
+ }
+
+ fun toggleState() {
+ val state = states.first()
+ if (state.value == Color.Purple) {
+ state.value = Color.Blue
+ } else {
+ state.value = Color.Purple
+ }
+ FrameManager.nextFrame()
+ }
+
+ @Composable
+ fun ColoredRectWithModel() {
+ val state = +state { Color.Black }
+ states.add(state)
+ ColoredRect(color = state.value, width = 100.dp, height = 50.dp)
+ }
+}
\ No newline at end of file
diff --git a/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/view/AndroidCheckboxesInLinearLayoutTestCase.kt b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/view/AndroidCheckboxesInLinearLayoutTestCase.kt
new file mode 100644
index 0000000..e12d6fc
--- /dev/null
+++ b/ui/integration-tests/test/src/main/java/androidx/ui/test/cases/view/AndroidCheckboxesInLinearLayoutTestCase.kt
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.test.cases.view
+
+import android.app.Activity
+import android.view.View
+import android.view.ViewGroup
+import android.widget.CheckBox
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.ui.test.R
+import androidx.ui.test.TestCase
+
+/**
+ * Version of [CheckboxesInRowsTestCase] using Android views.
+ */
+class AndroidCheckboxesInLinearLayoutTestCase(
+ activity: Activity,
+ private val amountOfCheckboxes: Int
+) : TestCase(activity) {
+
+ private val checkboxes = mutableListOf<CheckBox>()
+
+ override fun runSetup() {
+ val column = LinearLayout(activity)
+ column.orientation = LinearLayout.VERTICAL
+ column.layoutParams = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ )
+ column.id = R.id.normal
+ repeat(amountOfCheckboxes) {
+ val row = LinearLayout(activity)
+ row.orientation = LinearLayout.HORIZONTAL
+ row.layoutParams = LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ )
+ val text = TextView(activity)
+ text.text = "Check Me!"
+ text.layoutParams = LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ )
+ val checkbox = CheckBox(activity)
+ checkbox.isChecked = false
+ checkbox.layoutParams = LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT
+ )
+
+ val space = View(activity)
+ val layoutParams = LinearLayout.LayoutParams(0, 1)
+ layoutParams.weight = 1f
+ space.layoutParams = layoutParams
+ row.addView(text)
+ row.addView(space)
+ row.addView(checkbox)
+ column.addView(row)
+ }
+
+ view = column
+ activity.setContentView(column)
+
+ measure()
+ layout()
+ drawSlow()
+ }
+
+ fun toggleState() {
+ val checkbox = checkboxes.first()
+ checkbox.isChecked = !checkbox.isChecked
+ }
+}
diff --git a/ui/settings.gradle b/ui/settings.gradle
index 3a1973c..c4f0c38 100644
--- a/ui/settings.gradle
+++ b/ui/settings.gradle
@@ -26,7 +26,8 @@
includeProject(":compose:compose-compiler-hosted:integration-tests", "../compose/compose-compiler-hosted/integration-tests")
includeProject(":compose:compose-ide-plugin", "../compose/compose-ide-plugin")
includeProject(":compose:compose-runtime", "../compose/compose-runtime")
-includeProject(":ui:integration-tests:benchmark", "integration-tests/benchmark")
+includeProject(":compose:compose-runtime-benchmark", "../compose/compose-runtime/compose-runtime-benchmark")
+includeProject(":ui:integration-tests-benchmark", "integration-tests/benchmark")
includeProject(":ui:integration-tests:demos", "integration-tests/demos")
includeProject(":ui:integration-tests:test", "integration-tests/test")
includeProject(":ui:ui-android-text", "ui-android-text")
diff --git a/ui/ui-foundation/api/1.0.0-alpha01.txt b/ui/ui-foundation/api/1.0.0-alpha01.txt
index f55a2d6..26ee3a8 100644
--- a/ui/ui-foundation/api/1.0.0-alpha01.txt
+++ b/ui/ui-foundation/api/1.0.0-alpha01.txt
@@ -24,6 +24,61 @@
}
+package androidx.ui.foundation.gestures {
+
+ public final class AnchorsFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ ctor public AnchorsFlingConfig(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+ method public java.util.List<java.lang.Float> component1();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+ method public androidx.animation.AnimationBuilder<java.lang.Float> component3();
+ method public androidx.animation.DecayAnimation component4();
+ method public androidx.ui.foundation.gestures.AnchorsFlingConfig copy(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ method public java.util.List<java.lang.Float> getAnimationAnchors();
+ method public androidx.animation.AnimationBuilder<java.lang.Float> getAnimationBuilder();
+ method public androidx.animation.DecayAnimation getDecayAnimation();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnAnimationFinished();
+ }
+
+ public final class AnimatedDraggableKt {
+ ctor public AnimatedDraggableKt();
+ method public static void AnimatedDraggable(androidx.ui.foundation.gestures.DragDirection dragDirection, float startValue, float minValue = Float.MIN_VALUE, float maxValue = Float.MAX_VALUE, androidx.ui.foundation.gestures.FlingConfig? flingConfig = null, kotlin.jvm.functions.Function1<? super androidx.animation.BaseAnimatedValue<java.lang.Float>,kotlin.Unit> children);
+ }
+
+ public final class DecayFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ ctor public DecayFlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+ method public androidx.animation.DecayAnimation component1();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+ method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
+ method public androidx.ui.foundation.gestures.DecayFlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
+ method public androidx.animation.DecayAnimation getDecayAnimation();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnFlingFinished();
+ }
+
+ public final class DefaultFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ field public static final androidx.ui.foundation.gestures.DefaultFlingConfig! INSTANCE;
+ }
+
+ public abstract sealed class DragDirection {
+ }
+
+ public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
+ field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
+ }
+
+ public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
+ field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
+ }
+
+ public interface FlingConfig {
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ }
+
+}
+
package androidx.ui.foundation.selection {
public final class MutuallyExclusiveSetItemKt {
diff --git a/ui/ui-foundation/api/current.txt b/ui/ui-foundation/api/current.txt
index f55a2d6..26ee3a8 100644
--- a/ui/ui-foundation/api/current.txt
+++ b/ui/ui-foundation/api/current.txt
@@ -24,6 +24,61 @@
}
+package androidx.ui.foundation.gestures {
+
+ public final class AnchorsFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ ctor public AnchorsFlingConfig(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+ method public java.util.List<java.lang.Float> component1();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+ method public androidx.animation.AnimationBuilder<java.lang.Float> component3();
+ method public androidx.animation.DecayAnimation component4();
+ method public androidx.ui.foundation.gestures.AnchorsFlingConfig copy(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ method public java.util.List<java.lang.Float> getAnimationAnchors();
+ method public androidx.animation.AnimationBuilder<java.lang.Float> getAnimationBuilder();
+ method public androidx.animation.DecayAnimation getDecayAnimation();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnAnimationFinished();
+ }
+
+ public final class AnimatedDraggableKt {
+ ctor public AnimatedDraggableKt();
+ method public static void AnimatedDraggable(androidx.ui.foundation.gestures.DragDirection dragDirection, float startValue, float minValue = Float.MIN_VALUE, float maxValue = Float.MAX_VALUE, androidx.ui.foundation.gestures.FlingConfig? flingConfig = null, kotlin.jvm.functions.Function1<? super androidx.animation.BaseAnimatedValue<java.lang.Float>,kotlin.Unit> children);
+ }
+
+ public final class DecayFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ ctor public DecayFlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+ method public androidx.animation.DecayAnimation component1();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+ method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
+ method public androidx.ui.foundation.gestures.DecayFlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
+ method public androidx.animation.DecayAnimation getDecayAnimation();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnFlingFinished();
+ }
+
+ public final class DefaultFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ field public static final androidx.ui.foundation.gestures.DefaultFlingConfig! INSTANCE;
+ }
+
+ public abstract sealed class DragDirection {
+ }
+
+ public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
+ field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
+ }
+
+ public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
+ field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
+ }
+
+ public interface FlingConfig {
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ }
+
+}
+
package androidx.ui.foundation.selection {
public final class MutuallyExclusiveSetItemKt {
diff --git a/ui/ui-foundation/api/restricted_1.0.0-alpha01.txt b/ui/ui-foundation/api/restricted_1.0.0-alpha01.txt
index f55a2d6..26ee3a8 100644
--- a/ui/ui-foundation/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-foundation/api/restricted_1.0.0-alpha01.txt
@@ -24,6 +24,61 @@
}
+package androidx.ui.foundation.gestures {
+
+ public final class AnchorsFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ ctor public AnchorsFlingConfig(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+ method public java.util.List<java.lang.Float> component1();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+ method public androidx.animation.AnimationBuilder<java.lang.Float> component3();
+ method public androidx.animation.DecayAnimation component4();
+ method public androidx.ui.foundation.gestures.AnchorsFlingConfig copy(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ method public java.util.List<java.lang.Float> getAnimationAnchors();
+ method public androidx.animation.AnimationBuilder<java.lang.Float> getAnimationBuilder();
+ method public androidx.animation.DecayAnimation getDecayAnimation();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnAnimationFinished();
+ }
+
+ public final class AnimatedDraggableKt {
+ ctor public AnimatedDraggableKt();
+ method public static void AnimatedDraggable(androidx.ui.foundation.gestures.DragDirection dragDirection, float startValue, float minValue = Float.MIN_VALUE, float maxValue = Float.MAX_VALUE, androidx.ui.foundation.gestures.FlingConfig? flingConfig = null, kotlin.jvm.functions.Function1<? super androidx.animation.BaseAnimatedValue<java.lang.Float>,kotlin.Unit> children);
+ }
+
+ public final class DecayFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ ctor public DecayFlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+ method public androidx.animation.DecayAnimation component1();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+ method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
+ method public androidx.ui.foundation.gestures.DecayFlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
+ method public androidx.animation.DecayAnimation getDecayAnimation();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnFlingFinished();
+ }
+
+ public final class DefaultFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ field public static final androidx.ui.foundation.gestures.DefaultFlingConfig! INSTANCE;
+ }
+
+ public abstract sealed class DragDirection {
+ }
+
+ public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
+ field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
+ }
+
+ public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
+ field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
+ }
+
+ public interface FlingConfig {
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ }
+
+}
+
package androidx.ui.foundation.selection {
public final class MutuallyExclusiveSetItemKt {
diff --git a/ui/ui-foundation/api/restricted_current.txt b/ui/ui-foundation/api/restricted_current.txt
index f55a2d6..26ee3a8 100644
--- a/ui/ui-foundation/api/restricted_current.txt
+++ b/ui/ui-foundation/api/restricted_current.txt
@@ -24,6 +24,61 @@
}
+package androidx.ui.foundation.gestures {
+
+ public final class AnchorsFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ ctor public AnchorsFlingConfig(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+ method public java.util.List<java.lang.Float> component1();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+ method public androidx.animation.AnimationBuilder<java.lang.Float> component3();
+ method public androidx.animation.DecayAnimation component4();
+ method public androidx.ui.foundation.gestures.AnchorsFlingConfig copy(java.util.List<java.lang.Float> animationAnchors, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onAnimationFinished, androidx.animation.AnimationBuilder<java.lang.Float> animationBuilder, androidx.animation.DecayAnimation decayAnimation);
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ method public java.util.List<java.lang.Float> getAnimationAnchors();
+ method public androidx.animation.AnimationBuilder<java.lang.Float> getAnimationBuilder();
+ method public androidx.animation.DecayAnimation getDecayAnimation();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnAnimationFinished();
+ }
+
+ public final class AnimatedDraggableKt {
+ ctor public AnimatedDraggableKt();
+ method public static void AnimatedDraggable(androidx.ui.foundation.gestures.DragDirection dragDirection, float startValue, float minValue = Float.MIN_VALUE, float maxValue = Float.MAX_VALUE, androidx.ui.foundation.gestures.FlingConfig? flingConfig = null, kotlin.jvm.functions.Function1<? super androidx.animation.BaseAnimatedValue<java.lang.Float>,kotlin.Unit> children);
+ }
+
+ public final class DecayFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ ctor public DecayFlingConfig(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+ method public androidx.animation.DecayAnimation component1();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? component2();
+ method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> component3();
+ method public androidx.ui.foundation.gestures.DecayFlingConfig copy(androidx.animation.DecayAnimation decayAnimation, kotlin.jvm.functions.Function2<? super java.lang.Float,? super java.lang.Boolean,kotlin.Unit>? onFlingFinished, kotlin.jvm.functions.Function1<? super java.lang.Float,androidx.animation.TargetAnimation> adjustTarget);
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ method public kotlin.jvm.functions.Function1<java.lang.Float,androidx.animation.TargetAnimation> getAdjustTarget();
+ method public androidx.animation.DecayAnimation getDecayAnimation();
+ method public kotlin.jvm.functions.Function2<java.lang.Float,java.lang.Boolean,kotlin.Unit>? getOnFlingFinished();
+ }
+
+ public final class DefaultFlingConfig implements androidx.ui.foundation.gestures.FlingConfig {
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ field public static final androidx.ui.foundation.gestures.DefaultFlingConfig! INSTANCE;
+ }
+
+ public abstract sealed class DragDirection {
+ }
+
+ public static final class DragDirection.Horizontal extends androidx.ui.foundation.gestures.DragDirection {
+ field public static final androidx.ui.foundation.gestures.DragDirection.Horizontal! INSTANCE;
+ }
+
+ public static final class DragDirection.Vertical extends androidx.ui.foundation.gestures.DragDirection {
+ field public static final androidx.ui.foundation.gestures.DragDirection.Vertical! INSTANCE;
+ }
+
+ public interface FlingConfig {
+ method public void fling(androidx.animation.AnimatedFloat value, float startVelocity);
+ }
+
+}
+
package androidx.ui.foundation.selection {
public final class MutuallyExclusiveSetItemKt {
diff --git a/ui/ui-foundation/build.gradle b/ui/ui-foundation/build.gradle
index 330c8d8..e2568bd 100644
--- a/ui/ui-foundation/build.gradle
+++ b/ui/ui-foundation/build.gradle
@@ -37,6 +37,7 @@
implementation project(":compose:compose-runtime")
implementation project(":ui:ui-core")
+ implementation project(":ui:ui-animation")
implementation project(':ui:ui-framework')
implementation project(':ui:ui-layout')
implementation project(':ui:ui-text')
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/AnimatedDraggable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/AnimatedDraggable.kt
new file mode 100644
index 0000000..a429d5b
--- /dev/null
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/AnimatedDraggable.kt
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.foundation.gestures
+
+import androidx.animation.AnimatedFloat
+import androidx.animation.BaseAnimatedValue
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.compose.unaryPlus
+import androidx.ui.animation.animatedFloat
+import androidx.ui.core.PxPosition
+import androidx.ui.core.gesture.DragGestureDetector
+import androidx.ui.core.gesture.DragObserver
+import androidx.ui.core.px
+
+/**
+ * Component that provides drag, fling and animation logic for one [Float] value.
+ *
+ * The common usecase for this component is when you need to be able to drag/scroll something
+ * on the screen and also one or more of the following:
+ * 1. Fling support when scrolling/dragging ends with velocity.
+ * 2. Stable anchors points support for dragging value,
+ * e.g. be able to drag between only predefined set of values.
+ * 3. Automatic animation of draggable value, e.g emulate drag by click.
+ *
+ * @see [FlingConfig] to control anchors or fling intensity.
+ *
+ * This component provides high-level API and ownership for [AnimatedFloat]
+ * and returns it as a parameter for its children.
+ *
+ * If you need only drag support without animations, consider using [DragGestureDetector] instead.
+ *
+ * If you need only animations without gesture support, consider using [animatedFloat] instead.
+ *
+ * //TODO: Add sample
+ *
+ * @param dragDirection direction in which drag should be happening
+ * @param startValue value to set as initial for draggable/animating value in this component
+ * @param minValue lower bound for draggable/animating value in this component
+ * @param maxValue upper bound for draggable/animating value in this component
+ * Either [DragDirection.Vertical] or [DragDirection.Horizontal]
+ * @param flingConfig sets behavior of the fling after drag has ended.
+ * Default is null, which means no drag will occur no matter the velocity
+ */
+@Composable
+fun AnimatedDraggable(
+ dragDirection: DragDirection,
+ startValue: Float,
+ minValue: Float = Float.MIN_VALUE,
+ maxValue: Float = Float.MAX_VALUE,
+ flingConfig: FlingConfig? = null,
+ children: @Composable() (BaseAnimatedValue<Float>) -> Unit
+) {
+ val animFloat = (+animatedFloat(startValue)).apply {
+ setBounds(minValue, maxValue)
+ }
+ DragGestureDetector(
+ canDrag = { direction ->
+ dragDirection.isDraggableInDirection(direction, minValue, animFloat.value, maxValue)
+ },
+ dragObserver = object : DragObserver {
+
+ override fun onDrag(dragDistance: PxPosition): PxPosition {
+ val projected = dragDirection.project(dragDistance)
+ val newValue = (animFloat.value + projected).coerceIn(minValue, maxValue)
+ val consumed = newValue - animFloat.value
+ animFloat.snapTo(newValue)
+ val fractionConsumed = if (projected == 0f) 0f else consumed / projected
+ return PxPosition(
+ dragDirection.xProjection(dragDistance.x).px * fractionConsumed,
+ dragDirection.yProjection(dragDistance.y).px * fractionConsumed
+ )
+ }
+
+ override fun onStop(velocity: PxPosition) {
+ val projected = dragDirection.project(velocity)
+ flingConfig?.fling(animFloat, projected)
+ }
+ }
+ ) {
+ children(animFloat)
+ }
+}
+
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/DragDirection.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/DragDirection.kt
new file mode 100644
index 0000000..abd6b48
--- /dev/null
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/DragDirection.kt
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.foundation.gestures
+
+import androidx.ui.core.Direction
+import androidx.ui.core.Px
+import androidx.ui.core.PxPosition
+
+/**
+ * Draggable Direction specifies the direction in which you can drag an [AnimatedDraggable].
+ * It can be either [Horizontal] or [Vertical].
+ */
+sealed class DragDirection {
+
+ // TODO: remove internals for children when b/137357249 is ready
+ internal abstract val xProjection: (Px) -> Float
+ internal abstract val yProjection: (Px) -> Float
+ internal abstract val isDraggableInDirection: (
+ direction: Direction,
+ minValue: Float,
+ currentValue: Float,
+ maxValue: Float
+ ) -> Boolean
+
+ internal open fun project(pos: PxPosition) = xProjection(pos.x) + yProjection(pos.y)
+
+ /**
+ * Horizontal direction of dragging in [AnimatedDraggable].
+ */
+ object Horizontal : DragDirection() {
+ internal override val xProjection: (Px) -> Float = { it.value }
+ internal override val yProjection: (Px) -> Float = { 0f }
+ internal override val isDraggableInDirection: (
+ direction: Direction,
+ minValue: Float,
+ currentValue: Float,
+ maxValue: Float
+ ) -> Boolean =
+ { direction, minValue, currentValue, maxValue ->
+ when (direction) {
+ Direction.RIGHT -> currentValue <= maxValue
+ Direction.LEFT -> currentValue >= minValue
+ else -> false
+ }
+ }
+ }
+
+ /**
+ * Vertical direction of dragging in [AnimatedDraggable].
+ */
+ object Vertical : DragDirection() {
+ internal override val xProjection: (Px) -> Float = { 0f }
+ internal override val yProjection: (Px) -> Float = { it.value }
+ internal override val isDraggableInDirection: (
+ direction: Direction,
+ minValue: Float,
+ currentValue: Float,
+ maxValue: Float
+ ) -> Boolean =
+ { direction, minValue, currentValue, maxValue ->
+ when (direction) {
+ Direction.UP -> currentValue <= maxValue
+ Direction.DOWN -> currentValue >= minValue
+ else -> false
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/FlingConfig.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/FlingConfig.kt
new file mode 100644
index 0000000..f2b41be
--- /dev/null
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/gestures/FlingConfig.kt
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.foundation.gestures
+
+import androidx.animation.AnimatedFloat
+import androidx.animation.AnimationBuilder
+import androidx.animation.DecayAnimation
+import androidx.animation.ExponentialDecay
+import androidx.animation.PhysicsBuilder
+import androidx.animation.TargetAnimation
+import androidx.animation.fling
+import kotlin.math.abs
+
+/**
+ * Interface to specify fling behavior in [AnimatedDraggable].
+ *
+ * When drag has ended, this class specifies what to do given the velocity
+ * with which drag ended and AnimatedFloat instance to perform fling on and read current value.
+ *
+ * If you need natural fling support, use [DefaultFlingConfig] or
+ * [DecayFlingConfig] to control how much friction is applied to the fling
+ *
+ * If you want to only be able to drag/animate between predefined set of values,
+ * consider using [AnchorsFlingConfig].
+ *
+ */
+interface FlingConfig {
+ fun fling(value: AnimatedFloat, startVelocity: Float)
+}
+
+/**
+ * Fling config with anchors will make sure that after drag has ended,
+ * the value will be animated to one of the points from the predefined list.
+ *
+ * It takes velocity into account, though value will be animated to the closest
+ * point in provided list considering velocity.
+ *
+ * @see ExponentialDecay to understand when to pass your own decayAnimation.
+ *
+ * @param animationAnchors set of anchors to animate to
+ * @param onAnimationFinished callback to be invoked when animation value reaches desired anchor
+ * or fling being interrupted by gesture input.
+ * Consider the second boolean param "cancelled" to know what happened.
+ * @param animationBuilder animation which will be used for animations
+ * @param decayAnimation decay animation to be used to calculate closest point in the anchors set
+ * considering velocity.
+ */
+data class AnchorsFlingConfig(
+ val animationAnchors: List<Float>,
+ val onAnimationFinished: ((finishValue: Float, cancelled: Boolean) -> Unit)? = null,
+ val animationBuilder: AnimationBuilder<Float> = PhysicsBuilder(),
+ val decayAnimation: DecayAnimation = ExponentialDecay()
+) : FlingConfig {
+
+ private val adjust: (Float) -> TargetAnimation? = { target ->
+ val point = animationAnchors.minBy { abs(it - target) }
+ val adjusted = point ?: target
+ TargetAnimation(adjusted, animationBuilder)
+ }
+
+ override fun fling(
+ value: AnimatedFloat,
+ startVelocity: Float
+ ) {
+ value.fling(
+ startVelocity,
+ decayAnimation,
+ adjust,
+ onAnimationFinished?.let {
+ { cancelled: Boolean -> it.invoke(value.value, cancelled) }
+ }
+ )
+ }
+}
+
+/**
+ * Config that provides natural fling with customizable decay behavior
+ * e.g fling friction or velocity threshold. Natural fling config doesn't
+ * specify where this fling will end.
+ *
+ * The most common Decay animation is [ExponentialDecay].
+ *
+ * @param decayAnimation the animation to control fling behaviour
+ * @param onFlingFinished callback to be invoked when fling finishes by decay
+ * or being interrupted by gesture input.
+ * Consider second boolean param "cancelled" to know what happened.
+ * @param adjustTarget callback to be called at the start of fling
+ * so the final value for fling can be adjusted
+ */
+data class DecayFlingConfig(
+ val decayAnimation: DecayAnimation,
+ val onFlingFinished: ((finishValue: Float, cancelled: Boolean) -> Unit)? = null,
+ val adjustTarget: (Float) -> TargetAnimation? = { null }
+) : FlingConfig {
+ override fun fling(value: AnimatedFloat, startVelocity: Float) {
+ value.fling(
+ startVelocity,
+ decayAnimation,
+ adjustTarget = adjustTarget,
+ onFinished = onFlingFinished?.let {
+ { cancelled: Boolean -> it.invoke(value.value, cancelled) }
+ }
+ )
+ }
+}
+
+/**
+ * Default fling config sets decay animation to [ExponentialDecay] to provide natural fling
+ * and no calls no callback when fling finishes.
+ */
+object DefaultFlingConfig : FlingConfig {
+ override fun fling(value: AnimatedFloat, startVelocity: Float) {
+ value.fling(startVelocity, ExponentialDecay())
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-framework/api/1.0.0-alpha01.txt b/ui/ui-framework/api/1.0.0-alpha01.txt
index 17f828e..cdc7a78 100644
--- a/ui/ui-framework/api/1.0.0-alpha01.txt
+++ b/ui/ui-framework/api/1.0.0-alpha01.txt
@@ -34,7 +34,7 @@
public final class InputFieldKt {
ctor public InputFieldKt();
- method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> onEditorActionPerformed = {});
+ method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
}
public final class IntrinsicMeasurementsReceiver implements androidx.ui.core.DensityReceiver {
diff --git a/ui/ui-framework/api/current.txt b/ui/ui-framework/api/current.txt
index 17f828e..cdc7a78 100644
--- a/ui/ui-framework/api/current.txt
+++ b/ui/ui-framework/api/current.txt
@@ -34,7 +34,7 @@
public final class InputFieldKt {
ctor public InputFieldKt();
- method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> onEditorActionPerformed = {});
+ method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
}
public final class IntrinsicMeasurementsReceiver implements androidx.ui.core.DensityReceiver {
diff --git a/ui/ui-framework/api/restricted_1.0.0-alpha01.txt b/ui/ui-framework/api/restricted_1.0.0-alpha01.txt
index 17f828e..cdc7a78 100644
--- a/ui/ui-framework/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-framework/api/restricted_1.0.0-alpha01.txt
@@ -34,7 +34,7 @@
public final class InputFieldKt {
ctor public InputFieldKt();
- method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> onEditorActionPerformed = {});
+ method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
}
public final class IntrinsicMeasurementsReceiver implements androidx.ui.core.DensityReceiver {
diff --git a/ui/ui-framework/api/restricted_current.txt b/ui/ui-framework/api/restricted_current.txt
index 17f828e..cdc7a78 100644
--- a/ui/ui-framework/api/restricted_current.txt
+++ b/ui/ui-framework/api/restricted_current.txt
@@ -34,7 +34,7 @@
public final class InputFieldKt {
ctor public InputFieldKt();
- method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<java.lang.Object,kotlin.Unit> onEditorActionPerformed = {});
+ method public static void InputField(androidx.ui.input.EditorState value, androidx.ui.core.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorState,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {});
}
public final class IntrinsicMeasurementsReceiver implements androidx.ui.core.DensityReceiver {
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/InputField.kt b/ui/ui-framework/src/main/java/androidx/ui/core/InputField.kt
index 30ba992..068a21d 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/InputField.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/InputField.kt
@@ -29,6 +29,7 @@
import androidx.ui.graphics.Color
import androidx.ui.input.EditProcessor
import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
import androidx.ui.text.AnnotatedString
import androidx.ui.text.TextPainter
@@ -86,11 +87,20 @@
*/
keyboardType: KeyboardType = KeyboardType.Text,
+ /**
+ * The IME action
+ *
+ * This IME action is honored by IME and may show specific icons on the keyboard. For example,
+ * search icon may be shown if [ImeAction.Search] is specified. Then, when user tap that key,
+ * the [onImeActionPerformed] callback is called with specified ImeAction.
+ */
+ imeAction: ImeAction = ImeAction.Unspecified,
+
/** Called when the InputMethodService update the editor state */
onValueChange: (EditorState) -> Unit = {},
- /** Called when the InputMethod requested an editor action */
- onEditorActionPerformed: (Any) -> Unit = {} // TODO(nona): Define argument type
+ /** Called when the InputMethod requested an IME action */
+ onImeActionPerformed: (ImeAction) -> Unit = {} // TODO(nona): Define argument type
) {
// Ambients
val style = +ambient(CurrentTextStyleAmbient)
@@ -124,8 +134,9 @@
value,
processor,
keyboardType,
+ imeAction,
onValueChange,
- onEditorActionPerformed)
+ onImeActionPerformed)
},
onBlur = {
hasFocus.value = false
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/InputFieldDelegate.kt b/ui/ui-framework/src/main/java/androidx/ui/core/InputFieldDelegate.kt
index 115aa36..69c0452 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/InputFieldDelegate.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/InputFieldDelegate.kt
@@ -22,6 +22,7 @@
import androidx.ui.input.EditOperation
import androidx.ui.input.EditProcessor
import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
import androidx.ui.input.SetSelectionEditOp
import androidx.ui.input.TextInputService
@@ -102,7 +103,13 @@
return
}
- val bbox = textPainter.getBoundingBox(value.selection.end)
+ val bbox = if (value.selection.end < value.text.length) {
+ textPainter.getBoundingBox(value.selection.end)
+ } else if (value.selection.end != 0) {
+ textPainter.getBoundingBox(value.selection.end - 1)
+ } else {
+ Rect(0f, 0f, 0f, 0f)
+ }
val globalLT = layoutCoordinates.localToRoot(PxPosition(bbox.left.px, bbox.top.px))
textInputService.notifyFocusedRect(
@@ -187,14 +194,16 @@
value: EditorState,
editProcessor: EditProcessor,
keyboardType: KeyboardType,
+ imeAction: ImeAction,
onValueChange: (EditorState) -> Unit,
- onEditorActionPerformed: (Any) -> Unit
+ onImeActionPerformed: (ImeAction) -> Unit
) {
textInputService?.startInput(
initState = value,
keyboardType = keyboardType,
+ imeAction = imeAction,
onEditCommand = { onEditCommand(it, editProcessor, onValueChange) },
- onEditorActionPerformed = onEditorActionPerformed)
+ onImeActionPerformed = onImeActionPerformed)
}
/**
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
index 27c6d0f9..111d316 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Wrapper.kt
@@ -32,6 +32,8 @@
import androidx.compose.compositionReference
import androidx.compose.effectOf
import androidx.compose.memo
+import androidx.compose.onDispose
+import androidx.compose.onPreCommit
import androidx.compose.unaryPlus
import androidx.ui.core.text.AndroidFontResourceLoader
import androidx.ui.text.font.Font
@@ -63,6 +65,15 @@
Observe {
reference = +compositionReference()
cc?.recomposeSync()
+ +onPreCommit(true) {
+ onDispose {
+ rootRef.value?.let {
+ val layoutRootNode = it.root
+ val context = it.context
+ Compose.disposeComposition(layoutRootNode, context)
+ }
+ }
+ }
}
val rootLayoutNode = rootRef.value?.root ?: error("Failed to create root platform view")
val context = rootRef.value?.context ?: composer.composer.context
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/InputFieldDelegateTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/InputFieldDelegateTest.kt
index 9e2b312..8cb0b39 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/InputFieldDelegateTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/InputFieldDelegateTest.kt
@@ -22,6 +22,7 @@
import androidx.ui.input.EditOperation
import androidx.ui.input.EditProcessor
import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
import androidx.ui.input.SetSelectionEditOp
import androidx.ui.input.TextInputService
@@ -201,10 +202,11 @@
fun on_focus() {
val dummyEditorState = EditorState(text = "Hello, World", selection = TextRange(1, 1))
InputFieldDelegate.onFocus(textInputService, dummyEditorState, processor,
- KeyboardType.Text, onValueChange, onEditorActionPerformed)
+ KeyboardType.Text, ImeAction.Unspecified, onValueChange, onEditorActionPerformed)
verify(textInputService).startInput(
eq(dummyEditorState),
eq(KeyboardType.Text),
+ eq(ImeAction.Unspecified),
any(),
eq(onEditorActionPerformed)
)
@@ -243,4 +245,36 @@
false /* hasFocus */)
verify(textInputService, never()).notifyFocusedRect(any())
}
+
+ @Test
+ fun notify_rect_tail() {
+ val dummyRect = Rect(0f, 1f, 2f, 3f)
+ whenever(painter.getBoundingBox(any())).thenReturn(dummyRect)
+ val dummyPoint = PxPosition(5.px, 6.px)
+ whenever(layoutCoordinates.localToRoot(any())).thenReturn(dummyPoint)
+ val dummyEditorState = EditorState(text = "Hello, World", selection = TextRange(12, 12))
+ InputFieldDelegate.notifyFocusedRect(
+ dummyEditorState,
+ painter,
+ layoutCoordinates,
+ textInputService,
+ true /* hasFocus */)
+ verify(textInputService).notifyFocusedRect(any())
+ }
+
+ @Test
+ fun notify_rect_empty() {
+ val dummyRect = Rect(0f, 1f, 2f, 3f)
+ whenever(painter.getBoundingBox(any())).thenReturn(dummyRect)
+ val dummyPoint = PxPosition(5.px, 6.px)
+ whenever(layoutCoordinates.localToRoot(any())).thenReturn(dummyPoint)
+ val dummyEditorState = EditorState(text = "", selection = TextRange(0, 0))
+ InputFieldDelegate.notifyFocusedRect(
+ dummyEditorState,
+ painter,
+ layoutCoordinates,
+ textInputService,
+ true /* hasFocus */)
+ verify(textInputService).notifyFocusedRect(any())
+ }
}
diff --git a/ui/ui-layout/api/1.0.0-alpha01.txt b/ui/ui-layout/api/1.0.0-alpha01.txt
index 89fa1ed..122ce88 100644
--- a/ui/ui-layout/api/1.0.0-alpha01.txt
+++ b/ui/ui-layout/api/1.0.0-alpha01.txt
@@ -175,6 +175,15 @@
method public static void Stack(kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackChildren,kotlin.Unit> block);
}
+ public final class TableChildren {
+ method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
+ }
+
+ public final class TableKt {
+ ctor public TableKt();
+ method public static void Table(androidx.ui.layout.Alignment childAlignment = Alignment.TopLeft, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> block);
+ }
+
public final class WrapKt {
ctor public WrapKt();
method public static void Wrap(androidx.ui.layout.Alignment alignment = Alignment.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-layout/api/current.txt b/ui/ui-layout/api/current.txt
index 89fa1ed..122ce88 100644
--- a/ui/ui-layout/api/current.txt
+++ b/ui/ui-layout/api/current.txt
@@ -175,6 +175,15 @@
method public static void Stack(kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackChildren,kotlin.Unit> block);
}
+ public final class TableChildren {
+ method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
+ }
+
+ public final class TableKt {
+ ctor public TableKt();
+ method public static void Table(androidx.ui.layout.Alignment childAlignment = Alignment.TopLeft, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> block);
+ }
+
public final class WrapKt {
ctor public WrapKt();
method public static void Wrap(androidx.ui.layout.Alignment alignment = Alignment.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-layout/api/restricted_1.0.0-alpha01.txt b/ui/ui-layout/api/restricted_1.0.0-alpha01.txt
index 89fa1ed..122ce88 100644
--- a/ui/ui-layout/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-layout/api/restricted_1.0.0-alpha01.txt
@@ -175,6 +175,15 @@
method public static void Stack(kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackChildren,kotlin.Unit> block);
}
+ public final class TableChildren {
+ method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
+ }
+
+ public final class TableKt {
+ ctor public TableKt();
+ method public static void Table(androidx.ui.layout.Alignment childAlignment = Alignment.TopLeft, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> block);
+ }
+
public final class WrapKt {
ctor public WrapKt();
method public static void Wrap(androidx.ui.layout.Alignment alignment = Alignment.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-layout/api/restricted_current.txt b/ui/ui-layout/api/restricted_current.txt
index 89fa1ed..122ce88 100644
--- a/ui/ui-layout/api/restricted_current.txt
+++ b/ui/ui-layout/api/restricted_current.txt
@@ -175,6 +175,15 @@
method public static void Stack(kotlin.jvm.functions.Function1<? super androidx.ui.layout.StackChildren,kotlin.Unit> block);
}
+ public final class TableChildren {
+ method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
+ }
+
+ public final class TableKt {
+ ctor public TableKt();
+ method public static void Table(androidx.ui.layout.Alignment childAlignment = Alignment.TopLeft, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> block);
+ }
+
public final class WrapKt {
ctor public WrapKt();
method public static void Wrap(androidx.ui.layout.Alignment alignment = Alignment.TopLeft, kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml b/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
index d94c4f0..59cf792 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/AndroidManifest.xml
@@ -45,5 +45,14 @@
<category android:name="androidx.ui.demos.SAMPLE_CODE" />
</intent-filter>
</activity>
+
+ <activity android:name=".TableActivity"
+ android:configChanges="orientation|screenSize"
+ android:label="Layout/Table">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="androidx.ui.demos.SAMPLE_CODE" />
+ </intent-filter>
+ </activity>
</application>
</manifest>
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/TableActivity.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/TableActivity.kt
new file mode 100644
index 0000000..a3ca044
--- /dev/null
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/TableActivity.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.layout.demos
+
+import android.app.Activity
+import android.os.Bundle
+import androidx.compose.composer
+import androidx.compose.setContent
+import androidx.ui.core.CraneWrapper
+import androidx.ui.core.Text
+import androidx.ui.layout.Table
+
+class TableActivity : Activity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ CraneWrapper {
+ Table {
+ for (i in 0 until 5) {
+ tableRow {
+ for (j in 0 until 7) {
+ Text("$i, $j")
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt
new file mode 100644
index 0000000..7246f77
--- /dev/null
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.layout
+
+import androidx.compose.Children
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.Constraints
+import androidx.ui.core.IntPx
+import androidx.ui.core.IntPxSize
+import androidx.ui.core.Layout
+import androidx.ui.core.Measurable
+import androidx.ui.core.ParentData
+import androidx.ui.core.coerceIn
+import androidx.ui.core.isFinite
+import androidx.ui.core.max
+
+/**
+ * Collects information about the children of a [Table] when
+ * its body is executed with a [TableChildren] as argument.
+ */
+class TableChildren internal constructor() {
+
+ internal val tableChildren = mutableListOf<@Composable() () -> Unit>()
+ private var rowGroup = 0
+
+ fun tableRow(children: @Composable() () -> Unit) {
+ tableChildren += {
+ ParentData(data = TableChildData(rowGroup++), children = children)
+ }
+ }
+}
+
+/**
+ * Parent data associated with children to assign a row group.
+ */
+private data class TableChildData(val rowGroup: Int)
+
+private val Measurable.rowGroup get() = (parentData as TableChildData).rowGroup
+
+/**
+* Layout model that arranges its children into rows and columns.
+*/
+@Composable
+fun Table(
+ childAlignment: Alignment = Alignment.TopLeft,
+ @Children(composable = false) block: TableChildren.() -> Unit
+) {
+ val children: @Composable() () -> Unit = with(TableChildren()) {
+ apply(block)
+ val composable = @Composable {
+ tableChildren.forEach { it() }
+ }
+ composable
+ }
+
+ Layout(children) { measurables, constraints ->
+ // Group the measurables into rows using rowGroup.
+ val measurablesByRow = measurables.groupBy { it.rowGroup }.values
+
+ val rows = measurablesByRow.size
+ val columns = measurablesByRow.map { it.size }.max() ?: 0
+
+ require(rows > 0 && columns > 0)
+
+ // Get the preferred size of each measurable (with loose constraints).
+ val placeables = measurablesByRow.map { row -> row.map { it.measure(Constraints()) } }
+
+ // Calculate the height of each row and width of each column.
+ // TODO(calintat): Allow for different sizing strategies for rows/columns.
+ val rowHeights = placeables.map { row -> row.map { it.height }.max() }
+ val columnWidths = if (constraints.maxWidth.isFinite()) {
+ List(size = columns) { constraints.maxWidth / columns }
+ } else {
+ List(size = columns) { j -> placeables.map { row -> row[j].height }.max() }
+ }
+
+ // TODO(calintat): Figure out what to do when rowHeights.sum() exceeds max height constraint
+ val tableWidth = max(columnWidths.sum(), constraints.minWidth)
+ val tableHeight = rowHeights.sum().coerceIn(constraints.minHeight, constraints.maxHeight)
+
+ layout(tableWidth, tableHeight) {
+ placeables.forEachIndexed { i, row ->
+ row.forEachIndexed { j, placeable ->
+ val position = childAlignment.align(
+ IntPxSize(
+ width = columnWidths[j] - placeable.width,
+ height = rowHeights[i] - placeable.height
+ )
+ )
+ placeable.place(
+ x = columnWidths.take(j).sum() + position.x,
+ y = rowHeights.take(i).sum() + position.y
+ )
+ }
+ }
+ }
+ }
+}
+
+private fun Collection<IntPx>.sum() = this.fold(IntPx.Zero) { a, b -> a + b }
+private fun Collection<IntPx>.max() = this.fold(IntPx.Zero) { a, b -> max(a, b) }
diff --git a/ui/ui-material/api/1.0.0-alpha01.txt b/ui/ui-material/api/1.0.0-alpha01.txt
index e385709..17ead5a 100644
--- a/ui/ui-material/api/1.0.0-alpha01.txt
+++ b/ui/ui-material/api/1.0.0-alpha01.txt
@@ -3,16 +3,23 @@
public final class AppBarKt {
ctor public AppBarKt();
- method public static void AppBar(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- method public static void AppBarLeadingIcon();
- method public static void TopAppBar(String? title = null, androidx.ui.graphics.Color color = +themeColor({
+ method public static void AppBarIcon(androidx.ui.painting.Image icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+ method public static <T> void BottomAppBar(androidx.ui.graphics.Color color = +themeColor({
primary
-}), java.util.List<androidx.ui.core.Dp> icons = emptyList());
- method public static void TopAppBar(androidx.ui.graphics.Color color = +themeColor({
+}), kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, androidx.ui.material.BottomAppBar.FabPosition fabPosition = Center, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+ method public static <T> void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title = {}, androidx.ui.graphics.Color color = +themeColor({
primary
-}), kotlin.jvm.functions.Function0<kotlin.Unit> leadingIcon, kotlin.jvm.functions.Function0<kotlin.Unit> titleTextLabel, kotlin.jvm.functions.Function0<kotlin.Unit> trailingIcons);
- method public static void TopAppBarTitleTextLabel(String title);
- method public static void TopAppBarTrailingIcons(java.util.List<androidx.ui.core.Dp> icons);
+}), kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon = {}, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+ }
+
+ public final class BottomAppBar {
+ field public static final androidx.ui.material.BottomAppBar! INSTANCE;
+ }
+
+ public enum BottomAppBar.FabPosition {
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition Center;
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition CenterCut;
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition End;
}
public final class ButtonKt {
diff --git a/ui/ui-material/api/current.txt b/ui/ui-material/api/current.txt
index e385709..17ead5a 100644
--- a/ui/ui-material/api/current.txt
+++ b/ui/ui-material/api/current.txt
@@ -3,16 +3,23 @@
public final class AppBarKt {
ctor public AppBarKt();
- method public static void AppBar(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- method public static void AppBarLeadingIcon();
- method public static void TopAppBar(String? title = null, androidx.ui.graphics.Color color = +themeColor({
+ method public static void AppBarIcon(androidx.ui.painting.Image icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+ method public static <T> void BottomAppBar(androidx.ui.graphics.Color color = +themeColor({
primary
-}), java.util.List<androidx.ui.core.Dp> icons = emptyList());
- method public static void TopAppBar(androidx.ui.graphics.Color color = +themeColor({
+}), kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, androidx.ui.material.BottomAppBar.FabPosition fabPosition = Center, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+ method public static <T> void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title = {}, androidx.ui.graphics.Color color = +themeColor({
primary
-}), kotlin.jvm.functions.Function0<kotlin.Unit> leadingIcon, kotlin.jvm.functions.Function0<kotlin.Unit> titleTextLabel, kotlin.jvm.functions.Function0<kotlin.Unit> trailingIcons);
- method public static void TopAppBarTitleTextLabel(String title);
- method public static void TopAppBarTrailingIcons(java.util.List<androidx.ui.core.Dp> icons);
+}), kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon = {}, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+ }
+
+ public final class BottomAppBar {
+ field public static final androidx.ui.material.BottomAppBar! INSTANCE;
+ }
+
+ public enum BottomAppBar.FabPosition {
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition Center;
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition CenterCut;
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition End;
}
public final class ButtonKt {
diff --git a/ui/ui-material/api/restricted_1.0.0-alpha01.txt b/ui/ui-material/api/restricted_1.0.0-alpha01.txt
index e385709..17ead5a 100644
--- a/ui/ui-material/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-material/api/restricted_1.0.0-alpha01.txt
@@ -3,16 +3,23 @@
public final class AppBarKt {
ctor public AppBarKt();
- method public static void AppBar(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- method public static void AppBarLeadingIcon();
- method public static void TopAppBar(String? title = null, androidx.ui.graphics.Color color = +themeColor({
+ method public static void AppBarIcon(androidx.ui.painting.Image icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+ method public static <T> void BottomAppBar(androidx.ui.graphics.Color color = +themeColor({
primary
-}), java.util.List<androidx.ui.core.Dp> icons = emptyList());
- method public static void TopAppBar(androidx.ui.graphics.Color color = +themeColor({
+}), kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, androidx.ui.material.BottomAppBar.FabPosition fabPosition = Center, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+ method public static <T> void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title = {}, androidx.ui.graphics.Color color = +themeColor({
primary
-}), kotlin.jvm.functions.Function0<kotlin.Unit> leadingIcon, kotlin.jvm.functions.Function0<kotlin.Unit> titleTextLabel, kotlin.jvm.functions.Function0<kotlin.Unit> trailingIcons);
- method public static void TopAppBarTitleTextLabel(String title);
- method public static void TopAppBarTrailingIcons(java.util.List<androidx.ui.core.Dp> icons);
+}), kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon = {}, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+ }
+
+ public final class BottomAppBar {
+ field public static final androidx.ui.material.BottomAppBar! INSTANCE;
+ }
+
+ public enum BottomAppBar.FabPosition {
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition Center;
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition CenterCut;
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition End;
}
public final class ButtonKt {
diff --git a/ui/ui-material/api/restricted_current.txt b/ui/ui-material/api/restricted_current.txt
index e385709..17ead5a 100644
--- a/ui/ui-material/api/restricted_current.txt
+++ b/ui/ui-material/api/restricted_current.txt
@@ -3,16 +3,23 @@
public final class AppBarKt {
ctor public AppBarKt();
- method public static void AppBar(androidx.ui.graphics.Color color, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- method public static void AppBarLeadingIcon();
- method public static void TopAppBar(String? title = null, androidx.ui.graphics.Color color = +themeColor({
+ method public static void AppBarIcon(androidx.ui.painting.Image icon, kotlin.jvm.functions.Function0<kotlin.Unit> onClick);
+ method public static <T> void BottomAppBar(androidx.ui.graphics.Color color = +themeColor({
primary
-}), java.util.List<androidx.ui.core.Dp> icons = emptyList());
- method public static void TopAppBar(androidx.ui.graphics.Color color = +themeColor({
+}), kotlin.jvm.functions.Function0<kotlin.Unit>? navigationIcon = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, kotlin.jvm.functions.Function0<kotlin.Unit>? floatingActionButton = (kotlin.jvm.functions.Function0<? extends kotlin.Unit>)null, androidx.ui.material.BottomAppBar.FabPosition fabPosition = Center, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+ method public static <T> void TopAppBar(kotlin.jvm.functions.Function0<kotlin.Unit> title = {}, androidx.ui.graphics.Color color = +themeColor({
primary
-}), kotlin.jvm.functions.Function0<kotlin.Unit> leadingIcon, kotlin.jvm.functions.Function0<kotlin.Unit> titleTextLabel, kotlin.jvm.functions.Function0<kotlin.Unit> trailingIcons);
- method public static void TopAppBarTitleTextLabel(String title);
- method public static void TopAppBarTrailingIcons(java.util.List<androidx.ui.core.Dp> icons);
+}), kotlin.jvm.functions.Function0<kotlin.Unit> navigationIcon = {}, java.util.List<? extends T>? contextualActions = null, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> action = {});
+ }
+
+ public final class BottomAppBar {
+ field public static final androidx.ui.material.BottomAppBar! INSTANCE;
+ }
+
+ public enum BottomAppBar.FabPosition {
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition Center;
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition CenterCut;
+ enum_constant public static final androidx.ui.material.BottomAppBar.FabPosition End;
}
public final class ButtonKt {
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/AppBarActivity.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/AppBarActivity.kt
index 0efb2ba..bc7ec4d 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/AppBarActivity.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/ui/material/demos/AppBarActivity.kt
@@ -26,11 +26,15 @@
import androidx.ui.core.Text
import androidx.ui.core.dp
import androidx.ui.layout.Column
+import androidx.ui.layout.FlexColumn
import androidx.ui.layout.HeightSpacer
import androidx.ui.material.MaterialTheme
-import androidx.ui.material.TopAppBar
+import androidx.ui.material.samples.SimpleBottomAppBarCenterFab
+import androidx.ui.material.samples.SimpleBottomAppBarEndFab
+import androidx.ui.material.samples.SimpleBottomAppBarNoFab
+import androidx.ui.material.samples.SimpleTopAppBar
import androidx.ui.material.themeTextStyle
-import androidx.ui.graphics.Color
+import androidx.ui.painting.imageFromResource
class AppBarActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -38,25 +42,39 @@
setContent {
CraneWrapper {
MaterialTheme {
- AppBarDemo()
+ val favouriteImage = { imageFromResource(resources, R.drawable.ic_favorite) }
+ val navigationImage = { imageFromResource(resources, R.drawable.ic_menu) }
+ FlexColumn {
+ expanded(1f) {
+ Column {
+ SpacedText("TopAppBar")
+ HeightSpacer(height = 28.dp)
+ SimpleTopAppBar(favouriteImage, navigationImage)
+ }
+ Column {
+ SpacedText("BottomAppBar - No FAB")
+ HeightSpacer(height = 28.dp)
+ SimpleBottomAppBarNoFab(favouriteImage, navigationImage)
+ }
+ Column {
+ SpacedText("BottomAppBar - Center FAB")
+ SimpleBottomAppBarCenterFab(favouriteImage, navigationImage)
+ }
+ Column {
+ SpacedText("BottomAppBar - End FAB")
+ SimpleBottomAppBarEndFab(favouriteImage)
+ }
+ }
+ }
}
}
}
}
-}
-@Composable
-fun AppBarDemo() {
- Column {
- TopAppBar(title = "Default")
- HeightSpacer(height = 24.dp)
- TopAppBar(title = "Custom color", color = Color(0xFFE91E63.toInt()))
- HeightSpacer(height = 24.dp)
- TopAppBar(title = "Custom icons", icons = listOf(24.dp, 24.dp))
+ @Composable
+ private fun SpacedText(text: String) {
HeightSpacer(height = 12.dp)
- Text(text = "No title", style = +themeTextStyle { h6 })
- TopAppBar(icons = listOf(24.dp, 24.dp))
- HeightSpacer(height = 24.dp)
- TopAppBar(title = "Too many icons", icons = listOf(24.dp, 24.dp, 24.dp, 24.dp))
+ Text(text, style = +themeTextStyle { h6 })
+ HeightSpacer(height = 12.dp)
}
-}
\ No newline at end of file
+}
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-hdpi/ic_menu.png b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-hdpi/ic_menu.png
new file mode 100644
index 0000000..ba90d6d
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-hdpi/ic_menu.png
Binary files differ
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-mdpi/ic_menu.png b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-mdpi/ic_menu.png
new file mode 100644
index 0000000..05e063c
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-mdpi/ic_menu.png
Binary files differ
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xhdpi/ic_menu.png b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xhdpi/ic_menu.png
new file mode 100644
index 0000000..ad9bab1
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xhdpi/ic_menu.png
Binary files differ
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xxhdpi/ic_menu.png b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xxhdpi/ic_menu.png
new file mode 100644
index 0000000..c43059e
--- /dev/null
+++ b/ui/ui-material/integration-tests/material-demos/src/main/res/drawable-xxhdpi/ic_menu.png
Binary files differ
diff --git a/ui/ui-material/integration-tests/samples/src/main/java/androidx/ui/material/samples/AppBarSamples.kt b/ui/ui-material/integration-tests/samples/src/main/java/androidx/ui/material/samples/AppBarSamples.kt
new file mode 100644
index 0000000..369ca53
--- /dev/null
+++ b/ui/ui-material/integration-tests/samples/src/main/java/androidx/ui/material/samples/AppBarSamples.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.Text
+import androidx.ui.graphics.Color
+import androidx.ui.material.AppBarIcon
+import androidx.ui.material.BottomAppBar
+import androidx.ui.material.FloatingActionButton
+import androidx.ui.material.TopAppBar
+import androidx.ui.painting.Image
+
+@Suppress("UNUSED_VARIABLE")
+@Sampled
+@Composable
+fun SimpleTopAppBar(getMyActionImage: () -> Image, getMyNavigationImage: () -> Image) {
+ val someActionImage: Image = getMyActionImage()
+ val someNavigationImage: Image = getMyNavigationImage()
+
+ val navigationIcon: @Composable() () -> Unit = {
+ AppBarIcon(someNavigationImage) { /* doSomething()*/ }
+ }
+ val contextualActions = listOf("Action 1" to someActionImage, "action 2" to someActionImage)
+
+ TopAppBar(
+ title = { Text("Simple TopAppBar") },
+ navigationIcon = navigationIcon,
+ contextualActions = contextualActions
+ ) { actionData ->
+ val (actionTitle, actionImage) = actionData
+ AppBarIcon(actionImage) { /* doSomething()*/ }
+ }
+}
+
+@Suppress("UNUSED_VARIABLE")
+@Sampled
+@Composable
+fun SimpleBottomAppBarNoFab(getMyActionImage: () -> Image, getMyNavigationImage: () -> Image) {
+ val someActionImage: Image = getMyActionImage()
+ val someNavigationImage: Image = getMyNavigationImage()
+
+ val navigationIcon: @Composable() () -> Unit = {
+ AppBarIcon(someNavigationImage) { /* doSomething()*/ }
+ }
+ val contextualActions = listOf("Action 1" to someActionImage, "action 2" to someActionImage)
+
+ BottomAppBar(
+ navigationIcon = navigationIcon,
+ contextualActions = contextualActions
+ ) { actionData ->
+ val (actionTitle, actionImage) = actionData
+ AppBarIcon(actionImage) { /* doSomething()*/ }
+ }
+}
+
+@Suppress("UNUSED_VARIABLE")
+@Sampled
+@Composable
+fun SimpleBottomAppBarCenterFab(getMyActionImage: () -> Image, getMyNavigationImage: () -> Image) {
+ val someActionImage: Image = getMyActionImage()
+ val someNavigationImage: Image = getMyNavigationImage()
+
+ val navigationIcon: @Composable() () -> Unit = {
+ AppBarIcon(someNavigationImage) { /* doSomething()*/ }
+ }
+ val contextualActions = listOf("Action 1" to someActionImage, "action 2" to someActionImage)
+
+ BottomAppBar(
+ navigationIcon = navigationIcon,
+ floatingActionButton = {
+ FloatingActionButton(
+ color = Color.Black,
+ icon = someActionImage,
+ onClick = { /** doSomething() */ })
+ },
+ fabPosition = BottomAppBar.FabPosition.Center,
+ contextualActions = contextualActions
+ ) { actionData ->
+ val (actionTitle, actionImage) = actionData
+ AppBarIcon(actionImage) { /* doSomething()*/ }
+ }
+}
+
+@Suppress("UNUSED_VARIABLE")
+@Sampled
+@Composable
+fun SimpleBottomAppBarEndFab(getMyActionImage: () -> Image) {
+ val someActionImage: Image = getMyActionImage()
+ val contextualActions = listOf("Action 1" to someActionImage, "action 2" to someActionImage)
+
+ BottomAppBar(
+ floatingActionButton = {
+ FloatingActionButton(
+ color = Color.Black,
+ icon = someActionImage,
+ onClick = { /** doSomething() */ })
+ },
+ fabPosition = BottomAppBar.FabPosition.End,
+ contextualActions = contextualActions
+ ) { actionData ->
+ val (actionTitle, actionImage) = actionData
+ AppBarIcon(actionImage) { /* doSomething()*/ }
+ }
+}
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt
new file mode 100644
index 0000000..e33ff72
--- /dev/null
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/AppBarTest.kt
@@ -0,0 +1,397 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.material
+
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.test.filters.SmallTest
+import androidx.ui.core.dp
+import androidx.ui.core.withDensity
+import androidx.ui.layout.Container
+import com.google.common.truth.Truth
+import androidx.compose.unaryPlus
+import androidx.ui.core.LayoutCoordinates
+import androidx.ui.core.OnChildPositioned
+import androidx.ui.core.PxPosition
+import androidx.ui.core.Semantics
+import androidx.ui.core.Text
+import androidx.ui.core.currentTextStyle
+import androidx.ui.core.ipx
+import androidx.ui.core.toPx
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.graphics.Color
+import androidx.ui.text.TextStyle
+import androidx.ui.test.assertCountEquals
+import androidx.ui.test.assertIsVisible
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.findAll
+import androidx.ui.test.findByText
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+// TODO: remove when tests are uncommented
+@Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
+@SmallTest
+@RunWith(JUnit4::class)
+class AppBarTest {
+
+ @get:Rule
+ val composeTestRule = createComposeRule()
+
+ private val appBarHeight = 56.dp
+
+ @Test
+ fun topAppBar_expandsToScreen() {
+ val dm = composeTestRule.displayMetrics
+ composeTestRule
+ .setMaterialContentAndTestSizes {
+ TopAppBar<Nothing>()
+ }
+ .assertHeightEqualsTo(appBarHeight)
+ .assertWidthEqualsTo { dm.widthPixels.ipx }
+ }
+
+ @Test
+ fun topAppBar_withTitle() {
+ val title = "Title"
+ composeTestRule.setMaterialContent {
+ TopAppBar<Nothing>(title = { Text(title) })
+ }
+ findByText(title).assertIsVisible()
+ }
+
+ @Test
+ fun topAppBar_defaultPositioning() {
+ var appBarCoords: LayoutCoordinates? = null
+ var navigationIconCoords: LayoutCoordinates? = null
+ var titleCoords: LayoutCoordinates? = null
+ var actionCoords: LayoutCoordinates? = null
+ composeTestRule.setMaterialContent {
+ Container {
+ OnChildPositioned(onPositioned = { coords ->
+ appBarCoords = coords
+ }) {
+ TopAppBar(
+ navigationIcon = {
+ OnChildPositioned(onPositioned = { coords ->
+ navigationIconCoords = coords
+ }) {
+ FakeIcon()
+ }
+ },
+ title = {
+ OnChildPositioned(onPositioned = { coords ->
+ titleCoords = coords
+ }) {
+ Text("title")
+ }
+ },
+ contextualActions = createImageList(1),
+ action = {
+ OnChildPositioned(onPositioned = { coords ->
+ actionCoords = coords
+ }) { it() }
+ }
+ )
+ }
+ }
+ }
+
+ withDensity(composeTestRule.density) {
+ // Navigation icon should be at the beginning
+ val navigationIconPositionX = navigationIconCoords!!.localToGlobal(PxPosition.Origin).x
+ val navigationIconExpectedPositionX = 16.dp.toIntPx().toPx()
+ Truth.assertThat(navigationIconPositionX).isEqualTo(navigationIconExpectedPositionX)
+
+ // Title should be next
+ val titlePositionX = titleCoords!!.localToGlobal(PxPosition.Origin).x
+ val titleExpectedPositionX =
+ navigationIconPositionX + navigationIconCoords!!.size.width + 32.dp.toIntPx()
+ Truth.assertThat(titlePositionX).isEqualTo(titleExpectedPositionX)
+
+ // Action should be placed at the end
+ val actionPositionX = actionCoords!!.localToGlobal(PxPosition.Origin).x
+ val actionExpectedPositionX =
+ appBarCoords!!.size.width - 16.dp.toIntPx() - 24.dp.toIntPx()
+ Truth.assertThat(actionPositionX).isEqualTo(actionExpectedPositionX)
+ }
+ }
+
+ @Test
+ fun topAppBar_oneAction() {
+ val tag = "action"
+ val numberOfActions = 1
+ composeTestRule.setMaterialContent {
+ Container {
+ TopAppBar(
+ contextualActions = createImageList(numberOfActions),
+ action = { action ->
+ Semantics(testTag = tag) { action() }
+ }
+ )
+ }
+ }
+
+ findAll { testTag == tag }.assertCountEquals(numberOfActions)
+ }
+
+ @Test
+ fun topAppBar_fiveActions_onlyTwoShouldBeVisible() {
+ val tag = "action"
+ val numberOfActions = 5
+ val maxNumberOfActions = 2
+ composeTestRule.setMaterialContent {
+ Container {
+ TopAppBar(
+ contextualActions = createImageList(numberOfActions),
+ action = { action ->
+ Semantics(testTag = tag) { action() }
+ }
+ )
+ }
+ }
+
+ findAll { testTag == tag }.assertCountEquals(maxNumberOfActions)
+ }
+
+ @Test
+ fun topAppBar_titleDefaultStyle() {
+ var textStyle: TextStyle? = null
+ var h6Style: TextStyle? = null
+ composeTestRule.setMaterialContent {
+ Container {
+ TopAppBar<Nothing>(
+ title = {
+ textStyle = +currentTextStyle()
+ h6Style = +themeTextStyle { h6 }
+ }
+ )
+ }
+ }
+ Truth.assertThat(textStyle!!.fontSize).isEqualTo(h6Style!!.fontSize)
+ Truth.assertThat(textStyle!!.fontFamily).isEqualTo(h6Style!!.fontFamily)
+ }
+
+ @Test
+ fun bottomAppBar_expandsToScreen() {
+ val dm = composeTestRule.displayMetrics
+ composeTestRule
+ .setMaterialContentAndTestSizes {
+ BottomAppBar<Nothing>()
+ }
+ .assertHeightEqualsTo(appBarHeight)
+ .assertWidthEqualsTo { dm.widthPixels.ipx }
+ }
+
+ @Test
+ fun bottomAppBar_noFab_positioning() {
+ var appBarCoords: LayoutCoordinates? = null
+ var navigationIconCoords: LayoutCoordinates? = null
+ var actionCoords: LayoutCoordinates? = null
+ composeTestRule.setMaterialContent {
+ Container {
+ OnChildPositioned(onPositioned = { coords ->
+ appBarCoords = coords
+ }) {
+ BottomAppBar(
+ navigationIcon = {
+ OnChildPositioned(onPositioned = { coords ->
+ navigationIconCoords = coords
+ }) {
+ FakeIcon()
+ }
+ },
+ contextualActions = createImageList(1),
+ action = {
+ OnChildPositioned(onPositioned = { coords ->
+ actionCoords = coords
+ }) { it() }
+ }
+ )
+ }
+ }
+ }
+
+ withDensity(composeTestRule.density) {
+ // Navigation icon should be at the beginning
+ val navigationIconPositionX = navigationIconCoords!!.localToGlobal(PxPosition.Origin).x
+ val navigationIconExpectedPositionX = 16.dp.toIntPx().toPx()
+ Truth.assertThat(navigationIconPositionX).isEqualTo(navigationIconExpectedPositionX)
+
+ // TODO: layout rounding issues here depending on the density of the device
+ /*
+ // Action should be placed at the end
+ val actionPositionX = actionCoords!!.localToGlobal(PxPosition.Origin).x
+ val actionExpectedPositionX = appBarCoords!!.size.width.round().toPx() -
+ 16.dp.toIntPx().toPx() - 24.dp.toIntPx().toPx()
+ Truth.assertThat(actionPositionX).isEqualTo(actionExpectedPositionX)
+ */
+ }
+ }
+
+ @Test
+ fun bottomAppBar_centerFab_positioning() {
+ var appBarCoords: LayoutCoordinates? = null
+ var navigationIconCoords: LayoutCoordinates? = null
+ var fabCoords: LayoutCoordinates? = null
+ var actionCoords: LayoutCoordinates? = null
+ composeTestRule.setMaterialContent {
+ Container {
+ OnChildPositioned(onPositioned = { coords ->
+ appBarCoords = coords
+ }) {
+ BottomAppBar(
+ navigationIcon = {
+ OnChildPositioned(onPositioned = { coords ->
+ navigationIconCoords = coords
+ }) {
+ FakeIcon()
+ }
+ },
+ floatingActionButton = {
+ OnChildPositioned(onPositioned = { coords ->
+ fabCoords = coords
+ }) {
+ FakeIcon()
+ }
+ },
+ contextualActions = createImageList(1),
+ action = {
+ OnChildPositioned(onPositioned = { coords ->
+ actionCoords = coords
+ }) { it() }
+ }
+ )
+ }
+ }
+ }
+
+ withDensity(composeTestRule.density) {
+ // Navigation icon should be at the beginning
+ val navigationIconPositionX = navigationIconCoords!!.localToGlobal(PxPosition.Origin).x
+ val navigationIconExpectedPositionX = 16.dp.toIntPx().toPx()
+ Truth.assertThat(navigationIconPositionX).isEqualTo(navigationIconExpectedPositionX)
+
+ // TODO: layout rounding issues here depending on the density of the device
+ /*
+ // FAB should be placed in the center
+ val fabPositionX = fabCoords!!.localToGlobal(PxPosition.Origin).x
+ val fabExpectedPositionX = (appBarCoords!!.size.width / 2) - 12.dp.toIntPx()
+ Truth.assertThat(fabPositionX).isEqualTo(fabExpectedPositionX)
+
+ // Action should be placed at the end
+ val actionPositionX = actionCoords!!.localToGlobal(PxPosition.Origin).x
+ val actionExpectedPositionX = appBarCoords!!.size.width.round().toPx() -
+ 16.dp.toIntPx().toPx() - 24.dp.toIntPx().toPx()
+ Truth.assertThat(actionPositionX).isEqualTo(actionExpectedPositionX)
+ */
+ }
+ }
+
+ @Test
+ fun bottomAppBar_endFab_positioning() {
+ var appBarCoords: LayoutCoordinates? = null
+ var fabCoords: LayoutCoordinates? = null
+ var actionCoords: LayoutCoordinates? = null
+ composeTestRule.setMaterialContent {
+ Container {
+ OnChildPositioned(onPositioned = { coords ->
+ appBarCoords = coords
+ }) {
+ BottomAppBar(
+ floatingActionButton = {
+ OnChildPositioned(onPositioned = { coords ->
+ fabCoords = coords
+ }) {
+ FakeIcon()
+ }
+ },
+ fabPosition = BottomAppBar.FabPosition.End,
+ contextualActions = createImageList(1),
+ action = {
+ OnChildPositioned(onPositioned = { coords ->
+ actionCoords = coords
+ }) { it() }
+ }
+ )
+ }
+ }
+ }
+
+ withDensity(composeTestRule.density) {
+ // Action should be placed at the start
+ val actionPositionX = actionCoords!!.localToGlobal(PxPosition.Origin).x
+ val actionExpectedPositionX = 16.dp.toIntPx().toPx()
+ Truth.assertThat(actionPositionX).isEqualTo(actionExpectedPositionX)
+
+ // TODO: layout rounding issues here depending on the density of the device
+ /*
+ // FAB should be placed at the end
+ val fabPositionX = fabCoords!!.localToGlobal(PxPosition.Origin).x
+ val fabExpectedPositionX = appBarCoords!!.size.width.round().toPx() -
+ 16.dp.toIntPx().toPx() - 24.dp.toIntPx().toPx()
+ Truth.assertThat(fabPositionX).isEqualTo(fabExpectedPositionX)
+ */
+ }
+ }
+
+ @Test
+ fun bottomAppBar_oneAction() {
+ val tag = "action"
+ val numberOfActions = 1
+ composeTestRule.setMaterialContent {
+ Container {
+ BottomAppBar(
+ contextualActions = createImageList(numberOfActions),
+ action = { action ->
+ Semantics(testTag = tag) { action() }
+ }
+ )
+ }
+ }
+
+ findAll { testTag == tag }.assertCountEquals(numberOfActions)
+ }
+
+ @Test
+ fun bottomAppBar_fiveActions_onlyFourShouldBeVisible() {
+ val tag = "action"
+ val numberOfActions = 5
+ val maxNumberOfActions = 4
+ composeTestRule.setMaterialContent {
+ Container {
+ BottomAppBar(
+ contextualActions = createImageList(numberOfActions),
+ action = { action ->
+ Semantics(testTag = tag) { action() }
+ }
+ )
+ }
+ }
+
+ findAll { testTag == tag }.assertCountEquals(maxNumberOfActions)
+ }
+
+ private fun createImageList(count: Int) =
+ List<@Composable() () -> Unit>(count) { { FakeIcon() } }
+
+ // Render a red rectangle to simulate an icon
+ @Composable
+ private fun FakeIcon() = ColoredRect(Color.Red, 24.dp, 24.dp)
+}
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/TopAppBarUiTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/TopAppBarUiTest.kt
deleted file mode 100644
index 66e3c40..0000000
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/TopAppBarUiTest.kt
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.ui.material
-
-import androidx.test.filters.SmallTest
-import androidx.ui.core.OnChildPositioned
-import androidx.ui.core.dp
-import androidx.ui.core.round
-import androidx.ui.core.withDensity
-import androidx.ui.layout.Container
-import com.google.common.truth.Truth
-import androidx.compose.composer
-import androidx.compose.unaryPlus
-import androidx.ui.core.LayoutCoordinates
-import androidx.ui.core.currentTextStyle
-import androidx.ui.core.ipx
-import androidx.ui.text.TextStyle
-import androidx.ui.test.assertCountEquals
-import androidx.ui.test.assertDoesNotExist
-import androidx.ui.test.assertIsVisible
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.findAll
-import androidx.ui.test.findByTag
-import androidx.ui.test.findByText
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@SmallTest
-@RunWith(JUnit4::class)
-class TopAppBarUiTest {
-
- @get:Rule
- val composeTestRule = createComposeRule()
-
- private val defaultHeight = 56.dp
-
- @Test
- fun topAppBarTest_ExpandsToScreen() {
- val dm = composeTestRule.displayMetrics
- composeTestRule
- .setMaterialContentAndTestSizes {
- TopAppBar()
- }
- .assertHeightEqualsTo(defaultHeight)
- .assertWidthEqualsTo { dm.widthPixels.ipx }
- }
-
- @Test
- fun topAppBarTest_LeadingIconPresent() {
- composeTestRule.setMaterialContent {
- TopAppBar()
- }
- findByTag("Leading icon").assertIsVisible()
- }
-
- @Test
- fun topAppBarTest_TitleTextLabel_noTitle() {
- composeTestRule.setMaterialContent {
- TopAppBar()
- }
- assertDoesNotExist { testTag == "Title" }
- }
-
- @Test
- fun topAppBarTest_TitleTextLabel_withTitle() {
- val title = "Title"
- composeTestRule.setMaterialContent {
- TopAppBar(title = title)
- }
- findByText(title).assertIsVisible()
- }
-
- @Test
- fun topAppBar_defaultPositioning() {
- var leadingIconInfo: LayoutCoordinates? = null
- var titleLabelInfo: LayoutCoordinates? = null
- var trailingIconInfo: LayoutCoordinates? = null
- composeTestRule.setMaterialContent {
- Container {
- TopAppBar(
- leadingIcon = {
- OnChildPositioned(onPositioned = { position ->
- leadingIconInfo = position
- }) {
- AppBarLeadingIcon()
- }
- },
- titleTextLabel = {
- OnChildPositioned(onPositioned = { position ->
- titleLabelInfo = position
- }) {
- TopAppBarTitleTextLabel("title")
- }
- },
- trailingIcons = {
- OnChildPositioned(onPositioned = { position ->
- trailingIconInfo = position
- }) {
- TopAppBarTrailingIcons(listOf(24.dp, 24.dp))
- }
- }
- )
- }
- }
-
- withDensity(composeTestRule.density) {
- val dm = composeTestRule.displayMetrics
-
- // Leading icon should be in the front
- val leadingIconPositionX = leadingIconInfo?.position?.x!!.value
- val leadingIconExpectedPositionX = 0f
- Truth.assertThat(leadingIconPositionX).isEqualTo(leadingIconExpectedPositionX)
-
- // Title should be next
- val titleLabelPositionX = titleLabelInfo?.position?.x!!
- val titleLabelExpectedPositionX = leadingIconInfo?.size?.width!! + 32.dp.toIntPx()
- Truth.assertThat(titleLabelPositionX).isEqualTo(titleLabelExpectedPositionX)
-
- // Trailing icons should be in the second half of the screen
- val trailingIconPositionX = trailingIconInfo?.position?.x!!
- val totalSpaceMiddle = dm.widthPixels / 2f
- Truth.assertThat(trailingIconPositionX.value).isGreaterThan(totalSpaceMiddle)
- }
- }
-
- @Test
- fun topAppBar_noTitlePositioning() {
- var leadingIconInfo: LayoutCoordinates? = null
- var trailingIconInfo: LayoutCoordinates? = null
- composeTestRule.setMaterialContent {
- Container {
- TopAppBar(
- leadingIcon = {
- OnChildPositioned(onPositioned = { position ->
- leadingIconInfo = position
- }) {
- AppBarLeadingIcon()
- }
- },
- titleTextLabel = {},
- trailingIcons = {
- OnChildPositioned(onPositioned = { position ->
- trailingIconInfo = position
- }) {
- TopAppBarTrailingIcons(listOf(24.dp, 24.dp))
- }
- }
- )
- }
- }
-
- withDensity(composeTestRule.density) {
- val dm = composeTestRule.displayMetrics
-
- // Leading icon should be in the front
- val leadingIconPositionX = leadingIconInfo?.position?.x!!.value
- val leadingIconExpectedPositionX = 0f
- Truth.assertThat(leadingIconPositionX).isEqualTo(leadingIconExpectedPositionX)
-
- // Trailing icons should be in the second half of the screen
- val trailingIconPositionX = trailingIconInfo?.position?.x!!
- val totalSpaceMiddle = dm.widthPixels / 2f
- Truth.assertThat(trailingIconPositionX.value).isGreaterThan(totalSpaceMiddle)
- }
- }
-
- @Test
- fun topAppBar_titleDefaultStyle() {
- var textStyle: TextStyle? = null
- var h6Style: TextStyle? = null
- composeTestRule.setMaterialContent {
- Container {
- TopAppBar(
- leadingIcon = {},
- titleTextLabel = {
- textStyle = +currentTextStyle()
- h6Style = +themeTextStyle { h6 }
- },
- trailingIcons = {}
- )
- }
- }
- Truth.assertThat(textStyle!!.fontSize).isEqualTo(h6Style!!.fontSize)
- Truth.assertThat(textStyle!!.fontFamily).isEqualTo(h6Style!!.fontFamily)
- }
-
- @Test
- fun topAppBarTrailingIcons_noIcons() {
- var trailingIconInfo: LayoutCoordinates? = null
- composeTestRule.setMaterialContent {
- Container {
- OnChildPositioned(onPositioned = { position ->
- trailingIconInfo = position
- }) {
- TopAppBarTrailingIcons(emptyList())
- }
- }
- }
- assertDoesNotExist { testTag == "Trailing icon" }
-
- withDensity(composeTestRule.density) {
- val trailingIconWidth = trailingIconInfo?.size?.width?.round()
- Truth.assertThat(trailingIconWidth).isNull()
- }
- }
-
- @Test
- fun topAppBarTrailingIcons_oneIcon() {
- composeTestRule
- .setMaterialContentAndTestSizes {
- TopAppBarTrailingIcons(icons = listOf(24.dp))
- }
- .assertWidthEqualsTo { 24.dp.toIntPx() + 24.dp.toIntPx() }
-
- findByTag("Trailing icon").assertIsVisible()
- assertDoesNotExist { testTag == "Overflow icon" }
- }
-
- @Test
- fun topAppBarTrailingIcons_twoIcons() {
-
- composeTestRule.setMaterialContentAndTestSizes {
- TopAppBarTrailingIcons(icons = listOf(24.dp, 24.dp))
- }.assertWidthEqualsTo { (24.dp.toIntPx() * 2) + (24.dp.toIntPx() * 2) }
-
- findAll { testTag == "Trailing icon" }.apply {
- forEach {
- it.assertIsVisible()
- }
- }.assertCountEquals(2)
- assertDoesNotExist { testTag == "Overflow icon" }
- }
-
- @Test
- fun topAppBarTrailingIcons_threeIcons() {
- composeTestRule
- .setMaterialContentAndTestSizes {
- TopAppBarTrailingIcons(icons = listOf(24.dp, 24.dp, 24.dp))
- }
- .assertWidthEqualsTo { 24.dp.toIntPx() * 2 + 24.dp.toIntPx() * 3 + 12.dp.toIntPx() }
- // icons and spacers + 12.dp overflow
-
- findAll { testTag == "Trailing icon" }.apply {
- forEach {
- it.assertIsVisible()
- }
- }.assertCountEquals(2)
- findByTag("Overflow icon").assertIsVisible()
- }
-}
\ No newline at end of file
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt b/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
index ecb7dde..3996bd3 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/AppBar.kt
@@ -16,16 +16,16 @@
package androidx.ui.material
-import androidx.compose.Children
import androidx.compose.Composable
import androidx.compose.composer
import androidx.compose.unaryPlus
import androidx.ui.core.CurrentTextStyleProvider
-import androidx.ui.core.Dp
import androidx.ui.core.Semantics
import androidx.ui.core.Text
import androidx.ui.core.dp
-import androidx.ui.foundation.ColoredRect
+import androidx.ui.core.sp
+import androidx.ui.foundation.Clickable
+import androidx.ui.foundation.SimpleImage
import androidx.ui.layout.Container
import androidx.ui.layout.FlexRow
import androidx.ui.layout.MainAxisAlignment
@@ -33,90 +33,257 @@
import androidx.ui.layout.WidthSpacer
import androidx.ui.material.surface.Surface
import androidx.ui.graphics.Color
+import androidx.ui.layout.Align
+import androidx.ui.layout.Alignment
+import androidx.ui.layout.Center
+import androidx.ui.layout.ConstrainedBox
+import androidx.ui.layout.DpConstraints
import androidx.ui.layout.EdgeInsets
-import androidx.ui.layout.FlexSize
+import androidx.ui.layout.Stack
+import androidx.ui.material.BottomAppBar.FabPosition
+import androidx.ui.material.BottomAppBar.FabPosition.Center
+import androidx.ui.material.BottomAppBar.FabPosition.End
+import androidx.ui.material.ripple.Ripple
+import androidx.ui.painting.Image
+import androidx.ui.text.TextStyle
/**
- * A Top App Bar displays information and actions relating to the current screen and is placed at
- * the top of the screen.
- * This version of the TopAppBar will produce a default bar with a navigation leading icon, an
- * optional title and a set of menu icons.
+ * A TopAppBar displays information and actions relating to the current screen and is placed at the
+ * top of the screen.
*
- * Example usage:
- * TopAppBar(
- * title = "Title",
- * color = +themeColor{ secondary }
- * )
+ * @sample androidx.ui.material.samples.SimpleTopAppBar
*
- * @param title An optional title to display
- * @param color An optional color for the App Bar. By default [MaterialColors.primary] will be used.
- * @param icons An optional list of icons to display on the App Bar.
+ * @param title The title to be displayed in the center of the TopAppBar
+ * @param color An optional color for the TopAppBar. By default [MaterialColors.primary] will be
+ * used.
+ * @param navigationIcon The navigation icon displayed at the start of the TopAppBar
+ * @param contextualActions A list representing the contextual actions to be displayed at the end of
+ * the TopAppBar. Any remaining actions that do not fit on the TopAppBar should typically be
+ * displayed in an overflow menu at the end.
+ * @param action A specific item action to be displayed at the end of the TopAppBar - this will be
+ * called for items in [contextualActions] up to the maximum number of icons that can be displayed.
+ * @param T the type of item in [contextualActions]
*/
@Composable
-fun TopAppBar(
- title: String? = null,
+fun <T> TopAppBar(
+ title: @Composable() () -> Unit = {},
color: Color = +themeColor { primary },
- // TODO: work on menus
- icons: List<Dp> = emptyList()
+ navigationIcon: @Composable() () -> Unit = {},
+ contextualActions: List<T>? = null,
+ action: @Composable() (T) -> Unit = {}
+ // TODO: support overflow menu here with the remainder of the list
) {
- TopAppBar(
+ BaseTopAppBar(
color = color,
- leadingIcon = { AppBarLeadingIcon() },
- titleTextLabel = {
- if (title != null) {
- TopAppBarTitleTextLabel(title)
+ startContent = navigationIcon,
+ title = title,
+ endContent = {
+ if (contextualActions != null) {
+ AppBarActions(MaxIconsInTopAppBar, contextualActions, action)
}
- },
- trailingIcons = { TopAppBarTrailingIcons(icons) }
+ }
)
}
-/**
- * A Top App Bar displays information and actions relating to the current screen and is placed at
- * the top of the screen.
- *
- * Example usage:
- * TopAppBar(
- * color = +themeColor{ secondary },
- * leadingIcon = { MyNavIcon() },
- * titleTextLabel = { Text(text = "Title") },
- * trailingIcons = { TopAppBarTrailingIcons(icons) }
- * )
- *
- * @param color An optional color for the App Bar. By default [MaterialColors.primary] will be used.
- * @param leadingIcon A composable lambda to be inserted in the Leading Icon space. This is usually
- * a navigation icon. A standard implementation is provided by [AppBarLeadingIcon].
- * @param titleTextLabel A composable lambda to be inserted in the title space. This is usually a
- * [Text] element. A standard implementation is provided by [TopAppBarTitleTextLabel]. Default text
- * styling [MaterialTypography.h6] will be used.
- * @param trailingIcons A composable lambda to be inserted at the end of the bar, usually containing
- * a collection of menu icons. A standard implementation is provided by [TopAppBarTrailingIcons].
- */
@Composable
-fun TopAppBar(
+private fun BaseTopAppBar(
color: Color = +themeColor { primary },
- leadingIcon: @Composable() () -> Unit,
- titleTextLabel: @Composable() () -> Unit,
- trailingIcons: @Composable() () -> Unit
+ startContent: @Composable() () -> Unit,
+ title: @Composable() () -> Unit,
+ endContent: @Composable() () -> Unit
) {
- AppBar(color) {
+ BaseAppBar(color) {
FlexRow(mainAxisAlignment = MainAxisAlignment.SpaceBetween) {
inflexible {
- leadingIcon()
+ // TODO: what should the spacing be when there is no icon provided here?
+ startContent()
WidthSpacer(width = 32.dp)
}
- expanded(flex = 1f) {
+ expanded(1f) {
CurrentTextStyleProvider(value = +themeTextStyle { h6 }) {
- titleTextLabel()
+ title()
}
}
inflexible {
- trailingIcons()
+ endContent()
}
}
}
}
+object BottomAppBar {
+ /**
+ * The possible positions for the [FloatingActionButton] embedded in the [BottomAppBar], if a
+ * [FloatingActionButton] is specified.
+ */
+ enum class FabPosition {
+ /**
+ * Positioned in the center of the [BottomAppBar], overlapping the content of the
+ * BottomAppBar
+ */
+ Center,
+ /**
+ * Positioned at the end of the [BottomAppBar], overlapping the content of the
+ * BottomAppBar
+ */
+ End,
+ /**
+ * Positioned in the center of the [BottomAppBar], with an inset cutting into the content of
+ * the BottomAppBar
+ */
+ CenterCut,
+ }
+}
+
+/**
+ * A BottomAppBar displays actions relating to the current screen and is placed at the bottom of
+ * the screen. It can also optionally display a [FloatingActionButton], which is either overlaid
+ * on top of the BottomAppBar, or inset, carving a notch in the BottomAppBar.
+ *
+ * The location of the actions displayed by the BottomAppBar depends on the [FabPosition] /
+ * existence of the [FloatingActionButton]. When the [FloatingActionButton] is:
+ *
+ * - not set: the [navigationIcon] is displayed at the start, and the [contextualActions] are
+ * displayed at the end
+ *
+ * @sample androidx.ui.material.samples.SimpleBottomAppBarNoFab
+ *
+ * - [Center] or [CenterCut] aligned: the [navigationIcon] is displayed at the start, and the
+ * [contextualActions] are displayed at the end
+ *
+ * @sample androidx.ui.material.samples.SimpleBottomAppBarCenterFab
+ *
+ * - [End] aligned: the [contextualActions] are displayed at the start, and no navigation icon is
+ * supported
+ *
+ * @sample androidx.ui.material.samples.SimpleBottomAppBarEndFab
+ *
+ * @param color An optional color for the BottomAppBar. By default [MaterialColors.primary]
+ * will be used.
+ * @param navigationIcon The navigation icon displayed in the BottomAppBar. Note that if
+ * [fabPosition] is set to [End], this parameter must be null / not set.
+ * @param floatingActionButton The [FloatingActionButton] displayed in the BottomAppBar. The
+ * position of this fab will be [Center] aligned by default. You can set [fabPosition] to change
+ * the position.
+ * @param fabPosition The [FabPosition] of the [floatingActionButton]. This can be [Center],
+ * [CenterCut], or [End].
+ * @param contextualActions A list representing the contextual actions to be displayed in the
+ * BottomAppBar. Any remaining actions that do not fit on the BottomAppBar should typically be
+ * displayed in an overflow menu.
+ * @param action A specific item action to be displayed in the BottomAppBar - this will be called
+ * for items in [contextualActions] up to the maximum number of icons that can be displayed.
+ * @param T the type of item in [contextualActions]
+ */
+// TODO: b/137311217 - type inference for nullable lambdas currently doesn't work
+@Suppress("USELESS_CAST")
+@Composable
+fun <T> BottomAppBar(
+ color: Color = +themeColor { primary },
+ navigationIcon: (@Composable() () -> Unit)? = null as @Composable() (() -> Unit)?,
+ floatingActionButton: (@Composable() () -> Unit)? = null as @Composable() (() -> Unit)?,
+ fabPosition: FabPosition = Center,
+ contextualActions: List<T>? = null,
+ action: @Composable() (T) -> Unit = {}
+ // TODO: support overflow menu here with the remainder of the list
+) {
+ require(navigationIcon == null || fabPosition != End) {
+ "Using a navigation icon with an end-aligned FloatingActionButton is not supported"
+ }
+
+ val actions = { maxIcons: Int ->
+ @Composable {
+ if (contextualActions != null) {
+ AppBarActions(maxIcons, contextualActions, action)
+ }
+ }
+ }
+
+ val navigationIconComposable = @Composable {
+ if (navigationIcon != null) {
+ navigationIcon()
+ }
+ }
+
+ if (floatingActionButton == null) {
+ BaseBottomAppBar(
+ color = color,
+ startContent = navigationIconComposable,
+ endContent = actions(MaxIconsInBottomAppBarNoFab)
+ )
+ return
+ }
+
+ when (fabPosition) {
+ End -> BaseBottomAppBar(
+ color = color,
+ startContent = actions(MaxIconsInBottomAppBarEndFab),
+ fab = { Align(Alignment.CenterRight) { floatingActionButton() } }
+ )
+ // TODO: support CenterCut
+ else -> BaseBottomAppBar(
+ color = color,
+ startContent = navigationIconComposable,
+ fab = { Center { floatingActionButton() } },
+ endContent = actions(MaxIconsInBottomAppBarCenterFab)
+ )
+ }
+}
+
+// TODO: b/137311217 - type inference for nullable lambdas currently doesn't work
+@Suppress("USELESS_CAST")
+@Composable
+private fun BaseBottomAppBar(
+ color: Color = +themeColor { primary },
+ startContent: @Composable() () -> Unit = {},
+ fab: (@Composable() () -> Unit)? = null as @Composable() (() -> Unit)?,
+ endContent: @Composable() () -> Unit = {}
+) {
+ val appBar = @Composable { BaseBottomAppBarWithoutFab(color, startContent, endContent) }
+ if (fab == null) {
+ appBar()
+ } else {
+ ConstrainedBox(
+ constraints = DpConstraints(
+ minHeight = BottomAppBarHeightWithFab,
+ maxHeight = BottomAppBarHeightWithFab
+ )
+ ) {
+ Stack {
+ aligned(Alignment.BottomCenter) {
+ appBar()
+ }
+ aligned(Alignment.TopCenter) {
+ Container(
+ height = AppBarHeight,
+ padding = EdgeInsets(left = AppBarPadding, right = AppBarPadding)
+ ) {
+ fab()
+ }
+ }
+ }
+ }
+ }
+}
+
+@Composable
+private fun BaseBottomAppBarWithoutFab(
+ color: Color,
+ startContent: @Composable() () -> Unit,
+ endContent: @Composable() () -> Unit
+) {
+ BaseAppBar(color) {
+ FlexRow(mainAxisAlignment = MainAxisAlignment.SpaceBetween) {
+ inflexible {
+ startContent()
+ // TODO: if startContent() doesn't have any layout, then the endContent won't be
+ // placed at the end, so we need to trick it with a spacer
+ WidthSpacer(width = 1.dp)
+ }
+ inflexible { endContent() }
+ }
+ }
+}
+
/**
* An empty App Bar that expands to the parent's width.
*
@@ -124,103 +291,78 @@
* [TopAppBar].
*/
@Composable
-fun AppBar(color: Color, @Children children: @Composable() () -> Unit) {
+private fun BaseAppBar(color: Color, children: @Composable() () -> Unit) {
Semantics(
container = true
) {
Surface(color = color) {
- Container(height = RegularHeight, expanded = true, padding = EdgeInsets(Padding)) {
+ Container(height = AppBarHeight, expanded = true, padding = EdgeInsets(AppBarPadding)) {
children()
}
}
}
}
-/**
- * A component that displays a leading icon for an App Bar following Material spec guidelines.
- *
- * @see [AppBar]
- * @see [TopAppBar]
- */
@Composable
-fun AppBarLeadingIcon() {
- // TODO: Replace with real icon button
- Semantics(testTag = "Leading icon") {
- FakeIcon(24.dp)
- }
-}
-
-/**
- * A component that displays a title as a [Text] element for placement within a Top App Bar
- * following Material spec guidelines.
- *
- * @see [TopAppBar]
- *
- * @param title A title String to display
- */
-@Composable
-fun TopAppBarTitleTextLabel(title: String) {
- Text(text = title)
-}
-
-/**
- * A component that displays a set of menu icons for placement within a Top App Bar following
- * Material spec guidelines.
- *
- * @see [TopAppBar]
- *
- * @param icons A list of icons to display
- */
-@Composable
-fun TopAppBarTrailingIcons(icons: List<Dp>) {
- TrailingIcons(
- numIcons = icons.size,
- maxIcons = MaxIconsInTopAppBar,
- icons = { index ->
- Semantics(testTag = "Trailing icon") {
- // TODO: Replace with real icon button
- FakeIcon(icons[index])
- }
- },
- overflowIcon = {
- Semantics(testTag = "Overflow icon") {
- FakeIcon(12.dp)
- }
- }
- )
-}
-
-// TODO: make public
-@Composable
-internal fun TrailingIcons(
- numIcons: Int,
- maxIcons: Int,
- icons: @Composable() (index: Int) -> Unit,
- overflowIcon: @Composable() () -> Unit
+private fun <T> AppBarActions(
+ actionsToDisplay: Int,
+ contextualActions: List<T>,
+ action: @Composable() (T) -> Unit
) {
- if (numIcons > 0) {
- Row(mainAxisSize = FlexSize.Min) {
- val needsOverflow = numIcons > maxIcons
- val iconsToDisplay = if (needsOverflow) maxIcons else numIcons
- for (index in 0 until iconsToDisplay) {
+ if (contextualActions.isEmpty()) {
+ return
+ }
+
+ // Split the list depending on how many actions we are displaying - if actionsToDisplay is
+ // greater than or equal to the number of actions provided, overflowActions will be empty.
+ val (shownActions, overflowActions) = contextualActions.withIndex().partition {
+ it.index < actionsToDisplay
+ }
+
+ Row {
+ shownActions.forEach { (index, shownAction) ->
+ action(shownAction)
+ if (index != shownActions.lastIndex) {
WidthSpacer(width = 24.dp)
- icons(index)
}
- if (needsOverflow) {
- WidthSpacer(width = 24.dp)
- overflowIcon()
+ }
+ if (overflowActions.isNotEmpty()) {
+ WidthSpacer(width = 24.dp)
+ // TODO: use overflowActions to build menu here
+ Container(width = 12.dp) {
+ Text(text = "${overflowActions.size}", style = TextStyle(fontSize = 15.sp))
}
}
}
}
-// TODO: remove
+/**
+ * A correctly sized clickable icon that can be used inside [TopAppBar] and [BottomAppBar] for
+ * either the navigation icon or the actions.
+ *
+ * @param icon The icon to be displayed
+ * @param onClick the lambda to be invoked when this icon is pressed
+ */
@Composable
-internal fun FakeIcon(size: Dp) {
- ColoredRect(color = Color(0xFFFFFFFF.toInt()), width = size, height = 24.dp)
+fun AppBarIcon(icon: Image, onClick: () -> Unit) {
+ Ripple(bounded = false) {
+ Clickable(onClick = onClick) {
+ Center {
+ Container(width = ActionIconDiameter, height = ActionIconDiameter) {
+ SimpleImage(icon)
+ }
+ }
+ }
+ }
}
-private val RegularHeight = 56.dp
-private val Padding = 16.dp
-// TODO: IR compiler bug avoids this being const
-private val MaxIconsInTopAppBar = 2
\ No newline at end of file
+private val ActionIconDiameter = 24.dp
+
+private val AppBarHeight = 56.dp
+private val BottomAppBarHeightWithFab = 84.dp
+private val AppBarPadding = 16.dp
+
+private const val MaxIconsInTopAppBar = 2
+private const val MaxIconsInBottomAppBarCenterFab = 2
+private const val MaxIconsInBottomAppBarEndFab = 4
+private const val MaxIconsInBottomAppBarNoFab = 4
\ No newline at end of file
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
index bb4deb3..557ee14 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
@@ -16,35 +16,27 @@
package androidx.ui.material
-import androidx.animation.AnimatedFloat
-import androidx.animation.ExponentialDecay
import androidx.animation.PhysicsBuilder
-import androidx.animation.TargetAnimation
-import androidx.animation.fling
import androidx.compose.Composable
import androidx.compose.composer
-import androidx.compose.memo
import androidx.compose.onCommit
import androidx.compose.unaryPlus
-import androidx.ui.animation.animatedFloat
-import androidx.ui.core.Direction
import androidx.ui.core.Dp
import androidx.ui.core.IntPx
import androidx.ui.core.Layout
import androidx.ui.core.Px
-import androidx.ui.core.PxPosition
import androidx.ui.core.RepaintBoundary
import androidx.ui.core.WithConstraints
import androidx.ui.core.dp
-import androidx.ui.core.gesture.DragGestureDetector
-import androidx.ui.core.gesture.DragObserver
import androidx.ui.core.hasBoundedHeight
import androidx.ui.core.hasBoundedWidth
import androidx.ui.core.min
-import androidx.ui.core.px
import androidx.ui.core.withDensity
import androidx.ui.foundation.Clickable
import androidx.ui.foundation.ColoredRect
+import androidx.ui.foundation.gestures.AnchorsFlingConfig
+import androidx.ui.foundation.gestures.AnimatedDraggable
+import androidx.ui.foundation.gestures.DragDirection
import androidx.ui.layout.Alignment
import androidx.ui.layout.Container
import androidx.ui.layout.DpConstraints
@@ -124,21 +116,33 @@
val constraints = +withDensity {
DpConstraints(pxConstraints)
}
- val info = +memo(pxConstraints.maxWidth) {
- ModalDragInfo(pxConstraints.maxWidth.value.toFloat())
- }
- val fling = +memo(pxConstraints.maxWidth) {
- ModalDrawerFlinger(pxConstraints.maxWidth.value.toFloat(), onStateChange)
- }
- fling.onStateChange = onStateChange
+ val minValue = -pxConstraints.maxWidth.value.toFloat()
+ val maxValue = 0f
+ val valueByState = if (drawerState == DrawerState.Opened) maxValue else minValue
- val valueByState =
- if (drawerState == DrawerState.Opened) info.maxBound else info.minBound
- AnimatedDraggable(info, valueByState, fling) { animatedValue ->
+ val flingConfig = AnchorsFlingConfig(
+ listOf(minValue, maxValue),
+ onAnimationFinished = { finalValue, cancelled ->
+ if (!cancelled) {
+ onStateChange(
+ if (finalValue <= minValue) DrawerState.Closed else DrawerState.Opened
+ )
+ }
+ },
+ animationBuilder = AnimationBuilder
+ )
+
+ AnimatedDraggable(
+ dragDirection = DragDirection.Horizontal,
+ startValue = valueByState,
+ minValue = minValue,
+ maxValue = maxValue,
+ flingConfig = flingConfig
+ ) { animatedValue ->
+onCommit(valueByState) {
animatedValue.animateTo(valueByState, AnimationBuilder)
}
- val fraction = calculateFraction(info.minBound, info.maxBound, animatedValue.value)
+ val fraction = calculateFraction(minValue, maxValue, animatedValue.value)
val scrimAlpha = fraction * ScrimDefaultOpacity
val dpOffset = +withDensity {
animatedValue.value.toDp()
@@ -192,30 +196,40 @@
val constraints = +withDensity {
DpConstraints(pxConstraints)
}
- val info = +memo(pxConstraints.maxHeight) {
- BottomDragInfo(pxConstraints.maxHeight.value.toFloat())
- }
- val fling = +memo(pxConstraints.maxHeight) {
- BottomDrawerFlinger(pxConstraints.maxHeight.value.toFloat(), onStateChange)
- }
- fling.onStateChange = onStateChange
+ val minValue = 0f
+ val maxValue = pxConstraints.maxHeight.value.toFloat()
// TODO: add proper landscape support
val isLandscape = constraints.maxWidth > constraints.maxHeight
- val openedValue = if (isLandscape) info.maxBound else lerp(
- info.minBound,
- info.maxBound,
+ val openedValue = if (isLandscape) maxValue else lerp(
+ minValue,
+ maxValue,
BottomDrawerOpenFraction
)
- val valueByState = if (drawerState == DrawerState.Opened) openedValue else info.maxBound
+ val valueByState = if (drawerState == DrawerState.Opened) openedValue else maxValue
+ val anchors = listOf(minValue, maxValue, openedValue)
- AnimatedDraggable(info, valueByState, fling) { animatedValue ->
+ val onAnimationFinished = { finalValue: Float, cancelled: Boolean ->
+ if (!cancelled) {
+ onStateChange(
+ if (finalValue >= maxValue) DrawerState.Closed else DrawerState.Opened
+ )
+ }
+ }
+
+ AnimatedDraggable(
+ dragDirection = DragDirection.Vertical,
+ startValue = valueByState,
+ minValue = minValue,
+ maxValue = maxValue,
+ flingConfig = AnchorsFlingConfig(anchors, onAnimationFinished, AnimationBuilder)
+ ) { animatedValue ->
+onCommit(valueByState) {
animatedValue.animateTo(valueByState, AnimationBuilder)
}
// as we scroll "from height to 0" backwards, (1 - fraction) will reverse it
val fractionToOpened =
- 1 - max(0f, calculateFraction(openedValue, info.maxBound, animatedValue.value))
+ 1 - max(0f, calculateFraction(openedValue, maxValue, animatedValue.value))
val scrimAlpha = fractionToOpened * ScrimDefaultOpacity
val dpOffset = +withDensity {
animatedValue.value.toDp()
@@ -264,155 +278,6 @@
private fun calculateFraction(a: Float, b: Float, pos: Float) = (pos - a) / (b - a)
-private interface Flinger {
- fun fling(animation: AnimatedFloat, velocity: Float)
-}
-
-private data class DragInfo(
- val minBound: Float,
- val maxBound: Float,
- val positionToAxis: (PxPosition) -> Px,
- val axisToPosition: (Float) -> PxPosition,
- val isDraggableInDirection: (direction: Direction, currentValue: Float) -> Boolean
-)
-
-@Composable
-private fun AnimatedDraggable(
- dragInfo: DragInfo,
- startValue: Float,
- fling: Flinger,
- children: @Composable() (AnimatedFloat) -> Unit
-) {
- val offset = (+animatedFloat(startValue)).apply {
- setBounds(dragInfo.minBound, dragInfo.maxBound)
- }
- DragGestureDetector(
- canDrag = { direction ->
- dragInfo.isDraggableInDirection(direction, offset.value)
- },
- dragObserver = object : DragObserver {
-
- override fun onDrag(dragDistance: PxPosition): PxPosition {
- val draggedFraction = dragInfo.positionToAxis(dragDistance).value
- val newValue =
- (offset.value + draggedFraction)
- .coerceIn(dragInfo.minBound, dragInfo.maxBound)
- val consumed = newValue - offset.value
- offset.snapTo(newValue)
- return dragInfo.axisToPosition(consumed)
- }
-
- override fun onStop(velocity: PxPosition) {
- fling.fling(offset, dragInfo.positionToAxis(velocity).value)
- }
- }
- ) {
- children(offset)
- }
-}
-
-private fun ModalDragInfo(width: Float): DragInfo {
- val min = -width
- val max = 0f
- return DragInfo(
- minBound = min,
- maxBound = max,
- positionToAxis = { it.x },
- axisToPosition = { PxPosition(it.px, 0.px) },
- isDraggableInDirection = { direction, currentValue ->
- when (direction) {
- Direction.RIGHT -> currentValue <= max
- Direction.LEFT -> currentValue >= min
- else -> false
- }
- }
- )
-}
-
-private fun BottomDragInfo(height: Float): DragInfo {
- val min = 0f
- val max = height
- return DragInfo(
- minBound = min,
- maxBound = max,
- positionToAxis = { it.y },
- axisToPosition = { PxPosition(0.px, it.px) },
- isDraggableInDirection = { direction, currentValue ->
- when (direction) {
- Direction.UP -> currentValue <= max
- Direction.DOWN -> currentValue >= min
- else -> false
- }
- }
-
- )
-}
-
-private class BottomDrawerFlinger(
- height: Float,
- var onStateChange: (DrawerState) -> Unit
-) : Flinger {
- val openValue = lerp(0f, height, BottomDrawerOpenFraction)
- val expandedValue = 0f
- val closedValue = height
-
- override fun fling(animation: AnimatedFloat, velocity: Float) {
- animation.fling(
- startVelocity = velocity,
- decay = DefaultDecay,
- adjustTarget = adjustTarget(animation),
- onFinished = onFinished(animation)
- )
- }
-
- fun onFinished(animation: AnimatedFloat) = { _: Boolean ->
- if (animation.value >= closedValue) onStateChange(DrawerState.Closed)
- else if (animation.value <= openValue) onStateChange(DrawerState.Opened)
- }
-
- fun adjustTarget(animation: AnimatedFloat) = { targetToAdjust: Float ->
- val target =
- if (targetToAdjust > openValue / 2) {
- closedValue
- } else if (animation.value <= openValue && targetToAdjust < openValue) {
- expandedValue
- } else {
- openValue
- }
- TargetAnimation(target, AnimationBuilder)
- }
-}
-
-private class ModalDrawerFlinger(
- width: Float,
- var onStateChange: (DrawerState) -> Unit
-) : Flinger {
- val openValue = 0f
- val closedValue = -width
-
- override fun fling(animation: AnimatedFloat, velocity: Float) {
- animation.fling(
- startVelocity = velocity,
- decay = DefaultDecay,
- adjustTarget = adjustTarget,
- onFinished = onFinished(animation)
- )
- }
-
- fun onFinished(animation: AnimatedFloat) = { _: Boolean ->
- if (animation.value <= closedValue) {
- onStateChange(DrawerState.Closed)
- } else if (animation.value >= openValue) {
- onStateChange(DrawerState.Opened)
- }
- }
-
- val adjustTarget = { targetToAdjust: Float ->
- val target = if (targetToAdjust < openValue / 2) closedValue else openValue
- TargetAnimation(target, AnimationBuilder)
- }
-}
-
@Composable
private fun Scrim(state: DrawerState, onStateChange: (DrawerState) -> Unit, opacity: Float) {
// TODO: use enabled = false here when it will be available
@@ -464,8 +329,6 @@
private val StaticDrawerWidth = 256.dp
private val DrawerStiffness = 1000f
-// TODO: figure out default decay
-private val DefaultDecay = ExponentialDecay(0.7f)
private val AnimationBuilder =
PhysicsBuilder<Float>().apply {
stiffness = DrawerStiffness
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/input/RecordingInputConnection.kt b/ui/ui-platform/src/main/java/androidx/ui/core/input/RecordingInputConnection.kt
index 793b682..e6d71a4 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/input/RecordingInputConnection.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/input/RecordingInputConnection.kt
@@ -24,6 +24,7 @@
import android.view.View
import android.view.inputmethod.CompletionInfo
import android.view.inputmethod.CorrectionInfo
+import android.view.inputmethod.EditorInfo
import android.view.inputmethod.ExtractedText
import android.view.inputmethod.ExtractedTextRequest
import android.view.inputmethod.InputConnection
@@ -36,6 +37,7 @@
import androidx.ui.input.DeleteSurroundingTextInCodePointsEditOp
import androidx.ui.input.EditOperation
import androidx.ui.input.FinishComposingTextEditOp
+import androidx.ui.input.ImeAction
import androidx.ui.input.InputEventListener
import androidx.ui.input.MoveCursorEditOp
import androidx.ui.input.SetComposingRegionEditOp
@@ -256,7 +258,21 @@
override fun performEditorAction(editorAction: Int): Boolean {
if (DEBUG) { Log.d(TAG, "performEditorAction($editorAction)") }
- TODO("not implemented")
+ val imeAction = when (editorAction) {
+ EditorInfo.IME_ACTION_UNSPECIFIED -> ImeAction.Unspecified
+ EditorInfo.IME_ACTION_DONE -> ImeAction.Done
+ EditorInfo.IME_ACTION_SEND -> ImeAction.Send
+ EditorInfo.IME_ACTION_SEARCH -> ImeAction.Search
+ EditorInfo.IME_ACTION_PREVIOUS -> ImeAction.Previous
+ EditorInfo.IME_ACTION_NEXT -> ImeAction.Next
+ EditorInfo.IME_ACTION_GO -> ImeAction.Go
+ else -> {
+ Log.w(TAG, "IME sends unsupported Editor Action: $editorAction")
+ ImeAction.Unspecified
+ }
+ }
+ eventListener.onImeAction(imeAction)
+ return true
}
// /////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/input/TextInputServiceAndroid.kt b/ui/ui-platform/src/main/java/androidx/ui/core/input/TextInputServiceAndroid.kt
index c9ff9be..77a835f 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/input/TextInputServiceAndroid.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/input/TextInputServiceAndroid.kt
@@ -25,6 +25,7 @@
import androidx.ui.engine.geometry.Rect
import androidx.ui.input.EditOperation
import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
import androidx.ui.input.InputEventListener
import androidx.ui.input.KeyboardType
import androidx.ui.input.TextInputService
@@ -43,10 +44,11 @@
* session
*/
private var onEditCommand: (List<EditOperation>) -> Unit = {}
- private var onEditorActionPerformed: (Any) -> Unit = {}
+ private var onImeActionPerformed: (ImeAction) -> Unit = {}
private var state = InputState(text = "", selection = TextRange(0, 0))
private var keyboardType = KeyboardType.Text
+ private var imeAction = ImeAction.Unspecified
private var ic: RecordingInputConnection? = null
/**
@@ -62,7 +64,7 @@
if (!editorHasFocus) {
return null
}
- fillEditorInfo(keyboardType, outAttrs)
+ fillEditorInfo(keyboardType, imeAction, outAttrs)
return RecordingInputConnection(
initState = state,
@@ -70,6 +72,10 @@
override fun onEditOperations(editOps: List<EditOperation>) {
onEditCommand(editOps)
}
+
+ override fun onImeAction(imeAction: ImeAction) {
+ onImeActionPerformed(imeAction)
+ }
}
).also { ic = it }
}
@@ -82,14 +88,16 @@
override fun startInput(
initState: EditorState,
keyboardType: KeyboardType,
+ imeAction: ImeAction,
onEditCommand: (List<EditOperation>) -> Unit,
- onEditorActionPerformed: (Any) -> Unit
+ onImeActionPerformed: (ImeAction) -> Unit
) {
editorHasFocus = true
state = initState.toInputState()
this.keyboardType = keyboardType
+ this.imeAction = imeAction
this.onEditCommand = onEditCommand
- this.onEditorActionPerformed = onEditorActionPerformed
+ this.onImeActionPerformed = onImeActionPerformed
view.requestFocus()
view.post {
@@ -101,7 +109,7 @@
override fun stopInput() {
editorHasFocus = false
onEditCommand = {}
- onEditorActionPerformed = {}
+ onImeActionPerformed = {}
imm.restartInput(view)
}
@@ -126,12 +134,27 @@
/**
* Fills necessary info of EditorInfo.
*/
- private fun fillEditorInfo(keyboardType: KeyboardType, outInfo: EditorInfo) {
+ private fun fillEditorInfo(
+ keyboardType: KeyboardType,
+ imeAction: ImeAction,
+ outInfo: EditorInfo
+ ) {
+ outInfo.imeOptions = when (imeAction) {
+ ImeAction.Unspecified -> EditorInfo.IME_ACTION_UNSPECIFIED
+ ImeAction.NoAction -> EditorInfo.IME_ACTION_NONE
+ ImeAction.Go -> EditorInfo.IME_ACTION_GO
+ ImeAction.Next -> EditorInfo.IME_ACTION_NEXT
+ ImeAction.Previous -> EditorInfo.IME_ACTION_PREVIOUS
+ ImeAction.Search -> EditorInfo.IME_ACTION_SEARCH
+ ImeAction.Send -> EditorInfo.IME_ACTION_SEND
+ ImeAction.Done -> EditorInfo.IME_ACTION_DONE
+ else -> throw IllegalArgumentException("Unknown ImeAction: $imeAction")
+ }
when (keyboardType) {
KeyboardType.Text -> outInfo.inputType = InputType.TYPE_CLASS_TEXT
KeyboardType.Ascii -> {
outInfo.inputType = InputType.TYPE_CLASS_TEXT
- outInfo.imeOptions = EditorInfo.IME_FLAG_FORCE_ASCII
+ outInfo.imeOptions = outInfo.imeOptions or EditorInfo.IME_FLAG_FORCE_ASCII
}
KeyboardType.Number -> outInfo.inputType = InputType.TYPE_CLASS_NUMBER
KeyboardType.Phone -> outInfo.inputType = InputType.TYPE_CLASS_PHONE
@@ -142,7 +165,8 @@
InputType.TYPE_CLASS_TEXT or EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
else -> throw IllegalArgumentException("Unknown KeyboardType: $keyboardType")
}
- outInfo.imeOptions = outInfo.imeOptions or EditorInfo.IME_FLAG_NO_FULLSCREEN
+ outInfo.imeOptions =
+ outInfo.imeOptions or outInfo.imeOptions or EditorInfo.IME_FLAG_NO_FULLSCREEN
}
}
diff --git a/ui/ui-platform/src/test/java/androidx/ui/core/input/TextInputServiceAndroidTest.kt b/ui/ui-platform/src/test/java/androidx/ui/core/input/TextInputServiceAndroidTest.kt
index 3609daa9..81f82ab 100644
--- a/ui/ui-platform/src/test/java/androidx/ui/core/input/TextInputServiceAndroidTest.kt
+++ b/ui/ui-platform/src/test/java/androidx/ui/core/input/TextInputServiceAndroidTest.kt
@@ -23,6 +23,7 @@
import android.view.inputmethod.InputMethodManager
import androidx.test.filters.SmallTest
import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
import com.nhaarman.mockitokotlin2.eq
import com.nhaarman.mockitokotlin2.mock
@@ -55,12 +56,15 @@
textInputService.startInput(
EditorState(""),
KeyboardType.Text,
+ ImeAction.Unspecified,
onEditCommand = {},
- onEditorActionPerformed = {})
+ onImeActionPerformed = {})
EditorInfo().let { info ->
textInputService.createInputConnection(info)
assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_UNSPECIFIED)
}
}
@@ -69,13 +73,16 @@
textInputService.startInput(
EditorState(""),
KeyboardType.Ascii,
+ ImeAction.Unspecified,
onEditCommand = {},
- onEditorActionPerformed = {})
+ onImeActionPerformed = {})
EditorInfo().let { info ->
textInputService.createInputConnection(info)
assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_UNSPECIFIED)
}
}
@@ -84,12 +91,15 @@
textInputService.startInput(
EditorState(""),
KeyboardType.Number,
+ ImeAction.Unspecified,
onEditCommand = {},
- onEditorActionPerformed = {})
+ onImeActionPerformed = {})
EditorInfo().let { info ->
textInputService.createInputConnection(info)
assertTrue((InputType.TYPE_CLASS_NUMBER and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_UNSPECIFIED)
}
}
@@ -98,12 +108,15 @@
textInputService.startInput(
EditorState(""),
KeyboardType.Phone,
+ ImeAction.Unspecified,
onEditCommand = {},
- onEditorActionPerformed = {})
+ onImeActionPerformed = {})
EditorInfo().let { info ->
textInputService.createInputConnection(info)
assertTrue((InputType.TYPE_CLASS_PHONE and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_UNSPECIFIED)
}
}
@@ -112,13 +125,16 @@
textInputService.startInput(
EditorState(""),
KeyboardType.Uri,
+ ImeAction.Unspecified,
onEditCommand = {},
- onEditorActionPerformed = {})
+ onImeActionPerformed = {})
EditorInfo().let { info ->
textInputService.createInputConnection(info)
assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
assertTrue((InputType.TYPE_TEXT_VARIATION_URI and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_UNSPECIFIED)
}
}
@@ -127,13 +143,142 @@
textInputService.startInput(
EditorState(""),
KeyboardType.Email,
+ ImeAction.Unspecified,
onEditCommand = {},
- onEditorActionPerformed = {})
+ onImeActionPerformed = {})
EditorInfo().let { info ->
textInputService.createInputConnection(info)
assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
assertTrue((InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_UNSPECIFIED)
+ }
+ }
+
+ @Test
+ fun test_fill_editor_info_action_none() {
+ textInputService.startInput(
+ EditorState(""),
+ KeyboardType.Ascii,
+ ImeAction.NoAction,
+ onEditCommand = {},
+ onImeActionPerformed = {})
+
+ EditorInfo().let { info ->
+ textInputService.createInputConnection(info)
+ assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_NONE)
+ }
+ }
+
+ @Test
+ fun test_fill_editor_info_action_go() {
+ textInputService.startInput(
+ EditorState(""),
+ KeyboardType.Ascii,
+ ImeAction.Go,
+ onEditCommand = {},
+ onImeActionPerformed = {})
+
+ EditorInfo().let { info ->
+ textInputService.createInputConnection(info)
+ assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_GO)
+ }
+ }
+
+ @Test
+ fun test_fill_editor_info_action_next() {
+ textInputService.startInput(
+ EditorState(""),
+ KeyboardType.Ascii,
+ ImeAction.Next,
+ onEditCommand = {},
+ onImeActionPerformed = {})
+
+ EditorInfo().let { info ->
+ textInputService.createInputConnection(info)
+ assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_NEXT)
+ }
+ }
+
+ @Test
+ fun test_fill_editor_info_action_previous() {
+ textInputService.startInput(
+ EditorState(""),
+ KeyboardType.Ascii,
+ ImeAction.Previous,
+ onEditCommand = {},
+ onImeActionPerformed = {})
+
+ EditorInfo().let { info ->
+ textInputService.createInputConnection(info)
+ assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_PREVIOUS)
+ }
+ }
+
+ @Test
+ fun test_fill_editor_info_action_search() {
+ textInputService.startInput(
+ EditorState(""),
+ KeyboardType.Ascii,
+ ImeAction.Search,
+ onEditCommand = {},
+ onImeActionPerformed = {})
+
+ EditorInfo().let { info ->
+ textInputService.createInputConnection(info)
+ assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_SEARCH)
+ }
+ }
+
+ @Test
+ fun test_fill_editor_info_action_send() {
+ textInputService.startInput(
+ EditorState(""),
+ KeyboardType.Ascii,
+ ImeAction.Send,
+ onEditCommand = {},
+ onImeActionPerformed = {})
+
+ EditorInfo().let { info ->
+ textInputService.createInputConnection(info)
+ assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_SEND)
+ }
+ }
+
+ @Test
+ fun test_fill_editor_info_action_done() {
+ textInputService.startInput(
+ EditorState(""),
+ KeyboardType.Ascii,
+ ImeAction.Done,
+ onEditCommand = {},
+ onImeActionPerformed = {})
+
+ EditorInfo().let { info ->
+ textInputService.createInputConnection(info)
+ assertTrue((InputType.TYPE_CLASS_TEXT and info.inputType) != 0)
+ assertTrue((EditorInfo.IME_FLAG_FORCE_ASCII and info.imeOptions) != 0)
+ assertTrue((EditorInfo.IME_MASK_ACTION and info.imeOptions)
+ == EditorInfo.IME_ACTION_DONE)
}
}
}
\ No newline at end of file
diff --git a/ui/ui-text/api/1.0.0-alpha01.txt b/ui/ui-text/api/1.0.0-alpha01.txt
index af495da..0aa0326 100644
--- a/ui/ui-text/api/1.0.0-alpha01.txt
+++ b/ui/ui-text/api/1.0.0-alpha01.txt
@@ -11,6 +11,17 @@
property public final String text;
}
+ public enum ImeAction {
+ enum_constant public static final androidx.ui.input.ImeAction Done;
+ enum_constant public static final androidx.ui.input.ImeAction Go;
+ enum_constant public static final androidx.ui.input.ImeAction Next;
+ enum_constant public static final androidx.ui.input.ImeAction NoAction;
+ enum_constant public static final androidx.ui.input.ImeAction Previous;
+ enum_constant public static final androidx.ui.input.ImeAction Search;
+ enum_constant public static final androidx.ui.input.ImeAction Send;
+ enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+ }
+
public enum KeyboardType {
enum_constant public static final androidx.ui.input.KeyboardType Ascii;
enum_constant public static final androidx.ui.input.KeyboardType Email;
diff --git a/ui/ui-text/api/current.txt b/ui/ui-text/api/current.txt
index af495da..0aa0326 100644
--- a/ui/ui-text/api/current.txt
+++ b/ui/ui-text/api/current.txt
@@ -11,6 +11,17 @@
property public final String text;
}
+ public enum ImeAction {
+ enum_constant public static final androidx.ui.input.ImeAction Done;
+ enum_constant public static final androidx.ui.input.ImeAction Go;
+ enum_constant public static final androidx.ui.input.ImeAction Next;
+ enum_constant public static final androidx.ui.input.ImeAction NoAction;
+ enum_constant public static final androidx.ui.input.ImeAction Previous;
+ enum_constant public static final androidx.ui.input.ImeAction Search;
+ enum_constant public static final androidx.ui.input.ImeAction Send;
+ enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+ }
+
public enum KeyboardType {
enum_constant public static final androidx.ui.input.KeyboardType Ascii;
enum_constant public static final androidx.ui.input.KeyboardType Email;
diff --git a/ui/ui-text/api/restricted_1.0.0-alpha01.txt b/ui/ui-text/api/restricted_1.0.0-alpha01.txt
index 94e8ba8..e2f3b68 100644
--- a/ui/ui-text/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-text/api/restricted_1.0.0-alpha01.txt
@@ -19,6 +19,17 @@
}
+ public enum ImeAction {
+ enum_constant public static final androidx.ui.input.ImeAction Done;
+ enum_constant public static final androidx.ui.input.ImeAction Go;
+ enum_constant public static final androidx.ui.input.ImeAction Next;
+ enum_constant public static final androidx.ui.input.ImeAction NoAction;
+ enum_constant public static final androidx.ui.input.ImeAction Previous;
+ enum_constant public static final androidx.ui.input.ImeAction Search;
+ enum_constant public static final androidx.ui.input.ImeAction Send;
+ enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+ }
+
public enum KeyboardType {
enum_constant public static final androidx.ui.input.KeyboardType Ascii;
diff --git a/ui/ui-text/api/restricted_current.txt b/ui/ui-text/api/restricted_current.txt
index 94e8ba8..e2f3b68 100644
--- a/ui/ui-text/api/restricted_current.txt
+++ b/ui/ui-text/api/restricted_current.txt
@@ -19,6 +19,17 @@
}
+ public enum ImeAction {
+ enum_constant public static final androidx.ui.input.ImeAction Done;
+ enum_constant public static final androidx.ui.input.ImeAction Go;
+ enum_constant public static final androidx.ui.input.ImeAction Next;
+ enum_constant public static final androidx.ui.input.ImeAction NoAction;
+ enum_constant public static final androidx.ui.input.ImeAction Previous;
+ enum_constant public static final androidx.ui.input.ImeAction Search;
+ enum_constant public static final androidx.ui.input.ImeAction Send;
+ enum_constant public static final androidx.ui.input.ImeAction Unspecified;
+ }
+
public enum KeyboardType {
enum_constant public static final androidx.ui.input.KeyboardType Ascii;
diff --git a/ui/ui-text/build.gradle b/ui/ui-text/build.gradle
index 75aad7d..feccef84 100644
--- a/ui/ui-text/build.gradle
+++ b/ui/ui-text/build.gradle
@@ -30,7 +30,6 @@
dependencies {
kotlinPlugin project(path: ":compose:compose-compiler", configuration: "embeddablePlugin")
-
implementation(KOTLIN_COMPOSE_STDLIB)
// TODO: Non-Kotlin dependency, move to Android-specific code
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneInputField.kt b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneInputField.kt
index a7e2235..6d74cfa 100644
--- a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneInputField.kt
+++ b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneInputField.kt
@@ -25,6 +25,7 @@
import androidx.ui.core.InputField
import androidx.ui.text.TextRange
import androidx.ui.input.EditorState
+import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
import androidx.ui.layout.Column
import androidx.ui.layout.CrossAxisAlignment
@@ -39,6 +40,17 @@
Pair(KeyboardType.Phone, "Phone")
)
+val IME_ACTIONS = listOf(
+ Pair(ImeAction.Unspecified, "Unspecified"),
+ Pair(ImeAction.NoAction, "NoAction"),
+ Pair(ImeAction.Go, "Go"),
+ Pair(ImeAction.Search, "Search"),
+ Pair(ImeAction.Send, "Send"),
+ Pair(ImeAction.Next, "Next"),
+ Pair(ImeAction.Done, "Done"),
+ Pair(ImeAction.Previous, "Previous")
+)
+
@Composable
fun InputFieldDemo() {
CraneWrapper {
@@ -53,17 +65,27 @@
TagLine(tag = "Keyboard Type: $name")
EditLine(initText = "Keyboard Type: $name", keyboardType = type)
}
+
+ for ((action, name) in IME_ACTIONS) {
+ TagLine(tag = "Ime Action: $name")
+ EditLine(initText = "ImeAction: $name", imeAction = action)
+ }
}
}
}
}
@Composable
-fun EditLine(initText: String, keyboardType: KeyboardType = KeyboardType.Text) {
+fun EditLine(
+ initText: String,
+ keyboardType: KeyboardType = KeyboardType.Text,
+ imeAction: ImeAction = ImeAction.Unspecified
+) {
val state = +state { EditorState(text = initText, selection = TextRange(2, 2)) }
InputField(
value = state.value,
keyboardType = keyboardType,
+ imeAction = imeAction,
onValueChange = { state.value = it },
editorStyle = EditorStyle(textStyle = TextStyle(fontSize = fontSize8))
)
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/ImeAction.kt b/ui/ui-text/src/main/java/androidx/ui/input/ImeAction.kt
new file mode 100644
index 0000000..67f2ee9
--- /dev/null
+++ b/ui/ui-text/src/main/java/androidx/ui/input/ImeAction.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.input
+
+/**
+ * Enums used for indicating IME action.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_MASK_ACTION
+ */
+enum class ImeAction {
+ /**
+ * An IME action used to represent that any IME action is associated.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_UNSPECIFIED
+ */
+ Unspecified,
+
+ /**
+ * An IME action used to represent that no IME action is available in editor.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_NONE
+ */
+ NoAction,
+
+ /**
+ * An IME action used to represent that the "enter" key works as "go" action.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_GO
+ */
+ Go,
+
+ /**
+ * An IME action used to represent that the "enter" key works as "search" action.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_SEARCH
+ */
+ Search,
+
+ /**
+ * An IME action used to represent that the "enter" key works as "send" action.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_SEND
+ */
+ Send,
+
+ /**
+ * An IME action used to represent that the "enter" key works as "previous" action.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_PREVIOUS
+ */
+ Previous,
+
+ /**
+ * An IME action used to represent that the "enter" key works as "next" action.
+ *
+ * https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_NEXT
+ */
+ Next,
+
+ /**
+ * An IME action used to represent that the "enter" key works as "done" action.
+ *
+ * @see https://developer.android.com/reference/android/view/inputmethod/EditorInfo.html#IME_ACTION_DONE
+ */
+ Done
+}
\ No newline at end of file
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt b/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt
index cb6032b..1c8d5db 100644
--- a/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/input/InputEventListener.kt
@@ -32,5 +32,10 @@
*/
fun onEditOperations(editOps: List<EditOperation>)
- // TODO(nona): add more input event callbacks, editor action etc.
+ /**
+ * Called when IME triggered IME action.
+ *
+ * @param imeAction An IME action.
+ */
+ fun onImeAction(imeAction: ImeAction)
}
\ No newline at end of file
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt b/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt
index 8b67df4..382e110 100644
--- a/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/input/TextInputService.kt
@@ -31,8 +31,9 @@
fun startInput(
initState: EditorState,
keyboardType: KeyboardType,
+ imeAction: ImeAction,
onEditCommand: (List<EditOperation>) -> Unit,
- onEditorActionPerformed: (Any) -> Unit /* TODO(nona): decide type */
+ onImeActionPerformed: (ImeAction) -> Unit
)
/**
diff --git a/viewpager2/api/1.0.0-beta00.txt b/viewpager2/api/1.0.0-beta01.txt
similarity index 100%
rename from viewpager2/api/1.0.0-beta00.txt
rename to viewpager2/api/1.0.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/viewpager2/api/res-1.0.0-beta01.txt
similarity index 100%
rename from viewpager2/api/res-1.0.0-beta00.txt
rename to viewpager2/api/res-1.0.0-beta01.txt
diff --git a/viewpager2/api/restricted_1.0.0-beta00.txt b/viewpager2/api/restricted_1.0.0-beta01.txt
similarity index 100%
rename from viewpager2/api/restricted_1.0.0-beta00.txt
rename to viewpager2/api/restricted_1.0.0-beta01.txt
diff --git a/viewpager2/build.gradle b/viewpager2/build.gradle
index 30c1569..9de6aa7 100644
--- a/viewpager2/build.gradle
+++ b/viewpager2/build.gradle
@@ -32,8 +32,6 @@
api("androidx.recyclerview:recyclerview:1.1.0-beta01")
implementation("androidx.collection:collection:1.1.0")
- androidTestImplementation(project(":appcompat"))
- androidTestImplementation(project(":core:core"))
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_CORE)
androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
index 7aa57a9..050aab8 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/AccessibilityTest.kt
@@ -19,10 +19,6 @@
import android.os.Build
import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_DOWN
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_LEFT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_RIGHT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_UP
import androidx.test.filters.LargeTest
import androidx.test.filters.SdkSuppress
import androidx.testutils.LocaleTestUtils
@@ -142,12 +138,12 @@
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
if (isRtl) {
- return ACTION_PAGE_LEFT.id
+ return ACTION_ID_PAGE_LEFT
} else {
- return ACTION_PAGE_RIGHT.id
+ return ACTION_ID_PAGE_RIGHT
}
}
- return ACTION_PAGE_DOWN.id
+ return ACTION_ID_PAGE_DOWN
}
return AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
}
@@ -156,12 +152,12 @@
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (orientation == ViewPager2.ORIENTATION_HORIZONTAL) {
if (isRtl) {
- return ACTION_PAGE_RIGHT.id
+ return ACTION_ID_PAGE_RIGHT
} else {
- return ACTION_PAGE_LEFT.id
+ return ACTION_ID_PAGE_LEFT
}
}
- return ACTION_PAGE_UP.id
+ return ACTION_ID_PAGE_UP
}
return AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
}
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
index 99bfc8e..679943f 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
@@ -21,15 +21,12 @@
import android.util.Log
import android.view.View
import android.view.View.OVER_SCROLL_NEVER
+import android.view.ViewConfiguration
import android.view.accessibility.AccessibilityNodeInfo
import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_DOWN
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_LEFT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_RIGHT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_UP
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.test.core.app.ApplicationProvider
@@ -80,6 +77,10 @@
open class BaseTest {
companion object {
const val TAG = "VP2_TESTS"
+ const val ACTION_ID_PAGE_LEFT = android.R.id.accessibilityActionPageLeft
+ const val ACTION_ID_PAGE_RIGHT = android.R.id.accessibilityActionPageRight
+ const val ACTION_ID_PAGE_UP = android.R.id.accessibilityActionPageUp
+ const val ACTION_ID_PAGE_DOWN = android.R.id.accessibilityActionPageDown
}
lateinit var localeUtil: LocaleTestUtils
@@ -150,11 +151,11 @@
val viewPager: ViewPager2 get() = activity.findViewById(R.id.view_pager)
fun peekForward() {
- peek(adjustForRtl(-50f))
+ peek(adjustForRtl(adjustForTouchSlop(-50f)))
}
fun peekBackward() {
- peek(adjustForRtl(50f))
+ peek(adjustForRtl(adjustForTouchSlop(50f)))
}
enum class SwipeMethod {
@@ -213,6 +214,15 @@
}
}
+ private fun adjustForTouchSlop(offset: Float): Float {
+ val touchSlop = ViewConfiguration.get(viewPager.context).scaledPagingTouchSlop
+ return when {
+ offset < 0 -> offset - touchSlop
+ offset > 0 -> offset + touchSlop
+ else -> 0f
+ }
+ }
+
private fun adjustForRtl(offset: Float): Float {
return if (viewPager.isHorizontal && viewPager.isRtl) -offset else offset
}
@@ -274,20 +284,20 @@
currentPage < numPages - 1
assertThat("Left action expected: $expectPageLeftAction",
- hasPageAction(customActions, ACTION_PAGE_LEFT.id),
+ hasPageAction(customActions, ACTION_ID_PAGE_LEFT),
equalTo(expectPageLeftAction)
)
assertThat("Right action expected: $expectPageRightAction",
- hasPageAction(customActions, ACTION_PAGE_RIGHT.id),
+ hasPageAction(customActions, ACTION_ID_PAGE_RIGHT),
equalTo(expectPageRightAction)
)
assertThat("Up action expected: $expectPageUpAction",
- hasPageAction(customActions, ACTION_PAGE_UP.id),
+ hasPageAction(customActions, ACTION_ID_PAGE_UP),
equalTo(expectPageUpAction)
)
assertThat("Down action expected: $expectPageDownAction",
- hasPageAction(customActions, ACTION_PAGE_DOWN.id),
+ hasPageAction(customActions, ACTION_ID_PAGE_DOWN),
equalTo(expectPageDownAction)
)
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BasicTest.java b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BasicTest.java
index d23c3d38..f8b2ec4 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BasicTest.java
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BasicTest.java
@@ -24,11 +24,13 @@
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
+import android.view.LayoutInflater;
import android.view.View;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.viewpager2.test.R;
import org.junit.Rule;
import org.junit.Test;
@@ -89,6 +91,14 @@
assertThat((int) ((Bundle) recreatedAdapterState[2]).get("key"), equalTo(3));
}
+ @Test
+ public void test_inflateWithScrollbars() {
+ // when
+ LayoutInflater.from(ApplicationProvider.getApplicationContext()).inflate(
+ R.layout.vertical_scrollbars, null);
+ // then it shouldn't crash
+ }
+
private Bundle createIntBundle(int value) {
Bundle bundle = new Bundle(1);
bundle.putInt("key", value);
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
index f208cf3..7d6e3a3 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
@@ -24,9 +24,6 @@
import android.view.animation.LinearInterpolator
import androidx.core.view.ViewCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_DOWN
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_LEFT
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_PAGE_RIGHT
import androidx.core.view.animation.PathInterpolatorCompat
import androidx.test.filters.LargeTest
import androidx.test.filters.SdkSuppress
@@ -291,7 +288,7 @@
@Test
fun test_startManualPeekAfterFakeDrag1Page() {
val vc = ViewConfiguration.get(test.viewPager.context)
- val touchSlop = vc.scaledTouchSlop
+ val touchSlop = vc.scaledPagingTouchSlop
val swipeDistance = touchSlop * 5f
val pageSize = test.viewPager.pageSize
val dragDistance = 1 + (pageSize / 2f - swipeDistance) / pageSize // ~1.4f
@@ -336,11 +333,11 @@
val isHorizontal = test.viewPager.isHorizontal
return if (useEnhancedA11y && isHorizontal && test.viewPager.isRtl) {
- ACTION_PAGE_LEFT.id
+ ACTION_ID_PAGE_LEFT
} else if (useEnhancedA11y && isHorizontal) {
- ACTION_PAGE_RIGHT.id
+ ACTION_ID_PAGE_RIGHT
} else if (useEnhancedA11y) {
- ACTION_PAGE_DOWN.id
+ ACTION_ID_PAGE_DOWN
} else {
ACTION_SCROLL_FORWARD
}
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
index f517deb..f257a8e2 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
@@ -701,7 +701,7 @@
var recorder = test.viewPager.addNewRecordingCallback()
val vc = ViewConfiguration.get(test.viewPager.context)
- val touchSlop = vc.scaledTouchSlop
+ val touchSlop = vc.scaledPagingTouchSlop
// when
tryNTimes(3, resetBlock = {
diff --git a/viewpager2/src/androidTest/res/layout/vertical_scrollbars.xml b/viewpager2/src/androidTest/res/layout/vertical_scrollbars.xml
new file mode 100644
index 0000000..3bd55cd
--- /dev/null
+++ b/viewpager2/src/androidTest/res/layout/vertical_scrollbars.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<androidx.viewpager2.widget.ViewPager2
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scrollbars="vertical"/>
\ No newline at end of file
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/MarginPageTransformer.java b/viewpager2/src/main/java/androidx/viewpager2/widget/MarginPageTransformer.java
index 8999a7c..0524f4b 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/MarginPageTransformer.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/MarginPageTransformer.java
@@ -56,7 +56,7 @@
float offset = mMarginPx * position;
if (viewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
- page.setTranslationX(viewPager.isLayoutRtl() ? -offset : offset);
+ page.setTranslationX(viewPager.isRtl() ? -offset : offset);
} else {
page.setTranslationY(offset);
}
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
index ee28e7e..620ed4a 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
@@ -170,7 +170,7 @@
if (mDispatchSelected) {
// Drag started settling, need to calculate target page and dispatch onPageSelected now
mDispatchSelected = false;
- boolean scrollingForward = dy > 0 || (dy == 0 && dx < 0 == mViewPager.isLayoutRtl());
+ boolean scrollingForward = dy > 0 || (dy == 0 && dx < 0 == mViewPager.isRtl());
// "&& values.mOffsetPx != 0": filters special case where we're scrolling forward and
// the first scroll event after settling already got us at the target
@@ -234,7 +234,7 @@
int start, sizePx;
if (isHorizontal) {
sizePx = firstVisibleView.getWidth() + margin.leftMargin + margin.rightMargin;
- if (!mViewPager.isLayoutRtl()) {
+ if (!mViewPager.isRtl()) {
start = firstVisibleView.getLeft() - margin.leftMargin;
} else {
start = sizePx - firstVisibleView.getRight() - margin.rightMargin;
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
index 732b198..9130ae1 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
@@ -181,6 +181,7 @@
mLayoutManager = new LinearLayoutManagerImpl(context);
mRecyclerView.setLayoutManager(mLayoutManager);
+ mRecyclerView.setScrollingTouchSlop(RecyclerView.TOUCH_SLOP_PAGING);
setOrientation(context, attrs);
mRecyclerView.setLayoutParams(
@@ -561,9 +562,8 @@
return mLayoutManager.getOrientation();
}
- boolean isLayoutRtl() {
- return mLayoutManager.getLayoutDirection()
- == androidx.core.view.ViewCompat.LAYOUT_DIRECTION_RTL;
+ boolean isRtl() {
+ return mLayoutManager.getLayoutDirection() == ViewCompat.LAYOUT_DIRECTION_RTL;
}
/**
@@ -1457,7 +1457,7 @@
}
if (getOrientation() == ORIENTATION_HORIZONTAL) {
- boolean isLayoutRtl = isLayoutRtl();
+ boolean isLayoutRtl = isRtl();
int actionIdPageForward = isLayoutRtl ? actionIdPageLeft : actionIdPageRight;
int actionIdPageBackward = isLayoutRtl ? actionIdPageRight : actionIdPageLeft;
diff --git a/work/workmanager-gcm/api/2.2.0-beta01.txt b/work/workmanager-gcm/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/2.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/2.3.0-alpha01.txt b/work/workmanager-gcm/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/2.3.0-alpha01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/current.txt b/work/workmanager-gcm/api/current.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-gcm/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-gcm/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-gcm/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-gcm/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-gcm/api/restricted_2.2.0-beta01.txt b/work/workmanager-gcm/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt b/work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/api/restricted_current.txt b/work/workmanager-gcm/api/restricted_current.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/work/workmanager-gcm/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/work/workmanager-gcm/build.gradle b/work/workmanager-gcm/build.gradle
index 8f763e1..6320ba1 100644
--- a/work/workmanager-gcm/build.gradle
+++ b/work/workmanager-gcm/build.gradle
@@ -68,7 +68,7 @@
androidx {
name = "Android WorkManager GCMNetworkManager Support"
- publish = Publish.NONE
+ publish = Publish.SNAPSHOT_AND_RELEASE
mavenVersion = LibraryVersions.WORK
mavenGroup = LibraryGroups.WORK
inceptionYear = "2019"
diff --git a/work/workmanager-ktx/api/2.2.0-alpha01.txt b/work/workmanager-ktx/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..4ed72f8
--- /dev/null
+++ b/work/workmanager-ktx/api/2.2.0-alpha01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+ ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+ method public abstract suspend Object doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result> p);
+ method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+ method public final void onStopped();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+ }
+
+ public final class DataKt {
+ ctor public DataKt();
+ method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class ListenableFutureKt {
+ ctor public ListenableFutureKt();
+ }
+
+ public final class OneTimeWorkRequestKt {
+ ctor public OneTimeWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+ method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+ }
+
+ public final class OperationKt {
+ ctor public OperationKt();
+ method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+ }
+
+ public final class PeriodicWorkRequestKt {
+ ctor public PeriodicWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+ }
+
+}
+
diff --git a/work/workmanager-ktx/api/2.2.0-beta01.txt b/work/workmanager-ktx/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..4ed72f8
--- /dev/null
+++ b/work/workmanager-ktx/api/2.2.0-beta01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+ ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+ method public abstract suspend Object doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result> p);
+ method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+ method public final void onStopped();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+ }
+
+ public final class DataKt {
+ ctor public DataKt();
+ method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class ListenableFutureKt {
+ ctor public ListenableFutureKt();
+ }
+
+ public final class OneTimeWorkRequestKt {
+ ctor public OneTimeWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+ method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+ }
+
+ public final class OperationKt {
+ ctor public OperationKt();
+ method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+ }
+
+ public final class PeriodicWorkRequestKt {
+ ctor public PeriodicWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+ }
+
+}
+
diff --git a/work/workmanager-ktx/api/2.3.0-alpha01.txt b/work/workmanager-ktx/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..4ed72f8
--- /dev/null
+++ b/work/workmanager-ktx/api/2.3.0-alpha01.txt
@@ -0,0 +1,42 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+ ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+ method public abstract suspend Object doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result> p);
+ method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+ method public final void onStopped();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+ }
+
+ public final class DataKt {
+ ctor public DataKt();
+ method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class ListenableFutureKt {
+ ctor public ListenableFutureKt();
+ }
+
+ public final class OneTimeWorkRequestKt {
+ ctor public OneTimeWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+ method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+ }
+
+ public final class OperationKt {
+ ctor public OperationKt();
+ method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+ }
+
+ public final class PeriodicWorkRequestKt {
+ ctor public PeriodicWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-ktx/api/res-2.2.0-alpha01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-ktx/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-ktx/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-ktx/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-ktx/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-ktx/api/restricted_2.2.0-alpha01.txt b/work/workmanager-ktx/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..2a2fd52
--- /dev/null
+++ b/work/workmanager-ktx/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,48 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+ ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+ method public abstract suspend Object doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result> p);
+ method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+ method public final void onStopped();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+ }
+
+ public final class DataKt {
+ ctor public DataKt();
+ method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public enum DirectExecutor implements java.util.concurrent.Executor {
+ method public void execute(Runnable command);
+ enum_constant public static final androidx.work.DirectExecutor INSTANCE;
+ }
+
+ public final class ListenableFutureKt {
+ ctor public ListenableFutureKt();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static suspend inline <R> Object! await(com.google.common.util.concurrent.ListenableFuture<R>, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+ public final class OneTimeWorkRequestKt {
+ ctor public OneTimeWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+ method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+ }
+
+ public final class OperationKt {
+ ctor public OperationKt();
+ method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+ }
+
+ public final class PeriodicWorkRequestKt {
+ ctor public PeriodicWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+ }
+
+}
+
diff --git a/work/workmanager-ktx/api/restricted_2.2.0-beta01.txt b/work/workmanager-ktx/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..2a2fd52
--- /dev/null
+++ b/work/workmanager-ktx/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,48 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+ ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+ method public abstract suspend Object doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result> p);
+ method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+ method public final void onStopped();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+ }
+
+ public final class DataKt {
+ ctor public DataKt();
+ method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public enum DirectExecutor implements java.util.concurrent.Executor {
+ method public void execute(Runnable command);
+ enum_constant public static final androidx.work.DirectExecutor INSTANCE;
+ }
+
+ public final class ListenableFutureKt {
+ ctor public ListenableFutureKt();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static suspend inline <R> Object! await(com.google.common.util.concurrent.ListenableFuture<R>, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+ public final class OneTimeWorkRequestKt {
+ ctor public OneTimeWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+ method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+ }
+
+ public final class OperationKt {
+ ctor public OperationKt();
+ method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+ }
+
+ public final class PeriodicWorkRequestKt {
+ ctor public PeriodicWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+ }
+
+}
+
diff --git a/work/workmanager-ktx/api/restricted_2.3.0-alpha01.txt b/work/workmanager-ktx/api/restricted_2.3.0-alpha01.txt
new file mode 100644
index 0000000..2a2fd52
--- /dev/null
+++ b/work/workmanager-ktx/api/restricted_2.3.0-alpha01.txt
@@ -0,0 +1,48 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+ ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+ method public abstract suspend Object doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result> p);
+ method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+ method public final void onStopped();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+ property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+ }
+
+ public final class DataKt {
+ ctor public DataKt();
+ method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public enum DirectExecutor implements java.util.concurrent.Executor {
+ method public void execute(Runnable command);
+ enum_constant public static final androidx.work.DirectExecutor INSTANCE;
+ }
+
+ public final class ListenableFutureKt {
+ ctor public ListenableFutureKt();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public static suspend inline <R> Object! await(com.google.common.util.concurrent.ListenableFuture<R>, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+ public final class OneTimeWorkRequestKt {
+ ctor public OneTimeWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder OneTimeWorkRequestBuilder();
+ method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+ }
+
+ public final class OperationKt {
+ ctor public OperationKt();
+ method public static suspend inline Object! await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS> p);
+ }
+
+ public final class PeriodicWorkRequestKt {
+ ctor public PeriodicWorkRequestKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+ method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+ }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/2.2.0-alpha01.txt b/work/workmanager-rxjava2/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/2.2.0-alpha01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class RxWorker extends androidx.work.ListenableWorker {
+ ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+ method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+ method protected io.reactivex.Scheduler getBackgroundScheduler();
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/2.2.0-beta01.txt b/work/workmanager-rxjava2/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/2.2.0-beta01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class RxWorker extends androidx.work.ListenableWorker {
+ ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+ method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+ method protected io.reactivex.Scheduler getBackgroundScheduler();
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/2.3.0-alpha01.txt b/work/workmanager-rxjava2/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/2.3.0-alpha01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class RxWorker extends androidx.work.ListenableWorker {
+ ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+ method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+ method protected io.reactivex.Scheduler getBackgroundScheduler();
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-rxjava2/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-rxjava2/api/res-2.2.0-alpha01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-rxjava2/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-rxjava2/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-rxjava2/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-rxjava2/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-rxjava2/api/restricted_2.2.0-alpha01.txt b/work/workmanager-rxjava2/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class RxWorker extends androidx.work.ListenableWorker {
+ ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+ method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+ method protected io.reactivex.Scheduler getBackgroundScheduler();
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/restricted_2.2.0-beta01.txt b/work/workmanager-rxjava2/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class RxWorker extends androidx.work.ListenableWorker {
+ ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+ method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+ method protected io.reactivex.Scheduler getBackgroundScheduler();
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+}
+
diff --git a/work/workmanager-rxjava2/api/restricted_2.3.0-alpha01.txt b/work/workmanager-rxjava2/api/restricted_2.3.0-alpha01.txt
new file mode 100644
index 0000000..e43f0e5
--- /dev/null
+++ b/work/workmanager-rxjava2/api/restricted_2.3.0-alpha01.txt
@@ -0,0 +1,12 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public abstract class RxWorker extends androidx.work.ListenableWorker {
+ ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+ method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+ method protected io.reactivex.Scheduler getBackgroundScheduler();
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+}
+
diff --git a/work/workmanager-testing/api/2.2.0-alpha01.txt b/work/workmanager-testing/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/2.2.0-alpha01.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+ public class SynchronousExecutor implements java.util.concurrent.Executor {
+ ctor public SynchronousExecutor();
+ method public void execute(Runnable);
+ }
+
+ public interface TestDriver {
+ method public void setAllConstraintsMet(java.util.UUID);
+ method public void setInitialDelayMet(java.util.UUID);
+ method public void setPeriodDelayMet(java.util.UUID);
+ }
+
+ public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+ method public W build();
+ method public static androidx.work.testing.TestListenableWorkerBuilder from(android.content.Context, androidx.work.WorkRequest);
+ method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setId(java.util.UUID);
+ method public androidx.work.testing.TestListenableWorkerBuilder setInputData(androidx.work.Data);
+ method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder setNetwork(android.net.Network);
+ method public androidx.work.testing.TestListenableWorkerBuilder setRunAttemptCount(int);
+ method public androidx.work.testing.TestListenableWorkerBuilder setTags(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentUris(java.util.List<android.net.Uri!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public final class TestListenableWorkerBuilderKt {
+ ctor public TestListenableWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W> TestListenableWorkerBuilder(android.content.Context context, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+ method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+ method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+ }
+
+ public final class TestWorkerBuilderKt {
+ ctor public TestWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public final class WorkManagerTestInitHelper {
+ method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+ method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+ }
+
+}
+
diff --git a/work/workmanager-testing/api/2.2.0-beta01.txt b/work/workmanager-testing/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/2.2.0-beta01.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+ public class SynchronousExecutor implements java.util.concurrent.Executor {
+ ctor public SynchronousExecutor();
+ method public void execute(Runnable);
+ }
+
+ public interface TestDriver {
+ method public void setAllConstraintsMet(java.util.UUID);
+ method public void setInitialDelayMet(java.util.UUID);
+ method public void setPeriodDelayMet(java.util.UUID);
+ }
+
+ public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+ method public W build();
+ method public static androidx.work.testing.TestListenableWorkerBuilder from(android.content.Context, androidx.work.WorkRequest);
+ method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setId(java.util.UUID);
+ method public androidx.work.testing.TestListenableWorkerBuilder setInputData(androidx.work.Data);
+ method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder setNetwork(android.net.Network);
+ method public androidx.work.testing.TestListenableWorkerBuilder setRunAttemptCount(int);
+ method public androidx.work.testing.TestListenableWorkerBuilder setTags(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentUris(java.util.List<android.net.Uri!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public final class TestListenableWorkerBuilderKt {
+ ctor public TestListenableWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W> TestListenableWorkerBuilder(android.content.Context context, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+ method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+ method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+ }
+
+ public final class TestWorkerBuilderKt {
+ ctor public TestWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public final class WorkManagerTestInitHelper {
+ method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+ method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+ }
+
+}
+
diff --git a/work/workmanager-testing/api/2.3.0-alpha01.txt b/work/workmanager-testing/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/2.3.0-alpha01.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+ public class SynchronousExecutor implements java.util.concurrent.Executor {
+ ctor public SynchronousExecutor();
+ method public void execute(Runnable);
+ }
+
+ public interface TestDriver {
+ method public void setAllConstraintsMet(java.util.UUID);
+ method public void setInitialDelayMet(java.util.UUID);
+ method public void setPeriodDelayMet(java.util.UUID);
+ }
+
+ public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+ method public W build();
+ method public static androidx.work.testing.TestListenableWorkerBuilder from(android.content.Context, androidx.work.WorkRequest);
+ method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setId(java.util.UUID);
+ method public androidx.work.testing.TestListenableWorkerBuilder setInputData(androidx.work.Data);
+ method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder setNetwork(android.net.Network);
+ method public androidx.work.testing.TestListenableWorkerBuilder setRunAttemptCount(int);
+ method public androidx.work.testing.TestListenableWorkerBuilder setTags(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentUris(java.util.List<android.net.Uri!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public final class TestListenableWorkerBuilderKt {
+ ctor public TestListenableWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W> TestListenableWorkerBuilder(android.content.Context context, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+ method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+ method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+ }
+
+ public final class TestWorkerBuilderKt {
+ ctor public TestWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public final class WorkManagerTestInitHelper {
+ method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+ method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-testing/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-testing/api/res-2.2.0-alpha01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-testing/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-testing/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager-testing/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager-testing/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager-testing/api/restricted_2.2.0-alpha01.txt b/work/workmanager-testing/api/restricted_2.2.0-alpha01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/restricted_2.2.0-alpha01.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+ public class SynchronousExecutor implements java.util.concurrent.Executor {
+ ctor public SynchronousExecutor();
+ method public void execute(Runnable);
+ }
+
+ public interface TestDriver {
+ method public void setAllConstraintsMet(java.util.UUID);
+ method public void setInitialDelayMet(java.util.UUID);
+ method public void setPeriodDelayMet(java.util.UUID);
+ }
+
+ public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+ method public W build();
+ method public static androidx.work.testing.TestListenableWorkerBuilder from(android.content.Context, androidx.work.WorkRequest);
+ method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setId(java.util.UUID);
+ method public androidx.work.testing.TestListenableWorkerBuilder setInputData(androidx.work.Data);
+ method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder setNetwork(android.net.Network);
+ method public androidx.work.testing.TestListenableWorkerBuilder setRunAttemptCount(int);
+ method public androidx.work.testing.TestListenableWorkerBuilder setTags(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentUris(java.util.List<android.net.Uri!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public final class TestListenableWorkerBuilderKt {
+ ctor public TestListenableWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W> TestListenableWorkerBuilder(android.content.Context context, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+ method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+ method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+ }
+
+ public final class TestWorkerBuilderKt {
+ ctor public TestWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public final class WorkManagerTestInitHelper {
+ method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+ method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+ }
+
+}
+
diff --git a/work/workmanager-testing/api/restricted_2.2.0-beta01.txt b/work/workmanager-testing/api/restricted_2.2.0-beta01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/restricted_2.2.0-beta01.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+ public class SynchronousExecutor implements java.util.concurrent.Executor {
+ ctor public SynchronousExecutor();
+ method public void execute(Runnable);
+ }
+
+ public interface TestDriver {
+ method public void setAllConstraintsMet(java.util.UUID);
+ method public void setInitialDelayMet(java.util.UUID);
+ method public void setPeriodDelayMet(java.util.UUID);
+ }
+
+ public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+ method public W build();
+ method public static androidx.work.testing.TestListenableWorkerBuilder from(android.content.Context, androidx.work.WorkRequest);
+ method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setId(java.util.UUID);
+ method public androidx.work.testing.TestListenableWorkerBuilder setInputData(androidx.work.Data);
+ method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder setNetwork(android.net.Network);
+ method public androidx.work.testing.TestListenableWorkerBuilder setRunAttemptCount(int);
+ method public androidx.work.testing.TestListenableWorkerBuilder setTags(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentUris(java.util.List<android.net.Uri!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public final class TestListenableWorkerBuilderKt {
+ ctor public TestListenableWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W> TestListenableWorkerBuilder(android.content.Context context, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+ method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+ method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+ }
+
+ public final class TestWorkerBuilderKt {
+ ctor public TestWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public final class WorkManagerTestInitHelper {
+ method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+ method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+ }
+
+}
+
diff --git a/work/workmanager-testing/api/restricted_2.3.0-alpha01.txt b/work/workmanager-testing/api/restricted_2.3.0-alpha01.txt
new file mode 100644
index 0000000..8827453
--- /dev/null
+++ b/work/workmanager-testing/api/restricted_2.3.0-alpha01.txt
@@ -0,0 +1,52 @@
+// Signature format: 3.0
+package androidx.work.testing {
+
+ public class SynchronousExecutor implements java.util.concurrent.Executor {
+ ctor public SynchronousExecutor();
+ method public void execute(Runnable);
+ }
+
+ public interface TestDriver {
+ method public void setAllConstraintsMet(java.util.UUID);
+ method public void setInitialDelayMet(java.util.UUID);
+ method public void setPeriodDelayMet(java.util.UUID);
+ }
+
+ public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+ method public W build();
+ method public static androidx.work.testing.TestListenableWorkerBuilder from(android.content.Context, androidx.work.WorkRequest);
+ method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setId(java.util.UUID);
+ method public androidx.work.testing.TestListenableWorkerBuilder setInputData(androidx.work.Data);
+ method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder setNetwork(android.net.Network);
+ method public androidx.work.testing.TestListenableWorkerBuilder setRunAttemptCount(int);
+ method public androidx.work.testing.TestListenableWorkerBuilder setTags(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+ method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder setTriggeredContentUris(java.util.List<android.net.Uri!>);
+ method public androidx.work.testing.TestListenableWorkerBuilder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public final class TestListenableWorkerBuilderKt {
+ ctor public TestListenableWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W> TestListenableWorkerBuilder(android.content.Context context, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+ method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+ method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+ }
+
+ public final class TestWorkerBuilderKt {
+ ctor public TestWorkerBuilderKt();
+ method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W> TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, androidx.work.Data inputData = androidx.work.Data.EMPTY, java.util.List<java.lang.String> tags = emptyList(), int runAttemptCount = 1, java.util.List<? extends android.net.Uri> triggeredContentUris = emptyList(), java.util.List<java.lang.String> triggeredContentAuthorities = emptyList());
+ }
+
+ public final class WorkManagerTestInitHelper {
+ method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+ method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context);
+ method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+ }
+
+}
+
diff --git a/work/workmanager/api/2.2.0-alpha01.txt b/work/workmanager/api/2.2.0-alpha01.txt
new file mode 100644
index 0000000..f0bff1a
--- /dev/null
+++ b/work/workmanager/api/2.2.0-alpha01.txt
@@ -0,0 +1,302 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+ ctor public ArrayCreatingInputMerger();
+ method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public enum BackoffPolicy {
+ enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+ enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+ }
+
+ public final class Configuration {
+ method public java.util.concurrent.Executor getExecutor();
+ method public int getMaxJobSchedulerId();
+ method public int getMinJobSchedulerId();
+ method public java.util.concurrent.Executor getTaskExecutor();
+ method public androidx.work.WorkerFactory getWorkerFactory();
+ field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+ }
+
+ public static final class Configuration.Builder {
+ ctor public Configuration.Builder();
+ method public androidx.work.Configuration build();
+ method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+ method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+ method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+ method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+ method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+ method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public static interface Configuration.Provider {
+ method public androidx.work.Configuration getWorkManagerConfiguration();
+ }
+
+ public final class Constraints {
+ ctor public Constraints(androidx.work.Constraints);
+ method public androidx.work.NetworkType getRequiredNetworkType();
+ method public boolean requiresBatteryNotLow();
+ method public boolean requiresCharging();
+ method @RequiresApi(23) public boolean requiresDeviceIdle();
+ method public boolean requiresStorageNotLow();
+ field public static final androidx.work.Constraints! NONE;
+ }
+
+ public static final class Constraints.Builder {
+ ctor public Constraints.Builder();
+ method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri, boolean);
+ method public androidx.work.Constraints build();
+ method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType);
+ method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean);
+ method public androidx.work.Constraints.Builder setRequiresCharging(boolean);
+ method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean);
+ method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean);
+ method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration!);
+ method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration!);
+ }
+
+ public final class Data {
+ ctor public Data(androidx.work.Data);
+ method public boolean getBoolean(String, boolean);
+ method public boolean[]? getBooleanArray(String);
+ method public byte getByte(String, byte);
+ method public byte[]? getByteArray(String);
+ method public double getDouble(String, double);
+ method public double[]? getDoubleArray(String);
+ method public float getFloat(String, float);
+ method public float[]? getFloatArray(String);
+ method public int getInt(String, int);
+ method public int[]? getIntArray(String);
+ method public java.util.Map<java.lang.String!,java.lang.Object!> getKeyValueMap();
+ method public long getLong(String, long);
+ method public long[]? getLongArray(String);
+ method public String? getString(String);
+ method public String![]? getStringArray(String);
+ field public static final androidx.work.Data! EMPTY;
+ field public static final int MAX_DATA_BYTES = 10240; // 0x2800
+ }
+
+ public static final class Data.Builder {
+ ctor public Data.Builder();
+ method public androidx.work.Data build();
+ method public androidx.work.Data.Builder putAll(androidx.work.Data);
+ method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String!,java.lang.Object!>);
+ method public androidx.work.Data.Builder putBoolean(String, boolean);
+ method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
+ method public androidx.work.Data.Builder putByte(String, byte);
+ method public androidx.work.Data.Builder putByteArray(String, byte[]);
+ method public androidx.work.Data.Builder putDouble(String, double);
+ method public androidx.work.Data.Builder putDoubleArray(String, double[]);
+ method public androidx.work.Data.Builder putFloat(String, float);
+ method public androidx.work.Data.Builder putFloatArray(String, float[]);
+ method public androidx.work.Data.Builder putInt(String, int);
+ method public androidx.work.Data.Builder putIntArray(String, int[]);
+ method public androidx.work.Data.Builder putLong(String, long);
+ method public androidx.work.Data.Builder putLongArray(String, long[]);
+ method public androidx.work.Data.Builder putString(String, String?);
+ method public androidx.work.Data.Builder putStringArray(String, String![]);
+ }
+
+ public class DelegatingWorkerFactory extends androidx.work.WorkerFactory {
+ ctor public DelegatingWorkerFactory();
+ method public final void addFactory(androidx.work.WorkerFactory);
+ method public final androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+ }
+
+ public enum ExistingPeriodicWorkPolicy {
+ enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
+ enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
+ }
+
+ public enum ExistingWorkPolicy {
+ enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
+ enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
+ enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
+ }
+
+ public abstract class InputMerger {
+ ctor public InputMerger();
+ method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public abstract class ListenableWorker {
+ ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+ method public final android.content.Context getApplicationContext();
+ method public final java.util.UUID getId();
+ method public final androidx.work.Data getInputData();
+ method @RequiresApi(28) public final android.net.Network? getNetwork();
+ method @IntRange(from=0) public final int getRunAttemptCount();
+ method public final java.util.Set<java.lang.String!> getTags();
+ method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+ method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+ method public final boolean isStopped();
+ method public void onStopped();
+ method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+ public abstract static class ListenableWorker.Result {
+ method public static androidx.work.ListenableWorker.Result failure();
+ method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
+ method public static androidx.work.ListenableWorker.Result retry();
+ method public static androidx.work.ListenableWorker.Result success();
+ method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
+ }
+
+ public enum NetworkType {
+ enum_constant public static final androidx.work.NetworkType CONNECTED;
+ enum_constant public static final androidx.work.NetworkType METERED;
+ enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
+ enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
+ enum_constant public static final androidx.work.NetworkType UNMETERED;
+ }
+
+ public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
+ method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker>);
+ method public static java.util.List<androidx.work.OneTimeWorkRequest!> from(java.util.List<java.lang.Class<? extends androidx.work.ListenableWorker>!>);
+ }
+
+ public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
+ ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>);
+ method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger>);
+ }
+
+ public interface Operation {
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS!> getResult();
+ method public androidx.lifecycle.LiveData<androidx.work.Operation.State!> getState();
+ }
+
+ public abstract static class Operation.State {
+ }
+
+ public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
+ ctor public Operation.State.FAILURE(Throwable);
+ method public Throwable getThrowable();
+ }
+
+ public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
+ }
+
+ public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
+ }
+
+ public final class OverwritingInputMerger extends androidx.work.InputMerger {
+ ctor public OverwritingInputMerger();
+ method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
+ field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
+ field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
+ }
+
+ public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
+ ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit);
+ ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration);
+ ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit, long, java.util.concurrent.TimeUnit);
+ ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration, java.time.Duration);
+ }
+
+ public abstract class WorkContinuation {
+ ctor public WorkContinuation();
+ method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation!>);
+ method public abstract androidx.work.Operation enqueue();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos();
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData();
+ method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+ }
+
+ public final class WorkInfo {
+ method public java.util.UUID getId();
+ method public androidx.work.Data getOutputData();
+ method @IntRange(from=0) public int getRunAttemptCount();
+ method public androidx.work.WorkInfo.State getState();
+ method public java.util.Set<java.lang.String!> getTags();
+ }
+
+ public enum WorkInfo.State {
+ method public boolean isFinished();
+ enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
+ enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
+ enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
+ enum_constant public static final androidx.work.WorkInfo.State FAILED;
+ enum_constant public static final androidx.work.WorkInfo.State RUNNING;
+ enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
+ }
+
+ public abstract class WorkManager {
+ method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method public abstract androidx.work.Operation cancelAllWork();
+ method public abstract androidx.work.Operation cancelAllWorkByTag(String);
+ method public abstract androidx.work.Operation cancelUniqueWork(String);
+ method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
+ method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
+ method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
+ method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+ method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method @Deprecated public static androidx.work.WorkManager getInstance();
+ method public static androidx.work.WorkManager getInstance(android.content.Context);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> getLastCancelAllTimeMillis();
+ method public abstract androidx.lifecycle.LiveData<java.lang.Long!> getLastCancelAllTimeMillisLiveData();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo!> getWorkInfoById(java.util.UUID);
+ method public abstract androidx.lifecycle.LiveData<androidx.work.WorkInfo!> getWorkInfoByIdLiveData(java.util.UUID);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTag(String);
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTagLiveData(String);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWork(String);
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWorkLiveData(String);
+ method public static void initialize(android.content.Context, androidx.work.Configuration);
+ method public abstract androidx.work.Operation pruneWork();
+ }
+
+ public abstract class WorkRequest {
+ method public java.util.UUID getId();
+ field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
+ field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
+ field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
+ }
+
+ public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder, W extends androidx.work.WorkRequest> {
+ method public final B addTag(String);
+ method public final W build();
+ method public final B keepResultsForAtLeast(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration);
+ method public final B setBackoffCriteria(androidx.work.BackoffPolicy, long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy, java.time.Duration);
+ method public final B setConstraints(androidx.work.Constraints);
+ method public B setInitialDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public B setInitialDelay(java.time.Duration);
+ method public final B setInputData(androidx.work.Data);
+ }
+
+ public abstract class Worker extends androidx.work.ListenableWorker {
+ ctor @Keep public Worker(android.content.Context, androidx.work.WorkerParameters);
+ method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+ public abstract class WorkerFactory {
+ ctor public WorkerFactory();
+ method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+ }
+
+ public final class WorkerParameters {
+ method public java.util.UUID getId();
+ method public androidx.work.Data getInputData();
+ method @RequiresApi(28) public android.net.Network? getNetwork();
+ method @IntRange(from=0) public int getRunAttemptCount();
+ method public java.util.Set<java.lang.String!> getTags();
+ method @RequiresApi(24) public java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+ method @RequiresApi(24) public java.util.List<android.net.Uri!> getTriggeredContentUris();
+ }
+
+}
+
diff --git a/work/workmanager/api/2.2.0-beta01.txt b/work/workmanager/api/2.2.0-beta01.txt
new file mode 100644
index 0000000..f0bff1a
--- /dev/null
+++ b/work/workmanager/api/2.2.0-beta01.txt
@@ -0,0 +1,302 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+ ctor public ArrayCreatingInputMerger();
+ method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public enum BackoffPolicy {
+ enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+ enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+ }
+
+ public final class Configuration {
+ method public java.util.concurrent.Executor getExecutor();
+ method public int getMaxJobSchedulerId();
+ method public int getMinJobSchedulerId();
+ method public java.util.concurrent.Executor getTaskExecutor();
+ method public androidx.work.WorkerFactory getWorkerFactory();
+ field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+ }
+
+ public static final class Configuration.Builder {
+ ctor public Configuration.Builder();
+ method public androidx.work.Configuration build();
+ method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+ method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+ method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+ method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+ method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+ method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public static interface Configuration.Provider {
+ method public androidx.work.Configuration getWorkManagerConfiguration();
+ }
+
+ public final class Constraints {
+ ctor public Constraints(androidx.work.Constraints);
+ method public androidx.work.NetworkType getRequiredNetworkType();
+ method public boolean requiresBatteryNotLow();
+ method public boolean requiresCharging();
+ method @RequiresApi(23) public boolean requiresDeviceIdle();
+ method public boolean requiresStorageNotLow();
+ field public static final androidx.work.Constraints! NONE;
+ }
+
+ public static final class Constraints.Builder {
+ ctor public Constraints.Builder();
+ method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri, boolean);
+ method public androidx.work.Constraints build();
+ method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType);
+ method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean);
+ method public androidx.work.Constraints.Builder setRequiresCharging(boolean);
+ method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean);
+ method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean);
+ method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration!);
+ method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration!);
+ }
+
+ public final class Data {
+ ctor public Data(androidx.work.Data);
+ method public boolean getBoolean(String, boolean);
+ method public boolean[]? getBooleanArray(String);
+ method public byte getByte(String, byte);
+ method public byte[]? getByteArray(String);
+ method public double getDouble(String, double);
+ method public double[]? getDoubleArray(String);
+ method public float getFloat(String, float);
+ method public float[]? getFloatArray(String);
+ method public int getInt(String, int);
+ method public int[]? getIntArray(String);
+ method public java.util.Map<java.lang.String!,java.lang.Object!> getKeyValueMap();
+ method public long getLong(String, long);
+ method public long[]? getLongArray(String);
+ method public String? getString(String);
+ method public String![]? getStringArray(String);
+ field public static final androidx.work.Data! EMPTY;
+ field public static final int MAX_DATA_BYTES = 10240; // 0x2800
+ }
+
+ public static final class Data.Builder {
+ ctor public Data.Builder();
+ method public androidx.work.Data build();
+ method public androidx.work.Data.Builder putAll(androidx.work.Data);
+ method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String!,java.lang.Object!>);
+ method public androidx.work.Data.Builder putBoolean(String, boolean);
+ method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
+ method public androidx.work.Data.Builder putByte(String, byte);
+ method public androidx.work.Data.Builder putByteArray(String, byte[]);
+ method public androidx.work.Data.Builder putDouble(String, double);
+ method public androidx.work.Data.Builder putDoubleArray(String, double[]);
+ method public androidx.work.Data.Builder putFloat(String, float);
+ method public androidx.work.Data.Builder putFloatArray(String, float[]);
+ method public androidx.work.Data.Builder putInt(String, int);
+ method public androidx.work.Data.Builder putIntArray(String, int[]);
+ method public androidx.work.Data.Builder putLong(String, long);
+ method public androidx.work.Data.Builder putLongArray(String, long[]);
+ method public androidx.work.Data.Builder putString(String, String?);
+ method public androidx.work.Data.Builder putStringArray(String, String![]);
+ }
+
+ public class DelegatingWorkerFactory extends androidx.work.WorkerFactory {
+ ctor public DelegatingWorkerFactory();
+ method public final void addFactory(androidx.work.WorkerFactory);
+ method public final androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+ }
+
+ public enum ExistingPeriodicWorkPolicy {
+ enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
+ enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
+ }
+
+ public enum ExistingWorkPolicy {
+ enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
+ enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
+ enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
+ }
+
+ public abstract class InputMerger {
+ ctor public InputMerger();
+ method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public abstract class ListenableWorker {
+ ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+ method public final android.content.Context getApplicationContext();
+ method public final java.util.UUID getId();
+ method public final androidx.work.Data getInputData();
+ method @RequiresApi(28) public final android.net.Network? getNetwork();
+ method @IntRange(from=0) public final int getRunAttemptCount();
+ method public final java.util.Set<java.lang.String!> getTags();
+ method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+ method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+ method public final boolean isStopped();
+ method public void onStopped();
+ method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+ public abstract static class ListenableWorker.Result {
+ method public static androidx.work.ListenableWorker.Result failure();
+ method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
+ method public static androidx.work.ListenableWorker.Result retry();
+ method public static androidx.work.ListenableWorker.Result success();
+ method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
+ }
+
+ public enum NetworkType {
+ enum_constant public static final androidx.work.NetworkType CONNECTED;
+ enum_constant public static final androidx.work.NetworkType METERED;
+ enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
+ enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
+ enum_constant public static final androidx.work.NetworkType UNMETERED;
+ }
+
+ public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
+ method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker>);
+ method public static java.util.List<androidx.work.OneTimeWorkRequest!> from(java.util.List<java.lang.Class<? extends androidx.work.ListenableWorker>!>);
+ }
+
+ public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
+ ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>);
+ method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger>);
+ }
+
+ public interface Operation {
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS!> getResult();
+ method public androidx.lifecycle.LiveData<androidx.work.Operation.State!> getState();
+ }
+
+ public abstract static class Operation.State {
+ }
+
+ public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
+ ctor public Operation.State.FAILURE(Throwable);
+ method public Throwable getThrowable();
+ }
+
+ public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
+ }
+
+ public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
+ }
+
+ public final class OverwritingInputMerger extends androidx.work.InputMerger {
+ ctor public OverwritingInputMerger();
+ method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
+ field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
+ field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
+ }
+
+ public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
+ ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit);
+ ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration);
+ ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit, long, java.util.concurrent.TimeUnit);
+ ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration, java.time.Duration);
+ }
+
+ public abstract class WorkContinuation {
+ ctor public WorkContinuation();
+ method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation!>);
+ method public abstract androidx.work.Operation enqueue();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos();
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData();
+ method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+ }
+
+ public final class WorkInfo {
+ method public java.util.UUID getId();
+ method public androidx.work.Data getOutputData();
+ method @IntRange(from=0) public int getRunAttemptCount();
+ method public androidx.work.WorkInfo.State getState();
+ method public java.util.Set<java.lang.String!> getTags();
+ }
+
+ public enum WorkInfo.State {
+ method public boolean isFinished();
+ enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
+ enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
+ enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
+ enum_constant public static final androidx.work.WorkInfo.State FAILED;
+ enum_constant public static final androidx.work.WorkInfo.State RUNNING;
+ enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
+ }
+
+ public abstract class WorkManager {
+ method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method public abstract androidx.work.Operation cancelAllWork();
+ method public abstract androidx.work.Operation cancelAllWorkByTag(String);
+ method public abstract androidx.work.Operation cancelUniqueWork(String);
+ method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
+ method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
+ method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
+ method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+ method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method @Deprecated public static androidx.work.WorkManager getInstance();
+ method public static androidx.work.WorkManager getInstance(android.content.Context);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> getLastCancelAllTimeMillis();
+ method public abstract androidx.lifecycle.LiveData<java.lang.Long!> getLastCancelAllTimeMillisLiveData();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo!> getWorkInfoById(java.util.UUID);
+ method public abstract androidx.lifecycle.LiveData<androidx.work.WorkInfo!> getWorkInfoByIdLiveData(java.util.UUID);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTag(String);
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTagLiveData(String);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWork(String);
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWorkLiveData(String);
+ method public static void initialize(android.content.Context, androidx.work.Configuration);
+ method public abstract androidx.work.Operation pruneWork();
+ }
+
+ public abstract class WorkRequest {
+ method public java.util.UUID getId();
+ field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
+ field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
+ field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
+ }
+
+ public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder, W extends androidx.work.WorkRequest> {
+ method public final B addTag(String);
+ method public final W build();
+ method public final B keepResultsForAtLeast(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration);
+ method public final B setBackoffCriteria(androidx.work.BackoffPolicy, long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy, java.time.Duration);
+ method public final B setConstraints(androidx.work.Constraints);
+ method public B setInitialDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public B setInitialDelay(java.time.Duration);
+ method public final B setInputData(androidx.work.Data);
+ }
+
+ public abstract class Worker extends androidx.work.ListenableWorker {
+ ctor @Keep public Worker(android.content.Context, androidx.work.WorkerParameters);
+ method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+ public abstract class WorkerFactory {
+ ctor public WorkerFactory();
+ method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+ }
+
+ public final class WorkerParameters {
+ method public java.util.UUID getId();
+ method public androidx.work.Data getInputData();
+ method @RequiresApi(28) public android.net.Network? getNetwork();
+ method @IntRange(from=0) public int getRunAttemptCount();
+ method public java.util.Set<java.lang.String!> getTags();
+ method @RequiresApi(24) public java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+ method @RequiresApi(24) public java.util.List<android.net.Uri!> getTriggeredContentUris();
+ }
+
+}
+
diff --git a/work/workmanager/api/2.3.0-alpha01.txt b/work/workmanager/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..f0bff1a
--- /dev/null
+++ b/work/workmanager/api/2.3.0-alpha01.txt
@@ -0,0 +1,302 @@
+// Signature format: 3.0
+package androidx.work {
+
+ public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+ ctor public ArrayCreatingInputMerger();
+ method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public enum BackoffPolicy {
+ enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+ enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+ }
+
+ public final class Configuration {
+ method public java.util.concurrent.Executor getExecutor();
+ method public int getMaxJobSchedulerId();
+ method public int getMinJobSchedulerId();
+ method public java.util.concurrent.Executor getTaskExecutor();
+ method public androidx.work.WorkerFactory getWorkerFactory();
+ field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+ }
+
+ public static final class Configuration.Builder {
+ ctor public Configuration.Builder();
+ method public androidx.work.Configuration build();
+ method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+ method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+ method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+ method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+ method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+ method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+ }
+
+ public static interface Configuration.Provider {
+ method public androidx.work.Configuration getWorkManagerConfiguration();
+ }
+
+ public final class Constraints {
+ ctor public Constraints(androidx.work.Constraints);
+ method public androidx.work.NetworkType getRequiredNetworkType();
+ method public boolean requiresBatteryNotLow();
+ method public boolean requiresCharging();
+ method @RequiresApi(23) public boolean requiresDeviceIdle();
+ method public boolean requiresStorageNotLow();
+ field public static final androidx.work.Constraints! NONE;
+ }
+
+ public static final class Constraints.Builder {
+ ctor public Constraints.Builder();
+ method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri, boolean);
+ method public androidx.work.Constraints build();
+ method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType);
+ method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean);
+ method public androidx.work.Constraints.Builder setRequiresCharging(boolean);
+ method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean);
+ method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean);
+ method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration!);
+ method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration!);
+ }
+
+ public final class Data {
+ ctor public Data(androidx.work.Data);
+ method public boolean getBoolean(String, boolean);
+ method public boolean[]? getBooleanArray(String);
+ method public byte getByte(String, byte);
+ method public byte[]? getByteArray(String);
+ method public double getDouble(String, double);
+ method public double[]? getDoubleArray(String);
+ method public float getFloat(String, float);
+ method public float[]? getFloatArray(String);
+ method public int getInt(String, int);
+ method public int[]? getIntArray(String);
+ method public java.util.Map<java.lang.String!,java.lang.Object!> getKeyValueMap();
+ method public long getLong(String, long);
+ method public long[]? getLongArray(String);
+ method public String? getString(String);
+ method public String![]? getStringArray(String);
+ field public static final androidx.work.Data! EMPTY;
+ field public static final int MAX_DATA_BYTES = 10240; // 0x2800
+ }
+
+ public static final class Data.Builder {
+ ctor public Data.Builder();
+ method public androidx.work.Data build();
+ method public androidx.work.Data.Builder putAll(androidx.work.Data);
+ method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String!,java.lang.Object!>);
+ method public androidx.work.Data.Builder putBoolean(String, boolean);
+ method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
+ method public androidx.work.Data.Builder putByte(String, byte);
+ method public androidx.work.Data.Builder putByteArray(String, byte[]);
+ method public androidx.work.Data.Builder putDouble(String, double);
+ method public androidx.work.Data.Builder putDoubleArray(String, double[]);
+ method public androidx.work.Data.Builder putFloat(String, float);
+ method public androidx.work.Data.Builder putFloatArray(String, float[]);
+ method public androidx.work.Data.Builder putInt(String, int);
+ method public androidx.work.Data.Builder putIntArray(String, int[]);
+ method public androidx.work.Data.Builder putLong(String, long);
+ method public androidx.work.Data.Builder putLongArray(String, long[]);
+ method public androidx.work.Data.Builder putString(String, String?);
+ method public androidx.work.Data.Builder putStringArray(String, String![]);
+ }
+
+ public class DelegatingWorkerFactory extends androidx.work.WorkerFactory {
+ ctor public DelegatingWorkerFactory();
+ method public final void addFactory(androidx.work.WorkerFactory);
+ method public final androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+ }
+
+ public enum ExistingPeriodicWorkPolicy {
+ enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
+ enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
+ }
+
+ public enum ExistingWorkPolicy {
+ enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
+ enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
+ enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
+ }
+
+ public abstract class InputMerger {
+ ctor public InputMerger();
+ method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public abstract class ListenableWorker {
+ ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+ method public final android.content.Context getApplicationContext();
+ method public final java.util.UUID getId();
+ method public final androidx.work.Data getInputData();
+ method @RequiresApi(28) public final android.net.Network? getNetwork();
+ method @IntRange(from=0) public final int getRunAttemptCount();
+ method public final java.util.Set<java.lang.String!> getTags();
+ method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+ method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+ method public final boolean isStopped();
+ method public void onStopped();
+ method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+ public abstract static class ListenableWorker.Result {
+ method public static androidx.work.ListenableWorker.Result failure();
+ method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
+ method public static androidx.work.ListenableWorker.Result retry();
+ method public static androidx.work.ListenableWorker.Result success();
+ method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
+ }
+
+ public enum NetworkType {
+ enum_constant public static final androidx.work.NetworkType CONNECTED;
+ enum_constant public static final androidx.work.NetworkType METERED;
+ enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
+ enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
+ enum_constant public static final androidx.work.NetworkType UNMETERED;
+ }
+
+ public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
+ method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker>);
+ method public static java.util.List<androidx.work.OneTimeWorkRequest!> from(java.util.List<java.lang.Class<? extends androidx.work.ListenableWorker>!>);
+ }
+
+ public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
+ ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>);
+ method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger>);
+ }
+
+ public interface Operation {
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS!> getResult();
+ method public androidx.lifecycle.LiveData<androidx.work.Operation.State!> getState();
+ }
+
+ public abstract static class Operation.State {
+ }
+
+ public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
+ ctor public Operation.State.FAILURE(Throwable);
+ method public Throwable getThrowable();
+ }
+
+ public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
+ }
+
+ public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
+ }
+
+ public final class OverwritingInputMerger extends androidx.work.InputMerger {
+ ctor public OverwritingInputMerger();
+ method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+ }
+
+ public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
+ field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
+ field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
+ }
+
+ public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
+ ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit);
+ ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration);
+ ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, long, java.util.concurrent.TimeUnit, long, java.util.concurrent.TimeUnit);
+ ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker>, java.time.Duration, java.time.Duration);
+ }
+
+ public abstract class WorkContinuation {
+ ctor public WorkContinuation();
+ method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation!>);
+ method public abstract androidx.work.Operation enqueue();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos();
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData();
+ method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+ }
+
+ public final class WorkInfo {
+ method public java.util.UUID getId();
+ method public androidx.work.Data getOutputData();
+ method @IntRange(from=0) public int getRunAttemptCount();
+ method public androidx.work.WorkInfo.State getState();
+ method public java.util.Set<java.lang.String!> getTags();
+ }
+
+ public enum WorkInfo.State {
+ method public boolean isFinished();
+ enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
+ enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
+ enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
+ enum_constant public static final androidx.work.WorkInfo.State FAILED;
+ enum_constant public static final androidx.work.WorkInfo.State RUNNING;
+ enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
+ }
+
+ public abstract class WorkManager {
+ method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method public abstract androidx.work.Operation cancelAllWork();
+ method public abstract androidx.work.Operation cancelAllWorkByTag(String);
+ method public abstract androidx.work.Operation cancelUniqueWork(String);
+ method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
+ method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
+ method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
+ method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+ method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+ method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+ method @Deprecated public static androidx.work.WorkManager getInstance();
+ method public static androidx.work.WorkManager getInstance(android.content.Context);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> getLastCancelAllTimeMillis();
+ method public abstract androidx.lifecycle.LiveData<java.lang.Long!> getLastCancelAllTimeMillisLiveData();
+ method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo!> getWorkInfoById(java.util.UUID);
+ method public abstract androidx.lifecycle.LiveData<androidx.work.WorkInfo!> getWorkInfoByIdLiveData(java.util.UUID);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTag(String);
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTagLiveData(String);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWork(String);
+ method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWorkLiveData(String);
+ method public static void initialize(android.content.Context, androidx.work.Configuration);
+ method public abstract androidx.work.Operation pruneWork();
+ }
+
+ public abstract class WorkRequest {
+ method public java.util.UUID getId();
+ field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
+ field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
+ field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
+ }
+
+ public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder, W extends androidx.work.WorkRequest> {
+ method public final B addTag(String);
+ method public final W build();
+ method public final B keepResultsForAtLeast(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration);
+ method public final B setBackoffCriteria(androidx.work.BackoffPolicy, long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy, java.time.Duration);
+ method public final B setConstraints(androidx.work.Constraints);
+ method public B setInitialDelay(long, java.util.concurrent.TimeUnit);
+ method @RequiresApi(26) public B setInitialDelay(java.time.Duration);
+ method public final B setInputData(androidx.work.Data);
+ }
+
+ public abstract class Worker extends androidx.work.ListenableWorker {
+ ctor @Keep public Worker(android.content.Context, androidx.work.WorkerParameters);
+ method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
+ method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+ }
+
+ public abstract class WorkerFactory {
+ ctor public WorkerFactory();
+ method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+ }
+
+ public final class WorkerParameters {
+ method public java.util.UUID getId();
+ method public androidx.work.Data getInputData();
+ method @RequiresApi(28) public android.net.Network? getNetwork();
+ method @IntRange(from=0) public int getRunAttemptCount();
+ method public java.util.Set<java.lang.String!> getTags();
+ method @RequiresApi(24) public java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+ method @RequiresApi(24) public java.util.List<android.net.Uri!> getTriggeredContentUris();
+ }
+
+}
+
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager/api/res-2.2.0-alpha01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager/api/res-2.2.0-beta01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager/api/res-2.2.0-beta01.txt
diff --git a/viewpager2/api/res-1.0.0-beta00.txt b/work/workmanager/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to work/workmanager/api/res-2.3.0-alpha01.txt