Merge "Improve Layout API usage" into androidx-master-dev
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index 20d511d..3b440fe 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -99,7 +99,7 @@
prebuilts(LibraryGroups.RECYCLERVIEW, "recyclerview-selection", "1.1.0-alpha06")
prebuilts(LibraryGroups.REMOTECALLBACK, "1.0.0-alpha02")
prebuilts(LibraryGroups.ROOM, "2.2.0-alpha02")
- prebuilts(LibraryGroups.SAVEDSTATE, "1.0.0-beta01")
+ prebuilts(LibraryGroups.SAVEDSTATE, "1.0.0")
// TODO: Remove this ignore once androidx.security:security-identity-credential:1.0.0-alpha01 is released
ignore(LibraryGroups.SECURITY.group, "security-identity-credential")
prebuilts(LibraryGroups.SECURITY, "1.0.0-alpha02")
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera.java
index 7df374c..6189a209 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera.java
@@ -1204,8 +1204,9 @@
throw new IllegalStateException(
"onDisconnected() should not be possible from state: " + mState);
}
-
- closeCamera(/*abortInFlightCaptures=*/true);
+ // Not to close the in flight captures since the capture session has already been
+ // closed.
+ closeCamera(/*abortInFlightCaptures=*/false);
}
@Override
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CaptureSession.java
index 991e2b7..9e3403f 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CaptureSession.java
@@ -310,7 +310,14 @@
List<CaptureConfig> configList =
eventCallbacks.createComboCallback().onDisableSession();
if (!configList.isEmpty()) {
- issueCaptureRequests(setupConfiguredSurface(configList));
+ try {
+ issueCaptureRequests(setupConfiguredSurface(configList));
+ } catch (IllegalStateException e) {
+ // We couldn't issue the request before close the capture session,
+ // but we should continue the close flow.
+ Log.e(TAG, "Unable to issue the request before close the capture "
+ + "session", e);
+ }
}
}
// Not break close flow.
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java b/fragment/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
index ccbc082..ff0ab99 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
@@ -400,7 +400,7 @@
switch (op.mCmd) {
case OP_ADD:
f.setNextAnim(op.mEnterAnim);
- mManager.addFragment(f, false);
+ mManager.addFragment(f);
break;
case OP_REMOVE:
f.setNextAnim(op.mExitAnim);
@@ -465,7 +465,7 @@
break;
case OP_REMOVE:
f.setNextAnim(op.mPopEnterAnim);
- mManager.addFragment(f, false);
+ mManager.addFragment(f);
break;
case OP_HIDE:
f.setNextAnim(op.mPopEnterAnim);
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
index 91842df..faa0829 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentLayoutInflaterFactory.java
@@ -101,7 +101,8 @@
fragment.mHost = mFragmentManager.mHost;
fragment.onInflate(mFragmentManager.mHost.getContext(), attrs,
fragment.mSavedFragmentState);
- mFragmentManager.addFragment(fragment, true);
+ mFragmentManager.addFragment(fragment);
+ mFragmentManager.moveToState(fragment);
} else if (fragment.mInLayout) {
// A fragment already exists and it is not one we restored from
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 6278bae..c2ef3f3 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -1814,7 +1814,7 @@
f.initState();
}
- void addFragment(Fragment fragment, boolean moveToStateNow) {
+ void addFragment(Fragment fragment) {
if (DEBUG) Log.v(TAG, "add: " + fragment);
makeActive(fragment);
if (!fragment.mDetached) {
@@ -1832,9 +1832,6 @@
if (isMenuAvailable(fragment)) {
mNeedMenuInvalidate = true;
}
- if (moveToStateNow) {
- moveToState(fragment);
- }
}
}
diff --git a/ui/ui-framework/api/1.0.0-alpha01.txt b/ui/ui-framework/api/1.0.0-alpha01.txt
index 49b6438..2f60003 100644
--- a/ui/ui-framework/api/1.0.0-alpha01.txt
+++ b/ui/ui-framework/api/1.0.0-alpha01.txt
@@ -36,18 +36,6 @@
method public static void DrawShadow(androidx.ui.engine.geometry.Shape shape, androidx.ui.core.Dp elevation);
}
- public final class EditorStyle {
- ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
- ctor public EditorStyle();
- method public androidx.ui.text.TextStyle? component1();
- method public androidx.ui.graphics.Color component2();
- method public androidx.ui.graphics.Color component3();
- method public androidx.ui.core.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
- method public androidx.ui.graphics.Color getCompositionColor();
- method public androidx.ui.graphics.Color getSelectionColor();
- method public androidx.ui.text.TextStyle? getTextStyle();
- }
-
public final class IntrinsicMeasurementReceiver implements androidx.ui.core.DensityReceiver {
method public androidx.ui.core.Density getDensity();
method public androidx.ui.core.IntPx maxIntrinsicHeight(androidx.ui.core.Measurable, androidx.ui.core.IntPx w);
@@ -99,11 +87,6 @@
property public abstract Object? parentData;
}
- public interface OffsetMap {
- method public int originalToTransformed(int offset);
- method public int transformedToOriginal(int offset);
- }
-
public final class OpacityKt {
ctor public OpacityKt();
method public static void Opacity(@FloatRange(from=0.0, to=1.0) float opacity, kotlin.jvm.functions.Function0<kotlin.Unit> children);
@@ -114,13 +97,6 @@
method public static void ParentData(Object data, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class PasswordVisualTransformation implements androidx.ui.core.VisualTransformation {
- ctor public PasswordVisualTransformation(char mask);
- ctor public PasswordVisualTransformation();
- method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
- method public char getMask();
- }
-
public abstract class Placeable {
ctor public Placeable();
method public abstract androidx.ui.core.IntPx getHeight();
@@ -159,7 +135,7 @@
public final class TextFieldKt {
ctor public TextFieldKt();
- method public static void TextField(androidx.ui.input.EditorModel 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.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.core.VisualTransformation? visualTransformation = null);
+ method public static void TextField(androidx.ui.input.EditorModel value, androidx.ui.input.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null);
}
public final class TextKt {
@@ -197,23 +173,6 @@
method public androidx.ui.core.TextSpanComposition getComposer();
}
- public final class TransformedText {
- ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.core.OffsetMap offsetMap);
- method public androidx.ui.text.AnnotatedString component1();
- method public androidx.ui.core.OffsetMap component2();
- method public androidx.ui.core.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.core.OffsetMap offsetMap);
- method public androidx.ui.core.OffsetMap getOffsetMap();
- method public androidx.ui.text.AnnotatedString getTransformedText();
- }
-
- public interface VisualTransformation {
- method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
- }
-
- public final class VisualTransformationKt {
- ctor public VisualTransformationKt();
- }
-
public final class WrapperKt {
ctor public WrapperKt();
method public static void ComposeView(kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-framework/api/current.txt b/ui/ui-framework/api/current.txt
index 49b6438..2f60003 100644
--- a/ui/ui-framework/api/current.txt
+++ b/ui/ui-framework/api/current.txt
@@ -36,18 +36,6 @@
method public static void DrawShadow(androidx.ui.engine.geometry.Shape shape, androidx.ui.core.Dp elevation);
}
- public final class EditorStyle {
- ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
- ctor public EditorStyle();
- method public androidx.ui.text.TextStyle? component1();
- method public androidx.ui.graphics.Color component2();
- method public androidx.ui.graphics.Color component3();
- method public androidx.ui.core.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
- method public androidx.ui.graphics.Color getCompositionColor();
- method public androidx.ui.graphics.Color getSelectionColor();
- method public androidx.ui.text.TextStyle? getTextStyle();
- }
-
public final class IntrinsicMeasurementReceiver implements androidx.ui.core.DensityReceiver {
method public androidx.ui.core.Density getDensity();
method public androidx.ui.core.IntPx maxIntrinsicHeight(androidx.ui.core.Measurable, androidx.ui.core.IntPx w);
@@ -99,11 +87,6 @@
property public abstract Object? parentData;
}
- public interface OffsetMap {
- method public int originalToTransformed(int offset);
- method public int transformedToOriginal(int offset);
- }
-
public final class OpacityKt {
ctor public OpacityKt();
method public static void Opacity(@FloatRange(from=0.0, to=1.0) float opacity, kotlin.jvm.functions.Function0<kotlin.Unit> children);
@@ -114,13 +97,6 @@
method public static void ParentData(Object data, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class PasswordVisualTransformation implements androidx.ui.core.VisualTransformation {
- ctor public PasswordVisualTransformation(char mask);
- ctor public PasswordVisualTransformation();
- method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
- method public char getMask();
- }
-
public abstract class Placeable {
ctor public Placeable();
method public abstract androidx.ui.core.IntPx getHeight();
@@ -159,7 +135,7 @@
public final class TextFieldKt {
ctor public TextFieldKt();
- method public static void TextField(androidx.ui.input.EditorModel 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.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.core.VisualTransformation? visualTransformation = null);
+ method public static void TextField(androidx.ui.input.EditorModel value, androidx.ui.input.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null);
}
public final class TextKt {
@@ -197,23 +173,6 @@
method public androidx.ui.core.TextSpanComposition getComposer();
}
- public final class TransformedText {
- ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.core.OffsetMap offsetMap);
- method public androidx.ui.text.AnnotatedString component1();
- method public androidx.ui.core.OffsetMap component2();
- method public androidx.ui.core.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.core.OffsetMap offsetMap);
- method public androidx.ui.core.OffsetMap getOffsetMap();
- method public androidx.ui.text.AnnotatedString getTransformedText();
- }
-
- public interface VisualTransformation {
- method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
- }
-
- public final class VisualTransformationKt {
- ctor public VisualTransformationKt();
- }
-
public final class WrapperKt {
ctor public WrapperKt();
method public static void ComposeView(kotlin.jvm.functions.Function0<kotlin.Unit> children);
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 49b6438..2f60003 100644
--- a/ui/ui-framework/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-framework/api/restricted_1.0.0-alpha01.txt
@@ -36,18 +36,6 @@
method public static void DrawShadow(androidx.ui.engine.geometry.Shape shape, androidx.ui.core.Dp elevation);
}
- public final class EditorStyle {
- ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
- ctor public EditorStyle();
- method public androidx.ui.text.TextStyle? component1();
- method public androidx.ui.graphics.Color component2();
- method public androidx.ui.graphics.Color component3();
- method public androidx.ui.core.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
- method public androidx.ui.graphics.Color getCompositionColor();
- method public androidx.ui.graphics.Color getSelectionColor();
- method public androidx.ui.text.TextStyle? getTextStyle();
- }
-
public final class IntrinsicMeasurementReceiver implements androidx.ui.core.DensityReceiver {
method public androidx.ui.core.Density getDensity();
method public androidx.ui.core.IntPx maxIntrinsicHeight(androidx.ui.core.Measurable, androidx.ui.core.IntPx w);
@@ -99,11 +87,6 @@
property public abstract Object? parentData;
}
- public interface OffsetMap {
- method public int originalToTransformed(int offset);
- method public int transformedToOriginal(int offset);
- }
-
public final class OpacityKt {
ctor public OpacityKt();
method public static void Opacity(@FloatRange(from=0.0, to=1.0) float opacity, kotlin.jvm.functions.Function0<kotlin.Unit> children);
@@ -114,13 +97,6 @@
method public static void ParentData(Object data, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class PasswordVisualTransformation implements androidx.ui.core.VisualTransformation {
- ctor public PasswordVisualTransformation(char mask);
- ctor public PasswordVisualTransformation();
- method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
- method public char getMask();
- }
-
public abstract class Placeable {
ctor public Placeable();
method public abstract androidx.ui.core.IntPx getHeight();
@@ -159,7 +135,7 @@
public final class TextFieldKt {
ctor public TextFieldKt();
- method public static void TextField(androidx.ui.input.EditorModel 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.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.core.VisualTransformation? visualTransformation = null);
+ method public static void TextField(androidx.ui.input.EditorModel value, androidx.ui.input.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null);
}
public final class TextKt {
@@ -197,23 +173,6 @@
method public androidx.ui.core.TextSpanComposition getComposer();
}
- public final class TransformedText {
- ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.core.OffsetMap offsetMap);
- method public androidx.ui.text.AnnotatedString component1();
- method public androidx.ui.core.OffsetMap component2();
- method public androidx.ui.core.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.core.OffsetMap offsetMap);
- method public androidx.ui.core.OffsetMap getOffsetMap();
- method public androidx.ui.text.AnnotatedString getTransformedText();
- }
-
- public interface VisualTransformation {
- method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
- }
-
- public final class VisualTransformationKt {
- ctor public VisualTransformationKt();
- }
-
public final class WrapperKt {
ctor public WrapperKt();
method public static void ComposeView(kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-framework/api/restricted_current.txt b/ui/ui-framework/api/restricted_current.txt
index 49b6438..2f60003 100644
--- a/ui/ui-framework/api/restricted_current.txt
+++ b/ui/ui-framework/api/restricted_current.txt
@@ -36,18 +36,6 @@
method public static void DrawShadow(androidx.ui.engine.geometry.Shape shape, androidx.ui.core.Dp elevation);
}
- public final class EditorStyle {
- ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
- ctor public EditorStyle();
- method public androidx.ui.text.TextStyle? component1();
- method public androidx.ui.graphics.Color component2();
- method public androidx.ui.graphics.Color component3();
- method public androidx.ui.core.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
- method public androidx.ui.graphics.Color getCompositionColor();
- method public androidx.ui.graphics.Color getSelectionColor();
- method public androidx.ui.text.TextStyle? getTextStyle();
- }
-
public final class IntrinsicMeasurementReceiver implements androidx.ui.core.DensityReceiver {
method public androidx.ui.core.Density getDensity();
method public androidx.ui.core.IntPx maxIntrinsicHeight(androidx.ui.core.Measurable, androidx.ui.core.IntPx w);
@@ -99,11 +87,6 @@
property public abstract Object? parentData;
}
- public interface OffsetMap {
- method public int originalToTransformed(int offset);
- method public int transformedToOriginal(int offset);
- }
-
public final class OpacityKt {
ctor public OpacityKt();
method public static void Opacity(@FloatRange(from=0.0, to=1.0) float opacity, kotlin.jvm.functions.Function0<kotlin.Unit> children);
@@ -114,13 +97,6 @@
method public static void ParentData(Object data, kotlin.jvm.functions.Function0<kotlin.Unit> children);
}
- public final class PasswordVisualTransformation implements androidx.ui.core.VisualTransformation {
- ctor public PasswordVisualTransformation(char mask);
- ctor public PasswordVisualTransformation();
- method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
- method public char getMask();
- }
-
public abstract class Placeable {
ctor public Placeable();
method public abstract androidx.ui.core.IntPx getHeight();
@@ -159,7 +135,7 @@
public final class TextFieldKt {
ctor public TextFieldKt();
- method public static void TextField(androidx.ui.input.EditorModel 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.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.core.VisualTransformation? visualTransformation = null);
+ method public static void TextField(androidx.ui.input.EditorModel value, androidx.ui.input.EditorStyle editorStyle, androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super androidx.ui.input.EditorModel,kotlin.Unit> onValueChange = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onFocus = {}, kotlin.jvm.functions.Function0<kotlin.Unit> onBlur = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null);
}
public final class TextKt {
@@ -197,23 +173,6 @@
method public androidx.ui.core.TextSpanComposition getComposer();
}
- public final class TransformedText {
- ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.core.OffsetMap offsetMap);
- method public androidx.ui.text.AnnotatedString component1();
- method public androidx.ui.core.OffsetMap component2();
- method public androidx.ui.core.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.core.OffsetMap offsetMap);
- method public androidx.ui.core.OffsetMap getOffsetMap();
- method public androidx.ui.text.AnnotatedString getTransformedText();
- }
-
- public interface VisualTransformation {
- method public androidx.ui.core.TransformedText filter(androidx.ui.text.AnnotatedString text);
- }
-
- public final class VisualTransformationKt {
- ctor public VisualTransformationKt();
- }
-
public final class WrapperKt {
ctor public WrapperKt();
method public static void ComposeView(kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/autofill/ExplicitAutofillTypesActivity.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/autofill/ExplicitAutofillTypesActivity.kt
index 3716bfe..dca00a9 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/autofill/ExplicitAutofillTypesActivity.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/autofill/ExplicitAutofillTypesActivity.kt
@@ -29,7 +29,6 @@
import androidx.ui.autofill.AutofillType
import androidx.ui.core.AutofillAmbient
import androidx.ui.core.AutofillTreeAmbient
-import androidx.ui.core.EditorStyle
import androidx.ui.core.TextField
import androidx.ui.core.Text
import androidx.ui.material.themeTextStyle
@@ -39,6 +38,7 @@
import androidx.ui.core.dp
import androidx.ui.core.setContent
import androidx.ui.input.EditorModel
+import androidx.ui.input.EditorStyle
import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
import androidx.ui.layout.Column
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt b/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
index 9d2dd4e..9dfb3d3 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/TextField.kt
@@ -25,42 +25,19 @@
import androidx.ui.core.gesture.DragObserver
import androidx.ui.core.gesture.PressGestureDetector
import androidx.ui.core.input.FocusManager
-import androidx.ui.graphics.Color
import androidx.ui.input.EditProcessor
import androidx.ui.input.EditorModel
+import androidx.ui.input.EditorStyle
import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
+import androidx.ui.input.VisualTransformation
import androidx.ui.text.TextDelegate
-import androidx.ui.text.TextStyle
-
-/**
- * Data class holding text display attributes used for editors.
- */
-data class EditorStyle(
- /** The editor text style */
- val textStyle: TextStyle? = null,
-
- /**
- * The composition background color
- *
- * @see EditorModel.composition
- */
- val compositionColor: Color = Color(alpha = 0xFF, red = 0xB0, green = 0xE0, blue = 0xE6),
-
- /**
- * The selection background color
- *
- * @see EditorModel.selection
- */
- // TODO(nona): share with Text.DEFAULT_SELECTION_COLOR
- val selectionColor: Color = Color(alpha = 0x66, red = 0x33, green = 0xB5, blue = 0xE5)
-)
/**
* A default implementation of TextField
*
* To make TextField work with platoform input service, you must keep the editor state and update
- * in [onValueChagne] callback.
+ * in [onValueChange] callback.
*
* Example:
* var state = +state { EditorModel() }
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt b/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
index 3ad94ca..884806f 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/TextFieldDelegate.kt
@@ -21,11 +21,16 @@
import androidx.ui.input.EditOperation
import androidx.ui.input.EditProcessor
import androidx.ui.input.EditorModel
+import androidx.ui.input.EditorStyle
import androidx.ui.input.FinishComposingTextEditOp
import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
+import androidx.ui.input.OffsetMap
import androidx.ui.input.SetSelectionEditOp
import androidx.ui.input.TextInputService
+import androidx.ui.input.TransformedText
+import androidx.ui.input.VisualTransformation
+import androidx.ui.input.identityOffsetMap
import androidx.ui.painting.Canvas
import androidx.ui.text.AnnotatedString
import androidx.ui.text.Paragraph
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt b/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
index f56c7c1..89e9a23 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
+++ b/ui/ui-framework/src/test/java/androidx/ui/core/TextFieldDelegateTest.kt
@@ -22,9 +22,11 @@
import androidx.ui.input.EditOperation
import androidx.ui.input.EditProcessor
import androidx.ui.input.EditorModel
+import androidx.ui.input.EditorStyle
import androidx.ui.input.FinishComposingTextEditOp
import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
+import androidx.ui.input.OffsetMap
import androidx.ui.input.SetSelectionEditOp
import androidx.ui.input.TextInputService
import androidx.ui.painting.Canvas
diff --git a/ui/ui-text/api/1.0.0-alpha01.txt b/ui/ui-text/api/1.0.0-alpha01.txt
index 7d15e2a..881f4a4 100644
--- a/ui/ui-text/api/1.0.0-alpha01.txt
+++ b/ui/ui-text/api/1.0.0-alpha01.txt
@@ -11,6 +11,18 @@
property public final String text;
}
+ public final class EditorStyle {
+ ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
+ ctor public EditorStyle();
+ method public androidx.ui.text.TextStyle? component1();
+ method public androidx.ui.graphics.Color component2();
+ method public androidx.ui.graphics.Color component3();
+ method public androidx.ui.input.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
+ method public androidx.ui.graphics.Color getCompositionColor();
+ method public androidx.ui.graphics.Color getSelectionColor();
+ method public androidx.ui.text.TextStyle? getTextStyle();
+ }
+
public enum ImeAction {
enum_constant public static final androidx.ui.input.ImeAction Done;
enum_constant public static final androidx.ui.input.ImeAction Go;
@@ -33,6 +45,35 @@
enum_constant public static final androidx.ui.input.KeyboardType Uri;
}
+ public interface OffsetMap {
+ method public int originalToTransformed(int offset);
+ method public int transformedToOriginal(int offset);
+ }
+
+ public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+ ctor public PasswordVisualTransformation(char mask);
+ ctor public PasswordVisualTransformation();
+ method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+ method public char getMask();
+ }
+
+ public final class TransformedText {
+ ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+ method public androidx.ui.text.AnnotatedString component1();
+ method public androidx.ui.input.OffsetMap component2();
+ method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+ method public androidx.ui.input.OffsetMap getOffsetMap();
+ method public androidx.ui.text.AnnotatedString getTransformedText();
+ }
+
+ public interface VisualTransformation {
+ method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+ }
+
+ public final class VisualTransformationKt {
+ ctor public VisualTransformationKt();
+ }
+
}
package androidx.ui.text {
@@ -63,25 +104,6 @@
method public T! getStyle();
}
- public final class Locale {
- ctor public Locale(String _languageCode, String? _countryCode);
- method public String component1();
- method public String? component2();
- method public androidx.ui.text.Locale copy(String _languageCode, String? _countryCode);
- method public String! getCountryCode();
- method public String getLanguageCode();
- method public String? get_countryCode();
- method public String get_languageCode();
- property public final String! countryCode;
- property public final String languageCode;
- field public static final androidx.ui.text.Locale.Companion! Companion;
- }
-
- public static final class Locale.Companion {
- method public String _canonicalizeLanguageCode(String languageCode);
- method public String _canonicalizeRegionCode(String regionCode);
- }
-
public final class MultiParagraphKt {
ctor public MultiParagraphKt();
}
@@ -149,12 +171,12 @@
}
public final class TextStyle {
- ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
+ ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, java.util.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
ctor public TextStyle();
method public androidx.ui.graphics.Color? component1();
method public androidx.ui.text.style.BaselineShift? component10();
method public androidx.ui.text.style.TextGeometricTransform? component11();
- method public androidx.ui.text.Locale? component12();
+ method public java.util.Locale? component12();
method public androidx.ui.graphics.Color? component13();
method public androidx.ui.text.style.TextDecoration? component14();
method public androidx.ui.painting.Shadow? component15();
@@ -166,7 +188,7 @@
method public androidx.ui.text.font.FontFamily? component7();
method public String? component8();
method public Float? component9();
- method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
+ method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, java.util.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
method public androidx.ui.graphics.Color? getBackground();
method public androidx.ui.text.style.BaselineShift? getBaselineShift();
method public androidx.ui.graphics.Color? getColor();
@@ -179,7 +201,7 @@
method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
method public androidx.ui.text.font.FontWeight? getFontWeight();
method public Float? getLetterSpacing();
- method public androidx.ui.text.Locale? getLocale();
+ method public java.util.Locale? getLocale();
method public androidx.ui.painting.Shadow? getShadow();
method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
diff --git a/ui/ui-text/api/api_lint.ignore b/ui/ui-text/api/api_lint.ignore
index 87e9863..8d78f05 100644
--- a/ui/ui-text/api/api_lint.ignore
+++ b/ui/ui-text/api/api_lint.ignore
@@ -9,21 +9,17 @@
Must avoid boxed primitives (`java.lang.Float`)
AutoBoxing: androidx.ui.text.ParagraphStyle#getLineHeight():
Must avoid boxed primitives (`java.lang.Float`)
-AutoBoxing: androidx.ui.text.TextDelegate#TextPainter(androidx.ui.text.AnnotatedString, androidx.ui.text.TextStyle, androidx.ui.text.ParagraphStyle, Integer, boolean, androidx.ui.text.style.TextOverflow, androidx.ui.text.Locale, androidx.ui.core.Density, androidx.ui.text.font.Font.ResourceLoader) parameter #3:
- Must avoid boxed primitives (`java.lang.Integer`)
-AutoBoxing: androidx.ui.text.TextDelegate#getMaxLines():
- Must avoid boxed primitives (`java.lang.Integer`)
-AutoBoxing: androidx.ui.text.TextStyle#TextStyle(androidx.ui.graphics.Color, androidx.ui.core.Sp, Float, androidx.ui.text.font.FontWeight, androidx.ui.text.font.FontStyle, androidx.ui.text.font.FontSynthesis, androidx.ui.text.font.FontFamily, String, Float, androidx.ui.text.style.BaselineShift, androidx.ui.text.style.TextGeometricTransform, androidx.ui.text.Locale, androidx.ui.graphics.Color, androidx.ui.text.style.TextDecoration, androidx.ui.painting.Shadow) parameter #2:
+AutoBoxing: androidx.ui.text.TextStyle#TextStyle(androidx.ui.graphics.Color, androidx.ui.core.Sp, Float, androidx.ui.text.font.FontWeight, androidx.ui.text.font.FontStyle, androidx.ui.text.font.FontSynthesis, androidx.ui.text.font.FontFamily, String, Float, androidx.ui.text.style.BaselineShift, androidx.ui.text.style.TextGeometricTransform, java.util.Locale, androidx.ui.graphics.Color, androidx.ui.text.style.TextDecoration, androidx.ui.painting.Shadow) parameter #2:
Must avoid boxed primitives (`java.lang.Float`)
-AutoBoxing: androidx.ui.text.TextStyle#TextStyle(androidx.ui.graphics.Color, androidx.ui.core.Sp, Float, androidx.ui.text.font.FontWeight, androidx.ui.text.font.FontStyle, androidx.ui.text.font.FontSynthesis, androidx.ui.text.font.FontFamily, String, Float, androidx.ui.text.style.BaselineShift, androidx.ui.text.style.TextGeometricTransform, androidx.ui.text.Locale, androidx.ui.graphics.Color, androidx.ui.text.style.TextDecoration, androidx.ui.painting.Shadow) parameter #8:
+AutoBoxing: androidx.ui.text.TextStyle#TextStyle(androidx.ui.graphics.Color, androidx.ui.core.Sp, Float, androidx.ui.text.font.FontWeight, androidx.ui.text.font.FontStyle, androidx.ui.text.font.FontSynthesis, androidx.ui.text.font.FontFamily, String, Float, androidx.ui.text.style.BaselineShift, androidx.ui.text.style.TextGeometricTransform, java.util.Locale, androidx.ui.graphics.Color, androidx.ui.text.style.TextDecoration, androidx.ui.painting.Shadow) parameter #8:
Must avoid boxed primitives (`java.lang.Float`)
AutoBoxing: androidx.ui.text.TextStyle#component3():
Must avoid boxed primitives (`java.lang.Float`)
AutoBoxing: androidx.ui.text.TextStyle#component9():
Must avoid boxed primitives (`java.lang.Float`)
-AutoBoxing: androidx.ui.text.TextStyle#copy(androidx.ui.graphics.Color, androidx.ui.core.Sp, Float, androidx.ui.text.font.FontWeight, androidx.ui.text.font.FontStyle, androidx.ui.text.font.FontSynthesis, androidx.ui.text.font.FontFamily, String, Float, androidx.ui.text.style.BaselineShift, androidx.ui.text.style.TextGeometricTransform, androidx.ui.text.Locale, androidx.ui.graphics.Color, androidx.ui.text.style.TextDecoration, androidx.ui.painting.Shadow) parameter #2:
+AutoBoxing: androidx.ui.text.TextStyle#copy(androidx.ui.graphics.Color, androidx.ui.core.Sp, Float, androidx.ui.text.font.FontWeight, androidx.ui.text.font.FontStyle, androidx.ui.text.font.FontSynthesis, androidx.ui.text.font.FontFamily, String, Float, androidx.ui.text.style.BaselineShift, androidx.ui.text.style.TextGeometricTransform, java.util.Locale, androidx.ui.graphics.Color, androidx.ui.text.style.TextDecoration, androidx.ui.painting.Shadow) parameter #2:
Must avoid boxed primitives (`java.lang.Float`)
-AutoBoxing: androidx.ui.text.TextStyle#copy(androidx.ui.graphics.Color, androidx.ui.core.Sp, Float, androidx.ui.text.font.FontWeight, androidx.ui.text.font.FontStyle, androidx.ui.text.font.FontSynthesis, androidx.ui.text.font.FontFamily, String, Float, androidx.ui.text.style.BaselineShift, androidx.ui.text.style.TextGeometricTransform, androidx.ui.text.Locale, androidx.ui.graphics.Color, androidx.ui.text.style.TextDecoration, androidx.ui.painting.Shadow) parameter #8:
+AutoBoxing: androidx.ui.text.TextStyle#copy(androidx.ui.graphics.Color, androidx.ui.core.Sp, Float, androidx.ui.text.font.FontWeight, androidx.ui.text.font.FontStyle, androidx.ui.text.font.FontSynthesis, androidx.ui.text.font.FontFamily, String, Float, androidx.ui.text.style.BaselineShift, androidx.ui.text.style.TextGeometricTransform, java.util.Locale, androidx.ui.graphics.Color, androidx.ui.text.style.TextDecoration, androidx.ui.painting.Shadow) parameter #8:
Must avoid boxed primitives (`java.lang.Float`)
AutoBoxing: androidx.ui.text.TextStyle#getFontSizeScale():
Must avoid boxed primitives (`java.lang.Float`)
@@ -55,10 +51,6 @@
Note that adding the `operator` keyword would allow calling this method using operator syntax
-MissingNullability: androidx.ui.text.Locale#Companion:
- Missing nullability on field `Companion` in class `class androidx.ui.text.Locale`
-MissingNullability: androidx.ui.text.Locale#getCountryCode():
- Missing nullability on method `getCountryCode` return
MissingNullability: androidx.ui.text.font.FontWeight#Companion:
Missing nullability on field `Companion` in class `class androidx.ui.text.font.FontWeight`
MissingNullability: androidx.ui.text.style.BaselineShift#Companion:
diff --git a/ui/ui-text/api/current.txt b/ui/ui-text/api/current.txt
index 7d15e2a..881f4a4 100644
--- a/ui/ui-text/api/current.txt
+++ b/ui/ui-text/api/current.txt
@@ -11,6 +11,18 @@
property public final String text;
}
+ public final class EditorStyle {
+ ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
+ ctor public EditorStyle();
+ method public androidx.ui.text.TextStyle? component1();
+ method public androidx.ui.graphics.Color component2();
+ method public androidx.ui.graphics.Color component3();
+ method public androidx.ui.input.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
+ method public androidx.ui.graphics.Color getCompositionColor();
+ method public androidx.ui.graphics.Color getSelectionColor();
+ method public androidx.ui.text.TextStyle? getTextStyle();
+ }
+
public enum ImeAction {
enum_constant public static final androidx.ui.input.ImeAction Done;
enum_constant public static final androidx.ui.input.ImeAction Go;
@@ -33,6 +45,35 @@
enum_constant public static final androidx.ui.input.KeyboardType Uri;
}
+ public interface OffsetMap {
+ method public int originalToTransformed(int offset);
+ method public int transformedToOriginal(int offset);
+ }
+
+ public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+ ctor public PasswordVisualTransformation(char mask);
+ ctor public PasswordVisualTransformation();
+ method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+ method public char getMask();
+ }
+
+ public final class TransformedText {
+ ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+ method public androidx.ui.text.AnnotatedString component1();
+ method public androidx.ui.input.OffsetMap component2();
+ method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+ method public androidx.ui.input.OffsetMap getOffsetMap();
+ method public androidx.ui.text.AnnotatedString getTransformedText();
+ }
+
+ public interface VisualTransformation {
+ method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+ }
+
+ public final class VisualTransformationKt {
+ ctor public VisualTransformationKt();
+ }
+
}
package androidx.ui.text {
@@ -63,25 +104,6 @@
method public T! getStyle();
}
- public final class Locale {
- ctor public Locale(String _languageCode, String? _countryCode);
- method public String component1();
- method public String? component2();
- method public androidx.ui.text.Locale copy(String _languageCode, String? _countryCode);
- method public String! getCountryCode();
- method public String getLanguageCode();
- method public String? get_countryCode();
- method public String get_languageCode();
- property public final String! countryCode;
- property public final String languageCode;
- field public static final androidx.ui.text.Locale.Companion! Companion;
- }
-
- public static final class Locale.Companion {
- method public String _canonicalizeLanguageCode(String languageCode);
- method public String _canonicalizeRegionCode(String regionCode);
- }
-
public final class MultiParagraphKt {
ctor public MultiParagraphKt();
}
@@ -149,12 +171,12 @@
}
public final class TextStyle {
- ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
+ ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, java.util.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
ctor public TextStyle();
method public androidx.ui.graphics.Color? component1();
method public androidx.ui.text.style.BaselineShift? component10();
method public androidx.ui.text.style.TextGeometricTransform? component11();
- method public androidx.ui.text.Locale? component12();
+ method public java.util.Locale? component12();
method public androidx.ui.graphics.Color? component13();
method public androidx.ui.text.style.TextDecoration? component14();
method public androidx.ui.painting.Shadow? component15();
@@ -166,7 +188,7 @@
method public androidx.ui.text.font.FontFamily? component7();
method public String? component8();
method public Float? component9();
- method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
+ method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, java.util.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
method public androidx.ui.graphics.Color? getBackground();
method public androidx.ui.text.style.BaselineShift? getBaselineShift();
method public androidx.ui.graphics.Color? getColor();
@@ -179,7 +201,7 @@
method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
method public androidx.ui.text.font.FontWeight? getFontWeight();
method public Float? getLetterSpacing();
- method public androidx.ui.text.Locale? getLocale();
+ method public java.util.Locale? getLocale();
method public androidx.ui.painting.Shadow? getShadow();
method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
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 a2896e5..d351ab5 100644
--- a/ui/ui-text/api/restricted_1.0.0-alpha01.txt
+++ b/ui/ui-text/api/restricted_1.0.0-alpha01.txt
@@ -18,6 +18,18 @@
property public final String text;
}
+ public final class EditorStyle {
+ ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
+ ctor public EditorStyle();
+ method public androidx.ui.text.TextStyle? component1();
+ method public androidx.ui.graphics.Color component2();
+ method public androidx.ui.graphics.Color component3();
+ method public androidx.ui.input.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
+ method public androidx.ui.graphics.Color getCompositionColor();
+ method public androidx.ui.graphics.Color getSelectionColor();
+ method public androidx.ui.text.TextStyle? getTextStyle();
+ }
+
public enum ImeAction {
enum_constant public static final androidx.ui.input.ImeAction Done;
@@ -43,10 +55,39 @@
}
+ public interface OffsetMap {
+ method public int originalToTransformed(int offset);
+ method public int transformedToOriginal(int offset);
+ }
+
+ public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+ ctor public PasswordVisualTransformation(char mask);
+ ctor public PasswordVisualTransformation();
+ method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+ method public char getMask();
+ }
+
+ public final class TransformedText {
+ ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+ method public androidx.ui.text.AnnotatedString component1();
+ method public androidx.ui.input.OffsetMap component2();
+ method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+ method public androidx.ui.input.OffsetMap getOffsetMap();
+ method public androidx.ui.text.AnnotatedString getTransformedText();
+ }
+
+ public interface VisualTransformation {
+ method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+ }
+
+ public final class VisualTransformationKt {
+ ctor public VisualTransformationKt();
+ }
+
}
package androidx.ui.text {
@@ -77,25 +118,6 @@
method public T! getStyle();
}
- public final class Locale {
- ctor public Locale(String _languageCode, String? _countryCode);
- method public String component1();
- method public String? component2();
- method public androidx.ui.text.Locale copy(String _languageCode, String? _countryCode);
- method public String! getCountryCode();
- method public String getLanguageCode();
- method public String? get_countryCode();
- method public String get_languageCode();
- property public final String! countryCode;
- property public final String languageCode;
- field public static final androidx.ui.text.Locale.Companion! Companion;
- }
-
- public static final class Locale.Companion {
- method public String _canonicalizeLanguageCode(String languageCode);
- method public String _canonicalizeRegionCode(String regionCode);
- }
-
public final class MultiParagraphKt {
ctor public MultiParagraphKt();
}
@@ -175,12 +197,12 @@
}
public final class TextStyle {
- ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
+ ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, java.util.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
ctor public TextStyle();
method public androidx.ui.graphics.Color? component1();
method public androidx.ui.text.style.BaselineShift? component10();
method public androidx.ui.text.style.TextGeometricTransform? component11();
- method public androidx.ui.text.Locale? component12();
+ method public java.util.Locale? component12();
method public androidx.ui.graphics.Color? component13();
method public androidx.ui.text.style.TextDecoration? component14();
method public androidx.ui.painting.Shadow? component15();
@@ -192,7 +214,7 @@
method public androidx.ui.text.font.FontFamily? component7();
method public String? component8();
method public Float? component9();
- method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
+ method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, java.util.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
method public androidx.ui.graphics.Color? getBackground();
method public androidx.ui.text.style.BaselineShift? getBaselineShift();
method public androidx.ui.graphics.Color? getColor();
@@ -205,7 +227,7 @@
method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
method public androidx.ui.text.font.FontWeight? getFontWeight();
method public Float? getLetterSpacing();
- method public androidx.ui.text.Locale? getLocale();
+ method public java.util.Locale? getLocale();
method public androidx.ui.painting.Shadow? getShadow();
method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
diff --git a/ui/ui-text/api/restricted_current.txt b/ui/ui-text/api/restricted_current.txt
index a2896e5..d351ab5 100644
--- a/ui/ui-text/api/restricted_current.txt
+++ b/ui/ui-text/api/restricted_current.txt
@@ -18,6 +18,18 @@
property public final String text;
}
+ public final class EditorStyle {
+ ctor public EditorStyle(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
+ ctor public EditorStyle();
+ method public androidx.ui.text.TextStyle? component1();
+ method public androidx.ui.graphics.Color component2();
+ method public androidx.ui.graphics.Color component3();
+ method public androidx.ui.input.EditorStyle copy(androidx.ui.text.TextStyle? textStyle, androidx.ui.graphics.Color compositionColor, androidx.ui.graphics.Color selectionColor);
+ method public androidx.ui.graphics.Color getCompositionColor();
+ method public androidx.ui.graphics.Color getSelectionColor();
+ method public androidx.ui.text.TextStyle? getTextStyle();
+ }
+
public enum ImeAction {
enum_constant public static final androidx.ui.input.ImeAction Done;
@@ -43,10 +55,39 @@
}
+ public interface OffsetMap {
+ method public int originalToTransformed(int offset);
+ method public int transformedToOriginal(int offset);
+ }
+
+ public final class PasswordVisualTransformation implements androidx.ui.input.VisualTransformation {
+ ctor public PasswordVisualTransformation(char mask);
+ ctor public PasswordVisualTransformation();
+ method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+ method public char getMask();
+ }
+
+ public final class TransformedText {
+ ctor public TransformedText(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+ method public androidx.ui.text.AnnotatedString component1();
+ method public androidx.ui.input.OffsetMap component2();
+ method public androidx.ui.input.TransformedText copy(androidx.ui.text.AnnotatedString transformedText, androidx.ui.input.OffsetMap offsetMap);
+ method public androidx.ui.input.OffsetMap getOffsetMap();
+ method public androidx.ui.text.AnnotatedString getTransformedText();
+ }
+
+ public interface VisualTransformation {
+ method public androidx.ui.input.TransformedText filter(androidx.ui.text.AnnotatedString text);
+ }
+
+ public final class VisualTransformationKt {
+ ctor public VisualTransformationKt();
+ }
+
}
package androidx.ui.text {
@@ -77,25 +118,6 @@
method public T! getStyle();
}
- public final class Locale {
- ctor public Locale(String _languageCode, String? _countryCode);
- method public String component1();
- method public String? component2();
- method public androidx.ui.text.Locale copy(String _languageCode, String? _countryCode);
- method public String! getCountryCode();
- method public String getLanguageCode();
- method public String? get_countryCode();
- method public String get_languageCode();
- property public final String! countryCode;
- property public final String languageCode;
- field public static final androidx.ui.text.Locale.Companion! Companion;
- }
-
- public static final class Locale.Companion {
- method public String _canonicalizeLanguageCode(String languageCode);
- method public String _canonicalizeRegionCode(String regionCode);
- }
-
public final class MultiParagraphKt {
ctor public MultiParagraphKt();
}
@@ -175,12 +197,12 @@
}
public final class TextStyle {
- ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
+ ctor public TextStyle(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, java.util.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
ctor public TextStyle();
method public androidx.ui.graphics.Color? component1();
method public androidx.ui.text.style.BaselineShift? component10();
method public androidx.ui.text.style.TextGeometricTransform? component11();
- method public androidx.ui.text.Locale? component12();
+ method public java.util.Locale? component12();
method public androidx.ui.graphics.Color? component13();
method public androidx.ui.text.style.TextDecoration? component14();
method public androidx.ui.painting.Shadow? component15();
@@ -192,7 +214,7 @@
method public androidx.ui.text.font.FontFamily? component7();
method public String? component8();
method public Float? component9();
- method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, androidx.ui.text.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
+ method public androidx.ui.text.TextStyle copy(androidx.ui.graphics.Color? color, androidx.ui.core.Sp? fontSize, Float? fontSizeScale, androidx.ui.text.font.FontWeight? fontWeight, androidx.ui.text.font.FontStyle? fontStyle, androidx.ui.text.font.FontSynthesis? fontSynthesis, androidx.ui.text.font.FontFamily? fontFamily, String? fontFeatureSettings, Float? letterSpacing, androidx.ui.text.style.BaselineShift? baselineShift, androidx.ui.text.style.TextGeometricTransform? textGeometricTransform, java.util.Locale? locale, androidx.ui.graphics.Color? background, androidx.ui.text.style.TextDecoration? decoration, androidx.ui.painting.Shadow? shadow);
method public androidx.ui.graphics.Color? getBackground();
method public androidx.ui.text.style.BaselineShift? getBaselineShift();
method public androidx.ui.graphics.Color? getColor();
@@ -205,7 +227,7 @@
method public androidx.ui.text.font.FontSynthesis? getFontSynthesis();
method public androidx.ui.text.font.FontWeight? getFontWeight();
method public Float? getLetterSpacing();
- method public androidx.ui.text.Locale? getLocale();
+ method public java.util.Locale? getLocale();
method public androidx.ui.painting.Shadow? getShadow();
method public androidx.ui.text.style.TextGeometricTransform? getTextGeometricTransform();
method public androidx.ui.text.TextStyle merge(androidx.ui.text.TextStyle? other = null);
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 b345b40..a775fd1 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
@@ -20,9 +20,9 @@
import androidx.compose.Composable
import androidx.compose.state
import androidx.compose.unaryPlus
-import androidx.ui.core.EditorStyle
import androidx.ui.core.TextField
import androidx.ui.input.EditorModel
+import androidx.ui.input.EditorStyle
import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
import androidx.ui.layout.Column
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
index a4f8e25..e9af896 100644
--- a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
+++ b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneText.kt
@@ -33,7 +33,6 @@
import androidx.ui.text.style.TextDecoration
import androidx.ui.text.style.TextDirection
import androidx.ui.text.font.FontFamily
-import androidx.ui.text.Locale
import androidx.ui.graphics.Color
import androidx.ui.graphics.lerp
import androidx.ui.layout.Column
@@ -49,6 +48,7 @@
import androidx.ui.core.sp
import androidx.ui.text.AnnotatedString
import androidx.ui.text.style.TextIndent
+import java.util.Locale
val displayText = "Text Demo"
val displayTextChinese = "文本演示"
@@ -377,7 +377,7 @@
text = "$text ",
style = TextStyle(
fontSize = fontSize8,
- locale = Locale(_languageCode = "ja", _countryCode = "JP")
+ locale = Locale("ja", "JP")
)
)
@@ -385,7 +385,7 @@
text = "$text ",
style = TextStyle(
fontSize = fontSize8,
- locale = Locale(_languageCode = "zh", _countryCode = "CN")
+ locale = Locale("zh", "CN")
)
)
@@ -393,7 +393,7 @@
text = text,
style = TextStyle(
fontSize = fontSize8,
- locale = Locale(_languageCode = "zh", _countryCode = "TW")
+ locale = Locale("zh", "TW")
)
)
}
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneVariousInputField.kt b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneVariousInputField.kt
index 9264729..05cfca9 100644
--- a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneVariousInputField.kt
+++ b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/CraneVariousInputField.kt
@@ -20,17 +20,17 @@
import androidx.compose.Composable
import androidx.compose.state
import androidx.compose.unaryPlus
-import androidx.ui.core.EditorStyle
import androidx.ui.core.Layout
-import androidx.ui.core.OffsetMap
-import androidx.ui.core.PasswordVisualTransformation
+import androidx.ui.input.OffsetMap
+import androidx.ui.input.PasswordVisualTransformation
import androidx.ui.core.Text
import androidx.ui.core.TextField
-import androidx.ui.core.TransformedText
-import androidx.ui.core.VisualTransformation
+import androidx.ui.input.TransformedText
+import androidx.ui.input.VisualTransformation
import androidx.ui.core.ipx
import androidx.ui.graphics.Color
import androidx.ui.input.EditorModel
+import androidx.ui.input.EditorStyle
import androidx.ui.input.ImeAction
import androidx.ui.input.KeyboardType
import androidx.ui.layout.Column
@@ -41,7 +41,7 @@
import java.util.Locale
/**
- * The offset translater used for credit card input field.
+ * The offset translator used for credit card input field.
*
* @see creditCardFilter
*/
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/MultiParagraphIntegrationTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/MultiParagraphIntegrationTest.kt
index 75c21b6..96f43d1 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/MultiParagraphIntegrationTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/MultiParagraphIntegrationTest.kt
@@ -40,6 +40,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+import java.util.Locale
@RunWith(JUnit4::class)
@SmallTest
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt
index 9718437..0487f3c 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/ParagraphIntegrationTest.kt
@@ -48,6 +48,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+import java.util.Locale
@RunWith(JUnit4::class)
@SmallTest
@@ -1000,10 +1001,10 @@
val fontSizeInPx = fontSize.toPx().value
val locales = arrayOf(
// duplicate ja is on purpose
- Locale(_languageCode = "ja"),
- Locale(_languageCode = "ja"),
- Locale(_languageCode = "zh", _countryCode = "CN"),
- Locale(_languageCode = "zh", _countryCode = "TW")
+ Locale("ja"),
+ Locale("ja"),
+ Locale("zh", "CN"),
+ Locale("zh", "TW")
)
val bitmaps = locales.map { locale ->
diff --git a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidParagraphTest.kt b/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidParagraphTest.kt
index ef5b100..3be82b7 100644
--- a/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidParagraphTest.kt
+++ b/ui/ui-text/src/androidTest/java/androidx/ui/text/platform/AndroidParagraphTest.kt
@@ -37,7 +37,6 @@
import androidx.ui.text.style.TextIndent
import androidx.ui.text.font.FontFamily
import androidx.ui.text.font.asFontFamily
-import androidx.ui.text.Locale
import androidx.ui.graphics.Color
import androidx.ui.text.matchers.equalToBitmap
import androidx.ui.text.matchers.hasSpan
@@ -63,6 +62,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+import java.util.Locale
import kotlin.math.ceil
@RunWith(JUnit4::class)
@@ -1216,7 +1216,7 @@
@Test
fun locale_isSetOnParagraphImpl_enUS() {
- val locale = Locale(_languageCode = "en", _countryCode = "US")
+ val locale = Locale("en", "US")
val text = "abc"
val paragraph = simpleParagraph(
text = text,
@@ -1230,7 +1230,7 @@
@Test
fun locale_isSetOnParagraphImpl_jpJP() {
- val locale = Locale(_languageCode = "ja", _countryCode = "JP")
+ val locale = Locale("ja", "JP")
val text = "abc"
val paragraph = simpleParagraph(
text = text,
@@ -1244,7 +1244,7 @@
@Test
fun locale_noCountryCode_isSetOnParagraphImpl() {
- val locale = Locale(_languageCode = "ja")
+ val locale = Locale("ja")
val text = "abc"
val paragraph = simpleParagraph(
text = text,
diff --git a/ui/ui-text/src/main/java/androidx/ui/input/EditorStyle.kt b/ui/ui-text/src/main/java/androidx/ui/input/EditorStyle.kt
new file mode 100644
index 0000000..a4c2dce
--- /dev/null
+++ b/ui/ui-text/src/main/java/androidx/ui/input/EditorStyle.kt
@@ -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.ui.input
+
+import androidx.ui.graphics.Color
+import androidx.ui.text.TextStyle
+
+/**
+ * Data class holding text display attributes used for editors.
+ */
+data class EditorStyle(
+ /** The editor text style */
+ val textStyle: TextStyle? = null,
+
+ /**
+ * The composition background color
+ *
+ * @see EditorModel.composition
+ */
+ val compositionColor: Color = Color(alpha = 0xFF, red = 0xB0, green = 0xE0, blue = 0xE6),
+
+ /**
+ * The selection background color
+ *
+ * @see EditorModel.selection
+ */
+ // TODO(nona): share with Text.DEFAULT_SELECTION_COLOR
+ val selectionColor: Color = Color(alpha = 0x66, red = 0x33, green = 0xB5, blue = 0xE5)
+)
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/VisualTransformation.kt b/ui/ui-text/src/main/java/androidx/ui/input/VisualTransformation.kt
similarity index 93%
rename from ui/ui-framework/src/main/java/androidx/ui/core/VisualTransformation.kt
rename to ui/ui-text/src/main/java/androidx/ui/input/VisualTransformation.kt
index 23ff8a6..7e5377f 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/VisualTransformation.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/input/VisualTransformation.kt
@@ -14,8 +14,9 @@
* limitations under the License.
*/
-package androidx.ui.core
+package androidx.ui.input
+import androidx.annotation.RestrictTo
import androidx.ui.text.AnnotatedString
/**
@@ -128,15 +129,20 @@
*/
class PasswordVisualTransformation(val mask: Char = '\u2022') : VisualTransformation {
override fun filter(text: AnnotatedString): TransformedText {
- return TransformedText(AnnotatedString(Character.toString(mask).repeat(text.text.length)),
- identityOffsetMap)
+ return TransformedText(
+ AnnotatedString(Character.toString(mask).repeat(text.text.length)),
+ identityOffsetMap
+ )
}
}
/**
* The offset map used for identity mapping.
+ *
+ * @hide
*/
-internal val identityOffsetMap = object : OffsetMap {
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+val identityOffsetMap = object : OffsetMap {
override fun originalToTransformed(offset: Int): Int = offset
override fun transformedToOriginal(offset: Int): Int = offset
}
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/Locale.kt b/ui/ui-text/src/main/java/androidx/ui/text/Locale.kt
deleted file mode 100644
index 2c75c98..0000000
--- a/ui/ui-text/src/main/java/androidx/ui/text/Locale.kt
+++ /dev/null
@@ -1,207 +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.text
-
-/**
- * An identifier used to select a user's language and formatting preferences,
- * consisting of a language and a country. This is a subset of locale
- * identifiers as defined by BCP 47.
- *
- * Locales are canonicalized according to the "preferred value" entries in the
- * [IANA Language Subtag
- * Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry).
- * For example, `const Locale('he')` and `const Locale('iw')` are equal and
- * both have the [languageCode] `he`, because `iw` is a deprecated language
- * subtag that was replaced by the subtag `he`.
- *
- * The default constructor creates a new Locale object. The first argument is the
- * primary language subtag, the second is the region subtag.
- *
- * For example:
- *
- * val swissFrench = Locale('fr', 'CH');
- * val canadianFrench = Locale('fr', 'CA');
- *
- *
- * The primary language subtag must not be null. The region subtag is
- * optional.
- *
- * The values are _case sensitive_, and should match the case of the relevant
- * subtags in the [IANA Language Subtag Registry]
- * (https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry).
- * Typically this means the primary language subtag should be lowercase and
- * the region subtag should be uppercase.
- */
-data class Locale(
- val _languageCode: String,
- val _countryCode: String? = null
-) {
-
- // TODO(Migration/siyamed): this class is far far far too much very limited.
- // we might want to wrap system locale, or use system locale.
- // The package is also not good, Locale should be somewhere else not under window.
- // nona@ we need at least
- // * ISO 15924 script tag. This is required for sr-Latn/sr-Cyrl support.
- // * Variant. This is required for hyphenation for German, de-1996/de-1901
- // * Unicode extensions: This is required Arabic/Latin digits selection.
- // Also, this needs to be a list of locale, otherwise
- // * locale list based font fallback doesn't work.
- // * resource fallback may not work well.
-
- /**
- * The primary language subtag for the locale.
- *
- * This must not be null.
- *
- * This is expected to be string registered in the [IANA Language Subtag
- * Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)
- * with the type "language". The string specified must match the case of the
- * string in the registry.
- *
- * Language subtags that are deprecated in the registry and have a preferred
- * code are changed to their preferred code. For example, `const
- * Locale('he')` and `const Locale('iw')` are equal, and both have the
- * [languageCode] `he`, because `iw` is a deprecated language subtag that was
- * replaced by the subtag `he`.
- */
- val languageCode: String
- get() = _canonicalizeLanguageCode(_languageCode)
-
- /**
- * The region subtag for the locale.
- *
- * This can be null.
- *
- * This is expected to be string registered in the [IANA Language Subtag
- * Registry](https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry)
- * with the type "region". The string specified must match the case of the
- * string in the registry.
- *
- * Region subtags that are deprecated in the registry and have a preferred
- * code are changed to their preferred code. For example, `const Locale('de',
- * 'DE')` and `const Locale('de', 'DD')` are equal, and both have the
- * [countryCode] `DE`, because `DD` is a deprecated language subtag that was
- * replaced by the subtag `DE`.
- */
- val countryCode
- get() = if (_countryCode != null) _canonicalizeRegionCode(
- _countryCode
- ) else null
-
- companion object {
- fun _canonicalizeLanguageCode(languageCode: String): String {
- // This switch statement is generated by //flutter/tools/gen_locale.dart
- // TODO(popam): look into that tool
- // Mappings generated for language subtag registry as of 2017-08-15.
- return when (languageCode) {
- "in" -> "id"; // Indonesian; deprecated 1989-01-01
- "iw" -> "he"; // Hebrew; deprecated 1989-01-01
- "ji" -> "yi"; // Yiddish; deprecated 1989-01-01
- "jw" -> "jv"; // Javanese; deprecated 2001-08-13
- "mo" -> "ro"; // Moldavian, Moldovan; deprecated 2008-11-22
- "aam" -> "aas"; // Aramanik; deprecated 2015-02-12
- "adp" -> "dz"; // Adap; deprecated 2015-02-12
- "aue" -> "ktz"; // =/Kx"au//"ein; deprecated 2015-02-12
- "ayx" -> "nun"; // Ayi (China); deprecated 2011-08-16
- "bgm" -> "bcg"; // Baga Mboteni; deprecated 2016-05-30
- "bjd" -> "drl"; // Bandjigali; deprecated 2012-08-12
- "ccq" -> "rki"; // Chaungtha; deprecated 2012-08-12
- "cjr" -> "mom"; // Chorotega; deprecated 2010-03-11
- "cka" -> "cmr"; // Khumi Awa Chin; deprecated 2012-08-12
- "cmk" -> "xch"; // Chimakum; deprecated 2010-03-11
- "coy" -> "pij"; // Coyaima; deprecated 2016-05-30
- "cqu" -> "quh"; // Chilean Quechua; deprecated 2016-05-30
- "drh" -> "khk"; // Darkhat; deprecated 2010-03-11
- "drw" -> "prs"; // Darwazi; deprecated 2010-03-11
- "gav" -> "dev"; // Gabutamon; deprecated 2010-03-11
- "gfx" -> "vaj"; // Mangetti Dune !Xung; deprecated 2015-02-12
- "ggn" -> "gvr"; // Eastern Gurung; deprecated 2016-05-30
- "gti" -> "nyc"; // Gbati-ri; deprecated 2015-02-12
- "guv" -> "duz"; // Gey; deprecated 2016-05-30
- "hrr" -> "jal"; // Horuru; deprecated 2012-08-12
- "ibi" -> "opa"; // Ibilo; deprecated 2012-08-12
- "ilw" -> "gal"; // Talur; deprecated 2013-09-10
- "jeg" -> "oyb"; // Jeng; deprecated 2017-02-23
- "kgc" -> "tdf"; // Kasseng; deprecated 2016-05-30
- "kgh" -> "kml"; // Upper Tanudan Kalinga; deprecated 2012-08-12
- "koj" -> "kwv"; // Sara Dunjo; deprecated 2015-02-12
- "krm" -> "bmf"; // Krim; deprecated 2017-02-23
- "ktr" -> "dtp"; // Kota Marudu Tinagas; deprecated 2016-05-30
- "kvs" -> "gdj"; // Kunggara; deprecated 2016-05-30
- "kwq" -> "yam"; // Kwak; deprecated 2015-02-12
- "kxe" -> "tvd"; // Kakihum; deprecated 2015-02-12
- "kzj" -> "dtp"; // Coastal Kadazan; deprecated 2016-05-30
- "kzt" -> "dtp"; // Tambunan Dusun; deprecated 2016-05-30
- "lii" -> "raq"; // Lingkhim; deprecated 2015-02-12
- "lmm" -> "rmx"; // Lamam; deprecated 2014-02-28
- "meg" -> "cir"; // Mea; deprecated 2013-09-10
- "mst" -> "mry"; // Cataelano Mandaya; deprecated 2010-03-11
- "mwj" -> "vaj"; // Maligo; deprecated 2015-02-12
- "myt" -> "mry"; // Sangab Mandaya; deprecated 2010-03-11
- "nad" -> "xny"; // Nijadali; deprecated 2016-05-30
- "nnx" -> "ngv"; // Ngong; deprecated 2015-02-12
- "nts" -> "pij"; // Natagaimas; deprecated 2016-05-30
- "oun" -> "vaj"; // !O!ung; deprecated 2015-02-12
- "pcr" -> "adx"; // Panang; deprecated 2013-09-10
- "pmc" -> "huw"; // Palumata; deprecated 2016-05-30
- "pmu" -> "phr"; // Mirpur Panjabi; deprecated 2015-02-12
- "ppa" -> "bfy"; // Pao; deprecated 2016-05-30
- "ppr" -> "lcq"; // Piru; deprecated 2013-09-10
- "pry" -> "prt"; // Pray 3; deprecated 2016-05-30
- "puz" -> "pub"; // Purum Naga; deprecated 2014-02-28
- "sca" -> "hle"; // Sansu; deprecated 2012-08-12
- "skk" -> "oyb"; // Sok; deprecated 2017-02-23
- "tdu" -> "dtp"; // Tempasuk Dusun; deprecated 2016-05-30
- "thc" -> "tpo"; // Tai Hang Tong; deprecated 2016-05-30
- "thx" -> "oyb"; // The; deprecated 2015-02-12
- "tie" -> "ras"; // Tingal; deprecated 2011-08-16
- "tkk" -> "twm"; // Takpa; deprecated 2011-08-16
- "tlw" -> "weo"; // South Wemale; deprecated 2012-08-12
- "tmp" -> "tyj"; // Tai Mène; deprecated 2016-05-30
- "tne" -> "kak"; // Tinoc Kallahan; deprecated 2016-05-30
- "tnf" -> "prs"; // Tangshewi; deprecated 2010-03-11
- "tsf" -> "taj"; // Southwestern Tamang; deprecated 2015-02-12
- "uok" -> "ema"; // Uokha; deprecated 2015-02-12
- "xba" -> "cax"; // Kamba (Brazil); deprecated 2016-05-30
- "xia" -> "acn"; // Xiandao; deprecated 2013-09-10
- "xkh" -> "waw"; // Karahawyana; deprecated 2016-05-30
- "xsj" -> "suj"; // Subi; deprecated 2015-02-12
- "ybd" -> "rki"; // Yangbye; deprecated 2012-08-12
- "yma" -> "lrr"; // Yamphe; deprecated 2012-08-12
- "ymt" -> "mtm"; // Mator-Taygi-Karagas; deprecated 2015-02-12
- "yos" -> "zom"; // Yos; deprecated 2013-09-10
- "yuu" -> "yug"; // Yugh; deprecated 2014-02-28
- else -> languageCode
- }
- }
-
- fun _canonicalizeRegionCode(regionCode: String): String {
- // This switch statement is generated by //flutter/tools/gen_locale.dart
- // TODO(popam): look into that tool
- // Mappings generated for language subtag registry as of 2017-08-15.
- return when (regionCode) {
- "BU" -> "MM"; // Burma; deprecated 1989-12-05
- "DD" -> "DE"; // German Democratic Republic; deprecated 1990-10-30
- "FX" -> "FR"; // Metropolitan France; deprecated 1997-07-14
- "TP" -> "TL"; // East Timor; deprecated 2002-05-20
- "YD" -> "YE"; // Democratic Yemen; deprecated 1990-08-14
- "ZR" -> "CD"; // Zaire; deprecated 1997-07-14
- else -> regionCode
- }
- }
- }
-}
\ No newline at end of file
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt b/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
index 0b50c2b..20828cc 100644
--- a/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/TextDelegate.kt
@@ -41,6 +41,7 @@
import androidx.ui.painting.Shader
import androidx.ui.text.font.Font
import androidx.ui.text.style.TextOverflow
+import java.util.Locale
import kotlin.math.ceil
private val DefaultTextAlign: TextAlign = TextAlign.Start
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/TextStyle.kt b/ui/ui-text/src/main/java/androidx/ui/text/TextStyle.kt
index b500187..f8be302 100644
--- a/ui/ui-text/src/main/java/androidx/ui/text/TextStyle.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/TextStyle.kt
@@ -30,6 +30,7 @@
import androidx.ui.graphics.lerp
import androidx.ui.lerp
import androidx.ui.painting.Shadow
+import java.util.Locale
/**
* Configuration object to define the text style.
diff --git a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraph.kt b/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraph.kt
index ce4624b0..d82e343 100644
--- a/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraph.kt
+++ b/ui/ui-text/src/main/java/androidx/ui/text/platform/AndroidParagraph.kt
@@ -437,7 +437,7 @@
style.locale?.let {
spannableString.setSpan(
// TODO(Migration/haoyuchang): support locale fallback in the framework
- LocaleSpan(Locale(it.languageCode, it.countryCode ?: "")),
+ LocaleSpan(Locale(it.language, it.country ?: "")),
start,
end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
@@ -497,8 +497,8 @@
locale?.let {
textPaint.textLocale = Locale(
- it.languageCode,
- it.countryCode ?: ""
+ it.language,
+ it.country ?: ""
)
}
diff --git a/ui/ui-framework/src/test/java/androidx/ui/core/PasswordVisualTransformationTest.kt b/ui/ui-text/src/test/java/androidx/ui/input/PasswordVisualTransformationTest.kt
similarity index 98%
rename from ui/ui-framework/src/test/java/androidx/ui/core/PasswordVisualTransformationTest.kt
rename to ui/ui-text/src/test/java/androidx/ui/input/PasswordVisualTransformationTest.kt
index 1284040..0b95106 100644
--- a/ui/ui-framework/src/test/java/androidx/ui/core/PasswordVisualTransformationTest.kt
+++ b/ui/ui-text/src/test/java/androidx/ui/input/PasswordVisualTransformationTest.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package androidx.ui.core
+package androidx.ui.input
import androidx.ui.text.AnnotatedString
import org.junit.Assert.assertEquals
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextDelegateTest.kt b/ui/ui-text/src/test/java/androidx/ui/text/TextDelegateTest.kt
index 3b34061..6487e90 100644
--- a/ui/ui-text/src/test/java/androidx/ui/text/TextDelegateTest.kt
+++ b/ui/ui-text/src/test/java/androidx/ui/text/TextDelegateTest.kt
@@ -28,6 +28,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+import java.util.Locale
@RunWith(JUnit4::class)
class TextDelegateTest() {
diff --git a/ui/ui-text/src/test/java/androidx/ui/text/TextStyleTest.kt b/ui/ui-text/src/test/java/androidx/ui/text/TextStyleTest.kt
index 70ae35a..42c143e 100644
--- a/ui/ui-text/src/test/java/androidx/ui/text/TextStyleTest.kt
+++ b/ui/ui-text/src/test/java/androidx/ui/text/TextStyleTest.kt
@@ -34,6 +34,7 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+import java.util.Locale
@RunWith(JUnit4::class)
class TextStyleTest {
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
index 8185e8b..00719bf 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/BaseTest.kt
@@ -39,6 +39,7 @@
import androidx.test.espresso.action.ViewActions.actionWithAssertions
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
+import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
@@ -492,7 +493,7 @@
)
assertThat("viewPager should be IDLE", viewPager.scrollState, equalTo(SCROLL_STATE_IDLE))
if (value != null) {
- onView(allOf<View>(withId(R.id.text_view), isDisplayed())).check(
+ onView(allOf<View>(withId(R.id.text_view), isCompletelyDisplayed())).check(
matches(withText(value))
)
}
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PaddingMarginDecorationTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PaddingMarginDecorationTest.kt
new file mode 100644
index 0000000..473935e
--- /dev/null
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PaddingMarginDecorationTest.kt
@@ -0,0 +1,429 @@
+/*
+ * 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.viewpager2.widget
+
+import android.graphics.Rect
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewGroup.MarginLayoutParams
+import androidx.recyclerview.widget.RecyclerView
+import androidx.test.filters.LargeTest
+import androidx.testutils.LocaleTestUtils
+import androidx.viewpager2.widget.PaddingMarginDecorationTest.Event.OnPageScrollStateChangedEvent
+import androidx.viewpager2.widget.PaddingMarginDecorationTest.Event.OnPageScrolledEvent
+import androidx.viewpager2.widget.PaddingMarginDecorationTest.Event.OnPageSelectedEvent
+import androidx.viewpager2.widget.PaddingMarginDecorationTest.TestConfig
+import androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL
+import androidx.viewpager2.widget.ViewPager2.ORIENTATION_VERTICAL
+import androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_DRAGGING
+import androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_IDLE
+import androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_SETTLING
+import androidx.viewpager2.widget.swipe.ViewAdapter
+import org.hamcrest.CoreMatchers.equalTo
+import org.junit.Assert.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+import java.util.concurrent.TimeUnit.SECONDS
+import kotlin.math.roundToInt
+
+@RunWith(Parameterized::class)
+@LargeTest
+class PaddingMarginDecorationTest(private val config: TestConfig) : BaseTest() {
+ data class TestConfig(
+ @ViewPager2.Orientation val orientation: Int,
+ val rtl: Boolean,
+ val vpPaddingPx: Int,
+ val rvPaddingPx: Int,
+ val itemMarginPx: Int,
+ val itemDecorationPx: Int
+ )
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters(name = "{0}")
+ fun spec(): List<TestConfig> = createTestSet()
+
+ // Set unequal decorations, to prevent symmetry from hiding bugs
+ // Similarly, make sure no margin is an exact multiple of another margin
+ // TODO(139452422): Set to 2/3/7/5 when PagerSnapHelper is fixed
+ const val fLeft = 2
+ const val fTop = 2
+ const val fRight = 2
+ const val fBottom = 2
+
+ fun View.applyMargin(margin: Int) {
+ val lp = layoutParams as MarginLayoutParams
+ lp.setMargins(margin * fLeft, margin * fTop, margin * fRight, margin * fBottom)
+ layoutParams = lp
+ }
+
+ fun View.applyPadding(padding: Int) {
+ setPadding(padding * fLeft, padding * fTop, padding * fRight, padding * fBottom)
+ }
+ }
+
+ private lateinit var test: Context
+ private val viewPager get() = test.viewPager
+
+ private val vpSize: Int get() {
+ return if (viewPager.isHorizontal) viewPager.width else viewPager.height
+ }
+
+ private val vpPadding: Int get() {
+ return if (viewPager.isHorizontal)
+ viewPager.paddingLeft + viewPager.paddingRight
+ else
+ viewPager.paddingTop + viewPager.paddingBottom
+ }
+
+ private val rvSize: Int get() {
+ val rv = viewPager.recyclerView
+ return if (viewPager.isHorizontal) rv.width else rv.height
+ }
+
+ private val rvMargin: Int get() {
+ return if (viewPager.isHorizontal)
+ horizontalMargin(viewPager.recyclerView.layoutParams)
+ else
+ verticalMargin(viewPager.recyclerView.layoutParams)
+ }
+
+ private val rvPadding: Int get() {
+ val rv = viewPager.recyclerView
+ return if (viewPager.isHorizontal)
+ rv.paddingLeft + rv.paddingRight
+ else
+ rv.paddingTop + rv.paddingBottom
+ }
+
+ private val itemSize: Int get() {
+ val item = viewPager.linearLayoutManager.findViewByPosition(0)!!
+ return if (viewPager.isHorizontal) item.width else item.height
+ }
+
+ private val itemMargin: Int get() {
+ val item = viewPager.linearLayoutManager.findViewByPosition(0)!!
+ return if (viewPager.isHorizontal)
+ horizontalMargin(item.layoutParams)
+ else
+ verticalMargin(item.layoutParams)
+ }
+
+ private val itemDecoration: Int get() {
+ val llm = viewPager.linearLayoutManager
+ val item = llm.findViewByPosition(0)!!
+ return if (viewPager.isHorizontal)
+ llm.getLeftDecorationWidth(item) + llm.getRightDecorationWidth(item)
+ else
+ llm.getTopDecorationHeight(item) + llm.getBottomDecorationHeight(item)
+ }
+
+ private val adapterProvider: AdapterProviderForItems get() {
+ return if (config.itemMarginPx > 0) {
+ { items -> { MarginViewAdapter(config.itemMarginPx, items) } }
+ } else {
+ { items -> { ViewAdapter(items) } }
+ }
+ }
+
+ class MarginViewAdapter(private val margin: Int, items: List<String>) : ViewAdapter(items) {
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+ return super.onCreateViewHolder(parent, viewType).apply { itemView.applyMargin(margin) }
+ }
+ }
+
+ class ItemDecorator(private val size: Int) : RecyclerView.ItemDecoration() {
+ override fun getItemOffsets(
+ outRect: Rect,
+ view: View,
+ parent: RecyclerView,
+ state: RecyclerView.State
+ ) {
+ outRect.left = size * fLeft
+ outRect.top = size * fTop
+ outRect.right = size * fRight
+ outRect.bottom = size * fBottom
+ }
+ }
+
+ override fun setUp() {
+ super.setUp()
+ if (config.rtl) {
+ localeUtil.resetLocale()
+ localeUtil.setLocale(LocaleTestUtils.RTL_LANGUAGE)
+ }
+ test = setUpTest(config.orientation)
+ test.runOnUiThreadSync {
+ viewPager.clipToPadding = false
+ viewPager.applyPadding(config.vpPaddingPx)
+ viewPager.recyclerView.clipToPadding = false
+ viewPager.recyclerView.applyPadding(config.rvPaddingPx)
+ viewPager.addItemDecoration(ItemDecorator(config.itemDecorationPx))
+ }
+ }
+
+ private fun horizontalMargin(lp: ViewGroup.LayoutParams): Int {
+ return if (lp is MarginLayoutParams) lp.leftMargin + lp.rightMargin else 0
+ }
+
+ private fun verticalMargin(lp: ViewGroup.LayoutParams): Int {
+ return if (lp is MarginLayoutParams) lp.topMargin + lp.bottomMargin else 0
+ }
+
+ @Test
+ fun test_pageSize() {
+ test.setAdapterSync(adapterProvider(stringSequence(1)))
+
+ val f = if (viewPager.isHorizontal) fLeft + fRight else fTop + fBottom
+
+ assertThat(vpPadding, equalTo(config.vpPaddingPx * f))
+ assertThat(rvPadding, equalTo(config.rvPaddingPx * f))
+ assertThat(itemMargin, equalTo(config.itemMarginPx * f))
+ assertThat(itemDecoration, equalTo(config.itemDecorationPx * f))
+
+ assertThat(viewPager.pageSize, equalTo(rvSize - rvPadding))
+ assertThat(viewPager.pageSize, equalTo(vpSize - vpPadding - rvMargin - rvPadding))
+ assertThat(viewPager.pageSize, equalTo(itemSize + itemDecoration + itemMargin))
+ }
+
+ /*
+ Sample log to guide the test
+
+ 1 -> 2
+ onPageScrollStateChanged,1
+ onPageScrolled,1,0.019444,21
+ onPageScrolled,1,0.082407,88
+ onPageScrolled,1,0.173148,187
+ onPageScrollStateChanged,2
+ onPageSelected,2
+ onPageScrolled,1,0.343518,370
+ onPageScrolled,1,0.855556,924
+ onPageScrolled,1,0.984259,1063
+ onPageScrolled,2,0.000000,0
+ onPageScrollStateChanged,0
+
+ 2 -> 1
+ onPageScrollStateChanged,1
+ onPageScrolled,1,0.972222,1050
+ onPageScrolled,1,0.910185,983
+ onPageScrolled,1,0.835185,902
+ onPageScrolled,1,0.764815,826
+ onPageScrollStateChanged,2
+ onPageSelected,1
+ onPageScrolled,1,0.616667,666
+ onPageScrolled,1,0.136111,147
+ onPageScrolled,1,0.015741,17
+ onPageScrolled,1,0.000000,0
+ onPageScrollStateChanged,0
+ */
+ @Test
+ fun test_swipeBetweenPages() {
+ test.setAdapterSync(adapterProvider(stringSequence(2)))
+ listOf(1, 0).forEach { targetPage ->
+ // given
+ val initialPage = viewPager.currentItem
+ assertThat(Math.abs(initialPage - targetPage), equalTo(1))
+
+ val callback = viewPager.addNewRecordingCallback()
+ val latch = viewPager.addWaitForScrolledLatch(targetPage)
+
+ // when
+ test.swipe(initialPage, targetPage)
+ latch.await(2, SECONDS)
+
+ // then
+ test.assertBasicState(targetPage)
+
+ callback.apply {
+ // verify all events
+ assertThat(draggingIx, equalTo(0))
+ assertThat(settlingIx, isBetweenInEx(firstScrolledIx + 1, lastScrolledIx))
+ assertThat(idleIx, equalTo(lastIx))
+ assertThat(pageSelectedIx(targetPage), equalTo(settlingIx + 1))
+ assertThat(scrollEventCount, equalTo(eventCount - 4))
+
+ // dive into scroll events
+ val sortOrder =
+ if (targetPage - initialPage > 0) SortOrder.ASC
+ else SortOrder.DESC
+ scrollEvents.assertPositionSorted(sortOrder)
+ scrollEvents.assertOffsetSorted(sortOrder)
+ scrollEvents.assertValueSanity(initialPage, targetPage, viewPager.pageSize)
+ scrollEvents.assertLastCorrect(targetPage)
+ scrollEvents.assertMaxShownPages()
+ }
+
+ viewPager.unregisterOnPageChangeCallback(callback)
+ }
+ }
+
+ /*
+ Before page 0
+ onPageScrollStateChanged,1
+ onPageScrolled,0,0.000000,0
+ onPageScrolled,0,0.000000,0
+ onPageScrolled,0,0.000000,0
+ onPageScrolled,0,0.000000,0
+ onPageScrollStateChanged,0
+
+ After page 2
+ onPageScrollStateChanged,1
+ onPageScrolled,2,0.000000,0
+ onPageScrolled,2,0.000000,0
+ onPageScrolled,2,0.000000,0
+ onPageScrollStateChanged,0
+ */
+ @Test
+ fun test_swipeBeyondEdgePages() {
+ val totalPages = 2
+ val edgePages = setOf(0, totalPages - 1)
+
+ test.setAdapterSync(adapterProvider(stringSequence(totalPages)))
+ listOf(0, 1, 1).forEach { targetPage ->
+ // given
+ val initialPage = viewPager.currentItem
+ val callback = viewPager.addNewRecordingCallback()
+ val latch = viewPager.addWaitForScrolledLatch(targetPage)
+
+ // when
+ test.swipe(initialPage, targetPage)
+ latch.await(2, SECONDS)
+
+ // then
+ test.assertBasicState(targetPage)
+
+ if (targetPage == initialPage && edgePages.contains(targetPage)) {
+ callback.apply {
+ // verify all events
+ assertThat("Events should start with a state change to DRAGGING",
+ draggingIx, equalTo(0))
+ assertThat("Last event should be a state change to IDLE",
+ idleIx, equalTo(lastIx))
+ assertThat("All events but the state changes to DRAGGING and IDLE" +
+ " should be scroll events",
+ scrollEventCount, equalTo(eventCount - 2))
+
+ // dive into scroll events
+ scrollEvents.forEach {
+ assertThat("All scroll events should report page $targetPage",
+ it.position, equalTo(targetPage))
+ assertThat("All scroll events should report an offset of 0f",
+ it.positionOffset, equalTo(0f))
+ assertThat("All scroll events should report an offset of 0px",
+ it.positionOffsetPixels, equalTo(0))
+ }
+ }
+ }
+
+ viewPager.unregisterOnPageChangeCallback(callback)
+ }
+ }
+
+ private fun ViewPager2.addNewRecordingCallback(): RecordingCallback {
+ return RecordingCallback().also { registerOnPageChangeCallback(it) }
+ }
+
+ private sealed class Event {
+ data class OnPageScrolledEvent(
+ val position: Int,
+ val positionOffset: Float,
+ val positionOffsetPixels: Int
+ ) : Event()
+ data class OnPageSelectedEvent(val position: Int) : Event()
+ data class OnPageScrollStateChangedEvent(val state: Int) : Event()
+ }
+
+ private class RecordingCallback : ViewPager2.OnPageChangeCallback() {
+ private val events = mutableListOf<Event>()
+
+ val scrollEvents get() = events.mapNotNull { it as? OnPageScrolledEvent }
+ val eventCount get() = events.size
+ val scrollEventCount get() = scrollEvents.size
+ val lastIx get() = events.size - 1
+ val firstScrolledIx get() = events.indexOfFirst { it is OnPageScrolledEvent }
+ val lastScrolledIx get() = events.indexOfLast { it is OnPageScrolledEvent }
+ val settlingIx get() = events.indexOf(OnPageScrollStateChangedEvent(SCROLL_STATE_SETTLING))
+ val draggingIx get() = events.indexOf(OnPageScrollStateChangedEvent(SCROLL_STATE_DRAGGING))
+ val idleIx get() = events.indexOf(OnPageScrollStateChangedEvent(SCROLL_STATE_IDLE))
+ val pageSelectedIx: (page: Int) -> Int = { events.indexOf(OnPageSelectedEvent(it)) }
+
+ override fun onPageScrolled(
+ position: Int,
+ positionOffset: Float,
+ positionOffsetPixels: Int
+ ) {
+ events.add(OnPageScrolledEvent(position, positionOffset, positionOffsetPixels))
+ }
+
+ override fun onPageSelected(position: Int) {
+ events.add(OnPageSelectedEvent(position))
+ }
+
+ override fun onPageScrollStateChanged(state: Int) {
+ events.add(OnPageScrollStateChangedEvent(state))
+ }
+ }
+
+ private fun List<OnPageScrolledEvent>.assertPositionSorted(sortOrder: SortOrder) {
+ map { it.position }.assertSorted { it * sortOrder.sign }
+ }
+
+ private fun List<OnPageScrolledEvent>.assertLastCorrect(targetPage: Int) {
+ last().apply {
+ assertThat(position, equalTo(targetPage))
+ assertThat(positionOffsetPixels, equalTo(0))
+ }
+ }
+
+ private fun List<OnPageScrolledEvent>.assertValueSanity(
+ initialPage: Int,
+ otherPage: Int,
+ pageSize: Int
+ ) = forEach {
+ assertThat(it.position, isBetweenInInMinMax(initialPage, otherPage))
+ assertThat(it.positionOffset, isBetweenInEx(0f, 1f))
+ assertThat((it.positionOffset * pageSize).roundToInt(), equalTo(it.positionOffsetPixels))
+ }
+
+ private fun List<OnPageScrolledEvent>.assertOffsetSorted(sortOrder: SortOrder) {
+ map { it.position + it.positionOffset.toDouble() }.assertSorted { it * sortOrder.sign }
+ }
+
+ private fun List<OnPageScrolledEvent>.assertMaxShownPages() {
+ assertThat(map { it.position }.distinct().size, isBetweenInIn(0, 4))
+ }
+}
+
+// region Test Suite creation
+
+private fun createTestSet(): List<TestConfig> {
+ return listOf(ORIENTATION_HORIZONTAL, ORIENTATION_VERTICAL).flatMap { orientation ->
+ listOf(false, true).flatMap { rtl ->
+ listOf(
+ TestConfig(orientation, rtl, 0, 0, 0, 0),
+ TestConfig(orientation, rtl, 0, 0, 0, 10),
+ TestConfig(orientation, rtl, 0, 0, 10, 0),
+ TestConfig(orientation, rtl, 0, 10, 0, 0),
+ TestConfig(orientation, rtl, 10, 0, 0, 0),
+ TestConfig(orientation, rtl, 1, 2, 3, 4)
+ )
+ }
+ }
+}
+
+// endregion
diff --git a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
index da60cc2..cc4bb92 100644
--- a/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
+++ b/viewpager2/src/androidTest/java/androidx/viewpager2/widget/PageChangeCallbackTest.kt
@@ -40,7 +40,6 @@
import androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_IDLE
import androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_SETTLING
import androidx.viewpager2.widget.swipe.PageSwiperManual
-import androidx.viewpager2.widget.swipe.ViewAdapter
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.CoreMatchers.not
import org.hamcrest.Matchers.allOf
@@ -60,8 +59,7 @@
class PageChangeCallbackTest(private val config: TestConfig) : BaseTest() {
data class TestConfig(
@ViewPager2.Orientation val orientation: Int,
- val rtl: Boolean,
- val pageMarginPx: Int
+ val rtl: Boolean
)
companion object {
@@ -78,26 +76,6 @@
}
}
- private val adapterProvider: AdapterProviderForItems get() {
- return if (config.pageMarginPx > 0) {
- { items -> { MarginViewAdapter(config.pageMarginPx, items) } }
- } else {
- { items -> { ViewAdapter(items) } }
- }
- }
-
- class MarginViewAdapter(private val margin: Int, items: List<String>) : ViewAdapter(items) {
- override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
- val viewHolder = super.onCreateViewHolder(parent, viewType)
- val lp = viewHolder.itemView.layoutParams as ViewGroup.MarginLayoutParams
- // Set unequal margins, to prevent symmetry from hiding bugs
- // Similarly, make sure no margin is an exact multiple of another margin
- lp.setMargins(margin * 2, margin * 3, margin * 7, margin * 5)
- viewHolder.itemView.layoutParams = lp
- return viewHolder
- }
- }
-
/*
Sample log to guide the test
@@ -131,7 +109,7 @@
@Test
fun test_swipeBetweenPages() {
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(4)))
+ setAdapterSync(viewAdapterProvider(stringSequence(4)))
listOf(1, 2, 3, 2, 1, 0).forEach { targetPage ->
// given
val initialPage = viewPager.currentItem
@@ -194,7 +172,7 @@
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(totalPages)))
+ setAdapterSync(viewAdapterProvider(stringSequence(totalPages)))
listOf(0, 0, 1, 2, 2, 2, 1, 2, 2, 2, 1, 0, 0, 0).forEach { targetPage ->
// given
val initialPage = viewPager.currentItem
@@ -257,7 +235,7 @@
fun test_peekOnAdjacentPage_next() {
// given
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(3)))
+ setAdapterSync(viewAdapterProvider(stringSequence(3)))
val callback = viewPager.addNewRecordingCallback()
val latch = viewPager.addWaitForScrolledLatch(0)
@@ -316,7 +294,7 @@
fun test_peekOnAdjacentPage_previous() {
// given
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(3)))
+ setAdapterSync(viewAdapterProvider(stringSequence(3)))
viewPager.setCurrentItemSync(2, false, 1, SECONDS)
@@ -393,7 +371,7 @@
fun test_selectItemProgrammatically_smoothScroll() {
// given
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(1000)))
+ setAdapterSync(viewAdapterProvider(stringSequence(1000)))
// when
listOf(6, 5, 6, 3, 10, 0, 0, 999, 999, 0).forEach { targetPage ->
@@ -434,7 +412,7 @@
fun test_multiplePageChanges() {
// given
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(10)))
+ setAdapterSync(viewAdapterProvider(stringSequence(10)))
val targetPages = listOf(4, 9)
val callback = viewPager.addNewRecordingCallback()
val latch = viewPager.addWaitForScrolledLatch(targetPages.last(), true)
@@ -484,7 +462,7 @@
fun test_noSmoothScroll_after_smoothScroll() {
// given
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(6)))
+ setAdapterSync(viewAdapterProvider(stringSequence(6)))
val targetPage = 4
val marker = 1
val callback = viewPager.addNewRecordingCallback()
@@ -602,7 +580,7 @@
// given
assertThat(targetPage, greaterThanOrEqualTo(4))
setUpTest(config.orientation).apply {
- val adapterProvider = adapterProvider(stringSequence(5))
+ val adapterProvider = viewAdapterProvider(stringSequence(5))
setAdapterSync(adapterProvider)
val marker = 1
val callback = viewPager.addNewRecordingCallback()
@@ -662,7 +640,7 @@
fun test_selectItemProgrammatically_noSmoothScroll() {
// given
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(3)))
+ setAdapterSync(viewAdapterProvider(stringSequence(3)))
// when
listOf(2, 2, 0, 0, 1, 2, 1, 0).forEach { targetPage ->
@@ -694,7 +672,7 @@
fun test_swipeReleaseSwipeBack() {
// given
val test = setUpTest(config.orientation)
- test.setAdapterSync(adapterProvider(stringSequence(3)))
+ test.setAdapterSync(viewAdapterProvider(stringSequence(3)))
val currentPage = test.viewPager.currentItem
val halfPage = test.viewPager.pageSize / 2f
val pageSwiper = PageSwiperManual(test.viewPager)
@@ -768,7 +746,7 @@
private fun test_selectItemProgrammatically_noCallback(smoothScroll: Boolean) {
// given
setUpTest(config.orientation).apply {
- setAdapterSync(adapterProvider(stringSequence(3)))
+ setAdapterSync(viewAdapterProvider(stringSequence(3)))
// when
listOf(2, 2, 0, 0, 1, 2, 1, 0).forEach { targetPage ->
@@ -923,7 +901,7 @@
private fun test_setCurrentItem_outOfBounds(smoothScroll: Boolean) {
val test = setUpTest(config.orientation)
val n = 3
- test.setAdapterSync(adapterProvider(stringSequence(n)))
+ test.setAdapterSync(viewAdapterProvider(stringSequence(n)))
val adapterCount = test.viewPager.adapter!!.itemCount
listOf(-5, -1, n, n + 1, adapterCount, adapterCount + 1).forEach { targetPage ->
@@ -1199,10 +1177,8 @@
private fun createTestSet(): List<TestConfig> {
return listOf(ORIENTATION_HORIZONTAL, ORIENTATION_VERTICAL).flatMap { orientation ->
- listOf(true, false).flatMap { rtl ->
- listOf(0, 10, -10).map { margin ->
- TestConfig(orientation, rtl, margin)
- }
+ listOf(true, false).map { rtl ->
+ TestConfig(orientation, rtl)
}
}
}
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
index 4d8e186..f122b43 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ScrollEventAdapter.java
@@ -16,8 +16,6 @@
package androidx.viewpager2.widget;
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-
import static androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL;
import static androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_DRAGGING;
import static androidx.viewpager2.widget.ViewPager2.SCROLL_STATE_IDLE;
@@ -27,6 +25,7 @@
import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.view.View;
+import android.view.ViewGroup.LayoutParams;
import android.view.ViewGroup.MarginLayoutParams;
import androidx.annotation.IntDef;
@@ -44,13 +43,6 @@
* relative to the pages and exposes this position via ({@link #getRelativeScrollPosition()}.
*/
final class ScrollEventAdapter extends RecyclerView.OnScrollListener {
- private static final MarginLayoutParams ZERO_MARGIN_LAYOUT_PARAMS;
-
- static {
- ZERO_MARGIN_LAYOUT_PARAMS = new MarginLayoutParams(MATCH_PARENT, MATCH_PARENT);
- ZERO_MARGIN_LAYOUT_PARAMS.setMargins(0, 0, 0, 0);
- }
-
/** @hide */
@Retention(SOURCE)
@IntDef({STATE_IDLE, STATE_IN_PROGRESS_MANUAL_DRAG, STATE_IN_PROGRESS_SMOOTH_SCROLL,
@@ -67,8 +59,9 @@
private static final int NO_POSITION = -1;
private OnPageChangeCallback mCallback;
- private final @NonNull LinearLayoutManager mLayoutManager;
private final @NonNull ViewPager2 mViewPager;
+ private final @NonNull RecyclerView mRecyclerView;
+ private final @NonNull LinearLayoutManager mLayoutManager;
// state related fields
private @AdapterState int mAdapterState;
@@ -82,8 +75,10 @@
private boolean mFakeDragging;
ScrollEventAdapter(@NonNull ViewPager2 viewPager) {
- mLayoutManager = viewPager.mLayoutManager;
mViewPager = viewPager;
+ mRecyclerView = mViewPager.mRecyclerView;
+ //noinspection ConstantConditions
+ mLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
mScrollValues = new ScrollEventValues();
resetState();
}
@@ -239,23 +234,34 @@
return;
}
- MarginLayoutParams margin =
- (firstVisibleView.getLayoutParams() instanceof MarginLayoutParams)
- ? (MarginLayoutParams) firstVisibleView.getLayoutParams()
- : ZERO_MARGIN_LAYOUT_PARAMS;
+ int leftDecorations = mLayoutManager.getLeftDecorationWidth(firstVisibleView);
+ int rightDecorations = mLayoutManager.getRightDecorationWidth(firstVisibleView);
+ int topDecorations = mLayoutManager.getTopDecorationHeight(firstVisibleView);
+ int bottomDecorations = mLayoutManager.getBottomDecorationHeight(firstVisibleView);
+
+ LayoutParams params = firstVisibleView.getLayoutParams();
+ if (params instanceof MarginLayoutParams) {
+ MarginLayoutParams margin = (MarginLayoutParams) params;
+ leftDecorations += margin.leftMargin;
+ rightDecorations += margin.rightMargin;
+ topDecorations += margin.topMargin;
+ bottomDecorations += margin.bottomMargin;
+ }
+
+ int decoratedHeight = firstVisibleView.getHeight() + topDecorations + bottomDecorations;
+ int decoratedWidth = firstVisibleView.getWidth() + leftDecorations + rightDecorations;
boolean isHorizontal = mLayoutManager.getOrientation() == ORIENTATION_HORIZONTAL;
int start, sizePx;
if (isHorizontal) {
- sizePx = firstVisibleView.getWidth() + margin.leftMargin + margin.rightMargin;
- if (!mViewPager.isRtl()) {
- start = firstVisibleView.getLeft() - margin.leftMargin;
- } else {
- start = sizePx - firstVisibleView.getRight() - margin.rightMargin;
+ sizePx = decoratedWidth;
+ start = firstVisibleView.getLeft() - leftDecorations - mRecyclerView.getPaddingLeft();
+ if (mViewPager.isRtl()) {
+ start = -start;
}
} else {
- sizePx = firstVisibleView.getHeight() + margin.topMargin + margin.bottomMargin;
- start = firstVisibleView.getTop() - margin.topMargin;
+ sizePx = decoratedHeight;
+ start = firstVisibleView.getTop() - topDecorations - mRecyclerView.getPaddingTop();
}
values.mOffsetPx = -start;
diff --git a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
index d0aee32..3bfaf3d 100644
--- a/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
+++ b/viewpager2/src/main/java/androidx/viewpager2/widget/ViewPager2.java
@@ -138,10 +138,10 @@
}
};
- LinearLayoutManager mLayoutManager;
+ private LinearLayoutManager mLayoutManager;
private int mPendingCurrentItem = NO_POSITION;
private Parcelable mPendingAdapterState;
- private RecyclerView mRecyclerView;
+ RecyclerView mRecyclerView;
private PagerSnapHelper mPagerSnapHelper;
ScrollEventAdapter mScrollEventAdapter;
private CompositeOnPageChangeCallback mPageChangeEventDispatcher;
@@ -540,9 +540,10 @@
}
int getPageSize() {
+ final RecyclerView rv = mRecyclerView;
return getOrientation() == ORIENTATION_HORIZONTAL
- ? getWidth() - getPaddingLeft() - getPaddingRight()
- : getHeight() - getPaddingTop() - getPaddingBottom();
+ ? rv.getWidth() - rv.getPaddingLeft() - rv.getPaddingRight()
+ : rv.getHeight() - rv.getPaddingTop() - rv.getPaddingBottom();
}
/**
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewClientCompatTest.java b/webkit/src/androidTest/java/androidx/webkit/WebViewClientCompatTest.java
index d48607b..b8288c0 100644
--- a/webkit/src/androidTest/java/androidx/webkit/WebViewClientCompatTest.java
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewClientCompatTest.java
@@ -18,7 +18,6 @@
import android.graphics.Bitmap;
import android.net.Uri;
-import android.webkit.ValueCallback;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
@@ -159,18 +158,9 @@
private void clickOnLinkUsingJs(final String linkId, WebViewOnUiThread webViewOnUiThread)
throws InterruptedException, ExecutionException, TimeoutException {
- final ResolvableFuture<String> javascriptFuture = ResolvableFuture.create();
- ValueCallback<String> callback = new ValueCallback<String>() {
- @Override
- public void onReceiveValue(String value) {
- javascriptFuture.set(value);
- }
- };
- webViewOnUiThread.evaluateJavascript(
+ webViewOnUiThread.evaluateJavascriptSync(
"document.getElementById('" + linkId + "').click();"
- + "console.log('element with id [" + linkId + "] clicked');", callback);
- // TODO(ntfschr): consider asserting the value.
- WebkitUtils.waitForFuture(javascriptFuture);
+ + "console.log('element with id [" + linkId + "] clicked');");
}
/**
diff --git a/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java b/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
index 37053db..8790899 100644
--- a/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
+++ b/webkit/src/androidTest/java/androidx/webkit/WebViewOnUiThread.java
@@ -287,8 +287,17 @@
});
}
- void evaluateJavascript(final String script, final ValueCallback<String> result) {
- WebkitUtils.onMainThreadSync(() -> mWebView.evaluateJavascript(script, result));
+ /**
+ * Execute javascript synchronously, returning the result.
+ */
+ public String evaluateJavascriptSync(final String script) {
+ final ResolvableFuture<String> future = ResolvableFuture.create();
+ evaluateJavascript(script, result -> future.set(result));
+ return WebkitUtils.waitForFuture(future);
+ }
+
+ public void evaluateJavascript(final String script, final ValueCallback<String> result) {
+ WebkitUtils.onMainThread(() -> mWebView.evaluateJavascript(script, result));
}
public WebViewClient getWebViewClient() {