Merge "Clear-up confusion in EmptyResultSetException documentation." into androidx-master-dev
diff --git a/activity/activity/build.gradle b/activity/activity/build.gradle
index d4480b5..81bb273 100644
--- a/activity/activity/build.gradle
+++ b/activity/activity/build.gradle
@@ -21,7 +21,7 @@
api("androidx.core:core:1.1.0-rc01")
api(project(":lifecycle:lifecycle-runtime"))
api(project(":lifecycle:lifecycle-viewmodel"))
- api(project(":savedstate"))
+ api("androidx.savedstate:savedstate:1.0.0-rc01")
androidTestImplementation(KOTLIN_STDLIB)
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
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/main/java/androidx/appcompat/widget/AppCompatTextHelper.java b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
index 04e6892..fb97e5e 100644
--- a/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
+++ b/appcompat/src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java
@@ -16,7 +16,6 @@
package androidx.appcompat.widget;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import static androidx.core.widget.AutoSizeableTextView.PLATFORM_SUPPORTS_AUTOSIZE;
@@ -330,79 +329,6 @@
}
}
- // To accessible from callback */
- /** @hide */
- @RestrictTo(LIBRARY)
- public void setTypefaceByCallback(@NonNull Typeface typeface) {
- if (mAsyncFontPending) {
- mView.setTypeface(typeface);
- mFontTypeface = typeface;
- }
- }
-
- // To accessible from callback */
- /** @hide */
- @RestrictTo(LIBRARY)
- public void runOnUiThread(@NonNull Runnable runnable) {
- mView.post(runnable);
- }
-
- /**
- * Helper class for applying Typeface on UI thread.
- */
- private static class ApplyTextViewCallback extends ResourcesCompat.FontCallback {
- private class TypefaceApplyCallback implements Runnable {
- private final WeakReference<AppCompatTextHelper> mParent;
- private final Typeface mTypeface;
-
- TypefaceApplyCallback(@NonNull WeakReference<AppCompatTextHelper> parent,
- @NonNull Typeface tf) {
- mParent = parent;
- mTypeface = tf;
- }
-
- @Override
- public void run() {
- final AppCompatTextHelper parent = mParent.get();
- if (parent == null) {
- return; // The view has gone. Do nothing.
- }
- parent.setTypefaceByCallback(mTypeface);
- }
- }
-
- private final WeakReference<AppCompatTextHelper> mParent;
- private final int mFontWeight;
- private final int mStyle;
-
- ApplyTextViewCallback(@NonNull AppCompatTextHelper parent, int fontWeight,
- int style) {
- mParent = new WeakReference<>(parent);
- mFontWeight = fontWeight;
- mStyle = style;
- }
-
- @Override
- public void onFontRetrieved(@NonNull Typeface typeface) {
- final AppCompatTextHelper parent = mParent.get();
- if (parent == null) {
- return; // The view has gone. Do nothing
- }
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
- if (mFontWeight != TEXT_FONT_WEIGHT_UNSPECIFIED) {
- typeface = Typeface.create(typeface, mFontWeight,
- (mStyle & Typeface.ITALIC) != 0);
- }
- }
- parent.runOnUiThread(new TypefaceApplyCallback(mParent, typeface));
- }
-
- @Override
- public void onFontRetrievalFailed(int reason) {
- // Do nothing.
- }
- }
-
private void updateTypefaceAndStyle(Context context, TintTypedArray a) {
mStyle = a.getInt(R.styleable.TextAppearance_android_textStyle, mStyle);
@@ -423,8 +349,24 @@
final int fontWeight = mFontWeight;
final int style = mStyle;
if (!context.isRestricted()) {
- ResourcesCompat.FontCallback replyCallback = new ApplyTextViewCallback(
- this, fontWeight, style);
+ final WeakReference<TextView> textViewWeak = new WeakReference<>(mView);
+ ResourcesCompat.FontCallback replyCallback = new ResourcesCompat.FontCallback() {
+ @Override
+ public void onFontRetrieved(@NonNull Typeface typeface) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ if (fontWeight != TEXT_FONT_WEIGHT_UNSPECIFIED) {
+ typeface = Typeface.create(typeface, fontWeight,
+ (style & Typeface.ITALIC) != 0);
+ }
+ }
+ onAsyncTypefaceReceived(textViewWeak, typeface);
+ }
+
+ @Override
+ public void onFontRetrievalFailed(int reason) {
+ // Do nothing.
+ }
+ };
try {
// Note the callback will be triggered on the UI thread.
final Typeface typeface = a.getFont(fontFamilyId, mStyle, replyCallback);
@@ -481,6 +423,17 @@
}
}
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ void onAsyncTypefaceReceived(WeakReference<TextView> textViewWeak, Typeface typeface) {
+ if (mAsyncFontPending) {
+ mFontTypeface = typeface;
+ final TextView textView = textViewWeak.get();
+ if (textView != null) {
+ textView.setTypeface(typeface, mStyle);
+ }
+ }
+ }
+
void onSetTextAppearance(Context context, int resId) {
final TintTypedArray a = TintTypedArray.obtainStyledAttributes(context,
resId, R.styleable.TextAppearance);
diff --git a/benchmark/benchmark/build.gradle b/benchmark/benchmark/build.gradle
new file mode 100644
index 0000000..21a0621
--- /dev/null
+++ b/benchmark/benchmark/build.gradle
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+import static androidx.build.dependencies.DependenciesKt.*
+
+plugins {
+ id("AndroidXPlugin")
+ id("com.android.library")
+ id("kotlin-android")
+}
+
+dependencies {
+ androidTestImplementation(project(":benchmark"))
+ androidTestImplementation(ANDROIDX_TEST_RUNNER)
+ androidTestImplementation(ANDROIDX_TEST_RULES)
+ androidTestImplementation(JUNIT)
+ androidTestImplementation(KOTLIN_STDLIB)
+}
diff --git a/benchmark/benchmark/src/androidTest/AndroidManifest.xml b/benchmark/benchmark/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..82470db
--- /dev/null
+++ b/benchmark/benchmark/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 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.benchmark.benchmark.test">
+
+ <!-- Important: disable debuggable for accurate performance results -->
+ <application
+ android:debuggable="false"
+ tools:replace="android:debuggable">
+ </application>
+</manifest>
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/ParameterizedBenchmark.kt b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/ParameterizedBenchmark.kt
similarity index 90%
rename from benchmark/src/androidTest/java/androidx/benchmark/ParameterizedBenchmark.kt
rename to benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/ParameterizedBenchmark.kt
index 975d071..214aea1 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/ParameterizedBenchmark.kt
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/ParameterizedBenchmark.kt
@@ -14,8 +14,10 @@
* limitations under the License.
*/
-package androidx.benchmark
+package androidx.benchmark.benchmark
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
import androidx.test.filters.LargeTest
import org.junit.Rule
import org.junit.Test
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/SynchronizedBenchmark.kt b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/SynchronizedBenchmark.kt
similarity index 91%
rename from benchmark/src/androidTest/java/androidx/benchmark/SynchronizedBenchmark.kt
rename to benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/SynchronizedBenchmark.kt
index 635724e..5cadaf8 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/SynchronizedBenchmark.kt
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/SynchronizedBenchmark.kt
@@ -14,8 +14,10 @@
* limitations under the License.
*/
-package androidx.benchmark
+package androidx.benchmark.benchmark
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
import androidx.test.filters.LargeTest
import org.junit.Rule
import org.junit.Test
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmarkJava.java b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialJavaBenchmark.java
similarity index 88%
rename from benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmarkJava.java
rename to benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialJavaBenchmark.java
index bfc5294..bfad065 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmarkJava.java
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialJavaBenchmark.java
@@ -14,8 +14,10 @@
* limitations under the License.
*/
-package androidx.benchmark;
+package androidx.benchmark.benchmark;
+import androidx.benchmark.BenchmarkRule;
+import androidx.benchmark.BenchmarkState;
import androidx.test.filters.LargeTest;
import org.junit.Rule;
@@ -25,7 +27,7 @@
@LargeTest
@RunWith(JUnit4.class)
-public class TrivialBenchmarkJava {
+public class TrivialJavaBenchmark {
@Rule
public BenchmarkRule mBenchmarkRule = new BenchmarkRule();
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmark.kt b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialKotlinBenchmark.kt
similarity index 82%
rename from benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmark.kt
rename to benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialKotlinBenchmark.kt
index cf455f5..c06742f 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/TrivialBenchmark.kt
+++ b/benchmark/benchmark/src/androidTest/java/androidx/benchmark/benchmark/TrivialKotlinBenchmark.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2018 The Android Open Source Project
+ * 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.
@@ -14,8 +14,10 @@
* limitations under the License.
*/
-package androidx.benchmark
+package androidx.benchmark.benchmark
+import androidx.benchmark.BenchmarkRule
+import androidx.benchmark.measureRepeated
import androidx.test.filters.LargeTest
import org.junit.Rule
import org.junit.Test
@@ -24,7 +26,7 @@
@LargeTest
@RunWith(JUnit4::class)
-class TrivialBenchmark {
+class TrivialKotlinBenchmark {
@get:Rule
val benchmarkRule = BenchmarkRule()
diff --git a/benchmark/benchmark/src/main/AndroidManifest.xml b/benchmark/benchmark/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f290972
--- /dev/null
+++ b/benchmark/benchmark/src/main/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<!--
+ ~ Copyright (C) 2018 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"
+ package="androidx.benchmark.benchmark"/>
diff --git a/benchmark/build.gradle b/benchmark/build.gradle
index ceacac0..386f71d 100644
--- a/benchmark/build.gradle
+++ b/benchmark/build.gradle
@@ -32,7 +32,7 @@
implementation(SUPPORT_ANNOTATIONS)
androidTestImplementation(ANDROIDX_TEST_CORE)
- androidTestImplementation(JUNIT)
+ androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
}
androidx {
diff --git a/benchmark/src/androidTest/AndroidManifest.xml b/benchmark/src/androidTest/AndroidManifest.xml
index a64019e..ccafe73 100644
--- a/benchmark/src/androidTest/AndroidManifest.xml
+++ b/benchmark/src/androidTest/AndroidManifest.xml
@@ -19,11 +19,7 @@
xmlns:tools="http://schemas.android.com/tools"
package="androidx.benchmark.test">
-
- <!-- Important: disable debuggable for accurate performance results -->
- <application
- android:debuggable="false"
- tools:replace="android:debuggable">
+ <application>
<activity android:name="android.app.Activity"/>
</application>
-</manifest>
+</manifest>
\ No newline at end of file
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/ActivityBenchmarkTests.kt b/benchmark/src/androidTest/java/androidx/benchmark/ActivityBenchmarkTests.kt
new file mode 100644
index 0000000..a053d3a
--- /dev/null
+++ b/benchmark/src/androidTest/java/androidx/benchmark/ActivityBenchmarkTests.kt
@@ -0,0 +1,90 @@
+/*
+ * 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.benchmark
+
+import android.app.Activity
+import androidx.test.annotation.UiThreadTest
+import androidx.test.core.app.ActivityScenario
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.filters.LargeTest
+import androidx.test.rule.ActivityTestRule
+import org.junit.Assert
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+fun BenchmarkRule.validateRunWithIsolationActivityHidden() {
+ // isolation activity *not* on top
+ Assert.assertFalse(IsolationActivity.singleton.get()!!.resumed)
+
+ measureRepeated {}
+}
+
+@LargeTest
+@RunWith(JUnit4::class)
+class ActivityScenarioTest {
+ @get:Rule
+ val benchmarkRule = BenchmarkRule(enableReport = false)
+
+ private lateinit var activityScenario: ActivityScenario<Activity>
+
+ @Before
+ fun setup() {
+ activityScenario = ActivityScenario.launch(Activity::class.java)
+ }
+
+ @Test
+ fun verifyActivityLaunched() {
+ activityScenario.onActivity {
+ benchmarkRule.validateRunWithIsolationActivityHidden()
+ }
+ }
+}
+
+@LargeTest
+@RunWith(JUnit4::class)
+class ActivityScenarioRuleTest {
+ @get:Rule
+ val benchmarkRule = BenchmarkRule(enableReport = false)
+
+ @get:Rule
+ val activityRule = ActivityScenarioRule(Activity::class.java)
+
+ @UiThreadTest
+ @Test
+ fun verifyActivityLaunched() {
+ benchmarkRule.validateRunWithIsolationActivityHidden()
+ }
+}
+
+@LargeTest
+@RunWith(JUnit4::class)
+class ActivityTestRuleTest {
+ @get:Rule
+ val benchmarkRule = BenchmarkRule(enableReport = false)
+
+ @get:Rule
+ val activityRule = ActivityTestRule(Activity::class.java)
+
+ @UiThreadTest
+ @Test
+ fun verifyActivityLaunched() {
+ benchmarkRule.validateRunWithIsolationActivityHidden()
+ }
+}
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/ActivityScenarioBenchmark.kt b/benchmark/src/androidTest/java/androidx/benchmark/ActivityScenarioBenchmark.kt
deleted file mode 100644
index 164edd2..0000000
--- a/benchmark/src/androidTest/java/androidx/benchmark/ActivityScenarioBenchmark.kt
+++ /dev/null
@@ -1,54 +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.benchmark
-
-import android.app.Activity
-import androidx.test.core.app.ActivityScenario
-import androidx.test.filters.LargeTest
-import org.junit.Assert.assertFalse
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@LargeTest
-@RunWith(JUnit4::class)
-class ActivityScenarioBenchmark {
- @get:Rule
- val benchmarkRule = BenchmarkRule()
-
- private lateinit var activityScenario: ActivityScenario<Activity>
-
- @Before
- fun setup() {
- activityScenario = ActivityScenario.launch(Activity::class.java)
- }
-
- @Test
- fun activityScenario() {
- activityScenario.onActivity {
- // isolation activity *not* on top
- assertFalse(IsolationActivity.singleton.get()!!.resumed)
-
- var i = 0
- benchmarkRule.measureRepeated {
- i++
- }
- }
- }
-}
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/ActivityTestRuleBenchmark.kt b/benchmark/src/androidTest/java/androidx/benchmark/ActivityTestRuleBenchmark.kt
deleted file mode 100644
index 6c8b06d..0000000
--- a/benchmark/src/androidTest/java/androidx/benchmark/ActivityTestRuleBenchmark.kt
+++ /dev/null
@@ -1,49 +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.benchmark
-
-import android.app.Activity
-import androidx.test.annotation.UiThreadTest
-import androidx.test.filters.LargeTest
-import androidx.test.rule.ActivityTestRule
-import org.junit.Assert.assertFalse
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@LargeTest
-@RunWith(JUnit4::class)
-class ActivityTestRuleBenchmark {
- @get:Rule
- val benchmarkRule = BenchmarkRule()
-
- @get:Rule
- val activityRule = ActivityTestRule(Activity::class.java)
-
- @UiThreadTest
- @Test
- fun activityTestRule() {
- // isolation activity *not* on top
- assertFalse(IsolationActivity.singleton.get()!!.resumed)
-
- var i = 0
- benchmarkRule.measureRepeated {
- i++
- }
- }
-}
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleAnnotationTest.kt b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleAnnotationTest.kt
index 10e52cb..c6c8ddc 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleAnnotationTest.kt
+++ b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleAnnotationTest.kt
@@ -26,7 +26,7 @@
class BenchmarkRuleAnnotationTest {
@Suppress("MemberVisibilityCanBePrivate") // intentionally public
// NOTE: not annotated, so will throw when state is accessed
- val unannotatedRule = BenchmarkRule()
+ val unannotatedRule = BenchmarkRule(enableReport = false)
@Test(expected = IllegalStateException::class)
fun throwsIfNotAnnotated() {
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleTest.kt b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleTest.kt
index edffb71..8e988f0 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleTest.kt
+++ b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkRuleTest.kt
@@ -28,7 +28,7 @@
@RunWith(JUnit4::class)
class BenchmarkRuleTest {
@get:Rule
- val benchmarkRule = BenchmarkRule()
+ val benchmarkRule = BenchmarkRule(enableReport = false)
@Test
fun runWithTimingDisabled() {
diff --git a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
index 56da1d5..afeeceb 100644
--- a/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
+++ b/benchmark/src/androidTest/java/androidx/benchmark/BenchmarkStateTest.kt
@@ -57,6 +57,8 @@
@Test
fun iterationCheck() {
val state = BenchmarkState()
+ // disable thermal throttle checks, since it can cause loops to be thrown out
+ state.performThrottleChecks = false
var total = 0
while (state.keepRunning()) {
total++
diff --git a/benchmark/src/main/java/androidx/benchmark/BenchmarkRule.kt b/benchmark/src/main/java/androidx/benchmark/BenchmarkRule.kt
index 71c4473..f185133 100644
--- a/benchmark/src/main/java/androidx/benchmark/BenchmarkRule.kt
+++ b/benchmark/src/main/java/androidx/benchmark/BenchmarkRule.kt
@@ -19,6 +19,7 @@
import android.Manifest
import android.util.Log
import androidx.annotation.RestrictTo
+import androidx.benchmark.WarningState.WARNING_PREFIX
import androidx.test.rule.GrantPermissionRule
import org.junit.Assert.assertTrue
import org.junit.rules.RuleChain
@@ -71,10 +72,24 @@
* Every test in the Class using this @Rule must contain a single benchmark.
*/
class BenchmarkRule : TestRule {
+ constructor() {
+ this.enableReport = true
+ }
+
+ internal constructor(enableReport: Boolean) {
+ this.enableReport = enableReport
+ }
+
internal // synthetic access
val internalState = BenchmarkState()
/**
+ * Used to disable reporting, for correctness tests that shouldn't report values
+ * (and would trigger warnings if they did, e.g. debuggable=true)
+ */
+ private val enableReport: Boolean
+
+ /**
* Object used for benchmarking in Java.
*
* ```
@@ -173,16 +188,18 @@
base.evaluate()
- val fullTestName = WarningState.WARNING_PREFIX +
- description.testClass.simpleName + "." + invokeMethodName
- internalState.sendStatus(fullTestName)
+ if (enableReport) {
+ val fullTestName =
+ WARNING_PREFIX + description.testClass.simpleName + "." + invokeMethodName
+ internalState.sendStatus(fullTestName)
- ResultWriter.appendReport(
- internalState.getReport(
- testName = WarningState.WARNING_PREFIX + invokeMethodName,
- className = description.className
+ ResultWriter.appendReport(
+ internalState.getReport(
+ testName = WARNING_PREFIX + invokeMethodName,
+ className = description.className
+ )
)
- )
+ }
}
internal companion object {
diff --git a/biometric/api/1.0.0-alpha05.txt b/biometric/api/1.0.0-alpha05.txt
index e5381d0..63a2dfc 100644
--- a/biometric/api/1.0.0-alpha05.txt
+++ b/biometric/api/1.0.0-alpha05.txt
@@ -11,8 +11,8 @@
}
public class BiometricPrompt {
- ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
- ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
+ ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
+ ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
method public void cancelAuthentication();
diff --git a/biometric/api/current.txt b/biometric/api/current.txt
index e5381d0..63a2dfc 100644
--- a/biometric/api/current.txt
+++ b/biometric/api/current.txt
@@ -11,8 +11,8 @@
}
public class BiometricPrompt {
- ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
- ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
+ ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
+ ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
method public void cancelAuthentication();
diff --git a/biometric/api/restricted_1.0.0-alpha05.txt b/biometric/api/restricted_1.0.0-alpha05.txt
index b6d2c02..50e897bd 100644
--- a/biometric/api/restricted_1.0.0-alpha05.txt
+++ b/biometric/api/restricted_1.0.0-alpha05.txt
@@ -13,8 +13,8 @@
}
public class BiometricPrompt implements androidx.biometric.BiometricConstants {
- ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
- ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
+ ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
+ ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
method public void cancelAuthentication();
diff --git a/biometric/api/restricted_current.txt b/biometric/api/restricted_current.txt
index b6d2c02..50e897bd 100644
--- a/biometric/api/restricted_current.txt
+++ b/biometric/api/restricted_current.txt
@@ -13,8 +13,8 @@
}
public class BiometricPrompt implements androidx.biometric.BiometricConstants {
- ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
- ctor public BiometricPrompt(androidx.fragment.app.Fragment, androidx.biometric.BiometricPrompt.AuthenticationCallback, java.util.concurrent.Executor);
+ ctor public BiometricPrompt(androidx.fragment.app.FragmentActivity, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
+ ctor public BiometricPrompt(androidx.fragment.app.Fragment, java.util.concurrent.Executor, androidx.biometric.BiometricPrompt.AuthenticationCallback);
method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo, androidx.biometric.BiometricPrompt.CryptoObject);
method public void authenticate(androidx.biometric.BiometricPrompt.PromptInfo);
method public void cancelAuthentication();
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 6d20e90..8e9d6c5 100644
--- a/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
+++ b/biometric/src/main/java/androidx/biometric/BiometricPrompt.java
@@ -522,20 +522,21 @@
* such as {@link FragmentActivity#onCreate(Bundle)}.
*
* @param fragmentActivity A reference to the client's activity.
- * @param callback An object to receive authentication events.
* @param executor An executor to handle callback events.
+ * @param callback An object to receive authentication events.
*/
+ @SuppressLint("LambdaLast")
public BiometricPrompt(@NonNull FragmentActivity fragmentActivity,
- @NonNull AuthenticationCallback callback, @NonNull Executor executor) {
+ @NonNull Executor executor, @NonNull AuthenticationCallback callback) {
if (fragmentActivity == null) {
throw new IllegalArgumentException("FragmentActivity must not be null");
}
- if (callback == null) {
- throw new IllegalArgumentException("AuthenticationCallback must not be null");
- }
if (executor == null) {
throw new IllegalArgumentException("Executor must not be null");
}
+ if (callback == null) {
+ throw new IllegalArgumentException("AuthenticationCallback must not be null");
+ }
mFragmentActivity = fragmentActivity;
mAuthenticationCallback = callback;
mExecutor = executor;
@@ -555,20 +556,21 @@
* such as {@link Fragment#onCreate(Bundle)}.
*
* @param fragment A reference to the client's fragment.
- * @param callback An object to receive authentication events.
* @param executor An executor to handle callback events.
+ * @param callback An object to receive authentication events.
*/
+ @SuppressLint("LambdaLast")
public BiometricPrompt(@NonNull Fragment fragment,
- @NonNull AuthenticationCallback callback, @NonNull Executor executor) {
+ @NonNull Executor executor, @NonNull AuthenticationCallback callback) {
if (fragment == null) {
throw new IllegalArgumentException("FragmentActivity must not be null");
}
- if (callback == null) {
- throw new IllegalArgumentException("AuthenticationCallback must not be null");
- }
if (executor == null) {
throw new IllegalArgumentException("Executor must not be null");
}
+ if (callback == null) {
+ throw new IllegalArgumentException("AuthenticationCallback must not be null");
+ }
mFragment = fragment;
mAuthenticationCallback = callback;
mExecutor = executor;
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-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 8269878..4e2c30d 100644
--- a/browser/api/current.txt
+++ b/browser/api/current.txt
@@ -165,6 +165,7 @@
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!);
@@ -172,6 +173,7 @@
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
@@ -179,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 {
@@ -197,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?);
@@ -229,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-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 2757731..8a1533f 100644
--- a/browser/api/restricted_current.txt
+++ b/browser/api/restricted_current.txt
@@ -178,6 +178,7 @@
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!);
@@ -185,6 +186,7 @@
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
@@ -192,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";
}
@@ -211,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?);
@@ -245,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";
+ }
@@ -263,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 a874038..5212a28 100644
--- a/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
+++ b/browser/src/main/java/androidx/browser/customtabs/CustomTabsService.java
@@ -68,11 +68,8 @@
/**
* 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";
@@ -134,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<>();
@@ -415,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/build_dependencies.gradle b/buildSrc/build_dependencies.gradle
index a6c0c7b..c506523 100644
--- a/buildSrc/build_dependencies.gradle
+++ b/buildSrc/build_dependencies.gradle
@@ -21,7 +21,7 @@
build_versions.kotlin = kotlin_override
logger.warn("USING OVERRIDDEN KOTLIN GRADLE PLUGIN DEPENDENCY " + build_versions.kotlin)
} else {
- build_versions.kotlin = '1.3.40'
+ build_versions.kotlin = '1.3.41'
}
build_versions.lint = '26.5.0-beta05'
build_versions.dokka = '0.9.17-g002'
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 f78fd56..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
@@ -30,6 +30,7 @@
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/CreateLibraryBuildInfoFileTask.kt b/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
index 26c8623..f4b47a4 100644
--- a/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
@@ -50,6 +50,15 @@
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()) {
@@ -73,32 +82,40 @@
private fun resolveAndCollectDependencies(): LibraryBuildInfoFile {
val libraryBuildInfoFile = LibraryBuildInfoFile()
- libraryBuildInfoFile.path = getProjectSpecificDirectory()
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/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 41fd15a..3d4022d 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -33,8 +33,10 @@
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 CAMERA_EXTENSIONS = Version("1.0.0-alpha01")
+ val CAMERA_VIEW = Version("1.0.0-alpha01")
val CAR = Version("1.0.0-alpha8")
val CAR_CLUSTER = Version("1.0.0-alpha6")
val CAR_MODERATOR = Version("1.0.0-alpha1")
@@ -75,13 +77,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 PAGING = Version("3.0.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 +97,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 +108,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-beta02")
val WEAR = Version("1.1.0-alpha01")
val WEBKIT = Version("1.1.0-alpha02")
- val WORK = Version("2.2.0-beta01")
+ val WORK = Version("2.3.0-alpha01")
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt b/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt
index b56372d..56b7feb 100644
--- a/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt
@@ -114,10 +114,8 @@
}
}
- if (extension.publish.shouldRelease()) {
- // Register it as part of release so that we create a Zip file for it
- Release.register(this, extension)
- }
+ // Register it as part of release so that we create a Zip file for it
+ Release.register(this, extension)
} else {
uploadTask.enabled = false
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index d16af59..a032d7c 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")
@@ -120,13 +120,13 @@
prebuilts(LibraryGroups.VECTORDRAWABLE, "vectordrawable-animated", "1.1.0-rc01")
prebuilts(LibraryGroups.VERSIONEDPARCELABLE, "1.1.0-rc01")
prebuilts(LibraryGroups.VIEWPAGER, "1.0.0")
- prebuilts(LibraryGroups.VIEWPAGER2, "1.0.0-alpha06")
+ prebuilts(LibraryGroups.VIEWPAGER2, "1.0.0-beta01")
prebuilts(LibraryGroups.WEAR, "1.0.0")
.addStubs("wear/wear_stubs/com.google.android.wearable-stubs.jar")
prebuilts(LibraryGroups.WEBKIT, "1.1.0-alpha01")
ignore(LibraryGroups.WORK.group, "work-gcm")
ignore(LibraryGroups.WORK.group, "work-foreground")
- prebuilts(LibraryGroups.WORK, "2.1.0")
+ prebuilts(LibraryGroups.WORK, "2.2.0-beta01")
default(Ignore)
}
diff --git a/buildSrc/src/main/kotlin/androidx/build/Release.kt b/buildSrc/src/main/kotlin/androidx/build/Release.kt
index c148ee7..65122fd 100644
--- a/buildSrc/src/main/kotlin/androidx/build/Release.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/Release.kt
@@ -185,12 +185,17 @@
* Registers the project to be included in its group's zip file as well as the global zip files.
*/
fun register(project: Project, extension: AndroidXExtension) {
- if (!extension.publish.shouldRelease()) {
- throw IllegalArgumentException(
- "Cannot register ${project.path} into the release" +
- " because publish is not Publish.SNAPSHOT_AND_RELEASE!"
- )
+ if (extension.publish == Publish.NONE) {
+ project.logger.info("project ${project.name} isn't part of release," +
+ " because its \"publish\" property is explicitly set to Publish.NONE")
+ return
}
+ if (extension.publish == Publish.SNAPSHOT_ONLY && !isSnapshotBuild()) {
+ project.logger.info("project ${project.name} isn't part of release, because its" +
+ " \"publish\" property is SNAPSHOT_ONLY, but it is not a snapshot build")
+ return
+ }
+
val mavenGroup = extension.mavenGroup?.group ?: throw IllegalArgumentException(
"Cannot register a project to release if it does not have a mavenGroup set up"
)
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
index 93ee0b7..7826733 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt
@@ -47,7 +47,7 @@
const val JUNIT = "junit:junit:4.12"
const val KOTLINPOET = "com.squareup:kotlinpoet:1.1.0"
-private const val KOTLIN_VERSION = "1.3.40"
+private const val KOTLIN_VERSION = "1.3.41"
const val KOTLIN_STDLIB = "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION"
const val KOTLIN_TEST_COMMON = "org.jetbrains.kotlin:kotlin-test:$KOTLIN_VERSION"
const val COMPOSE_VERSION = "1.3.30-compose-20190520"
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
index 263e2e8..75f263e 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTasks.kt
@@ -24,7 +24,6 @@
import androidx.build.checkapi.getRequiredCompatibilityApiLocation
import androidx.build.checkapi.hasApiFolder
import androidx.build.checkapi.hasApiTasks
-import androidx.build.docsDir
import androidx.build.java.JavaCompileInputs
import androidx.build.defaultPublishVariant
import com.android.build.gradle.LibraryExtension
@@ -108,7 +107,7 @@
}
val builtApiLocation = ApiLocation.fromPublicApiFile(
- File(project.docsDir(), "release/${project.name}/current.txt"))
+ File(project.buildDir, "api/current.txt"))
val baselines = ApiViolationBaselines.fromApiLocation(libraryVersionApi)
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
index 64f62c5..559f3fb 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/RegenerateOldApisTask.kt
@@ -18,7 +18,6 @@
import androidx.build.SupportConfig
import androidx.build.Version
-import androidx.build.docsDir
import androidx.build.checkapi.getApiLocation
import androidx.build.checkapi.isValidApiVersion
import androidx.build.java.JavaCompileInputs
@@ -83,7 +82,7 @@
}
val outputApiLocation = project.getApiLocation(version)
- val tempDir = File(project.docsDir(), "release/${project.name}")
+ val tempDir = File(project.buildDir, "api")
if (outputApiLocation.publicApiFile.exists()) {
val generateRestrictedAPIs = outputApiLocation.restrictedApiFile.exists()
project.generateApi(
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/build.gradle b/camera/camera-extensions/build.gradle
index 22ffd31..5e20eb3 100644
--- a/camera/camera-extensions/build.gradle
+++ b/camera/camera-extensions/build.gradle
@@ -72,8 +72,8 @@
androidx {
name = "Jetpack Camera Library OEM Extensions"
- publish = Publish.NONE
- mavenVersion = LibraryVersions.CAMERA
+ publish = Publish.SNAPSHOT_AND_RELEASE
+ mavenVersion = LibraryVersions.CAMERA_EXTENSIONS
mavenGroup = LibraryGroups.CAMERA
inceptionYear = "2019"
description = "OEM Extensions for the Jetpack Camera Library, a library providing interfaces" +
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-testing/build.gradle b/camera/camera-testing/build.gradle
index 48af052..396ab3c 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -32,6 +32,7 @@
implementation(project(":camera:camera-core"))
implementation("androidx.core:core:1.1.0-rc01")
implementation("androidx.concurrent:concurrent-futures:1.0.0-alpha03")
+ implementation(JUNIT)
}
android {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
new file mode 100644
index 0000000..26c37e0
--- /dev/null
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
@@ -0,0 +1,42 @@
+/*
+ * 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.camera.testing;
+
+import android.os.Build;
+
+import org.junit.AssumptionViolatedException;
+
+/** Utility functions of tests on CoreTestApp. */
+public final class CoreAppTestUtil {
+
+ /**
+ * Check if this is compatible device for test.
+ *
+ * <p> Most devices should be compatible except devices with compatible issues.
+ *
+ */
+ public static void assumeCompatibleDevice() {
+ // TODO(b/134894604) This will be removed once the issue is fixed.
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP
+ && Build.MODEL.contains("Nexus 5")) {
+ throw new AssumptionViolatedException("Known issue, b/134894604.");
+ }
+
+ }
+
+
+}
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index 661dabf..a222329 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"))
@@ -37,8 +37,8 @@
}
androidx {
name = "Jetpack Camera View Library"
- publish = Publish.NONE
- mavenVersion = LibraryVersions.CAMERA
+ publish = Publish.SNAPSHOT_AND_RELEASE
+ mavenVersion = LibraryVersions.CAMERA_VIEW
mavenGroup = LibraryGroups.CAMERA
inceptionYear = "2019"
description = "UI tools for the Jetpack Camera Library, a library providing a consistent and " +
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.java
index 80651f3..53e8282 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/BasicUITest.java
@@ -16,6 +16,7 @@
package androidx.camera.integration.core;
+import static androidx.camera.integration.core.ToggleButtonUITest.waitFor;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
@@ -31,13 +32,11 @@
import androidx.camera.core.Preview;
import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CoreAppTestUtil;
import androidx.test.core.app.ApplicationProvider;
-import androidx.test.espresso.Espresso;
import androidx.test.espresso.IdlingRegistry;
-import androidx.test.espresso.IdlingResource;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
-import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;
import androidx.test.rule.GrantPermissionRule;
@@ -52,7 +51,6 @@
// Tests basic UI operation when using CoreTest app.
@RunWith(AndroidJUnit4.class)
@LargeTest
-@SdkSuppress(minSdkVersion = 21)
public final class BasicUITest {
private static final int IDLE_TIMEOUT_MS = 1000;
private static final String BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.core";
@@ -83,6 +81,7 @@
@Before
public void setUp() {
assumeTrue(CameraUtil.deviceHasCamera());
+ CoreAppTestUtil.assumeCompatibleDevice();
// In case the lock screen on top, the action to dismiss it.
mDevice.pressKeyCode(DISMISS_LOCK_SCREEN_CODE);
@@ -104,60 +103,54 @@
@Test
public void testAnalysisButton() {
- checkViewReady();
+ checkAnalysisReady();
ImageAnalysis imageAnalysis = mActivityRule.getActivity().getImageAnalysis();
// Click to disable the imageAnalysis use case.
if (imageAnalysis != null) {
onView(withId(R.id.AnalysisToggle)).perform(click());
- waitForIdlingRegistry();
+ waitFor(new ElapsedTimeIdlingResource(IDLE_TIMEOUT_MS));
}
imageAnalysis = mActivityRule.getActivity().getImageAnalysis();
- // Click to enable use imageAnalysis case.
+ // It is null(disable) and do click to enable use imageAnalysis case.
if (imageAnalysis == null) {
- IdlingRegistry.getInstance().register(
- mActivityRule.getActivity().mAnalysisIdlingResource);
onView(withId(R.id.AnalysisToggle)).perform(click());
- IdlingRegistry.getInstance().unregister(
- mActivityRule.getActivity().mAnalysisIdlingResource);
+ checkAnalysisReady();
}
}
@Test
public void testPreviewButton() {
- checkViewReady();
+ checkPreviewReady();
Preview preview = mActivityRule.getActivity().getPreview();
// Click to disable the preview use case.
if (preview != null) {
onView(withId(R.id.PreviewToggle)).perform(click());
- waitForIdlingRegistry();
+ waitFor(new ElapsedTimeIdlingResource(IDLE_TIMEOUT_MS));
}
preview = mActivityRule.getActivity().getPreview();
- // Click to enable preview use case.
+ // It is null(disable) and do click to enable preview use case.
if (preview == null) {
- IdlingRegistry.getInstance().register(mActivityRule.getActivity().mViewIdlingResource);
onView(withId(R.id.PreviewToggle)).perform(click());
- IdlingRegistry.getInstance().unregister(
- mActivityRule.getActivity().mViewIdlingResource);
+ checkPreviewReady();
}
}
- private void checkViewReady() {
+ private void checkPreviewReady() {
IdlingRegistry.getInstance().register(mActivityRule.getActivity().mViewIdlingResource);
onView(withId(R.id.textureView)).perform(click()).check(matches(isDisplayed()));
IdlingRegistry.getInstance().unregister(mActivityRule.getActivity().mViewIdlingResource);
}
- private void waitForIdlingRegistry() {
- // Idles Espresso thread and make activity complete each action.
- IdlingResource idlingResource = new ElapsedTimeIdlingResource(IDLE_TIMEOUT_MS);
- IdlingRegistry.getInstance().register(idlingResource);
- Espresso.onIdle();
- IdlingRegistry.getInstance().unregister(idlingResource);
+ private void checkAnalysisReady() {
+ IdlingRegistry.getInstance().register(mActivityRule.getActivity().mAnalysisIdlingResource);
+ onView(withId(R.id.textureView)).perform(click()).check(matches(isDisplayed()));
+ IdlingRegistry.getInstance().unregister(
+ mActivityRule.getActivity().mAnalysisIdlingResource);
}
private void pressBackAndReturnHome() {
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.java
index 400b5e8..244d714 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ExistingActivityLifecycleTest.java
@@ -30,6 +30,7 @@
import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CoreAppTestUtil;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.espresso.Espresso;
import androidx.test.espresso.IdlingRegistry;
@@ -77,6 +78,7 @@
@Before
public void setup() {
assumeTrue(CameraUtil.deviceHasCamera());
+ CoreAppTestUtil.assumeCompatibleDevice();
assertThat(mLauncherPackageName, notNullValue());
returnHomeScreen();
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
index 57eaccd..07b5649 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/NewActivityLifecycleTest.java
@@ -30,6 +30,7 @@
import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CoreAppTestUtil;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.espresso.Espresso;
import androidx.test.espresso.IdlingRegistry;
@@ -76,6 +77,7 @@
@Before
public void setup() {
assumeTrue(CameraUtil.deviceHasCamera());
+ CoreAppTestUtil.assumeCompatibleDevice();
assertThat(mLauncherPackageName, notNullValue());
returnHomeScreen();
diff --git a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
index b59a25e..400035c 100644
--- a/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
+++ b/camera/integration-tests/coretestapp/src/androidTest/java/androidx/camera/integration/core/ToggleButtonUITest.java
@@ -34,6 +34,7 @@
import androidx.camera.integration.core.idlingresource.ElapsedTimeIdlingResource;
import androidx.camera.integration.core.idlingresource.WaitForViewToShow;
import androidx.camera.testing.CameraUtil;
+import androidx.camera.testing.CoreAppTestUtil;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.espresso.Espresso;
import androidx.test.espresso.IdlingRegistry;
@@ -58,7 +59,6 @@
@LargeTest
public final class ToggleButtonUITest {
- private static final int LAUNCH_TIMEOUT_MS = 5000;
private static final int IDLE_TIMEOUT_MS = 1000;
private static final String BASIC_SAMPLE_PACKAGE = "androidx.camera.integration.core";
@@ -92,6 +92,8 @@
@Before
public void setUp() {
assumeTrue(CameraUtil.deviceHasCamera());
+ CoreAppTestUtil.assumeCompatibleDevice();
+
// Launch Activity
mActivityRule.launchActivity(mIntent);
}
@@ -183,7 +185,7 @@
// Returns to Home to restart next test.
mDevice.pressHome();
- mDevice.wait(Until.hasObject(By.pkg(mLauncherPackageName).depth(0)), LAUNCH_TIMEOUT_MS);
+ mDevice.wait(Until.hasObject(By.pkg(mLauncherPackageName).depth(0)), IDLE_TIMEOUT_MS);
}
private void pressBackAndReturnHome() {
@@ -192,5 +194,6 @@
// Returns to Home to restart next test.
mDevice.pressHome();
}
+
}
diff --git a/compose/compose-runtime/compose-runtime-benchmark/build.gradle b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
index 3154eb2..c82e12e 100644
--- a/compose/compose-runtime/compose-runtime-benchmark/build.gradle
+++ b/compose/compose-runtime/compose-runtime-benchmark/build.gradle
@@ -59,7 +59,8 @@
androidTestImplementation(ANDROIDX_TEST_CORE)
androidTestImplementation(ANDROIDX_TEST_RUNNER)
androidTestImplementation(ANDROIDX_TEST_RULES)
- androidTestImplementation(KOTLIN_STDLIB)
+ androidTestImplementation(KOTLIN_COMPOSE_STDLIB)
+ androidTestImplementation(KOTLIN_COMPOSE_REFLECT)
androidTestImplementation(project(":benchmark"))
}
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
index ab74cc5..efd3778 100644
--- 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
@@ -25,6 +25,7 @@
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
@@ -150,6 +151,20 @@
}
}
+ @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 {
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/core/core/api/1.2.0-alpha03.txt b/core/core/api/1.2.0-alpha03.txt
index 1381366..f03894b 100644
--- a/core/core/api/1.2.0-alpha03.txt
+++ b/core/core/api/1.2.0-alpha03.txt
@@ -723,10 +723,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";
@@ -734,46 +734,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/current.txt b/core/core/api/current.txt
index 1381366..f03894b 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -723,10 +723,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";
@@ -734,46 +734,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_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/androidTest/java/androidx/core/app/ShareCompatTest.java b/core/core/src/androidTest/java/androidx/core/app/ShareCompatTest.java
index bd78c6a..993dddb 100644
--- a/core/core/src/androidTest/java/androidx/core/app/ShareCompatTest.java
+++ b/core/core/src/androidTest/java/androidx/core/app/ShareCompatTest.java
@@ -36,11 +36,11 @@
public class ShareCompatTest extends BaseInstrumentationTestCase<TestActivity> {
@Rule
public ActivityTestRule<TestActivity> testRuleForReading =
- new ActivityTestRule<TestActivity>(TestActivity.class, false, false);
+ new ActivityTestRule<>(TestActivity.class, false, false);
@Rule
public ActivityTestRule<TestActivity> testRuleForReadingInterop =
- new ActivityTestRule<TestActivity>(TestActivity.class, false, false);
+ new ActivityTestRule<>(TestActivity.class, false, false);
public ShareCompatTest() {
super(TestActivity.class);
diff --git a/core/core/src/main/java/androidx/core/app/ShareCompat.java b/core/core/src/main/java/androidx/core/app/ShareCompat.java
index 2f7cb0fa..eba49b6 100644
--- a/core/core/src/main/java/androidx/core/app/ShareCompat.java
+++ b/core/core/src/main/java/androidx/core/app/ShareCompat.java
@@ -18,8 +18,11 @@
import static android.os.Build.VERSION.SDK_INT;
+import static androidx.core.util.Preconditions.checkNotNull;
+
import android.app.Activity;
import android.content.ComponentName;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -33,6 +36,9 @@
import android.view.MenuItem;
import android.widget.ShareActionProvider;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.content.IntentCompat;
@@ -120,13 +126,34 @@
* @param calledActivity Current activity that was launched to share content
* @return Name of the calling package
*/
- public static String getCallingPackage(Activity calledActivity) {
+ @Nullable
+ public static String getCallingPackage(@NonNull Activity calledActivity) {
+ Intent intent = calledActivity.getIntent();
String result = calledActivity.getCallingPackage();
+ if (result == null && intent != null) {
+ result = getCallingPackage(intent);
+ }
+ return result;
+ }
+
+ /**
+ * Retrieve the name of the package that launched intent from a share intent.
+ * Apps that provide social sharing functionality can use this to provide attribution
+ * for the app that shared the content.
+ *
+ * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+ * application. As such it should not be trusted for accuracy in the context of
+ * security or verification.</p>
+ *
+ * @param intent Intent that was launched to share content
+ * @return Name of the calling package
+ */
+ @SuppressWarnings("WeakerAccess")
+ @Nullable
+ static String getCallingPackage(@NonNull Intent intent) {
+ String result = intent.getStringExtra(EXTRA_CALLING_PACKAGE);
if (result == null) {
- result = calledActivity.getIntent().getStringExtra(EXTRA_CALLING_PACKAGE);
- if (result == null) {
- result = calledActivity.getIntent().getStringExtra(EXTRA_CALLING_PACKAGE_INTEROP);
- }
+ result = intent.getStringExtra(EXTRA_CALLING_PACKAGE_INTEROP);
}
return result;
}
@@ -143,14 +170,34 @@
* @param calledActivity Current activity that was launched to share content
* @return ComponentName of the calling activity
*/
- public static ComponentName getCallingActivity(Activity calledActivity) {
+ @Nullable
+ public static ComponentName getCallingActivity(@NonNull Activity calledActivity) {
+ Intent intent = calledActivity.getIntent();
ComponentName result = calledActivity.getCallingActivity();
if (result == null) {
- result = calledActivity.getIntent().getParcelableExtra(EXTRA_CALLING_ACTIVITY);
- if (result == null) {
- result = calledActivity.getIntent().getParcelableExtra(
- EXTRA_CALLING_ACTIVITY_INTEROP);
- }
+ result = getCallingActivity(intent);
+ }
+ return result;
+ }
+
+ /**
+ * Retrieve the ComponentName of the activity that launched intent from a share intent.
+ * Apps that provide social sharing functionality can use this to provide attribution
+ * for the app that shared the content.
+ *
+ * <p><em>Note:</em> This data may have been provided voluntarily by the calling
+ * application. As such it should not be trusted for accuracy in the context of
+ * security or verification.</p>
+ *
+ * @param intent Intent that was launched to share content
+ * @return ComponentName of the calling activity
+ */
+ @SuppressWarnings("WeakerAccess")
+ @Nullable
+ static ComponentName getCallingActivity(@NonNull Intent intent) {
+ ComponentName result = intent.getParcelableExtra(EXTRA_CALLING_ACTIVITY);
+ if (result == null) {
+ result = intent.getParcelableExtra(EXTRA_CALLING_ACTIVITY_INTEROP);
}
return result;
}
@@ -181,16 +228,17 @@
* @param item MenuItem to configure for sharing
* @param shareIntent IntentBuilder with data about the content to share
*/
- public static void configureMenuItem(MenuItem item, IntentBuilder shareIntent) {
+ public static void configureMenuItem(@NonNull MenuItem item,
+ @NonNull IntentBuilder shareIntent) {
ActionProvider itemProvider = item.getActionProvider();
ShareActionProvider provider;
if (!(itemProvider instanceof ShareActionProvider)) {
- provider = new ShareActionProvider(shareIntent.getActivity());
+ provider = new ShareActionProvider(shareIntent.getContext());
} else {
provider = (ShareActionProvider) itemProvider;
}
provider.setShareHistoryFileName(HISTORY_FILENAME_PREFIX
- + shareIntent.getActivity().getClass().getName());
+ + shareIntent.getContext().getClass().getName());
provider.setShareIntent(shareIntent.getIntent());
item.setActionProvider(provider);
@@ -209,7 +257,8 @@
* @param shareIntent IntentBuilder with data about the content to share
* @see #configureMenuItem(MenuItem, IntentBuilder)
*/
- public static void configureMenuItem(Menu menu, int menuItemId, IntentBuilder shareIntent) {
+ public static void configureMenuItem(@NonNull Menu menu, @IdRes int menuItemId,
+ @NonNull IntentBuilder shareIntent) {
MenuItem item = menu.findItem(menuItemId);
if (item == null) {
throw new IllegalArgumentException("Could not find menu item with id " + menuItemId
@@ -225,14 +274,14 @@
* will be included.
*/
public static class IntentBuilder {
- private Activity mActivity;
- private Intent mIntent;
- private CharSequence mChooserTitle;
- private ArrayList<String> mToAddresses;
- private ArrayList<String> mCcAddresses;
- private ArrayList<String> mBccAddresses;
+ private final @NonNull Context mContext;
+ private final @NonNull Intent mIntent;
- private ArrayList<Uri> mStreams;
+ private @Nullable CharSequence mChooserTitle;
+ private @Nullable ArrayList<String> mToAddresses;
+ private @Nullable ArrayList<String> mCcAddresses;
+ private @Nullable ArrayList<String> mBccAddresses;
+ private @Nullable ArrayList<Uri> mStreams;
/**
* Create a new IntentBuilder for launching a sharing action from launchingActivity.
@@ -240,17 +289,32 @@
* @param launchingActivity Activity that the share will be launched from
* @return a new IntentBuilder instance
*/
- public static IntentBuilder from(Activity launchingActivity) {
- return new IntentBuilder(launchingActivity);
+ @NonNull
+ public static IntentBuilder from(@NonNull Activity launchingActivity) {
+ return from(checkNotNull(launchingActivity), launchingActivity.getComponentName());
}
- private IntentBuilder(Activity launchingActivity) {
- mActivity = launchingActivity;
+ /**
+ * Create a new IntentBuilder for launching a sharing action from launchingContext.
+ *
+ * @param launchingContext Context that the share will be launched from
+ * @param componentName Component that the share will be launched from, if any
+ * @return a new IntentBuilder instance
+ */
+ @NonNull
+ private static IntentBuilder from(@NonNull Context launchingContext,
+ @Nullable ComponentName componentName) {
+ return new IntentBuilder(launchingContext, componentName);
+ }
+
+ private IntentBuilder(@NonNull Context launchingContext,
+ @Nullable ComponentName componentName) {
+ mContext = checkNotNull(launchingContext);
mIntent = new Intent().setAction(Intent.ACTION_SEND);
- mIntent.putExtra(EXTRA_CALLING_PACKAGE, launchingActivity.getPackageName());
- mIntent.putExtra(EXTRA_CALLING_PACKAGE_INTEROP, launchingActivity.getPackageName());
- mIntent.putExtra(EXTRA_CALLING_ACTIVITY, launchingActivity.getComponentName());
- mIntent.putExtra(EXTRA_CALLING_ACTIVITY_INTEROP, launchingActivity.getComponentName());
+ mIntent.putExtra(EXTRA_CALLING_PACKAGE, launchingContext.getPackageName());
+ mIntent.putExtra(EXTRA_CALLING_PACKAGE_INTEROP, launchingContext.getPackageName());
+ mIntent.putExtra(EXTRA_CALLING_ACTIVITY, componentName);
+ mIntent.putExtra(EXTRA_CALLING_ACTIVITY_INTEROP, componentName);
mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
}
@@ -263,6 +327,7 @@
*
* @return The current Intent being configured by this builder
*/
+ @NonNull
public Intent getIntent() {
if (mToAddresses != null) {
combineArrayExtra(Intent.EXTRA_EMAIL, mToAddresses);
@@ -279,7 +344,7 @@
// Check if we need to change the action.
boolean needsSendMultiple = mStreams != null && mStreams.size() > 1;
- boolean isSendMultiple = mIntent.getAction().equals(Intent.ACTION_SEND_MULTIPLE);
+ boolean isSendMultiple = Intent.ACTION_SEND_MULTIPLE.equals(mIntent.getAction());
if (!needsSendMultiple && isSendMultiple) {
// Change back to a single send action; place the first stream into the
@@ -307,8 +372,9 @@
return mIntent;
}
- Activity getActivity() {
- return mActivity;
+ @NonNull
+ Context getContext() {
+ return mContext;
}
private void combineArrayExtra(String extra, ArrayList<String> add) {
@@ -322,7 +388,7 @@
mIntent.putExtra(extra, finalAddresses);
}
- private void combineArrayExtra(String extra, String[] add) {
+ private void combineArrayExtra(@Nullable String extra, @NonNull String[] add) {
// Add any items still pending
Intent intent = getIntent();
String[] old = intent.getStringArrayExtra(extra);
@@ -340,6 +406,7 @@
*
* @return A chooser Intent for the currently configured sharing action
*/
+ @NonNull
public Intent createChooserIntent() {
return Intent.createChooser(getIntent(), mChooserTitle);
}
@@ -354,7 +421,7 @@
* of invoking this directly.</p>
*/
public void startChooser() {
- mActivity.startActivity(createChooserIntent());
+ mContext.startActivity(createChooserIntent());
}
/**
@@ -363,7 +430,8 @@
* @param title Title string
* @return This IntentBuilder for method chaining
*/
- public IntentBuilder setChooserTitle(CharSequence title) {
+ @NonNull
+ public IntentBuilder setChooserTitle(@Nullable CharSequence title) {
mChooserTitle = title;
return this;
}
@@ -374,8 +442,9 @@
* @param resId Resource ID of the title string to use
* @return This IntentBuilder for method chaining
*/
+ @NonNull
public IntentBuilder setChooserTitle(@StringRes int resId) {
- return setChooserTitle(mActivity.getText(resId));
+ return setChooserTitle(mContext.getText(resId));
}
/**
@@ -385,7 +454,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#setType(String)
*/
- public IntentBuilder setType(String mimeType) {
+ @NonNull
+ public IntentBuilder setType(@Nullable String mimeType) {
mIntent.setType(mimeType);
return this;
}
@@ -398,7 +468,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_TEXT
*/
- public IntentBuilder setText(CharSequence text) {
+ @NonNull
+ public IntentBuilder setText(@Nullable CharSequence text) {
mIntent.putExtra(Intent.EXTRA_TEXT, text);
return this;
}
@@ -414,7 +485,8 @@
* @return This IntentBuilder for method chaining
* @see #setText(CharSequence)
*/
- public IntentBuilder setHtmlText(String htmlText) {
+ @NonNull
+ public IntentBuilder setHtmlText(@Nullable String htmlText) {
mIntent.putExtra(IntentCompat.EXTRA_HTML_TEXT, htmlText);
if (!mIntent.hasExtra(Intent.EXTRA_TEXT)) {
// Supply a default if EXTRA_TEXT isn't set
@@ -433,8 +505,9 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_STREAM
*/
- public IntentBuilder setStream(Uri streamUri) {
- if (!mIntent.getAction().equals(Intent.ACTION_SEND)) {
+ @NonNull
+ public IntentBuilder setStream(@Nullable Uri streamUri) {
+ if (!Intent.ACTION_SEND.equals(mIntent.getAction())) {
mIntent.setAction(Intent.ACTION_SEND);
}
mStreams = null;
@@ -453,13 +526,14 @@
* @see Intent#ACTION_SEND
* @see Intent#ACTION_SEND_MULTIPLE
*/
- public IntentBuilder addStream(Uri streamUri) {
+ @NonNull
+ public IntentBuilder addStream(@NonNull Uri streamUri) {
Uri currentStream = mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
if (mStreams == null && currentStream == null) {
return setStream(streamUri);
}
if (mStreams == null) {
- mStreams = new ArrayList<Uri>();
+ mStreams = new ArrayList<>();
}
if (currentStream != null) {
mIntent.removeExtra(Intent.EXTRA_STREAM);
@@ -477,7 +551,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_EMAIL
*/
- public IntentBuilder setEmailTo(String[] addresses) {
+ @NonNull
+ public IntentBuilder setEmailTo(@Nullable String[] addresses) {
if (mToAddresses != null) {
mToAddresses = null;
}
@@ -492,9 +567,10 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_EMAIL
*/
- public IntentBuilder addEmailTo(String address) {
+ @NonNull
+ public IntentBuilder addEmailTo(@NonNull String address) {
if (mToAddresses == null) {
- mToAddresses = new ArrayList<String>();
+ mToAddresses = new ArrayList<>();
}
mToAddresses.add(address);
return this;
@@ -507,7 +583,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_EMAIL
*/
- public IntentBuilder addEmailTo(String[] addresses) {
+ @NonNull
+ public IntentBuilder addEmailTo(@NonNull String[] addresses) {
combineArrayExtra(Intent.EXTRA_EMAIL, addresses);
return this;
}
@@ -520,7 +597,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_CC
*/
- public IntentBuilder setEmailCc(String[] addresses) {
+ @NonNull
+ public IntentBuilder setEmailCc(@Nullable String[] addresses) {
mIntent.putExtra(Intent.EXTRA_CC, addresses);
return this;
}
@@ -532,9 +610,10 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_CC
*/
- public IntentBuilder addEmailCc(String address) {
+ @NonNull
+ public IntentBuilder addEmailCc(@NonNull String address) {
if (mCcAddresses == null) {
- mCcAddresses = new ArrayList<String>();
+ mCcAddresses = new ArrayList<>();
}
mCcAddresses.add(address);
return this;
@@ -547,7 +626,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_CC
*/
- public IntentBuilder addEmailCc(String[] addresses) {
+ @NonNull
+ public IntentBuilder addEmailCc(@NonNull String[] addresses) {
combineArrayExtra(Intent.EXTRA_CC, addresses);
return this;
}
@@ -560,7 +640,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_BCC
*/
- public IntentBuilder setEmailBcc(String[] addresses) {
+ @NonNull
+ public IntentBuilder setEmailBcc(@Nullable String[] addresses) {
mIntent.putExtra(Intent.EXTRA_BCC, addresses);
return this;
}
@@ -572,9 +653,10 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_BCC
*/
- public IntentBuilder addEmailBcc(String address) {
+ @NonNull
+ public IntentBuilder addEmailBcc(@NonNull String address) {
if (mBccAddresses == null) {
- mBccAddresses = new ArrayList<String>();
+ mBccAddresses = new ArrayList<>();
}
mBccAddresses.add(address);
return this;
@@ -587,7 +669,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_BCC
*/
- public IntentBuilder addEmailBcc(String[] addresses) {
+ @NonNull
+ public IntentBuilder addEmailBcc(@NonNull String[] addresses) {
combineArrayExtra(Intent.EXTRA_BCC, addresses);
return this;
}
@@ -599,7 +682,8 @@
* @return This IntentBuilder for method chaining
* @see Intent#EXTRA_SUBJECT
*/
- public IntentBuilder setSubject(String subject) {
+ @NonNull
+ public IntentBuilder setSubject(@Nullable String subject) {
mIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
return this;
}
@@ -625,12 +709,12 @@
public static class IntentReader {
private static final String TAG = "IntentReader";
- private Activity mActivity;
- private Intent mIntent;
- private String mCallingPackage;
- private ComponentName mCallingActivity;
+ private final @NonNull Context mContext;
+ private final @NonNull Intent mIntent;
+ private final @Nullable String mCallingPackage;
+ private final @Nullable ComponentName mCallingActivity;
- private ArrayList<Uri> mStreams;
+ private @Nullable ArrayList<Uri> mStreams;
/**
* Get an IntentReader for parsing and interpreting the sharing intent
@@ -639,15 +723,29 @@
* @param activity Activity that was started to share content
* @return IntentReader for parsing sharing data
*/
- public static IntentReader from(Activity activity) {
- return new IntentReader(activity);
+ @NonNull
+ public static IntentReader from(@NonNull Activity activity) {
+ return from(checkNotNull(activity), activity.getIntent());
}
- private IntentReader(Activity activity) {
- mActivity = activity;
- mIntent = activity.getIntent();
- mCallingPackage = ShareCompat.getCallingPackage(activity);
- mCallingActivity = ShareCompat.getCallingActivity(activity);
+ /**
+ * Get an IntentReader for parsing and interpreting the sharing intent
+ * used to start the given activity.
+ *
+ * @param context Context that was started to share content
+ * @param intent Intent that was used to start the context
+ * @return IntentReader for parsing sharing data
+ */
+ @NonNull
+ private static IntentReader from(@NonNull Context context, @NonNull Intent intent) {
+ return new IntentReader(context, intent);
+ }
+
+ private IntentReader(@NonNull Context context, @NonNull Intent intent) {
+ mContext = checkNotNull(context);
+ mIntent = checkNotNull(intent);
+ mCallingPackage = ShareCompat.getCallingPackage(intent);
+ mCallingActivity = ShareCompat.getCallingActivity(intent);
}
/**
@@ -692,6 +790,7 @@
* @return mimetype of the shared data
* @see Intent#getType()
*/
+ @Nullable
public String getType() {
return mIntent.getType();
}
@@ -702,6 +801,7 @@
* @return Literal shared text or null if none was supplied
* @see Intent#EXTRA_TEXT
*/
+ @Nullable
public CharSequence getText() {
return mIntent.getCharSequenceExtra(Intent.EXTRA_TEXT);
}
@@ -716,6 +816,7 @@
*
* @return Styled text provided by the sender as HTML.
*/
+ @Nullable
public String getHtmlText() {
String result = mIntent.getStringExtra(IntentCompat.EXTRA_HTML_TEXT);
if (result == null) {
@@ -735,8 +836,8 @@
return result;
}
- private static void withinStyle(StringBuilder out, CharSequence text,
- int start, int end) {
+ @SuppressWarnings("SameParameterValue")
+ private static void withinStyle(StringBuilder out, CharSequence text, int start, int end) {
for (int i = start; i < end; i++) {
char c = text.charAt(i);
@@ -747,7 +848,7 @@
} else if (c == '&') {
out.append("&");
} else if (c > 0x7E || c < ' ') {
- out.append("&#" + ((int) c) + ";");
+ out.append("&#").append((int) c).append(";");
} else if (c == ' ') {
while (i + 1 < end && text.charAt(i + 1) == ' ') {
out.append(" ");
@@ -772,8 +873,9 @@
* @return A URI referring to a data stream to be shared or null if one was not supplied
* @see Intent#EXTRA_STREAM
*/
+ @Nullable
public Uri getStream() {
- return mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
+ return (Uri) mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
}
/**
@@ -785,6 +887,7 @@
* @see Intent#EXTRA_STREAM
* @see Intent#ACTION_SEND_MULTIPLE
*/
+ @Nullable
public Uri getStream(int index) {
if (mStreams == null && isMultipleShare()) {
mStreams = mIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
@@ -822,6 +925,7 @@
* @return An array of email addresses or null if none were supplied.
* @see Intent#EXTRA_EMAIL
*/
+ @Nullable
public String[] getEmailTo() {
return mIntent.getStringArrayExtra(Intent.EXTRA_EMAIL);
}
@@ -832,6 +936,7 @@
* @return An array of email addresses or null if none were supplied.
* @see Intent#EXTRA_CC
*/
+ @Nullable
public String[] getEmailCc() {
return mIntent.getStringArrayExtra(Intent.EXTRA_CC);
}
@@ -842,6 +947,7 @@
* @return An array of email addresses or null if none were supplied.
* @see Intent#EXTRA_BCC
*/
+ @Nullable
public String[] getEmailBcc() {
return mIntent.getStringArrayExtra(Intent.EXTRA_BCC);
}
@@ -852,6 +958,7 @@
* @return The subject heading for this share or null if one was not supplied.
* @see Intent#EXTRA_SUBJECT
*/
+ @Nullable
public String getSubject() {
return mIntent.getStringExtra(Intent.EXTRA_SUBJECT);
}
@@ -870,6 +977,7 @@
* @see ShareCompat#EXTRA_CALLING_PACKAGE
* @see ShareCompat#EXTRA_CALLING_PACKAGE_INTEROP
*/
+ @Nullable
public String getCallingPackage() {
return mCallingPackage;
}
@@ -888,6 +996,7 @@
* @see ShareCompat#EXTRA_CALLING_ACTIVITY
* @see ShareCompat#EXTRA_CALLING_ACTIVITY_INTEROP
*/
+ @Nullable
public ComponentName getCallingActivity() {
return mCallingActivity;
}
@@ -902,10 +1011,11 @@
*
* @return The calling Activity's icon or null if unknown
*/
+ @Nullable
public Drawable getCallingActivityIcon() {
if (mCallingActivity == null) return null;
- PackageManager pm = mActivity.getPackageManager();
+ PackageManager pm = mContext.getPackageManager();
try {
return pm.getActivityIcon(mCallingActivity);
} catch (NameNotFoundException e) {
@@ -924,10 +1034,11 @@
*
* @return The calling application's icon or null if unknown
*/
+ @Nullable
public Drawable getCallingApplicationIcon() {
if (mCallingPackage == null) return null;
- PackageManager pm = mActivity.getPackageManager();
+ PackageManager pm = mContext.getPackageManager();
try {
return pm.getApplicationIcon(mCallingPackage);
} catch (NameNotFoundException e) {
@@ -946,10 +1057,11 @@
*
* @return The calling application's label or null if unknown
*/
+ @Nullable
public CharSequence getCallingApplicationLabel() {
if (mCallingPackage == null) return null;
- PackageManager pm = mActivity.getPackageManager();
+ PackageManager pm = mContext.getPackageManager();
try {
return pm.getApplicationLabel(pm.getApplicationInfo(mCallingPackage, 0));
} catch (NameNotFoundException e) {
diff --git a/core/core/src/main/java/androidx/core/graphics/TypefaceCompat.java b/core/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
index 37ac073..8811f03 100644
--- a/core/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
+++ b/core/core/src/main/java/androidx/core/graphics/TypefaceCompat.java
@@ -115,7 +115,7 @@
final int timeout = isRequestFromLayoutInflator ? providerEntry.getTimeout()
: FontResourcesParserCompat.INFINITE_TIMEOUT_VALUE;
typeface = FontsContractCompat.getFontSync(context, providerEntry.getRequest(),
- fontCallback, handler, isBlocking, timeout, style, isRequestFromLayoutInflator);
+ fontCallback, handler, isBlocking, timeout, style);
} else {
typeface = sTypefaceCompatImpl.createFromFontFamilyFilesResourceEntry(
context, (FontFamilyFilesResourceEntry) entry, resources, style);
diff --git a/core/core/src/main/java/androidx/core/provider/FontsContractCompat.java b/core/core/src/main/java/androidx/core/provider/FontsContractCompat.java
index 7ce5a85..0778535 100644
--- a/core/core/src/main/java/androidx/core/provider/FontsContractCompat.java
+++ b/core/core/src/main/java/androidx/core/provider/FontsContractCompat.java
@@ -16,7 +16,6 @@
package androidx.core.provider;
-import static androidx.annotation.RestrictTo.Scope.LIBRARY;
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
import android.annotation.SuppressLint;
@@ -66,13 +65,6 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
/**
* Utility class to deal with Font ContentProviders.
@@ -222,9 +214,6 @@
}
}
- @GuardedBy("sLock")
- private static Executor sExecutor;
-
/**
* Used for tests, should not be used otherwise.
* @hide
@@ -234,110 +223,12 @@
sTypefaceCache.evictAll();
}
- /**
- * An general interface for callback when the process has completed.
- */
- private interface OnCompletedCallback<T> {
- void onCompleted(T result);
- }
-
- /**
- * A helper class for wrapping synchronous font fetching with Callable.
- */
- private static final class SyncFontFetchTaskCallable implements Callable<TypefaceResult> {
- private final @NonNull String mCacheId;
- private final @NonNull Context mAppContext;
- private final @NonNull FontRequest mRequest;
- private final int mStyle;
-
- SyncFontFetchTaskCallable(@NonNull Context ctx, @NonNull FontRequest request,
- int style, @NonNull String cacheId) {
- mCacheId = cacheId;
- mAppContext = ctx.getApplicationContext();
- mRequest = request;
- mStyle = style;
- }
-
- @Override
- public TypefaceResult call() throws Exception {
- TypefaceResult typeface = getFontInternal(mAppContext, mRequest, mStyle);
- if (typeface.mTypeface != null) {
- sTypefaceCache.put(mCacheId, typeface.mTypeface);
- }
- return typeface;
- }
- }
-
- /**
- * Helper class of the process when the font fetch has completed.
- *
- * This class does
- * - Remove all reply objects for the given request from pending replies.
- * - Call the all replies.
- */
- private static final class OnFetchCompletedAndFirePendingReplyCallback
- implements OnCompletedCallback<TypefaceResult> {
- private final @NonNull String mCacheId;
-
- OnFetchCompletedAndFirePendingReplyCallback(@NonNull String cacheId) {
- mCacheId = cacheId;
- }
-
- @Override
- public void onCompleted(TypefaceResult typeface) {
- final ArrayList<ReplyCallback<TypefaceResult>> replies;
- synchronized (sLock) {
- replies = sPendingReplies.get(mCacheId);
- if (replies == null) {
- return; // Nobody requested replies. Do nothing.
- }
- sPendingReplies.remove(mCacheId);
- }
- for (int i = 0; i < replies.size(); ++i) {
- replies.get(i).onReply(typeface);
- }
- }
- }
-
- /**
- * Helper task class for font fetching.
- */
- private static final class SyncFontFetchTask extends FutureTask<TypefaceResult> {
- private static final class CallableWrapper implements Callable<TypefaceResult> {
- private final Callable<TypefaceResult> mOriginalCallback;
- private final OnCompletedCallback<TypefaceResult> mTypefaceResultOnCompletedCallback;
- CallableWrapper(@NonNull Callable<TypefaceResult> callback,
- @NonNull OnCompletedCallback<TypefaceResult> onCompletedCallback) {
- mOriginalCallback = callback;
- mTypefaceResultOnCompletedCallback = onCompletedCallback;
- }
-
- @Override
- public TypefaceResult call() throws Exception {
- TypefaceResult tf = mOriginalCallback.call();
- mTypefaceResultOnCompletedCallback.onCompleted(tf);
- return tf;
- }
- }
-
- SyncFontFetchTask(@NonNull SyncFontFetchTaskCallable callable) {
- super(callable);
- }
-
- SyncFontFetchTask(@NonNull SyncFontFetchTaskCallable callable,
- @NonNull OnCompletedCallback<TypefaceResult> onCompletedCallback) {
- super(new CallableWrapper(callable, onCompletedCallback));
- }
- }
-
/** @hide */
- @RestrictTo(LIBRARY)
+ @RestrictTo(LIBRARY_GROUP_PREFIX)
public static Typeface getFontSync(final Context context, final FontRequest request,
final @Nullable ResourcesCompat.FontCallback fontCallback,
final @Nullable Handler handler, boolean isBlockingFetch, int timeout,
- final int style, boolean isRequestFromLayoutInflator) {
-
-
+ final int style) {
final String id = request.getIdentifier() + "-" + style;
Typeface cached = sTypefaceCache.get(id);
if (cached != null) {
@@ -360,97 +251,55 @@
return typefaceResult.mTypeface;
}
- Executor executor = null;
- if (isRequestFromLayoutInflator && handler == null) {
- if (sExecutor == null) {
- synchronized (sLock) {
- if (sExecutor == null) {
-
- sExecutor = Executors.newFixedThreadPool(1, new ThreadFactory() {
- @Override
- public Thread newThread(@NonNull Runnable runnable) {
- final Thread t = new Thread(runnable);
- t.setName("fonts");
- return t;
- }
- });
- }
+ final Callable<TypefaceResult> fetcher = new Callable<TypefaceResult>() {
+ @Override
+ public TypefaceResult call() throws Exception {
+ TypefaceResult typeface = getFontInternal(context, request, style);
+ if (typeface.mTypeface != null) {
+ sTypefaceCache.put(id, typeface.mTypeface);
}
+ return typeface;
}
- executor = sExecutor;
- }
-
- final SyncFontFetchTaskCallable fetcher = new SyncFontFetchTaskCallable(
- context, request, style, id);
+ };
if (isBlockingFetch) {
try {
- if (executor == null) {
- return sBackgroundThread.postAndWait(fetcher, timeout).mTypeface;
- } else {
- final SyncFontFetchTask task = new SyncFontFetchTask(fetcher);
- executor.execute(task);
- return task.get(timeout, TimeUnit.MILLISECONDS).mTypeface;
- }
- } catch (InterruptedException | TimeoutException | ExecutionException e) {
+ return sBackgroundThread.postAndWait(fetcher, timeout).mTypeface;
+ } catch (InterruptedException e) {
return null;
}
- }
-
- // Non-blocking fetch
- ReplyCallback<TypefaceResult> reply = null;
- if (fontCallback != null) {
- if (executor == null) {
- reply = new ReplyCallback<TypefaceResult>() {
- @Override
- public void onReply(final TypefaceResult typeface) {
- if (typeface == null) {
- fontCallback.callbackFailAsync(
- FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND,
- handler);
- } else if (typeface.mResult == FontFamilyResult.STATUS_OK) {
- fontCallback.callbackSuccessAsync(typeface.mTypeface, handler);
- } else {
- fontCallback.callbackFailAsync(typeface.mResult, handler);
+ } else {
+ final ReplyCallback<TypefaceResult> reply = fontCallback == null ? null
+ : new ReplyCallback<TypefaceResult>() {
+ @Override
+ public void onReply(final TypefaceResult typeface) {
+ if (typeface == null) {
+ fontCallback.callbackFailAsync(
+ FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND, handler);
+ } else if (typeface.mResult == FontFamilyResult.STATUS_OK) {
+ fontCallback.callbackSuccessAsync(typeface.mTypeface, handler);
+ } else {
+ fontCallback.callbackFailAsync(typeface.mResult, handler);
+ }
}
- }
- };
- } else {
- reply = new ReplyCallback<TypefaceResult>() {
- @Override
- public void onReply(final TypefaceResult typeface) {
- if (typeface == null) {
- fontCallback.onFontRetrievalFailed(
- FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND);
- } else if (typeface.mResult == FontFamilyResult.STATUS_OK) {
- fontCallback.onFontRetrieved(typeface.mTypeface);
- } else {
- fontCallback.onFontRetrievalFailed(typeface.mResult);
- }
- }
- };
- }
- }
+ };
- synchronized (sLock) {
- ArrayList<ReplyCallback<TypefaceResult>> pendingReplies = sPendingReplies.get(
- id);
- if (pendingReplies != null) {
- // Already requested. Do not request the same provider again and insert the
- // reply to the queue instead.
+ synchronized (sLock) {
+ ArrayList<ReplyCallback<TypefaceResult>> pendingReplies = sPendingReplies.get(id);
+ if (pendingReplies != null) {
+ // Already requested. Do not request the same provider again and insert the
+ // reply to the queue instead.
+ if (reply != null) {
+ pendingReplies.add(reply);
+ }
+ return null;
+ }
if (reply != null) {
+ pendingReplies = new ArrayList<>();
pendingReplies.add(reply);
+ sPendingReplies.put(id, pendingReplies);
}
- return null;
}
- if (reply != null) {
- pendingReplies = new ArrayList<>();
- pendingReplies.add(reply);
- sPendingReplies.put(id, pendingReplies);
- }
- }
-
- if (executor == null) {
sBackgroundThread.postAndReply(fetcher, new ReplyCallback<TypefaceResult>() {
@Override
public void onReply(final TypefaceResult typeface) {
@@ -467,22 +316,8 @@
}
}
});
- } else {
- executor.execute(new SyncFontFetchTask(fetcher,
- new OnFetchCompletedAndFirePendingReplyCallback(id)));
-
+ return null;
}
- return null;
- }
-
- /** @hide */
- @RestrictTo(LIBRARY_GROUP_PREFIX)
- public static Typeface getFontSync(final Context context, final FontRequest request,
- final @Nullable ResourcesCompat.FontCallback fontCallback,
- final @Nullable Handler handler, boolean isBlockingFetch, int timeout,
- final int style) {
- return getFontSync(context, request, fontCallback, handler, isBlockingFetch, timeout, style,
- false /* isCalledFromLayoutInflator */);
}
/**
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/fragment/fragment-ktx/api/1.2.0-alpha02.txt b/fragment/fragment-ktx/api/1.2.0-alpha02.txt
index 1ba3fb9..dd42d83 100644
--- a/fragment/fragment-ktx/api/1.2.0-alpha02.txt
+++ b/fragment/fragment-ktx/api/1.2.0-alpha02.txt
@@ -10,9 +10,9 @@
public final class FragmentTransactionKt {
ctor public FragmentTransactionKt();
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag);
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
}
public final class FragmentViewModelLazyKt {
diff --git a/fragment/fragment-ktx/api/current.txt b/fragment/fragment-ktx/api/current.txt
index 1ba3fb9..dd42d83 100644
--- a/fragment/fragment-ktx/api/current.txt
+++ b/fragment/fragment-ktx/api/current.txt
@@ -10,9 +10,9 @@
public final class FragmentTransactionKt {
ctor public FragmentTransactionKt();
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag);
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
}
public final class FragmentViewModelLazyKt {
diff --git a/fragment/fragment-ktx/api/restricted_1.2.0-alpha02.txt b/fragment/fragment-ktx/api/restricted_1.2.0-alpha02.txt
index 1ba3fb9..dd42d83 100644
--- a/fragment/fragment-ktx/api/restricted_1.2.0-alpha02.txt
+++ b/fragment/fragment-ktx/api/restricted_1.2.0-alpha02.txt
@@ -10,9 +10,9 @@
public final class FragmentTransactionKt {
ctor public FragmentTransactionKt();
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag);
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
}
public final class FragmentViewModelLazyKt {
diff --git a/fragment/fragment-ktx/api/restricted_current.txt b/fragment/fragment-ktx/api/restricted_current.txt
index 1ba3fb9..dd42d83 100644
--- a/fragment/fragment-ktx/api/restricted_current.txt
+++ b/fragment/fragment-ktx/api/restricted_current.txt
@@ -10,9 +10,9 @@
public final class FragmentTransactionKt {
ctor public FragmentTransactionKt();
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag);
- method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.FragmentTransaction, String tag, android.os.Bundle? args = null);
+ method public static inline <reified F extends androidx.fragment.app.Fragment> androidx.fragment.app.FragmentTransaction replace(androidx.fragment.app.FragmentTransaction, @IdRes int containerViewId, String? tag = null, android.os.Bundle? args = null);
}
public final class FragmentViewModelLazyKt {
diff --git a/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
index 2629dc3..9e33942 100644
--- a/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
+++ b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
@@ -16,6 +16,7 @@
package androidx.fragment.app
+import android.os.Bundle
import androidx.test.annotation.UiThreadTest
import androidx.test.filters.SmallTest
import androidx.test.rule.ActivityTestRule
@@ -30,12 +31,15 @@
@UiThreadTest
@Test fun addWithContainerId() {
+ val args = Bundle()
fragmentManager.beginTransaction()
- .add<TestFragment>(android.R.id.content, "tag")
+ .add<TestFragment>(android.R.id.content, "tag", args)
.commitNow()
val fragment = fragmentManager.findFragmentById(android.R.id.content)
assertThat(fragment)
.isInstanceOf(TestFragment::class.java)
+ assertThat(fragment?.arguments)
+ .isSameInstanceAs(args)
assertThat(fragmentManager.findFragmentByTag("tag"))
.isSameInstanceAs(fragment)
}
@@ -60,12 +64,15 @@
@UiThreadTest
@Test fun replaceWithTag() {
+ val args = Bundle()
fragmentManager.beginTransaction()
- .replace<TestFragment>(android.R.id.content, "tag")
+ .replace<TestFragment>(android.R.id.content, "tag", args)
.commitNow()
val fragment = fragmentManager.findFragmentById(android.R.id.content)
assertThat(fragment)
.isInstanceOf(TestFragment::class.java)
+ assertThat(fragment?.arguments)
+ .isSameInstanceAs(args)
assertThat(fragmentManager.findFragmentByTag("tag"))
.isSameInstanceAs(fragment)
}
diff --git a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentTransaction.kt b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentTransaction.kt
index 10547d6..514ac91 100644
--- a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentTransaction.kt
+++ b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentTransaction.kt
@@ -16,6 +16,7 @@
package androidx.fragment.app
+import android.os.Bundle
import androidx.annotation.IdRes
/**
@@ -31,13 +32,15 @@
* to be placed in.
* @param tag Optional tag name for the fragment, to later retrieve the
* fragment with [FragmentManager.findFragmentByTag].
+ * @param args Optional arguments to be set on the fragment.
*
* @return Returns the same [FragmentTransaction] instance.
*/
inline fun <reified F : Fragment> FragmentTransaction.add(
@IdRes containerViewId: Int,
- tag: String? = null
-) = add(containerViewId, F::class.java, tag)
+ tag: String? = null,
+ args: Bundle? = null
+) = add(containerViewId, F::class.java, args, tag)
/**
* Add a fragment to the associated [FragmentManager] without
@@ -48,12 +51,14 @@
*
* @param tag Tag name for the fragment, to later retrieve the
* fragment with [FragmentManager.findFragmentByTag].
+ * @param args Optional arguments to be set on the fragment.
*
* @return Returns the same [FragmentTransaction] instance.
*/
inline fun <reified F : Fragment> FragmentTransaction.add(
- tag: String
-) = add(F::class.java, tag)
+ tag: String,
+ args: Bundle? = null
+) = add(F::class.java, args, tag)
/**
* Replace an existing fragment that was added to a container. This is
@@ -68,10 +73,12 @@
* to be replaced.
* @param tag Optional tag name for the fragment, to later retrieve the
* fragment with [FragmentManager.findFragmentByTag].
+ * @param args Optional arguments to be set on the fragment.
*
* @return Returns the same [FragmentTransaction] instance.
*/
inline fun <reified F : Fragment> FragmentTransaction.replace(
@IdRes containerViewId: Int,
- tag: String? = null
-) = replace(containerViewId, F::class.java, tag)
+ tag: String? = null,
+ args: Bundle? = null
+) = replace(containerViewId, F::class.java, args, tag)
diff --git a/fragment/fragment/api/1.2.0-alpha02.txt b/fragment/fragment/api/1.2.0-alpha02.txt
index fbbd998..865189d 100644
--- a/fragment/fragment/api/1.2.0-alpha02.txt
+++ b/fragment/fragment/api/1.2.0-alpha02.txt
@@ -358,11 +358,11 @@
public abstract class FragmentTransaction {
ctor @Deprecated public FragmentTransaction();
- method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
- method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+ method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
@@ -377,9 +377,9 @@
method public boolean isAddToBackStackAllowed();
method public boolean isEmpty();
method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+ method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
diff --git a/fragment/fragment/api/current.txt b/fragment/fragment/api/current.txt
index fbbd998..865189d 100644
--- a/fragment/fragment/api/current.txt
+++ b/fragment/fragment/api/current.txt
@@ -358,11 +358,11 @@
public abstract class FragmentTransaction {
ctor @Deprecated public FragmentTransaction();
- method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
- method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+ method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
@@ -377,9 +377,9 @@
method public boolean isAddToBackStackAllowed();
method public boolean isEmpty();
method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+ method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
diff --git a/fragment/fragment/api/restricted_1.2.0-alpha02.txt b/fragment/fragment/api/restricted_1.2.0-alpha02.txt
index 3a73588..e2cf936 100644
--- a/fragment/fragment/api/restricted_1.2.0-alpha02.txt
+++ b/fragment/fragment/api/restricted_1.2.0-alpha02.txt
@@ -364,11 +364,11 @@
public abstract class FragmentTransaction {
ctor @Deprecated public FragmentTransaction();
- method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
- method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+ method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
@@ -383,9 +383,9 @@
method public boolean isAddToBackStackAllowed();
method public boolean isEmpty();
method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+ method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
diff --git a/fragment/fragment/api/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index 3a73588..e2cf936 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -364,11 +364,11 @@
public abstract class FragmentTransaction {
ctor @Deprecated public FragmentTransaction();
- method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction add(Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction add(androidx.fragment.app.Fragment, String?);
- method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+ method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction add(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction add(@IdRes int, androidx.fragment.app.Fragment, String?);
method public androidx.fragment.app.FragmentTransaction addSharedElement(android.view.View, String);
method public androidx.fragment.app.FragmentTransaction addToBackStack(String?);
@@ -383,9 +383,9 @@
method public boolean isAddToBackStackAllowed();
method public boolean isEmpty();
method public androidx.fragment.app.FragmentTransaction remove(androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>);
+ method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?);
method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment);
- method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, String?);
+ method public final androidx.fragment.app.FragmentTransaction replace(@IdRes int, Class<? extends androidx.fragment.app.Fragment>, android.os.Bundle?, String?);
method public androidx.fragment.app.FragmentTransaction replace(@IdRes int, androidx.fragment.app.Fragment, String?);
method public androidx.fragment.app.FragmentTransaction runOnCommit(Runnable);
method @Deprecated public androidx.fragment.app.FragmentTransaction setAllowOptimization(boolean);
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..5d7c1ac 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,17 @@
}
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 (viewLifecycleOwner.lifecycle.currentState
+ != Lifecycle.State.DESTROYED) {
+ 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/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
index 6059f65..2068923 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransactionTest.kt
@@ -86,8 +86,9 @@
@Test
@UiThreadTest
fun testAddTransactionByClassName() {
+ val args = Bundle()
activity.supportFragmentManager.beginTransaction()
- .add(R.id.content, CorrectFragment::class.java)
+ .add(R.id.content, CorrectFragment::class.java, args)
.addToBackStack(null)
.commit()
activity.supportFragmentManager.executePendingTransactions()
@@ -95,6 +96,8 @@
val fragment = activity.supportFragmentManager.findFragmentById(R.id.content)
assertThat(fragment)
.isInstanceOf(CorrectFragment::class.java)
+ assertThat(fragment?.arguments)
+ .isSameInstanceAs(args)
}
@Test
@@ -237,8 +240,9 @@
assertThat(activity.supportFragmentManager.findFragmentById(R.id.content))
.isSameInstanceAs(firstFragment)
+ val args = Bundle()
activity.supportFragmentManager.beginTransaction()
- .add(R.id.content, CorrectFragment::class.java)
+ .add(R.id.content, CorrectFragment::class.java, args)
.addToBackStack(null)
.commit()
activity.supportFragmentManager.executePendingTransactions()
@@ -246,6 +250,8 @@
val fragment = activity.supportFragmentManager.findFragmentById(R.id.content)
assertThat(fragment)
.isInstanceOf(CorrectFragment::class.java)
+ assertThat(fragment?.arguments)
+ .isSameInstanceAs(args)
}
@Test
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
index cc7deadd..e58aea0 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/StrictViewFragment.kt
@@ -59,4 +59,13 @@
checkState("onDestroyView", State.CREATED)
onDestroyViewCalled = true
}
+
+ override fun onDestroy() {
+ if (onCreateViewCalled) {
+ assertWithMessage("onDestroyView should be called before on Destroy")
+ .that(onDestroyViewCalled)
+ .isTrue()
+ }
+ super.onDestroy()
+ }
}
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..4282de9 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -177,6 +177,7 @@
* Callback interface for listening to fragment state changes that happen
* within a given FragmentManager.
*/
+ @SuppressWarnings("unused")
public abstract static class FragmentLifecycleCallbacks {
/**
* Called right before the fragment's {@link Fragment#onAttach(Context)} method is called.
@@ -1142,7 +1143,7 @@
if (f.mFromLayout && !f.mInLayout) {
return;
}
- if (f.getAnimatingAway() != null || f.getAnimator() != null) {
+ if (f.mState < newState && (f.getAnimatingAway() != null || f.getAnimator() != null)) {
// The fragment is currently being animated... but! Now we
// want to move our state back up. Give up on waiting for the
// animation, move to whatever the final state should be once
@@ -1341,13 +1342,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 +1361,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 +1479,7 @@
public void run() {
if (fragment.getAnimatingAway() != null) {
fragment.setAnimatingAway(null);
+ destroyFragmentView(fragment);
moveToState(fragment, fragment.getStateAfterAnimating(), 0, false);
}
}
@@ -1508,6 +1503,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 +1513,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);
}
@@ -2528,6 +2537,7 @@
animatingAway.clearAnimation();
}
fragment.setAnimatingAway(null);
+ destroyFragmentView(fragment);
moveToState(fragment, stateAfterAnimating, 0, false);
} else if (fragment.getAnimator() != null) {
fragment.getAnimator().end();
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
index c2622c5..d161dfb 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
@@ -136,7 +136,8 @@
}
@NonNull
- private Fragment createFragment(@NonNull Class<? extends Fragment> fragmentClass) {
+ private Fragment createFragment(@NonNull Class<? extends Fragment> fragmentClass,
+ @Nullable Bundle args) {
if (mFragmentFactory == null) {
throw new IllegalStateException("Creating a Fragment requires that this "
+ "FragmentTransaction was built with FragmentManager.beginTransaction()");
@@ -145,16 +146,20 @@
throw new IllegalStateException("The FragmentManager must be attached to its"
+ "host to create a Fragment");
}
- return mFragmentFactory.instantiate(mClassLoader, fragmentClass.getName());
+ Fragment fragment = mFragmentFactory.instantiate(mClassLoader, fragmentClass.getName());
+ if (args != null) {
+ fragment.setArguments(args);
+ }
+ return fragment;
}
/**
- * Calls {@link #add(int, Class, String)} with a 0 containerViewId.
+ * Calls {@link #add(int, Class, Bundle, String)} with a 0 containerViewId.
*/
@NonNull
public final FragmentTransaction add(@NonNull Class<? extends Fragment> fragmentClass,
- @Nullable String tag) {
- return add(createFragment(fragmentClass), tag);
+ @Nullable Bundle args, @Nullable String tag) {
+ return add(createFragment(fragmentClass, args), tag);
}
/**
@@ -167,12 +172,12 @@
}
/**
- * Calls {@link #add(int, Class, String)} with a null tag.
+ * Calls {@link #add(int, Class, Bundle, String)} with a null tag.
*/
@NonNull
public final FragmentTransaction add(@IdRes int containerViewId,
- @NonNull Class<? extends Fragment> fragmentClass) {
- return add(containerViewId, createFragment(fragmentClass));
+ @NonNull Class<? extends Fragment> fragmentClass, @Nullable Bundle args) {
+ return add(containerViewId, createFragment(fragmentClass, args));
}
/**
@@ -193,6 +198,7 @@
* to be placed in. If 0, it will not be placed in a container.
* @param fragmentClass The fragment to be added, created via the
* {@link FragmentManager#getFragmentFactory() FragmentManager's FragmentFactory}.
+ * @param args Optional arguments to be set on the fragment.
* @param tag Optional tag name for the fragment, to later retrieve the
* fragment with {@link FragmentManager#findFragmentByTag(String)
* FragmentManager.findFragmentByTag(String)}.
@@ -201,8 +207,9 @@
*/
@NonNull
public final FragmentTransaction add(@IdRes int containerViewId,
- @NonNull Class<? extends Fragment> fragmentClass, @Nullable String tag) {
- return add(containerViewId, createFragment(fragmentClass), tag);
+ @NonNull Class<? extends Fragment> fragmentClass,
+ @Nullable Bundle args, @Nullable String tag) {
+ return add(containerViewId, createFragment(fragmentClass, args), tag);
}
/**
@@ -263,12 +270,12 @@
}
/**
- * Calls {@link #replace(int, Class, String)} with a null tag.
+ * Calls {@link #replace(int, Class, Bundle, String)} with a null tag.
*/
@NonNull
public final FragmentTransaction replace(@IdRes int containerViewId,
- @NonNull Class<? extends Fragment> fragmentClass) {
- return replace(containerViewId, fragmentClass, null);
+ @NonNull Class<? extends Fragment> fragmentClass, @Nullable Bundle args) {
+ return replace(containerViewId, fragmentClass, args, null);
}
/**
@@ -290,6 +297,7 @@
* to be replaced.
* @param fragmentClass The new fragment to place in the container, created via the
* {@link FragmentManager#getFragmentFactory() FragmentManager's FragmentFactory}.
+ * @param args Optional arguments to be set on the fragment.
* @param tag Optional tag name for the fragment, to later retrieve the
* fragment with {@link FragmentManager#findFragmentByTag(String)
* FragmentManager.findFragmentByTag(String)}.
@@ -298,8 +306,9 @@
*/
@NonNull
public final FragmentTransaction replace(@IdRes int containerViewId,
- @NonNull Class<? extends Fragment> fragmentClass, @Nullable String tag) {
- return replace(containerViewId, createFragment(fragmentClass), tag);
+ @NonNull Class<? extends Fragment> fragmentClass,
+ @Nullable Bundle args, @Nullable String tag) {
+ return replace(containerViewId, createFragment(fragmentClass, args), tag);
}
/**
diff --git a/gradle.properties b/gradle.properties
index 408b78b..cac7300 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,5 +4,4 @@
org.gradle.parallel=true
org.gradle.caching=true
android.builder.sdkDownload=false
-android.enableR8=false
android.uniquePackageNames=true
\ No newline at end of file
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index 6b276ed7..03e7d2a 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -56,6 +56,10 @@
"to": "androidx/recyclerview/R{0}"
},
{
+ "from": "android/support/fragment/R(.*)",
+ "to": "androidx/fragment/R{0}"
+ },
+ {
"from": "android/support/v7/appcompat/R(.*)",
"to": "androidx/appcompat/R{0}"
},
@@ -638,10 +642,6 @@
"to": "ignore"
},
{
- "from": "androidx/fragment/R(.*)",
- "to": "ignore"
- },
- {
"from": "androidx/transition/(.*)",
"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-extensions/build.gradle b/lifecycle/lifecycle-extensions/build.gradle
index 754870d..f8bf748 100644
--- a/lifecycle/lifecycle-extensions/build.gradle
+++ b/lifecycle/lifecycle-extensions/build.gradle
@@ -28,8 +28,8 @@
dependencies {
api(project(":lifecycle:lifecycle-runtime"))
- api(project(":arch:core-common"))
- api(project(":arch:core-runtime"))
+ api("androidx.arch.core:core-common:2.1.0-rc01")
+ api("androidx.arch.core:core-runtime:2.1.0-rc01")
api(project(":fragment:fragment"))
api(project(":lifecycle:lifecycle-common"))
api(project(":lifecycle:lifecycle-livedata"))
@@ -37,7 +37,7 @@
api(project(":lifecycle:lifecycle-service"))
api(project(":lifecycle:lifecycle-viewmodel"))
- testImplementation(project(":arch:core-testing"))
+ testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
testImplementation(JUNIT)
testImplementation(MOCKITO_CORE)
@@ -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-livedata-core-ktx/build.gradle b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
index 256ff30..4c15329 100644
--- a/lifecycle/lifecycle-livedata-core-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-core-ktx/build.gradle
@@ -37,7 +37,7 @@
api(project(":lifecycle:lifecycle-livedata-core"))
api(KOTLIN_STDLIB)
testImplementation(project(":lifecycle:lifecycle-runtime"))
- testImplementation(project(":arch:core-testing"))
+ testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
testImplementation(JUNIT)
testImplementation(TRUTH)
}
diff --git a/lifecycle/lifecycle-livedata-core/build.gradle b/lifecycle/lifecycle-livedata-core/build.gradle
index e6f31a5..c9dd807 100644
--- a/lifecycle/lifecycle-livedata-core/build.gradle
+++ b/lifecycle/lifecycle-livedata-core/build.gradle
@@ -33,12 +33,12 @@
}
dependencies {
- implementation(project(":arch:core-common"))
- implementation(project(":arch:core-runtime"))
+ implementation("androidx.arch.core:core-common:2.1.0-rc01")
+ implementation("androidx.arch.core:core-runtime:2.1.0-rc01")
api(project(":lifecycle:lifecycle-common"))
testImplementation(project(":lifecycle:lifecycle-runtime"))
- testImplementation(project(":arch:core-testing"))
+ testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
testImplementation(JUNIT)
testImplementation(MOCKITO_CORE)
}
diff --git a/lifecycle/lifecycle-livedata-ktx/build.gradle b/lifecycle/lifecycle-livedata-ktx/build.gradle
index b289a13..6294159 100644
--- a/lifecycle/lifecycle-livedata-ktx/build.gradle
+++ b/lifecycle/lifecycle-livedata-ktx/build.gradle
@@ -43,7 +43,7 @@
api(KOTLIN_STDLIB)
api(KOTLIN_COROUTINES_CORE)
testImplementation(project(":lifecycle:lifecycle-runtime"))
- testImplementation(project(":arch:core-testing"))
+ testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
testImplementation(JUNIT)
testImplementation(TRUTH)
testImplementation(KOTLIN_COROUTINES_TEST)
diff --git a/lifecycle/lifecycle-livedata/build.gradle b/lifecycle/lifecycle-livedata/build.gradle
index 7b90f24..459085c 100644
--- a/lifecycle/lifecycle-livedata/build.gradle
+++ b/lifecycle/lifecycle-livedata/build.gradle
@@ -26,12 +26,12 @@
}
dependencies {
- implementation(project(":arch:core-common"))
- api(project(":arch:core-runtime"))
+ implementation("androidx.arch.core:core-common:2.1.0-rc01")
+ api("androidx.arch.core:core-runtime:2.1.0-rc01")
api(project(":lifecycle:lifecycle-livedata-core"))
testImplementation(project(":lifecycle:lifecycle-runtime"))
- testImplementation(project(":arch:core-testing"))
+ testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
testImplementation(JUNIT)
testImplementation(MOCKITO_CORE)
}
diff --git a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
index 7e02999..e6bb236 100644
--- a/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams-ktx/build.gradle
@@ -33,7 +33,7 @@
testImplementation(JUNIT)
testImplementation(RX_JAVA)
testImplementation(TRUTH)
- testImplementation(project(":arch:core-testing"))
+ testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
}
androidx {
diff --git a/lifecycle/lifecycle-reactivestreams/build.gradle b/lifecycle/lifecycle-reactivestreams/build.gradle
index b4fe266..cb9abe2 100644
--- a/lifecycle/lifecycle-reactivestreams/build.gradle
+++ b/lifecycle/lifecycle-reactivestreams/build.gradle
@@ -26,7 +26,7 @@
}
dependencies {
- api(project(":arch:core-common"))
+ api("androidx.arch.core:core-common:2.1.0-rc01")
api(project(":lifecycle:lifecycle-common"))
api(project(":lifecycle:lifecycle-livedata"))
api(project(":lifecycle:lifecycle-runtime"))
@@ -37,7 +37,7 @@
testImplementation(JUNIT)
testImplementation(RX_JAVA)
- testImplementation(project(":arch:core-testing"))
+ testImplementation("androidx.arch.core:core-testing:2.1.0-rc01")
}
androidx {
diff --git a/lifecycle/lifecycle-runtime/build.gradle b/lifecycle/lifecycle-runtime/build.gradle
index baafbee..6eb77fe 100644
--- a/lifecycle/lifecycle-runtime/build.gradle
+++ b/lifecycle/lifecycle-runtime/build.gradle
@@ -21,7 +21,7 @@
dependencies {
api(project(":lifecycle:lifecycle-common"))
- api(project(":arch:core-common"))
+ api("androidx.arch.core:core-common:2.1.0-rc01")
// necessary for IJ to resolve dependencies.
api("androidx.annotation:annotation:1.1.0")
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/lifecycle/lifecycle-viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
index 51f2e88..2d58931 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
@@ -34,7 +34,7 @@
dependencies {
api("androidx.annotation:annotation:1.0.0")
- api(project(":savedstate"))
+ api("androidx.savedstate:savedstate:1.0.0-rc01")
api(project(":lifecycle:lifecycle-livedata-core"))
api(project(":lifecycle:lifecycle-viewmodel"))
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/androidTest/java/androidx/media2/widget/VideoView_WithPlayerTest.java b/media2/widget/src/androidTest/java/androidx/media2/widget/VideoView_WithPlayerTest.java
index bd1c4b4..223a425 100644
--- a/media2/widget/src/androidTest/java/androidx/media2/widget/VideoView_WithPlayerTest.java
+++ b/media2/widget/src/androidTest/java/androidx/media2/widget/VideoView_WithPlayerTest.java
@@ -17,6 +17,7 @@
package androidx.media2.widget;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -26,7 +27,14 @@
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
+import android.graphics.Bitmap;
+import android.os.Build;
+import android.os.Handler;
+import android.os.HandlerThread;
import android.os.ParcelFileDescriptor;
+import android.util.Log;
+import android.view.PixelCopy;
+import android.view.SurfaceView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -55,15 +63,16 @@
@RunWith(Parameterized.class)
@LargeTest
public class VideoView_WithPlayerTest extends MediaWidgetTestBase {
+ static final String TAG = "VideoView_WithPlayerTest";
@Parameterized.Parameters(name = "PlayerType={0}")
public static List<String> getPlayerTypes() {
return Arrays.asList(PLAYER_TYPE_MEDIA_CONTROLLER, PLAYER_TYPE_MEDIA_PLAYER);
}
-
private String mPlayerType;
private Activity mActivity;
private VideoView mVideoView;
private MediaItem mMediaItem;
+ private SynchronousPixelCopy mPixelCopyHelper;
@Rule
public ActivityTestRule<VideoViewTestActivity> mActivityRule =
@@ -78,6 +87,7 @@
mActivity = mActivityRule.getActivity();
mVideoView = mActivity.findViewById(R.id.videoview);
mMediaItem = createTestMediaItem();
+ mPixelCopyHelper = new SynchronousPixelCopy();
setKeepScreenOn(mActivityRule);
checkAttachedToWindow(mVideoView);
@@ -91,6 +101,7 @@
closeAll();
}
});
+ mPixelCopyHelper.release();
}
@Test
@@ -105,6 +116,7 @@
playerWrapper.play();
assertTrue(callback.mPlayingLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+ checkVideoRendering();
}
@Test
@@ -126,6 +138,7 @@
playerWrapper.play();
assertTrue(callback.mPlayingLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+ checkVideoRendering();
}
@Test
@@ -154,6 +167,7 @@
playerWrapper.play();
assertTrue(callback.mPlayingLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+ checkVideoRendering();
}
@Test
@@ -186,6 +200,7 @@
playerWrapper.play();
assertTrue(callback.mPlayingLatch.await(WAIT_TIME_MS, TimeUnit.MILLISECONDS));
+ checkVideoRendering();
mActivityRule.runOnUiThread(new Runnable() {
@Override
@@ -195,6 +210,7 @@
});
verify(mockViewTypeListener, timeout(WAIT_TIME_MS))
.onViewTypeChanged(mVideoView, VideoView.VIEW_TYPE_TEXTUREVIEW);
+ checkVideoRendering();
}
// @UiThreadTest will be ignored by Parameterized test runner (b/30746303)
@@ -258,4 +274,102 @@
@Nullable MediaItem item) {
return createPlayerWrapperOfType(callback, item, mPlayerType);
}
+
+ private void checkVideoRendering() throws InterruptedException {
+ if (Build.VERSION.SDK_INT == 28) {
+ // TODO: This if-block for API 28 should be removed. (b/137321781)
+ return;
+ }
+ if (Build.VERSION.SDK_INT >= 24) {
+ final int bufferQueueToleranceMs = 200;
+ final int elapsedTimeForSecondScreenshotMs = 100;
+
+ // Tolerance until the video buffers are actually queued.
+ Thread.sleep(bufferQueueToleranceMs);
+ Bitmap beforeBitmap = getVideoScreenshot();
+ Thread.sleep(elapsedTimeForSecondScreenshotMs);
+ Bitmap afterBitmap = getVideoScreenshot();
+ assertFalse(afterBitmap.sameAs(beforeBitmap));
+ }
+ }
+
+ private Bitmap getVideoScreenshot() {
+ Bitmap bitmap = Bitmap.createBitmap(mVideoView.getWidth(),
+ mVideoView.getHeight(), Bitmap.Config.RGB_565);
+ if (mVideoView.getViewType() == mVideoView.VIEW_TYPE_SURFACEVIEW) {
+ int copyResult = mPixelCopyHelper.request(mVideoView.mSurfaceView, bitmap);
+ assertEquals("PixelCopy failed.", PixelCopy.SUCCESS, copyResult);
+ } else {
+ bitmap = mVideoView.mTextureView.getBitmap(bitmap);
+ }
+ return bitmap;
+ }
+
+ private static class SynchronousPixelCopy {
+ private Handler mHandler;
+ private HandlerThread mHandlerThread;
+ private int mStatus = PixelCopy.SUCCESS;
+
+ SynchronousPixelCopy() {
+ if (Build.VERSION.SDK_INT == 28) {
+ // TODO: This if-block for API 28 should be removed. (b/137321781)
+ return;
+ }
+ if (Build.VERSION.SDK_INT >= 24) {
+ this.mHandlerThread = new HandlerThread("PixelCopyHelper");
+ mHandlerThread.start();
+ this.mHandler = new Handler(mHandlerThread.getLooper());
+ }
+ }
+
+ public void release() {
+ if (Build.VERSION.SDK_INT == 28) {
+ // TODO: This if-block for API 28 should be removed. (b/137321781)
+ return;
+ }
+ if (Build.VERSION.SDK_INT >= 24) {
+ if (mHandlerThread.isAlive()) {
+ mHandlerThread.quitSafely();
+ }
+ }
+ }
+
+ public int request(SurfaceView source, Bitmap dest) {
+ if (Build.VERSION.SDK_INT == 28) {
+ // TODO: This if-block for API 28 should be removed. (b/137321781)
+ return -1;
+ }
+ if (Build.VERSION.SDK_INT < 24) {
+ return -1;
+ }
+ synchronized (this) {
+ try {
+ PixelCopy.request(source, dest, new PixelCopy.OnPixelCopyFinishedListener() {
+ @Override
+ public void onPixelCopyFinished(int copyResult) {
+ synchronized (this) {
+ mStatus = copyResult;
+ this.notify();
+ }
+ }
+ }, mHandler);
+ return getResultLocked();
+ } catch (Exception e) {
+ Log.e(TAG, "Exception occurred when copying a SurfaceView.", e);
+ return -1;
+ }
+ }
+ }
+
+ private int getResultLocked() {
+ try {
+ this.wait(1000);
+ } catch (InterruptedException e) {
+ /* PixelCopy request didn't complete within 1s */
+ mStatus = PixelCopy.ERROR_TIMEOUT;
+ }
+ Log.e(TAG, "PixelCopyResult: " + mStatus);
+ return mStatus;
+ }
+ }
}
diff --git a/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/MainFragment.kt b/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/MainFragment.kt
index e01289b..73e15ce 100644
--- a/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/MainFragment.kt
+++ b/navigation/integration-tests/testapp/src/main/java/androidx/navigation/testapp/MainFragment.kt
@@ -16,6 +16,7 @@
package androidx.navigation.testapp
+import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -46,6 +47,13 @@
val myarg = arguments?.getString("myarg")
tv.text = myarg
+ view.setBackgroundColor(
+ if (myarg == "one") {
+ Color.GREEN
+ } else {
+ Color.RED
+ })
+
val b = view.findViewById<Button>(R.id.next_button)
ViewCompat.setTransitionName(b, "next")
b.setOnClickListener {
diff --git a/navigation/integration-tests/testapp/src/main/res/anim/nav_default_enter_anim.xml b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_enter_anim.xml
new file mode 100644
index 0000000..adea235
--- /dev/null
+++ b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_enter_anim.xml
@@ -0,0 +1,22 @@
+<?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.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <translate android:fromXDelta="100%"
+ android:toXDelta="0%"
+ android:duration="@integer/config_navAnimTime"/>
+</set>
\ No newline at end of file
diff --git a/navigation/integration-tests/testapp/src/main/res/anim/nav_default_exit_anim.xml b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_exit_anim.xml
new file mode 100644
index 0000000..877aef1
--- /dev/null
+++ b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_exit_anim.xml
@@ -0,0 +1,20 @@
+<?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.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <translate android:duration="@integer/config_navAnimTime"/>
+</set>
\ No newline at end of file
diff --git a/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_enter_anim.xml b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_enter_anim.xml
new file mode 100644
index 0000000..fdaff75
--- /dev/null
+++ b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_enter_anim.xml
@@ -0,0 +1,22 @@
+<?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.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <translate android:fromXDelta="-100%"
+ android:toXDelta="0%"
+ android:duration="@integer/config_navAnimTime"/>
+</set>
\ No newline at end of file
diff --git a/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_exit_anim.xml b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_exit_anim.xml
new file mode 100644
index 0000000..877aef1
--- /dev/null
+++ b/navigation/integration-tests/testapp/src/main/res/anim/nav_default_pop_exit_anim.xml
@@ -0,0 +1,20 @@
+<?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.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <translate android:duration="@integer/config_navAnimTime"/>
+</set>
\ No newline at end of file
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/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/navigation/navigation-common-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.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/paging/runtime/api/res-2.2.0-alpha01.txt b/navigation/navigation-common/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.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/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/navigation/navigation-fragment-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.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/paging/runtime/api/res-2.2.0-alpha01.txt b/navigation/navigation-fragment/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.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-fragment/src/androidTest/res/layout/dynamic_navigation_activity.xml b/navigation/navigation-fragment/src/androidTest/res/layout/dynamic_navigation_activity.xml
index df82bf4..7752d89 100644
--- a/navigation/navigation-fragment/src/androidTest/res/layout/dynamic_navigation_activity.xml
+++ b/navigation/navigation-fragment/src/androidTest/res/layout/dynamic_navigation_activity.xml
@@ -15,7 +15,7 @@
~ limitations under the License.
-->
-<FrameLayout
+<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/navigation/navigation-fragment/src/androidTest/res/layout/embedded_xml_activity.xml b/navigation/navigation-fragment/src/androidTest/res/layout/embedded_xml_activity.xml
index 9adbc1f..513ef13 100644
--- a/navigation/navigation-fragment/src/androidTest/res/layout/embedded_xml_activity.xml
+++ b/navigation/navigation-fragment/src/androidTest/res/layout/embedded_xml_activity.xml
@@ -15,7 +15,7 @@
~ limitations under the License.
-->
-<FrameLayout
+<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/navigation/navigation-fragment/src/androidTest/res/layout/empty_activity.xml b/navigation/navigation-fragment/src/androidTest/res/layout/empty_activity.xml
index c586e95..dd4d487 100644
--- a/navigation/navigation-fragment/src/androidTest/res/layout/empty_activity.xml
+++ b/navigation/navigation-fragment/src/androidTest/res/layout/empty_activity.xml
@@ -15,7 +15,7 @@
~ limitations under the License.
-->
-<FrameLayout
+<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/navigation/navigation-fragment/src/androidTest/res/layout/start_destination_args_activity.xml b/navigation/navigation-fragment/src/androidTest/res/layout/start_destination_args_activity.xml
index 22de0e4..05379af 100644
--- a/navigation/navigation-fragment/src/androidTest/res/layout/start_destination_args_activity.xml
+++ b/navigation/navigation-fragment/src/androidTest/res/layout/start_destination_args_activity.xml
@@ -15,7 +15,7 @@
~ limitations under the License.
-->
-<FrameLayout
+<androidx.fragment.app.FragmentContainerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
index 7e07891..a58f68e 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/NavHostFragment.java
@@ -23,13 +23,13 @@
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.FrameLayout;
import androidx.annotation.CallSuper;
import androidx.annotation.NavigationRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentContainerView;
import androidx.navigation.NavController;
import androidx.navigation.NavGraph;
import androidx.navigation.NavHost;
@@ -297,13 +297,13 @@
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- FrameLayout frameLayout = new FrameLayout(inflater.getContext());
- // When added via XML, this has no effect (since this FrameLayout is given the ID
+ FragmentContainerView containerView = new FragmentContainerView(inflater.getContext());
+ // When added via XML, this has no effect (since this FragmentContainerView is given the ID
// automatically), but this ensures that the View exists as part of this Fragment's View
// hierarchy in cases where the NavHostFragment is added programmatically as is required
// for child fragment transactions
- frameLayout.setId(getId());
- return frameLayout;
+ containerView.setId(getId());
+ return containerView;
}
@Override
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/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/navigation/navigation-runtime-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.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/paging/runtime/api/res-2.2.0-alpha01.txt b/navigation/navigation-runtime/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.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-runtime/src/main/java/androidx/navigation/NavController.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
index 36dee96..f06382e 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.java
@@ -255,12 +255,12 @@
// Nothing to pop if the back stack is empty
return false;
}
- ArrayList<Navigator> popOperations = new ArrayList<>();
+ ArrayList<Navigator<?>> popOperations = new ArrayList<>();
Iterator<NavBackStackEntry> iterator = mBackStack.descendingIterator();
boolean foundDestination = false;
while (iterator.hasNext()) {
NavDestination destination = iterator.next().getDestination();
- Navigator navigator = mNavigatorProvider.getNavigator(
+ Navigator<?> navigator = mNavigatorProvider.getNavigator(
destination.getNavigatorName());
if (inclusive || destination.getId() != destinationId) {
popOperations.add(navigator);
@@ -279,7 +279,7 @@
return false;
}
boolean popped = false;
- for (Navigator navigator : popOperations) {
+ for (Navigator<?> navigator : popOperations) {
if (navigator.popBackStack()) {
NavBackStackEntry entry = mBackStack.removeLast();
if (mViewModel != null) {
@@ -466,7 +466,7 @@
KEY_NAVIGATOR_STATE_NAMES);
if (navigatorNames != null) {
for (String name : navigatorNames) {
- Navigator navigator = mNavigatorProvider.getNavigator(name);
+ Navigator<?> navigator = mNavigatorProvider.getNavigator(name);
Bundle bundle = mNavigatorStateToRestore.getBundle(name);
if (bundle != null) {
navigator.onRestoreState(bundle);
diff --git a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
index f0a63b7..a66a4a4 100644
--- a/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
+++ b/navigation/navigation-runtime/src/main/java/androidx/navigation/NavInflater.java
@@ -97,7 +97,7 @@
private NavDestination inflate(@NonNull Resources res, @NonNull XmlResourceParser parser,
@NonNull AttributeSet attrs, int graphResId)
throws XmlPullParserException, IOException {
- Navigator navigator = mNavigatorProvider.getNavigator(parser.getName());
+ Navigator<?> navigator = mNavigatorProvider.getNavigator(parser.getName());
final NavDestination dest = navigator.createDestination();
dest.onInflate(mContext, attrs);
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/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/navigation/navigation-ui-ktx/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.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/paging/runtime/api/res-2.2.0-alpha01.txt b/navigation/navigation-ui/api/res-2.2.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.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 490e0e7..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/common/api/2.2.0-alpha01.ignore b/paging/common/api/2.2.0-alpha01.ignore
deleted file mode 100644
index 614c125..0000000
--- a/paging/common/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,21 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.paging.DataSource#load$lintWithKotlin(androidx.paging.DataSource.Params<Key>, kotlin.coroutines.Continuation<? super androidx.paging.DataSource.BaseResult<Value>>):
- Added method androidx.paging.DataSource.load$lintWithKotlin(androidx.paging.DataSource.Params<Key>,kotlin.coroutines.Continuation<? super androidx.paging.DataSource.BaseResult<Value>>)
-AddedAbstractMethod: androidx.paging.PagedList#isContiguous():
- Added method androidx.paging.PagedList.isContiguous()
-
-
-ChangedAbstract: androidx.paging.PagedList#detach():
- Method androidx.paging.PagedList.detach has changed 'abstract' qualifier
-ChangedAbstract: androidx.paging.PagedList#isDetached():
- Method androidx.paging.PagedList.isDetached has changed 'abstract' qualifier
-
-
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadAfter$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.Result<Value>>) parameter #1:
- Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.Result.
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadBefore$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.Result<Value>>) parameter #1:
- Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.Result.
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadInitial$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.InitialResult<Value>>) parameter #1:
- Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.InitialResult.
-HiddenTypeParameter: androidx.paging.PositionalDataSource#loadInitial$lintWithKotlin(androidx.paging.PositionalDataSource.LoadInitialParams, kotlin.coroutines.Continuation<? super androidx.paging.PositionalDataSource.InitialResult<T>>) parameter #1:
- Parameter p references hidden type class androidx.paging.PositionalDataSource.InitialResult.
diff --git a/paging/common/api/2.2.0-alpha01.txt b/paging/common/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/common/api/2.2.0-alpha01.txt
rename to paging/common/api/3.0.0-alpha01.txt
diff --git a/paging/common/api/restricted_2.2.0-alpha01.ignore b/paging/common/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index b3a04a2..0000000
--- a/paging/common/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,25 +0,0 @@
-// Baseline format: 1.0
-AddedAbstractMethod: androidx.paging.DataSource#load$lintWithKotlin(androidx.paging.DataSource.Params<Key>, kotlin.coroutines.Continuation<? super androidx.paging.DataSource.BaseResult<Value>>):
- Added method androidx.paging.DataSource.load$lintWithKotlin(androidx.paging.DataSource.Params<Key>,kotlin.coroutines.Continuation<? super androidx.paging.DataSource.BaseResult<Value>>)
-AddedAbstractMethod: androidx.paging.PagedList#isContiguous():
- Added method androidx.paging.PagedList.isContiguous()
-
-
-ChangedAbstract: androidx.paging.PagedList#detach():
- Method androidx.paging.PagedList.detach has changed 'abstract' qualifier
-ChangedAbstract: androidx.paging.PagedList#isDetached():
- Method androidx.paging.PagedList.isDetached has changed 'abstract' qualifier
-
-
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadAfter$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.Result<Value>>) parameter #1:
- Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.Result.
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadBefore$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.Result<Value>>) parameter #1:
- Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.Result.
-HiddenTypeParameter: androidx.paging.ItemKeyedDataSource#loadInitial$lintWithKotlin(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key>, kotlin.coroutines.Continuation<? super androidx.paging.ItemKeyedDataSource.InitialResult<Value>>) parameter #1:
- Parameter p references hidden type class androidx.paging.ItemKeyedDataSource.InitialResult.
-HiddenTypeParameter: androidx.paging.PositionalDataSource#loadInitial$lintWithKotlin(androidx.paging.PositionalDataSource.LoadInitialParams, kotlin.coroutines.Continuation<? super androidx.paging.PositionalDataSource.InitialResult<T>>) parameter #1:
- Parameter p references hidden type class androidx.paging.PositionalDataSource.InitialResult.
-
-
-RemovedDeprecatedClass: androidx.paging.TiledDataSource:
- Removed deprecated class androidx.paging.TiledDataSource
diff --git a/paging/common/api/restricted_2.2.0-alpha01.txt b/paging/common/api/restricted_3.0.0-alpha01.txt
similarity index 100%
rename from paging/common/api/restricted_2.2.0-alpha01.txt
rename to paging/common/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/common/ktx/api/2.2.0-alpha01.ignore b/paging/common/ktx/api/2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/common/ktx/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
- Removed package androidx.paging
diff --git a/paging/common/ktx/api/2.2.0-alpha01.txt b/paging/common/ktx/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/common/ktx/api/2.2.0-alpha01.txt
rename to paging/common/ktx/api/3.0.0-alpha01.txt
diff --git a/paging/common/ktx/api/restricted_2.2.0-alpha01.ignore b/paging/common/ktx/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/common/ktx/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
- Removed package androidx.paging
diff --git a/paging/common/ktx/api/restricted_2.2.0-alpha01.txt b/paging/common/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/paging/common/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/paging/common/ktx/api/2.2.0-alpha01.txt b/paging/common/ktx/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/common/ktx/api/2.2.0-alpha01.txt
copy to paging/common/ktx/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt b/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
index 149b8bf..6f657c0 100644
--- a/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/ContiguousPagedList.kt
@@ -26,7 +26,7 @@
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
open class ContiguousPagedList<K : Any, V : Any>(
- override val dataSource: DataSource<K, V>,
+ final override val dataSource: DataSource<K, V>,
coroutineScope: CoroutineScope,
mainThreadExecutor: Executor,
backgroundThreadExecutor: Executor,
@@ -63,9 +63,19 @@
private var replacePagesWithNulls = false
- private val shouldTrim: Boolean
+ private val shouldTrim =
+ dataSource.supportsPageDropping && config.maxSize != Config.MAX_SIZE_UNBOUNDED
- private val pager: Pager<K, V>
+ private val pager = Pager(
+ coroutineScope,
+ config,
+ PagedSourceWrapper(dataSource),
+ mainThreadExecutor,
+ backgroundThreadExecutor,
+ this,
+ initialResult.toLoadResult(),
+ storage
+ )
override val isDetached
get() = pager.isDetached
@@ -84,7 +94,7 @@
/**
* Given a page result, apply or drop it, and return whether more loading is needed.
*/
- override fun onPageResult(type: LoadType, pageResult: DataSource.BaseResult<V>): Boolean {
+ override fun onPageResult(type: LoadType, pageResult: PagedSource.LoadResult<*, V>): Boolean {
var continueLoading = false
val page = pageResult.data
@@ -105,7 +115,7 @@
} else {
storage.appendPage(page, this@ContiguousPagedList)
appendItemsRequested -= page.size
- if (appendItemsRequested > 0 && page.size != 0) {
+ if (appendItemsRequested > 0 && page.isNotEmpty()) {
continueLoading = true
}
}
@@ -116,7 +126,7 @@
} else {
storage.prependPage(page, this@ContiguousPagedList)
prependItemsRequested -= page.size
- if (prependItemsRequested > 0 && page.size != 0) {
+ if (prependItemsRequested > 0 && page.isNotEmpty()) {
continueLoading = true
}
}
@@ -188,17 +198,6 @@
init {
this.lastLoad = lastLoad
- pager = Pager(
- coroutineScope,
- config,
- PagedSourceWrapper(dataSource), // TODO: Fix non-final in constructor.
- mainThreadExecutor,
- backgroundThreadExecutor,
- this,
- storage,
- initialResult
- )
-
if (config.enablePlaceholders) {
// Placeholders enabled, pass raw data to storage init
storage.init(
@@ -220,9 +219,6 @@
)
}
- shouldTrim =
- dataSource.supportsPageDropping && config.maxSize != Config.MAX_SIZE_UNBOUNDED
-
if (this.lastLoad == LAST_LOAD_UNSPECIFIED) {
// Because the ContiguousPagedList wasn't initialized with a last load position,
// initialize it to the middle of the initial load
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
index af77cc1..28e3323 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedList.kt
@@ -393,7 +393,7 @@
* Does not affect initial load, which will be done immediately on whichever thread the
* [PagedList] is created on.
*
- * @param fetchExecutor [Executor] used to fetch from [DataSources], generally a background
+ * @param fetchExecutor [Executor] used to fetch from [DataSource]s, generally a background
* thread pool for e.g. I/O or network loading.
* @return this
*/
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt b/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
index d2c2ac0..a892bcf 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedSource.kt
@@ -154,7 +154,14 @@
* implementations of [PagedSource].
*/
val counted: Boolean
- )
+ ) {
+ internal companion object {
+ @Suppress("MemberVisibilityCanBePrivate") // Prevent synthetic accessor generation.
+ internal val EMPTY = LoadResult(0, 0, null, null, emptyList(), 0, true)
+ @Suppress("UNCHECKED_CAST") // Can safely ignore, since the list is empty.
+ internal fun <Key : Any, Value : Any> empty() = EMPTY as LoadResult<Key, Value>
+ }
+ }
/**
* Used to define how pages are indexed, one of:
diff --git a/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt b/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
index 92f300f..96708fc 100644
--- a/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/PagedStorage.kt
@@ -17,6 +17,7 @@
package androidx.paging
import androidx.annotation.RestrictTo
+import androidx.paging.PagedSource.LoadResult
import java.util.AbstractList
/**
@@ -300,10 +301,7 @@
)
}
- override fun onPageResultResolution(
- type: PagedList.LoadType,
- result: DataSource.BaseResult<T>
- ) {
+ override fun onPageResultResolution(type: PagedList.LoadType, result: LoadResult<*, T>) {
// ignored
}
diff --git a/paging/common/src/main/kotlin/androidx/paging/Pager.kt b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
index 249b0e7..52d7dba 100644
--- a/paging/common/src/main/kotlin/androidx/paging/Pager.kt
+++ b/paging/common/src/main/kotlin/androidx/paging/Pager.kt
@@ -18,6 +18,7 @@
import androidx.paging.PagedList.LoadState
import androidx.paging.PagedList.LoadType
+import androidx.paging.PagedSource.Companion.COUNT_UNDEFINED
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.launch
@@ -31,11 +32,10 @@
val notifyExecutor: Executor,
private val fetchExecutor: Executor,
val pageConsumer: PageConsumer<V>,
- adjacentProvider: AdjacentProvider<V>?,
- result: DataSource.BaseResult<V>
+ result: PagedSource.LoadResult<K, V>,
+ private val adjacentProvider: AdjacentProvider<V> = SimpleAdjacentProvider()
) {
private val totalCount: Int
- private val adjacentProvider: AdjacentProvider<V>
private var prevKey: K? = null
private var nextKey: K? = null
private val detached = AtomicBoolean(false)
@@ -49,17 +49,18 @@
get() = detached.get()
init {
- this.adjacentProvider = adjacentProvider ?: SimpleAdjacentProvider()
- @Suppress("UNCHECKED_CAST")
- prevKey = result.prevKey as K?
- @Suppress("UNCHECKED_CAST")
- nextKey = result.nextKey as K?
+ prevKey = result.prevKey
+ nextKey = result.nextKey
this.adjacentProvider.onPageResultResolution(LoadType.REFRESH, result)
- totalCount = result.totalCount()
+ totalCount = when (result.counted) {
+ // only one of leadingNulls / offset may be used
+ true -> result.itemsBefore + result.offset + result.data.size + result.itemsAfter
+ else -> COUNT_UNDEFINED
+ }
}
private fun listenTo(type: LoadType, future: suspend () -> PagedSource.LoadResult<K, V>) {
- // First listen on the BG thread if the DataSource is invalid, since it can be expensive
+ // Listen on the BG thread if the paged source is invalid, since it can be expensive.
pagedListScope.launch(fetchExecutor.asCoroutineDispatcher()) {
try {
val value = future()
@@ -71,16 +72,8 @@
}
// Source has been verified to be valid after producing data, so sent data to UI
- pagedListScope.launch(notifyExecutor.asCoroutineDispatcher()) {
- onLoadSuccess(type, object : DataSource.BaseResult<V>(
- value.data,
- value.prevKey,
- value.nextKey,
- value.itemsBefore,
- value.itemsAfter,
- value.offset,
- value.counted
- ) {})
+ launch(notifyExecutor.asCoroutineDispatcher()) {
+ onLoadSuccess(type, value)
}
} catch (throwable: Throwable) {
onLoadError(type, throwable)
@@ -92,7 +85,7 @@
/**
* @return `true` if we need to fetch more
*/
- fun onPageResult(type: LoadType, pageResult: DataSource.BaseResult<V>): Boolean
+ fun onPageResult(type: LoadType, pageResult: PagedSource.LoadResult<*, V>): Boolean
fun onStateChanged(type: LoadType, state: LoadState, error: Throwable?)
}
@@ -110,10 +103,10 @@
* implementation of the AdjacentProvider to handle this (generally by ignoring this call if
* dropping is supported).
*/
- fun onPageResultResolution(type: LoadType, result: DataSource.BaseResult<V>)
+ fun onPageResultResolution(type: LoadType, result: PagedSource.LoadResult<*, V>)
}
- private fun onLoadSuccess(type: LoadType, value: DataSource.BaseResult<V>) {
+ private fun onLoadSuccess(type: LoadType, value: PagedSource.LoadResult<K, V>) {
if (isDetached) return // abort!
adjacentProvider.onPageResultResolution(type, value)
@@ -121,13 +114,11 @@
if (pageConsumer.onPageResult(type, value)) {
when (type) {
LoadType.START -> {
- @Suppress("UNCHECKED_CAST")
- prevKey = value.prevKey as K?
+ prevKey = value.prevKey
schedulePrepend()
}
LoadType.END -> {
- @Suppress("UNCHECKED_CAST")
- nextKey = value.nextKey as K?
+ nextKey = value.nextKey
scheduleAppend()
}
else -> throw IllegalStateException("Can only fetch more during append/prepend")
@@ -159,21 +150,21 @@
private fun canPrepend() = when (totalCount) {
// don't know count / position from initial load, so be conservative, return true
- DataSource.BaseResult.TOTAL_COUNT_UNKNOWN -> true
+ COUNT_UNDEFINED -> true
// position is known, do we have space left?
else -> adjacentProvider.firstLoadedItemIndex > 0
}
private fun canAppend() = when (totalCount) {
// don't know count / position from initial load, so be conservative, return true
- DataSource.BaseResult.TOTAL_COUNT_UNKNOWN -> true
+ COUNT_UNDEFINED -> true
// count is known, do we have space left?
else -> adjacentProvider.lastLoadedItemIndex < totalCount - 1
}
private fun schedulePrepend() {
if (!canPrepend()) {
- onLoadSuccess(LoadType.START, DataSource.BaseResult.empty())
+ onLoadSuccess(LoadType.START, PagedSource.LoadResult.empty())
return
}
@@ -204,7 +195,7 @@
private fun scheduleAppend() {
if (!canAppend()) {
- onLoadSuccess(LoadType.END, DataSource.BaseResult.empty())
+ onLoadSuccess(LoadType.END, PagedSource.LoadResult.empty())
return
}
@@ -253,7 +244,7 @@
private var leadingUnloadedCount: Int = 0
private var trailingUnloadedCount: Int = 0
- override fun onPageResultResolution(type: LoadType, result: DataSource.BaseResult<V>) {
+ override fun onPageResultResolution(type: LoadType, result: PagedSource.LoadResult<*, V>) {
if (result.data.isEmpty()) return
if (type == LoadType.START) {
@@ -269,15 +260,15 @@
trailingUnloadedCount -= result.data.size
}
} else {
- firstLoadedItemIndex = result.leadingNulls + result.offset
+ firstLoadedItemIndex = result.itemsBefore + result.offset
lastLoadedItemIndex = firstLoadedItemIndex + result.data.size - 1
firstLoadedItem = result.data[0]
lastLoadedItem = result.data.last()
if (result.counted) {
counted = true
- leadingUnloadedCount = result.leadingNulls
- trailingUnloadedCount = result.trailingNulls
+ leadingUnloadedCount = result.itemsBefore
+ trailingUnloadedCount = result.itemsAfter
}
}
}
diff --git a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
index cbccee3f..67238ac 100644
--- a/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
+++ b/paging/common/src/test/kotlin/androidx/paging/PagerTest.kt
@@ -65,11 +65,11 @@
val data = List(9) { "$it" }
private fun rangeResult(start: Int, end: Int) =
- PositionalDataSource.RangeResult(data.subList(start, end))
+ PositionalDataSource.RangeResult(data.subList(start, end)).toLoadResult<Int>()
private data class Result(
val type: PagedList.LoadType,
- val pageResult: DataSource.BaseResult<String>
+ val pageResult: PagedSource.LoadResult<*, String>
)
private data class StateChange(
@@ -97,7 +97,7 @@
override fun onPageResult(
type: PagedList.LoadType,
- pageResult: DataSource.BaseResult<String>
+ pageResult: PagedSource.LoadResult<*, String>
): Boolean {
results.add(Result(type, pageResult))
return false
@@ -119,8 +119,11 @@
DirectExecutor,
DirectExecutor,
consumer,
- null,
- PositionalDataSource.InitialResult(data.subList(start, end), start, data.size)
+ PositionalDataSource.InitialResult(
+ data.subList(start, end),
+ start,
+ data.size
+ ).toLoadResult()
)
@Test
@@ -240,7 +243,7 @@
// Pager triggers an immediate empty response here, so we don't need to flush the executor
assertEquals(
listOf(
- Result(END, DataSource.BaseResult.empty())
+ Result(END, PagedSource.LoadResult.empty<Int, String>())
), consumer.takeResults()
)
assertEquals(
@@ -260,7 +263,7 @@
// Pager triggers an immediate empty response here, so we don't need to flush the executor
assertEquals(
listOf(
- Result(START, DataSource.BaseResult.empty())
+ Result(START, PagedSource.LoadResult.empty<Int, String>())
), consumer.takeResults()
)
assertEquals(
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/api/2.2.0-alpha01.ignore b/paging/runtime/api/2.2.0-alpha01.ignore
deleted file mode 100644
index 1d7b31a..0000000
--- a/paging/runtime/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedMethod: androidx.paging.AsyncPagedListDiffer#AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T>):
- Removed constructor androidx.paging.AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter,androidx.recyclerview.widget.DiffUtil.ItemCallback<T>)
diff --git a/paging/runtime/api/2.2.0-alpha01.txt b/paging/runtime/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/runtime/api/2.2.0-alpha01.txt
rename to paging/runtime/api/3.0.0-alpha01.txt
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/paging/runtime/api/res-3.0.0-alpha01.txt
similarity index 100%
rename from paging/runtime/api/res-2.2.0-alpha01.txt
rename to paging/runtime/api/res-3.0.0-alpha01.txt
diff --git a/paging/runtime/api/restricted_2.2.0-alpha01.ignore b/paging/runtime/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index 1d7b31a..0000000
--- a/paging/runtime/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedMethod: androidx.paging.AsyncPagedListDiffer#AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T>):
- Removed constructor androidx.paging.AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter,androidx.recyclerview.widget.DiffUtil.ItemCallback<T>)
diff --git a/paging/runtime/api/restricted_2.2.0-alpha01.txt b/paging/runtime/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index b5b45fe..0000000
--- a/paging/runtime/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-// Signature format: 3.0
-package androidx.paging {
-
- public class AsyncPagedListDiffer<T> {
- ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
- ctor public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function3<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,? super java.lang.Throwable,kotlin.Unit> listener);
- method public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
- method public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
- method public androidx.paging.PagedList<T>? getCurrentList();
- method public T? getItem(int index);
- method public int getItemCount();
- method public void removeLoadStateListener(kotlin.jvm.functions.Function3<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,? super java.lang.Throwable,kotlin.Unit> listener);
- method public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
- method public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
- method public void submitList(androidx.paging.PagedList<T>? pagedList);
- method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
- property public androidx.paging.PagedList<T>? currentList;
- property public int itemCount;
- }
-
- public static interface AsyncPagedListDiffer.PagedListListener<T> {
- method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
- }
-
- public final class AsyncPagedListDifferKt {
- ctor public AsyncPagedListDifferKt();
- }
-
- public final class LivePagedListBuilder<Key, Value> {
- ctor public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
- ctor public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
- method public androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> build();
- method public androidx.paging.LivePagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
- method public androidx.paging.LivePagedListBuilder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
- method public androidx.paging.LivePagedListBuilder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
- method public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
- }
-
- public final class LivePagedListKt {
- ctor public LivePagedListKt();
- method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
- method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, java.util.concurrent.Executor fetchExecutor = ArchTaskExecutor.getIOThreadExecutor());
- }
-
- public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
- ctor protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
- ctor protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
- method public void addLoadStateListener(kotlin.jvm.functions.Function3<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,? super java.lang.Throwable,kotlin.Unit> callback);
- method public androidx.paging.PagedList<T>? getCurrentList();
- method protected T? getItem(int position);
- method public int getItemCount();
- method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
- method public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
- method public void onLoadStateChanged(androidx.paging.PagedList.LoadType type, androidx.paging.PagedList.LoadState state, Throwable? error);
- method public void removeLoadStateListener(kotlin.jvm.functions.Function3<? super androidx.paging.PagedList.LoadType,? super androidx.paging.PagedList.LoadState,? super java.lang.Throwable,kotlin.Unit> callback);
- method public void submitList(androidx.paging.PagedList<T>? pagedList);
- method public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
- property public androidx.paging.PagedList<T>? currentList;
- }
-
- public final class PagedStorageDiffHelperKt {
- ctor public PagedStorageDiffHelperKt();
- }
-
-}
-
diff --git a/paging/runtime/api/2.2.0-alpha01.txt b/paging/runtime/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/2.2.0-alpha01.txt
copy to paging/runtime/api/restricted_3.0.0-alpha01.txt
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/paging/runtime/ktx/api/2.2.0-alpha01.ignore b/paging/runtime/ktx/api/2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/runtime/ktx/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
- Removed package androidx.paging
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.txt b/paging/runtime/ktx/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/runtime/ktx/api/2.2.0-alpha01.txt
rename to paging/runtime/ktx/api/3.0.0-alpha01.txt
diff --git a/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/paging/runtime/ktx/api/res-3.0.0-alpha01.txt
similarity index 100%
rename from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
rename to paging/runtime/ktx/api/res-3.0.0-alpha01.txt
diff --git a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore b/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
- Removed package androidx.paging
diff --git a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.txt b/paging/runtime/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/paging/runtime/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/paging/runtime/ktx/api/2.2.0-alpha01.txt b/paging/runtime/ktx/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/2.2.0-alpha01.txt
copy to paging/runtime/ktx/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
index a487a4f..7056e8f 100644
--- a/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
+++ b/paging/runtime/src/main/java/androidx/paging/LivePagedList.kt
@@ -75,8 +75,9 @@
currentJob?.cancel()
currentJob = coroutineScope.launch(fetchExecutor.asCoroutineDispatcher()) {
try {
+ val pagedList = createPagedList()
withContext(notifyExecutor.asCoroutineDispatcher()) {
- onSuccess(createPagedList())
+ onSuccess(pagedList)
}
} catch (throwable: Throwable) {
withContext(notifyExecutor.asCoroutineDispatcher()) {
diff --git a/paging/rxjava2/api/2.2.0-alpha01.txt b/paging/rxjava2/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/rxjava2/api/2.2.0-alpha01.txt
rename to paging/rxjava2/api/3.0.0-alpha01.txt
diff --git a/paging/rxjava2/api/res-2.2.0-alpha01.txt b/paging/rxjava2/api/res-3.0.0-alpha01.txt
similarity index 100%
rename from paging/rxjava2/api/res-2.2.0-alpha01.txt
rename to paging/rxjava2/api/res-3.0.0-alpha01.txt
diff --git a/paging/rxjava2/api/restricted_2.2.0-alpha01.txt b/paging/rxjava2/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index e5028e2..0000000
--- a/paging/rxjava2/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-// Signature format: 3.0
-package androidx.paging {
-
- public final class RxPagedListBuilder<Key, Value> {
- ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
- ctor public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
- method public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
- method public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
- method public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
- method public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
- method public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
- method public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
- }
-
- public final class RxPagedListKt {
- ctor public RxPagedListKt();
- method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
- method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null, io.reactivex.BackpressureStrategy backpressureStrategy = io.reactivex.BackpressureStrategy.LATEST);
- method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
- method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, Key? initialLoadKey = null, androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback = null, io.reactivex.Scheduler? fetchScheduler = null, io.reactivex.Scheduler? notifyScheduler = null);
- }
-
-}
-
diff --git a/paging/rxjava2/api/2.2.0-alpha01.txt b/paging/rxjava2/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/rxjava2/api/2.2.0-alpha01.txt
copy to paging/rxjava2/api/restricted_3.0.0-alpha01.txt
diff --git a/paging/rxjava2/ktx/api/2.2.0-alpha01.ignore b/paging/rxjava2/ktx/api/2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/rxjava2/ktx/api/2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
- Removed package androidx.paging
diff --git a/paging/rxjava2/ktx/api/2.2.0-alpha01.txt b/paging/rxjava2/ktx/api/3.0.0-alpha01.txt
similarity index 100%
rename from paging/rxjava2/ktx/api/2.2.0-alpha01.txt
rename to paging/rxjava2/ktx/api/3.0.0-alpha01.txt
diff --git a/paging/rxjava2/ktx/api/res-2.2.0-alpha01.txt b/paging/rxjava2/ktx/api/res-3.0.0-alpha01.txt
similarity index 100%
rename from paging/rxjava2/ktx/api/res-2.2.0-alpha01.txt
rename to paging/rxjava2/ktx/api/res-3.0.0-alpha01.txt
diff --git a/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.ignore b/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.ignore
deleted file mode 100644
index ffce0e5..0000000
--- a/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.ignore
+++ /dev/null
@@ -1,3 +0,0 @@
-// Baseline format: 1.0
-RemovedPackage: androidx.paging:
- Removed package androidx.paging
diff --git a/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.txt b/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.txt
deleted file mode 100644
index da4f6cc..0000000
--- a/paging/rxjava2/ktx/api/restricted_2.2.0-alpha01.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 3.0
diff --git a/paging/rxjava2/ktx/api/2.2.0-alpha01.txt b/paging/rxjava2/ktx/api/restricted_3.0.0-alpha01.txt
similarity index 100%
copy from paging/rxjava2/ktx/api/2.2.0-alpha01.txt
copy to paging/rxjava2/ktx/api/restricted_3.0.0-alpha01.txt
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/QueryInterpreterTest.kt b/room/compiler/src/test/kotlin/androidx/room/processor/QueryInterpreterTest.kt
index d0c71bf..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) { 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`,
@@ -580,7 +583,10 @@
handler: (expanded: String, invocation: TestInvocation) -> Unit
): CompileTester {
val all = ENTITIES + JavaFileObjects.forSourceString(name, DATABASE_PREFIX + input)
- return simpleRun(*all) { invocation ->
+ return simpleRun(
+ jfos = *all,
+ options = listOf("-Aroom.expandProjection=true")
+ ) { invocation ->
val entities = invocation.roundEnv
.getElementsAnnotatedWith(androidx.room.Entity::class.java)
.map { element ->
@@ -601,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/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 72731f6..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
@@ -183,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 {
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/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BaseDao.kt b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BaseDao.kt
index 5224667..1653a0e 100644
--- a/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BaseDao.kt
+++ b/room/integration-tests/kotlintestapp/src/androidTest/java/androidx/room/integration/kotlintestapp/dao/BaseDao.kt
@@ -30,6 +30,12 @@
fun insertAll(t: List<T>)
@Insert
+ fun insertAllSet(t: Set<T>): List<Long>
+
+ @Insert
+ fun insertAllCollection(t: Collection<T>): Array<Long>
+
+ @Insert
fun insertAllArg(vararg t: T)
@Update
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/MultiInstanceInvalidationTest.java b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
index be78eb4..7b6dad7 100644
--- a/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
+++ b/room/integration-tests/testapp/src/androidTest/java/androidx/room/integration/testapp/test/MultiInstanceInvalidationTest.java
@@ -44,7 +44,6 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
-import androidx.test.filters.MediumTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ServiceTestRule;
@@ -63,6 +62,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+@LargeTest
@RunWith(AndroidJUnit4.class)
public class MultiInstanceInvalidationTest {
@@ -110,7 +110,6 @@
}
@Test
- @MediumTest
public void invalidateInAnotherInstance() throws Exception {
final SampleDatabase db1 = openDatabase(true);
final SampleDatabase db2 = openDatabase(true);
@@ -125,7 +124,6 @@
}
@Test
- @LargeTest
public void invalidationInAnotherInstance_noMultiInstanceInvalidation() throws Exception {
final SampleDatabase db1 = openDatabase(false);
final SampleDatabase db2 = openDatabase(false);
@@ -146,7 +144,6 @@
}
@Test
- @LargeTest
public void invalidationInAnotherInstance_mixed() throws Exception {
final SampleDatabase db1 = openDatabase(false);
final SampleDatabase db2 = openDatabase(true); // Enabled only on one side
@@ -167,7 +164,6 @@
}
@Test
- @LargeTest
public void invalidationInAnotherInstance_closed() throws Exception {
final SampleDatabase db1 = openDatabase(true);
final SampleDatabase db2 = openDatabase(true);
@@ -198,7 +194,6 @@
}
@Test
- @LargeTest
public void invalidationCausesNoLoop() throws Exception {
final SampleDatabase db1 = openDatabase(true);
final SampleDatabase db2 = openDatabase(true);
@@ -213,7 +208,6 @@
}
@Test
- @MediumTest
public void reopen() throws Exception {
final SampleDatabase db1 = openDatabase(true);
final Product product = new Product();
@@ -230,7 +224,6 @@
}
@Test
- @MediumTest
public void invalidatedByAnotherProcess() throws Exception {
bindTestService();
final SampleDatabase db = openDatabase(true);
@@ -246,7 +239,6 @@
}
@Test
- @MediumTest
public void invalidateAnotherProcess() throws Exception {
bindTestService();
final SampleDatabase db = openDatabase(true);
@@ -258,7 +250,6 @@
// TODO: b/72877822 Better performance measurement
@Ignore
@Test
- @LargeTest
public void performance_oneByOne() {
final List<Customer> customers = generateCustomers(100);
final long[] elapsed = measureSeveralTimesEach(false, customers);
@@ -269,7 +260,6 @@
// TODO: b/72877822 Better performance measurement
@Ignore
@Test
- @LargeTest
public void performance_bulk() {
final List<Customer> customers = generateCustomers(10000);
final long[] elapsed = measureSeveralTimesEach(true, customers);
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/runtime/api/restricted_2.2.0-alpha02.txt b/room/runtime/api/restricted_2.2.0-alpha02.txt
index f3a1d00..8111b31 100644
--- a/room/runtime/api/restricted_2.2.0-alpha02.txt
+++ b/room/runtime/api/restricted_2.2.0-alpha02.txt
@@ -38,12 +38,12 @@
method public final void insert(T![]!);
method public final void insert(Iterable<? extends T>!);
method public final long insertAndReturnId(T!);
- method public final long[]! insertAndReturnIdsArray(java.util.Collection<T!>!);
+ method public final long[]! insertAndReturnIdsArray(java.util.Collection<? extends T>!);
method public final long[]! insertAndReturnIdsArray(T![]!);
- method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<T!>!);
+ method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<? extends T>!);
method public final Long![]! insertAndReturnIdsArrayBox(T![]!);
method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(T![]!);
- method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<T!>!);
+ method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<? extends T>!);
}
public class InvalidationTracker {
diff --git a/room/runtime/api/restricted_current.txt b/room/runtime/api/restricted_current.txt
index f3a1d00..8111b31 100644
--- a/room/runtime/api/restricted_current.txt
+++ b/room/runtime/api/restricted_current.txt
@@ -38,12 +38,12 @@
method public final void insert(T![]!);
method public final void insert(Iterable<? extends T>!);
method public final long insertAndReturnId(T!);
- method public final long[]! insertAndReturnIdsArray(java.util.Collection<T!>!);
+ method public final long[]! insertAndReturnIdsArray(java.util.Collection<? extends T>!);
method public final long[]! insertAndReturnIdsArray(T![]!);
- method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<T!>!);
+ method public final Long![]! insertAndReturnIdsArrayBox(java.util.Collection<? extends T>!);
method public final Long![]! insertAndReturnIdsArrayBox(T![]!);
method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(T![]!);
- method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<T!>!);
+ method public final java.util.List<java.lang.Long!>! insertAndReturnIdsList(java.util.Collection<? extends T>!);
}
public class InvalidationTracker {
diff --git a/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java b/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
index 8572f9e..3046d6c 100644
--- a/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
+++ b/room/runtime/src/main/java/androidx/room/EntityInsertionAdapter.java
@@ -123,7 +123,7 @@
* @param entities Entities to insert
* @return The SQLite row ids, for entities that are not inserted the row id returned will be -1
*/
- public final long[] insertAndReturnIdsArray(Collection<T> entities) {
+ public final long[] insertAndReturnIdsArray(Collection<? extends T> entities) {
final SupportSQLiteStatement stmt = acquire();
try {
final long[] result = new long[entities.size()];
@@ -167,7 +167,7 @@
* @param entities Entities to insert
* @return The SQLite row ids, for entities that are not inserted the row id returned will be -1
*/
- public final Long[] insertAndReturnIdsArrayBox(Collection<T> entities) {
+ public final Long[] insertAndReturnIdsArrayBox(Collection<? extends T> entities) {
final SupportSQLiteStatement stmt = acquire();
try {
final Long[] result = new Long[entities.size()];
@@ -233,7 +233,7 @@
* @param entities Entities to insert
* @return The SQLite row ids, for entities that are not inserted the row id returned will be -1
*/
- public final List<Long> insertAndReturnIdsList(Collection<T> entities) {
+ public final List<Long> insertAndReturnIdsList(Collection<? extends T> entities) {
final SupportSQLiteStatement stmt = acquire();
try {
final List<Long> result = new ArrayList<>(entities.size());
diff --git a/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationClient.java b/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationClient.java
index bf24bf1..3aeddcc 100644
--- a/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationClient.java
+++ b/room/runtime/src/main/java/androidx/room/MultiInstanceInvalidationClient.java
@@ -38,12 +38,11 @@
class MultiInstanceInvalidationClient {
/**
- * If this is {@link null}, this {@link MultiInstanceInvalidationClient} is no longer available.
+ * The application context.
*/
// synthetic access
@SuppressWarnings("WeakerAccess")
- @Nullable
- Context mContext;
+ final Context mAppContext;
/**
* The name of the database file.
@@ -109,7 +108,6 @@
public void onServiceDisconnected(ComponentName name) {
mExecutor.execute(mRemoveObserverRunnable);
mService = null;
- mContext = null;
}
};
@@ -152,10 +150,7 @@
} catch (RemoteException e) {
Log.w(Room.LOG_TAG, "Cannot unregister multi-instance invalidation callback", e);
}
- if (mContext != null) {
- mContext.unbindService(mServiceConnection);
- mContext = null;
- }
+ mAppContext.unbindService(mServiceConnection);
}
};
@@ -168,7 +163,7 @@
*/
MultiInstanceInvalidationClient(Context context, String name,
InvalidationTracker invalidationTracker, Executor executor) {
- mContext = context.getApplicationContext();
+ mAppContext = context.getApplicationContext();
mName = name;
mInvalidationTracker = invalidationTracker;
mExecutor = executor;
@@ -179,8 +174,10 @@
return;
}
try {
- mService.broadcastInvalidation(mClientId,
- tables.toArray(new String[0]));
+ final IMultiInstanceInvalidationService service = mService;
+ if (service != null) {
+ service.broadcastInvalidation(mClientId, tables.toArray(new String[0]));
+ }
} catch (RemoteException e) {
Log.w(Room.LOG_TAG, "Cannot broadcast invalidation", e);
}
@@ -191,8 +188,8 @@
return true;
}
};
- Intent intent = new Intent(mContext, MultiInstanceInvalidationService.class);
- mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
+ Intent intent = new Intent(mAppContext, MultiInstanceInvalidationService.class);
+ mAppContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
void stop() {
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 3e54cc5..97033ec 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
@@ -58,6 +58,6 @@
@Override
void reconnect() {
- mBiometricPrompt = new BiometricPrompt(mActivity, mAuthenticationCallback, mExecutor);
+ mBiometricPrompt = new BiometricPrompt(mActivity, mExecutor, mAuthenticationCallback);
}
}
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 48b3776..fb520bd 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
@@ -61,6 +61,6 @@
@Override
void reconnect() {
- mBiometricPrompt = new BiometricPrompt(mFragment, mAuthenticationCallback, mExecutor);
+ mBiometricPrompt = new BiometricPrompt(mFragment, mExecutor, mAuthenticationCallback);
}
}
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..663dc05 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")
@@ -56,6 +56,7 @@
includeProject(":asynclayoutinflater", "asynclayoutinflater")
includeProject(":autofill", "autofill")
includeProject(":benchmark", "benchmark")
+includeProject(":benchmark:benchmark-benchmark", "benchmark/benchmark")
includeProject(":benchmark:benchmark-gradle-plugin", "benchmark/gradle-plugin")
includeProject(":biometric", "biometric")
includeProject(":browser", "browser")
@@ -257,7 +258,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/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/paging/runtime/api/res-2.2.0-alpha01.txt b/sqlite/sqlite-framework/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.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/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/sqlite/sqlite-ktx/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.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/paging/runtime/api/res-2.2.0-alpha01.txt b/sqlite/sqlite/api/res-2.1.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.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/test/screenshot/build.gradle b/test/screenshot/build.gradle
index 2335202..a740b0b 100644
--- a/test/screenshot/build.gradle
+++ b/test/screenshot/build.gradle
@@ -25,6 +25,8 @@
}
dependencies {
+ implementation(ANDROIDX_TEST_RUNNER)
+
androidTestImplementation(JUNIT)
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
androidTestImplementation(ANDROIDX_TEST_RUNNER)
diff --git a/test/screenshot/src/androidTest/java/androidx/test/screenshot/ScreenshotTestTest.kt b/test/screenshot/src/androidTest/java/androidx/test/screenshot/ScreenshotTestTest.kt
index 05e0ebd..6eef598 100644
--- a/test/screenshot/src/androidTest/java/androidx/test/screenshot/ScreenshotTestTest.kt
+++ b/test/screenshot/src/androidTest/java/androidx/test/screenshot/ScreenshotTestTest.kt
@@ -19,15 +19,18 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import org.junit.Assert.assertTrue
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ScreenshotTestTest {
+ @get:Rule
+ val screenshotTestRule = ScreenshotTestRule()
+
@Test
@SmallTest
- @ScreenshotTest
fun screenshotTestTest_dummy() {
assertTrue(true)
}
diff --git a/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTest.java b/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTest.java
deleted file mode 100644
index ecffe28..0000000
--- a/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package androidx.test.screenshot;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation to assign a screenshot test qualifier to a test. This annotation can be used at a
- * method or class level.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface ScreenshotTest {
-}
-
diff --git a/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.java b/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.java
new file mode 100644
index 0000000..56c40a5
--- /dev/null
+++ b/test/screenshot/src/main/java/androidx/test/screenshot/ScreenshotTestRule.java
@@ -0,0 +1,49 @@
+/*
+ * 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.test.screenshot;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import org.junit.Assume;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runners.model.Statement;
+
+public class ScreenshotTestRule implements TestRule {
+
+ @Override
+ public @NonNull Statement apply(@NonNull Statement base, @Nullable Description description) {
+ return new ScreenshotTestStatement(base);
+ }
+
+ static class ScreenshotTestStatement extends Statement {
+
+ final Statement mBase;
+
+ ScreenshotTestStatement(Statement base) {
+ super();
+ mBase = base;
+ }
+
+ @Override
+ public void evaluate() throws Throwable {
+ Assume.assumeTrue(android.os.Build.MODEL.contains("Cuttlefish"));
+ mBase.evaluate();
+ }
+ }
+}
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
index 2fd0360..9825448 100644
--- 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
@@ -25,6 +25,7 @@
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
/**
@@ -39,6 +40,7 @@
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()
@@ -58,6 +60,7 @@
View.MeasureSpec.makeMeasureSpec(lastWidth, View.MeasureSpec.EXACTLY)
heightSpec =
View.MeasureSpec.makeMeasureSpec(lastHeight, View.MeasureSpec.EXACTLY)
+ testCase.requestLayout()
}
testCase.measureWithSpec(widthSpec, heightSpec)
testCase.layout()
@@ -122,6 +125,7 @@
runWithTimingDisabled {
toggleState()
testCase.recomposeSyncAssertHadChanges()
+ testCase.requestLayout()
}
testCase.measure()
}
@@ -144,6 +148,7 @@
runWithTimingDisabled {
toggleState()
testCase.recomposeSyncAssertHadChanges()
+ testCase.requestLayout()
testCase.measure()
}
testCase.layout()
@@ -167,6 +172,7 @@
runWithTimingDisabled {
toggleState()
testCase.recomposeSyncAssertHadChanges()
+ testCase.requestLayout()
testCase.measure()
testCase.layout()
testCase.prepareDraw()
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
index ec9d692..c2a3a33 100644
--- 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
@@ -124,6 +124,13 @@
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) {
diff --git a/ui/settings.gradle b/ui/settings.gradle
index 3ebd9c2..c46fc60 100644
--- a/ui/settings.gradle
+++ b/ui/settings.gradle
@@ -26,8 +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(":compose:compose-runtime:benchmark", "../compose/compose-runtime/compose-runtime-benchmark")
-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")
@@ -38,6 +38,7 @@
includeProject(":ui:ui-animation:integration-tests:ui-animation-demos", "ui-animation/integration-tests/animation-demos")
includeProject(":ui:ui-core", "ui-core")
includeProject(":ui:ui-foundation", "ui-foundation")
+includeProject(":ui:ui-foundation:integration-tests:samples", "ui-foundation/integration-tests/samples")
includeProject(":ui:ui-framework", "ui-framework")
includeProject(":ui:ui-framework:integration-tests:ui-framework-demos", "ui-framework/integration-tests/framework-demos")
includeProject(":ui:ui-framework:integration-tests:samples", "ui-framework/integration-tests/samples")
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrolling.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrolling.kt
index 4a0413d..b57e2ee 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrolling.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrolling.kt
@@ -64,7 +64,7 @@
fun FancyScrollingExample() {
Column {
Padding(40.dp) {
- Text("<== Scroll horizontally ==>", style = TextStyle(fontSize = 80.sp))
+ Text("<== Scroll horizontally ==>", style = TextStyle(fontSize = 20.sp))
}
val animScroll = +animatedFloat(0f)
val itemWidth = +state { 0f }
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrolling.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrolling.kt
index 1281e0f..0cbf697 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrolling.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrolling.kt
@@ -64,7 +64,7 @@
fun SpringBackExample() {
Column {
Padding(40.dp) {
- Text("<== Scroll horizontally ==>", style = TextStyle(fontSize = 80.sp))
+ Text("<== Scroll horizontally ==>", style = TextStyle(fontSize = 20.sp))
}
val animScroll = +animatedFloat(0f)
val itemWidth = +state { 0f }
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismiss.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismiss.kt
index 941dba4..c00fdad 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismiss.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismiss.kt
@@ -59,7 +59,7 @@
SwipeToDismiss()
Padding(40.dp) {
- Text("Swipe up to dismiss", style = TextStyle(fontSize = 80.sp))
+ Text("Swipe up to dismiss", style = TextStyle(fontSize = 20.sp))
}
}
}
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt b/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
index 68eb8839..9c3a3e4 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/Constraints.kt
@@ -44,6 +44,7 @@
val maxHeight: IntPx = IntPx.Infinity
) {
init {
+ // TODO(mount/popam): This verification is costly. Can we avoid it sometimes or at least on production?
require(minWidth.isFinite()) { "Constraints#minWidth should be finite" }
require(minHeight.isFinite()) { "Constraints#minHeight should be finite" }
require(minWidth <= maxWidth) {
diff --git a/ui/ui-foundation/integration-tests/samples/build.gradle b/ui/ui-foundation/integration-tests/samples/build.gradle
new file mode 100644
index 0000000..446e4b2
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/build.gradle
@@ -0,0 +1,49 @@
+/*
+ * 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("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+ kotlinPlugin project(path: ":compose:compose-compiler", configuration: "embeddablePlugin")
+
+ implementation(KOTLIN_COMPOSE_STDLIB)
+
+ implementation project(":annotation:annotation-sampled")
+
+ implementation project(":compose:compose-runtime")
+ implementation project(":ui:ui-core")
+ implementation project(":ui:ui-foundation")
+ implementation project(":ui:ui-framework")
+ implementation project(":ui:ui-layout")
+ implementation project(":ui:ui-text")
+}
+
+android {
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ useIR = true
+ }
+ }
+}
diff --git a/ui/ui-foundation/integration-tests/samples/src/main/AndroidManifest.xml b/ui/ui-foundation/integration-tests/samples/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..694223d
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/src/main/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<!--
+ 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 package="androidx.ui.foundation.samples" />
diff --git a/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ClickableSamples.kt b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ClickableSamples.kt
new file mode 100644
index 0000000..8648004
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ClickableSamples.kt
@@ -0,0 +1,35 @@
+/*
+ * 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.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.compose.state
+import androidx.compose.unaryPlus
+import androidx.ui.core.Text
+import androidx.ui.foundation.Clickable
+
+@Sampled
+@Composable
+fun ClickableSample() {
+ val count = +state { 0 }
+ Clickable(onClick = { count.value += 1 }) {
+ // content that you want to make clickable
+ Text(text = count.toString())
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ColoredRectSamples.kt b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ColoredRectSamples.kt
new file mode 100644
index 0000000..d90e8ac3
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/ColoredRectSamples.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.foundation.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.dp
+import androidx.ui.core.vectorgraphics.SolidColor
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.graphics.Color
+
+@Sampled
+@Composable
+fun ColoredRectColorSample() {
+ ColoredRect(Color.Cyan, width = 20.dp, height = 20.dp)
+}
+
+@Sampled
+@Composable
+fun ColoredRectBrushSample() {
+ ColoredRect(
+ brush = SolidColor(Color.Fuchsia),
+ width = 20.dp,
+ height = 20.dp
+ )
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/DeterminateProgressSamples.kt b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/DeterminateProgressSamples.kt
new file mode 100644
index 0000000..35869a4
--- /dev/null
+++ b/ui/ui-foundation/integration-tests/samples/src/main/java/androidx/ui/foundation/samples/DeterminateProgressSamples.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.Composable
+import androidx.compose.composer
+import androidx.ui.core.dp
+import androidx.ui.foundation.ColoredRect
+import androidx.ui.foundation.DeterminateProgressIndicator
+import androidx.ui.graphics.Color
+
+@Sampled
+@Composable
+fun DeterminateProgressSample() {
+ val progress = 0.5f // emulate progress from some state
+ DeterminateProgressIndicator(progress) {
+ ColoredRect(Color.Cyan, height = 4.dp, width = (progress * 100).dp)
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
index dfca6c5..1730ce1 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Clickable.kt
@@ -28,6 +28,8 @@
* Combines [PressReleasedGestureDetector] and [Semantics] for the clickable
* components like Button.
*
+ * @sample androidx.ui.foundation.samples.ClickableSample
+ *
* @param onClick will be called when user clicked on the button. The button will not be
* clickable when it is null.
* @param consumeDownOnStart true means [PressReleasedGestureDetector] should consume
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
index f892de5..757de7f 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
@@ -24,6 +24,8 @@
import androidx.ui.core.toRect
import androidx.ui.core.vectorgraphics.Brush
import androidx.ui.core.vectorgraphics.SolidColor
+import androidx.ui.foundation.shape.DrawShape
+import androidx.ui.foundation.shape.RectangleShape
import androidx.ui.graphics.Color
import androidx.ui.layout.Container
import androidx.ui.painting.Paint
@@ -37,6 +39,8 @@
* Note that even if width and height are specified, these will not be satisfied
* if the component's incoming layout constraints do not allow that.
*
+ * @sample androidx.ui.foundation.samples.ColoredRectBrushSample
+ *
* @param brush brush to paint rect with
* @param width width of this rect, by default it will match incoming layout constraints
* @param height height of this rect, by default it will match incoming layout constraints
@@ -53,6 +57,8 @@
/**
* Component that represents a rectangle painted with a solid color.
*
+ * @sample androidx.ui.foundation.samples.ColoredRectColorSample
+ *
* @param color color to paint rect with
* @param width width of this rect, by default it will match parent's constraints
* @param height height of this rect, by default it will match parent's constraints
@@ -64,9 +70,5 @@
@Composable
private fun DrawFillRect(brush: Brush) {
- Draw { canvas, parentSize ->
- val paint = Paint()
- brush.applyBrush(paint)
- canvas.drawRect(parentSize.toRect(), paint)
- }
+ DrawShape(RectangleShape, brush)
}
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DeterminateProgressIndicator.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DeterminateProgressIndicator.kt
index eeca61c..1182bfe 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DeterminateProgressIndicator.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DeterminateProgressIndicator.kt
@@ -26,6 +26,8 @@
* Contains the [Semantics] required for a determinate progress indicator, that represents progress
* ranging from 0.0 to 1.0.
*
+ * @sample androidx.ui.foundation.samples.DeterminateProgressSample
+ *
* @param progress The progress of this progress indicator, where 0.0 represents no progress and 1.0
* represents full progress
* @param children The progress indicator that is drawn on screen, representing [progress]
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/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/MultipleCollect.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/MultipleCollect.kt
index d48e272..e8f57e0 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/MultipleCollect.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/MultipleCollect.kt
@@ -70,17 +70,17 @@
Layout(
childrenArray = arrayOf(header, content, footer),
layoutBlock = { measurables, constraints ->
- val headerPlaceable = measurables[header as () -> Unit].first().measure(
+ val headerPlaceable = measurables[header].first().measure(
Constraints.tightConstraints(constraints.maxWidth, 100.ipx)
)
val footerPadding = 50.ipx
- val footerPlaceable = measurables[footer as () -> Unit].first().measure(
+ val footerPlaceable = measurables[footer].first().measure(
Constraints.tightConstraints(constraints.maxWidth - footerPadding * 2, 100.ipx)
)
val itemHeight =
(constraints.maxHeight - headerPlaceable.height - footerPlaceable.height) /
- measurables[content as () -> Unit].size
- val contentPlaceables = measurables[content as () -> Unit].map { measurable ->
+ measurables[content].size
+ val contentPlaceables = measurables[content].map { measurable ->
measurable.measure(Constraints.tightConstraints(constraints.maxWidth, itemHeight))
}
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
index cb22af9..27ace8d 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidLayoutDrawTest.kt
@@ -454,11 +454,11 @@
measurables.forEachIndexed { index, measurable ->
measurable.measure(childConstraints[index])
}
- assertEquals(headerChildrenCount, measurables[header as () -> Unit].size)
- assertSame(measurables[0], measurables[header as () -> Unit][0])
- assertEquals(footerChildrenCount, measurables[footer as () -> Unit].size)
- assertSame(measurables[1], measurables[footer as () -> Unit][0])
- assertSame(measurables[2], measurables[footer as () -> Unit][1])
+ assertEquals(headerChildrenCount, measurables[header].size)
+ assertSame(measurables[0], measurables[header][0])
+ assertEquals(footerChildrenCount, measurables[footer].size)
+ assertSame(measurables[1], measurables[footer][0])
+ assertSame(measurables[2], measurables[footer][1])
}
}
}
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..8657d9b 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,10 +22,12 @@
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
import androidx.ui.painting.Canvas
+import androidx.ui.text.AnnotatedString
import androidx.ui.text.TextPainter
internal class InputFieldDelegate {
@@ -39,8 +41,30 @@
*/
@JvmStatic
fun layout(textPainter: TextPainter, constraints: Constraints): Pair<IntPx, IntPx> {
+ val isEmptyText = textPainter.text?.text?.isEmpty() ?: true
+ val activeTextPainter = if (isEmptyText) {
+ // Even with empty text, edit filed must have at least non-zero height widget. Use
+ // "H" height for this empty text height.
+ TextPainter(
+ text = AnnotatedString(text = "H"),
+ style = textPainter.style,
+ density = textPainter.density,
+ resourceLoader = textPainter.resourceLoader
+ ).apply {
+ layout(constraints)
+ }
+ } else {
+ textPainter
+ }
+
+ // We anyway need to compute layout for preventing NPE during draw which require layout
+ // result.
+ // TODO(nona): Fix this?
textPainter.layout(constraints)
- return Pair(textPainter.width.px.round(), textPainter.height.px.round())
+
+ val height = activeTextPainter.height.px.round()
+ val width = constraints.maxWidth
+ return Pair(width, height)
}
/**
@@ -102,7 +126,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 +217,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/Layout.kt b/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
index a62f5bb..3938fa1 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/Layout.kt
@@ -66,8 +66,9 @@
internal val layoutNode: LayoutNode
get() = layoutNodeRef.value!!
- internal val childrenMeasurables: List<Measurable> get() =
- ComplexLayoutStateMeasurablesList(layoutNode.childrenLayouts().map { it as Measurable })
+ // TODO(mount/popam): This is inefficient
+ internal val childrenMeasurables: List<Measurable>
+ get() = ComplexLayoutStateMeasurablesList(layoutNode)
private var measureIteration = 0L
@@ -77,7 +78,8 @@
}
fun measure(constraints: Constraints): Placeable {
- val iteration = layoutNode.owner?.measureIteration ?: 0L
+ val owner = layoutNode.owner
+ val iteration = if (owner == null) 0L else owner.measureIteration
if (measureIteration == iteration) {
throw IllegalStateException("measure() may not be called multiple times " +
"on the same Measurable")
@@ -170,8 +172,32 @@
}
internal class ComplexLayoutStateMeasurablesList(
- internal val measurables: List<Measurable>
-) : List<Measurable> by (measurables.filter { it.parentData !is ChildrenEndParentData })
+ layoutNode: LayoutNode
+) : MutableList<Measurable> by mutableListOf() {
+ private val composableRanges = mutableMapOf<@Composable() () -> Unit, IntRange>()
+ fun composables(composable: @Composable() () -> Unit): List<Measurable> {
+ val range = composableRanges[composable] ?: return emptyList()
+ return subList(range.first, range.last)
+ }
+
+ init {
+ // var start = 0 doesn't work because of IR
+ val start = intArrayOf(0)
+ layoutNode.visitLayoutChildren { child ->
+ val layout = child.layout
+ if (layout != null) {
+ layout as Measurable
+ val parentData = layout.parentData
+ if (parentData is ChildrenEndParentData) {
+ composableRanges[parentData.children] = IntRange(start[0], size)
+ start[0] = size
+ } else {
+ this += layout
+ }
+ }
+ }
+ }
+}
/**
* Receiver scope for the [ComplexLayout] lambda.
@@ -436,17 +462,10 @@
* Returns all the [Measurable]s emitted for a particular children lambda.
* TODO(popam): finding measurables for each individual composable is O(n^2), consider improving
*/
- operator fun List<Measurable>.get(children: () -> Unit): List<Measurable> {
+ operator fun List<Measurable>.get(children: @Composable() () -> Unit): List<Measurable> {
if (this !is ComplexLayoutStateMeasurablesList) error("Invalid list of measurables")
- val childrenMeasurablesEnd = measurables.indexOfFirst {
- it.parentData is ChildrenEndParentData &&
- (it.parentData as ChildrenEndParentData).children == children
- }
- val childrenMeasurablesStart = measurables.take(childrenMeasurablesEnd).indexOfLast {
- it.parentData is ChildrenEndParentData
- } + 1
- return measurables.subList(childrenMeasurablesStart, childrenMeasurablesEnd)
+ return composables(children)
}
/**
* Measure the child [Measurable] with a specific set of [Constraints]. The result
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
index 3b6ab5a..c238d48 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
@@ -115,14 +115,14 @@
val width = placeable.width
val height = placeable.height
val start =
- measurables[startHandle as () -> Unit].first().measure(
+ measurables[startHandle].first().measure(
Constraints.tightConstraints(
HANDLE_WIDTH.round(),
HANDLE_HEIGHT.round()
)
)
val end =
- measurables[endHandle as () -> Unit].first().measure(
+ measurables[endHandle].first().measure(
Constraints.tightConstraints(
HANDLE_WIDTH.round(),
HANDLE_HEIGHT.round()
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..a246ad4 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,12 +22,15 @@
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
import androidx.ui.painting.Canvas
+import androidx.ui.text.AnnotatedString
import androidx.ui.text.TextPainter
import androidx.ui.text.TextRange
+import androidx.ui.text.TextStyle
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.argumentCaptor
import com.nhaarman.mockitokotlin2.eq
@@ -201,10 +204,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 +247,59 @@
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())
+ }
+
+ @Test
+ fun layout() {
+ val constraints = Constraints(
+ minWidth = 0.px.round(),
+ maxWidth = 1024.px.round(),
+ minHeight = 0.px.round(),
+ maxHeight = 2048.px.round()
+ )
+
+ val dummyText = AnnotatedString(text = "Hello, World")
+ whenever(painter.text).thenReturn(dummyText)
+ whenever(painter.style).thenReturn(TextStyle())
+ whenever(painter.density).thenReturn(Density(1.0f))
+ whenever(painter.resourceLoader).thenReturn(mock())
+ whenever(painter.height).thenReturn(512.0f)
+
+ val res = InputFieldDelegate.layout(painter, constraints)
+ assertEquals(1024.px.round(), res.first)
+ assertEquals(512.px.round(), res.second)
+
+ verify(painter, times(1)).layout(constraints)
+ }
}
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
index c4175ec0..c0c90f7 100644
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
+++ b/ui/ui-layout/src/main/java/androidx/ui/layout/Flex.kt
@@ -409,16 +409,16 @@
* Box [Constraints], but which abstract away width and height in favor of main axis and cross axis.
*/
private data class OrientationIndependentConstraints(
- var mainAxisMin: IntPx,
- var mainAxisMax: IntPx,
- var crossAxisMin: IntPx,
- var crossAxisMax: IntPx
+ val mainAxisMin: IntPx,
+ val mainAxisMax: IntPx,
+ val crossAxisMin: IntPx,
+ val crossAxisMax: IntPx
) {
constructor(c: Constraints, orientation: FlexOrientation) : this(
- if (orientation == FlexOrientation.Horizontal) c.minWidth else c.minHeight,
- if (orientation == FlexOrientation.Horizontal) c.maxWidth else c.maxHeight,
- if (orientation == FlexOrientation.Horizontal) c.minHeight else c.minWidth,
- if (orientation == FlexOrientation.Horizontal) c.maxHeight else c.maxWidth
+ if (orientation === FlexOrientation.Horizontal) c.minWidth else c.minHeight,
+ if (orientation === FlexOrientation.Horizontal) c.maxWidth else c.maxHeight,
+ if (orientation === FlexOrientation.Horizontal) c.minHeight else c.minWidth,
+ if (orientation === FlexOrientation.Horizontal) c.maxHeight else c.maxWidth
)
// Creates a new instance with the same cross axis constraints and unbounded main axis.
@@ -436,7 +436,7 @@
// Given an orientation, resolves the current instance to traditional constraints.
fun toBoxConstraints(orientation: FlexOrientation) =
- if (orientation == FlexOrientation.Horizontal) {
+ if (orientation === FlexOrientation.Horizontal) {
Constraints(mainAxisMin, mainAxisMax, crossAxisMin, crossAxisMax)
} else {
Constraints(crossAxisMin, crossAxisMax, mainAxisMin, mainAxisMax)
@@ -444,7 +444,7 @@
// Given an orientation, resolves the max width constraint this instance represents.
fun maxWidth(orientation: FlexOrientation) =
- if (orientation == FlexOrientation.Horizontal) {
+ if (orientation === FlexOrientation.Horizontal) {
mainAxisMax
} else {
crossAxisMax
@@ -452,7 +452,7 @@
// Given an orientation, resolves the max height constraint this instance represents.
fun maxHeight(orientation: FlexOrientation) =
- if (orientation == FlexOrientation.Horizontal) {
+ if (orientation === FlexOrientation.Horizontal) {
crossAxisMax
} else {
mainAxisMax
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-platform/OWNERS b/ui/ui-platform/OWNERS
index 55dc119..af392f8 100644
--- a/ui/ui-platform/OWNERS
+++ b/ui/ui-platform/OWNERS
@@ -2,3 +2,9 @@
mount@google.com
ryanmentley@google.com
shepshapard@google.com
+
+# For text input
+haoyuchang@google.com
+nona@google.com
+qqd@google.com
+siyamed@google.com
diff --git a/ui/ui-platform/src/androidTest/java/androidx/ui/core/input/RecordingInputConnectionTest.kt b/ui/ui-platform/src/androidTest/java/androidx/ui/core/input/RecordingInputConnectionTest.kt
index 5256ef9..2e7d431 100644
--- a/ui/ui-platform/src/androidTest/java/androidx/ui/core/input/RecordingInputConnectionTest.kt
+++ b/ui/ui-platform/src/androidTest/java/androidx/ui/core/input/RecordingInputConnectionTest.kt
@@ -506,4 +506,15 @@
ic.sendKeyEvent(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_RIGHT))
verify(listener, never()).onEditOperations(any())
}
+
+ @Test
+ fun key_event_printablekey_down() {
+ val captor = argumentCaptor<List<EditOperation>>()
+ ic.sendKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_1))
+ verify(listener, times(1)).onEditOperations(captor.capture())
+
+ val editOps = captor.lastValue
+ assertEquals(1, editOps.size)
+ assertEquals(CommitTextEditOp("1", 1), editOps[0])
+ }
}
\ No newline at end of file
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
index 5dfa08e..1bdfbc3 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ComponentNodes.kt
@@ -167,7 +167,9 @@
* Execute [block] on all children of this ComponentNode.
*/
fun visitChildren(block: (ComponentNode) -> Unit) {
- children.forEach(block)
+ for (i in 0 until children.size) {
+ block(children[i])
+ }
}
/**
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..72a00d4 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
@@ -205,10 +207,10 @@
KeyEvent.KEYCODE_DEL -> BackspaceKeyEditOp()
KeyEvent.KEYCODE_DPAD_LEFT -> MoveCursorEditOp(-1)
KeyEvent.KEYCODE_DPAD_RIGHT -> MoveCursorEditOp(1)
- else -> null
+ else -> CommitTextEditOp(String(Character.toChars(event.getUnicodeChar())), 1)
}
- op?.let { addEditOpWithBatch(it) }
+ addEditOpWithBatch(op)
return true
}
@@ -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/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..539c5d8 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,19 +40,35 @@
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 {
VerticalScroller {
Column(crossAxisAlignment = CrossAxisAlignment.Start) {
TagLine(tag = "simple editing")
- EditLine("Simple Input Field")
+ EditLine()
TagLine(tag = "simple editing2")
- EditLine("Another Simple Input Field")
+ EditLine()
for ((type, name) in KEYBOARD_TYPES) {
TagLine(tag = "Keyboard Type: $name")
- EditLine(initText = "Keyboard Type: $name", keyboardType = type)
+ EditLine(keyboardType = type)
+ }
+
+ for ((action, name) in IME_ACTIONS) {
+ TagLine(tag = "Ime Action: $name")
+ EditLine(imeAction = action)
}
}
}
@@ -59,11 +76,15 @@
}
@Composable
-fun EditLine(initText: String, keyboardType: KeyboardType = KeyboardType.Text) {
- val state = +state { EditorState(text = initText, selection = TextRange(2, 2)) }
+fun EditLine(
+ keyboardType: KeyboardType = KeyboardType.Text,
+ imeAction: ImeAction = ImeAction.Unspecified
+) {
+ val state = +state { EditorState() }
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/1.0.0-beta00.txt b/viewpager2/api/1.0.0-beta02.txt
similarity index 100%
copy from viewpager2/api/1.0.0-beta00.txt
copy to viewpager2/api/1.0.0-beta02.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/res-1.0.0-beta00.txt b/viewpager2/api/res-1.0.0-beta02.txt
similarity index 100%
copy from viewpager2/api/res-1.0.0-beta00.txt
copy to viewpager2/api/res-1.0.0-beta02.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/api/restricted_1.0.0-beta00.txt b/viewpager2/api/restricted_1.0.0-beta02.txt
similarity index 100%
copy from viewpager2/api/restricted_1.0.0-beta00.txt
copy to viewpager2/api/restricted_1.0.0-beta02.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 3f02ba8..679943f 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
@@ -27,10 +27,6 @@
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
@@ -81,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
@@ -284,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/FakeDragTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/FakeDragTest.kt
index 314cad3..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
@@ -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/main/java/androidx/viewpager2/widget/ViewPager2.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
index 9130ae1..5f431bd 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
@@ -143,6 +143,7 @@
private RecyclerView mRecyclerView;
private PagerSnapHelper mPagerSnapHelper;
private ScrollEventAdapter mScrollEventAdapter;
+ private CompositeOnPageChangeCallback mPageChangeEventDispatcher;
private FakeDrag mFakeDragger;
private PageTransformerAdapter mPageTransformerAdapter;
private boolean mUserInputEnabled = true;
@@ -199,9 +200,8 @@
// don't want to respond on the events sent out during the attach process
mRecyclerView.addOnScrollListener(mScrollEventAdapter);
- CompositeOnPageChangeCallback pageChangeEventDispatcher =
- new CompositeOnPageChangeCallback(3);
- mScrollEventAdapter.setOnPageChangeCallback(pageChangeEventDispatcher);
+ mPageChangeEventDispatcher = new CompositeOnPageChangeCallback(3);
+ mScrollEventAdapter.setOnPageChangeCallback(mPageChangeEventDispatcher);
// Callback that updates mCurrentItem after swipes. Also triggered in other cases, but in
// all those cases mCurrentItem will only be overwritten with the same value.
@@ -213,20 +213,27 @@
mAccessibilityProvider.onSetNewCurrentItem();
}
}
+
+ @Override
+ public void onPageScrollStateChanged(int newState) {
+ if (newState == SCROLL_STATE_IDLE) {
+ updateCurrentItem();
+ }
+ }
};
// Add currentItemUpdater before mExternalPageChangeCallbacks, because we need to update
// internal state first
- pageChangeEventDispatcher.addOnPageChangeCallback(currentItemUpdater);
+ mPageChangeEventDispatcher.addOnPageChangeCallback(currentItemUpdater);
// Allow a11y to register its listeners just after currentItemUpdater (so it has the
// right data). TODO: replace ordering comments with a test.
- mAccessibilityProvider.onInitialize(pageChangeEventDispatcher, mRecyclerView);
- pageChangeEventDispatcher.addOnPageChangeCallback(mExternalPageChangeCallbacks);
+ mAccessibilityProvider.onInitialize(mPageChangeEventDispatcher, mRecyclerView);
+ mPageChangeEventDispatcher.addOnPageChangeCallback(mExternalPageChangeCallbacks);
// Add mPageTransformerAdapter after mExternalPageChangeCallbacks, because page transform
// events must be fired after scroll events
mPageTransformerAdapter = new PageTransformerAdapter(mLayoutManager);
- pageChangeEventDispatcher.addOnPageChangeCallback(mPageTransformerAdapter);
+ mPageChangeEventDispatcher.addOnPageChangeCallback(mPageTransformerAdapter);
attachViewToParent(mRecyclerView, 0, mRecyclerView.getLayoutParams());
}
@@ -525,20 +532,17 @@
throw new IllegalStateException("Design assumption violated.");
}
- int snapPosition = mPagerSnapHelper.findTargetSnapPosition(mLayoutManager, 0, 0);
+ View snapView = mPagerSnapHelper.findSnapView(mLayoutManager);
+ if (snapView == null) {
+ return; // nothing we can do
+ }
+ int snapPosition = mLayoutManager.getPosition(snapView);
- // Extra checks verifying assumptions
- // TODO: remove after testing
- View snapView1 = mPagerSnapHelper.findSnapView(mLayoutManager);
- View snapView2 = mLayoutManager.findViewByPosition(snapPosition);
- if (snapView1 != snapView2) {
- throw new IllegalStateException("Design assumption violated.");
+ if (snapPosition != mCurrentItem && getScrollState() == SCROLL_STATE_IDLE) {
+ /** TODO: revisit if push to {@link ScrollEventAdapter} / separate component */
+ mPageChangeEventDispatcher.onPageSelected(snapPosition);
}
- if (snapPosition != mCurrentItem) {
- // TODO: handle fakeDrag
- setCurrentItem(snapPosition, false);
- }
mCurrentItemDirty = false;
}
diff --git a/webkit/api/1.1.0-alpha02.txt b/webkit/api/1.1.0-alpha02.txt
index 9190ab6..6ef8368 100644
--- a/webkit/api/1.1.0-alpha02.txt
+++ b/webkit/api/1.1.0-alpha02.txt
@@ -134,10 +134,10 @@
public static final class WebViewAssetLoader.Builder {
ctor public WebViewAssetLoader.Builder();
- method public androidx.webkit.WebViewAssetLoader.Builder allowHttp(boolean);
+ method public androidx.webkit.WebViewAssetLoader.Builder addPathHandler(String, androidx.webkit.WebViewAssetLoader.PathHandler);
method public androidx.webkit.WebViewAssetLoader build();
- method public androidx.webkit.WebViewAssetLoader.Builder onDomain(String);
- method public androidx.webkit.WebViewAssetLoader.Builder register(String, androidx.webkit.WebViewAssetLoader.PathHandler);
+ method public androidx.webkit.WebViewAssetLoader.Builder setDomain(String);
+ method public androidx.webkit.WebViewAssetLoader.Builder setHttpAllowed(boolean);
}
public static interface WebViewAssetLoader.PathHandler {
diff --git a/webkit/api/current.txt b/webkit/api/current.txt
index 9190ab6..6ef8368 100644
--- a/webkit/api/current.txt
+++ b/webkit/api/current.txt
@@ -134,10 +134,10 @@
public static final class WebViewAssetLoader.Builder {
ctor public WebViewAssetLoader.Builder();
- method public androidx.webkit.WebViewAssetLoader.Builder allowHttp(boolean);
+ method public androidx.webkit.WebViewAssetLoader.Builder addPathHandler(String, androidx.webkit.WebViewAssetLoader.PathHandler);
method public androidx.webkit.WebViewAssetLoader build();
- method public androidx.webkit.WebViewAssetLoader.Builder onDomain(String);
- method public androidx.webkit.WebViewAssetLoader.Builder register(String, androidx.webkit.WebViewAssetLoader.PathHandler);
+ method public androidx.webkit.WebViewAssetLoader.Builder setDomain(String);
+ method public androidx.webkit.WebViewAssetLoader.Builder setHttpAllowed(boolean);
}
public static interface WebViewAssetLoader.PathHandler {
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderAjaxActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderAjaxActivity.java
index 461cae7..7a18003 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderAjaxActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderAjaxActivity.java
@@ -72,11 +72,11 @@
// The developer should ALWAYS use a domain which they are in control of or use
// the default androidplatform.net reserved by Google for this purpose.
mAssetLoader = new WebViewAssetLoader.Builder()
- .onDomain("example.com") // use "example.com" instead of the default domain
+ .setDomain("example.com") // use "example.com" instead of the default domain
// Host app resources ... under https://example.com/androidx_webkit/example/res/...
- .register("/androidx_webkit/example/res/", new ResourcesPathHandler(this))
+ .addPathHandler("/androidx_webkit/example/res/", new ResourcesPathHandler(this))
// Host app assets under https://example.com/androidx_webkit/example/assets/...
- .register("/androidx_webkit/example/assets/", new AssetsPathHandler(this))
+ .addPathHandler("/androidx_webkit/example/assets/", new AssetsPathHandler(this))
.build();
mWebView = findViewById(R.id.webview_asset_loader_webview);
diff --git a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderSimpleActivity.java b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderSimpleActivity.java
index 9c0d16b..b36b986 100644
--- a/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderSimpleActivity.java
+++ b/webkit/integration-tests/testapp/src/main/java/com/example/androidx/webkit/AssetLoaderSimpleActivity.java
@@ -70,7 +70,7 @@
// Host application assets under http://appassets.androidplatform.net/assets/...
mAssetLoader = new WebViewAssetLoader.Builder()
- .register("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
+ .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
.build();
Uri path = new Uri.Builder()
.scheme("https")
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java
index 742ffc8..70a2b11 100644
--- a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderIntegrationTest.java
@@ -84,7 +84,7 @@
final WebViewTestActivity activity = mActivityRule.getActivity();
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .register("/assets/", new AssetsPathHandler(activity))
+ .addPathHandler("/assets/", new AssetsPathHandler(activity))
.build();
mOnUiThread.setWebViewClient(new AssetLoadingWebViewClient(mOnUiThread, assetLoader));
@@ -108,7 +108,7 @@
final WebViewTestActivity activity = mActivityRule.getActivity();
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .register("/res/", new ResourcesPathHandler(activity))
+ .addPathHandler("/res/", new ResourcesPathHandler(activity))
.build();
mOnUiThread.setWebViewClient(new AssetLoadingWebViewClient(mOnUiThread, assetLoader));
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
index c16b058..029425a 100644
--- a/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewAssetLoaderTest.java
@@ -97,7 +97,7 @@
public void testCustomPathHandler() throws Throwable {
PathHandler pathHandler = new TestPathHandler();
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .register("/test/", pathHandler)
+ .addPathHandler("/test/", pathHandler)
.build();
WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -113,15 +113,15 @@
public void testCustomDomain() throws Throwable {
PathHandler pathHandler = new TestPathHandler();
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .onDomain("test.myDomain.net")
- .register("/test/", pathHandler)
+ .setDomain("test.myDomain.net")
+ .addPathHandler("/test/", pathHandler)
.build();
WebResourceResponse response = assetLoader.shouldInterceptRequest(
Uri.parse("https://test.myDomain.net/test/"));
assertResponse(response, CONTENTS);
- Assert.assertNull("non-registered URL should return null response",
+ Assert.assertNull("non-addPathHandlered URL should return null response",
assetLoader.shouldInterceptRequest(
Uri.parse("https://appassets.androidplatform.net/test/")));
}
@@ -131,8 +131,8 @@
public void testAllowingHttp() throws Throwable {
PathHandler pathHandler = new TestPathHandler();
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .allowHttp(true)
- .register("/test/", pathHandler)
+ .setHttpAllowed(true)
+ .addPathHandler("/test/", pathHandler)
.build();
WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -149,7 +149,7 @@
public void testDisallowingHttp() throws Throwable {
PathHandler pathHandler = new TestPathHandler();
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .register("/test/", pathHandler)
+ .addPathHandler("/test/", pathHandler)
.build();
WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -180,7 +180,7 @@
}
});
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .register("/assets/", assetsPathHandler)
+ .addPathHandler("/assets/", assetsPathHandler)
.build();
WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -207,7 +207,7 @@
}
});
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .register("/res/", resourcesPathHandler)
+ .addPathHandler("/res/", resourcesPathHandler)
.build();
WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -221,7 +221,7 @@
WebViewAssetLoader.Builder builder = new WebViewAssetLoader.Builder();
for (int i = 1; i <= 5; ++i) {
final String testContent = CONTENTS + Integer.toString(i);
- builder.register("/test_path_" + Integer.toString(i) + "/", new PathHandler() {
+ builder.addPathHandler("/test_path_" + Integer.toString(i) + "/", new PathHandler() {
@Override
public WebResourceResponse handle(@NonNull String path) {
try {
@@ -283,8 +283,8 @@
@SmallTest
public void testMultiplePathHandlersOnTheSamePath() throws Throwable {
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- .register("/test_path/", new FakeZipPathHandler())
- .register("/test_path/", new FakeTextPathHandler())
+ .addPathHandler("/test_path/", new FakeZipPathHandler())
+ .addPathHandler("/test_path/", new FakeTextPathHandler())
.build();
WebResourceResponse response = assetLoader.shouldInterceptRequest(
@@ -301,8 +301,8 @@
// Register in reverse order to make sure it works regardless of order.
assetLoader = new WebViewAssetLoader.Builder()
- .register("/test_path/", new FakeTextPathHandler())
- .register("/test_path/", new FakeZipPathHandler())
+ .addPathHandler("/test_path/", new FakeTextPathHandler())
+ .addPathHandler("/test_path/", new FakeZipPathHandler())
.build();
response = assetLoader.shouldInterceptRequest(
diff --git a/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java b/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
index ccfe8da..fa064fc 100644
--- a/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
+++ b/webkit/src/main/java/androidx/webkit/WebViewAssetLoader.java
@@ -56,8 +56,8 @@
* A typical usage would be like:
* <pre class="prettyprint">
* final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
- * .register("/assets/", new AssetsPathHandler(this))
- * .register("/res/", new ResourcesPathHandler(this))
+ * .addPathHandler("/assets/", new AssetsPathHandler(this))
+ * .addPathHandler("/res/", new ResourcesPathHandler(this))
* .build();
*
* webView.setWebViewClient(new WebViewClient() {
@@ -304,12 +304,12 @@
* A builder class for constructing {@link WebViewAssetLoader} objects.
*/
public static final class Builder {
- private boolean mAllowHttp;
+ private boolean mHttpAllowed;
private String mDomain;
@NonNull private List<PathMatcher> mBuilderMatcherList;
public Builder() {
- mAllowHttp = false;
+ mHttpAllowed = false;
mDomain = DEFAULT_DOMAIN;
mBuilderMatcherList = new ArrayList<>();
}
@@ -322,7 +322,7 @@
* @return {@link Builder} object.
*/
@NonNull
- public Builder onDomain(@NonNull String domain) {
+ public Builder setDomain(@NonNull String domain) {
mDomain = domain;
return this;
}
@@ -334,8 +334,8 @@
* @return {@link Builder} object.
*/
@NonNull
- public Builder allowHttp(boolean allowHttp) {
- mAllowHttp = allowHttp;
+ public Builder setHttpAllowed(boolean httpAllowed) {
+ mHttpAllowed = httpAllowed;
return this;
}
@@ -351,8 +351,8 @@
* @throws IllegalArgumentException if the path is invalid.
*/
@NonNull
- public Builder register(@NonNull String path, @NonNull PathHandler handler) {
- mBuilderMatcherList.add(new PathMatcher(mDomain, path, mAllowHttp, handler));
+ public Builder addPathHandler(@NonNull String path, @NonNull PathHandler handler) {
+ mBuilderMatcherList.add(new PathMatcher(mDomain, path, mHttpAllowed, handler));
return this;
}
diff --git a/paging/common/ktx/api/2.2.0-alpha01.txt b/work/workmanager-gcm/api/2.3.0-alpha01.txt
similarity index 100%
copy from paging/common/ktx/api/2.2.0-alpha01.txt
copy to work/workmanager-gcm/api/2.3.0-alpha01.txt
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/work/workmanager-gcm/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to work/workmanager-gcm/api/res-2.3.0-alpha01.txt
diff --git a/paging/common/ktx/api/2.2.0-alpha01.txt b/work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt
similarity index 100%
copy from paging/common/ktx/api/2.2.0-alpha01.txt
copy to work/workmanager-gcm/api/restricted_2.3.0-alpha01.txt
diff --git a/work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/GcmTaskConverterTest.kt b/work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/GcmTaskConverterTest.kt
index 827712634..547c3ac 100644
--- a/work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/GcmTaskConverterTest.kt
+++ b/work/workmanager-gcm/src/androidTest/java/androidx/work/impl/background/gcm/GcmTaskConverterTest.kt
@@ -27,6 +27,7 @@
import androidx.work.impl.background.gcm.GcmTaskConverter.EXECUTION_WINDOW_SIZE_IN_SECONDS
import com.google.android.gms.gcm.Task
import org.hamcrest.Matchers.greaterThan
+import org.hamcrest.Matchers.lessThanOrEqualTo
import org.junit.Assert.assertEquals
import org.junit.Assert.assertThat
import org.junit.Before
@@ -57,6 +58,7 @@
val expected = request.workSpec.calculateNextRunTime()
val offset = offset(expected, now)
+ val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
assertEquals(task.isPersisted, false)
@@ -64,7 +66,8 @@
assertEquals(task.requiredNetwork, Task.NETWORK_STATE_ANY)
assertEquals(task.requiresCharging, false)
assertEquals(task.windowStart, offset)
- assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+ // Account for time unit quantization errors
+ assertThat(delta, lessThanOrEqualTo(1L))
}
@Test
@@ -84,6 +87,7 @@
val task = mTaskConverter.convert(request.workSpec)
val expected = request.workSpec.calculateNextRunTime()
val offset = offset(expected, now)
+ val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
assertEquals(task.isPersisted, false)
@@ -91,7 +95,8 @@
assertEquals(task.requiredNetwork, Task.NETWORK_STATE_CONNECTED)
assertEquals(task.requiresCharging, true)
assertEquals(task.windowStart, offset)
- assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+ // Account for time unit quantization errors
+ assertThat(delta, lessThanOrEqualTo(1L))
}
@Test
@@ -110,6 +115,7 @@
val task = mTaskConverter.convert(request.workSpec)
val expected = request.workSpec.calculateNextRunTime()
val offset = offset(expected, now)
+ val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
assertEquals(task.isPersisted, false)
@@ -117,7 +123,8 @@
assertEquals(task.requiredNetwork, Task.NETWORK_STATE_UNMETERED)
assertEquals(task.requiresCharging, false)
assertEquals(task.windowStart, offset)
- assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+ // Account for time unit quantization errors
+ assertThat(delta, lessThanOrEqualTo(1L))
}
@Test
@@ -133,6 +140,7 @@
val task = mTaskConverter.convert(request.workSpec)
val expected = request.workSpec.calculateNextRunTime()
val offset = offset(expected, now)
+ val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
assertEquals(task.isPersisted, false)
@@ -140,7 +148,8 @@
assertEquals(task.requiredNetwork, Task.NETWORK_STATE_ANY)
assertEquals(task.requiresCharging, false)
assertEquals(task.windowStart, offset)
- assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+ // Account for time unit quantization errors
+ assertThat(delta, lessThanOrEqualTo(1L))
}
@Test
@@ -153,17 +162,19 @@
.build()
val workSpec = request.workSpec
+ val task = mTaskConverter.convert(request.workSpec)
val expected = workSpec.calculateNextRunTime()
val offset = offset(expected, now)
+ val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
- val task = mTaskConverter.convert(request.workSpec)
assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
assertEquals(task.isPersisted, false)
assertEquals(task.isUpdateCurrent, true)
assertEquals(task.requiredNetwork, Task.NETWORK_STATE_ANY)
assertEquals(task.requiresCharging, false)
assertEquals(task.windowStart, offset)
- assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+ // Account for time unit quantization errors
+ assertThat(delta, lessThanOrEqualTo(1L))
}
@Test
@@ -175,9 +186,10 @@
val request = PeriodicWorkRequestBuilder<TestWorker>(15L, TimeUnit.MINUTES)
.build()
+ val task = mTaskConverter.convert(request.workSpec)
val expected = request.workSpec.calculateNextRunTime()
val offset = offset(expected, now)
- val task = mTaskConverter.convert(request.workSpec)
+ val delta = task.windowEnd - (offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
assertEquals(task.serviceName, WorkManagerGcmService::class.java.name)
assertEquals(task.isPersisted, false)
@@ -185,7 +197,8 @@
assertEquals(task.requiredNetwork, Task.NETWORK_STATE_ANY)
assertEquals(task.requiresCharging, false)
assertEquals(task.windowStart, offset)
- assertEquals(task.windowEnd, offset + EXECUTION_WINDOW_SIZE_IN_SECONDS)
+ // Account for time unit quantization errors
+ assertThat(delta, lessThanOrEqualTo(1L))
}
@Test
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/paging/runtime/ktx/api/res-2.2.0-alpha01.txt b/work/workmanager-ktx/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/runtime/ktx/api/res-2.2.0-alpha01.txt
copy to work/workmanager-ktx/api/res-2.3.0-alpha01.txt
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.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/paging/rxjava2/api/res-2.2.0-alpha01.txt b/work/workmanager-rxjava2/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/rxjava2/api/res-2.2.0-alpha01.txt
copy to work/workmanager-rxjava2/api/res-2.3.0-alpha01.txt
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.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/paging/runtime/api/res-2.2.0-alpha01.txt b/work/workmanager-testing/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to work/workmanager-testing/api/res-2.3.0-alpha01.txt
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.3.0-alpha01.txt b/work/workmanager/api/2.3.0-alpha01.txt
new file mode 100644
index 0000000..8d3b024
--- /dev/null
+++ b/work/workmanager/api/2.3.0-alpha01.txt
@@ -0,0 +1,309 @@
+// 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 androidx.work.InputMergerFactory getInputMergerFactory();
+ 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 setInputMergerFactory(androidx.work.InputMergerFactory);
+ 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 InputMergerFactory {
+ ctor public InputMergerFactory();
+ method public abstract androidx.work.InputMerger? createInputMerger(String);
+ }
+
+ 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/current.txt b/work/workmanager/api/current.txt
index f0bff1a..8d3b024 100644
--- a/work/workmanager/api/current.txt
+++ b/work/workmanager/api/current.txt
@@ -13,6 +13,7 @@
public final class Configuration {
method public java.util.concurrent.Executor getExecutor();
+ method public androidx.work.InputMergerFactory getInputMergerFactory();
method public int getMaxJobSchedulerId();
method public int getMinJobSchedulerId();
method public java.util.concurrent.Executor getTaskExecutor();
@@ -24,6 +25,7 @@
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 setInputMergerFactory(androidx.work.InputMergerFactory);
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);
@@ -124,6 +126,11 @@
method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
}
+ public abstract class InputMergerFactory {
+ ctor public InputMergerFactory();
+ method public abstract androidx.work.InputMerger? createInputMerger(String);
+ }
+
public abstract class ListenableWorker {
ctor @Keep public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
method public final android.content.Context getApplicationContext();
diff --git a/paging/runtime/api/res-2.2.0-alpha01.txt b/work/workmanager/api/res-2.3.0-alpha01.txt
similarity index 100%
copy from paging/runtime/api/res-2.2.0-alpha01.txt
copy to work/workmanager/api/res-2.3.0-alpha01.txt
diff --git a/work/workmanager/src/androidTest/java/androidx/work/InputMergerFactoryTest.kt b/work/workmanager/src/androidTest/java/androidx/work/InputMergerFactoryTest.kt
new file mode 100644
index 0000000..8104d5f
--- /dev/null
+++ b/work/workmanager/src/androidTest/java/androidx/work/InputMergerFactoryTest.kt
@@ -0,0 +1,74 @@
+/*
+ * 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.work
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import org.hamcrest.CoreMatchers.notNullValue
+import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.`is`
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.times
+import org.mockito.Mockito.verify
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class InputMergerFactoryTest {
+ private lateinit var context: Context
+ private lateinit var factory: InputMergerFactory
+ private lateinit var configuration: Configuration
+
+ @Before
+ fun setUp() {
+ context = ApplicationProvider.getApplicationContext()
+ factory = mock(InputMergerFactory::class.java)
+ configuration = Configuration.Builder()
+ .setInputMergerFactory(factory)
+ .build()
+ }
+
+ @Test
+ fun testInputMergerFactory() {
+ val name = ArrayCreatingInputMerger::class.java.name
+ val merger = configuration.inputMergerFactory.createInputMergerWithDefaultFallback(name)
+ assertThat(merger, notNullValue())
+ verify(factory, times(1)).createInputMerger(name)
+ }
+
+ @Test
+ fun testInputMergerFactory2() {
+ factory = object : InputMergerFactory() {
+ override fun createInputMerger(className: String): InputMerger? {
+ return OverwritingInputMerger()
+ }
+ }
+ configuration = Configuration.Builder()
+ .setInputMergerFactory(factory)
+ .build()
+
+ val name = ArrayCreatingInputMerger::class.java.name
+ val merger = configuration.inputMergerFactory.createInputMergerWithDefaultFallback(name)
+ val instanceCheck = merger is OverwritingInputMerger
+ assertThat(merger, notNullValue())
+ assertThat(instanceCheck, `is`(true))
+ }
+}
diff --git a/work/workmanager/src/main/java/androidx/work/Configuration.java b/work/workmanager/src/main/java/androidx/work/Configuration.java
index 9246dcce..c24f643 100644
--- a/work/workmanager/src/main/java/androidx/work/Configuration.java
+++ b/work/workmanager/src/main/java/androidx/work/Configuration.java
@@ -51,6 +51,7 @@
private final @NonNull Executor mExecutor;
private final @NonNull Executor mTaskExecutor;
private final @NonNull WorkerFactory mWorkerFactory;
+ private final @NonNull InputMergerFactory mInputMergerFactory;
private final int mLoggingLevel;
private final int mMinJobSchedulerId;
private final int mMaxJobSchedulerId;
@@ -78,6 +79,12 @@
mWorkerFactory = builder.mWorkerFactory;
}
+ if (builder.mInputMergerFactory == null) {
+ mInputMergerFactory = InputMergerFactory.getDefaultInputMergerFactory();
+ } else {
+ mInputMergerFactory = builder.mInputMergerFactory;
+ }
+
mLoggingLevel = builder.mLoggingLevel;
mMinJobSchedulerId = builder.mMinJobSchedulerId;
mMaxJobSchedulerId = builder.mMaxJobSchedulerId;
@@ -115,6 +122,14 @@
}
/**
+ * @return The {@link InputMergerFactory} used by {@link WorkManager} to create instances of
+ * {@link InputMerger}s.
+ */
+ public @NonNull InputMergerFactory getInputMergerFactory() {
+ return mInputMergerFactory;
+ }
+
+ /**
* Gets the minimum logging level for {@link WorkManager}.
*
* @return The minimum logging level, corresponding to the constants found in
@@ -186,6 +201,7 @@
Executor mExecutor;
WorkerFactory mWorkerFactory;
+ InputMergerFactory mInputMergerFactory;
Executor mTaskExecutor;
int mLoggingLevel = Log.INFO;
@@ -205,6 +221,17 @@
}
/**
+ * Specifies a custom {@link InputMergerFactory} for WorkManager.
+ * @param inputMergerFactory A {@link InputMergerFactory} for creating {@link InputMerger}s
+ * @return This {@link Builder} instance
+ */
+ @NonNull
+ public Builder setInputMergerFactory(@NonNull InputMergerFactory inputMergerFactory) {
+ mInputMergerFactory = inputMergerFactory;
+ return this;
+ }
+
+ /**
* Specifies a custom {@link Executor} for WorkManager.
*
* @param executor An {@link Executor} for running {@link Worker}s
diff --git a/work/workmanager/src/main/java/androidx/work/InputMergerFactory.java b/work/workmanager/src/main/java/androidx/work/InputMergerFactory.java
new file mode 100644
index 0000000..ac30624
--- /dev/null
+++ b/work/workmanager/src/main/java/androidx/work/InputMergerFactory.java
@@ -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.work;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RestrictTo;
+
+/**
+ * A factory object that creates {@link InputMerger} instances. The factory is invoked every
+ * time a work runs. You can override the default implementation of this factory by manually
+ * initializing {@link WorkManager} (see {@link WorkManager#initialize(Context, Configuration)}
+ * and specifying a new {@link InputMergerFactory} in
+ * {@link Configuration.Builder#setInputMergerFactory(InputMergerFactory)}.
+ */
+public abstract class InputMergerFactory {
+ /**
+ * Override this method to create an instance of a {@link InputMerger} given its fully
+ * qualified class name.
+ * <p></p>
+ * Throwing an {@link Exception} here will crash the application. If an
+ * {@link InputMergerFactory} is unable to create an instance of a {@link InputMerger}, it
+ * should return {@code null} so it can delegate to the default {@link InputMergerFactory}.
+ *
+ * @param className The fully qualified class name for the {@link InputMerger}
+ * @return an instance of {@link InputMerger}
+ */
+ @Nullable
+ public abstract InputMerger createInputMerger(@NonNull String className);
+
+ /**
+ * Creates an instance of a {@link InputMerger} given its fully
+ * qualified class name with the correct fallback behavior.
+ *
+ * @param className The fully qualified class name for the {@link InputMerger}
+ * @return an instance of {@link InputMerger}
+ *
+ * @hide
+ */
+ @Nullable
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ public final InputMerger createInputMergerWithDefaultFallback(@NonNull String className) {
+ InputMerger inputMerger = createInputMerger(className);
+ if (inputMerger == null) {
+ inputMerger = InputMerger.fromClassName(className);
+ }
+ return inputMerger;
+ }
+
+ /**
+ * @return A default {@link InputMergerFactory} with no custom behavior.
+ *
+ * @hide
+ */
+ @NonNull
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ public static InputMergerFactory getDefaultInputMergerFactory() {
+ return new InputMergerFactory() {
+ @Nullable
+ @Override
+ public InputMerger createInputMerger(@NonNull String className) {
+ return null;
+ }
+ };
+ }
+}
diff --git a/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java b/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
index efa3b4c..de5b1c5 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/WorkerWrapper.java
@@ -35,6 +35,7 @@
import androidx.work.Configuration;
import androidx.work.Data;
import androidx.work.InputMerger;
+import androidx.work.InputMergerFactory;
import androidx.work.ListenableWorker;
import androidx.work.Logger;
import androidx.work.WorkInfo;
@@ -199,7 +200,10 @@
if (mWorkSpec.isPeriodic()) {
input = mWorkSpec.input;
} else {
- InputMerger inputMerger = InputMerger.fromClassName(mWorkSpec.inputMergerClassName);
+ InputMergerFactory inputMergerFactory = mConfiguration.getInputMergerFactory();
+ String inputMergerClassName = mWorkSpec.inputMergerClassName;
+ InputMerger inputMerger =
+ inputMergerFactory.createInputMergerWithDefaultFallback(inputMergerClassName);
if (inputMerger == null) {
Logger.get().error(TAG, String.format("Could not create Input Merger %s",
mWorkSpec.inputMergerClassName));